Name: series-workflow98vll Phase: Running StartedAt: 2026-07-26 09:42:12 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[0] Phase: Succeeded StartedAt: 2026-07-26 09:42:12 +0000 UTC FinishedAt: 2026-07-26 10:08:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[0].run-triage Phase: Succeeded StartedAt: 2026-07-26 09:42:12 +0000 UTC FinishedAt: 2026-07-26 10:08:59 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "248951ddc14de84de3910f9b13f51491a8cd91df", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "BPF_SYSCALL", "ADDRESS_MASKING" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "248951ddc14de84de3910f9b13f51491a8cd91df", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "BPF_SYSCALL", "ADDRESS_MASKING" ], "series_id": "dcd2e194-d976-41b3-9678-ea27e80f2379" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "get_user_page_vma", "get_user_page_lookup_vma", "access_remote_vm", "access_process_vm", "copy_remote_vm_str" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0FERFJFU1NfTUFTS0lORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2Vfdm1hJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcmVtb3RlX3ZtJiMzNDssCiAgICAmIzM0O2FjY2Vzc19wcm9jZXNzX3ZtJiMzNDssCiAgICAmIzM0O2NvcHlfcmVtb3RlX3ZtX3N0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2N2MyMDk4N2RlNmQ5MmQ3ZWZjMjFhMDAxODg1YWQzMThiNjA1NGZlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFN1biBKdWwgMjYgMTA6MDc6MDYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xuaW5kZXggMWE5YWFkNmVmMjJhMDQuLjdhNmVjYzNkOTI5NDhjIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jXG5AQCAtNDU5LDcgJiM0Mzs0NTksNyBAQCBzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV90YWdzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuIFx0XHR1bnNpZ25lZCBsb25nIHRhZ3MsIG9mZnNldDtcbiBcdFx0dm9pZCAqbWFkZHI7XG4tXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIGFkZHIsXG4gXHRcdFx0XHRcdFx0XHQgICAgIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbiBcdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiBcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbmluZGV4IGRiZjI3YTc4ZGY2Yzg3Li4zY2UxNjc5NmU1YTI1ZCAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXG5AQCAtMjEsNyAmIzQzOzIxLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsXG4gXHRcdFx0ICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpXG4ge1xuICNpZmRlZiBDT05GSUdfUklTQ1ZfSVNBX1NVUE1cbi1cdG5leHQtXHUwMDNlY29udGV4dC5wbWxlbiA9IDA7XG4mIzQzO1x0V1JJVEVfT05DRShuZXh0LVx1MDAzZWNvbnRleHQucG1sZW4sIDApO1xuICNlbmRpZlxuIFx0c3dpdGNoX21tKHByZXYsIG5leHQsIE5VTEwpO1xuIH1cbkBAIC00NCw3ICYjNDM7NDQsNyBAQCBERUNMQVJFX1NUQVRJQ19LRVlfRkFMU0UodXNlX2FzaWRfYWxsb2NhdG9yKTtcbiAjZGVmaW5lIG1tX3VudGFnX21hc2sgbW1fdW50YWdfbWFza1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIHtcbi1cdHJldHVybiAtMVVMIFx1MDAzZVx1MDAzZSBtbS1cdTAwM2Vjb250ZXh0LnBtbGVuO1xuJiM0MztcdHJldHVybiAtMVVMIFx1MDAzZVx1MDAzZSBSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbik7XG4gfVxuICNlbmRpZlxuIFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmhcbmluZGV4IDVkNGVjMTU1ODRjZmE0Li41MzgwNmUwZjdkY2ZlMyAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxuQEAgLTE2LDcgJiM0MzsxNiw3IEBAXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcbiB7XG4gXHRpZiAocmlzY3ZfaGFzX2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfRVhUX1NVUE0pKSB7XG4tXHRcdHU4IHBtbGVuID0gbW0tXHUwMDNlY29udGV4dC5wbWxlbjtcbiYjNDM7XHRcdHU4IHBtbGVuID0gUkVBRF9PTkNFKG1tLVx1MDAzZWNvbnRleHQucG1sZW4pO1xuIFxuIFx0XHQvKiBWaXJ0dWFsIGFkZHJlc3NlcyBhcmUgc2lnbi1leHRlbmRlZDsgcGh5c2ljYWwgYWRkcmVzc2VzIGFyZSB6ZXJvLWV4dGVuZGVkLiAqL1xuIFx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTU1VKSlcbkBAIC0zMywxMiAmIzQzOzMzLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lXG4gXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUoY3VycmVudC1cdTAwM2VtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbi0jZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoe1x0XHRcdFx0XHRcXFxuJiM0MzsjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKSAoe1x0XHRcdFx0XFxcbiBcdHVuc2lnbmVkIGxvbmcgX19hZGRyID0gKF9fZm9yY2UgdW5zaWduZWQgbG9uZykoYWRkcik7XHRcdFx0XFxcbi1cdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XHRcdFx0XHRcdFx0XHRcXFxuIFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBfX2FkZHIpO1x0XHRcXFxuIH0pXG4gXG4mIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpICh7XHRcdFx0XHRcdFxcXG4mIzQzO1x0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcdFx0XHRcdFx0XHRcdFxcXG4mIzQzO1x0dW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpO1x0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4gI2RlZmluZSBhY2Nlc3Nfb2soYWRkciwgc2l6ZSkgbGlrZWx5KF9fYWNjZXNzX29rKHVudGFnZ2VkX2FkZHIoYWRkciksIHNpemUpKVxuICNlbHNlXG4gI2RlZmluZSB1bnRhZ2dlZF9hZGRyKGFkZHIpIChhZGRyKVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuY1xuaW5kZXggYjJkZjdmNzIyNDFhNWYuLjZhZTc1NTJmZWQwOWYzIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwvcHJvY2Vzcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcbkBAIC0zNTcsMTMgJiM0MzszNTcsMTUgQEAgbG9uZyBzZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYXJnKVxuIFx0aWYgKG1tYXBfd3JpdGVfbG9ja19raWxsYWJsZShtbSkpXG4gXHRcdHJldHVybiAtRUlOVFI7XG4gXG4tXHRpZiAodGVzdF9iaXQoTU1fQ09OVEVYVF9MT0NLX1BNTEVOLCBcdTAwMjZtbS1cdTAwM2Vjb250ZXh0LmZsYWdzKSBcdTAwMjZcdTAwMjYgbW0tXHUwMDNlY29udGV4dC5wbWxlbiAhPSBwbWxlbikge1xuLVx0XHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4tXHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1x0aWYgKHRlc3RfYml0KE1NX0NPTlRFWFRfTE9DS19QTUxFTiwgXHUwMDI2bW0tXHUwMDNlY29udGV4dC5mbGFncykpIHtcbiYjNDM7XHRcdGlmIChSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbikgIT0gcG1sZW4pIHtcbiYjNDM7XHRcdFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdFx0fVxuIFx0fVxuIFxuIFx0ZW52Y2ZnX3VwZGF0ZV9iaXRzKHRhc2ssIEVOVkNGR19QTU0sIHBtbSk7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnBtbGVuID0gcG1sZW47XG4mIzQzO1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnBtbGVuLCBwbWxlbik7XG4gXG4gXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4gXG5AQCAtMzk0LDcgJiM0MzszOTYsNyBAQCBsb25nIGdldF90YWdnZWRfYWRkcl9jdHJsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiBcdFx0YnJlYWs7XG4gXHR9XG4gXG4tXHRpZiAodGFzay1cdTAwM2VtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKVxuJiM0MztcdGlmIChSRUFEX09OQ0UodGFzay1cdTAwM2VtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKSlcbiBcdFx0cmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTtcbiBcbiBcdHJldHVybiByZXQ7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbmluZGV4IGVmNWI1MDdkZTM0ZTJlLi5jZWU3MTBmNjQ2NThhYSAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbkBAIC0xMDAsMTggJiM0MzsxMDAsMTggQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1tX2xhbV9jcjNfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBzdGF0aWMgaW5saW5lIHZvaWQgZHVwX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4ge1xuIFx0bW0tXHUwMDNlY29udGV4dC5sYW1fY3IzX21hc2sgPSBvbGRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzaztcbi1cdG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9IG9sZG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzaztcbiYjNDM7XHRXUklURV9PTkNFKG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzaywgUkVBRF9PTkNFKG9sZG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzaykpO1xuIH1cbiBcbiAjZGVmaW5lIG1tX3VudGFnX21hc2sgbW1fdW50YWdfbWFza1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIHtcbi1cdHJldHVybiBtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2s7XG4mIzQzO1x0cmV0dXJuIFJFQURfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2spO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgbW1fcmVzZXRfdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgPSAtMVVMO1xuJiM0MztcdFdSSVRFX09OQ0UobW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLCAtMVVMKTtcbiB9XG4gXG4gI2RlZmluZSBhcmNoX3BndGFibGVfZG1hX2NvbXBhdCBhcmNoX3BndGFibGVfZG1hX2NvbXBhdFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaFxuaW5kZXggMjBkZTM0Y2M5YWE2ZTcuLmEwOTUxNjVlYjY0OGViIDEwMDY0NFxuLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmhcbkBAIC0zOSwxOCAmIzQzOzM5LDI3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHIodW5zaWduZWQgbG9uZyBhZGRyKVxuIFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHIoX19hZGRyKTtcdFx0XFxcbiB9KVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgY2hhbmdlcyBvbmx5IHdoZW4gdGhlIHRhcmdldCBlbmFibGVzIExBTSBvciBleGVjcyxcbiYjNDM7ICogYWx3YXlzIHNpbmdsZS10aHJlYWRlZC4gQW4gdW5sb2NrZWQgcmVtb3RlIHJlYWRlciBjYW4gcmFjZSB0aGF0OyBSRUFEX09OQ0VcbiYjNDM7ICoga2VlcHMgdGhlIHZhbHVlIHdob2xlIGFuZCB0aGUgdW50YWcgaXMgYmVzdC1lZmZvcnQuXG4mIzQzOyAqL1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgYWRkcilcbiB7XG4tXHRtbWFwX2Fzc2VydF9sb2NrZWQobW0pO1xuLVx0cmV0dXJuIGFkZHIgXHUwMDI2IChtbSktXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xuJiM0MztcdHJldHVybiBhZGRyIFx1MDAyNiBSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrKTtcbiB9XG4gXG4tI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcilcdCh7XHRcdFx0XHRcXFxuJiM0MzsjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKVx0KHtcdFx0XHRcXFxuIFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcdFx0XFxcbiBcdChfX2ZvcmNlIF9fdHlwZW9mX18oYWRkcikpX191bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbiYjNDM7I2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcilcdCh7XHRcdFx0XHRcXFxuJiM0MztcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4gI2VuZGlmXG4gXG4gI2RlZmluZSB2YWxpZF91c2VyX2FkZHJlc3MoeCkgXFxcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xuaW5kZXggZDQ0YWZiZTAwNWJiNTEuLjlmYTY1OTExN2YzODI2IDEwMDY0NFxuLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xuQEAgLTgxNCw3ICYjNDM7ODE0LDcgQEAgc3RhdGljIHZvaWQgZW5hYmxlX2xhbV9mdW5jKHZvaWQgKl9fbW0pXG4gc3RhdGljIHZvaWQgbW1fZW5hYmxlX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4gXHRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IFg4Nl9DUjNfTEFNX1U1Nztcbi1cdG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpO1xuJiM0MztcdFdSSVRFX09OQ0UobW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLCB+R0VOTUFTSyg2MiwgNTcpKTtcbiBcbiBcdC8qXG4gXHQgKiBFdmVuIHRob3VnaCB0aGUgcHJvY2VzcyBtdXN0IHN0aWxsIGJlIHNpbmdsZS10aHJlYWRlZCBhdCB0aGlzXG5AQCAtOTUyLDcgJiM0Mzs5NTIsNyBAQCBsb25nIGRvX2FyY2hfcHJjdGxfNjQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb3B0aW9uLCB1bnNpZ25lZCBsb25nIGFyZzIpXG4gI2VuZGlmXG4gI2lmZGVmIENPTkZJR19BRERSRVNTX01BU0tJTkdcbiBcdGNhc2UgQVJDSF9HRVRfVU5UQUdfTUFTSzpcbi1cdFx0cmV0dXJuIHB1dF91c2VyKHRhc2stXHUwMDNlbW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLFxuJiM0MztcdFx0cmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay1cdTAwM2VtbSksXG4gXHRcdFx0XHQodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcyKTtcbiBcdGNhc2UgQVJDSF9FTkFCTEVfVEFHR0VEX0FERFI6XG4gXHRcdHJldHVybiBwcmN0bF9lbmFibGVfdGFnZ2VkX2FkZHIodGFzay1cdTAwM2VtbSwgYXJnMik7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbmluZGV4IDNhZjk3OWZiNDFkMzhkLi4zMjllZmFjMGNmYjM3ZCAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbkBAIC0xMDM2LDcgJiM0MzsxMDM2LDcgQEAgc3RhdGljIGludCBjb3B5X2Zyb21fdmFkZHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHZvaWQgKmRzdCxcbiBcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXG4tXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCBcdTAwMjZ2bWEpO1xuJiM0MztcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIHZhZGRyLCBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4gXHRpZiAoSVNfRVJSKHBhZ2UpKVxuIFx0XHRyZXR1cm4gUFRSX0VSUihwYWdlKTtcbiBcdHVwcm9iZV9jb3B5X2Zyb21fcGFnZShwYWdlLCB2YWRkciwgZHN0LCBsZW4pO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaFxuaW5kZXggNDg1ZGY5YzJkYmRkYjMuLjBmNjZkNzZlNmNhNzE5IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21tLmhcbkBAIC0zMjM1LDM1ICYjNDM7MzIzNSw5IEBAIGxvbmcgcGluX3VzZXJfcGFnZXNfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdCAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4gXHRcdFx0ICAgaW50ICpsb2NrZWQpO1xuIFxuLS8qXG4tICogUmV0cmlldmVzIGEgc2luZ2xlIHBhZ2UgYWxvbmdzaWRlIGl0cyBWTUEuIERvZXMgbm90IHN1cHBvcnQgRk9MTF9OT1dBSVQuXG4tICovXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLVx0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHRcdFx0ICAgIGludCBndXBfZmxhZ3MsXG4tXHRcdFx0XHRcdFx0ICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXG4te1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbi1cdGludCBnb3Q7XG4tXG4tXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgRk9MTF9OT1dBSVQpKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4tXG4tXHRnb3QgPSBnZXRfdXNlcl9wYWdlc19yZW1vdGUobW0sIGFkZHIsIDEsIGd1cF9mbGFncywgXHUwMDI2cGFnZSwgTlVMTCk7XG4tXG4tXHRpZiAoZ290IFx1MDAzYyAwKVxuLVx0XHRyZXR1cm4gRVJSX1BUUihnb3QpO1xuLVxuLVx0dm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7XG4tXHRpZiAoV0FSTl9PTl9PTkNFKCF2bWEpKSB7XG4tXHRcdHB1dF9wYWdlKHBhZ2UpO1xuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbi1cdH1cbi1cbi1cdCp2bWFwID0gdm1hO1xuLVx0cmV0dXJuIHBhZ2U7XG4tfVxuJiM0MztzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4mIzQzO1x0XHRcdFx0ICAgICAgaW50IGd1cF9mbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTtcbiBcbiBsb25nIGdldF91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXG5pbmRleCBlZGRiYmI2NWNjYzRmOC4uN2U2ZTRjODkxODRjZDcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmhcbkBAIC0zNCw2ICYjNDM7MzQsMTMgQEBcbiB9KVxuICNlbmRpZlxuIFxuJiM0MzsjaWZuZGVmIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkXG4mIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXHQoe1x0XFxcbiYjNDM7XHQodm9pZCkobW0pO1x0XHRcdFx0XHRcXFxuJiM0MztcdHVudGFnZ2VkX2FkZHIoYWRkcik7XHRcdFx0XHRcXFxuJiM0Mzt9KVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4gI2lmZGVmIG1hc2tlZF91c2VyX2FjY2Vzc19iZWdpblxuICAjZGVmaW5lIGNhbl9kb19tYXNrZWRfdXNlcl9hY2Nlc3MoKSAxXG4gIyBpZm5kZWYgbWFza2VkX3VzZXJfd3JpdGVfYWNjZXNzX2JlZ2luXG5kaWZmIC0tZ2l0IGEvbW0vZ3VwLmMgYi9tbS9ndXAuY1xuaW5kZXggMDY5MjExOWI3OTA0MzEuLjQ5MTBjOTNiYTAwM2U4IDEwMDY0NFxuLS0tIGEvbW0vZ3VwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cC5jXG5AQCAtNjQ3LDggJiM0Mzs2NDcsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHQgICAgcHVkX3QgKnB1ZHAsIGludCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbkBAIC02NzIsMTAgJiM0Mzs2NzMsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xuIFxuIFx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xuLVx0aWYgKHJldClcbiYjNDM7XHRpZiAocmV0KSB7XG4gXHRcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XG4tXHRlbHNlXG4tXHRcdCpwYWdlX21hc2sgPSBIUEFHRV9QVURfTlIgLSAxO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG9mZiA9IChhZGRyIFx1MDAyNiB+UFVEX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcbiYjNDM7XHRcdCpucl9wYWdlcyA9IG1pbihIUEFHRV9QVURfTlIgLSBvZmYsIChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4mIzQzO1x0fVxuIFxuIFx0cmV0dXJuIHBhZ2U7XG4gfVxuQEAgLTY5OSw5ICYjNDM7NzAzLDkgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZF90IHBtZCwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdCAgICBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuIFx0cG1kX3QgcG1kdmFsID0gKnBtZDtcbkBAIC03MzgsMjMgJiM0Mzs3NDIsMjUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gI2VuZGlmXHQvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi9cbiBcbiBcdHBhZ2UgJiM0Mzs9IChhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuLVx0KnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7XG4mIzQzO1x0Km5yX3BhZ2VzID0gbWluKEhQQUdFX1BNRF9OUiAtICgoYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCksXG4mIzQzO1x0XHRcdChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4gXHRyZXR1cm4gcGFnZTtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXG4mIzQzO1x0XHRcdFx0ICAgIHB1ZF90ICpwdWRwLCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHQgICAgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtNzk5LDggJiM0Mzs4MDUsNDYgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRyZXR1cm4gIXVzZXJmYXVsdGZkX3B0ZV93cCh2bWEsIHB0ZSk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkXG4mIzQzOyAqIGxhcmdlIEBmb2xpbyBtYXBzIGNvbnRpZ3VvdXNseSBhbmQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGVcbiYjNDM7ICogcGFnZSBhdCBAYWRkcmVzczogY29uc2VjdXRpdmUgcHJlc2VudCBQVEVzIG1hcHBpbmcgY29uc2VjdXRpdmUgcGFnZXMgb2ZcbiYjNDM7ICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLlxuJiM0MzsgKiBSZXR1cm5zIGF0IGxlYXN0IDEuXG4mIzQzOyAqXG4mIzQzOyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpc1xuJiM0MzsgKiBhbHdheXMgc2FmZTogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLCBhbmQgRk9MTF9XUklURSBpcyBzYXRpc2ZpZWQuXG4mIzQzOyAqIEEgcmVhZC1vbmx5IHJ1biBpcyBvbmx5IHNhZmUgZm9yIGEgcGxhaW4gcmVhZDsgRk9MTF9XUklURSB3b3VsZCBuZWVkIGEgQ09XXG4mIzQzOyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLFxuJiM0MzsgKiBzbyB0aG9zZSBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgcGFnZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG1heDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwdGVfd3JpdGUocHRlKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiAoRk9MTF9XUklURSB8IEZPTExfUElOKSkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoKSBzY2FucyBmb3J3YXJkIGZyb20gQHB0ZXAsIHNvIHRoZSBydW4gbXVzdFxuJiM0MztcdCAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kXG4mIzQzO1x0ICogdGhlIFZNQSwgc2luY2UgYSBsYXJnZSBmb2xpbyBjYW4gYmUgUFRFLW1hcHBlZCBhY3Jvc3MgYSBQTUQgYm91bmRhcnkuXG4mIzQzO1x0ICovXG4mIzQzO1x0bWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuJiM0MztcdFx0ICAodm1hLVx1MDAzZXZtX2VuZCAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbiYjNDM7XHRpZiAobWF4IFx1MDAzYz0gMSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB0ZXAsIFx1MDAyNmJhdGNoX3B0ZSwgbWF4LFxuJiM0MztcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbztcbkBAIC04ODUsNiAmIzQzOzkyOSwxNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0ICovXG4gXHRcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xuIFx0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgUFRFLW1hcHBlZCBsYXJnZSBmb2xpbyBjYW4gYmUgaGFuZGVkIGJhY2sgYXMgYSBjb250aWd1b3VzIGJhdGNoLFxuJiM0MztcdCAqIHNvIHRoZSBjYWxsZXIgYWR2YW5jZXMgb3ZlciB0aGUgd2hvbGUgcnVuIGluIG9uZSBzdGVwIGluc3RlYWQgb2ZcbiYjNDM7XHQgKiB3YWxraW5nIHRoZSBwYWdlIHRhYmxlcyBmb3IgZXZlcnkgcGFnZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4mIzQzO1x0XHQqbnJfcGFnZXMgPSBmb2xsb3dfcHRlX2JhdGNoKHZtYSwgYWRkcmVzcywgZW5kLCBmb2xpbywgcGFnZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgcHRlcCwgcHRlLCBmbGFncyk7XG4gb3V0OlxuIFx0cHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpO1xuIFx0cmV0dXJuIHBhZ2U7XG5AQCAtODk2LDkgJiM0Mzs5NDksOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdCAgICBwdWRfdCAqcHVkcCwgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwbWRfdCAqcG1kLCBwbWR2YWw7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTEyLDcgJiM0Mzs5NjUsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcG1kX3ByZXNlbnQocG1kdmFsKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSlcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuJiM0MztcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuQEAgLTkyNSwyNCAmIzQzOzk3OCwyNCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuJiM0MztcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0fVxuIFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9TUExJVF9QTUQpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4gXHRcdHNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTtcbiBcdFx0LyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqL1xuIFx0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gRVJSX1BUUigtRU5PTUVNKSA6XG4tXHRcdFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4mIzQzO1x0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0fVxuLVx0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdHJldHVybiBwYWdlO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXG4mIzQzO1x0XHRcdFx0ICAgIHA0ZF90ICpwNGRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHB1ZF90ICpwdWRwLCBwdWQ7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTU1LDcgJiM0MzsxMDA4LDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuIFx0XHRpZiAocGFnZSlcbiBcdFx0XHRyZXR1cm4gcGFnZTtcbkBAIC05NjQsMTMgJiM0MzsxMDE3LDEzIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuJiM0MztcdHJldHVybiBmb2xsb3dfcG1kX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBucl9wYWdlcyk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHQgICAgcGdkX3QgKnBnZHAsIHVuc2lnbmVkIGludCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0cDRkX3QgKnA0ZHAsIHA0ZDtcbiBcbkBAIC05ODEsMTUgJiM0MzsxMDM0LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwNGRfcHJlc2VudChwNGQpIHx8IHA0ZF9iYWQocDRkKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgcDRkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiB9XG4gXG4gLyoqXG4gICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4gICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzc1xuICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cFxuJiM0MzsgKiBAZW5kOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RvcCBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxuLSAqIEBwYWdlX21hc2s6IGEgcG9pbnRlciB0byBvdXRwdXQgcGFnZV9tYXNrXG4mIzQzOyAqIEBucl9wYWdlczogb3V0cHV0OyBudW1iZXIgb2YgY29udGlndW91cyBwYWdlcyB0aGUgY2FsbGVyIGNhbiByZWFkXG4gICpcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAgKlxuQEAgLTk5OCwxNSAmIzQzOzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gICogdHJpZ2dlciBhIGZhdWx0IHdpdGggRkFVTFRfRkxBR19VTlNIQVJFIHNldC4gTm90ZSB0aGF0IHVuc2hhcmluZyBpcyBvbmx5XG4gICogcmVsZXZhbnQgd2l0aCBGT0xMX1BJTiBhbmQgIUZPTExfV1JJVEUuXG4gICpcbi0gKiBPbiBvdXRwdXQsIEBwYWdlX21hc2sgaXMgc2V0IGFjY29yZGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgcGFnZS5cbiYjNDM7ICogT24gb3V0cHV0LCBAbnJfcGFnZXMgaG9sZHMgaG93IG1hbnkgY29udGlndW91cyBwYWdlcyB0aGUgZm9saW8gdGhhdCBpbmNsdWRlc1xuJiM0MzsgKiB0aGUgcmV0dXJuZWQgcGFnZSBoYXMgbWFwcGVkIGludG8gdGhpcyBwcm9jZXNzLCBzbyB0aGUgY2FsbGVyIGNhbiBhZHZhbmNlXG4mIzQzOyAqIG92ZXIgYSBsYXJnZSBmb2xpbyBpbiBvbmUgc3RlcC5cbiAgKlxuICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxuICAqIGFuIGVycm9yIHBvaW50ZXIgaWYgdGhlcmUgaXMgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWRcbiAgKiBieSBhIHBhZ2UgZGVzY3JpcHRvciAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXG4gICovXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwZ2RfdCAqcGdkO1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG5AQCAtMTAxNCwxMyAmIzQzOzEwNzAsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpO1xuIFxuLVx0KnBhZ2VfbWFzayA9IDA7XG4mIzQzO1x0Km5yX3BhZ2VzID0gMTtcbiBcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpO1xuIFxuIFx0aWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKVxuIFx0XHRwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGVsc2Vcbi1cdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwZ2QsIGZsYWdzLCBucl9wYWdlcyk7XG4gXG4gXHR2bWFfcGd0YWJsZV93YWxrX2VuZCh2bWEpO1xuIFxuQEAgLTEwODAsOSAmIzQzOzExMzYsMTYgQEAgc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gfVxuIFxuIC8qXG4tICogbW1hcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeS4gIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3Rcbi0gKiBGT0xMX05PV0FJVCwgdGhlIG1tYXBfbG9jayBtYXkgYmUgcmVsZWFzZWQuICBJZiBpdCBpcywgKkBsb2NrZWQgd2lsbCBiZSBzZXRcbi0gKiB0byAwIGFuZCAtRUJVU1kgcmV0dXJuZWQuXG4mIzQzOyAqIFRoZSBjYWxsZXIgaG9sZHMgZWl0aGVyIHRoZSBtbWFwIGxvY2ssIG9yIHRoZSBwZXItVk1BIGxvY2sgKHdpdGhcbiYjNDM7ICogRk9MTF9WTUFfTE9DSyksIG9uIGVudHJ5LiBJZiBAZmxhZ3MgaGFzIEZPTExfVU5MT0NLQUJMRSBidXQgbm90IEZPTExfTk9XQUlULFxuJiM0MzsgKiB0aGUgbW1hcF9sb2NrIG1heSBiZSByZWxlYXNlZC4gSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0IHRvIDAgYW5kXG4mIzQzOyAqIC1FQUdBSU4gcmV0dXJuZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByZXR1cm4gdmFsdWUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBsb2NrIHR5cGU6IGEgZmF1bHQgdGhhdCBtYWRlXG4mIzQzOyAqIHByb2dyZXNzIGJ1dCBuZWVkcyBhIHJldHJ5IChWTV9GQVVMVF9SRVRSWSAvIFZNX0ZBVUxUX0NPTVBMRVRFRCkgaXMgcmVwb3J0ZWRcbiYjNDM7ICogYXMgLUVBR0FJTiBmb3IgYm90aCB0aGUgbW1hcCBsb2NrIGFuZCB0aGUgcGVyLVZNQSBsb2NrIChGT0xMX1ZNQV9MT0NLKS4gT25seVxuJiM0MzsgKiB0aGUgKkBsb2NrZWQgc2lkZSBlZmZlY3QgaXMgbG9jay10eXBlIHNwZWNpZmljLCBhcyB0aGUgcGVyLVZNQSBsb2NrIHBhdGggaGFzXG4mIzQzOyAqIG5vIHVubG9ja2FibGUgbW1hcF9sb2NrIHRvIGRyb3AuXG4gICovXG4gc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLCBib29sIHVuc2hhcmUsXG5AQCAtMTA5Nyw2ICYjNDM7MTE2MCw4IEBAIHN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1dSSVRFO1xuIFx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1JFTU9URSlcbiBcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19SRU1PVEU7XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1ZNQV9MT0NLKVxuJiM0MztcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19WTUFfTE9DSztcbiBcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9VTkxPQ0tBQkxFKSB7XG4gXHRcdGZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfQUxMT1dfUkVUUlkgfCBGQVVMVF9GTEFHX0tJTExBQkxFO1xuIFx0XHQvKlxuQEAgLTExMjUsNDEgJiM0MzsxMTkwLDE5NSBAQCBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdHJldCA9IGhhbmRsZV9tbV9mYXVsdCh2bWEsIGFkZHJlc3MsIGZhdWx0X2ZsYWdzLCBOVUxMKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgZnVsbHkgY29tcGxldGVkIGZhdWx0IChWTV9GQVVMVF9DT01QTEVURUQpIG9yIG9uZSB0aGF0IG5lZWRzIGEgcmV0cnlcbiYjNDM7XHQgKiAoVk1fRkFVTFRfUkVUUlkpIGhhcyByZWxlYXNlZCB0aGUgbG9jayBpdCB3YXMgaG9sZGluZy4gUmVwb3J0IGJvdGggYXNcbiYjNDM7XHQgKiAtRUFHQUlOIHNvIHRoZSBjYWxsZXIgcmV0cmllczogdGhlIG1tYXAgbG9jayBjYWxsZXIgcmV0YWtlcyBpdCBoZXJlLFxuJiM0MztcdCAqIHRoZSBwZXItVk1BIGxvY2sgY2FsbGVyIChGT0xMX1ZNQV9MT0NLKSBmYWxscyBiYWNrIHRvIHRoZSBtbWFwIGxvY2suXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBEcm9wcGluZyB0aGUgbW1hcCBsb2NrIGlzIHJlY29yZGVkIGluICpAbG9ja2VkLiBUaGVyZSBpcyBubyBzdWNoIGxvY2tcbiYjNDM7XHQgKiB0byBkcm9wIHVuZGVyIHRoZSBwZXItVk1BIGxvY2ssIHdoZXJlIEBsb2NrZWQgaXMgbm90IHVzZWQsIHNvIGxlYXZlIGl0XG4mIzQzO1x0ICogYWxvbmUgaW4gdGhhdCBjYXNlLlxuJiM0MztcdCAqL1xuIFx0aWYgKHJldCBcdTAwMjYgVk1fRkFVTFRfQ09NUExFVEVEKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFdpdGggRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQgd2UmIzM5O2xsIG5ldmVyIHJlbGVhc2UgdGhlXG4tXHRcdCAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy5cbi1cdFx0ICovXG4tXHRcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpO1xuLVx0XHQqbG9ja2VkID0gMDtcbi1cbi1cdFx0Lypcbi1cdFx0ICogV2Ugc2hvdWxkIGRvIHRoZSBzYW1lIGFzIFZNX0ZBVUxUX1JFVFJZLCBidXQgbGV0JiMzOTtzIG5vdFxuLVx0XHQgKiByZXR1cm4gLUVCVVNZIHNpbmNlIHRoYXQmIzM5O3Mgbm90IHJlZmxlY3RpbmcgdGhlIHJlYWxpdHkgb2Zcbi1cdFx0ICogd2hhdCBoYXMgaGFwcGVuZWQgLSB3ZSYjMzk7dmUganVzdCBmdWxseSBjb21wbGV0ZWQgYSBwYWdlXG4tXHRcdCAqIGZhdWx0LCB3aXRoIHRoZSBtbWFwIGxvY2sgcmVsZWFzZWQuICBVc2UgLUVBR0FJTiB0byBzaG93XG4tXHRcdCAqIHRoYXQgd2Ugd2FudCB0byB0YWtlIHRoZSBtbWFwIGxvY2sgX2FnYWluXy5cbi1cdFx0ICovXG4mIzQzO1x0XHRpZiAoIShmbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSykpIHtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogV2l0aCBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCB3ZSYjMzk7bGwgbmV2ZXIgcmVsZWFzZSB0aGVcbiYjNDM7XHRcdFx0ICogbW1hcCBsb2NrIGluIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIuIFNhbml0eSBjaGVjayB0aGlzLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKGZhdWx0X2ZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCk7XG4mIzQzO1x0XHRcdCpsb2NrZWQgPSAwO1xuJiM0MztcdFx0fVxuIFx0XHRyZXR1cm4gLUVBR0FJTjtcbiBcdH1cbiBcbiBcdGlmIChyZXQgXHUwMDI2IFZNX0ZBVUxUX0VSUk9SKSB7XG4gXHRcdGludCBlcnIgPSB2bV9mYXVsdF90b19lcnJubyhyZXQsIGZsYWdzKTtcbiBcbi1cdFx0aWYgKGVycilcbi1cdFx0XHRyZXR1cm4gZXJyO1xuLVx0XHRCVUcoKTtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBWTV9GQVVMVF9FUlJPUiBhbHdheXMgZGVjb2RlcyB0byBhbiBlcnJubzsgYSB6ZXJvIGhlcmUgd291bGRcbiYjNDM7XHRcdCAqIG1lYW4gaGFuZGxlX21tX2ZhdWx0KCkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCBjb21iaW5hdGlvbi5cbiYjNDM7XHRcdCAqIFJlcG9ydCAtRUZBVUxUIHJhdGhlciB0aGFuIGNyYXNoOiB1bmRlciB0aGUgcGVyLVZNQSBsb2NrIHRoZVxuJiM0MztcdFx0ICogbW1hcCBsb2NrIHJldHJ5IHByb2R1Y2VzIHRoZSBkZWZpbml0aXZlIHJlc3VsdC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9PTkNFKCFlcnIpO1xuJiM0MztcdFx0cmV0dXJuIGVyciA/IGVyciA6IC1FRkFVTFQ7XG4gXHR9XG4gXG4gXHRpZiAocmV0IFx1MDAyNiBWTV9GQVVMVF9SRVRSWSkge1xuLVx0XHRpZiAoIShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKVxuJiM0MztcdFx0aWYgKCEoZmxhZ3MgXHUwMDI2IEZPTExfVk1BX0xPQ0spIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICEoZmF1bHRfZmxhZ3MgXHUwMDI2IEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUKSlcbiBcdFx0XHQqbG9ja2VkID0gMDtcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHRcdHJldHVybiAtRUFHQUlOO1xuIFx0fVxuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBnZXRfdXNlcl9wYWdlX3ZtYSAtIGdldCBvbmUgcGFnZSBmcm9tIEB2bWEsIHdob3NlIGxvY2sgdGhlIGNhbGxlciBhbHJlYWR5XG4mIzQzOyAqIGhvbGRzOiB0aGUgbW1hcCBsb2NrLCBvciAod2l0aCBGT0xMX1ZNQV9MT0NLKSB0aGUgcGVyLVZNQSBsb2NrLiBXYWxrcyB0aGVcbiYjNDM7ICogcGFnZSB0YWJsZXMsIGZhdWx0aW5nIHRoZSBwYWdlIGluIGlmIG5lZWRlZCwgYW5kIG9uIHN1Y2Nlc3MgcmV0dXJucyBpdCB3aXRoXG4mIzQzOyAqIGEgcmVmZXJlbmNlIGFuZCB0aGUgbG9jayBzdGlsbCBoZWxkLlxuJiM0MzsgKlxuJiM0MzsgKiBSdW5zIGNoZWNrX3ZtYV9mbGFncygpIGxpa2UgX19nZXRfdXNlcl9wYWdlcygpLCBzbyBjYWxsZXJzIG5lZWQgbm90IHByZS1jaGVja1xuJiM0MzsgKiB0aGUgVk1BOyBtb3N0IHJlamVjdGlvbnMgYXJlIHJldHVybmVkIGFzIHRoZWlyIGVycm9yLiBBIFZNX0lPL1ZNX1BGTk1BUCBWTUFcbiYjNDM7ICogaXMgdGhlIGV4Y2VwdGlvbjogYSBDT1dlZCBwYWdlIHdpdGggYSBzdHJ1Y3QgcGFnZSBpcyByZXR1cm5lZCwgd2hpbGUgYSByYXdcbiYjNDM7ICogUEZOIGhhcyBub25lIGFuZCB5aWVsZHMgLUVGQVVMVCwgdG8gYmUgcmVhY2hlZCB2aWEgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MoKS5cbiYjNDM7ICpcbiYjNDM7ICogVW5kZXIgRk9MTF9WTUFfTE9DSywgYW55dGhpbmcgdGhhdCBjYW5ub3QgYmUgZmluaXNoZWQgdW5kZXIgdGhlIHBlci1WTUEgbG9ja1xuJiM0MzsgKiAoYSBkcm9wcGVkIGZhdWx0LCB1c2VyZmF1bHRmZCwgYSBoYXJkIGVycm9yLCBvciAtXHUwMDNlYWNjZXNzKCkgbWVtb3J5KSByZWxlYXNlc1xuJiM0MzsgKiB0aGUgbG9jayBhbmQgcmV0dXJucyAtRUFHQUlOLCBzbyB0aGUgY2FsbGVyIHJldHJpZXMgdW5kZXIgdGhlIG1tYXAgbG9jay5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncylcbiYjNDM7e1xuJiM0MztcdGJvb2wgdm1hX2xvY2tlZCA9IGd1cF9mbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzO1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdGludCBsb2NrZWQgPSAxO1xuJiM0MztcdGJvb2wgcGZubWFwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVHdvIGxvY2sgbW9kZXMgYXJlIHN1cHBvcnRlZDogdGhlIG1tYXAgbG9jaywgd2l0aCBuZWl0aGVyIGZsYWcsIG9yXG4mIzQzO1x0ICogdGhlIHBlci1WTUEgbG9jaywgd2l0aCBib3RoIEZPTExfVk1BX0xPQ0sgYW5kIEZPTExfVU5MT0NLQUJMRS4gQW5cbiYjNDM7XHQgKiB1bmxvY2thYmxlIG1tYXAgZmF1bHQgd291bGQgZHJvcCB0aGUgbG9jayBhbmQgcmVwb3J0IGl0IGluICpsb2NrZWQsXG4mIzQzO1x0ICogd2hpY2ggdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWxheSwgc28gcmVqZWN0IGEgbG9uZSBmbGFnLlxuJiM0MztcdCAqL1xuJiM0MztcdFZNX1dBUk5fT05fT05DRSghKGd1cF9mbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSykgIT0gIShndXBfZmxhZ3MgXHUwMDI2IEZPTExfVU5MT0NLQUJMRSkpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFZhbGlkYXRlIHRoZSBWTUEgdXAgZnJvbnQsIGxpa2UgX19nZXRfdXNlcl9wYWdlcygpLiBBIFZNX0lPL1ZNX1BGTk1BUFxuJiM0MztcdCAqIFZNQSBpcyBub3QgcmVqZWN0ZWQgb3V0cmlnaHQ6IGl0IGNhbiBob2xkIENPV2VkIHBhZ2VzIHRoYXQgaGF2ZSBhXG4mIzQzO1x0ICogc3RydWN0IHBhZ2U7IGxldCBmb2xsb3dfcGFnZV9tYXNrKCkgbG9vayBmb3IgdGhlbSwgYW5kIHRyZWF0IG9ubHlcbiYjNDM7XHQgKiBpdHMgc3RydWN0LXBhZ2UtbGVzcyBQRk5zIGFzIHVucmVhY2hhYmxlLiBPdGhlciByZWplY3Rpb25zXG4mIzQzO1x0ICogKHNlY3JldG1lbSwgcGVybWlzc2lvbnMsIGV0YykgcmVzdWx0IGluIGltbWVkaWF0ZSBmYWlsdXJlLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldCA9IGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgVk1fSU8gfCBWTV9QRk5NQVApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0cGZubWFwID0gdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiAoVk1fSU8gfCBWTV9QRk5NQVApO1xuJiM0MztcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gLUVJTlRSO1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjb25kX3Jlc2NoZWQoKTtcbiYjNDM7XG4mIzQzO1x0XHQvKiBUaGlzIGhlbHBlciBoYW5kcyBiYWNrIGEgc2luZ2xlIHBhZ2U7IGNhcCB0aGUgYmF0Y2ggYXQgb25lLiAqL1xuJiM0MztcdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBhZGRyLCBhZGRyICYjNDM7IFBBR0VfU0laRSxcbiYjNDM7XHRcdFx0XHRcdGd1cF9mbGFncyB8IEZPTExfVE9VQ0ggfCBGT0xMX0dFVCxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNm5yX3BhZ2VzKTtcbiYjNDM7XHRcdGlmICghSVNfRVJSX09SX05VTEwocGFnZSkpIHtcbiYjNDM7XHRcdFx0LyogTWF0Y2ggX19nZXRfdXNlcl9wYWdlcygpOiBmbHVzaCBmb3IgVklWVC9hbGlhc2luZyBjYWNoZXMuICovXG4mIzQzO1x0XHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHBhZ2UsIGFkZHIpO1xuJiM0MztcdFx0XHRmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHBhZ2U7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE5vIHN0cnVjdCBwYWdlOiBhIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgVk1BLCB3aGV0aGVyXG4mIzQzO1x0XHQgKiBzZWVuIGJ5IHRoZSB1cC1mcm9udCBjaGVjayAoQHBmbm1hcCkgb3IgcmVwb3J0ZWQgYXMgLUVFWElTVFxuJiM0MztcdFx0ICogZm9yIGEgcHJlc2VudCBQRk4uIFJldHVybiAtRUZBVUxUIHNvIHRoZSBjYWxsZXIgcmVhY2hlcyBpdFxuJiM0MztcdFx0ICogdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocGZubWFwIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVFWElTVCkge1xuJiM0MztcdFx0XHRyZXQgPSAtRUZBVUxUO1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBBIGhhcmQgZXJyb3IgZnJvbSB0aGUgd2FsayBpdHNlbGYuICovXG4mIzQzO1x0XHRpZiAocGFnZSBcdTAwMjZcdTAwMjYgUFRSX0VSUihwYWdlKSAhPSAtRU1MSU5LKSB7XG4mIzQzO1x0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4mIzQzO1x0XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhlIHBhZ2UgaXMgbm90IHByZXNlbnQsIG9yIG5lZWRzIHVuc2hhcmluZy4gQSByZW1vdGUgZmF1bHRcbiYjNDM7XHRcdCAqIHVuZGVyIHRoZSBwZXItVk1BIGxvY2sgY2Fubm90IGRlbGl2ZXIgdXNlcmZhdWx0ZmQgKHdoaWNoXG4mIzQzO1x0XHQgKiBhc3N1bWVzIGN1cnJlbnQgaXMgdGhlIGZhdWx0aW5nIHRhc2spLCBzbyBmYWxsIGJhY2sgZm9yIHRob3NlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAodm1hX2xvY2tlZCBcdTAwMjZcdTAwMjYgdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuJiM0MztcdFx0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfR0VULFxuJiM0MztcdFx0XHRcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgXHUwMDI2bG9ja2VkKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gLUVBR0FJTilcbiYjNDM7XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XHQvKiBmYXVsdCByZWxlYXNlZCB0aGUgcGVyLVZNQSBsb2NrICovXG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZGVyIHRoZSBwZXItVk1BIGxvY2sgdGhlIGNhbGxlciBjYW5ub3QgcmVhY2ggLVx1MDAzZWFjY2VzcygpIG9yIGFjdCBvbiBhXG4mIzQzO1x0ICogaGFyZCBlcnJvciAoYm90aCBuZWVkIHRoZSBtbWFwIGxvY2spLCBzbyByZWxlYXNlIHRoZSBsb2NrIGFuZCBoYXZlIGl0XG4mIzQzO1x0ICogcmV0cnkgdGhlcmU7IHRoZSBtbWFwLWxvY2sgcGFzcyBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSBlcnJvci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodm1hX2xvY2tlZCkge1xuJiM0MztcdFx0dm1hX2VuZF9yZWFkKHZtYSk7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEVSUl9QVFIocmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hIC0gZmF1bHQgaW4gb25lIHBhZ2Ugb2YgYSByZW1vdGUgbW0gYW5kIGhhbmQgYmFjayB0aGVcbiYjNDM7ICogcGFnZSBhbG9uZyB3aXRoIHRoZSBWTUEgdGhhdCBjb3ZlcnMgaXQuIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBtbWFwX2xvY2suXG4mIzQzOyAqIFJldHVybnMgd2l0aCB0aGUgbW1hcF9sb2NrIHN0aWxsIGhlbGQuXG4mIzQzOyAqXG4mIzQzOyAqIExvb2tzIHVwIHRoZSBWTUEsIGFuZCBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwYWdlIHRocm91Z2hcbiYjNDM7ICogZ2V0X3VzZXJfcGFnZV92bWEoKSwgZmF1bHRpbmcgaW4gdGhlIHBhZ2UgaWYgbmVlZGVkLlxuJiM0MzsgKlxuJiM0MzsgKiBGT0xMX05PV0FJVCBhbmQgRk9MTF9VTkxPQ0tBQkxFIGFyZSByZWplY3RlZDogYm90aCBsZXQgdGhlIGZhdWx0IGhhbmRsZXJcbiYjNDM7ICogZHJvcCB0aGUgbW1hcCBsb2NrLCB3aGljaCBjb3VsZCBpbnZhbGlkYXRlIHRoZSBsb29rZWQtdXAgVk1BLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgIGludCBndXBfZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgKEZPTExfTk9XQUlUIHwgRk9MTF9VTkxPQ0tBQkxFKSkpKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4mIzQzO1xuJiM0MztcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XG4mIzQzO1xuJiM0MztcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xuJiM0MztcdGlmICghdm1hKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4mIzQzO1xuJiM0MztcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7XG4mIzQzO1x0aWYgKElTX0VSUihwYWdlKSlcbiYjNDM7XHRcdHJldHVybiBwYWdlO1xuJiM0MztcbiYjNDM7XHQqdm1hcCA9IHZtYTtcbiYjNDM7XHRyZXR1cm4gcGFnZTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIFdyaXRpbmcgdG8gZmlsZS1iYWNrZWQgbWFwcGluZ3Mgd2hpY2ggcmVxdWlyZSBmb2xpbyBkaXJ0eSB0cmFja2luZyB1c2luZyBHVVBcbiAgKiBpcyBhIGZ1bmRhbWVudGFsbHkgYnJva2VuIG9wZXJhdGlvbiwgYXMga2VybmVsIHdyaXRlIGFjY2VzcyB0byBHVVAgbWFwcGluZ3NcbkBAIC0xMTk3LDEzICYjNDM7MTQxNiwyMSBAQCBzdGF0aWMgYm9vbCB3cml0YWJsZV9maWxlX21hcHBpbmdfYWxsb3dlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJldHVybiAhdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHZtYSk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncylcbiYjNDM7aW50IGNoZWNrX3ZtYV9mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBndXBfZmxhZ3MsXG4mIzQzO1x0XHQgICAgdm1fZmxhZ3NfdCBpZ25vcmVfZmxhZ3MpXG4ge1xuIFx0dm1fZmxhZ3NfdCB2bV9mbGFncyA9IHZtYS1cdTAwM2V2bV9mbGFncztcbiBcdGludCB3cml0ZSA9IChndXBfZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpO1xuIFx0aW50IGZvcmVpZ24gPSAoZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX1JFTU9URSk7XG4gXHRib29sIHZtYV9hbm9uID0gdm1hX2lzX2Fub255bW91cyh2bWEpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogT3B0IG91dCBvZiB0aGUgZmxhZyBjaGVja3MgdGhhdCByZWFkIHRoaXMgbG9jYWwgY29weSAodGhlXG4mIzQzO1x0ICogVk1fSU8vVk1fUEZOTUFQIGdhdGUgYW5kIHRoZSB3cml0ZS9yZWFkL2NvdyBiaXRzKTsgY2hlY2tzIHRoYXRcbiYjNDM7XHQgKiByZS1yZWFkIHZtYS1cdTAwM2V2bV9mbGFncyB0aHJvdWdoIGhlbHBlcnMgYXJlIHVuYWZmZWN0ZWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1fZmxhZ3MgXHUwMDI2PSB+aWdub3JlX2ZsYWdzO1xuJiM0MztcbiBcdGlmICh2bV9mbGFncyBcdTAwMjYgKFZNX0lPIHwgVk1fUEZOTUFQKSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG5AQCAtMTM1OCw3ICYjNDM7MTU4NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4ge1xuIFx0bG9uZyByZXQgPSAwLCBpID0gMDtcbiBcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbi1cdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcbiBcbiBcdGlmICghbnJfcGFnZXMpXG4gXHRcdHJldHVybiAwO1xuQEAgLTEzNzMsNyAmIzQzOzE1OTksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0ZG8ge1xuIFx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2luY3JlbTtcbiBcbiBcdFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xuIFx0XHRpZiAoIXZtYSB8fCBzdGFydCBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbkBAIC0xMzg3LDcgJiM0MzsxNjEzLDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0cmV0ID0gLUVOT01FTTtcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0XHR9XG4tXHRcdFx0XHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkge1xuJiM0MztcdFx0XHRcdGlmIChjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApKSB7XG4gXHRcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdFx0fVxuQEAgLTE0MDAsNyAmIzQzOzE2MjYsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0XHRcdHBhZ2VzID8gXHUwMDI2cGFnZSA6IE5VTEwpO1xuIFx0XHRcdFx0aWYgKHJldClcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0XHRwYWdlX21hc2sgPSAwO1xuJiM0MztcdFx0XHRcdHBhZ2VfaW5jcmVtID0gMTtcbiBcdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuIFx0XHRcdH1cbiBcbkBAIC0xNDA4LDcgJiM0MzsxNjM0LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdHJldCA9IC1FRkFVTFQ7XG4gXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4tXHRcdFx0cmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKTtcbiYjNDM7XHRcdFx0cmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKTtcbiBcdFx0XHRpZiAocmV0KVxuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbkBAIC0xNDIzLDcgJiM0MzsxNjQ5LDggQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcbi1cdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCBcdTAwMjZwYWdlX21hc2spO1xuJiM0MztcdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsXG4mIzQzO1x0XHRcdFx0XHRndXBfZmxhZ3MsIFx1MDAyNnBhZ2VfaW5jcmVtKTtcbiBcdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuIFx0XHRcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXG4gXHRcdFx0XHRcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcbkBAIC0xNDU2LDcgJiM0MzsxNjgzLDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIG5leHRfcGFnZTpcbi1cdFx0cGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgcGFnZV9tYXNrKTtcbiBcdFx0aWYgKHBhZ2VfaW5jcmVtIFx1MDAzZSBucl9wYWdlcylcbiBcdFx0XHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xuIFxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXG5pbmRleCAxODFlNzlmMWQ2YTIwNy4uNzA2ZjdmMDhmZDE4MTUgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oXG5AQCAtMTU5NSw2ICYjNDM7MTU5NSwxMCBAQCBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLFxuICAqL1xuIGludCBfX211c3RfY2hlY2sgdHJ5X2dyYWJfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IHJlZnMsXG4gXHRcdFx0XHR1bnNpZ25lZCBpbnQgZmxhZ3MpO1xuJiM0MztpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncyxcbiYjNDM7XHRcdCAgICB2bV9mbGFnc190IGlnbm9yZV9mbGFncyk7XG4mIzQzO3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncyk7XG4gXG4gLypcbiAgKiBtbS9odWdlX21lbW9yeS5jXG5AQCAtMTY0MSwxMSAmIzQzOzE2NDUsMTMgQEAgZW51bSB7XG4gXHRGT0xMX1VOTE9DS0FCTEUgPSAxIFx1MDAzY1x1MDAzYyAyMSxcbiBcdC8qIFZNQSBsb29rdXAmIzQzO2NoZWNrcyBjb21wYXRpYmxlIHdpdGggTUFEVl9QT1BVTEFURV8oUkVBRHxXUklURSkgKi9cbiBcdEZPTExfTUFEVl9QT1BVTEFURSA9IDEgXHUwMDNjXHUwMDNjIDIyLFxuJiM0MztcdC8qIGNhbGxlciBob2xkcyB0aGUgcGVyLVZNQSBsb2NrLCBub3QgdGhlIG1tYXAgbG9jayAqL1xuJiM0MztcdEZPTExfVk1BX0xPQ0sgPSAxIFx1MDAzY1x1MDAzYyAyMyxcbiB9O1xuIFxuICNkZWZpbmUgSU5URVJOQUxfR1VQX0ZMQUdTIChGT0xMX1RPVUNIIHwgRk9MTF9UUklFRCB8IEZPTExfUkVNT1RFIHwgRk9MTF9QSU4gfCBcXFxuIFx0XHRcdCAgICBGT0xMX0ZBU1RfT05MWSB8IEZPTExfVU5MT0NLQUJMRSB8IFxcXG4tXHRcdFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSlcbiYjNDM7XHRcdFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSB8IEZPTExfVk1BX0xPQ0spXG4gXG4gLypcbiAgKiBJbmRpY2F0ZXMgZm9yIHdoaWNoIHBhZ2VzIHRoYXQgYXJlIHdyaXRlLXByb3RlY3RlZCBpbiB0aGUgcGFnZSB0YWJsZSxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXG5pbmRleCBmZjMzOGMyYWJlOTIzMS4uYWFmNjIwMDE3ZjM0NDIgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnkuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LmNcbkBAIC03MDE1LDg2ICYjNDM7NzAxNSwyNDQgQEAgRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19hY2Nlc3NfcGh5cyk7XG4gI2VuZGlmXG4gXG4gLypcbi0gKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJiMzOTsgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cbiYjNDM7ICogVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5LCBzdWNoIGFzIGFuIGlvcmVtYXBwZWQgZGV2aWNlIG1hcHBpbmcsIG1hcHNcbiYjNDM7ICogUEZOcyB0aGF0IGhhdmUgbm8gc3RydWN0IHBhZ2UsIHNvIGdldF91c2VyX3BhZ2Vfdm1hKCkgY2Fubm90IGZldGNoIGl0XG4mIzQzOyAqIGV2ZW4gdGhvdWdoIHRoZSBwYWdlIHRhYmxlcyBhcmUgcG9wdWxhdGVkLiBJdCBjYW4gc3RpbGwgYmUgcmVhY2hlZFxuJiM0MzsgKiB0aHJvdWdoIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3IgXHUwMDNjPSAwIGlmIEB2bWEgY2Fubm90IGJlXG4mIzQzOyAqIGFjY2Vzc2VkIHRoaXMgd2F5LlxuICAqL1xuLXN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuJiM0MztzdGF0aWMgaW50IGFjY2Vzc19yZW1vdGVfdm1hX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHRcdCB2b2lkICpidWYsIGludCBsZW4sIGludCB3cml0ZSlcbiYjNDM7e1xuJiM0MzsjaWZkZWYgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UXG4mIzQzO1x0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKVxuJiM0MztcdFx0cmV0dXJuIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTtcbiYjNDM7I2VuZGlmXG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIExvY2sgQG1tIHRvIHJlYWNoIHRoZSByZW1vdGUgcmFuZ2UgW0BhZGRyLCBAYWRkciAmIzQzOyBAbGVuKS5cbiYjNDM7ICpcbiYjNDM7ICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlXG4mIzQzOyAqIGZsYWdzIHBlcm1pdCB0aGUgYWNjZXNzLiBUaGUgUkNVIGZyZWVkIHBhZ2UgdGFibGVzIHRoZW4ga2VlcCBwYWdlIHRhYmxlXG4mIzQzOyAqIG1lbW9yeSBmcm9tIGJlaW5nIHJldXNlZCB3aXRoIHVuZXhwZWN0ZWQgY29udGVudHMgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC5cbiYjNDM7ICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLFxuJiM0MzsgKiBzdGFjayBleHBhbnNpb24sIGFuZCAtXHUwMDNlYWNjZXNzKCkgbWVtb3J5LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm4gd2hldGhlciB0aGUgbW1hcCBsb2NrIGlzIGhlbGQuIFRoZSBwZXItVk1BIGxvY2tlZCBWTUEsIHdoZW4gb25lIGlzXG4mIzQzOyAqIHRha2VuLCBpcyBzdG9yZWQgaW4gKkB2bWFwOyBpdCBpcyBOVUxMIG9uIHRoZSBtbWFwIGxvY2sgcGF0aC4gKkB2bWFwIGlzXG4mIzQzOyAqIHNldCB0byBhbiBFUlJfUFRSKCkgd2hlbiB0aGUgbW1hcCBsb2NrIGNvdWxkIG5vdCBiZSB0YWtlbiwgc28gY2FsbGVycyBtdXN0XG4mIzQzOyAqIGNoZWNrIElTX0VSUigqQHZtYXApIGJlZm9yZSB1c2luZyBlaXRoZXIgcmVzdWx0LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgcmVtb3RlX2FjY2Vzc19sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4mIzQzO1x0XHRcdCAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbiYjNDM7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19QRVJfVk1BX0xPQ0spIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19NTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFKVxuJiM0MztcdHZtYSA9IGxvY2tfdm1hX3VuZGVyX3JjdShtbSwgYWRkcik7XG4mIzQzO1x0aWYgKHZtYSkge1xuJiM0MztcdFx0LyogYWRkciAmIzQzOyBsZW4gbXVzdCBub3Qgd3JhcCwgYW5kIG11c3QgZml0IHdpdGhpbiB0aGUgb25lIFZNQS4gKi9cbiYjNDM7XHRcdGlmIChhZGRyICYjNDM7IGxlbiBcdTAwM2MgYWRkciB8fCBhZGRyICYjNDM7IGxlbiBcdTAwM2Ugdm1hLVx1MDAzZXZtX2VuZCB8fFxuJiM0MztcdFx0ICAgIGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCkpIHtcbiYjNDM7XHRcdFx0dm1hX2VuZF9yZWFkKHZtYSk7XG4mIzQzO1x0XHRcdHZtYSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzO1x0aWYgKCF2bWEpIHtcbiYjNDM7XHRcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpIHtcbiYjNDM7XHRcdFx0KnZtYXAgPSBFUlJfUFRSKC1FSU5UUik7XG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdCp2bWFwID0gTlVMTDtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0KnZtYXAgPSB2bWE7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBSZWxlYXNlIHRoZSBsb2NrIHRha2VuIGJ5IHJlbW90ZV9hY2Nlc3NfbG9jaygpLiAqL1xuJiM0MztzdGF0aWMgdm9pZCByZW1vdGVfYWNjZXNzX3VubG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiYjNDM7XHRcdFx0XHQgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgaGF2ZV9tbWFwX2xvY2spXG4mIzQzO3tcbiYjNDM7XHRpZiAoaGF2ZV9tbWFwX2xvY2spXG4mIzQzO1x0XHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiYjNDM7XHRlbHNlIGlmICh2bWEpXG4mIzQzO1x0XHR2bWFfZW5kX3JlYWQodm1hKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUGVyLXBhZ2UgYWN0aW9uIGZvciBhIHJlbW90ZSBWTSB3YWxrLiBIYW5kbGUgdXAgdG8gQGxlbiBieXRlcyBhdCBAYWRkciBvblxuJiM0MzsgKiBAcGFnZSwgYWR2YW5jaW5nICpAYnVmIHBhc3QgdGhlIGJ5dGVzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGl0LiBAcGFnZSBpc1xuJiM0MzsgKiBOVUxMIGZvciBzdHJ1Y3QtcGFnZS1sZXNzIG1lbW9yeSAoVk1fSU8gLyBWTV9QRk5NQVApIHJlYWNoZWQgdW5kZXIgdGhlIG1tYXBcbiYjNDM7ICogbG9jay5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIGJ5dGVzIGhhbmRsZWQgYXQgQGFkZHIsIDAgdG8gZW5kIHRoZSB3YWxrIChhXG4mIzQzOyAqIHN0cmluZyByZWFjaGVkIGl0cyBOVUwsIG9yIC1cdTAwM2VhY2Nlc3MoKSBtZW1vcnkgY291bGQgbm90IGJlIHJlYWNoZWQpLCBvciBhXG4mIzQzOyAqIG5lZ2F0aXZlIGVycm5vIHRvIGFib3J0LlxuJiM0MzsgKi9cbiYjNDM7dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4mIzQzO1x0XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLFxuJiM0MztcdFx0XHRcdGludCB3cml0ZSk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBXYWxrIHRoZSByZW1vdGUgcmFuZ2UgW0BhZGRyLCBAYWRkciAmIzQzOyBAbGVuKSBvZiBAbW0sIGhhbmRpbmcgZWFjaCBwYWdlIHRvXG4mIzQzOyAqIEBhY3Rpb24uIFVzZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHJhbmdlIGZpdHMgb25lIFZNQSwgYW5kIGZhbGwgYmFjayB0b1xuJiM0MzsgKiB0aGUgbW1hcCBsb2NrIGZvciBtdWx0aS1WTUEgcmFuZ2VzLCBzdGFjayBleHBhbnNpb24gKHdoZW4gQGNhbl9leHBhbmRfc3RhY2tcbiYjNDM7ICogaXMgc2V0KSwgb3Igd2hlbiB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBmaW5pc2ggYSBmYXVsdC5cbiYjNDM7ICpcbiYjNDM7ICogRWFjaCBwYWdlIGlzIGZhdWx0ZWQgaW4gd2l0aCBnZXRfdXNlcl9wYWdlX3ZtYSgpIHVuZGVyIHdoaWNoZXZlciBsb2NrIGlzXG4mIzQzOyAqIGhlbGQuIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIEBhY3Rpb24gY29uc3VtZWQ7ICpAZXJyIGlzIGEgbmVnYXRpdmVcbiYjNDM7ICogZXJybm8gd2hlbiB0aGUgd2FsayBhYm9ydGVkLCBlbHNlIDAuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHJlbW90ZV92bV93YWxrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZixcbiYjNDM7XHRcdFx0ICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBib29sIGNhbl9leHBhbmRfc3RhY2ssXG4mIzQzO1x0XHRcdCAgcmVtb3RlX3ZtX2FjdGlvbiBhY3Rpb24sIGludCAqZXJyKVxuIHtcbiBcdHZvaWQgKm9sZF9idWYgPSBidWY7XG4gXHRpbnQgd3JpdGUgPSBndXBfZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEU7XG4mIzQzO1x0Ym9vbCBoYXZlX21tYXBfbG9jaztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiBcbi1cdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpXG4tXHRcdHJldHVybiAwO1xuJiM0MztcdCplcnIgPSAwO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNldCBGT0xMX1JFTU9URSBzbyBjaGVja192bWFfZmxhZ3MoKSBhcHBsaWVzIHRoZSBzYW1lIHByb3RlY3Rpb24ga2V5XG4mIzQzO1x0ICogcnVsZXMgYXMgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKCkgZGlkOiB0aGUgY3VycmVudCBQS1JVIGlzIG5vdCBjaGVja2VkXG4mIzQzO1x0ICogYWdhaW5zdCBhIFZNQSByZWFjaGVkIG9uIEBtbSYjMzk7cyBiZWhhbGYuXG4mIzQzO1x0ICovXG4mIzQzO1x0Z3VwX2ZsYWdzIHw9IEZPTExfUkVNT1RFO1xuIFxuLVx0LyogVW50YWcgdGhlIGFkZHJlc3MgYmVmb3JlIGxvb2tpbmcgdXAgdGhlIFZNQSAqL1xuLVx0YWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTtcbiYjNDM7XHRhZGRyID0gdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpO1xuIFxuLVx0LyogQXZvaWQgdHJpZ2dlcmluZyB0aGUgdGVtcG9yYXJ5IHdhcm5pbmcgaW4gX19nZXRfdXNlcl9wYWdlcyAqL1xuLVx0aWYgKCF2bWFfbG9va3VwKG1tLCBhZGRyKSBcdTAwMjZcdTAwMjYgIWV4cGFuZF9zdGFjayhtbSwgYWRkcikpXG4mIzQzO1x0aGF2ZV9tbWFwX2xvY2sgPSByZW1vdGVfYWNjZXNzX2xvY2sobW0sIGFkZHIsIGxlbiwgZ3VwX2ZsYWdzLCBcdTAwMjZ2bWEpO1xuJiM0MztcdGlmIChJU19FUlIodm1hKSkge1xuJiM0MztcdFx0KmVyciA9IC1FRkFVTFQ7XG4gXHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiBcbi1cdC8qIGlnbm9yZSBlcnJvcnMsIGp1c3QgY2hlY2sgaG93IG11Y2ggd2FzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCAqL1xuIFx0d2hpbGUgKGxlbikge1xuLVx0XHRpbnQgYnl0ZXMsIG9mZnNldDtcbi1cdFx0dm9pZCAqbWFkZHI7XG4tXHRcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbi1cdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsXG4tXHRcdFx0XHRcdFx0XHQgICAgIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmb2xsX2ZsYWdzID0gZ3VwX2ZsYWdzO1xuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4mIzQzO1x0XHRpbnQgcmV0O1xuIFxuLVx0XHRpZiAoSVNfRVJSKHBhZ2UpKSB7XG4tXHRcdFx0LyogV2UgbWlnaHQgbmVlZCB0byBleHBhbmQgdGhlIHN0YWNrIHRvIGFjY2VzcyBpdCAqL1xuJiM0MztcdFx0aWYgKCF2bWEgfHwgYWRkciBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbiYjNDM7XHRcdFx0LyogQW55IGxvb2t1cCBoZXJlIGhvbGRzIHRoZSBtbWFwIGxvY2suICovXG4mIzQzO1x0XHRcdFZNX0JVR19PTighaGF2ZV9tbWFwX2xvY2spO1xuIFx0XHRcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xuLVx0XHRcdGlmICghdm1hKSB7XG4mIzQzO1x0XHRcdGlmICghdm1hIFx1MDAyNlx1MDAyNiBjYW5fZXhwYW5kX3N0YWNrKSB7XG4mIzQzO1x0XHRcdFx0LyogZXhwYW5kX3N0YWNrKCkgZHJvcHMgdGhlIG1tYXAgbG9jayBpZiBpdCBmYWlscyAqL1xuIFx0XHRcdFx0dm1hID0gZXhwYW5kX3N0YWNrKG1tLCBhZGRyKTtcbi1cbi1cdFx0XHRcdC8qIG1tYXBfbG9jayB3YXMgZHJvcHBlZCBvbiBmYWlsdXJlICovXG4gXHRcdFx0XHRpZiAoIXZtYSlcbi1cdFx0XHRcdFx0cmV0dXJuIGJ1ZiAtIG9sZF9idWY7XG4tXG4tXHRcdFx0XHQvKiBUcnkgYWdhaW4gaWYgc3RhY2sgZXhwYW5zaW9uIHdvcmtlZCAqL1xuLVx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdFx0XHRoYXZlX21tYXBfbG9jayA9IGZhbHNlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGlmICghdm1hKSB7XG4mIzQzO1x0XHRcdFx0KmVyciA9IC1FRkFVTFQ7XG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBGT0xMX1VOTE9DS0FCTEUgbGV0cyB0aGUgcGVyLVZNQSBmYXVsdCByZXRyeSwgZHJvcHBpbmcgdGhlXG4mIzQzO1x0XHQgKiBsb2NrLCBzbyB0aGUgd2FsayBjYW4gZmFsbCBiYWNrIHRvIHRoZSBtbWFwIGxvY2suXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmICghaGF2ZV9tbWFwX2xvY2spXG4mIzQzO1x0XHRcdGZvbGxfZmxhZ3MgfD0gRk9MTF9WTUFfTE9DSyB8IEZPTExfVU5MT0NLQUJMRTtcbiBcbiYjNDM7XHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGZvbGxfZmxhZ3MpO1xuJiM0MztcdFx0aWYgKElTX0VSUihwYWdlKSkge1xuIFx0XHRcdC8qXG4tXHRcdFx0ICogQ2hlY2sgaWYgdGhpcyBpcyBhIFZNX0lPIHwgVk1fUEZOTUFQIFZNQSwgd2hpY2hcbi1cdFx0XHQgKiB3ZSBjYW4gYWNjZXNzIHVzaW5nIHNsaWdodGx5IGRpZmZlcmVudCBjb2RlLlxuJiM0MztcdFx0XHQgKiBnZXRfdXNlcl9wYWdlX3ZtYSgpIHJldHVybnMgLUVBR0FJTiwgd2l0aCB0aGUgcGVyLVZNQVxuJiM0MztcdFx0XHQgKiBsb2NrIHJlbGVhc2VkLCBmb3IgYW55dGhpbmcgaXQgY291bGQgbm90IGZpbmlzaCB1bmRlclxuJiM0MztcdFx0XHQgKiBpdDsgcmV0YWtlIHRoZSBtbWFwIGxvY2sgYW5kIHJldHJ5LiBBIGRpZmZlcmVudCBlcnJvclxuJiM0MztcdFx0XHQgKiB0aGVyZWZvcmUgb25seSBhcnJpdmVzIHVuZGVyIHRoZSBtbWFwIGxvY2ssIHdoZXJlXG4mIzQzO1x0XHRcdCAqIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IGNhbiBiZSByZWFjaGVkIHZpYSAtXHUwMDNlYWNjZXNzKCkuXG4gXHRcdFx0ICovXG4tXHRcdFx0Ynl0ZXMgPSAwO1xuLSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbi1cdFx0XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MpXG4tXHRcdFx0XHRieXRlcyA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGxlbiwgd3JpdGUpO1xuLSNlbmRpZlxuLVx0XHRcdGlmIChieXRlcyBcdTAwM2M9IDApXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0Ynl0ZXMgPSBsZW47XG4tXHRcdFx0b2Zmc2V0ID0gYWRkciBcdTAwMjYgKFBBR0VfU0laRS0xKTtcbi1cdFx0XHRpZiAoYnl0ZXMgXHUwMDNlIFBBR0VfU0laRS1vZmZzZXQpXG4tXHRcdFx0XHRieXRlcyA9IFBBR0VfU0laRS1vZmZzZXQ7XG4tXG4tXHRcdFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xuLVx0XHRcdGlmICh3cml0ZSkge1xuLVx0XHRcdFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxuLVx0XHRcdFx0XHRcdCAgbWFkZHIgJiM0Mzsgb2Zmc2V0LCBidWYsIGJ5dGVzKTtcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHlfbG9jayhmb2xpbyk7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxuLVx0XHRcdFx0XHRcdCAgICBidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpO1xuJiM0MztcdFx0XHRpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUFHQUlOKSB7XG4mIzQzO1x0XHRcdFx0dm1hID0gTlVMTDtcbiYjNDM7XHRcdFx0XHRpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKSB7XG4mIzQzO1x0XHRcdFx0XHQqZXJyID0gLUVGQVVMVDtcbiYjNDM7XHRcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRcdH1cbiYjNDM7XHRcdFx0XHRoYXZlX21tYXBfbG9jayA9IHRydWU7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0fVxuLVx0XHRcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKCFoYXZlX21tYXBfbG9jaykpXG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdHBhZ2UgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHJldCA9IGFjdGlvbih2bWEsIHBhZ2UsIGFkZHIsIFx1MDAyNmJ1ZiwgbGVuLCB3cml0ZSk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuJiM0MztcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdCplcnIgPSByZXQ7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGxlbiAtPSBieXRlcztcbi1cdFx0YnVmICYjNDM7PSBieXRlcztcbi1cdFx0YWRkciAmIzQzOz0gYnl0ZXM7XG4mIzQzO1x0XHRhZGRyICYjNDM7PSByZXQ7XG4mIzQzO1x0XHRsZW4gLT0gcmV0O1xuIFx0fVxuLVx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4mIzQzO1xuJiM0MztcdHJlbW90ZV9hY2Nlc3NfdW5sb2NrKG1tLCB2bWEsIGhhdmVfbW1hcF9sb2NrKTtcbiBcbiBcdHJldHVybiBidWYgLSBvbGRfYnVmO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogQ29weSBvbmUgcGFnZSYjMzk7cyB3b3J0aCBvZiBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pIHRvIG9yIGZyb20gKkBidWYuIFJlYWNoZXNcbiYjNDM7ICogc3RydWN0LXBhZ2UtbGVzcyBWTV9JTyAvIFZNX1BGTk1BUCBtZW1vcnkgdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBhY2Nlc3Nfdm1fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4mIzQzO1x0XHRcdCAgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuJiM0MztcdGludCBieXRlcywgb2Zmc2V0O1xuJiM0MztcdHZvaWQgKm1hZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoIXBhZ2UpIHtcbiYjNDM7XHRcdGJ5dGVzID0gYWNjZXNzX3JlbW90ZV92bWFfb3BzKHZtYSwgYWRkciwgKmJ1ZiwgbGVuLCB3cml0ZSk7XG4mIzQzO1x0XHRpZiAoYnl0ZXMgXHUwMDNlIDApXG4mIzQzO1x0XHRcdCpidWYgJiM0Mzs9IGJ5dGVzO1xuJiM0MztcdFx0cmV0dXJuIGJ5dGVzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Ynl0ZXMgPSBsZW47XG4mIzQzO1x0b2Zmc2V0ID0gYWRkciBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuJiM0MztcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuJiM0MztcdFx0Ynl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XG4mIzQzO1xuJiM0MztcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XG4mIzQzO1x0aWYgKHdyaXRlKSB7XG4mIzQzO1x0XHRjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsIG1hZGRyICYjNDM7IG9mZnNldCwgKmJ1ZiwgYnl0ZXMpO1xuJiM0MztcdFx0Zm9saW9fbWFya19kaXJ0eV9sb2NrKGZvbGlvKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsICpidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpO1xuJiM0MztcdH1cbiYjNDM7XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbiYjNDM7XG4mIzQzO1x0KmJ1ZiAmIzQzOz0gYnl0ZXM7XG4mIzQzO1x0cmV0dXJuIGJ5dGVzO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJiMzOTsgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4mIzQzO1x0XHRcdCAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcbiYjNDM7e1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgdHJ1ZSxcbiYjNDM7XHRcdFx0ICAgICAgYWNjZXNzX3ZtX3BhZ2UsIFx1MDAyNmVycik7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogYWNjZXNzX3JlbW90ZV92bSAtIGFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlXG4gICogQG1tOlx0XHR0aGUgbW1fc3RydWN0IG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZVxuQEAgLTcxMzgsODQgJiM0Mzs3Mjk2LDY3IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFjY2Vzc19wcm9jZXNzX3ZtKTtcbiBcbiAjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4gLypcbi0gKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJiMzOTtzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4tICogSWYgdGhlcmUgaXMgYW55IGVycm9yIHJldHVybiAtRUZBVUxULlxuJiM0MzsgKiBDb3B5IGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gQGFkZHIgaW50byAqQGJ1ZiwgdXAgdG8gQGxlbiBieXRlcyxcbiYjNDM7ICogc3RvcHBpbmcgYXQgdGhlIE5VTC4gc3Ryc2NweSgpIGFsd2F5cyBOVUwgdGVybWluYXRlcywgc28gcmVjb3B5IHRoZSBsYXN0XG4mIzQzOyAqIGJ5dGUgb2YgYSBwYWdlIHdoZW4gbW9yZSBwYWdlcyBmb2xsb3cuIEEgc3RyaW5nIGlzIG5ldmVyIHJlYWQgZnJvbVxuJiM0MzsgKiBzdHJ1Y3QtcGFnZS1sZXNzIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeS5cbiAgKi9cbi1zdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4mIzQzO3N0YXRpYyBpbnQgY29weV92bV9zdHIoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxuJiM0MztcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxuIHtcbi1cdHZvaWQgKm9sZF9idWYgPSBidWY7XG4tXHRpbnQgZXJyID0gMDtcbi1cbi1cdCooY2hhciAqKWJ1ZiA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xuJiM0MztcdHZvaWQgKm1hZGRyO1xuIFxuLVx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSlcbiYjNDM7XHRpZiAoIXBhZ2UpXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFxuLVx0YWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTtcbiYjNDM7XHRieXRlcyA9IGxlbjtcbiYjNDM7XHRvZmZzZXQgPSBhZGRyIFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4mIzQzO1x0aWYgKGJ5dGVzIFx1MDAzZSBQQUdFX1NJWkUgLSBvZmZzZXQpXG4mIzQzO1x0XHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcbiBcbi1cdC8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi9cbi1cdGlmICghdm1hX2xvb2t1cChtbSwgYWRkcikpIHtcbi1cdFx0ZXJyID0gLUVGQVVMVDtcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuJiM0MztcdG1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTtcbiYjNDM7XHRyZXR2YWwgPSBzdHJzY3B5KCpidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpO1xuJiM0MztcdGlmIChyZXR2YWwgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHQvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICovXG4mIzQzO1x0XHQqYnVmICYjNDM7PSByZXR2YWw7XG4mIzQzO1x0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFx0fVxuIFxuLVx0d2hpbGUgKGxlbikge1xuLVx0XHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xuLVx0XHR2b2lkICptYWRkcjtcbi1cdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbi1cdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbiYjNDM7XHQqYnVmICYjNDM7PSBieXRlcyAtIDE7XG4mIzQzO1x0aWYgKGJ5dGVzICE9IGxlbikge1xuJiM0MztcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIgJiM0MzsgYnl0ZXMgLSAxLCAqYnVmLFxuJiM0MztcdFx0XHRcdCAgICBtYWRkciAmIzQzOyAoUEFHRV9TSVpFIC0gMSksIDEpO1xuJiM0MztcdFx0KmJ1ZiAmIzQzOz0gMTtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4gXG4tXHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbi1cdFx0aWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVHJlYXQgYXMgYSB0b3RhbCBmYWlsdXJlIGZvciBub3cgdW50aWwgd2UgZGVjaWRlIGhvd1xuLVx0XHRcdCAqIHRvIGhhbmRsZSB0aGUgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGNhc2UgYW5kXG4tXHRcdFx0ICogc3RhY2sgZXhwYW5zaW9uLlxuLVx0XHRcdCAqL1xuLVx0XHRcdCooY2hhciAqKWJ1ZiA9ICYjMzk7XFwwJiMzOTs7XG4tXHRcdFx0ZXJyID0gLUVGQVVMVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuJiM0MztcdHJldHVybiBieXRlcztcbiYjNDM7fVxuIFxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdGJ5dGVzID0gbGVuO1xuLVx0XHRvZmZzZXQgPSBhZGRyIFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4tXHRcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuLVx0XHRcdGJ5dGVzID0gUEFHRV9TSVpFIC0gb2Zmc2V0O1xuLVxuLVx0XHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XG4tXHRcdHJldHZhbCA9IHN0cnNjcHkoYnVmLCBtYWRkciAmIzQzOyBvZmZzZXQsIGJ5dGVzKTtcbi1cdFx0aWYgKHJldHZhbCBcdTAwM2U9IDApIHtcbi1cdFx0XHQvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi9cbi1cdFx0XHRidWYgJiM0Mzs9IHJldHZhbDtcbi1cdFx0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuJiM0MzsvKlxuJiM0MzsgKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJiMzOTtzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4mIzQzOyAqIElmIHRoZXJlIGlzIGFueSBlcnJvciByZXR1cm4gLUVGQVVMVC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiYjNDM7XHRcdFx0XHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4mIzQzO3tcbiYjNDM7XHRpbnQgYnl0ZXMsIGVycjtcbiBcbi1cdFx0YnVmICYjNDM7PSBieXRlcyAtIDE7XG4tXHRcdC8qXG4tXHRcdCAqIEJlY2F1c2Ugc3Ryc2NweSBhbHdheXMgTlVMIHRlcm1pbmF0ZXMgd2UgbmVlZCB0b1xuLVx0XHQgKiBjb3B5IHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHBhZ2UgaWYgd2UgYXJlIGdvaW5nIHRvXG4tXHRcdCAqIGxvYWQgbW9yZSBwYWdlc1xuLVx0XHQgKi9cbi1cdFx0aWYgKGJ5dGVzICE9IGxlbikge1xuLVx0XHRcdGFkZHIgJiM0Mzs9IGJ5dGVzIC0gMTtcbi1cdFx0XHRjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgYnVmLCBtYWRkciAmIzQzOyAoUEFHRV9TSVpFIC0gMSksIDEpO1xuLVx0XHRcdGJ1ZiAmIzQzOz0gMTtcbi1cdFx0XHRhZGRyICYjNDM7PSAxO1xuLVx0XHR9XG4tXHRcdGxlbiAtPSBieXRlcztcbiYjNDM7XHQqKGNoYXIgKilidWYgPSAmIzM5O1xcMCYjMzk7O1xuIFxuLVx0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbiYjNDM7XHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcbiYjNDM7XHRcdFx0ICAgICAgIGNvcHlfdm1fc3RyLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdC8qIFRoZSBjb250cmFjdCBndWFyYW50ZWVzIGEgdGVybWluYXRlZCBidWZmZXIgZXZlbiBvbiBlcnJvci4gKi9cbiYjNDM7XHRcdCgoY2hhciAqKWJ1ZilbYnl0ZXNdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4gXHR9XG4gXG4tb3V0OlxuLVx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4tXHRpZiAoZXJyKVxuLVx0XHRyZXR1cm4gZXJyO1xuLVx0cmV0dXJuIGJ1ZiAtIG9sZF9idWY7XG4mIzQzO1x0cmV0dXJuIGJ5dGVzO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmNcbmluZGV4IDFjNzdkNWRjMDZlOWZhLi5iMzZmMmUyMTliOGY0OSAxMDA2NDRcbi0tLSBhL21tL3JtYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcm1hcC5jXG5AQCAtMjgzOCw3ICYjNDM7MjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdCAqIChub24tZGV2aWNlLWV4Y2x1c2l2ZSkgUFRFIGFuZCBpc3N1ZSBhIE1NVV9OT1RJRllfRVhDTFVTSVZFLlxuIFx0ICovXG4gcmV0cnk6XG4tXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuJiM0MztcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIGFkZHIsXG4gXHRcdFx0XHRcdEZPTExfR0VUIHwgRk9MTF9XUklURSB8IEZPTExfU1BMSVRfUE1ELFxuIFx0XHRcdFx0XHRcdTAwMjZ2bWEpO1xuIFx0aWYgKElTX0VSUihwYWdlKSlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG5pbmRleCBlNmRmOTY4ZjA5NzFjOC4uNmI5MTdhNGY3M2UwMGYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC04Myw2ICYjNDM7ODMsNyBAQCBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbXJlbGVhc2VfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBtcmVtYXBfZG9udHVubWFwXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1yZW1hcF90ZXN0XG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1zZWFsX3Rlc3RcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IG10aHBfZ3VwX2Nvd190ZXN0XG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG9uLWZhdWx0LWxpbWl0XG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHBhZ2VtYXBfaW9jdGxcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcGZubWFwXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbXRocF9ndXBfY293X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJlZTMyOWQ4NjQxYzBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmNcbkBAIC0wLDAgJiM0MzsxLDIxMyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzOy8qXG4mIzQzOyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtXHUwMDNlIGZvbGxvd19wYWdlX21hc2sgLVx1MDAzZVxuJiM0MzsgKiBmb2xsb3dfcHRlX2JhdGNoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHBhZ2VzIGZvciBhIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9cbiYjNDM7ICogKG1USFApLCBpbmNsdWRpbmcgdGhhdCBDT1cgY29waWVzIHByb2R1Y2UgdGhlIHJpZ2h0IGNvbnRlbnQuXG4mIzQzOyAqXG4mIzQzOyAqIFVzZXMgdGhlIENPTkZJR19HVVBfVEVTVCBQSU5fTE9OR1RFUk0gaW50ZXJmYWNlOiBTVEFSVCBwaW5zIGEgcmFuZ2Ugb24gdGhlXG4mIzQzOyAqIHNsb3cgcGF0aCwgUkVBRCBjb3BpZXMgdGhlIHBpbm5lZCBwYWdlcyYjMzk7IGJ5dGVzIGJhY2sgc28gd2UgY2FuIGNvbXBhcmUgdGhlbVxuJiM0MzsgKiBhZ2FpbnN0IHRoZSBwYXR0ZXJuIHdlIHdyb3RlLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGludC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBBUlJBWV9TSVpFKGEpXHQoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIEdVUF9ERVYgXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RBUlRcdF9JT1coJiMzOTtnJiMzOTssIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcbiYjNDM7I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QXHRfSU8oJiMzOTtnJiMzOTssIDgpXG4mIzQzOyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfUkVBRFx0X0lPVygmIzM5O2cmIzM5OywgOSwgX191NjQpXG4mIzQzOyNkZWZpbmUgVVNFX1dSSVRFXHQxXG4mIzQzOyNkZWZpbmUgVVNFX0ZBU1RcdDJcbiYjNDM7XG4mIzQzO3N0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCB7XG4mIzQzO1x0X191NjQgYWRkcjtcbiYjNDM7XHRfX3U2NCBzaXplO1xuJiM0MztcdF9fdTMyIGZsYWdzO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBPUkRFUl9LQlx0NjRcbiYjNDM7I2RlZmluZSBOUl9GT0xJT1NcdDE2XG4mIzQzOyNkZWZpbmUgUkVHSU9OXHRcdCgoc2l6ZV90KU9SREVSX0tCICogMTAyNCAqIE5SX0ZPTElPUylcbiYjNDM7XG4mIzQzO3N0YXRpYyBsb25nIFBTO1xuJiM0MztzdGF0aWMgaW50IGZhaWxzO1xuJiM0MztzdGF0aWMgaW50IHRhcDtcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIG9rKGludCBjb25kLCBjb25zdCBjaGFyICpkZXNjKVxuJiM0Mzt7XG4mIzQzO1x0cHJpbnRmKFwmIzM0OyVzICVkICVzXFxuXCYjMzQ7LCBjb25kID8gXCYjMzQ7b2tcJiMzNDsgOiBcJiMzNDtub3Qgb2tcJiMzNDssICYjNDM7JiM0Mzt0YXAsIGRlc2MpO1xuJiM0MztcdGlmICghY29uZClcbiYjNDM7XHRcdGZhaWxzJiM0MzsmIzQzOztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRGV0ZXJtaW5pc3RpYywgcGVyLXBhZ2UtZGlzdGluY3QgcGF0dGVybiBzbyBhbnkgbWlzLW9yZGVyIG9yIGxlYWsgc2hvd3MuICovXG4mIzQzO3N0YXRpYyB2b2lkIGZpbGwoY2hhciAqYmFzZSwgc2l6ZV90IHN6LCB1aW50MzJfdCBzYWx0KVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChzaXplX3Qgb2ZmID0gMDsgb2ZmIFx1MDAzYyBzejsgb2ZmICYjNDM7PSBQUykge1xuJiM0MztcdFx0dWludDMyX3QgayA9IG9mZiAvIFBTO1xuJiM0MztcdFx0dWludDY0X3QgdiA9ICgodWludDY0X3Qpc2FsdCBcdTAwM2NcdTAwM2MgMzIpIF4gKGsgKiAweDlFMzc3OUIxdSAmIzQzOyAweDEyMzQpO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBQUzsgaSAmIzQzOz0gc2l6ZW9mKHYpKVxuJiM0MztcdFx0XHRtZW1jcHkoYmFzZSAmIzQzOyBvZmYgJiM0MzsgaSwgXHUwMDI2diwgc2l6ZW9mKHYpKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3N5c2ZzKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnZhbClcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0aW50IHIgPSB3cml0ZShmZCwgdmFsLCBzdHJsZW4odmFsKSk7XG4mIzQzO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gciBcdTAwM2MgMCA/IC0xIDogMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRm9yY2Ugc3ViLVBNRCA2NGtCIG1USFAgb25seSwgc28gZmF1bHRzIHByb2R1Y2UgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MuICovXG4mIzQzO3N0YXRpYyB2b2lkIHNldHVwX210aHAodm9pZClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnRocCA9IFwmIzM0Oy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlXCYjMzQ7O1xuJiM0MztcdGNoYXIgcFsyNTZdO1xuJiM0MztcdHN0YXRpYyBjb25zdCBpbnQga2JbXSA9IHsgMTYsIDMyLCA2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCB9O1xuJiM0MztcbiYjNDM7XHR3c3lzZnMoXCYjMzQ7L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZFwmIzM0OywgXCYjMzQ7bmV2ZXJcJiMzNDspO1xuJiM0MztcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGtiKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHNucHJpbnRmKHAsIHNpemVvZihwKSwgXCYjMzQ7JXMvaHVnZXBhZ2VzLSVka0IvZW5hYmxlZFwmIzM0OywgdGhwLCBrYltpXSk7XG4mIzQzO1x0XHR3c3lzZnMocCwga2JbaV0gPT0gT1JERVJfS0IgPyBcJiMzNDthbHdheXNcJiMzNDsgOiBcJiMzNDtuZXZlclwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDb3VudCBob3cgbWFueSBwYWdlcyBzaXQgaW4gYSBjb250aWd1b3VzIFx1MDAzZT1PUkRFUl9LQiBQRk4gcnVuICh2aWEgcGFnZW1hcCkuICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfbGFyZ2VfcGFnZXMoY2hhciAqYmFzZSwgc2l6ZV90IHN6KVxuJiM0Mzt7XG4mIzQzO1x0aW50IHBtID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRzaXplX3QgbiA9IHN6IC8gUFMsIGxhcmdlID0gMDtcbiYjNDM7XHR1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7XG4mIzQzO1xuJiM0MztcdGlmIChwbSBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRmb3IgKHNpemVfdCBrID0gMDsgayBcdTAwM2MgbjsgayYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVpbnQ2NF90IGVudDtcbiYjNDM7XHRcdG9mZl90IGlkeCA9ICgodWludHB0cl90KWJhc2UgJiM0MzsgayAqIFBTKSAvIFBTICogc2l6ZW9mKGVudCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHByZWFkKHBtLCBcdTAwMjZlbnQsIHNpemVvZihlbnQpLCBpZHgpICE9IHNpemVvZihlbnQpIHx8XG4mIzQzO1x0XHQgICAgIShlbnQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyA2MykpKVxuJiM0MztcdFx0XHRwZm5ba10gPSAwO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRwZm5ba10gPSBlbnQgXHUwMDI2ICgoMVVMTCBcdTAwM2NcdTAwM2MgNTUpIC0gMSk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKHBtKTtcbiYjNDM7XHRmb3IgKHNpemVfdCBrID0gMDsgayBcdTAwM2MgbjsgayYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoayAmIzQzOyAxIFx1MDAzYyBuIFx1MDAyNlx1MDAyNiBwZm5ba10gXHUwMDI2XHUwMDI2IHBmbltrICYjNDM7IDFdID09IHBmbltrXSAmIzQzOyAxKVxuJiM0MztcdFx0XHRsYXJnZSYjNDM7JiM0Mzs7XG4mIzQzO1x0ZnJlZShwZm4pO1xuJiM0MztcdHJldHVybiBsYXJnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUGluIEBiYXNlLi5Ac3ogb24gdGhlIHNsb3cgcGF0aCwgcmVhZCB0aGUgcGlubmVkIGJ5dGVzIGJhY2ssIGNvbXBhcmUgdG8gZXhwLiAqL1xuJiM0MztzdGF0aWMgaW50IHBpbl92ZXJpZnkoaW50IGZkLCBjaGFyICpiYXNlLCBzaXplX3Qgc3osIHVpbnQzMl90IHdyLCBjaGFyICpleHApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QgYSA9IHtcbiYjNDM7XHRcdC5hZGRyID0gKHVpbnRwdHJfdCliYXNlLCAuc2l6ZSA9IHN6LFxuJiM0MztcdFx0LmZsYWdzID0gd3IgPyBVU0VfV1JJVEUgOiAwLFx0XHQvKiBVU0VfRkFTVCB1bnNldCA9XHUwMDNlIHNsb3cgKi9cbiYjNDM7XHR9O1xuJiM0MztcdGNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbiYjNDM7XHRfX3U2NCBnYSA9ICh1aW50cHRyX3QpZ290O1xuJiM0MztcdGludCByYyA9IC0xO1xuJiM0MztcbiYjNDM7XHRpZiAoZ290ID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVCwgXHUwMDI2YSkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtTVEFSVCglcykgZmFpbGVkOiAlc1xcblwmIzM0OyxcbiYjNDM7XHRcdFx0d3IgPyBcJiMzNDt3cml0ZVwmIzM0OyA6IFwmIzM0O3JlYWRcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9SRUFELCBcdTAwMjZnYSkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtSRUFEIGZhaWxlZDogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aW9jdGwoZmQsIFBJTl9MT05HVEVSTV9URVNUX1NUT1ApO1xuJiM0MztcdHJjID0gbWVtY21wKGdvdCwgZXhwLCBzeikgPyAxIDogMDtcbiYjNDM7b3V0OlxuJiM0MztcdG11bm1hcChnb3QsIHN6KTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRQUyA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRzZXR1cF9tdGhwKCk7XG4mIzQzO1xuJiM0MztcdGludCBmZCA9IG9wZW4oR1VQX0RFViwgT19SRFdSKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7b3BlbiAlczogJXMgKENPTkZJR19HVVBfVEVTVD8pXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRHVVBfREVWLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0cmV0dXJuIDI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjaGFyICpyID0gbW1hcChOVUxMLCBSRUdJT04sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHIgPT0gTUFQX0ZBSUxFRCkge1xuJiM0MztcdFx0cGVycm9yKFwmIzM0O21tYXBcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIDI7XG4mIzQzO1x0fVxuJiM0MztcdGZpbGwociwgUkVHSU9OLCAweEExKTtcdFx0XHRcdC8qIHBhdHRlcm4gUCAqL1xuJiM0MztcdGNoYXIgKmV4cFAgPSBtYWxsb2MoUkVHSU9OKTtcbiYjNDM7XG4mIzQzO1x0bWVtY3B5KGV4cFAsIHIsIFJFR0lPTik7XG4mIzQzO1xuJiM0MztcdGludCBsYXJnZSA9IGNvdW50X2xhcmdlX3BhZ2VzKHIsIFJFR0lPTik7XG4mIzQzO1xuJiM0MztcdHByaW50ZihcJiMzNDsjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcXG5cJiMzNDssXG4mIzQzO1x0ICAgICAgIGxhcmdlLCBSRUdJT04gLyBQUyk7XG4mIzQzO1x0aWYgKGxhcmdlIFx1MDAzYyAoaW50KShSRUdJT04gLyBQUykgLyA0KVxuJiM0MztcdFx0cHJpbnRmKFwmIzM0OyMgV0FSTjogbGl0dGxlIG1USFAgYmFja2luZzsgYmF0Y2ggcGF0aCBsaWdodGx5IGNvdmVyZWRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBBOiByZWFkIHBpbiBvdmVyIHdyaXRhYmxlIG1USFAgLVx1MDAzZSBiYXRjaGVzIC1cdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXG4mIzQzO1x0b2socGluX3ZlcmlmeShmZCwgciwgUkVHSU9OLCAwLCBleHBQKSA9PSAwLFxuJiM0MztcdCAgIFwmIzM0O3Nsb3cgcmVhZC1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHNcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBCOiB3cml0ZSBwaW4gLVx1MDAzZSBGT0xMX1dSSVRFIGJhdGNoIHBhdGggLVx1MDAzZSBjb250ZW50IG11c3QgZXF1YWwgUC4gKi9cbiYjNDM7XHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDEsIGV4cFApID09IDAsXG4mIzQzO1x0ICAgXCYjMzQ7c2xvdyB3cml0ZS1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHNcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBDOiBDT1cgaXNvbGF0aW9uLiBDaGlsZCB3cml0ZS1waW5zICh1bnNoYXJlcykgdGhlbiByZXdyaXRlczsgcGFyZW50IFAuICovXG4mIzQzO1x0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRpZiAocGlkID09IDApIHtcbiYjNDM7XHRcdGludCBjZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7XG4mIzQzO1x0XHRpbnQgYSA9IHBpbl92ZXJpZnkoY2ZkLCByLCBSRUdJT04sIDEsIGV4cFApO1x0LyogQ09XIGNvcHkgPT0gUCAqL1xuJiM0MztcbiYjNDM7XHRcdGZpbGwociwgUkVHSU9OLCAweEIyKTtcdFx0XHQvKiBjaGlsZCB3cml0ZXMgUSAqL1xuJiM0MztcdFx0X2V4aXQoYSA9PSAwID8gMCA6IDEpO1xuJiM0MztcdH1cbiYjNDM7XHRpbnQgc3QgPSAwO1xuJiM0MztcbiYjNDM7XHR3YWl0cGlkKHBpZCwgXHUwMDI2c3QsIDApO1xuJiM0MztcdG9rKFdJRkVYSVRFRChzdCkgXHUwMDI2XHUwMDI2IFdFWElUU1RBVFVTKHN0KSA9PSAwLFxuJiM0MztcdCAgIFwmIzM0O2NoaWxkIHdyaXRlLXBpbiBhZnRlciBDT1cgcmV0dXJucyBjb3JyZWN0IChjb3BpZWQpIGNvbnRlbnRzXCYjMzQ7KTtcbiYjNDM7XHRvayhtZW1jbXAociwgZXhwUCwgUkVHSU9OKSA9PSAwLFxuJiM0MztcdCAgIFwmIzM0O3BhcmVudCBjb250ZW50cyBpbnRhY3QgYWZ0ZXIgY2hpbGQgQ09XIHdyaXRlc1wmIzM0Oyk7XG4mIzQzO1x0LyogRDogcGFyZW50IHJlYWQtcGluIGFnYWluIGFmdGVyIHRoZSBDT1cgc3BsaXQgc3RpbGwgY29ycmVjdC4gKi9cbiYjNDM7XHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDAsIGV4cFApID09IDAsXG4mIzQzO1x0ICAgXCYjMzQ7cGFyZW50IHNsb3cgcmVhZC1waW4gYWZ0ZXIgQ09XIHN0aWxsIGNvcnJlY3RcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwcmludGYoXCYjMzQ7IyB0b3RhbHM6IHBhc3M6JWQgZmFpbDolZFxcblwmIzM0OywgdGFwIC0gZmFpbHMsIGZhaWxzKTtcbiYjNDM7XHRyZXR1cm4gZmFpbHMgPyAxIDogMDtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmNcbmluZGV4IDRmNTUwODIyMzg1YTIwLi42ZmY1ZDEwMjk1MTdlMyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuY1xuQEAgLTMxLDYgJiM0MzszMSw3IEBAIHN0YXRpYyBzaWdqbXBfYnVmIHNpZ2ptcF9idWZfZW52O1xuIHN0YXRpYyBjaGFyICpmaWxlID0gXCYjMzQ7L2Rldi9tZW1cJiMzNDs7XG4gc3RhdGljIG9mZl90IGZpbGVfb2Zmc2V0O1xuIHN0YXRpYyBpbnQgZmQ7XG4mIzQzO3N0YXRpYyBpbnQgdGFyZ2V0X2lzX3JhbTtcbiBcbiBzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnKVxuIHtcbkBAIC0xMTMsNiAmIzQzOzExNCw3IEBAIHN0YXRpYyB2b2lkIHBmbm1hcF9pbml0KHZvaWQpXG4gXHRcdGlmIChlcnIpXG4gXHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Q2Fubm90IGZpbmQgcmFtIHRhcmdldCBpbiAmIzM5Oy9wcm9jL2lvbWVtJiMzOTs6ICVzXFxuXCYjMzQ7LFxuIFx0XHRcdFx0ICAgICAgIHN0cmVycm9yKC1lcnIpKTtcbiYjNDM7XHRcdHRhcmdldF9pc19yYW0gPSAxO1xuIFx0fSBlbHNlIHtcbiBcdFx0ZmlsZV9vZmZzZXQgPSAwO1xuIFx0fVxuQEAgLTI3MSw2ICYjNDM7MjczLDcwIEBAIFRFU1RfRihwZm5tYXAsIGZvcmspXG4gXHRBU1NFUlRfRVEocmV0LCAwKTtcbiB9XG4gXG4mIzQzO1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyICpwcml2LCAqYnVmO1xuJiM0MztcdHNzaXplX3QgcmM7XG4mIzQzO1x0aW50IG1lbV9mZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIENPV2VkIHBhZ2UgaW4gYSBWTV9QRk5NQVAgbWFwcGluZyBoYXMgYSBzdHJ1Y3QgcGFnZSwgc28gcmVhZGluZyBpdFxuJiM0MztcdCAqIHRocm91Z2ggL3Byb2Mvc2VsZi9tZW0gLS0gX19hY2Nlc3NfcmVtb3RlX3ZtKCkgLVx1MDAzZSBnZXRfdXNlcl9wYWdlX3ZtYSgpXG4mIzQzO1x0ICogLS0gcmV0dXJucyBpdCBkaXJlY3RseSwgaW5zdGVhZCBvZiByb3V0aW5nIHRvIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCksXG4mIzQzO1x0ICogd2hpY2ggaW9yZW1hcHMgdGhlIFBGTiBhbmQgY2Fubm90IHJlYWNoIGEgQ09XZWQgUkFNIHBhZ2UuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBNYXAgdGhlIGZpbGUgTUFQX1BSSVZBVEUgYW5kIHdyaXRhYmxlLCB3cml0ZSB0byBDT1cgYSBwYWdlIGludG8gYW5vblxuJiM0MztcdCAqIG1lbW9yeSwgdGhlbiByZWFkIHRoZSBwYWdlIGJhY2sgdGhyb3VnaCAvcHJvYy9zZWxmL21lbS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzZWxmLVx1MDAzZXNpemUyID0gc2VsZi1cdTAwM2VwYWdlc2l6ZTtcbiYjNDM7XHRzZWxmLVx1MDAzZWFkZHIyID0gbW1hcChOVUxMLCBzZWxmLVx1MDAzZXNpemUyLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHQgICBNQVBfUFJJVkFURSwgZmQsIGZpbGVfb2Zmc2V0KTtcbiYjNDM7XHRpZiAoc2VsZi1cdTAwM2VhZGRyMiA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0U0tJUChyZXR1cm4sIFwmIzM0O0Nhbm5vdCBjcmVhdGUgYSB3cml0YWJsZSBwcml2YXRlIHBmbm1hcCBtYXBwaW5nXCYjMzQ7KTtcbiYjNDM7XHRwcml2ID0gc2VsZi1cdTAwM2VhZGRyMjtcbiYjNDM7XG4mIzQzO1x0LyogQ09XIHRoZSBwYWdlIGFuZCBzdGFtcCBrbm93biBieXRlcyBpbnRvIHRoZSBhbm9uIGNvcHkuICovXG4mIzQzO1x0cHJpdlswXSA9IDB4NDI7XG4mIzQzO1x0cHJpdltzZWxmLVx1MDAzZXBhZ2VzaXplIC0gMV0gPSAweDI0O1xuJiM0MztcbiYjNDM7XHRidWYgPSBtYWxsb2Moc2VsZi1cdTAwM2VwYWdlc2l6ZSk7XG4mIzQzO1x0QVNTRVJUX05FKGJ1ZiwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdG1lbV9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9tZW1cJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRBU1NFUlRfR0UobWVtX2ZkLCAwKTtcbiYjNDM7XHRyYyA9IHByZWFkKG1lbV9mZCwgYnVmLCBzZWxmLVx1MDAzZXBhZ2VzaXplLCAob2ZmX3QpKHVpbnRwdHJfdClwcml2KTtcbiYjNDM7XHRjbG9zZShtZW1fZmQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEocmMsIChzc2l6ZV90KXNlbGYtXHUwMDNlcGFnZXNpemUpO1xuJiM0MztcdEVYUEVDVF9FUShidWZbMF0sIDB4NDIpO1xuJiM0MztcdEVYUEVDVF9FUShidWZbc2VsZi1cdTAwM2VwYWdlc2l6ZSAtIDFdLCAweDI0KTtcbiYjNDM7XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YocGZubWFwLCBwcm9jbWVtX3Bmbl9yZWFkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBidWZbNjRdO1xuJiM0MztcdHNzaXplX3QgcmM7XG4mIzQzO1x0aW50IG1lbV9mZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgbWFwcGluZyBoYXMgbm8gc3RydWN0IHBhZ2UsIHNvXG4mIzQzO1x0ICogX19hY2Nlc3NfcmVtb3RlX3ZtKCkgcmVhY2hlcyBpdCB0aHJvdWdoIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKClcbiYjNDM7XHQgKiAoZ2VuZXJpY19hY2Nlc3NfcGh5cygpKS4gVGhhdCBpb3JlbWFwcyB0aGUgUEZOLCB3aGljaCBpcyByZWplY3RlZCBmb3JcbiYjNDM7XHQgKiBSQU0sIHNvIHRoaXMgb25seSBhcHBsaWVzIHRvIGdlbnVpbmUgZGV2aWNlIG1lbW9yeS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodGFyZ2V0X2lzX3JhbSlcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtUYXJnZXQgaXMgU3lzdGVtIFJBTTsgLVx1MDAzZWFjY2VzcygpIGNhbm5vdCBpb3JlbWFwIFJBTVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1lbV9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9tZW1cJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRBU1NFUlRfR0UobWVtX2ZkLCAwKTtcbiYjNDM7XHRyYyA9IHByZWFkKG1lbV9mZCwgYnVmLCBzaXplb2YoYnVmKSwgKG9mZl90KSh1aW50cHRyX3Qpc2VsZi1cdTAwM2VhZGRyMSk7XG4mIzQzO1x0Y2xvc2UobWVtX2ZkKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHJjLCAoc3NpemVfdClzaXplb2YoYnVmKSk7XG4mIzQzO31cbiYjNDM7XG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdGZvciAoaW50IGkgPSAxOyBpIFx1MDAzYyBhcmdjOyBpJiM0MzsmIzQzOykge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbmluZGV4IDhjMjk2ZGVkZjA0NzRkLi5iNDlhM2ViMGMyMDUwOCAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTI4OSw2ICYjNDM7Mjg5LDcgQEAgZmlcbiAjIER1bXAgcGFnZXMgMCwgMTksIGFuZCA0MDk2LCB1c2luZyBwaW5fdXNlcl9wYWdlczpcbiBDQVRFR09SWT1cJiMzNDtndXBfdGVzdFwmIzM0OyBydW5fdGVzdCAuL2d1cF90ZXN0IC1jdCAtRiAweDEgMCAxOSAweDEwMDBcbiBDQVRFR09SWT1cJiMzNDtndXBfdGVzdFwmIzM0OyBydW5fdGVzdCAuL2d1cF9sb25ndGVybVxuJiM0MztDQVRFR09SWT1cJiMzNDtndXBfdGVzdFwmIzM0OyBydW5fdGVzdCAuL210aHBfZ3VwX2Nvd190ZXN0XG4gXG4gQ0FURUdPUlk9XCYjMzQ7dXNlcmZhdWx0ZmRcJiMzNDsgcnVuX3Rlc3QgLi91ZmZkLXVuaXQtdGVzdHNcbiB1ZmZkX3N0cmVzc19iaW49Li91ZmZkLXN0cmVzc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtBRERSRVNTX01BU0tJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdXNlcl9wYWdlX3ZtYSYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEmIzM0OywKICAgICYjMzQ7YWNjZXNzX3JlbW90ZV92bSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcHJvY2Vzc192bSYjMzQ7LAogICAgJiMzNDtjb3B5X3JlbW90ZV92bV9zdHImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyByZW1vdGUgVk0gd2FsayBtZWNoYW5pc20gKGByZW1vdGVfdm1fd2Fsa2ApIGFuZCByZXBsYWNlcyBgZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlYCB3aXRoIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV92bWFgLiBJdCBhbHNvIGFkZHMgc3VwcG9ydCBmb3IgYmF0Y2hpbmcgY29udGlndW91cyBwYWdlcyBmb3IgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MgKG1USFApIGluIHRoZSBzbG93IEdVUCBwYXRoLiBUaGVzZSBhcmUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIHRoYXQgYWZmZWN0IHBhZ2UgZmF1bHRpbmcsIHJlbW90ZSBtZW1vcnkgYWNjZXNzIChlLmcuLCBwdHJhY2UsIC9wcm9jL3BpZC9tZW0pLCBhbmQgQlBGIHN0cmluZyBjb3B5aW5nLiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgbmV3IGVudHJ5IHBvaW50cyBhbmQgcmVtb3RlIGFjY2VzcyBBUElzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdjMjA5ODdkZTZkOTJkN2VmYzIxYTAwMTg4NWFkMzE4YjYwNTRmZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gSnVsIDI2IDEwOjA3OjA2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuYwppbmRleCAxYTlhYWQ2ZWYyMmEwNC4uN2E2ZWNjM2Q5Mjk0OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL210ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jCkBAIC00NTksNyAmIzQzOzQ1OSw3IEBAIHN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3RhZ3Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJCXVuc2lnbmVkIGxvbmcgdGFncywgb2Zmc2V0OwogCQl2b2lkICptYWRkcjsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsCiYjNDM7CQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkciwKIAkJCQkJCQkgICAgIGd1cF9mbGFncywgJmFtcDt2bWEpOwogCQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwogCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggZGJmMjdhNzhkZjZjODcuLjNjZTE2Nzk2ZTVhMjVkIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0yMSw3ICYjNDM7MjEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwKIAkJCSAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0KQogewogI2lmZGVmIENPTkZJR19SSVNDVl9JU0FfU1VQTQotCW5leHQtJmd0O2NvbnRleHQucG1sZW4gPSAwOwomIzQzOwlXUklURV9PTkNFKG5leHQtJmd0O2NvbnRleHQucG1sZW4sIDApOwogI2VuZGlmCiAJc3dpdGNoX21tKHByZXYsIG5leHQsIE5VTEwpOwogfQpAQCAtNDQsNyAmIzQzOzQ0LDcgQEAgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKHVzZV9hc2lkX2FsbG9jYXRvcik7CiAjZGVmaW5lIG1tX3VudGFnX21hc2sgbW1fdW50YWdfbWFzawogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1tX3VudGFnX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JcmV0dXJuIC0xVUwgJmd0OyZndDsgbW0tJmd0O2NvbnRleHQucG1sZW47CiYjNDM7CXJldHVybiAtMVVMICZndDsmZ3Q7IFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC5wbWxlbik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA1ZDRlYzE1NTg0Y2ZhNC4uNTM4MDZlMGY3ZGNmZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNiw3ICYjNDM7MTYsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpZiAocmlzY3ZfaGFzX2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfRVhUX1NVUE0pKSB7Ci0JCXU4IHBtbGVuID0gbW0tJmd0O2NvbnRleHQucG1sZW47CiYjNDM7CQl1OCBwbWxlbiA9IFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC5wbWxlbik7CiAKIAkJLyogVmlydHVhbCBhZGRyZXNzZXMgYXJlIHNpZ24tZXh0ZW5kZWQ7IHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUgemVyby1leHRlbmRlZC4gKi8KIAkJaWYgKElTX0VOQUJMRUQoQ09ORklHX01NVSkpCkBAIC0zMywxMiAmIzQzOzMzLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKGN1cnJlbnQtJmd0O21tLCBfX2FkZHIpOwlcCiB9KQogCi0jZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoewkJCQkJXAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpICh7CQkJCVwKIAl1bnNpZ25lZCBsb25nIF9fYWRkciA9IChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpKGFkZHIpOwkJCVwKLQltbWFwX2Fzc2VydF9sb2NrZWQobW0pOwkJCQkJCQlcCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBfX2FkZHIpOwkJXAogfSkKIAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpICh7CQkJCQlcCiYjNDM7CW1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7CQkJCQkJCVwKJiM0MzsJdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpOwkJCQlcCiYjNDM7fSkKJiM0MzsKICNkZWZpbmUgYWNjZXNzX29rKGFkZHIsIHNpemUpIGxpa2VseShfX2FjY2Vzc19vayh1bnRhZ2dlZF9hZGRyKGFkZHIpLCBzaXplKSkKICNlbHNlCiAjZGVmaW5lIHVudGFnZ2VkX2FkZHIoYWRkcikgKGFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYjJkZjdmNzIyNDFhNWYuLjZhZTc1NTJmZWQwOWYzIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNTcsMTMgJiM0MzszNTcsMTUgQEAgbG9uZyBzZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYXJnKQogCWlmIChtbWFwX3dyaXRlX2xvY2tfa2lsbGFibGUobW0pKQogCQlyZXR1cm4gLUVJTlRSOwogCi0JaWYgKHRlc3RfYml0KE1NX0NPTlRFWFRfTE9DS19QTUxFTiwgJmFtcDttbS0mZ3Q7Y29udGV4dC5mbGFncykgJmFtcDsmYW1wOyBtbS0mZ3Q7Y29udGV4dC5wbWxlbiAhPSBwbWxlbikgewotCQltbWFwX3dyaXRlX3VubG9jayhtbSk7Ci0JCXJldHVybiAtRUJVU1k7CiYjNDM7CWlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sICZhbXA7bW0tJmd0O2NvbnRleHQuZmxhZ3MpKSB7CiYjNDM7CQlpZiAoUkVBRF9PTkNFKG1tLSZndDtjb250ZXh0LnBtbGVuKSAhPSBwbWxlbikgewomIzQzOwkJCW1tYXBfd3JpdGVfdW5sb2NrKG1tKTsKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJfQogCX0KIAogCWVudmNmZ191cGRhdGVfYml0cyh0YXNrLCBFTlZDRkdfUE1NLCBwbW0pOwotCW1tLSZndDtjb250ZXh0LnBtbGVuID0gcG1sZW47CiYjNDM7CVdSSVRFX09OQ0UobW0tJmd0O2NvbnRleHQucG1sZW4sIHBtbGVuKTsKIAogCW1tYXBfd3JpdGVfdW5sb2NrKG1tKTsKIApAQCAtMzk0LDcgJiM0MzszOTYsNyBAQCBsb25nIGdldF90YWdnZWRfYWRkcl9jdHJsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIAkJYnJlYWs7CiAJfQogCi0JaWYgKHRhc2stJmd0O21tLSZndDtjb250ZXh0LnBtbGVuKQomIzQzOwlpZiAoUkVBRF9PTkNFKHRhc2stJmd0O21tLSZndDtjb250ZXh0LnBtbGVuKSkKIAkJcmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCBlZjViNTA3ZGUzNGUyZS4uY2VlNzEwZjY0NjU4YWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMTAwLDE4ICYjNDM7MTAwLDE4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV9sYW1fY3IzX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pCiBzdGF0aWMgaW5saW5lIHZvaWQgZHVwX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJbW0tJmd0O2NvbnRleHQubGFtX2NyM19tYXNrID0gb2xkbW0tJmd0O2NvbnRleHQubGFtX2NyM19tYXNrOwotCW1tLSZndDtjb250ZXh0LnVudGFnX21hc2sgPSBvbGRtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrOwomIzQzOwlXUklURV9PTkNFKG1tLSZndDtjb250ZXh0LnVudGFnX21hc2ssIFJFQURfT05DRShvbGRtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrKSk7CiB9CiAKICNkZWZpbmUgbW1fdW50YWdfbWFzayBtbV91bnRhZ19tYXNrCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlyZXR1cm4gbW0tJmd0O2NvbnRleHQudW50YWdfbWFzazsKJiM0MzsJcmV0dXJuIFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG1tX3Jlc2V0X3VudGFnX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JbW0tJmd0O2NvbnRleHQudW50YWdfbWFzayA9IC0xVUw7CiYjNDM7CVdSSVRFX09OQ0UobW0tJmd0O2NvbnRleHQudW50YWdfbWFzaywgLTFVTCk7CiB9CiAKICNkZWZpbmUgYXJjaF9wZ3RhYmxlX2RtYV9jb21wYXQgYXJjaF9wZ3RhYmxlX2RtYV9jb21wYXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAppbmRleCAyMGRlMzRjYzlhYTZlNy4uYTA5NTE2NWViNjQ4ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKQEAgLTM5LDE4ICYjNDM7MzksMjcgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHIoX19hZGRyKTsJCVwKIH0pCiAKJiM0MzsvKgomIzQzOyAqIG1tLSZndDtjb250ZXh0LnVudGFnX21hc2sgY2hhbmdlcyBvbmx5IHdoZW4gdGhlIHRhcmdldCBlbmFibGVzIExBTSBvciBleGVjcywKJiM0MzsgKiBhbHdheXMgc2luZ2xlLXRocmVhZGVkLiBBbiB1bmxvY2tlZCByZW1vdGUgcmVhZGVyIGNhbiByYWNlIHRoYXQ7IFJFQURfT05DRQomIzQzOyAqIGtlZXBzIHRoZSB2YWx1ZSB3aG9sZSBhbmQgdGhlIHVudGFnIGlzIGJlc3QtZWZmb3J0LgomIzQzOyAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JbW1hcF9hc3NlcnRfbG9ja2VkKG1tKTsKLQlyZXR1cm4gYWRkciAmYW1wOyAobW0pLSZndDtjb250ZXh0LnVudGFnX21hc2s7CiYjNDM7CXJldHVybiBhZGRyICZhbXA7IFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrKTsKIH0KIAotI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcikJKHsJCQkJXAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpCSh7CQkJXAogCXVuc2lnbmVkIGxvbmcgX19hZGRyID0gKF9fZm9yY2UgdW5zaWduZWQgbG9uZykoYWRkcik7CQlcCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBfX2FkZHIpOwlcCiB9KQogCiYjNDM7I2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcikJKHsJCQkJXAomIzQzOwltbWFwX2Fzc2VydF9sb2NrZWQobW0pOwkJCQkJCVwKJiM0MzsJdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpOwkJCVwKJiM0Mzt9KQomIzQzOwogI2VuZGlmCiAKICNkZWZpbmUgdmFsaWRfdXNlcl9hZGRyZXNzKHgpIFwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IGQ0NGFmYmUwMDViYjUxLi45ZmE2NTkxMTdmMzgyNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC04MTQsNyAmIzQzOzgxNCw3IEBAIHN0YXRpYyB2b2lkIGVuYWJsZV9sYW1fZnVuYyh2b2lkICpfX21tKQogc3RhdGljIHZvaWQgbW1fZW5hYmxlX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAltbS0mZ3Q7Y29udGV4dC5sYW1fY3IzX21hc2sgPSBYODZfQ1IzX0xBTV9VNTc7Ci0JbW0tJmd0O2NvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpOwomIzQzOwlXUklURV9PTkNFKG1tLSZndDtjb250ZXh0LnVudGFnX21hc2ssIH5HRU5NQVNLKDYyLCA1NykpOwogCiAJLyoKIAkgKiBFdmVuIHRob3VnaCB0aGUgcHJvY2VzcyBtdXN0IHN0aWxsIGJlIHNpbmdsZS10aHJlYWRlZCBhdCB0aGlzCkBAIC05NTIsNyAmIzQzOzk1Miw3IEBAIGxvbmcgZG9fYXJjaF9wcmN0bF82NChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMikKICNlbmRpZgogI2lmZGVmIENPTkZJR19BRERSRVNTX01BU0tJTkcKIAljYXNlIEFSQ0hfR0VUX1VOVEFHX01BU0s6Ci0JCXJldHVybiBwdXRfdXNlcih0YXNrLSZndDttbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrLAomIzQzOwkJcmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay0mZ3Q7bW0pLAogCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZzIpOwogCWNhc2UgQVJDSF9FTkFCTEVfVEFHR0VEX0FERFI6CiAJCXJldHVybiBwcmN0bF9lbmFibGVfdGFnZ2VkX2FkZHIodGFzay0mZ3Q7bW0sIGFyZzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMKaW5kZXggM2FmOTc5ZmI0MWQzOGQuLjMyOWVmYWMwY2ZiMzdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMKQEAgLTEwMzYsNyAmIzQzOzEwMzYsNyBAQCBzdGF0aWMgaW50IGNvcHlfZnJvbV92YWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgdmFkZHIsIGd1cF9mbGFncywgJmFtcDt2bWEpOwomIzQzOwlwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCAmYW1wO3ZtYSk7CiAJaWYgKElTX0VSUihwYWdlKSkKIAkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAJdXByb2JlX2NvcHlfZnJvbV9wYWdlKHBhZ2UsIHZhZGRyLCBkc3QsIGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggNDg1ZGY5YzJkYmRkYjMuLjBmNjZkNzZlNmNhNzE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0zMjM1LDM1ICYjNDM7MzIzNSw5IEBAIGxvbmcgcGluX3VzZXJfcGFnZXNfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJCSAgIGludCAqbG9ja2VkKTsKIAotLyoKLSAqIFJldHJpZXZlcyBhIHNpbmdsZSBwYWdlIGFsb25nc2lkZSBpdHMgVk1BLiBEb2VzIG5vdCBzdXBwb3J0IEZPTExfTk9XQUlULgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCQkJICAgIGludCBndXBfZmxhZ3MsCi0JCQkJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcCkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlpbnQgZ290OwotCi0JaWYgKFdBUk5fT05fT05DRSh1bmxpa2VseShndXBfZmxhZ3MgJmFtcDsgRk9MTF9OT1dBSVQpKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlnb3QgPSBnZXRfdXNlcl9wYWdlc19yZW1vdGUobW0sIGFkZHIsIDEsIGd1cF9mbGFncywgJmFtcDtwYWdlLCBOVUxMKTsKLQotCWlmIChnb3QgJmx0OyAwKQotCQlyZXR1cm4gRVJSX1BUUihnb3QpOwotCi0Jdm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7Ci0JaWYgKFdBUk5fT05fT05DRSghdm1hKSkgewotCQlwdXRfcGFnZShwYWdlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCi0JKnZtYXAgPSB2bWE7Ci0JcmV0dXJuIHBhZ2U7Ci19CiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQkgICAgICBpbnQgZ3VwX2ZsYWdzLAomIzQzOwkJCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTsKIAogbG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAogCQkgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oCmluZGV4IGVkZGJiYjY1Y2NjNGY4Li43ZTZlNGM4OTE4NGNkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKQEAgLTM0LDYgJiM0MzszNCwxMyBAQAogfSkKICNlbmRpZgogCiYjNDM7I2lmbmRlZiB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpCSh7CVwKJiM0MzsJKHZvaWQpKG1tKTsJCQkJCVwKJiM0MzsJdW50YWdnZWRfYWRkcihhZGRyKTsJCQkJXAomIzQzO30pCiYjNDM7I2VuZGlmCiYjNDM7CiAjaWZkZWYgbWFza2VkX3VzZXJfYWNjZXNzX2JlZ2luCiAgI2RlZmluZSBjYW5fZG9fbWFza2VkX3VzZXJfYWNjZXNzKCkgMQogIyBpZm5kZWYgbWFza2VkX3VzZXJfd3JpdGVfYWNjZXNzX2JlZ2luCmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jCmluZGV4IDA2OTIxMTliNzkwNDMxLi40OTEwYzkzYmEwMDNlOCAxMDA2NDQKLS0tIGEvbW0vZ3VwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmMKQEAgLTY0Nyw4ICYjNDM7NjQ3LDkgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZF90IHB1ZCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLAotCQkJCSAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNjcyLDEwICYjNDM7NjczLDEzIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlyZXR1cm4gRVJSX1BUUigtRU1MSU5LKTsKIAogCXJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIDEsIGZsYWdzKTsKLQlpZiAocmV0KQomIzQzOwlpZiAocmV0KSB7CiAJCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JZWxzZQotCQkqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgb2ZmID0gKGFkZHIgJmFtcDsgflBVRF9NQVNLKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkJKm5yX3BhZ2VzID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgKGVuZCAtIGFkZHIpICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwomIzQzOwl9CiAKIAlyZXR1cm4gcGFnZTsKIH0KQEAgLTY5OSw5ICYjNDM7NzAzLDkgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZF90IHBtZCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlwbWRfdCBwbWR2YWwgPSAqcG1kOwpAQCAtNzM4LDIzICYjNDM7NzQyLDI1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogI2VuZGlmCS8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwogCiAJcGFnZSAmIzQzOz0gKGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwotCSpwYWdlX21hc2sgPSBIUEFHRV9QTURfTlIgLSAxOwomIzQzOwkqbnJfcGFnZXMgPSBtaW4oSFBBR0VfUE1EX05SIC0gKChhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSykgJmd0OyZndDsgUEFHRV9TSElGVCksCiYjNDM7CQkJKGVuZCAtIGFkZHIpICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwogCiAJcmV0dXJuIHBhZ2U7CiB9CiAKICNlbHNlICAvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi8KIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLAotCQkJCSAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKQogewogCXJldHVybiBOVUxMOwogfQpAQCAtNzk5LDggJiM0Mzs4MDUsNDYgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkCiYjNDM7ICogbGFyZ2UgQGZvbGlvIG1hcHMgY29udGlndW91c2x5IGFuZCB0aGF0IGNhbiBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZQomIzQzOyAqIHBhZ2UgYXQgQGFkZHJlc3M6IGNvbnNlY3V0aXZlIHByZXNlbnQgUFRFcyBtYXBwaW5nIGNvbnNlY3V0aXZlIHBhZ2VzIG9mCiYjNDM7ICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLgomIzQzOyAqIFJldHVybnMgYXQgbGVhc3QgMS4KJiM0MzsgKgomIzQzOyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpcwomIzQzOyAqIGFsd2F5cyBzYWZlOiBhIHdyaXRhYmxlIGFub24gcGFnZSBpcyBleGNsdXNpdmUsIGFuZCBGT0xMX1dSSVRFIGlzIHNhdGlzZmllZC4KJiM0MzsgKiBBIHJlYWQtb25seSBydW4gaXMgb25seSBzYWZlIGZvciBhIHBsYWluIHJlYWQ7IEZPTExfV1JJVEUgd291bGQgbmVlZCBhIENPVwomIzQzOyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLAomIzQzOyAqIHNvIHRob3NlIGZhbGwgYmFjayB0byBhIHNpbmdsZSBwYWdlLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLAomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2UsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CXB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBtYXg7CiYjNDM7CiYjNDM7CWlmICghcHRlX3dyaXRlKHB0ZSkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGZvbGlvX3B0ZV9iYXRjaF9mbGFncygpIHNjYW5zIGZvcndhcmQgZnJvbSBAcHRlcCwgc28gdGhlIHJ1biBtdXN0CiYjNDM7CSAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kCiYjNDM7CSAqIHRoZSBWTUEsIHNpbmNlIGEgbGFyZ2UgZm9saW8gY2FuIGJlIFBURS1tYXBwZWQgYWNyb3NzIGEgUE1EIGJvdW5kYXJ5LgomIzQzOwkgKi8KJiM0MzsJbWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpICZndDsmZ3Q7IFBBR0VfU0hJRlQsCiYjNDM7CQkgICh2bWEtJmd0O3ZtX2VuZCAtIGFkZHJlc3MpICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwomIzQzOwlpZiAobWF4ICZsdDs9IDEpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJcmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCAmYW1wO2JhdGNoX3B0ZSwgbWF4LAomIzQzOwkJCQkgICAgIEZQQl9SRVNQRUNUX1dSSVRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAJc3RydWN0IGZvbGlvICpmb2xpbzsKQEAgLTg4NSw2ICYjNDM7OTI5LDE1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkgKi8KIAkJZm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7CiAJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBBIFBURS1tYXBwZWQgbGFyZ2UgZm9saW8gY2FuIGJlIGhhbmRlZCBiYWNrIGFzIGEgY29udGlndW91cyBiYXRjaCwKJiM0MzsJICogc28gdGhlIGNhbGxlciBhZHZhbmNlcyBvdmVyIHRoZSB3aG9sZSBydW4gaW4gb25lIHN0ZXAgaW5zdGVhZCBvZgomIzQzOwkgKiB3YWxraW5nIHRoZSBwYWdlIHRhYmxlcyBmb3IgZXZlcnkgcGFnZS4KJiM0MzsJICovCiYjNDM7CWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKJiM0MzsJCSpucl9wYWdlcyA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCBlbmQsIGZvbGlvLCBwYWdlLAomIzQzOwkJCQkJICAgICBwdGVwLCBwdGUsIGZsYWdzKTsKIG91dDoKIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CiAJcmV0dXJuIHBhZ2U7CkBAIC04OTYsOSAmIzQzOzk0OSw5IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogfQogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJCQkgICAgcHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKQogewogCXBtZF90ICpwbWQsIHBtZHZhbDsKIAlzcGlubG9ja190ICpwdGw7CkBAIC05MTIsNyAmIzQzOzk2NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCWlmICghcG1kX3ByZXNlbnQocG1kdmFsKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpCi0JCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTsKIAogCWlmIChwbWRfcHJvdG5vbmUocG1kdmFsKSAmYW1wOyZhbXA7ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CkBAIC05MjUsMjQgJiM0Mzs5NzgsMjQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJfQogCWlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKLQkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpOwogCX0KIAlpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBGT0xMX1NQTElUX1BNRCkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKIAkJc3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpOwogCQkvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovCiAJCXJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDoKLQkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpOwogCX0KLQlwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpOwogCXNwaW5fdW5sb2NrKHB0bCk7CiAJcmV0dXJuIHBhZ2U7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwNGRfdCAqcDRkcCwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcHVkX3QgKnB1ZHAsIHB1ZDsKIAlzcGlubG9ja190ICpwdGw7CkBAIC05NTUsNyAmIzQzOzEwMDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKHB1ZF9sZWFmKHB1ZCkpIHsKIAkJcHRsID0gcHVkX2xvY2sobW0sIHB1ZHApOwotCQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpOwogCQlzcGluX3VubG9jayhwdGwpOwogCQlpZiAocGFnZSkKIAkJCXJldHVybiBwYWdlOwpAQCAtOTY0LDEzICYjNDM7MTAxNywxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlpZiAodW5saWtlbHkocHVkX2JhZChwdWQpKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAKLQlyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CXJldHVybiBmb2xsb3dfcG1kX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBucl9wYWdlcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBnZF90ICpwZ2RwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwZ2RfdCAqcGdkcCwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcDRkX3QgKnA0ZHAsIHA0ZDsKIApAQCAtOTgxLDE1ICYjNDM7MTAzNCwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAotCXJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIG5yX3BhZ2VzKTsKIH0KIAogLyoqCiAgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3MKICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3MKICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cAomIzQzOyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMKICAqIEBmbGFnczogZmxhZ3MgbW9kaWZ5aW5nIGxvb2t1cCBiZWhhdmlvdXIKLSAqIEBwYWdlX21hc2s6IGEgcG9pbnRlciB0byBvdXRwdXQgcGFnZV9tYXNrCiYjNDM7ICogQG5yX3BhZ2VzOiBvdXRwdXQ7IG51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHRoZSBjYWxsZXIgY2FuIHJlYWQKICAqCiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluICZsdDtsaW51eC9tbS5oJmd0OwogICoKQEAgLTk5OCwxNSAmIzQzOzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAgKiB0cmlnZ2VyIGEgZmF1bHQgd2l0aCBGQVVMVF9GTEFHX1VOU0hBUkUgc2V0LiBOb3RlIHRoYXQgdW5zaGFyaW5nIGlzIG9ubHkKICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLgogICoKLSAqIE9uIG91dHB1dCwgQHBhZ2VfbWFzayBpcyBzZXQgYWNjb3JkaW5nIHRvIHRoZSBzaXplIG9mIHRoZSBwYWdlLgomIzQzOyAqIE9uIG91dHB1dCwgQG5yX3BhZ2VzIGhvbGRzIGhvdyBtYW55IGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGZvbGlvIHRoYXQgaW5jbHVkZXMKJiM0MzsgKiB0aGUgcmV0dXJuZWQgcGFnZSBoYXMgbWFwcGVkIGludG8gdGhpcyBwcm9jZXNzLCBzbyB0aGUgY2FsbGVyIGNhbiBhZHZhbmNlCiYjNDM7ICogb3ZlciBhIGxhcmdlIGZvbGlvIGluIG9uZSBzdGVwLgogICoKICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvcgogICogYW4gZXJyb3IgcG9pbnRlciBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZAogICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLgogICovCiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBmbGFncywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcGdkX3QgKnBnZDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CkBAIC0xMDE0LDEzICYjNDM7MTA3MCwxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAl2bWFfcGd0YWJsZV93YWxrX2JlZ2luKHZtYSk7CiAKLQkqcGFnZV9tYXNrID0gMDsKJiM0MzsJKm5yX3BhZ2VzID0gMTsKIAlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKIAogCWlmIChwZ2Rfbm9uZSgqcGdkKSB8fCB1bmxpa2VseShwZ2RfYmFkKCpwZ2QpKSkKIAkJcGFnZSA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJZWxzZQotCQlwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJCXBhZ2UgPSBmb2xsb3dfcDRkX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHBnZCwgZmxhZ3MsIG5yX3BhZ2VzKTsKIAogCXZtYV9wZ3RhYmxlX3dhbGtfZW5kKHZtYSk7CiAKQEAgLTEwODAsOSAmIzQzOzExMzYsMTYgQEAgc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiB9CiAKIC8qCi0gKiBtbWFwX2xvY2sgbXVzdCBiZSBoZWxkIG9uIGVudHJ5LiAgSWYgQGZsYWdzIGhhcyBGT0xMX1VOTE9DS0FCTEUgYnV0IG5vdAotICogRk9MTF9OT1dBSVQsIHRoZSBtbWFwX2xvY2sgbWF5IGJlIHJlbGVhc2VkLiAgSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0Ci0gKiB0byAwIGFuZCAtRUJVU1kgcmV0dXJuZWQuCiYjNDM7ICogVGhlIGNhbGxlciBob2xkcyBlaXRoZXIgdGhlIG1tYXAgbG9jaywgb3IgdGhlIHBlci1WTUEgbG9jayAod2l0aAomIzQzOyAqIEZPTExfVk1BX0xPQ0spLCBvbiBlbnRyeS4gSWYgQGZsYWdzIGhhcyBGT0xMX1VOTE9DS0FCTEUgYnV0IG5vdCBGT0xMX05PV0FJVCwKJiM0MzsgKiB0aGUgbW1hcF9sb2NrIG1heSBiZSByZWxlYXNlZC4gSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0IHRvIDAgYW5kCiYjNDM7ICogLUVBR0FJTiByZXR1cm5lZC4KJiM0MzsgKgomIzQzOyAqIFRoZSByZXR1cm4gdmFsdWUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBsb2NrIHR5cGU6IGEgZmF1bHQgdGhhdCBtYWRlCiYjNDM7ICogcHJvZ3Jlc3MgYnV0IG5lZWRzIGEgcmV0cnkgKFZNX0ZBVUxUX1JFVFJZIC8gVk1fRkFVTFRfQ09NUExFVEVEKSBpcyByZXBvcnRlZAomIzQzOyAqIGFzIC1FQUdBSU4gZm9yIGJvdGggdGhlIG1tYXAgbG9jayBhbmQgdGhlIHBlci1WTUEgbG9jayAoRk9MTF9WTUFfTE9DSykuIE9ubHkKJiM0MzsgKiB0aGUgKkBsb2NrZWQgc2lkZSBlZmZlY3QgaXMgbG9jay10eXBlIHNwZWNpZmljLCBhcyB0aGUgcGVyLVZNQSBsb2NrIHBhdGggaGFzCiYjNDM7ICogbm8gdW5sb2NrYWJsZSBtbWFwX2xvY2sgdG8gZHJvcC4KICAqLwogc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLCBib29sIHVuc2hhcmUsCkBAIC0xMDk3LDYgJiM0MzsxMTYwLDggQEAgc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCWZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfV1JJVEU7CiAJaWYgKGZsYWdzICZhbXA7IEZPTExfUkVNT1RFKQogCQlmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1JFTU9URTsKJiM0MzsJaWYgKGZsYWdzICZhbXA7IEZPTExfVk1BX0xPQ0spCiYjNDM7CQlmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1ZNQV9MT0NLOwogCWlmIChmbGFncyAmYW1wOyBGT0xMX1VOTE9DS0FCTEUpIHsKIAkJZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19BTExPV19SRVRSWSB8IEZBVUxUX0ZMQUdfS0lMTEFCTEU7CiAJCS8qCkBAIC0xMTI1LDQxICYjNDM7MTE5MCwxOTUgQEAgc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAlyZXQgPSBoYW5kbGVfbW1fZmF1bHQodm1hLCBhZGRyZXNzLCBmYXVsdF9mbGFncywgTlVMTCk7CiAKJiM0MzsJLyoKJiM0MzsJICogQSBmdWxseSBjb21wbGV0ZWQgZmF1bHQgKFZNX0ZBVUxUX0NPTVBMRVRFRCkgb3Igb25lIHRoYXQgbmVlZHMgYSByZXRyeQomIzQzOwkgKiAoVk1fRkFVTFRfUkVUUlkpIGhhcyByZWxlYXNlZCB0aGUgbG9jayBpdCB3YXMgaG9sZGluZy4gUmVwb3J0IGJvdGggYXMKJiM0MzsJICogLUVBR0FJTiBzbyB0aGUgY2FsbGVyIHJldHJpZXM6IHRoZSBtbWFwIGxvY2sgY2FsbGVyIHJldGFrZXMgaXQgaGVyZSwKJiM0MzsJICogdGhlIHBlci1WTUEgbG9jayBjYWxsZXIgKEZPTExfVk1BX0xPQ0spIGZhbGxzIGJhY2sgdG8gdGhlIG1tYXAgbG9jay4KJiM0MzsJICoKJiM0MzsJICogRHJvcHBpbmcgdGhlIG1tYXAgbG9jayBpcyByZWNvcmRlZCBpbiAqQGxvY2tlZC4gVGhlcmUgaXMgbm8gc3VjaCBsb2NrCiYjNDM7CSAqIHRvIGRyb3AgdW5kZXIgdGhlIHBlci1WTUEgbG9jaywgd2hlcmUgQGxvY2tlZCBpcyBub3QgdXNlZCwgc28gbGVhdmUgaXQKJiM0MzsJICogYWxvbmUgaW4gdGhhdCBjYXNlLgomIzQzOwkgKi8KIAlpZiAocmV0ICZhbXA7IFZNX0ZBVUxUX0NPTVBMRVRFRCkgewotCQkvKgotCQkgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJiMzOTtsbCBuZXZlciByZWxlYXNlIHRoZQotCQkgKiBtbWFwIGxvY2sgaW4gdGhlIHBhZ2UgZmF1bHQgaGFuZGxlci4gU2FuaXR5IGNoZWNrIHRoaXMuCi0JCSAqLwotCQlXQVJOX09OX09OQ0UoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpOwotCQkqbG9ja2VkID0gMDsKLQotCQkvKgotCQkgKiBXZSBzaG91bGQgZG8gdGhlIHNhbWUgYXMgVk1fRkFVTFRfUkVUUlksIGJ1dCBsZXQmIzM5O3Mgbm90Ci0JCSAqIHJldHVybiAtRUJVU1kgc2luY2UgdGhhdCYjMzk7cyBub3QgcmVmbGVjdGluZyB0aGUgcmVhbGl0eSBvZgotCQkgKiB3aGF0IGhhcyBoYXBwZW5lZCAtIHdlJiMzOTt2ZSBqdXN0IGZ1bGx5IGNvbXBsZXRlZCBhIHBhZ2UKLQkJICogZmF1bHQsIHdpdGggdGhlIG1tYXAgbG9jayByZWxlYXNlZC4gIFVzZSAtRUFHQUlOIHRvIHNob3cKLQkJICogdGhhdCB3ZSB3YW50IHRvIHRha2UgdGhlIG1tYXAgbG9jayBfYWdhaW5fLgotCQkgKi8KJiM0MzsJCWlmICghKGZsYWdzICZhbXA7IEZPTExfVk1BX0xPQ0spKSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJiMzOTtsbCBuZXZlciByZWxlYXNlIHRoZQomIzQzOwkJCSAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy4KJiM0MzsJCQkgKi8KJiM0MzsJCQlXQVJOX09OX09OQ0UoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpOwomIzQzOwkJCSpsb2NrZWQgPSAwOwomIzQzOwkJfQogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKIAlpZiAocmV0ICZhbXA7IFZNX0ZBVUxUX0VSUk9SKSB7CiAJCWludCBlcnIgPSB2bV9mYXVsdF90b19lcnJubyhyZXQsIGZsYWdzKTsKIAotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJQlVHKCk7CiYjNDM7CQkvKgomIzQzOwkJICogVk1fRkFVTFRfRVJST1IgYWx3YXlzIGRlY29kZXMgdG8gYW4gZXJybm87IGEgemVybyBoZXJlIHdvdWxkCiYjNDM7CQkgKiBtZWFuIGhhbmRsZV9tbV9mYXVsdCgpIHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgY29tYmluYXRpb24uCiYjNDM7CQkgKiBSZXBvcnQgLUVGQVVMVCByYXRoZXIgdGhhbiBjcmFzaDogdW5kZXIgdGhlIHBlci1WTUEgbG9jayB0aGUKJiM0MzsJCSAqIG1tYXAgbG9jayByZXRyeSBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSByZXN1bHQuCiYjNDM7CQkgKi8KJiM0MzsJCVZNX1dBUk5fT05fT05DRSghZXJyKTsKJiM0MzsJCXJldHVybiBlcnIgPyBlcnIgOiAtRUZBVUxUOwogCX0KIAogCWlmIChyZXQgJmFtcDsgVk1fRkFVTFRfUkVUUlkpIHsKLQkJaWYgKCEoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKQomIzQzOwkJaWYgKCEoZmxhZ3MgJmFtcDsgRk9MTF9WTUFfTE9DSykgJmFtcDsmYW1wOwomIzQzOwkJICAgICEoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKQogCQkJKmxvY2tlZCA9IDA7Ci0JCXJldHVybiAtRUJVU1k7CiYjNDM7CQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAomIzQzOy8qCiYjNDM7ICogZ2V0X3VzZXJfcGFnZV92bWEgLSBnZXQgb25lIHBhZ2UgZnJvbSBAdm1hLCB3aG9zZSBsb2NrIHRoZSBjYWxsZXIgYWxyZWFkeQomIzQzOyAqIGhvbGRzOiB0aGUgbW1hcCBsb2NrLCBvciAod2l0aCBGT0xMX1ZNQV9MT0NLKSB0aGUgcGVyLVZNQSBsb2NrLiBXYWxrcyB0aGUKJiM0MzsgKiBwYWdlIHRhYmxlcywgZmF1bHRpbmcgdGhlIHBhZ2UgaW4gaWYgbmVlZGVkLCBhbmQgb24gc3VjY2VzcyByZXR1cm5zIGl0IHdpdGgKJiM0MzsgKiBhIHJlZmVyZW5jZSBhbmQgdGhlIGxvY2sgc3RpbGwgaGVsZC4KJiM0MzsgKgomIzQzOyAqIFJ1bnMgY2hlY2tfdm1hX2ZsYWdzKCkgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHNvIGNhbGxlcnMgbmVlZCBub3QgcHJlLWNoZWNrCiYjNDM7ICogdGhlIFZNQTsgbW9zdCByZWplY3Rpb25zIGFyZSByZXR1cm5lZCBhcyB0aGVpciBlcnJvci4gQSBWTV9JTy9WTV9QRk5NQVAgVk1BCiYjNDM7ICogaXMgdGhlIGV4Y2VwdGlvbjogYSBDT1dlZCBwYWdlIHdpdGggYSBzdHJ1Y3QgcGFnZSBpcyByZXR1cm5lZCwgd2hpbGUgYSByYXcKJiM0MzsgKiBQRk4gaGFzIG5vbmUgYW5kIHlpZWxkcyAtRUZBVUxULCB0byBiZSByZWFjaGVkIHZpYSB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKCkuCiYjNDM7ICoKJiM0MzsgKiBVbmRlciBGT0xMX1ZNQV9MT0NLLCBhbnl0aGluZyB0aGF0IGNhbm5vdCBiZSBmaW5pc2hlZCB1bmRlciB0aGUgcGVyLVZNQSBsb2NrCiYjNDM7ICogKGEgZHJvcHBlZCBmYXVsdCwgdXNlcmZhdWx0ZmQsIGEgaGFyZCBlcnJvciwgb3IgLSZndDthY2Nlc3MoKSBtZW1vcnkpIHJlbGVhc2VzCiYjNDM7ICogdGhlIGxvY2sgYW5kIHJldHVybnMgLUVBR0FJTiwgc28gdGhlIGNhbGxlciByZXRyaWVzIHVuZGVyIHRoZSBtbWFwIGxvY2suCiYjNDM7ICovCiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpCiYjNDM7ewomIzQzOwlib29sIHZtYV9sb2NrZWQgPSBndXBfZmxhZ3MgJmFtcDsgRk9MTF9WTUFfTE9DSzsKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWludCBsb2NrZWQgPSAxOwomIzQzOwlib29sIHBmbm1hcDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVHdvIGxvY2sgbW9kZXMgYXJlIHN1cHBvcnRlZDogdGhlIG1tYXAgbG9jaywgd2l0aCBuZWl0aGVyIGZsYWcsIG9yCiYjNDM7CSAqIHRoZSBwZXItVk1BIGxvY2ssIHdpdGggYm90aCBGT0xMX1ZNQV9MT0NLIGFuZCBGT0xMX1VOTE9DS0FCTEUuIEFuCiYjNDM7CSAqIHVubG9ja2FibGUgbW1hcCBmYXVsdCB3b3VsZCBkcm9wIHRoZSBsb2NrIGFuZCByZXBvcnQgaXQgaW4gKmxvY2tlZCwKJiM0MzsJICogd2hpY2ggdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWxheSwgc28gcmVqZWN0IGEgbG9uZSBmbGFnLgomIzQzOwkgKi8KJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCEoZ3VwX2ZsYWdzICZhbXA7IEZPTExfVk1BX0xPQ0spICE9ICEoZ3VwX2ZsYWdzICZhbXA7IEZPTExfVU5MT0NLQUJMRSkpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBWYWxpZGF0ZSB0aGUgVk1BIHVwIGZyb250LCBsaWtlIF9fZ2V0X3VzZXJfcGFnZXMoKS4gQSBWTV9JTy9WTV9QRk5NQVAKJiM0MzsJICogVk1BIGlzIG5vdCByZWplY3RlZCBvdXRyaWdodDogaXQgY2FuIGhvbGQgQ09XZWQgcGFnZXMgdGhhdCBoYXZlIGEKJiM0MzsJICogc3RydWN0IHBhZ2U7IGxldCBmb2xsb3dfcGFnZV9tYXNrKCkgbG9vayBmb3IgdGhlbSwgYW5kIHRyZWF0IG9ubHkKJiM0MzsJICogaXRzIHN0cnVjdC1wYWdlLWxlc3MgUEZOcyBhcyB1bnJlYWNoYWJsZS4gT3RoZXIgcmVqZWN0aW9ucwomIzQzOwkgKiAoc2VjcmV0bWVtLCBwZXJtaXNzaW9ucywgZXRjKSByZXN1bHQgaW4gaW1tZWRpYXRlIGZhaWx1cmUuCiYjNDM7CSAqLwomIzQzOwlyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIFZNX0lPIHwgVk1fUEZOTUFQKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJcGZubWFwID0gdm1hLSZndDt2bV9mbGFncyAmYW1wOyAoVk1fSU8gfCBWTV9QRk5NQVApOwomIzQzOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKJiM0MzsJCQlyZXQgPSAtRUlOVFI7CiYjNDM7CQkJZ290byBmYWlsOwomIzQzOwkJfQomIzQzOwkJY29uZF9yZXNjaGVkKCk7CiYjNDM7CiYjNDM7CQkvKiBUaGlzIGhlbHBlciBoYW5kcyBiYWNrIGEgc2luZ2xlIHBhZ2U7IGNhcCB0aGUgYmF0Y2ggYXQgb25lLiAqLwomIzQzOwkJcGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBhZGRyLCBhZGRyICYjNDM7IFBBR0VfU0laRSwKJiM0MzsJCQkJCWd1cF9mbGFncyB8IEZPTExfVE9VQ0ggfCBGT0xMX0dFVCwKJiM0MzsJCQkJCSZhbXA7bnJfcGFnZXMpOwomIzQzOwkJaWYgKCFJU19FUlJfT1JfTlVMTChwYWdlKSkgewomIzQzOwkJCS8qIE1hdGNoIF9fZ2V0X3VzZXJfcGFnZXMoKTogZmx1c2ggZm9yIFZJVlQvYWxpYXNpbmcgY2FjaGVzLiAqLwomIzQzOwkJCWZsdXNoX2Fub25fcGFnZSh2bWEsIHBhZ2UsIGFkZHIpOwomIzQzOwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwomIzQzOwkJCXJldHVybiBwYWdlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIE5vIHN0cnVjdCBwYWdlOiBhIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgVk1BLCB3aGV0aGVyCiYjNDM7CQkgKiBzZWVuIGJ5IHRoZSB1cC1mcm9udCBjaGVjayAoQHBmbm1hcCkgb3IgcmVwb3J0ZWQgYXMgLUVFWElTVAomIzQzOwkJICogZm9yIGEgcHJlc2VudCBQRk4uIFJldHVybiAtRUZBVUxUIHNvIHRoZSBjYWxsZXIgcmVhY2hlcyBpdAomIzQzOwkJICogdGhyb3VnaCB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKCkuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChwZm5tYXAgfHwgUFRSX0VSUihwYWdlKSA9PSAtRUVYSVNUKSB7CiYjNDM7CQkJcmV0ID0gLUVGQVVMVDsKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQl9CiYjNDM7CQkvKiBBIGhhcmQgZXJyb3IgZnJvbSB0aGUgd2FsayBpdHNlbGYuICovCiYjNDM7CQlpZiAocGFnZSAmYW1wOyZhbXA7IFBUUl9FUlIocGFnZSkgIT0gLUVNTElOSykgewomIzQzOwkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiYjNDM7CQkJZ290byBmYWlsOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSBwYWdlIGlzIG5vdCBwcmVzZW50LCBvciBuZWVkcyB1bnNoYXJpbmcuIEEgcmVtb3RlIGZhdWx0CiYjNDM7CQkgKiB1bmRlciB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBkZWxpdmVyIHVzZXJmYXVsdGZkICh3aGljaAomIzQzOwkJICogYXNzdW1lcyBjdXJyZW50IGlzIHRoZSBmYXVsdGluZyB0YXNrKSwgc28gZmFsbCBiYWNrIGZvciB0aG9zZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHZtYV9sb2NrZWQgJmFtcDsmYW1wOyB1c2VyZmF1bHRmZF9hcm1lZCh2bWEpKSB7CiYjNDM7CQkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQl9CiYjNDM7CQlyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfR0VULAomIzQzOwkJCQkgICBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkssICZhbXA7bG9ja2VkKTsKJiM0MzsJCWlmIChyZXQgPT0gLUVBR0FJTikKJiM0MzsJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsJLyogZmF1bHQgcmVsZWFzZWQgdGhlIHBlci1WTUEgbG9jayAqLwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MztmYWlsOgomIzQzOwkvKgomIzQzOwkgKiBVbmRlciB0aGUgcGVyLVZNQSBsb2NrIHRoZSBjYWxsZXIgY2Fubm90IHJlYWNoIC0mZ3Q7YWNjZXNzKCkgb3IgYWN0IG9uIGEKJiM0MzsJICogaGFyZCBlcnJvciAoYm90aCBuZWVkIHRoZSBtbWFwIGxvY2spLCBzbyByZWxlYXNlIHRoZSBsb2NrIGFuZCBoYXZlIGl0CiYjNDM7CSAqIHJldHJ5IHRoZXJlOyB0aGUgbW1hcC1sb2NrIHBhc3MgcHJvZHVjZXMgdGhlIGRlZmluaXRpdmUgZXJyb3IuCiYjNDM7CSAqLwomIzQzOwlpZiAodm1hX2xvY2tlZCkgewomIzQzOwkJdm1hX2VuZF9yZWFkKHZtYSk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gRVJSX1BUUihyZXQpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSAtIGZhdWx0IGluIG9uZSBwYWdlIG9mIGEgcmVtb3RlIG1tIGFuZCBoYW5kIGJhY2sgdGhlCiYjNDM7ICogcGFnZSBhbG9uZyB3aXRoIHRoZSBWTUEgdGhhdCBjb3ZlcnMgaXQuIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBtbWFwX2xvY2suCiYjNDM7ICogUmV0dXJucyB3aXRoIHRoZSBtbWFwX2xvY2sgc3RpbGwgaGVsZC4KJiM0MzsgKgomIzQzOyAqIExvb2tzIHVwIHRoZSBWTUEsIGFuZCBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwYWdlIHRocm91Z2gKJiM0MzsgKiBnZXRfdXNlcl9wYWdlX3ZtYSgpLCBmYXVsdGluZyBpbiB0aGUgcGFnZSBpZiBuZWVkZWQuCiYjNDM7ICoKJiM0MzsgKiBGT0xMX05PV0FJVCBhbmQgRk9MTF9VTkxPQ0tBQkxFIGFyZSByZWplY3RlZDogYm90aCBsZXQgdGhlIGZhdWx0IGhhbmRsZXIKJiM0MzsgKiBkcm9wIHRoZSBtbWFwIGxvY2ssIHdoaWNoIGNvdWxkIGludmFsaWRhdGUgdGhlIGxvb2tlZC11cCBWTUEuCiYjNDM7ICovCiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQkgICAgICBpbnQgZ3VwX2ZsYWdzLAomIzQzOwkJCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKQomIzQzO3sKJiM0MzsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiYjNDM7CXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyAmYW1wOyAoRk9MTF9OT1dBSVQgfCBGT0xMX1VOTE9DS0FCTEUpKSkpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKJiM0MzsKJiM0MzsJbW1hcF9hc3NlcnRfbG9ja2VkKG1tKTsKJiM0MzsKJiM0MzsJdm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7CiYjNDM7CWlmICghdm1hKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CiYjNDM7CXBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7CiYjNDM7CWlmIChJU19FUlIocGFnZSkpCiYjNDM7CQlyZXR1cm4gcGFnZTsKJiM0MzsKJiM0MzsJKnZtYXAgPSB2bWE7CiYjNDM7CXJldHVybiBwYWdlOwomIzQzO30KJiM0MzsKIC8qCiAgKiBXcml0aW5nIHRvIGZpbGUtYmFja2VkIG1hcHBpbmdzIHdoaWNoIHJlcXVpcmUgZm9saW8gZGlydHkgdHJhY2tpbmcgdXNpbmcgR1VQCiAgKiBpcyBhIGZ1bmRhbWVudGFsbHkgYnJva2VuIG9wZXJhdGlvbiwgYXMga2VybmVsIHdyaXRlIGFjY2VzcyB0byBHVVAgbWFwcGluZ3MKQEAgLTExOTcsMTMgJiM0MzsxNDE2LDIxIEBAIHN0YXRpYyBib29sIHdyaXRhYmxlX2ZpbGVfbWFwcGluZ19hbGxvd2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXJldHVybiAhdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHZtYSk7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncykKJiM0MztpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncywKJiM0MzsJCSAgICB2bV9mbGFnc190IGlnbm9yZV9mbGFncykKIHsKIAl2bV9mbGFnc190IHZtX2ZsYWdzID0gdm1hLSZndDt2bV9mbGFnczsKIAlpbnQgd3JpdGUgPSAoZ3VwX2ZsYWdzICZhbXA7IEZPTExfV1JJVEUpOwogCWludCBmb3JlaWduID0gKGd1cF9mbGFncyAmYW1wOyBGT0xMX1JFTU9URSk7CiAJYm9vbCB2bWFfYW5vbiA9IHZtYV9pc19hbm9ueW1vdXModm1hKTsKIAomIzQzOwkvKgomIzQzOwkgKiBPcHQgb3V0IG9mIHRoZSBmbGFnIGNoZWNrcyB0aGF0IHJlYWQgdGhpcyBsb2NhbCBjb3B5ICh0aGUKJiM0MzsJICogVk1fSU8vVk1fUEZOTUFQIGdhdGUgYW5kIHRoZSB3cml0ZS9yZWFkL2NvdyBiaXRzKTsgY2hlY2tzIHRoYXQKJiM0MzsJICogcmUtcmVhZCB2bWEtJmd0O3ZtX2ZsYWdzIHRocm91Z2ggaGVscGVycyBhcmUgdW5hZmZlY3RlZC4KJiM0MzsJICovCiYjNDM7CXZtX2ZsYWdzICZhbXA7PSB+aWdub3JlX2ZsYWdzOwomIzQzOwogCWlmICh2bV9mbGFncyAmYW1wOyAoVk1fSU8gfCBWTV9QRk5NQVApKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMTM1OCw3ICYjNDM7MTU4NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiB7CiAJbG9uZyByZXQgPSAwLCBpID0gMDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwOwogCiAJaWYgKCFucl9wYWdlcykKIAkJcmV0dXJuIDA7CkBAIC0xMzczLDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogCWRvIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIGludCBwYWdlX2luY3JlbTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pbmNyZW07CiAKIAkJLyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqLwogCQlpZiAoIXZtYSB8fCBzdGFydCAmZ3Q7PSB2bWEtJmd0O3ZtX2VuZCkgewpAQCAtMTM4Nyw3ICYjNDM7MTYxMyw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJCWdvdG8gb3V0OwogCQkJCX0KLQkJCQlpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkgewomIzQzOwkJCQlpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKSkgewogCQkJCQlyZXQgPSAtRUlOVkFMOwogCQkJCQlnb3RvIG91dDsKIAkJCQl9CkBAIC0xNDAwLDcgJiM0MzsxNjI2LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJCXBhZ2VzID8gJmFtcDtwYWdlIDogTlVMTCk7CiAJCQkJaWYgKHJldCkKIAkJCQkJZ290byBvdXQ7Ci0JCQkJcGFnZV9tYXNrID0gMDsKJiM0MzsJCQkJcGFnZV9pbmNyZW0gPSAxOwogCQkJCWdvdG8gbmV4dF9wYWdlOwogCQkJfQogCkBAIC0xNDA4LDcgJiM0MzsxNjM0LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJcmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKTsKJiM0MzsJCQlyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTQyMyw3ICYjNDM7MTY0OSw4IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCX0KIAkJY29uZF9yZXNjaGVkKCk7CiAKLQkJcGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCAmYW1wO3BhZ2VfbWFzayk7CiYjNDM7CQlwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBzdGFydCAmIzQzOyBucl9wYWdlcyAqIFBBR0VfU0laRSwKJiM0MzsJCQkJCWd1cF9mbGFncywgJmFtcDtwYWdlX2luY3JlbSk7CiAJCWlmICghcGFnZSB8fCBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkspIHsKIAkJCXJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsCiAJCQkJCSAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTsKQEAgLTE0NTYsNyAmIzQzOzE2ODMsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJZ290byBvdXQ7CiAJCX0KIG5leHRfcGFnZToKLQkJcGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0ICZndDsmZ3Q7IFBBR0VfU0hJRlQpICZhbXA7IHBhZ2VfbWFzayk7CiAJCWlmIChwYWdlX2luY3JlbSAmZ3Q7IG5yX3BhZ2VzKQogCQkJcGFnZV9pbmNyZW0gPSBucl9wYWdlczsKIApkaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmgKaW5kZXggMTgxZTc5ZjFkNmEyMDcuLjcwNmY3ZjA4ZmQxODE1IDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTE1OTUsNiAmIzQzOzE1OTUsMTAgQEAgc3RydWN0IHZtX3N0cnVjdCAqX19nZXRfdm1fYXJlYV9ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwKICAqLwogaW50IF9fbXVzdF9jaGVjayB0cnlfZ3JhYl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgcmVmcywKIAkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpOwomIzQzO2ludCBjaGVja192bWFfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZ3VwX2ZsYWdzLAomIzQzOwkJICAgIHZtX2ZsYWdzX3QgaWdub3JlX2ZsYWdzKTsKJiM0MztzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncyk7CiAKIC8qCiAgKiBtbS9odWdlX21lbW9yeS5jCkBAIC0xNjQxLDExICYjNDM7MTY0NSwxMyBAQCBlbnVtIHsKIAlGT0xMX1VOTE9DS0FCTEUgPSAxICZsdDsmbHQ7IDIxLAogCS8qIFZNQSBsb29rdXAmIzQzO2NoZWNrcyBjb21wYXRpYmxlIHdpdGggTUFEVl9QT1BVTEFURV8oUkVBRHxXUklURSkgKi8KIAlGT0xMX01BRFZfUE9QVUxBVEUgPSAxICZsdDsmbHQ7IDIyLAomIzQzOwkvKiBjYWxsZXIgaG9sZHMgdGhlIHBlci1WTUEgbG9jaywgbm90IHRoZSBtbWFwIGxvY2sgKi8KJiM0MzsJRk9MTF9WTUFfTE9DSyA9IDEgJmx0OyZsdDsgMjMsCiB9OwogCiAjZGVmaW5lIElOVEVSTkFMX0dVUF9GTEFHUyAoRk9MTF9UT1VDSCB8IEZPTExfVFJJRUQgfCBGT0xMX1JFTU9URSB8IEZPTExfUElOIHwgXAogCQkJICAgIEZPTExfRkFTVF9PTkxZIHwgRk9MTF9VTkxPQ0tBQkxFIHwgXAotCQkJICAgIEZPTExfTUFEVl9QT1BVTEFURSkKJiM0MzsJCQkgICAgRk9MTF9NQURWX1BPUFVMQVRFIHwgRk9MTF9WTUFfTE9DSykKIAogLyoKICAqIEluZGljYXRlcyBmb3Igd2hpY2ggcGFnZXMgdGhhdCBhcmUgd3JpdGUtcHJvdGVjdGVkIGluIHRoZSBwYWdlIHRhYmxlLApkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCBmZjMzOGMyYWJlOTIzMS4uYWFmNjIwMDE3ZjM0NDIgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbW9yeS5jCkBAIC03MDE1LDg2ICYjNDM7NzAxNSwyNDQgQEAgRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19hY2Nlc3NfcGh5cyk7CiAjZW5kaWYKIAogLyoKLSAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLgomIzQzOyAqIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeSwgc3VjaCBhcyBhbiBpb3JlbWFwcGVkIGRldmljZSBtYXBwaW5nLCBtYXBzCiYjNDM7ICogUEZOcyB0aGF0IGhhdmUgbm8gc3RydWN0IHBhZ2UsIHNvIGdldF91c2VyX3BhZ2Vfdm1hKCkgY2Fubm90IGZldGNoIGl0CiYjNDM7ICogZXZlbiB0aG91Z2ggdGhlIHBhZ2UgdGFibGVzIGFyZSBwb3B1bGF0ZWQuIEl0IGNhbiBzdGlsbCBiZSByZWFjaGVkCiYjNDM7ICogdGhyb3VnaCB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKCkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG9yICZsdDs9IDAgaWYgQHZtYSBjYW5ub3QgYmUKJiM0MzsgKiBhY2Nlc3NlZCB0aGlzIHdheS4KICAqLwotc3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncykKJiM0MztzdGF0aWMgaW50IGFjY2Vzc19yZW1vdGVfdm1hX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpCiYjNDM7ewomIzQzOyNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QKJiM0MzsJaWYgKHZtYS0mZ3Q7dm1fb3BzICZhbXA7JmFtcDsgdm1hLSZndDt2bV9vcHMtJmd0O2FjY2VzcykKJiM0MzsJCXJldHVybiB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTsKJiM0MzsjZW5kaWYKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTG9jayBAbW0gdG8gcmVhY2ggdGhlIHJlbW90ZSByYW5nZSBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pLgomIzQzOyAqCiYjNDM7ICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlCiYjNDM7ICogZmxhZ3MgcGVybWl0IHRoZSBhY2Nlc3MuIFRoZSBSQ1UgZnJlZWQgcGFnZSB0YWJsZXMgdGhlbiBrZWVwIHBhZ2UgdGFibGUKJiM0MzsgKiBtZW1vcnkgZnJvbSBiZWluZyByZXVzZWQgd2l0aCB1bmV4cGVjdGVkIGNvbnRlbnRzIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuCiYjNDM7ICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLAomIzQzOyAqIHN0YWNrIGV4cGFuc2lvbiwgYW5kIC0mZ3Q7YWNjZXNzKCkgbWVtb3J5LgomIzQzOyAqCiYjNDM7ICogUmV0dXJuIHdoZXRoZXIgdGhlIG1tYXAgbG9jayBpcyBoZWxkLiBUaGUgcGVyLVZNQSBsb2NrZWQgVk1BLCB3aGVuIG9uZSBpcwomIzQzOyAqIHRha2VuLCBpcyBzdG9yZWQgaW4gKkB2bWFwOyBpdCBpcyBOVUxMIG9uIHRoZSBtbWFwIGxvY2sgcGF0aC4gKkB2bWFwIGlzCiYjNDM7ICogc2V0IHRvIGFuIEVSUl9QVFIoKSB3aGVuIHRoZSBtbWFwIGxvY2sgY291bGQgbm90IGJlIHRha2VuLCBzbyBjYWxsZXJzIG11c3QKJiM0MzsgKiBjaGVjayBJU19FUlIoKkB2bWFwKSBiZWZvcmUgdXNpbmcgZWl0aGVyIHJlc3VsdC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCByZW1vdGVfYWNjZXNzX2xvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKJiM0MzsJCQkgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncywKJiM0MzsJCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKJiM0MzsKJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZNQV9MT0NLKSAmYW1wOyZhbXA7IGRlZmluZWQoQ09ORklHX01NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUUpCiYjNDM7CXZtYSA9IGxvY2tfdm1hX3VuZGVyX3JjdShtbSwgYWRkcik7CiYjNDM7CWlmICh2bWEpIHsKJiM0MzsJCS8qIGFkZHIgJiM0MzsgbGVuIG11c3Qgbm90IHdyYXAsIGFuZCBtdXN0IGZpdCB3aXRoaW4gdGhlIG9uZSBWTUEuICovCiYjNDM7CQlpZiAoYWRkciAmIzQzOyBsZW4gJmx0OyBhZGRyIHx8IGFkZHIgJiM0MzsgbGVuICZndDsgdm1hLSZndDt2bV9lbmQgfHwKJiM0MzsJCSAgICBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApKSB7CiYjNDM7CQkJdm1hX2VuZF9yZWFkKHZtYSk7CiYjNDM7CQkJdm1hID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOyNlbmRpZgomIzQzOwomIzQzOwlpZiAoIXZtYSkgewomIzQzOwkJaWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkgewomIzQzOwkJCSp2bWFwID0gRVJSX1BUUigtRUlOVFIpOwomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsJCSp2bWFwID0gTlVMTDsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CSp2bWFwID0gdm1hOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlbGVhc2UgdGhlIGxvY2sgdGFrZW4gYnkgcmVtb3RlX2FjY2Vzc19sb2NrKCkuICovCiYjNDM7c3RhdGljIHZvaWQgcmVtb3RlX2FjY2Vzc191bmxvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0sCiYjNDM7CQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCBoYXZlX21tYXBfbG9jaykKJiM0Mzt7CiYjNDM7CWlmIChoYXZlX21tYXBfbG9jaykKJiM0MzsJCW1tYXBfcmVhZF91bmxvY2sobW0pOwomIzQzOwllbHNlIGlmICh2bWEpCiYjNDM7CQl2bWFfZW5kX3JlYWQodm1hKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBQZXItcGFnZSBhY3Rpb24gZm9yIGEgcmVtb3RlIFZNIHdhbGsuIEhhbmRsZSB1cCB0byBAbGVuIGJ5dGVzIGF0IEBhZGRyIG9uCiYjNDM7ICogQHBhZ2UsIGFkdmFuY2luZyAqQGJ1ZiBwYXN0IHRoZSBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBpdC4gQHBhZ2UgaXMKJiM0MzsgKiBOVUxMIGZvciBzdHJ1Y3QtcGFnZS1sZXNzIG1lbW9yeSAoVk1fSU8gLyBWTV9QRk5NQVApIHJlYWNoZWQgdW5kZXIgdGhlIG1tYXAKJiM0MzsgKiBsb2NrLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIGJ5dGVzIGhhbmRsZWQgYXQgQGFkZHIsIDAgdG8gZW5kIHRoZSB3YWxrIChhCiYjNDM7ICogc3RyaW5nIHJlYWNoZWQgaXRzIE5VTCwgb3IgLSZndDthY2Nlc3MoKSBtZW1vcnkgY291bGQgbm90IGJlIHJlYWNoZWQpLCBvciBhCiYjNDM7ICogbmVnYXRpdmUgZXJybm8gdG8gYWJvcnQuCiYjNDM7ICovCiYjNDM7dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiYjNDM7CQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwKJiM0MzsJCQkJaW50IHdyaXRlKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdhbGsgdGhlIHJlbW90ZSByYW5nZSBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pIG9mIEBtbSwgaGFuZGluZyBlYWNoIHBhZ2UgdG8KJiM0MzsgKiBAYWN0aW9uLiBVc2UgdGhlIHBlci1WTUEgbG9jayB3aGVuIHRoZSByYW5nZSBmaXRzIG9uZSBWTUEsIGFuZCBmYWxsIGJhY2sgdG8KJiM0MzsgKiB0aGUgbW1hcCBsb2NrIGZvciBtdWx0aS1WTUEgcmFuZ2VzLCBzdGFjayBleHBhbnNpb24gKHdoZW4gQGNhbl9leHBhbmRfc3RhY2sKJiM0MzsgKiBpcyBzZXQpLCBvciB3aGVuIHRoZSBwZXItVk1BIGxvY2sgY2Fubm90IGZpbmlzaCBhIGZhdWx0LgomIzQzOyAqCiYjNDM7ICogRWFjaCBwYWdlIGlzIGZhdWx0ZWQgaW4gd2l0aCBnZXRfdXNlcl9wYWdlX3ZtYSgpIHVuZGVyIHdoaWNoZXZlciBsb2NrIGlzCiYjNDM7ICogaGVsZC4gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgQGFjdGlvbiBjb25zdW1lZDsgKkBlcnIgaXMgYSBuZWdhdGl2ZQomIzQzOyAqIGVycm5vIHdoZW4gdGhlIHdhbGsgYWJvcnRlZCwgZWxzZSAwLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcmVtb3RlX3ZtX3dhbGsoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLAomIzQzOwkJCSAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncywgYm9vbCBjYW5fZXhwYW5kX3N0YWNrLAomIzQzOwkJCSAgcmVtb3RlX3ZtX2FjdGlvbiBhY3Rpb24sIGludCAqZXJyKQogewogCXZvaWQgKm9sZF9idWYgPSBidWY7CiAJaW50IHdyaXRlID0gZ3VwX2ZsYWdzICZhbXA7IEZPTExfV1JJVEU7CiYjNDM7CWJvb2wgaGF2ZV9tbWFwX2xvY2s7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCi0JaWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkKLQkJcmV0dXJuIDA7CiYjNDM7CSplcnIgPSAwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTZXQgRk9MTF9SRU1PVEUgc28gY2hlY2tfdm1hX2ZsYWdzKCkgYXBwbGllcyB0aGUgc2FtZSBwcm90ZWN0aW9uIGtleQomIzQzOwkgKiBydWxlcyBhcyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoKSBkaWQ6IHRoZSBjdXJyZW50IFBLUlUgaXMgbm90IGNoZWNrZWQKJiM0MzsJICogYWdhaW5zdCBhIFZNQSByZWFjaGVkIG9uIEBtbSYjMzk7cyBiZWhhbGYuCiYjNDM7CSAqLwomIzQzOwlndXBfZmxhZ3MgfD0gRk9MTF9SRU1PVEU7CiAKLQkvKiBVbnRhZyB0aGUgYWRkcmVzcyBiZWZvcmUgbG9va2luZyB1cCB0aGUgVk1BICovCi0JYWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTsKJiM0MzsJYWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKTsKIAotCS8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi8KLQlpZiAoIXZtYV9sb29rdXAobW0sIGFkZHIpICZhbXA7JmFtcDsgIWV4cGFuZF9zdGFjayhtbSwgYWRkcikpCiYjNDM7CWhhdmVfbW1hcF9sb2NrID0gcmVtb3RlX2FjY2Vzc19sb2NrKG1tLCBhZGRyLCBsZW4sIGd1cF9mbGFncywgJmFtcDt2bWEpOwomIzQzOwlpZiAoSVNfRVJSKHZtYSkpIHsKJiM0MzsJCSplcnIgPSAtRUZBVUxUOwogCQlyZXR1cm4gMDsKJiM0MzsJfQogCi0JLyogaWdub3JlIGVycm9ycywganVzdCBjaGVjayBob3cgbXVjaCB3YXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkICovCiAJd2hpbGUgKGxlbikgewotCQlpbnQgYnl0ZXMsIG9mZnNldDsKLQkJdm9pZCAqbWFkZHI7Ci0JCXN0cnVjdCBmb2xpbyAqZm9saW87Ci0JCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsCi0JCQkJCQkJICAgICBndXBfZmxhZ3MsICZhbXA7dm1hKTsKJiM0MzsJCXVuc2lnbmVkIGludCBmb2xsX2ZsYWdzID0gZ3VwX2ZsYWdzOwomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CQlpbnQgcmV0OwogCi0JCWlmIChJU19FUlIocGFnZSkpIHsKLQkJCS8qIFdlIG1pZ2h0IG5lZWQgdG8gZXhwYW5kIHRoZSBzdGFjayB0byBhY2Nlc3MgaXQgKi8KJiM0MzsJCWlmICghdm1hIHx8IGFkZHIgJmd0Oz0gdm1hLSZndDt2bV9lbmQpIHsKJiM0MzsJCQkvKiBBbnkgbG9va3VwIGhlcmUgaG9sZHMgdGhlIG1tYXAgbG9jay4gKi8KJiM0MzsJCQlWTV9CVUdfT04oIWhhdmVfbW1hcF9sb2NrKTsKIAkJCXZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpOwotCQkJaWYgKCF2bWEpIHsKJiM0MzsJCQlpZiAoIXZtYSAmYW1wOyZhbXA7IGNhbl9leHBhbmRfc3RhY2spIHsKJiM0MzsJCQkJLyogZXhwYW5kX3N0YWNrKCkgZHJvcHMgdGhlIG1tYXAgbG9jayBpZiBpdCBmYWlscyAqLwogCQkJCXZtYSA9IGV4cGFuZF9zdGFjayhtbSwgYWRkcik7Ci0KLQkJCQkvKiBtbWFwX2xvY2sgd2FzIGRyb3BwZWQgb24gZmFpbHVyZSAqLwogCQkJCWlmICghdm1hKQotCQkJCQlyZXR1cm4gYnVmIC0gb2xkX2J1ZjsKLQotCQkJCS8qIFRyeSBhZ2FpbiBpZiBzdGFjayBleHBhbnNpb24gd29ya2VkICovCi0JCQkJY29udGludWU7CiYjNDM7CQkJCQloYXZlX21tYXBfbG9jayA9IGZhbHNlOwomIzQzOwkJCX0KJiM0MzsJCQlpZiAoIXZtYSkgewomIzQzOwkJCQkqZXJyID0gLUVGQVVMVDsKJiM0MzsJCQkJYnJlYWs7CiAJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogRk9MTF9VTkxPQ0tBQkxFIGxldHMgdGhlIHBlci1WTUEgZmF1bHQgcmV0cnksIGRyb3BwaW5nIHRoZQomIzQzOwkJICogbG9jaywgc28gdGhlIHdhbGsgY2FuIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIWhhdmVfbW1hcF9sb2NrKQomIzQzOwkJCWZvbGxfZmxhZ3MgfD0gRk9MTF9WTUFfTE9DSyB8IEZPTExfVU5MT0NLQUJMRTsKIAomIzQzOwkJcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hKHZtYSwgYWRkciwgZm9sbF9mbGFncyk7CiYjNDM7CQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQkvKgotCQkJICogQ2hlY2sgaWYgdGhpcyBpcyBhIFZNX0lPIHwgVk1fUEZOTUFQIFZNQSwgd2hpY2gKLQkJCSAqIHdlIGNhbiBhY2Nlc3MgdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUuCiYjNDM7CQkJICogZ2V0X3VzZXJfcGFnZV92bWEoKSByZXR1cm5zIC1FQUdBSU4sIHdpdGggdGhlIHBlci1WTUEKJiM0MzsJCQkgKiBsb2NrIHJlbGVhc2VkLCBmb3IgYW55dGhpbmcgaXQgY291bGQgbm90IGZpbmlzaCB1bmRlcgomIzQzOwkJCSAqIGl0OyByZXRha2UgdGhlIG1tYXAgbG9jayBhbmQgcmV0cnkuIEEgZGlmZmVyZW50IGVycm9yCiYjNDM7CQkJICogdGhlcmVmb3JlIG9ubHkgYXJyaXZlcyB1bmRlciB0aGUgbW1hcCBsb2NrLCB3aGVyZQomIzQzOwkJCSAqIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IGNhbiBiZSByZWFjaGVkIHZpYSAtJmd0O2FjY2VzcygpLgogCQkJICovCi0JCQlieXRlcyA9IDA7Ci0jaWZkZWYgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UCi0JCQlpZiAodm1hLSZndDt2bV9vcHMgJmFtcDsmYW1wOyB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKQotCQkJCWJ5dGVzID0gdm1hLSZndDt2bV9vcHMtJmd0O2FjY2Vzcyh2bWEsIGFkZHIsIGJ1ZiwKLQkJCQkJCQkgICAgbGVuLCB3cml0ZSk7Ci0jZW5kaWYKLQkJCWlmIChieXRlcyAmbHQ7PSAwKQotCQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQkJYnl0ZXMgPSBsZW47Ci0JCQlvZmZzZXQgPSBhZGRyICZhbXA7IChQQUdFX1NJWkUtMSk7Ci0JCQlpZiAoYnl0ZXMgJmd0OyBQQUdFX1NJWkUtb2Zmc2V0KQotCQkJCWJ5dGVzID0gUEFHRV9TSVpFLW9mZnNldDsKLQotCQkJbWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpOwotCQkJaWYgKHdyaXRlKSB7Ci0JCQkJY29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLAotCQkJCQkJICBtYWRkciAmIzQzOyBvZmZzZXQsIGJ1ZiwgYnl0ZXMpOwotCQkJCWZvbGlvX21hcmtfZGlydHlfbG9jayhmb2xpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLAotCQkJCQkJICAgIGJ1ZiwgbWFkZHIgJiM0Mzsgb2Zmc2V0LCBieXRlcyk7CiYjNDM7CQkJaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVBR0FJTikgewomIzQzOwkJCQl2bWEgPSBOVUxMOwomIzQzOwkJCQlpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKSB7CiYjNDM7CQkJCQkqZXJyID0gLUVGQVVMVDsKJiM0MzsJCQkJCWJyZWFrOwomIzQzOwkJCQl9CiYjNDM7CQkJCWhhdmVfbW1hcF9sb2NrID0gdHJ1ZTsKJiM0MzsJCQkJY29udGludWU7CiAJCQl9Ci0JCQlmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTsKJiM0MzsJCQlpZiAoV0FSTl9PTl9PTkNFKCFoYXZlX21tYXBfbG9jaykpCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCXBhZ2UgPSBOVUxMOwomIzQzOwkJfQomIzQzOwomIzQzOwkJcmV0ID0gYWN0aW9uKHZtYSwgcGFnZSwgYWRkciwgJmFtcDtidWYsIGxlbiwgd3JpdGUpOwomIzQzOwkJaWYgKHJldCAmbHQ7PSAwKSB7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJCSplcnIgPSByZXQ7CiYjNDM7CQkJYnJlYWs7CiAJCX0KLQkJbGVuIC09IGJ5dGVzOwotCQlidWYgJiM0Mzs9IGJ5dGVzOwotCQlhZGRyICYjNDM7PSBieXRlczsKJiM0MzsJCWFkZHIgJiM0Mzs9IHJldDsKJiM0MzsJCWxlbiAtPSByZXQ7CiAJfQotCW1tYXBfcmVhZF91bmxvY2sobW0pOwomIzQzOwomIzQzOwlyZW1vdGVfYWNjZXNzX3VubG9jayhtbSwgdm1hLCBoYXZlX21tYXBfbG9jayk7CiAKIAlyZXR1cm4gYnVmIC0gb2xkX2J1ZjsKIH0KIAomIzQzOy8qCiYjNDM7ICogQ29weSBvbmUgcGFnZSYjMzk7cyB3b3J0aCBvZiBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pIHRvIG9yIGZyb20gKkBidWYuIFJlYWNoZXMKJiM0MzsgKiBzdHJ1Y3QtcGFnZS1sZXNzIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeSB0aHJvdWdoIHZtYS0mZ3Q7dm1fb3BzLSZndDthY2Nlc3MoKS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKJiM0MzsJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKQomIzQzO3sKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJaW50IGJ5dGVzLCBvZmZzZXQ7CiYjNDM7CXZvaWQgKm1hZGRyOwomIzQzOwomIzQzOwlpZiAoIXBhZ2UpIHsKJiM0MzsJCWJ5dGVzID0gYWNjZXNzX3JlbW90ZV92bWFfb3BzKHZtYSwgYWRkciwgKmJ1ZiwgbGVuLCB3cml0ZSk7CiYjNDM7CQlpZiAoYnl0ZXMgJmd0OyAwKQomIzQzOwkJCSpidWYgJiM0Mzs9IGJ5dGVzOwomIzQzOwkJcmV0dXJuIGJ5dGVzOwomIzQzOwl9CiYjNDM7CiYjNDM7CWJ5dGVzID0gbGVuOwomIzQzOwlvZmZzZXQgPSBhZGRyICZhbXA7IChQQUdFX1NJWkUgLSAxKTsKJiM0MzsJaWYgKGJ5dGVzICZndDsgUEFHRV9TSVpFIC0gb2Zmc2V0KQomIzQzOwkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CiYjNDM7CiYjNDM7CWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKJiM0MzsJbWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpOwomIzQzOwlpZiAod3JpdGUpIHsKJiM0MzsJCWNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgbWFkZHIgJiM0Mzsgb2Zmc2V0LCAqYnVmLCBieXRlcyk7CiYjNDM7CQlmb2xpb19tYXJrX2RpcnR5X2xvY2soZm9saW8pOwomIzQzOwl9IGVsc2UgewomIzQzOwkJY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsICpidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpOwomIzQzOwl9CiYjNDM7CWZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpOwomIzQzOwomIzQzOwkqYnVmICYjNDM7PSBieXRlczsKJiM0MzsJcmV0dXJuIGJ5dGVzOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiYjNDM7CQkJICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKQomIzQzO3sKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCB0cnVlLAomIzQzOwkJCSAgICAgIGFjY2Vzc192bV9wYWdlLCAmYW1wO2Vycik7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBhY2Nlc3NfcmVtb3RlX3ZtIC0gYWNjZXNzIGFub3RoZXIgcHJvY2VzcyYjMzk7IGFkZHJlc3Mgc3BhY2UKICAqIEBtbToJCXRoZSBtbV9zdHJ1Y3Qgb2YgdGhlIHRhcmdldCBhZGRyZXNzIHNwYWNlCkBAIC03MTM4LDg0ICYjNDM7NzI5Niw2NyBAQCBFWFBPUlRfU1lNQk9MX0dQTChhY2Nlc3NfcHJvY2Vzc192bSk7CiAKICNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTEwKIC8qCi0gKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJiMzOTtzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uCi0gKiBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgcmV0dXJuIC1FRkFVTFQuCiYjNDM7ICogQ29weSBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIEBhZGRyIGludG8gKkBidWYsIHVwIHRvIEBsZW4gYnl0ZXMsCiYjNDM7ICogc3RvcHBpbmcgYXQgdGhlIE5VTC4gc3Ryc2NweSgpIGFsd2F5cyBOVUwgdGVybWluYXRlcywgc28gcmVjb3B5IHRoZSBsYXN0CiYjNDM7ICogYnl0ZSBvZiBhIHBhZ2Ugd2hlbiBtb3JlIHBhZ2VzIGZvbGxvdy4gQSBzdHJpbmcgaXMgbmV2ZXIgcmVhZCBmcm9tCiYjNDM7ICogc3RydWN0LXBhZ2UtbGVzcyBWTV9JTyAvIFZNX1BGTk1BUCBtZW1vcnkuCiAgKi8KLXN0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQl2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpCiYjNDM7c3RhdGljIGludCBjb3B5X3ZtX3N0cihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiYjNDM7CQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpCiB7Ci0Jdm9pZCAqb2xkX2J1ZiA9IGJ1ZjsKLQlpbnQgZXJyID0gMDsKLQotCSooY2hhciAqKWJ1ZiA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJaW50IGJ5dGVzLCBvZmZzZXQsIHJldHZhbDsKJiM0MzsJdm9pZCAqbWFkZHI7CiAKLQlpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKQomIzQzOwlpZiAoIXBhZ2UpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JYWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTsKJiM0MzsJYnl0ZXMgPSBsZW47CiYjNDM7CW9mZnNldCA9IGFkZHIgJmFtcDsgKFBBR0VfU0laRSAtIDEpOwomIzQzOwlpZiAoYnl0ZXMgJmd0OyBQQUdFX1NJWkUgLSBvZmZzZXQpCiYjNDM7CQlieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDsKIAotCS8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi8KLQlpZiAoIXZtYV9sb29rdXAobW0sIGFkZHIpKSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OwomIzQzOwlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CW1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTsKJiM0MzsJcmV0dmFsID0gc3Ryc2NweSgqYnVmLCBtYWRkciAmIzQzOyBvZmZzZXQsIGJ5dGVzKTsKJiM0MzsJaWYgKHJldHZhbCAmZ3Q7PSAwKSB7CiYjNDM7CQkvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICovCiYjNDM7CQkqYnVmICYjNDM7PSByZXR2YWw7CiYjNDM7CQlmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTsKJiM0MzsJCXJldHVybiAwOwogCX0KIAotCXdoaWxlIChsZW4pIHsKLQkJaW50IGJ5dGVzLCBvZmZzZXQsIHJldHZhbDsKLQkJdm9pZCAqbWFkZHI7Ci0JCXN0cnVjdCBmb2xpbyAqZm9saW87Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwotCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CiYjNDM7CSpidWYgJiM0Mzs9IGJ5dGVzIC0gMTsKJiM0MzsJaWYgKGJ5dGVzICE9IGxlbikgewomIzQzOwkJY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIgJiM0MzsgYnl0ZXMgLSAxLCAqYnVmLAomIzQzOwkJCQkgICAgbWFkZHIgJiM0MzsgKFBBR0VfU0laRSAtIDEpLCAxKTsKJiM0MzsJCSpidWYgJiM0Mzs9IDE7CiYjNDM7CX0KJiM0MzsJZm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7CiAKLQkJcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgYWRkciwgZ3VwX2ZsYWdzLCAmYW1wO3ZtYSk7Ci0JCWlmIChJU19FUlIocGFnZSkpIHsKLQkJCS8qCi0JCQkgKiBUcmVhdCBhcyBhIHRvdGFsIGZhaWx1cmUgZm9yIG5vdyB1bnRpbCB3ZSBkZWNpZGUgaG93Ci0JCQkgKiB0byBoYW5kbGUgdGhlIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBjYXNlIGFuZAotCQkJICogc3RhY2sgZXhwYW5zaW9uLgotCQkJICovCi0JCQkqKGNoYXIgKilidWYgPSAmIzM5O1wwJiMzOTs7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KJiM0MzsJcmV0dXJuIGJ5dGVzOwomIzQzO30KIAotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCWJ5dGVzID0gbGVuOwotCQlvZmZzZXQgPSBhZGRyICZhbXA7IChQQUdFX1NJWkUgLSAxKTsKLQkJaWYgKGJ5dGVzICZndDsgUEFHRV9TSVpFIC0gb2Zmc2V0KQotCQkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7Ci0KLQkJbWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpOwotCQlyZXR2YWwgPSBzdHJzY3B5KGJ1ZiwgbWFkZHIgJiM0Mzsgb2Zmc2V0LCBieXRlcyk7Ci0JCWlmIChyZXR2YWwgJmd0Oz0gMCkgewotCQkJLyogRm91bmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0JCQlidWYgJiM0Mzs9IHJldHZhbDsKLQkJCWZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpOwotCQkJYnJlYWs7Ci0JCX0KJiM0MzsvKgomIzQzOyAqIENvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MmIzM5O3MgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS4KJiM0MzsgKiBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgcmV0dXJuIC1FRkFVTFQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2NvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQl2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpCiYjNDM7ewomIzQzOwlpbnQgYnl0ZXMsIGVycjsKIAotCQlidWYgJiM0Mzs9IGJ5dGVzIC0gMTsKLQkJLyoKLQkJICogQmVjYXVzZSBzdHJzY3B5IGFsd2F5cyBOVUwgdGVybWluYXRlcyB3ZSBuZWVkIHRvCi0JCSAqIGNvcHkgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgcGFnZSBpZiB3ZSBhcmUgZ29pbmcgdG8KLQkJICogbG9hZCBtb3JlIHBhZ2VzCi0JCSAqLwotCQlpZiAoYnl0ZXMgIT0gbGVuKSB7Ci0JCQlhZGRyICYjNDM7PSBieXRlcyAtIDE7Ci0JCQljb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgYnVmLCBtYWRkciAmIzQzOyAoUEFHRV9TSVpFIC0gMSksIDEpOwotCQkJYnVmICYjNDM7PSAxOwotCQkJYWRkciAmIzQzOz0gMTsKLQkJfQotCQlsZW4gLT0gYnl0ZXM7CiYjNDM7CSooY2hhciAqKWJ1ZiA9ICYjMzk7XDAmIzM5OzsKIAotCQlmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTsKJiM0MzsJYnl0ZXMgPSByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgZmFsc2UsCiYjNDM7CQkJICAgICAgIGNvcHlfdm1fc3RyLCAmYW1wO2Vycik7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCS8qIFRoZSBjb250cmFjdCBndWFyYW50ZWVzIGEgdGVybWluYXRlZCBidWZmZXIgZXZlbiBvbiBlcnJvci4gKi8KJiM0MzsJCSgoY2hhciAqKWJ1ZilbYnl0ZXNdID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJcmV0dXJuIGVycjsKIAl9CiAKLW91dDoKLQltbWFwX3JlYWRfdW5sb2NrKG1tKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiBidWYgLSBvbGRfYnVmOwomIzQzOwlyZXR1cm4gYnl0ZXM7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDFjNzdkNWRjMDZlOWZhLi5iMzZmMmUyMTliOGY0OSAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3JtYXAuYwpAQCAtMjgzOCw3ICYjNDM7MjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkgKiAobm9uLWRldmljZS1leGNsdXNpdmUpIFBURSBhbmQgaXNzdWUgYSBNTVVfTk9USUZZX0VYQ0xVU0lWRS4KIAkgKi8KIHJldHJ5OgotCXBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsCiYjNDM7CXBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIGFkZHIsCiAJCQkJCUZPTExfR0VUIHwgRk9MTF9XUklURSB8IEZPTExfU1BMSVRfUE1ELAogCQkJCQkmYW1wO3ZtYSk7CiAJaWYgKElTX0VSUihwYWdlKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUKaW5kZXggZTZkZjk2OGYwOTcxYzguLjZiOTE3YTRmNzNlMDBmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQpAQCAtODMsNiAmIzQzOzgzLDcgQEAgVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1yZWxlYXNlX3Rlc3QKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBtcmVtYXBfZG9udHVubWFwCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbXJlbWFwX3Rlc3QKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBtc2VhbF90ZXN0CiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IG10aHBfZ3VwX2Nvd190ZXN0CiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gb24tZmF1bHQtbGltaXQKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBwYWdlbWFwX2lvY3RsCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcGZubWFwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbXRocF9ndXBfY293X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJlZTMyOWQ4NjQxYzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDIxMyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKgomIzQzOyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtJmd0OyBmb2xsb3dfcGFnZV9tYXNrIC0mZ3Q7CiYjNDM7ICogZm9sbG93X3B0ZV9iYXRjaCkgcmV0dXJucyB0aGUgY29ycmVjdCBwYWdlcyBmb3IgYSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvCiYjNDM7ICogKG1USFApLCBpbmNsdWRpbmcgdGhhdCBDT1cgY29waWVzIHByb2R1Y2UgdGhlIHJpZ2h0IGNvbnRlbnQuCiYjNDM7ICoKJiM0MzsgKiBVc2VzIHRoZSBDT05GSUdfR1VQX1RFU1QgUElOX0xPTkdURVJNIGludGVyZmFjZTogU1RBUlQgcGlucyBhIHJhbmdlIG9uIHRoZQomIzQzOyAqIHNsb3cgcGF0aCwgUkVBRCBjb3BpZXMgdGhlIHBpbm5lZCBwYWdlcyYjMzk7IGJ5dGVzIGJhY2sgc28gd2UgY2FuIGNvbXBhcmUgdGhlbQomIzQzOyAqIGFnYWluc3QgdGhlIHBhdHRlcm4gd2Ugd3JvdGUuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGludC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBBUlJBWV9TSVpFKGEpCShzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKJiM0MzsKJiM0MzsjZGVmaW5lIEdVUF9ERVYgJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVAlfSU9XKCYjMzk7ZyYjMzk7LCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpCiYjNDM7I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QCV9JTygmIzM5O2cmIzM5OywgOCkKJiM0MzsjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1JFQUQJX0lPVygmIzM5O2cmIzM5OywgOSwgX191NjQpCiYjNDM7I2RlZmluZSBVU0VfV1JJVEUJMQomIzQzOyNkZWZpbmUgVVNFX0ZBU1QJMgomIzQzOwomIzQzO3N0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCB7CiYjNDM7CV9fdTY0IGFkZHI7CiYjNDM7CV9fdTY0IHNpemU7CiYjNDM7CV9fdTMyIGZsYWdzOwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBPUkRFUl9LQgk2NAomIzQzOyNkZWZpbmUgTlJfRk9MSU9TCTE2CiYjNDM7I2RlZmluZSBSRUdJT04JCSgoc2l6ZV90KU9SREVSX0tCICogMTAyNCAqIE5SX0ZPTElPUykKJiM0MzsKJiM0MztzdGF0aWMgbG9uZyBQUzsKJiM0MztzdGF0aWMgaW50IGZhaWxzOwomIzQzO3N0YXRpYyBpbnQgdGFwOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9rKGludCBjb25kLCBjb25zdCBjaGFyICpkZXNjKQomIzQzO3sKJiM0MzsJcHJpbnRmKCYjMzQ7JXMgJWQgJXNcbiYjMzQ7LCBjb25kID8gJiMzNDtvayYjMzQ7IDogJiMzNDtub3Qgb2smIzM0OywgJiM0MzsmIzQzO3RhcCwgZGVzYyk7CiYjNDM7CWlmICghY29uZCkKJiM0MzsJCWZhaWxzJiM0MzsmIzQzOzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRGV0ZXJtaW5pc3RpYywgcGVyLXBhZ2UtZGlzdGluY3QgcGF0dGVybiBzbyBhbnkgbWlzLW9yZGVyIG9yIGxlYWsgc2hvd3MuICovCiYjNDM7c3RhdGljIHZvaWQgZmlsbChjaGFyICpiYXNlLCBzaXplX3Qgc3osIHVpbnQzMl90IHNhbHQpCiYjNDM7ewomIzQzOwlmb3IgKHNpemVfdCBvZmYgPSAwOyBvZmYgJmx0OyBzejsgb2ZmICYjNDM7PSBQUykgewomIzQzOwkJdWludDMyX3QgayA9IG9mZiAvIFBTOwomIzQzOwkJdWludDY0X3QgdiA9ICgodWludDY0X3Qpc2FsdCAmbHQ7Jmx0OyAzMikgXiAoayAqIDB4OUUzNzc5QjF1ICYjNDM7IDB4MTIzNCk7CiYjNDM7CiYjNDM7CQlmb3IgKHNpemVfdCBpID0gMDsgaSAmbHQ7IFBTOyBpICYjNDM7PSBzaXplb2YodikpCiYjNDM7CQkJbWVtY3B5KGJhc2UgJiM0Mzsgb2ZmICYjNDM7IGksICZhbXA7diwgc2l6ZW9mKHYpKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdzeXNmcyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICp2YWwpCiYjNDM7ewomIzQzOwlpbnQgZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaW50IHIgPSB3cml0ZShmZCwgdmFsLCBzdHJsZW4odmFsKSk7CiYjNDM7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHIgJmx0OyAwID8gLTEgOiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBGb3JjZSBzdWItUE1EIDY0a0IgbVRIUCBvbmx5LCBzbyBmYXVsdHMgcHJvZHVjZSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcy4gKi8KJiM0MztzdGF0aWMgdm9pZCBzZXR1cF9tdGhwKHZvaWQpCiYjNDM7ewomIzQzOwljb25zdCBjaGFyICp0aHAgPSAmIzM0Oy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlJiMzNDs7CiYjNDM7CWNoYXIgcFsyNTZdOwomIzQzOwlzdGF0aWMgY29uc3QgaW50IGtiW10gPSB7IDE2LCAzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDggfTsKJiM0MzsKJiM0MzsJd3N5c2ZzKCYjMzQ7L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZCYjMzQ7LCAmIzM0O25ldmVyJiMzNDspOwomIzQzOwlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoa2IpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc25wcmludGYocCwgc2l6ZW9mKHApLCAmIzM0OyVzL2h1Z2VwYWdlcy0lZGtCL2VuYWJsZWQmIzM0OywgdGhwLCBrYltpXSk7CiYjNDM7CQl3c3lzZnMocCwga2JbaV0gPT0gT1JERVJfS0IgPyAmIzM0O2Fsd2F5cyYjMzQ7IDogJiMzNDtuZXZlciYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBDb3VudCBob3cgbWFueSBwYWdlcyBzaXQgaW4gYSBjb250aWd1b3VzICZndDs9T1JERVJfS0IgUEZOIHJ1biAodmlhIHBhZ2VtYXApLiAqLwomIzQzO3N0YXRpYyBpbnQgY291bnRfbGFyZ2VfcGFnZXMoY2hhciAqYmFzZSwgc2l6ZV90IHN6KQomIzQzO3sKJiM0MzsJaW50IHBtID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CXNpemVfdCBuID0gc3ogLyBQUywgbGFyZ2UgPSAwOwomIzQzOwl1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7CiYjNDM7CiYjNDM7CWlmIChwbSAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWZvciAoc2l6ZV90IGsgPSAwOyBrICZsdDsgbjsgayYjNDM7JiM0MzspIHsKJiM0MzsJCXVpbnQ2NF90IGVudDsKJiM0MzsJCW9mZl90IGlkeCA9ICgodWludHB0cl90KWJhc2UgJiM0MzsgayAqIFBTKSAvIFBTICogc2l6ZW9mKGVudCk7CiYjNDM7CiYjNDM7CQlpZiAocHJlYWQocG0sICZhbXA7ZW50LCBzaXplb2YoZW50KSwgaWR4KSAhPSBzaXplb2YoZW50KSB8fAomIzQzOwkJICAgICEoZW50ICZhbXA7ICgxVUxMICZsdDsmbHQ7IDYzKSkpCiYjNDM7CQkJcGZuW2tdID0gMDsKJiM0MzsJCWVsc2UKJiM0MzsJCQlwZm5ba10gPSBlbnQgJmFtcDsgKCgxVUxMICZsdDsmbHQ7IDU1KSAtIDEpOwomIzQzOwl9CiYjNDM7CWNsb3NlKHBtKTsKJiM0MzsJZm9yIChzaXplX3QgayA9IDA7IGsgJmx0OyBuOyBrJiM0MzsmIzQzOykKJiM0MzsJCWlmIChrICYjNDM7IDEgJmx0OyBuICZhbXA7JmFtcDsgcGZuW2tdICZhbXA7JmFtcDsgcGZuW2sgJiM0MzsgMV0gPT0gcGZuW2tdICYjNDM7IDEpCiYjNDM7CQkJbGFyZ2UmIzQzOyYjNDM7OwomIzQzOwlmcmVlKHBmbik7CiYjNDM7CXJldHVybiBsYXJnZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGluIEBiYXNlLi5Ac3ogb24gdGhlIHNsb3cgcGF0aCwgcmVhZCB0aGUgcGlubmVkIGJ5dGVzIGJhY2ssIGNvbXBhcmUgdG8gZXhwLiAqLwomIzQzO3N0YXRpYyBpbnQgcGluX3ZlcmlmeShpbnQgZmQsIGNoYXIgKmJhc2UsIHNpemVfdCBzeiwgdWludDMyX3Qgd3IsIGNoYXIgKmV4cCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCBhID0gewomIzQzOwkJLmFkZHIgPSAodWludHB0cl90KWJhc2UsIC5zaXplID0gc3osCiYjNDM7CQkuZmxhZ3MgPSB3ciA/IFVTRV9XUklURSA6IDAsCQkvKiBVU0VfRkFTVCB1bnNldCA9Jmd0OyBzbG93ICovCiYjNDM7CX07CiYjNDM7CWNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkJIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOwomIzQzOwlfX3U2NCBnYSA9ICh1aW50cHRyX3QpZ290OwomIzQzOwlpbnQgcmMgPSAtMTsKJiM0MzsKJiM0MzsJaWYgKGdvdCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAoaW9jdGwoZmQsIFBJTl9MT05HVEVSTV9URVNUX1NUQVJULCAmYW1wO2EpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtTVEFSVCglcykgZmFpbGVkOiAlc1xuJiMzNDssCiYjNDM7CQkJd3IgPyAmIzM0O3dyaXRlJiMzNDsgOiAmIzM0O3JlYWQmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlmIChpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfUkVBRCwgJmFtcDtnYSkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O1JFQUQgZmFpbGVkOiAlc1xuJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQlpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7CiYjNDM7CXJjID0gbWVtY21wKGdvdCwgZXhwLCBzeikgPyAxIDogMDsKJiM0MztvdXQ6CiYjNDM7CW11bm1hcChnb3QsIHN6KTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJUFMgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CXNldHVwX210aHAoKTsKJiM0MzsKJiM0MzsJaW50IGZkID0gb3BlbihHVVBfREVWLCBPX1JEV1IpOwomIzQzOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtvcGVuICVzOiAlcyAoQ09ORklHX0dVUF9URVNUPylcbiYjMzQ7LAomIzQzOwkJCUdVUF9ERVYsIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQlyZXR1cm4gMjsKJiM0MzsJfQomIzQzOwomIzQzOwljaGFyICpyID0gbW1hcChOVUxMLCBSRUdJT04sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChyID09IE1BUF9GQUlMRUQpIHsKJiM0MzsJCXBlcnJvcigmIzM0O21tYXAmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gMjsKJiM0MzsJfQomIzQzOwlmaWxsKHIsIFJFR0lPTiwgMHhBMSk7CQkJCS8qIHBhdHRlcm4gUCAqLwomIzQzOwljaGFyICpleHBQID0gbWFsbG9jKFJFR0lPTik7CiYjNDM7CiYjNDM7CW1lbWNweShleHBQLCByLCBSRUdJT04pOwomIzQzOwomIzQzOwlpbnQgbGFyZ2UgPSBjb3VudF9sYXJnZV9wYWdlcyhyLCBSRUdJT04pOwomIzQzOwomIzQzOwlwcmludGYoJiMzNDsjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcbiYjMzQ7LAomIzQzOwkgICAgICAgbGFyZ2UsIFJFR0lPTiAvIFBTKTsKJiM0MzsJaWYgKGxhcmdlICZsdDsgKGludCkoUkVHSU9OIC8gUFMpIC8gNCkKJiM0MzsJCXByaW50ZigmIzM0OyMgV0FSTjogbGl0dGxlIG1USFAgYmFja2luZzsgYmF0Y2ggcGF0aCBsaWdodGx5IGNvdmVyZWRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyogQTogcmVhZCBwaW4gb3ZlciB3cml0YWJsZSBtVEhQIC0mZ3Q7IGJhdGNoZXMgLSZndDsgY29udGVudCBtdXN0IGVxdWFsIFAuICovCiYjNDM7CW9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMCwgZXhwUCkgPT0gMCwKJiM0MzsJICAgJiMzNDtzbG93IHJlYWQtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzJiMzNDspOwomIzQzOwomIzQzOwkvKiBCOiB3cml0ZSBwaW4gLSZndDsgRk9MTF9XUklURSBiYXRjaCBwYXRoIC0mZ3Q7IGNvbnRlbnQgbXVzdCBlcXVhbCBQLiAqLwomIzQzOwlvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDEsIGV4cFApID09IDAsCiYjNDM7CSAgICYjMzQ7c2xvdyB3cml0ZS1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHMmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIEM6IENPVyBpc29sYXRpb24uIENoaWxkIHdyaXRlLXBpbnMgKHVuc2hhcmVzKSB0aGVuIHJld3JpdGVzOyBwYXJlbnQgUC4gKi8KJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkID09IDApIHsKJiM0MzsJCWludCBjZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7CiYjNDM7CQlpbnQgYSA9IHBpbl92ZXJpZnkoY2ZkLCByLCBSRUdJT04sIDEsIGV4cFApOwkvKiBDT1cgY29weSA9PSBQICovCiYjNDM7CiYjNDM7CQlmaWxsKHIsIFJFR0lPTiwgMHhCMik7CQkJLyogY2hpbGQgd3JpdGVzIFEgKi8KJiM0MzsJCV9leGl0KGEgPT0gMCA/IDAgOiAxKTsKJiM0MzsJfQomIzQzOwlpbnQgc3QgPSAwOwomIzQzOwomIzQzOwl3YWl0cGlkKHBpZCwgJmFtcDtzdCwgMCk7CiYjNDM7CW9rKFdJRkVYSVRFRChzdCkgJmFtcDsmYW1wOyBXRVhJVFNUQVRVUyhzdCkgPT0gMCwKJiM0MzsJICAgJiMzNDtjaGlsZCB3cml0ZS1waW4gYWZ0ZXIgQ09XIHJldHVybnMgY29ycmVjdCAoY29waWVkKSBjb250ZW50cyYjMzQ7KTsKJiM0MzsJb2sobWVtY21wKHIsIGV4cFAsIFJFR0lPTikgPT0gMCwKJiM0MzsJICAgJiMzNDtwYXJlbnQgY29udGVudHMgaW50YWN0IGFmdGVyIGNoaWxkIENPVyB3cml0ZXMmIzM0Oyk7CiYjNDM7CS8qIEQ6IHBhcmVudCByZWFkLXBpbiBhZ2FpbiBhZnRlciB0aGUgQ09XIHNwbGl0IHN0aWxsIGNvcnJlY3QuICovCiYjNDM7CW9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMCwgZXhwUCkgPT0gMCwKJiM0MzsJICAgJiMzNDtwYXJlbnQgc2xvdyByZWFkLXBpbiBhZnRlciBDT1cgc3RpbGwgY29ycmVjdCYjMzQ7KTsKJiM0MzsKJiM0MzsJcHJpbnRmKCYjMzQ7IyB0b3RhbHM6IHBhc3M6JWQgZmFpbDolZFxuJiMzNDssIHRhcCAtIGZhaWxzLCBmYWlscyk7CiYjNDM7CXJldHVybiBmYWlscyA/IDEgOiAwOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmMKaW5kZXggNGY1NTA4MjIzODVhMjAuLjZmZjVkMTAyOTUxN2UzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuYwpAQCAtMzEsNiAmIzQzOzMxLDcgQEAgc3RhdGljIHNpZ2ptcF9idWYgc2lnam1wX2J1Zl9lbnY7CiBzdGF0aWMgY2hhciAqZmlsZSA9ICYjMzQ7L2Rldi9tZW0mIzM0OzsKIHN0YXRpYyBvZmZfdCBmaWxlX29mZnNldDsKIHN0YXRpYyBpbnQgZmQ7CiYjNDM7c3RhdGljIGludCB0YXJnZXRfaXNfcmFtOwogCiBzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnKQogewpAQCAtMTEzLDYgJiM0MzsxMTQsNyBAQCBzdGF0aWMgdm9pZCBwZm5tYXBfaW5pdCh2b2lkKQogCQlpZiAoZXJyKQogCQkJa3NmdF9leGl0X3NraXAoJiMzNDtDYW5ub3QgZmluZCByYW0gdGFyZ2V0IGluICYjMzk7L3Byb2MvaW9tZW0mIzM5OzogJXNcbiYjMzQ7LAogCQkJCSAgICAgICBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQl0YXJnZXRfaXNfcmFtID0gMTsKIAl9IGVsc2UgewogCQlmaWxlX29mZnNldCA9IDA7CiAJfQpAQCAtMjcxLDYgJiM0MzsyNzMsNzAgQEAgVEVTVF9GKHBmbm1hcCwgZm9yaykKIAlBU1NFUlRfRVEocmV0LCAwKTsKIH0KIAomIzQzO1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpCiYjNDM7ewomIzQzOwljaGFyICpwcml2LCAqYnVmOwomIzQzOwlzc2l6ZV90IHJjOwomIzQzOwlpbnQgbWVtX2ZkOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBBIENPV2VkIHBhZ2UgaW4gYSBWTV9QRk5NQVAgbWFwcGluZyBoYXMgYSBzdHJ1Y3QgcGFnZSwgc28gcmVhZGluZyBpdAomIzQzOwkgKiB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtIC0tIF9fYWNjZXNzX3JlbW90ZV92bSgpIC0mZ3Q7IGdldF91c2VyX3BhZ2Vfdm1hKCkKJiM0MzsJICogLS0gcmV0dXJucyBpdCBkaXJlY3RseSwgaW5zdGVhZCBvZiByb3V0aW5nIHRvIHZtYS0mZ3Q7dm1fb3BzLSZndDthY2Nlc3MoKSwKJiM0MzsJICogd2hpY2ggaW9yZW1hcHMgdGhlIFBGTiBhbmQgY2Fubm90IHJlYWNoIGEgQ09XZWQgUkFNIHBhZ2UuCiYjNDM7CSAqCiYjNDM7CSAqIE1hcCB0aGUgZmlsZSBNQVBfUFJJVkFURSBhbmQgd3JpdGFibGUsIHdyaXRlIHRvIENPVyBhIHBhZ2UgaW50byBhbm9uCiYjNDM7CSAqIG1lbW9yeSwgdGhlbiByZWFkIHRoZSBwYWdlIGJhY2sgdGhyb3VnaCAvcHJvYy9zZWxmL21lbS4KJiM0MzsJICovCiYjNDM7CXNlbGYtJmd0O3NpemUyID0gc2VsZi0mZ3Q7cGFnZXNpemU7CiYjNDM7CXNlbGYtJmd0O2FkZHIyID0gbW1hcChOVUxMLCBzZWxmLSZndDtzaXplMiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkgICBNQVBfUFJJVkFURSwgZmQsIGZpbGVfb2Zmc2V0KTsKJiM0MzsJaWYgKHNlbGYtJmd0O2FkZHIyID09IE1BUF9GQUlMRUQpCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtDYW5ub3QgY3JlYXRlIGEgd3JpdGFibGUgcHJpdmF0ZSBwZm5tYXAgbWFwcGluZyYjMzQ7KTsKJiM0MzsJcHJpdiA9IHNlbGYtJmd0O2FkZHIyOwomIzQzOwomIzQzOwkvKiBDT1cgdGhlIHBhZ2UgYW5kIHN0YW1wIGtub3duIGJ5dGVzIGludG8gdGhlIGFub24gY29weS4gKi8KJiM0MzsJcHJpdlswXSA9IDB4NDI7CiYjNDM7CXByaXZbc2VsZi0mZ3Q7cGFnZXNpemUgLSAxXSA9IDB4MjQ7CiYjNDM7CiYjNDM7CWJ1ZiA9IG1hbGxvYyhzZWxmLSZndDtwYWdlc2l6ZSk7CiYjNDM7CUFTU0VSVF9ORShidWYsIE5VTEwpOwomIzQzOwomIzQzOwltZW1fZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9tZW0mIzM0OywgT19SRE9OTFkpOwomIzQzOwlBU1NFUlRfR0UobWVtX2ZkLCAwKTsKJiM0MzsJcmMgPSBwcmVhZChtZW1fZmQsIGJ1Ziwgc2VsZi0mZ3Q7cGFnZXNpemUsIChvZmZfdCkodWludHB0cl90KXByaXYpOwomIzQzOwljbG9zZShtZW1fZmQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEocmMsIChzc2l6ZV90KXNlbGYtJmd0O3BhZ2VzaXplKTsKJiM0MzsJRVhQRUNUX0VRKGJ1ZlswXSwgMHg0Mik7CiYjNDM7CUVYUEVDVF9FUShidWZbc2VsZi0mZ3Q7cGFnZXNpemUgLSAxXSwgMHgyNCk7CiYjNDM7CiYjNDM7CWZyZWUoYnVmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKHBmbm1hcCwgcHJvY21lbV9wZm5fcmVhZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzY0XTsKJiM0MzsJc3NpemVfdCByYzsKJiM0MzsJaW50IG1lbV9mZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQSByYXcgUEZOIG9mIGEgVk1fSU8vVk1fUEZOTUFQIG1hcHBpbmcgaGFzIG5vIHN0cnVjdCBwYWdlLCBzbwomIzQzOwkgKiBfX2FjY2Vzc19yZW1vdGVfdm0oKSByZWFjaGVzIGl0IHRocm91Z2ggdm1hLSZndDt2bV9vcHMtJmd0O2FjY2VzcygpCiYjNDM7CSAqIChnZW5lcmljX2FjY2Vzc19waHlzKCkpLiBUaGF0IGlvcmVtYXBzIHRoZSBQRk4sIHdoaWNoIGlzIHJlamVjdGVkIGZvcgomIzQzOwkgKiBSQU0sIHNvIHRoaXMgb25seSBhcHBsaWVzIHRvIGdlbnVpbmUgZGV2aWNlIG1lbW9yeS4KJiM0MzsJICovCiYjNDM7CWlmICh0YXJnZXRfaXNfcmFtKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7VGFyZ2V0IGlzIFN5c3RlbSBSQU07IC0mZ3Q7YWNjZXNzKCkgY2Fubm90IGlvcmVtYXAgUkFNJiMzNDspOwomIzQzOwomIzQzOwltZW1fZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9tZW0mIzM0OywgT19SRE9OTFkpOwomIzQzOwlBU1NFUlRfR0UobWVtX2ZkLCAwKTsKJiM0MzsJcmMgPSBwcmVhZChtZW1fZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIChvZmZfdCkodWludHB0cl90KXNlbGYtJmd0O2FkZHIxKTsKJiM0MzsJY2xvc2UobWVtX2ZkKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHJjLCAoc3NpemVfdClzaXplb2YoYnVmKSk7CiYjNDM7fQomIzQzOwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWZvciAoaW50IGkgPSAxOyBpICZsdDsgYXJnYzsgaSYjNDM7JiM0MzspIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKaW5kZXggOGMyOTZkZWRmMDQ3NGQuLmI0OWEzZWIwYzIwNTA4IDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaApAQCAtMjg5LDYgJiM0MzsyODksNyBAQCBmaQogIyBEdW1wIHBhZ2VzIDAsIDE5LCBhbmQgNDA5NiwgdXNpbmcgcGluX3VzZXJfcGFnZXM6CiBDQVRFR09SWT0mIzM0O2d1cF90ZXN0JiMzNDsgcnVuX3Rlc3QgLi9ndXBfdGVzdCAtY3QgLUYgMHgxIDAgMTkgMHgxMDAwCiBDQVRFR09SWT0mIzM0O2d1cF90ZXN0JiMzNDsgcnVuX3Rlc3QgLi9ndXBfbG9uZ3Rlcm0KJiM0MztDQVRFR09SWT0mIzM0O2d1cF90ZXN0JiMzNDsgcnVuX3Rlc3QgLi9tdGhwX2d1cF9jb3dfdGVzdAogCiBDQVRFR09SWT0mIzM0O3VzZXJmYXVsdGZkJiMzNDsgcnVuX3Rlc3QgLi91ZmZkLXVuaXQtdGVzdHMKIHVmZmRfc3RyZXNzX2Jpbj0uL3VmZmQtc3RyZXNzCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNzc3CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogODYwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEdVUCBhbmQgUmVtb3RlIFZNIEFjY2VzcyBQYXRjaCBTZXJpZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIHRoYXQmIzM5O3Mgb3ZlcmhhdWxpbmcgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCBoaXR0aW5nIGBtbS9ndXAuY2AsIGBtbS9tZW1vcnkuY2AsIGFuZCBzb21lIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIGxpa2UgYXJtNjQsIHJpc2N2LCBhbmQgeDg2LiBUaGUgY29yZSBvZiBpdCBzZWVtcyB0byBiZSBhYm91dCByZWZpbmluZyB0aGUgbWVjaGFuaXNtcyBmb3IgR1VQIChHZXQgVXNlciBQYWdlKSBhbmQgcmVtb3RlIFZNIGFjY2Vzcy4KClRoZSBtYWluIGdpc3QgaXMgdGhlIGludHJvZHVjdGlvbiBvZiBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYCwgYW5kIGEgbmV3IGByZW1vdGVfdm1fd2Fsa2AgbWVjaGFuaXNtLCB3aGljaCB3aWxsIGxpa2VseSBhZmZlY3QgdGhlIGVmZmljaWVuY3kgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gV2Ugc2VlIGByZW1vdGVfdm1fd2Fsa2AgYmVpbmcgdXNlZCBieSBgX19hY2Nlc3NfcmVtb3RlX3ZtYCBhbmQgYF9fY29weV9yZW1vdGVfdm1fc3RyYCB0byBtYWtlIGEgbW9yZSBzdHJ1Y3R1cmVkIHdheSB0byBhY2Nlc3MgYW5kIGNvcHkgZGF0YSBiZXR3ZWVuIFZNcy4gIFRoZXkmIzM5O3ZlIGFsc28gYmVlZmVkIHVwIHRoZSBiYXRjaGluZyBmb3IgY29udGlndW91cyBwYWdlcyBpbiBgZm9sbG93X3BhZ2VfbWFza2AgYW5kIGBmb2xsb3dfcGFnZV9wdGVgLCBpbXBvcnRhbnQgZm9yIHRob3NlIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKS4KCkRpdmluZyBpbnRvIGBtbS9ndXAuY2AsIHRoZSBuZXcgYGZvbGxvd19wdGVfYmF0Y2hgIGlzIGEgd2VsY29tZSBhZGRpdGlvbiwgYW5kIHRoZSB1cGRhdGVzIHRvIHRoZSBgZm9sbG93X2h1Z2VfKmAgZnVuY3Rpb25zIHN1Z2dlc3QgYSBmb2N1cyBvbiBtVEhQIHN1cHBvcnQsIG1ha2luZyB0aGVtIHJldHVybiBgbnJfcGFnZXNgLiBJIHNlZSB0aGF0IGBmYXVsdGluX3BhZ2VgIGlzIGdldHRpbmcgYSBiaXQgb2YgbG92ZSB0b28sIGhhbmRsaW5nIGBGT0xMX1ZNQV9MT0NLYC4gIGBnZXRfdXNlcl9wYWdlX3ZtYWAgc291bmRzIGxpa2UgYSBuaWNlIGFic3RyYWN0aW9uIGZvciBnZXR0aW5nIGEgcGFnZSBmcm9tIGEgVk1BLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbnQgbG9ja2luZyBzY2hlbWVzLiBBbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgaXMgdGhlIHJlcGxhY2VtZW50IGZvciBgZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlYCwgd2hpY2ggaXMgYSBrZXkgY2hhbmdlIHRvIHRyYWNrLgoKTm93LCBvdmVyIGluIGBtbS9tZW1vcnkuY2AsIHRoZSBhZGRpdGlvbiBvZiBgYWNjZXNzX3JlbW90ZV92bWFfb3BzYCwgYHJlbW90ZV9hY2Nlc3NfbG9ja2AgYW5kIGByZW1vdGVfYWNjZXNzX3VubG9ja2AgbG9vayBsaWtlIHRoZXkmIzM5O3JlIHNvbGlkaWZ5aW5nIHRoZSByZW1vdGUgVk0gYWNjZXNzIGluZnJhc3RydWN0dXJlLiBUaGUgcmVhbCB3b3JraG9yc2UgaGVyZSBpcyBgcmVtb3RlX3ZtX3dhbGtgLCB3aGljaCBpcyBub3cgdGhlIGNvcmUgbWVjaGFuaXNtIHVzZWQgYnkgYF9fYWNjZXNzX3JlbW90ZV92bWAgKGFsb25nIHdpdGggYGFjY2Vzc192bV9wYWdlYCkgYW5kIGBfX2NvcHlfcmVtb3RlX3ZtX3N0cmAgKHdpdGggYGNvcHlfdm1fc3RyYCkgdG8gbWFrZSB0aGUgb3BlcmF0aW9ucyBtdWNoIG1vcmUgc3RydWN0dXJlZC4KClRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgc2hpZnQgaW4gaG93IHdlIGhhbmRsZSBHVVAgYW5kIHJlbW90ZSBhY2Nlc3MuIFRoaXMgbmVlZHMgc29tZSBzZXJpb3VzIGZ1enppbmcgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcm9jayBzb2xpZC4gSSYjMzk7bSBnb2luZyB0byBrZWVwIGFuIGV5ZSBvbiB0aGVzZSBzeW1ib2xzOiBgZ2V0X3VzZXJfcGFnZV92bWFgLCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCwgYHJlbW90ZV92bV93YWxrYCwgYGFjY2Vzc192bV9wYWdlYCwgYGNvcHlfdm1fc3RyYCwgYGZvbGxvd19wdGVfYmF0Y2hgLCBgZmF1bHRpbl9wYWdlYCwgYF9fYWNjZXNzX3JlbW90ZV92bWAsIGFuZCBgX19jb3B5X3JlbW90ZV92bV9zdHJgLgoKTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbmZpZ3Mgd2UgbmVlZCB0byBrZWVwIGluIG1pbmQuIFNpbmNlIGl0JiMzOTtzIHRvdWNoaW5nIGBtbS9ndXAuY2AgYW5kIGBtbS9tZW1vcnkuY2AsIHRoYXQgbWVhbnMgd2UmIzM5O3JlIGluIGNvcmUgTU0gdGVycml0b3J5LiBJIHNlZSBgQ09ORklHX1BFUl9WTUFfTE9DS2AgaXMgbWVudGlvbmVkIGluIGByZW1vdGVfYWNjZXNzX2xvY2tgLCBhbmQgYENPTkZJR19NTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFYCBpcyBhbm90aGVyIG9uZSB0byBjb25zaWRlci4gQW5kIG9mIGNvdXJzZSwgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZGVmaW5pdGVseSByZWxldmFudCBnaXZlbiB0aGUgY2hhbmdlcyB0byBtVEhQIGFuZCB0aGUgYGZvbGxvd19odWdlXypgIGZ1bmN0aW9ucy4KCkkgdGhpbmsgSSYjMzk7bGwgZW5hYmxlIGBDT05GSUdfUEVSX1ZNQV9MT0NLYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgZHVyaW5nIHRlc3RpbmcsIGp1c3QgdG8gY292ZXIgYWxsIGJhc2VzLiBJJiMzOTtsbCBzZWFyY2ggZm9yIGByZW1vdGVfdm1fd2Fsa2AgaW4gYG1tL21lbW9yeS5jYCB0byBzZWUgaWYgaXQmIzM5O3MgdW5kZXIgYW55IHNwZWNpZmljIGNvbmZpZywgYnV0IGl0IGxvb2tzIGxpa2UgaXQmIzM5O3MgaW4gdGhlIG1haW4gYm9keS4KClRpbWUgdG8gcGVlayBpbnRvIHRoZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgc3R1ZmYuIExvb2tzIGxpa2UgYENPTkZJR19SSVNDVl9JU0FfU1VQTWAgaXMgcmVsZXZhbnQgZm9yIFJJU0MtViBhbmQgYENPTkZJR19BRERSRVNTX01BU0tJTkdgIGZvciB4ODYuCgpBbHJpZ2h0LCBJJiMzOTtsbCBuZWVkIHRvIHJ1biB0aGlzIHRocm91Z2ggc29tZSB2ZXJpZmljYXRpb24gdG9vbHMgdG8gYmUgc3VyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtyZW1vdGVfdm1fd2FsayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTcxMDE9dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vbWVtb3J5LmMtNzExNC0gKi9cbm1tL21lbW9yeS5jOjcxMTU6c3RhdGljIGludCByZW1vdGVfdm1fd2FsayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsXG5tbS9tZW1vcnkuYy03MTE2LVx0XHRcdCAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncywgYm9vbCBjYW5fZXhwYW5kX3N0YWNrLFxuLS1cbm1tL21lbW9yeS5jPTcyNDc9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy03MjUxLVxubW0vbWVtb3J5LmM6NzI1MjpcdHJldHVybiByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgdHJ1ZSxcbm1tL21lbW9yeS5jLTcyNTMtXHRcdFx0ICAgICAgYWNjZXNzX3ZtX3BhZ2UsIFx1MDAyNmVycik7XG4tLVxubW0vbWVtb3J5LmM9NzM0ND1zdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtNzM1MC1cbm1tL21lbW9yeS5jOjczNTE6XHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcbm1tL21lbW9yeS5jLTczNTItXHRcdFx0ICAgICAgIGNvcHlfdm1fc3RyLCBcdTAwMjZlcnIpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1OTI0CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBjb25zaWRlcmF0aW9ucywgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGRlZXBseSBmYW1pbGlhciB3aXRoIGtlcm5lbCBpbnRlcm5hbHM6CgoqKlByaW9yaXRpemluZyBGdXp6aW5nIFRhcmdldHMgaW4gdGhlIFZNIFN1YnN5c3RlbSoqCgpBbHJpZ2h0LCBsb29raW5nIGF0IHRoZSBsYW5kc2NhcGUsIGl0JiMzOTtzIGNsZWFyIHRoYXQgYHJlbW90ZV92bV93YWxrYCwgYGdldF91c2VyX3BhZ2Vfdm1hYCwgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAsIGFuZCBgZm9sbG93X3B0ZV9iYXRjaGAgYXJlIHRoZSByZWFsIHByZXNzdXJlIHBvaW50cyBpbiB0aGUgdmlydHVhbCBtZW1vcnkgc3Vic3lzdGVtLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGFic29sdXRlbHkgY3JpdGljYWwsIHNlcnZpbmcgYXMgdGhlIGdhdGV3YXlzIGZvciB1c2VyLXNwYWNlIGludGVyYWN0aW9ucyBhbmQgcGFnZSB0YWJsZSB0cmF2ZXJzYWwuIFRoZXkmIzM5O3JlIHRoZSBraW5kIG9mIGZ1bmN0aW9ucyB0aGF0LCBpZiB0aGV5IGhhdmUgdnVsbmVyYWJpbGl0aWVzLCBjb3VsZCBsZWFkIHRvIHdpZGVzcHJlYWQgYW5kIGRldmFzdGF0aW5nIGNvbnNlcXVlbmNlcy4gVGhlcmVmb3JlLCB0aGVzZSBhcmUgKmFic29sdXRlbHkqIHRoZSBmdW5jdGlvbnMgdGhhdCBJIHdhbnQgdG8gc3ViamVjdCB0byBpbnRlbnNlIGZ1enppbmcgZWZmb3J0cy4gVGhleSYjMzk7cmUgdGhlIGxvdy1oYW5naW5nIGZydWl0IHdoZXJlIHRoZSByZXdhcmQgaXMgaGlnaCwgYW5kIGJ1Z3MgaGF2ZSB0aGUgcG90ZW50aWFsIGZvciBkcmFtYXRpYyBpbXBhY3QuCgpBbmQgc2luY2Ugd2UgYXJlIHRhbGtpbmcgYWJvdXQgVk0gYW5kIG1lbW9yeS1tYW5hZ2VtZW50LCBJIHNob3VsZCBhbHNvIGNoZWNrIHRob3NlIG9ic2N1cmUgY29uZmlndXJhdGlvbnM6IGBDT05GSUdfUEVSX1ZNQV9MT0NLYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkgYW0gc3VyZSB0aGV5JiMzOTtsbCBhZGQgY29tcGxleGl0eSB0byB0aGUgZnVuY3Rpb25zIEkgbWVudGlvbmVkIGFib3ZlIGFuZCBhcmUgY3JpdGljYWwgcG9pbnRzIGZvciBzZWN1cml0eS4gV2UgbWF5IG5lZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnV6emluZyB2ZWN0b3JzIHRvIHRhcmdldCB0aGVzZSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyBhbmQgZmluZCBtb3JlIGJ1Z3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UEVSX1ZNQV9MT0NLJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTE0MzM9Y29uZmlnIExSVV9HRU5fV0FMS1NfTU1VXG4tLVxubW0vS2NvbmZpZy0xNDM3LVxubW0vS2NvbmZpZzoxNDM4OmNvbmZpZyBBUkNIX1NVUFBPUlRTX1BFUl9WTUFfTE9DS1xubW0vS2NvbmZpZy0xNDM5LSAgICAgICBkZWZfYm9vbCBuXG5tbS9LY29uZmlnLTE0NDAtXG5tbS9LY29uZmlnOjE0NDE6Y29uZmlnIFBFUl9WTUFfTE9DS1xubW0vS2NvbmZpZy0xNDQyLVx0ZGVmX2Jvb2wgeVxubW0vS2NvbmZpZzoxNDQzOlx0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1BFUl9WTUFfTE9DSyBcdTAwMjZcdTAwMjYgTU1VIFx1MDAyNlx1MDAyNiBTTVBcbm1tL0tjb25maWctMTQ0NC1cdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQ3NAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqQ2hlY2tpbmcgdGhlIFZNQSBMb2NraW5nIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgc28gdGhlIHN5c3RlbSBJJiMzOTttIHdvcmtpbmcgd2l0aCBpcyBsaWtlbHkgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IGxldmVyYWdlIGBQRVJfVk1BX0xPQ0tgLCBidXQgb25seSBpZiB0aGUgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIGl0LCB3aGljaCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBUaGUgY29kZSYjMzk7cyBhbHJlYWR5IGhhbmRsaW5nIHRoZSBjb25kaXRpb25hbCBlbmFibGluZyBiYXNlZCBvbiBgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tgLCBzbyB0aGF0JiMzOTtzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGludGVyYWN0cyB3aXRoIHRoZSBvdmVyYWxsIG1lbW9yeSBtYW5hZ2VtZW50IHN0cmF0ZWd5LCBJIG5lZWQgdG8gY29uc2lkZXIgdHJhbnNwYXJlbnQgaHVnZXBhZ2VzLiBMZXQgbWUganVzdCBxdWlja2x5IGNoZWNrIGhvdyBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBzZXQuIFRoYXQmIzM5O2xsIGdpdmUgbWUgYSBjbGVhcmVyIHBpY3R1cmUgb2YgcG90ZW50aWFsIGxvY2sgY29udGVudGlvbiBhbmQgaG93IHRoZXNlIFZNQSBsb2NrcyBhcmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgaHVnZXBhZ2UgYWxsb2NhdGlvbnMuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0aGVzZSB0d28gY29uZmlncyBhZmZlY3QgZWFjaCBvdGhlciBzbyBJIGNhbiBvcHRpbWl6ZSB0aGUgbWVtb3J5IHNldHVwIGZvciB0aGlzIHdvcmtsb2FkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgyNz1jb25maWcgUEVSU0lTVEVOVF9IVUdFX1pFUk9fRk9MSU9cbm1tL0tjb25maWctODI4LVx0Ym9vbCBcJiMzNDtBbGxvY2F0ZSBhIFBNRCBzaXplZCBmb2xpbyBmb3IgemVyb2luZ1wmIzM0O1xubW0vS2NvbmZpZzo4Mjk6XHRkZXBlbmRzIG9uIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTgzMC1cdGhlbHBcbi0tXG5tbS9LY29uZmlnPTg0Mz1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTg0NS1cbm1tL0tjb25maWc6ODQ2Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODQ3LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG5tbS9LY29uZmlnOjg0ODpcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVFxubW0vS2NvbmZpZy04NDktXHRzZWxlY3QgQ09NUEFDVElPTlxuLS1cbm1tL0tjb25maWctODYxLVxubW0vS2NvbmZpZzo4NjI6aWYgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODYzLVxubW0vS2NvbmZpZz04NjQ9Y2hvaWNlXG5tbS9LY29uZmlnLTg2NS1cdHByb21wdCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0IHN5c2ZzIGRlZmF1bHRzXCYjMzQ7XG5tbS9LY29uZmlnOjg2NjpcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg2Ny1cdGhlbHBcbi0tXG5tbS9LY29uZmlnLTg2OS1cbm1tL0tjb25maWc6ODcwOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NzEtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzYtXG5tbS9LY29uZmlnOjg3NzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg3OC1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04ODUtXG5tbS9LY29uZmlnOjg4NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04ODctXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg5Mz1jaG9pY2Vcbm1tL0tjb25maWctODk0LVx0cHJvbXB0IFwmIzM0O1NobWVtIGh1Z2VwYWdlIGFsbG9jYXRpb24gZGVmYXVsdHNcJiMzNDtcbm1tL0tjb25maWc6ODk1Olx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5Ni1cdGhlbHBcbi0tXG5tbS9LY29uZmlnLTkwMi1cbm1tL0tjb25maWc6OTAzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTA0LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTItXG5tbS9LY29uZmlnOjkxMzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MTQtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MjAtXG5tbS9LY29uZmlnOjkyMTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkyMi1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTI4LVxubW0vS2NvbmZpZzo5Mjk6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTMwLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTM4PWNob2ljZVxubW0vS2NvbmZpZy05MzktXHRwcm9tcHQgXCYjMzQ7VG1wZnMgaHVnZXBhZ2UgYWxsb2NhdGlvbiBkZWZhdWx0c1wmIzM0O1xubW0vS2NvbmZpZzo5NDA6XHRkZWZhdWx0IFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTQxLVx0aGVscFxuLS1cbm1tL0tjb25maWctOTQ3LVxubW0vS2NvbmZpZzo5NDg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05NDktXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Ni1cbm1tL0tjb25maWc6OTU3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk1OC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk2NC1cbm1tL0tjb25maWc6OTY1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTY2LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NzItXG5tbS9LY29uZmlnOjk3MzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NzQtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05OTI9Y29uZmlnIE5PX1BBR0VfTUFQQ09VTlRcbi0tXG5tbS9LY29uZmlnLTEwMDQtXG5tbS9LY29uZmlnOjEwMDU6ZW5kaWYgIyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy0xMDA2LVxuLS1cbm1tL0tjb25maWc9MTAxND1jb25maWcgUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVNcbm1tL0tjb25maWc6MTAxNTpcdGRlZl9ib29sIFRSQU5TUEFSRU5UX0hVR0VQQUdFIHx8IEhVR0VUTEJfUEFHRVxubW0vS2NvbmZpZy0xMDE2LVxuLS1cbm1tL0tjb25maWc9MTAyMD1jb25maWcgSEFWRV9HSUdBTlRJQ19GT0xJT1Ncbm1tL0tjb25maWctMTAyMS1cdGRlZl9ib29sIChIVUdFVExCX1BBR0UgXHUwMDI2XHUwMDI2IEFSQ0hfSEFTX0dJR0FOVElDX1BBR0UpIHx8IFxcXG5tbS9LY29uZmlnOjEwMjI6XHRcdCAoWk9ORV9ERVZJQ0UgXHUwMDI2XHUwMDI2IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRV9QVUQpXG5tbS9LY29uZmlnLTEwMjMtXG4tLVxubW0vS2NvbmZpZz0xMDI4PWNvbmZpZyBBUkNIX1NVUFBPUlRTX0hVR0VfUEZOTUFQXG5tbS9LY29uZmlnLTEwMjktXHRkZWZfYm9vbCBuXG5tbS9LY29uZmlnOjEwMzA6XHRkZXBlbmRzIG9uIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTEwMzEtXG5tbS9LY29uZmlnPTEwMzI9Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUE1EX1BGTk1BUFxubW0vS2NvbmZpZy0xMDMzLVx0ZGVmX2Jvb2wgeVxubW0vS2NvbmZpZzoxMDM0Olx0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX0hVR0VfUEZOTUFQIFx1MDAyNlx1MDAyNiBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctMTAzNS1cbm1tL0tjb25maWc9MTAzNj1jb25maWcgQVJDSF9TVVBQT1JUU19QVURfUEZOTUFQXG5tbS9LY29uZmlnLTEwMzctXHRkZWZfYm9vbCB5XG5tbS9LY29uZmlnOjEwMzg6XHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfSFVHRV9QRk5NQVAgXHUwMDI2XHUwMDI2IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRV9QVURcbm1tL0tjb25maWctMTAzOS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODI3MQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEwMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgS2VybmVsIENvbmZpZ3VyYXRpb25zIGFuZCBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBjb25maWc7IHRoYXQgc2VlbXMgbGlrZSBhIHNvbGlkIGFkZGl0aW9uLCBnZW5lcmFsbHkgc3BlYWtpbmcuIEkmIzM5O20gYWxzbyBzZWVpbmcgcmVmZXJlbmNlcyB0byBgR1VQX1RFU1RgIGluIHRoZSBzZWxmdGVzdCBwcm9jZWR1cmUsIGJ1dCB0aGUgYWN0dWFsLCBjb3JlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWxhdGVkIGxvZ2ljIHNlZW1zIHRvIGJlIHJlc2lkaW5nIHdpdGhpbiBgbW0vZ3VwLmNgIGFuZCBgbW0vbWVtb3J5LmNgLiBJJiMzOTtsbCB3YW50IHRvIHF1aWNrbHkgdmVyaWZ5IGlmIHRoZSBgR1VQX1RFU1RgIGRlZmluZSBpcyBhY3R1YWxseSAqcmVxdWlyZWQqIGZvciB0aGUgZnVuY3Rpb25hbGl0eSBpbiB0aG9zZSBjb3JlIGZpbGVzLCBvciBpZiBpdCYjMzk7cyBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgc2VsZi10ZXN0IHByb2NlZHVyZXMuIEhtbSwgaXQgbG9va3MgbGlrZSBpdCBpcyBqdXN0IGZvciB0aGUgc2VsZnRlc3QuCgpOb3csIGxldCYjMzk7cyB0dXJuIG15IGF0dGVudGlvbiB0byBgQ09ORklHX1JJU0NWX0lTQV9TVVBNYC4uLiBJJiMzOTtsbCBuZWVkIHRvIGludmVzdGlnYXRlIHRoYXQgbmV4dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UklTQ1ZfSVNBX1NVUE0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDthcmNoL3Jpc2N2L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9yaXNjdi9LY29uZmlnPTU1Mz1jb25maWcgUklTQ1ZfSVNBX0Ncbi0tXG5hcmNoL3Jpc2N2L0tjb25maWctNTYzLVxuYXJjaC9yaXNjdi9LY29uZmlnOjU2NDpjb25maWcgUklTQ1ZfSVNBX1NVUE1cbmFyY2gvcmlzY3YvS2NvbmZpZy01NjUtXHRib29sIFwmIzM0O1N1cG0gZXh0ZW5zaW9uIGZvciB1c2Vyc3BhY2UgcG9pbnRlciBtYXNraW5nXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4Njc1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipOYXZpZ2F0aW5nIFByb2Nlc3NvciBBcmNoaXRlY3R1cmVzKioKClJpZ2h0LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBSSVNDLVYgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSAoSVNBKSBoZXJlLiBTcGVjaWZpY2FsbHksIGBSSVNDVl9JU0FfU1VQTWDigJR0aGF0JiMzOTtzIGEgcHJldHR5IGNsZWFyIGluZGljYXRvciB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIFJJU0MtViwgYW5kIHByb2JhYmx5IHNvbWV0aGluZyB0byBkbyB3aXRoIHN1cGVydmlzb3IgbW9kZSBvciBzb21lIHJlbGF0ZWQgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiBzZXQgZXh0ZW5zaW9uLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBkZWVwZXIgb24gdGhhdCBpZiBpdCBjb21lcyB1cC4KCkJ1dCBub3csIEkmIzM5O20gc3dpdGNoaW5nIGdlYXJzIGFuZCBteSBtaW5kIGlzIGF1dG9tYXRpY2FsbHkgZ29pbmcgdG8gdGhlIHg4NiBhcmNoaXRlY3R1cmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBOb3csIGEgY3JpdGljYWwgcG9pbnQgZm9yIHg4NiBpcyBgQ09ORklHX0FERFJFU1NfTUFTS0lOR2AuIFRoaXMgc3VnZ2VzdHMgc29tZXRoaW5nIGFib3V0IGhvdyBtZW1vcnkgYWRkcmVzc2VzIGFyZSBoYW5kbGVkLCBwb3RlbnRpYWxseSByZWxhdGVkIHRvIFBBRSAoUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24pLCBvciBwZXJoYXBzIGEgbW9yZSBmaW5lLWdyYWluZWQgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50IHNjaGVtZS4gSSYjMzk7bGwgY2hlY2sgdGhhdCB2YXJpYWJsZSwgYW5kIHNlZSBleGFjdGx5IHdoaWNoIGNvbmZpZ3VyYXRpb24gZmxhZ3MgYXJlIGluIHVzZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QUREUkVTU19NQVNLSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC94ODYvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL3g4Ni9LY29uZmlnPTIxMzU9Y29uZmlnIFJBTkRPTUlaRV9NRU1PUllfUEhZU0lDQUxfUEFERElOR1xuLS1cbmFyY2gveDg2L0tjb25maWctMjE0OS1cbmFyY2gveDg2L0tjb25maWc6MjE1MDpjb25maWcgQUREUkVTU19NQVNLSU5HXG5hcmNoL3g4Ni9LY29uZmlnLTIxNTEtXHRib29sIFwmIzM0O0xpbmVhciBBZGRyZXNzIE1hc2tpbmcgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTA0OAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDUxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW1wbGVtZW50aW5nIGBBRERSRVNTX01BU0tJTkdgIGZvciB4ODYg4oCTIGdvdCBpdC4gSXQmIzM5O3MgdG91Y2hpbmcgYG1tL2d1cC5jYCBhbmQgYG1tL21lbW9yeS5jYCwgd2hpY2ggYXJlIGNyaXRpY2FsIGtlcm5lbCBmaWxlcywgc28gdGhhdCBpbW1lZGlhdGVseSBmbGFncyBpdCBhcyBpbnRlcmVzdGluZy4gSSBzZWUgYSB3aG9sZSBzbGV3IG9mIG5ldyBmdW5jdGlvbnMgaW50cm9kdWNlZCBpbiB0aGlzIHBhdGNoOiBgZ2V0X3VzZXJfcGFnZV92bWFgLCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCwgYHJlbW90ZV92bV93YWxrYCwgYGFjY2Vzc192bV9wYWdlYCwgYGNvcHlfdm1fc3RyYCwgYW5kIGBmb2xsb3dfcHRlX2JhdGNoYC4gVGhlc2UgYXJlIHNjcmVhbWluZyBmb3IgZnV6emluZywgbm8gZG91YnQuCgpMZXQmIzM5O3MgbWFrZSBhIGxpc3Qgb2YgdGhlIGtleSBzeW1ib2xzIHRvIGZvY3VzIG9uLiBPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoZSBvcmlnaW5hbCBsaXN0LCBidXQgbm93IHdlIHNob3VsZCBhbHNvIGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zOgotIGBmYXVsdGluX3BhZ2VgCi0gYF9fYWNjZXNzX3JlbW90ZV92bWAKLSBgX19jb3B5X3JlbW90ZV92bV9zdHJgCgpOb3csIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGNsZWFyOiBwcmlvcml0aXplIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIGVudHJ5IHBvaW50cy4gU28sIGxldCYjMzk7cyBzZWUgaWYgdGhvc2UgbmV3IGZ1bmN0aW9ucyBhcmUgc3RhdGljIGJlY2F1c2Ugc3RhdGljIGhlbHBlcnMgYXJlIG9mdGVuIGlubGluZWQgYW5kIGRvbiYjMzk7dCBvZmZlciBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGZvciBmdXp6aW5nLiBEYW1uLCBsb29rcyBsaWtlIHRoZXkgYXJlIGFsbCBzdGF0aWMgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGZvciBmdXp6aW5nIQoKT2theSwgbGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBub24tc3RhdGljIGVudHJ5IHBvaW50cyBpbiBgbW0vbWVtb3J5LmNgLiBJIHNlZSBgYWNjZXNzX3JlbW90ZV92bWAgYW5kIGBhY2Nlc3NfcHJvY2Vzc192bWAgKGJvdGggYEVYUE9SVF9TWU1CT0xfR1BMYCkuICBBbmQgdGhlbiBgY29weV9mcm9tX3VzZXJfcGFnZWAgYW5kIGBjb3B5X3RvX3VzZXJfcGFnZWAgdGhhdCB3ZXJlbiYjMzk7dCBjaGFuZ2VkLiBHb29kLiBXYWl0LCBpdCBsb29rcyBsaWtlIGBfX2FjY2Vzc19yZW1vdGVfdm1gIGlzIGNhbGxlZCBieSBgYWNjZXNzX3JlbW90ZV92bWAgYW5kIGBhY2Nlc3NfcHJvY2Vzc192bWAuIExvb2tzIGxpa2UgYF9fY29weV9yZW1vdGVfdm1fc3RyYCBpcyBjYWxsZWQgYnkgYGNvcHlfcmVtb3RlX3ZtX3N0cmAuIElzIHRoaXMgZXhwb3J0ZWQ/IEkgc2hvdWxkIGNoZWNrIHRoaXMuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29weV9yZW1vdGVfdm1fc3RyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmM9NzMwND1zdGF0aWMgaW50IGNvcHlfdm1fc3RyKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbi0tXG5tbS9tZW1vcnkuYy03MzQzLSAqL1xubW0vbWVtb3J5LmM6NzM0NDpzdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy03MzQ1LVx0XHRcdFx0dm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuLS1cbm1tL21lbW9yeS5jLTczNjItLyoqXG5tbS9tZW1vcnkuYzo3MzYzOiAqIGNvcHlfcmVtb3RlX3ZtX3N0ciAtIGNvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MmIzM5O3MgYWRkcmVzcyBzcGFjZS5cbm1tL21lbW9yeS5jLTczNjQtICogQHRzazpcdHRoZSB0YXNrIG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZVxuLS1cbm1tL21lbW9yeS5jLTczNzUtICovXG5tbS9tZW1vcnkuYzo3Mzc2OmludCBjb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL21lbW9yeS5jLTczNzctXHRcdCAgICAgICB2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vbWVtb3J5LmMtNzM5MC1cbm1tL21lbW9yeS5jOjczOTE6XHRyZXQgPSBfX2NvcHlfcmVtb3RlX3ZtX3N0cihtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XG5tbS9tZW1vcnkuYy03MzkyLVxuLS1cbm1tL21lbW9yeS5jLTczOTYtfVxubW0vbWVtb3J5LmM6NzM5NzpFWFBPUlRfU1lNQk9MX0dQTChjb3B5X3JlbW90ZV92bV9zdHIpO1xubW0vbWVtb3J5LmMtNzM5OC0jZW5kaWYgLyogQ09ORklHX0JQRl9TWVNDQUxMICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwNDEwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgQWNjZXNzIEZ1bmN0aW9ucyBpbiB0aGUgS2VybmVsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBvZiBgbW0vbWVtb3J5LmNgIGhhcyBmbGFnZ2VkIGBhY2Nlc3NfcmVtb3RlX3ZtYCwgYGFjY2Vzc19wcm9jZXNzX3ZtYCwgYW5kIGBjb3B5X3JlbW90ZV92bV9zdHJgIGFzIHRoZSBrZXkgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zLCBiYXNlZCBvbiB0aGVpciBuYW1lcywgdGhhdCBsaWtlbHkgaGFuZGxlIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgYWNjZXNzIGFuZCBtZW1vcnkgY29weWluZyBvcGVyYXRpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgYW5kIGJlaGF2aW9yLgoKTm93LCBzaGlmdGluZyBmb2N1cyB0byBgbW0vZ3VwLmNgLCBJJiMzOTt2ZSBpZGVudGlmaWVkIHNldmVyYWwgZnVuY3Rpb25zIG9mIGludGVyZXN0LiBgZ2V0X3VzZXJfcGFnZV92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhcmUgbm9uLXN0YXRpYyBhbmQgYXBwZWFyIGNyaXRpY2FsIHRvIHRoZSBwcm9jZXNzIG9mIGdldHRpbmcgYSB1c2VyIHBhZ2UgYW5kIGxvb2t1cHMuIGBfX2dldF91c2VyX3BhZ2VzYCBpcyBzdGF0aWMgd2hpY2ggbWFrZXMgaXQgYSBoZWxwZXIgZnVuY3Rpb24gd2l0aGluIHRoZSBgZ3VwLmNgIGZpbGUuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyBgZ2V0X3VzZXJfcGFnZXNgLCBgcGluX3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIGFyZSB0aWVkIHRvIHRob3NlIGZ1bmN0aW9ucywgZXNwZWNpYWxseSB0aGUgb25lcyB0aGF0IGFyZSBhbHNvIG5vbi1zdGF0aWMuIFRoZSAmIzM5O3JlbW90ZSYjMzk7IGZ1bmN0aW9ucyBhcmUgcHJvYmFibHkgY3J1Y2lhbCB0byBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBhcmNoaXRlY3R1cmUsIGFzIHRoZXkgZGVhbCB3aXRoIGNyb3NzLVZNIGFjY2Vzcy4KClRoZSBjb3JlIHF1ZXN0aW9uIG5vdyBpcywgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aGluIGBnZXRfdXNlcl9wYWdlX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgPyBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIHRob3NlIGZ1bmN0aW9ucyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIHVuZGVybHlpbmcgbWVjaGFuaXNtcyBhbmQgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgb3ZlcmFsbCBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Z2V0X3VzZXJfcGFnZV92bWEmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ndXAuYz0xMTUwPXN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTEyMzgtLypcbm1tL2d1cC5jOjEyMzk6ICogZ2V0X3VzZXJfcGFnZV92bWEgLSBnZXQgb25lIHBhZ2UgZnJvbSBAdm1hLCB3aG9zZSBsb2NrIHRoZSBjYWxsZXIgYWxyZWFkeVxubW0vZ3VwLmMtMTI0MC0gKiBob2xkczogdGhlIG1tYXAgbG9jaywgb3IgKHdpdGggRk9MTF9WTUFfTE9DSykgdGhlIHBlci1WTUEgbG9jay4gV2Fsa3MgdGhlXG4tLVxubW0vZ3VwLmMtMTI1Mi0gKi9cbm1tL2d1cC5jOjEyNTM6c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9ndXAuYy0xMjU0LVx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuLS1cbm1tL2d1cC5jLTEzNTItICogTG9va3MgdXAgdGhlIFZNQSwgYW5kIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgdGhyb3VnaFxubW0vZ3VwLmM6MTM1MzogKiBnZXRfdXNlcl9wYWdlX3ZtYSgpLCBmYXVsdGluZyBpbiB0aGUgcGFnZSBpZiBuZWVkZWQuXG5tbS9ndXAuYy0xMzU0LSAqXG4tLVxubW0vZ3VwLmM9MTM1OD1zdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vZ3VwLmMtMTM3My1cbm1tL2d1cC5jOjEzNzQ6XHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWEodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfVE9VQ0gpO1xubW0vZ3VwLmMtMTM3NS1cdGlmIChJU19FUlIocGFnZSkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxMzY2CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJlZmluaW5nIHRoZSBGb2N1cyBmb3IgU3lzdGVtIENhbGwgQW5hbHlzaXMqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIGFuYWx5c2lzLiBGaXJzdCwgSSBjb25maXJtZWQgdGhhdCBgZ2V0X3VzZXJfcGFnZV92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhcmUgaW5kZWVkIG5vbi1zdGF0aWMg4oCTIHRoYXQmIzM5O3MgZ29vZCBmb3Igb3VyIHB1cnBvc2VzLiBOb3csIGxldCYjMzk7cyBsb29rIGF0IGBmb2xsb3dfcGFnZV9tYXNrYCAtIGl0JiMzOTtzIHN0YXRpYywgc28gaXQmIzM5O3Mgbm90IGEgZGlyZWN0IGVudHJ5IHBvaW50LiBIb3dldmVyLCBgX19nZXRfdXNlcl9wYWdlc2AgKmlzKiBzdGF0aWMgYW5kIGNhbGxzIGl0LiBgX19nZXRfdXNlcl9wYWdlc2AgaXMgY2FsbGVkIGJ5IGEgaG9zdCBvZiBmdW5jdGlvbnMgaW5jbHVkaW5nIGBnZXRfdXNlcl9wYWdlc2AsIGBnZXRfdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNgIGFuZCBhIGZldyBvdGhlcnMuCgpNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRvIGluY2x1ZGUgdGhvc2UsIGJ1dCB0aGUgaW5zdHJ1Y3Rpb25zIHdhcm4gYWdhaW5zdCBpbmNsdWRpbmcgZ2VuZXJpYyAmIzM0O2hvdCBwYXRoJiMzNDsgZnVuY3Rpb25zIHRvIGF2b2lkIHNrZXdpbmcgdGhlIHRlc3QgZGlzdHJpYnV0aW9ucy4gSSBuZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gYGdldF91c2VyX3BhZ2VzYCBhbmQgYHBpbl91c2VyX3BhZ2VzYCBhcmUgZGVmaW5pdGVseSBpbiB0aGF0IGhvdCBwYXRoIGNhdGVnb3J5LgoKU28gSSYjMzk7dmUgcmVmaW5lZCB0aGUgY29yZSBmb2N1cyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucywgYXZvaWRpbmcgdGhlIGhvdCBwYXRoczoKCiogICBgZ2V0X3VzZXJfcGFnZV92bWFgCiogICBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYAoqICAgYGFjY2Vzc19yZW1vdGVfdm1gCiogICBgYWNjZXNzX3Byb2Nlc3Nfdm1gCiogICBgY29weV9yZW1vdGVfdm1fc3RyYAoKVGhvc2Ugc2hvdWxkIHByb3ZpZGUgYSBtb3JlIHRhcmdldGVkIHZpZXcuCgpOb3csIGxldCYjMzk7cyBtb3ZlIG9uIHRvIHRoZSBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIG5vdGUgYW55IHJlbGV2YW50IG9uZXMuIEkmIzM5O20gc2VlaW5nOgoKKiAgIGBQRVJfVk1BX0xPQ0tgIChkZXBlbmRlbnQgb24gYEFSQ0hfU1VQUE9SVFNfUEVSX1ZNQV9MT0NLYCwgYE1NVWAsIGFuZCBgU01QYCkKKiAgIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAKKiAgIGBSSVNDVl9JU0FfU1VQTWAKKiAgIGBBRERSRVNTX01BU0tJTkdgCgpJIGhhdmUgdG8gbWFrZSBzdXJlIGBQRVJfVk1BX0xPQ0tgIGlzIGVuYWJsZWQgcHJvcGVybHkuLi4gQWgsIGl0JiMzOTtzIGEgYGRlZl9ib29sIHlgIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgY29uZmlncy4gVGhhdCYjMzk7cyBmaW5lLCBJIGNhbiBsaXN0IGl0LiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGEgbWVudWNvbmZpZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgc2V0LiBgUklTQ1ZfSVNBX1NVUE1gIGFuZCBgQUREUkVTU19NQVNLSU5HYCBhcmUganVzdCBib29scy4KCkkgd2lsbCBhbHNvIHF1aWNrbHkgY2hlY2sgYEJQRl9TWVNDQUxMYCB3aXRoIHJlbGF0aW9uIHRvIGBjb3B5X3JlbW90ZV92bV9zdHJgIGJlY2F1c2UgSSByZWNhbGwgYSBwb3RlbnRpYWwgbGluayB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnkuYz03Mjk1PUVYUE9SVF9TWU1CT0xfR1BMKGFjY2Vzc19wcm9jZXNzX3ZtKTtcbm1tL21lbW9yeS5jLTcyOTYtXG5tbS9tZW1vcnkuYzo3Mjk3OiNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbm1tL21lbW9yeS5jLTcyOTgtLypcbi0tXG5tbS9tZW1vcnkuYz03Mzk3PUVYUE9SVF9TWU1CT0xfR1BMKGNvcHlfcmVtb3RlX3ZtX3N0cik7XG5tbS9tZW1vcnkuYzo3Mzk4OiNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cbm1tL21lbW9yeS5jLTczOTktXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyNjYyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqS2VybmVsIEludGVybmFsczogUmVtb3RlIFZNIFN0cmluZyBDb3B5IGFuZCBJL08gUmVtYXBwaW5nKioKClJpZ2h0LCBzbywgYXMgSSBzZWUgaXQsIHRoZSBpbmNsdXNpb24gb2YgYEJQRl9TWVNDQUxMYCBpcyBkZWZpbml0ZWx5IG5lY2Vzc2FyeSBmb3IgdGhlIGBjb3B5X3JlbW90ZV92bV9zdHJgIGZ1bmN0aW9uLiBJdOKAmXMgcHJldHR5IGNsZWFyIGZyb20gdGhlIGNvbnRleHQuIFdl4oCZcmUgZGVhbGluZyB3aXRoIGEgc3lzdGVtIGNhbGwgaW52b2x2ZWQgaW4gY29weWluZyBzdHJpbmdzIGZyb20gYSByZW1vdGUgdmlydHVhbCBtYWNoaW5lLCBzbyB0aGUgQlBGIGhvb2tzIGFuZCBjYXBhYmlsaXRpZXMgYXJlIGZ1bmRhbWVudGFsbHkgcmVxdWlyZWQgZm9yIHByb3BlciBvcGVyYXRpb24gYW5kIHNlY3VyaXR5IGluIHRoYXQgc2NlbmFyaW8uIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuCgpOb3csIG9uIHRoZSBvdGhlciBoYW5kLCBmb3IgaGFuZGxpbmcgdGhvc2UgYGFjY2Vzc19yZW1vdGVfdm1hX29wc2Agb3BlcmF0aW9ucywgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IGBIQVZFX0lPUkVNQVBfUFJPVGAgaXMgZGVmaW5lZC4gVGhpcyBpcyBhIGNyaXRpY2FsIGNoZWNrIHRvIGVuc3VyZSB3ZSBoYXZlIHRoZSBuZWNlc3NhcnkgaGFyZHdhcmUgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIEkvTyByZW1hcHBpbmcuIFdlIGhhdmUgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyBleGlzdCBiZWZvcmUgd2UgZXZlbiB0aGluayBhYm91dCB0b3VjaGluZyB0aGUgcmVtb3RlIFZNJiMzOTtzIG1lbW9yeSBhbmQgdHJ5aW5nIHRvIHJlYWQgb3Igd3JpdGUgaXQuIEkmIzM5O2xsIG5lZWQgdG8gZ28gb3ZlciB0aGUgcmVsZXZhbnQgY29uZmlnIG9wdGlvbnMgYW5kIGVuc3VyZSB0aGF0IHRoZSByaWdodCBjaGVja3MgYXJlIGluIHBsYWNlLiBUaGlzIGlzIHdoZXJlIHRoZSBpbnRyaWNhY2llcyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBoYXJkd2FyZSBiZWNvbWUgY3JpdGljYWwsIGFuZCBJIHdhbnQgdG8gYmUgMTAwJSBjZXJ0YWluIHdlJiMzOTtyZSBoYW5kbGluZyB0aGF0IHJlbWFwcGluZyBzYWZlbHkgYW5kIHJlbGlhYmx5LiBHb3R0YSBjb3ZlciBhbGwgdGhlIGJhc2VzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtIQVZFX0lPUkVNQVBfUFJPVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTY5NTE9RVhQT1JUX1NZTUJPTF9HUEwoZm9sbG93X3Bmbm1hcF9lbmQpO1xubW0vbWVtb3J5LmMtNjk1Mi1cbm1tL21lbW9yeS5jOjY5NTM6I2lmZGVmIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVFxubW0vbWVtb3J5LmMtNjk1NC0vKipcbi0tXG5tbS9tZW1vcnkuYz03MDI2PXN0YXRpYyBpbnQgYWNjZXNzX3JlbW90ZV92bWFfb3BzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtNzAyOC17XG5tbS9tZW1vcnkuYzo3MDI5OiNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbm1tL21lbW9yeS5jLTcwMzAtXHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzMjE5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2VzcywgZ2l2ZW4gbXkgZXhwZXJ0aXNlOgoKKipDaGVja2luZyBLZXJuZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zKioKClJpZ2h0LCBgSEFWRV9JT1JFTUFQX1BST1RgIGlzIGRlZmluaXRlbHkgd29ydGggYWRkaW5nIHRvIG15IG1lbnRhbCBjaGVja2xpc3Qgd2hlbiByZXZpZXdpbmcgdGhpcyBrZXJuZWwgY29uZmlndXJhdGlvbi4gSXQmIzM5O3MgYSBzaWduaWZpY2FudCBpbmRpY2F0b3Igb2YgaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBtZW1vcnktbWFwcGVkIEkvTywgYW5kIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoYXQgZmVhdHVyZSBjYW4gaGF2ZSBhIHByb2ZvdW5kIGltcGFjdCBvbiBkZXZpY2UgZHJpdmVyIGRldmVsb3BtZW50IGFuZCBwZXJmb3JtYW5jZS4gS25vd2luZyB3aGV0aGVyIHdlIGhhdmUgcHJvdGVjdGlvbiBlbmFibGVkIGR1cmluZyByZW1hcHBpbmcgaXMgY3J1Y2lhbCBmb3Igc2VjdXJpdHkgYW5kIHN0YWJpbGl0eS4KCk5vdywgbGV0JiMzOTtzIHBpdm90IHRvIHRoZSBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgb3B0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoYXQgb25lLiBJJiMzOTttIHJlY2FsbGluZyB0aGUgaW1wbGljYXRpb25zIG9mIFJDVSB3aXRoIHJlc3BlY3QgdG8gZnJlZWluZyBNTVUgdGFibGVzLiBXZSBuZWVkIHRvIGV2YWx1YXRlIHdoZXRoZXIgZW5hYmxpbmcgdGhhdCBvcHRpb24gbWFrZXMgc2Vuc2UgZm9yIHRoZSBjdXJyZW50IHVzZSBjYXNlLCBvciBpZiBpdCBtaWdodCBwcmVzZW50IHByb2JsZW1zIHdpdGggdGhlIGFyY2hpdGVjdHVyZS4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBkZXRhaWxzIGFuZCBjb25zaWRlciB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgdHJhZGVvZmZzIHRoaXMgZW50YWlscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTcwNTA9c3RhdGljIGJvb2wgcmVtb3RlX2FjY2Vzc19sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtNzA1NS1cbm1tL21lbW9yeS5jOjcwNTY6I2lmIGRlZmluZWQoQ09ORklHX1BFUl9WTUFfTE9DSykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX01NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUUpXG5tbS9tZW1vcnkuYy03MDU3LVx0dm1hID0gbG9ja192bWFfdW5kZXJfcmN1KG1tLCBhZGRyKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM2MzEKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQ29uZmlndXJhdGlvbiBBdWRpdCoqCgpPa2F5LCBsZXQmIzM5O3MgcmVmaW5lIHRoaXMgbGlzdCBvZiBpbnRlcmVzdGluZyBrZXJuZWwgY29uZmlndXJhdGlvbnMuIFdlJiMzOTt2ZSBnb3QgYSBzb2xpZCBzdGFydGluZyBwb2ludDogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEJQRl9TWVNDQUxMYCwgYEhBVkVfSU9SRU1BUF9QUk9UYCwgYFJJU0NWX0lTQV9TVVBNYCwgYW5kIGBBRERSRVNTX01BU0tJTkdgLiBHb29kLCBnb29kLi4uIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCBkZWZpbml0ZWx5IGFkZCBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgdG8gdGhhdCBsaXN0OyBpdCYjMzk7cyBnb3QgcmVhbCBwb3RlbnRpYWwgZm9yIGFuYWx5c2lzLgoKTm93LCBsZXQmIzM5O3MgZGlnIGludG8gYEhBVkVfSU9SRU1BUF9QUk9UYCBhbmQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgIHNwZWNpZmljYWxseS4gTmVlZCB0byBkZXRlcm1pbmUgaWYgdGhleSYjMzk7cmUgZXZlbiAqc2VsZWN0YWJsZSogaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gR290dGEgY2hlY2sgdGhlIGRlcGVuZGVuY2llcyBhbmQgY29uc3RyYWludHMuIFdlJiMzOTtsbCBiZSBhYmxlIHRvIHRlbGwgbXVjaCBtb3JlIG9uY2Ugd2Uga25vdyB3aGV0aGVyIHRoZXNlIGFyZSBpbiBzY29wZSBvciBub3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0hBVkVfSU9SRU1BUF9QUk9UJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvS2NvbmZpZz0yNTg9Y29uZmlnIFVTRVJfUkVUVVJOX05PVElGSUVSXG4tLVxuYXJjaC9LY29uZmlnLTI2NC1cbmFyY2gvS2NvbmZpZzoyNjU6Y29uZmlnIEhBVkVfSU9SRU1BUF9QUk9UXG5hcmNoL0tjb25maWctMjY2LVx0Ym9vbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDA2MAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDUzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkNvbnNpZGVyaW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIE9wdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoZXNlIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGFuZCB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgYEhBVkVfSU9SRU1BUF9QUk9UYC4gVGhpcyBvbmUmIzM5O3MgYSBiaXQgb2YgYSBzcGVjaWFsIGNhc2UuIEl0JiMzOTtzIGEgaGlkZGVuIGJvb2wsIHJpZ2h0PyBBcmNoaXRlY3R1cmUtc3BlY2lmaWMuIFRoZSB3aG9sZSBwb2ludCBpcywgaXQmIzM5O3Mgbm90IHNvbWV0aGluZyB3ZSBleHBvc2UgZm9yIHVzZXJzIHRvIHR3ZWFrIGRpcmVjdGx5LiBXZSBzaG91bGRuJiMzOTt0IGV2ZW4gbGlzdCBpdDsgaXQmIzM5O3MgaW1wbGljaXQuIE5vIHBvaW50IGluIGNsdXR0ZXJpbmcgdGhlIGF2YWlsYWJsZSBjaG9pY2VzIHdpdGggc29tZXRoaW5nIHRoYXQgY2FuJiMzOTt0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZC4gVGhhdCB3b3VsZCBqdXN0IGJlIGNvbmZ1c2luZy4KCk5leHQgdXAsIHdoYXQgYWJvdXQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgPyBJIG5lZWQgdG8gdGhpbmsgdGhpcyBvbmUgdGhyb3VnaCBjYXJlZnVsbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O01NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDthcmNoL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9LY29uZmlnPTUxMj1jb25maWcgTU1VX0dBVEhFUl9UQUJMRV9GUkVFXG4tLVxuYXJjaC9LY29uZmlnLTUxNC1cbmFyY2gvS2NvbmZpZzo1MTU6Y29uZmlnIE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVcbmFyY2gvS2NvbmZpZy01MTYtXHRib29sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0Mzc3CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aG9zZSB0aG91Z2h0cyBmcm9tIGEgZmlyc3QtcGVyc29uLCBleHBlcnQgcGVyc3BlY3RpdmUsIGtlZXBpbmcgaXQgY29uY2lzZSBhbmQgZm9jdXNpbmcgb24gdGhlIHVuZGVybHlpbmcgcmVhc29uaW5nOgoKKipIaWRkZW4gQm9vbGVhbiBhbmQgVk1BIExvY2sgQ29uc2lkZXJhdGlvbnMqKgoKQWxyaWdodCwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGlzIGRhdGEgc3RydWN0dXJlIGFuZCBJIHNlZSB0aGlzICYjMzQ7aGlkZGVuIGJvb2wuJiMzNDsgSXQmIzM5O3MgaW50ZW50aW9uYWxseSBoaWRkZW4sIGFuZCB3ZSBzaG91bGRuJiMzOTt0IHJldmVhbCBpdCBvciBpbmNsdWRlIGl0IGluIG91ciBsaXN0aW5ncy4gVGhlIGRlc2lnbiBjaG9pY2UgaXMgY2xlYXIg4oCTIGl0JiMzOTtzIGFuIGludGVybmFsIGRldGFpbCwgbWF5YmUgYW4gb3B0aW1pemF0aW9uLCBhbmQgZXhwb3NpbmcgaXQgd291bGQganVzdCBjbHV0dGVyIHRoaW5ncyBmb3IgdGhlIHVzZXIgYW5kIHBvdGVudGlhbGx5IGxlYWQgdG8gbWlzdXNlLiBXZSBzaG91bGQgbWFpbnRhaW4gdGhlIGFic3RyYWN0aW9uIGxldmVsLgoKVGhlbiBteSBtaW5kIGp1bXBzIHRvIHRoZSBgUEVSX1ZNQV9MT0NLYC4gIEkmIzM5O20gd29uZGVyaW5nIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QgY2hvaWNlIG9yIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QgcGxhY2UgZm9yIGl0LiBUaGlua2luZyBhYm91dCB0aGUgcG90ZW50aWFsIGNvbnRlbnRpb24sIHRoZSBzY29wZSBvZiBwcm90ZWN0aW9uLCBhbmQgdGhlIHNwZWNpZmljIG9wZXJhdGlvbnMgaXQmIzM5O3MgZ3VhcmRpbmcuIElzIGl0IHJlYWxseSB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIHRoZSBjb25jdXJyZW5jeSBjaGFsbGVuZ2VzPyBXaGF0IGFyZSB0aGUgYWx0ZXJuYXRpdmVzPyBBcmUgdGhlcmUgb3RoZXIgbG9ja3MgdGhhdCBwcm92aWRlIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSwgYnV0IG1heSBiZSBtb3JlIHBlcmZvcm1hbnQgaW4gdGhlIGNpcmN1bXN0YW5jZXM/IE9yIHNob3VsZCB3ZSBleHBsb3JlIGEgbG9jay1mcmVlIHNvbHV0aW9uPyBXZSBuZWVkIHRvIHdlaWdoIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1BFUl9WTUFfTE9DSyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz0xNDMzPWNvbmZpZyBMUlVfR0VOX1dBTEtTX01NVVxuLS1cbm1tL0tjb25maWctMTQzNy1cbm1tL0tjb25maWc6MTQzODpjb25maWcgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tcbm1tL0tjb25maWctMTQzOS0gICAgICAgZGVmX2Jvb2wgblxubW0vS2NvbmZpZy0xNDQwLVxubW0vS2NvbmZpZzoxNDQxOmNvbmZpZyBQRVJfVk1BX0xPQ0tcbm1tL0tjb25maWctMTQ0Mi1cdGRlZl9ib29sIHlcbm1tL0tjb25maWc6MTQ0MzpcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0sgXHUwMDI2XHUwMDI2IE1NVSBcdTAwMjZcdTAwMjYgU01QXG5tbS9LY29uZmlnLTE0NDQtXHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0ODM0CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzA5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIEtlcm5lbCBQYXRjaCYjMzk7cyBJbXBsaWNhdGlvbnMqKgoKT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBJIHNlZSB0aGF0IGBQRVJfVk1BX0xPQ0tgIGlzIGRlZmluZWQgYXMgYSBgZGVmX2Jvb2wgeWAsIHdoaWNoIG1lYW5zIGl0JiMzOTtzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBpZiBpdHMgZGVwZW5kZW5jaWVzIGFyZSBtZXQuIEkgZG9uJiMzOTt0IG5lZWQgdG8gZXhwbGljaXRseSBsaXN0IGl0IGZvciBjb25maWd1cmF0aW9uIHB1cnBvc2VzLgoKVGhlcmVmb3JlLCB0aGUga2V5IGNvbmZpZ3VyYXRpb25zIHRvIHdhdGNoIG91dCBmb3IgYXJlOiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQlBGX1NZU0NBTExgLCBgUklTQ1ZfSVNBX1NVUE1gLCBhbmQgYEFERFJFU1NfTUFTS0lOR2AuIFRob3NlIGFyZSB0aGUgcmVsZXZhbnQga25vYnMgdG8gY29uc2lkZXIgd2hlbiB0ZXN0aW5nLgoKTm93LCBsZXQmIzM5O3MgcmV2aWV3IHRoZSBjcml0aWNhbCBzeW1ib2xzIHRoaXMgcGF0Y2ggdG91Y2hlcy4gVGhlIG9uZXMgdGhhdCBpbW1lZGlhdGVseSBzdGFuZCBvdXQgYXJlIGBnZXRfdXNlcl9wYWdlX3ZtYWAsIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgLCBgYWNjZXNzX3JlbW90ZV92bWAsIGBhY2Nlc3NfcHJvY2Vzc192bWAsIGFuZCBgY29weV9yZW1vdGVfdm1fc3RyYC4gWXVwLCB0aG9zZSBhbGwgbG9vayBsaWtlIHRoZSByaWdodCBzZXQgb2YgcHJpbWl0aXZlcyB0byBmb2N1cyBvbi4KCk15IHJlYXNvbmluZz8gVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgYnJhbmQgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSB2aWEgYHJlbW90ZV92bV93YWxrYCBhbmQgaXMgcmVwbGFjaW5nIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYnJpbmdzIGJhdGNoaW5nIHN1cHBvcnQgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvd2VyIEdVUCBwYXRoLiBUaGlzIGluZGljYXRlcyBzb21lICpzaWduaWZpY2FudCogY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSBnb2luZyB0byBpbXBhY3QgcGFnZSBmYXVsdCBoYW5kbGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3Mgb3BlcmF0aW9ucyAodGhpbmdzIGxpa2UgcHRyYWNlLCBhY2Nlc3NpbmcgYC9wcm9jL3BpZC9tZW1gKSwgYW5kIGV2ZW4gQlBGIHN0cmluZyBjb3B5aW5nLiBUaGlzIG1lYW5zIGZ1enppbmcgZWZmb3J0cyBzaG91bGQgYWJzb2x1dGVseSBjb25jZW50cmF0ZSBvbiB0aGUgbmV3IGVudHJ5IHBvaW50cyBhbmQgdGhlIHJlbW90ZSBhY2Nlc3MgQVBJcy4KCkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgaWYgYGFjY2Vzc19yZW1vdGVfdm1gIGlzIGV4cG9ydGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYUE9SVF9TWU1CT0xfR1BMXFwoYWNjZXNzX3JlbW90ZV92bVxcKSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzU1NzYKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjoKCioqRGl2aW5nIGludG8gdGhlIGBtbS9tZW1vcnkuY2AgUmFiYml0IEhvbGUqKgoKT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIsIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBhY2Nlc3NfcmVtb3RlX3ZtYC4gSXQmIzM5O3MgY3J1Y2lhbCwgYW5kIHRoZSBjb250ZXh0IG9mIG1lbW9yeSBhY2Nlc3MgaXMgY3JpdGljYWwuIExldCYjMzk7cyBzZWUgaG93IHRoYXQgZnVuY3Rpb24gaXMgZGVmaW5lZCB3aXRoaW4gdGhlIGBtbS9tZW1vcnkuY2AgbW9kdWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBoYW5kbGVzIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgbWVtb3J5IGFjY2VzcyBzcGVjaWZpY2FsbHkg4oCTIGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIG9yIHJhY2UgY29uZGl0aW9ucyB0aGVyZSBjb3VsZCBiZSBuYXN0eS4gSSYjMzk7bGwgbmVlZCB0byBsb29rIHZlcnkgY2xvc2VseSBhdCB0aGUgY29kZSBhbmQgc2VlIGV4YWN0bHkgd2hhdCYjMzk7cyBoYXBwZW5pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2FjY2Vzc19yZW1vdGVfdm0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnkuYz03MDE0PUVYUE9SVF9TWU1CT0xfR1BMKGdlbmVyaWNfYWNjZXNzX3BoeXMpO1xuLS1cbm1tL21lbW9yeS5jLTcwMjUtICovXG5tbS9tZW1vcnkuYzo3MDI2OnN0YXRpYyBpbnQgYWNjZXNzX3JlbW90ZV92bWFfb3BzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy03MDI3LVx0XHRcdFx0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxuLS1cbm1tL21lbW9yeS5jPTcyMTE9c3RhdGljIGludCBhY2Nlc3Nfdm1fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vbWVtb3J5LmMtNzIxOC1cdGlmICghcGFnZSkge1xubW0vbWVtb3J5LmM6NzIxOTpcdFx0Ynl0ZXMgPSBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHModm1hLCBhZGRyLCAqYnVmLCBsZW4sIHdyaXRlKTtcbm1tL21lbW9yeS5jLTcyMjAtXHRcdGlmIChieXRlcyBcdTAwM2UgMClcbi0tXG5tbS9tZW1vcnkuYy03MjQ2LSAqL1xubW0vbWVtb3J5LmM6NzI0NzpzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxubW0vbWVtb3J5LmMtNzI0OC1cdFx0XHQgICAgICB2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vbWVtb3J5LmMtNzI1Ni0vKipcbm1tL21lbW9yeS5jOjcyNTc6ICogYWNjZXNzX3JlbW90ZV92bSAtIGFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlXG5tbS9tZW1vcnkuYy03MjU4LSAqIEBtbTpcdFx0dGhlIG1tX3N0cnVjdCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3Mgc3BhY2Vcbi0tXG5tbS9tZW1vcnkuYy03MjY3LSAqL1xubW0vbWVtb3J5LmM6NzI2ODppbnQgYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxubW0vbWVtb3J5LmMtNzI2OS1cdFx0dm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxubW0vbWVtb3J5LmMtNzI3MC17XG5tbS9tZW1vcnkuYzo3MjcxOlx0cmV0dXJuIF9fYWNjZXNzX3JlbW90ZV92bShtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XG5tbS9tZW1vcnkuYy03MjcyLX1cbi0tXG5tbS9tZW1vcnkuYz03Mjc5PWludCBhY2Nlc3NfcHJvY2Vzc192bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTcyODgtXG5tbS9tZW1vcnkuYzo3Mjg5Olx0cmV0ID0gX19hY2Nlc3NfcmVtb3RlX3ZtKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzKTtcbm1tL21lbW9yeS5jLTcyOTAtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM2MzUyCgkJCQkJCQlvdXRwdXQ6IDI0OQoJCQkJCQkJdGhvdWdodHM6IDE3MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBSZW1vdGUgVk0gQWNjZXNzIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gbG9va2luZyBpbnRvIHRoaXMgYGFjY2Vzc19yZW1vdGVfdm1gIHNpdHVhdGlvbi4gSSBzZWUgbm93OyBpdCYjMzk7cyAqbm90KiBleHBvcnRlZCwgYnV0IGl0JiMzOTtzIGFsc28gbm90IHN0YXRpYy4gVGhhdCBtYWtlcyBpdCBhIHBlcmZlY3Qgc3ltYm9sIHRvIHplcm8gaW4gb24sIGVzcGVjaWFsbHkgc2luY2UgYGFjY2Vzc19wcm9jZXNzX3ZtYCAqaXMqIGV4cG9ydGVkLiBGb2N1c2luZyBvbiBgYWNjZXNzX3JlbW90ZV92bWAgc2VlbXMgbGlrZSBhIHNvbGlkIGFwcHJvYWNoLgoKSSBhbHNvIGNvbnNpZGVyZWQgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLiBUaGV5JiMzOTtyZSBkZWZpbml0ZWx5IHJlbGV2YW50LCBidXQgSSBoYXZlIGEgaHVuY2ggdGhleSYjMzk7cmUgbGlrZWx5IHRvIGJlIHBlcmZvcm1hbmNlLWNyaXRpY2FsIHBhdGhzLCBhbmQgSSYjMzk7ZCBwcmVmZXIgdG8gc3RhcnQgd2l0aCBzb21ldGhpbmcgYSBiaXQgbW9yZSBmdW5kYW1lbnRhbC4gVGhlIHBhdGNoIHRvdWNoZXMgYG1tL2d1cC5jYCBhbmQgYG1tL21lbW9yeS5jYCwgd2hpY2ggY29uZmlybXMgbXkgaW5pdGlhbCBpbnR1aXRpb24uIFNvLCBJJiMzOTttIHN0aWNraW5nIHdpdGggbXkgb3JpZ2luYWwgc2VsZWN0aW9uIG9mIGZvY3VzIHN5bWJvbHMgZm9yIG5vdyDigJMgYGFjY2Vzc19yZW1vdGVfdm1gIHNlZW1zIGxpa2UgdGhlIG1vc3Qgc3RyYXRlZ2ljIHN0YXJ0aW5nIHBvaW50LgoKQmVmb3JlIEkgY29tbWl0IHRvIHRoaXMgYXBwcm9hY2gsIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgaW4gcGxheS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIG5vdCBvdmVybG9va2luZyBhbnl0aGluZyBjcml0aWNhbC4gTGV0JiMzOTtzIHNlZS4uLiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQlBGX1NZU0NBTExgLCBgUklTQ1ZfSVNBX1NVUE1gLCBhbmQgYEFERFJFU1NfTUFTS0lOR2AuIEFscmlnaHQsIEkmIzM5O3ZlIGdvdCB0aGVtLiBMb29rcyBsaWtlIEkmIzM5O3ZlIGNvbnNpZGVyZWQgdGhlIHJlbGV2YW50IGZhY3RvcnMuCgpOb3csIEkgdGhpbmsgSSYjMzk7bSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIEkmIzM5O2xsIGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT50aGUgZm9sbG93aW5nIGNvbmZpZ3MgZG8gbm90IGV4aXN0IGluIHRoZSBrZXJuZWwgdHJlZTogUklTQ1ZfSVNBX1NVUE08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7UklTQ1ZfSVNBX1NVUE0mIzM0OywKICAgICYjMzQ7QUREUkVTU19NQVNLSU5HJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZV92bWEmIzM0OywKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hJiMzNDssCiAgICAmIzM0O2FjY2Vzc19yZW1vdGVfdm0mIzM0OywKICAgICYjMzQ7YWNjZXNzX3Byb2Nlc3Nfdm0mIzM0OywKICAgICYjMzQ7Y29weV9yZW1vdGVfdm1fc3RyJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O3RoZSBmb2xsb3dpbmcgY29uZmlncyBkbyBub3QgZXhpc3QgaW4gdGhlIGtlcm5lbCB0cmVlOiBSSVNDVl9JU0FfU1VQTSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzcxMjgKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRlYnVnZ2luZyBhIFJJU0MtViBDb25maWd1cmF0aW9uIElzc3VlKioKCk9rYXksIGhvbGQgb24gYSBtaW51dGUuIGBSSVNDVl9JU0FfU1VQTWAgaXNuJiMzOTt0IHNob3dpbmcgdXAgd2hlcmUgSSBleHBlY3QgaXQgdG8uIFRoYXQmIzM5O3MgYSByZWQgZmxhZy4gQmVmb3JlIEkgc3RhcnQgZ29pbmcgZG93biBhIHJhYmJpdCBob2xlIG9mIGluY2x1ZGUgcGF0aHMgb3IgYnVpbGQgc3lzdGVtIG9kZGl0aWVzLCBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBldmVuIGEgKmRlZmluZWQqIHN5bWJvbC4gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGNoZWNrIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUsIHNwZWNpZmljYWxseSBgYXJjaC9yaXNjdi9LY29uZmlnYC4gVGhhdCYjMzk7cyB0aGUgZGVmaW5pdGl2ZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMgYW5kIG9wdGlvbnMuIEdvdHRhIHNlZSBpZiBpdCYjMzk7cyBkZWNsYXJlZCB0aGVyZSwgY29ycmVjdGx5LCBvciBpZiB0aGVyZSYjMzk7cyBhIHR5cG8sIGNvbmRpdGlvbiwgb3IgZGVwZW5kZW5jeSBJJiMzOTttIG1pc3NpbmcuIExldCYjMzk7cyBnZXQgdGhhdCBLY29uZmlnIGZpbGUgb3BlbiBhbmQgZG8gYSBxdWljayBzZWFyY2guIEhvcGVmdWxseSwgdGhpcyBpcyBhIHNpbXBsZSBjb25maWd1cmF0aW9uIG1pc3N0ZXAuIElmIG5vdCwgSSYjMzk7bGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgcG90ZW50aWFsbHkgdGhlIGhlYWRlcnMgdGhlbXNlbHZlcyB0byBmaWd1cmUgb3V0IHdoYXQmIzM5O3MgZ29pbmcgb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1JJU0NWX0lTQV9TVVBNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC9yaXNjdi9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvcmlzY3YvS2NvbmZpZz01NTM9Y29uZmlnIFJJU0NWX0lTQV9DXG4tLVxuYXJjaC9yaXNjdi9LY29uZmlnLTU2My1cbmFyY2gvcmlzY3YvS2NvbmZpZzo1NjQ6Y29uZmlnIFJJU0NWX0lTQV9TVVBNXG5hcmNoL3Jpc2N2L0tjb25maWctNTY1LVx0Ym9vbCBcJiMzNDtTdXBtIGV4dGVuc2lvbiBmb3IgdXNlcnNwYWNlIHBvaW50ZXIgbWFza2luZ1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzUwMQoJCQkJCQkJb3V0cHV0OiAyMzkKCQkJCQkJCXRob3VnaHRzOiAxMDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVHJvdWJsZXNob290aW5nIGEgQ29uZmlndXJhdGlvbiBFcnJvcioqCgpPa2F5LCBzbyB0aGUgdG9vbCBpcyB0ZWxsaW5nIG1lIHRoaXMgcGFydGljdWxhciBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzbiYjMzk7dCBleGlzdC4gVGhhdCYjMzk7cyBhIGNsYXNzaWMuIE15IGluaXRpYWwgaHVuY2ggaXMgdGhhdCBpdCYjMzk7cyBlaXRoZXIgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gdHJlZSwgb3IgdGhlIHRvb2wgaXMgdXNpbmcgYSBtb3JlIHJlc3RyaWN0aXZlIGxvb2t1cCB0aGFuIEkgZXhwZWN0LiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGlzc3VlLiBJJiMzOTtsbCByZW1vdmUgYFJJU0NWX0lTQV9TVVBNYCBhbmQgYEFERFJFU1NfTUFTS0lOR2AgZnJvbSBteSBhY3RpdmUgY29uZmlndXJhdGlvbiB0byB0cnkgYW5kIGlzb2xhdGUgdGhlIHByb2JsZW0uIFRob3NlIHNlZW0gbGlrZSBwb3RlbnRpYWwgY3VscHJpdHMsIGJlaW5nIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgYW5kIG1pZ2h0IG5vdCBiZSBwcmVzZW50IGluIHRoZSB0b29sJiMzOTtzIGRlZmF1bHQgY2hlY2suIFdhaXQgYSBzZWNvbmQsIGRpZG4mIzM5O3QgSSBqdXN0IHNlZSBgQUREUkVTU19NQVNLSU5HYCBpbiB0aGUgeDg2IEtjb25maWcgZmlsZXM/IEkmIzM5O2xsIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQsIGp1c3QgdG8gYmUgc3VyZS4gSXQmIzM5O3MgaW1wb3J0YW50IHRvIHZlcmlmeSB0aG9zZSBkZXRhaWxzLCBubyBwb2ludCBhc3N1bWluZyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0FERFJFU1NfTUFTS0lORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2Vfdm1hJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcmVtb3RlX3ZtJiMzNDssCiAgICAmIzM0O2FjY2Vzc19wcm9jZXNzX3ZtJiMzNDssCiAgICAmIzM0O2NvcHlfcmVtb3RlX3ZtX3N0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0FERFJFU1NfTUFTS0lORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2Vfdm1hJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcmVtb3RlX3ZtJiMzNDssCiAgICAmIzM0O2FjY2Vzc19wcm9jZXNzX3ZtJiMzNDssCiAgICAmIzM0O2NvcHlfcmVtb3RlX3ZtX3N0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzowOC45MTIwMTA5ODJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTMwMzYyNDkyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkFERFJFU1NfTUFTS0lOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF91c2VyX3BhZ2Vfdm1hXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFcIixcbiAgICBcImFjY2Vzc19yZW1vdGVfdm1cIixcbiAgICBcImFjY2Vzc19wcm9jZXNzX3ZtXCIsXG4gICAgXCJjb3B5X3JlbW90ZV92bV9zdHJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjA4LjkxMjAyODAwMloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc4MTMwMTY4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY3YzIwOTg3ZGU2ZDkyZDdlZmMyMWEwMDE4ODVhZDMxOGI2MDU0ZmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFN1biBKdWwgMjYgMTA6MDc6MDYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xcbmluZGV4IDFhOWFhZDZlZjIyYTA0Li43YTZlY2MzZDkyOTQ4YyAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xcbisrKyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jXFxuQEAgLTQ1OSw3ICs0NTksNyBAQCBzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV90YWdzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuIFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xcbiBcXHRcXHR1bnNpZ25lZCBsb25nIHRhZ3MsIG9mZnNldDtcXG4gXFx0XFx0dm9pZCAqbWFkZHI7XFxuLVxcdFxcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxcbitcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkcixcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBndXBfZmxhZ3MsIFxcdTAwMjZ2bWEpO1xcbiBcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbiBcXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXFxuaW5kZXggZGJmMjdhNzhkZjZjODcuLjNjZTE2Nzk2ZTVhMjVkIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxcbkBAIC0yMSw3ICsyMSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LFxcbiBcXHRcXHRcXHQgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbmV4dClcXG4ge1xcbiAjaWZkZWYgQ09ORklHX1JJU0NWX0lTQV9TVVBNXFxuLVxcdG5leHQtXFx1MDAzZWNvbnRleHQucG1sZW4gPSAwO1xcbitcXHRXUklURV9PTkNFKG5leHQtXFx1MDAzZWNvbnRleHQucG1sZW4sIDApO1xcbiAjZW5kaWZcXG4gXFx0c3dpdGNoX21tKHByZXYsIG5leHQsIE5VTEwpO1xcbiB9XFxuQEAgLTQ0LDcgKzQ0LDcgQEAgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKHVzZV9hc2lkX2FsbG9jYXRvcik7XFxuICNkZWZpbmUgbW1fdW50YWdfbWFzayBtbV91bnRhZ19tYXNrXFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiB7XFxuLVxcdHJldHVybiAtMVVMIFxcdTAwM2VcXHUwMDNlIG1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuO1xcbitcXHRyZXR1cm4gLTFVTCBcXHUwMDNlXFx1MDAzZSBSRUFEX09OQ0UobW0tXFx1MDAzZWNvbnRleHQucG1sZW4pO1xcbiB9XFxuICNlbmRpZlxcbiBcXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxcbmluZGV4IDVkNGVjMTU1ODRjZmE0Li41MzgwNmUwZjdkY2ZlMyAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oXFxuQEAgLTE2LDcgKzE2LDcgQEBcXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcXG4ge1xcbiBcXHRpZiAocmlzY3ZfaGFzX2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfRVhUX1NVUE0pKSB7XFxuLVxcdFxcdHU4IHBtbGVuID0gbW0tXFx1MDAzZWNvbnRleHQucG1sZW47XFxuK1xcdFxcdHU4IHBtbGVuID0gUkVBRF9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuKTtcXG4gXFxuIFxcdFxcdC8qIFZpcnR1YWwgYWRkcmVzc2VzIGFyZSBzaWduLWV4dGVuZGVkOyBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlIHplcm8tZXh0ZW5kZWQuICovXFxuIFxcdFxcdGlmIChJU19FTkFCTEVEKENPTkZJR19NTVUpKVxcbkBAIC0zMywxMiArMzMsMTYgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVcXG4gXFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKGN1cnJlbnQtXFx1MDAzZW1tLCBfX2FkZHIpO1xcdFxcXFxcXG4gfSlcXG4gXFxuLSNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpICh7XFx0XFx0XFx0XFx0XFx0XFxcXFxcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKSAoe1xcdFxcdFxcdFxcdFxcXFxcXG4gXFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcXHRcXHRcXHRcXFxcXFxuLVxcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIF9fYWRkcik7XFx0XFx0XFxcXFxcbiB9KVxcbiBcXG4rI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcikgKHtcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XFx0XFx0XFx0XFx0XFxcXFxcbit9KVxcbitcXG4gI2RlZmluZSBhY2Nlc3Nfb2soYWRkciwgc2l6ZSkgbGlrZWx5KF9fYWNjZXNzX29rKHVudGFnZ2VkX2FkZHIoYWRkciksIHNpemUpKVxcbiAjZWxzZVxcbiAjZGVmaW5lIHVudGFnZ2VkX2FkZHIoYWRkcikgKGFkZHIpXFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuY1xcbmluZGV4IGIyZGY3ZjcyMjQxYTVmLi42YWU3NTUyZmVkMDlmMyAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcXG4rKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcXG5AQCAtMzU3LDEzICszNTcsMTUgQEAgbG9uZyBzZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYXJnKVxcbiBcXHRpZiAobW1hcF93cml0ZV9sb2NrX2tpbGxhYmxlKG1tKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5UUjtcXG4gXFxuLVxcdGlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sIFxcdTAwMjZtbS1cXHUwMDNlY29udGV4dC5mbGFncykgXFx1MDAyNlxcdTAwMjYgbW0tXFx1MDAzZWNvbnRleHQucG1sZW4gIT0gcG1sZW4pIHtcXG4tXFx0XFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRpZiAodGVzdF9iaXQoTU1fQ09OVEVYVF9MT0NLX1BNTEVOLCBcXHUwMDI2bW0tXFx1MDAzZWNvbnRleHQuZmxhZ3MpKSB7XFxuK1xcdFxcdGlmIChSRUFEX09OQ0UobW0tXFx1MDAzZWNvbnRleHQucG1sZW4pICE9IHBtbGVuKSB7XFxuK1xcdFxcdFxcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRlbnZjZmdfdXBkYXRlX2JpdHModGFzaywgRU5WQ0ZHX1BNTSwgcG1tKTtcXG4tXFx0bW0tXFx1MDAzZWNvbnRleHQucG1sZW4gPSBwbWxlbjtcXG4rXFx0V1JJVEVfT05DRShtbS1cXHUwMDNlY29udGV4dC5wbWxlbiwgcG1sZW4pO1xcbiBcXG4gXFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xcbiBcXG5AQCAtMzk0LDcgKzM5Niw3IEBAIGxvbmcgZ2V0X3RhZ2dlZF9hZGRyX2N0cmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbiBcXHRcXHRicmVhaztcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKHRhc2stXFx1MDAzZW1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuKVxcbitcXHRpZiAoUkVBRF9PTkNFKHRhc2stXFx1MDAzZW1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuKSlcXG4gXFx0XFx0cmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTtcXG4gXFxuIFxcdHJldHVybiByZXQ7XFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXFxuaW5kZXggZWY1YjUwN2RlMzRlMmUuLmNlZTcxMGY2NDY1OGFhIDEwMDY0NFxcbi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcXG4rKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXFxuQEAgLTEwMCwxOCArMTAwLDE4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV9sYW1fY3IzX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBkdXBfbGFtKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4ge1xcbiBcXHRtbS1cXHUwMDNlY29udGV4dC5sYW1fY3IzX21hc2sgPSBvbGRtbS1cXHUwMDNlY29udGV4dC5sYW1fY3IzX21hc2s7XFxuLVxcdG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgPSBvbGRtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xcbitcXHRXUklURV9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIFJFQURfT05DRShvbGRtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrKSk7XFxuIH1cXG4gXFxuICNkZWZpbmUgbW1fdW50YWdfbWFzayBtbV91bnRhZ19tYXNrXFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiB7XFxuLVxcdHJldHVybiBtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xcbitcXHRyZXR1cm4gUkVBRF9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2spO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW5saW5lIHZvaWQgbW1fcmVzZXRfdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4ge1xcbi1cXHRtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrID0gLTFVTDtcXG4rXFx0V1JJVEVfT05DRShtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLCAtMVVMKTtcXG4gfVxcbiBcXG4gI2RlZmluZSBhcmNoX3BndGFibGVfZG1hX2NvbXBhdCBhcmNoX3BndGFibGVfZG1hX2NvbXBhdFxcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmhcXG5pbmRleCAyMGRlMzRjYzlhYTZlNy4uYTA5NTE2NWViNjQ4ZWIgMTAwNjQ0XFxuLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXFxuKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXFxuQEAgLTM5LDE4ICszOSwyNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bnRhZ2dlZF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcilcXG4gXFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHIoX19hZGRyKTtcXHRcXHRcXFxcXFxuIH0pXFxuIFxcbisvKlxcbisgKiBtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrIGNoYW5nZXMgb25seSB3aGVuIHRoZSB0YXJnZXQgZW5hYmxlcyBMQU0gb3IgZXhlY3MsXFxuKyAqIGFsd2F5cyBzaW5nbGUtdGhyZWFkZWQuIEFuIHVubG9ja2VkIHJlbW90ZSByZWFkZXIgY2FuIHJhY2UgdGhhdDsgUkVBRF9PTkNFXFxuKyAqIGtlZXBzIHRoZSB2YWx1ZSB3aG9sZSBhbmQgdGhlIHVudGFnIGlzIGJlc3QtZWZmb3J0LlxcbisgKi9cXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgYWRkcilcXG4ge1xcbi1cXHRtbWFwX2Fzc2VydF9sb2NrZWQobW0pO1xcbi1cXHRyZXR1cm4gYWRkciBcXHUwMDI2IChtbSktXFx1MDAzZWNvbnRleHQudW50YWdfbWFzaztcXG4rXFx0cmV0dXJuIGFkZHIgXFx1MDAyNiBSRUFEX09OQ0UobW0tXFx1MDAzZWNvbnRleHQudW50YWdfbWFzayk7XFxuIH1cXG4gXFxuLSNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpXFx0KHtcXHRcXHRcXHRcXHRcXFxcXFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXFx0KHtcXHRcXHRcXHRcXFxcXFxuIFxcdHVuc2lnbmVkIGxvbmcgX19hZGRyID0gKF9fZm9yY2UgdW5zaWduZWQgbG9uZykoYWRkcik7XFx0XFx0XFxcXFxcbiBcXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIF9fYWRkcik7XFx0XFxcXFxcbiB9KVxcbiBcXG4rI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcilcXHQoe1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKTtcXHRcXHRcXHRcXFxcXFxuK30pXFxuK1xcbiAjZW5kaWZcXG4gXFxuICNkZWZpbmUgdmFsaWRfdXNlcl9hZGRyZXNzKHgpIFxcXFxcXG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcXG5pbmRleCBkNDRhZmJlMDA1YmI1MS4uOWZhNjU5MTE3ZjM4MjYgMTAwNjQ0XFxuLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xcbisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcXG5AQCAtODE0LDcgKzgxNCw3IEBAIHN0YXRpYyB2b2lkIGVuYWJsZV9sYW1fZnVuYyh2b2lkICpfX21tKVxcbiBzdGF0aWMgdm9pZCBtbV9lbmFibGVfbGFtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiB7XFxuIFxcdG1tLVxcdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IFg4Nl9DUjNfTEFNX1U1NztcXG4tXFx0bW0tXFx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpO1xcbitcXHRXUklURV9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIH5HRU5NQVNLKDYyLCA1NykpO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogRXZlbiB0aG91Z2ggdGhlIHByb2Nlc3MgbXVzdCBzdGlsbCBiZSBzaW5nbGUtdGhyZWFkZWQgYXQgdGhpc1xcbkBAIC05NTIsNyArOTUyLDcgQEAgbG9uZyBkb19hcmNoX3ByY3RsXzY0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9wdGlvbiwgdW5zaWduZWQgbG9uZyBhcmcyKVxcbiAjZW5kaWZcXG4gI2lmZGVmIENPTkZJR19BRERSRVNTX01BU0tJTkdcXG4gXFx0Y2FzZSBBUkNIX0dFVF9VTlRBR19NQVNLOlxcbi1cXHRcXHRyZXR1cm4gcHV0X3VzZXIodGFzay1cXHUwMDNlbW0tXFx1MDAzZWNvbnRleHQudW50YWdfbWFzayxcXG4rXFx0XFx0cmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay1cXHUwMDNlbW0pLFxcbiBcXHRcXHRcXHRcXHQodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcyKTtcXG4gXFx0Y2FzZSBBUkNIX0VOQUJMRV9UQUdHRURfQUREUjpcXG4gXFx0XFx0cmV0dXJuIHByY3RsX2VuYWJsZV90YWdnZWRfYWRkcih0YXNrLVxcdTAwM2VtbSwgYXJnMik7XFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jXFxuaW5kZXggM2FmOTc5ZmI0MWQzOGQuLjMyOWVmYWMwY2ZiMzdkIDEwMDY0NFxcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcXG4rKysgYi9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jXFxuQEAgLTEwMzYsNyArMTAzNiw3IEBAIHN0YXRpYyBpbnQgY29weV9mcm9tX3ZhZGRyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHZhZGRyLCB2b2lkICpkc3QsXFxuIFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gXFxuLVxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIHZhZGRyLCBndXBfZmxhZ3MsIFxcdTAwMjZ2bWEpO1xcbitcXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCBcXHUwMDI2dm1hKTtcXG4gXFx0aWYgKElTX0VSUihwYWdlKSlcXG4gXFx0XFx0cmV0dXJuIFBUUl9FUlIocGFnZSk7XFxuIFxcdHVwcm9iZV9jb3B5X2Zyb21fcGFnZShwYWdlLCB2YWRkciwgZHN0LCBsZW4pO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmhcXG5pbmRleCA0ODVkZjljMmRiZGRiMy4uMGY2NmQ3NmU2Y2E3MTkgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9tbS5oXFxuQEAgLTMyMzUsMzUgKzMyMzUsOSBAQCBsb25nIHBpbl91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4gXFx0XFx0XFx0ICAgaW50ICpsb2NrZWQpO1xcbiBcXG4tLypcXG4tICogUmV0cmlldmVzIGEgc2luZ2xlIHBhZ2UgYWxvbmdzaWRlIGl0cyBWTUEuIERvZXMgbm90IHN1cHBvcnQgRk9MTF9OT1dBSVQuXFxuLSAqL1xcbi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICBpbnQgZ3VwX2ZsYWdzLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcClcXG4te1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuLVxcdGludCBnb3Q7XFxuLVxcbi1cXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcXHUwMDI2IEZPTExfTk9XQUlUKSkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbi1cXG4tXFx0Z290ID0gZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKG1tLCBhZGRyLCAxLCBndXBfZmxhZ3MsIFxcdTAwMjZwYWdlLCBOVUxMKTtcXG4tXFxuLVxcdGlmIChnb3QgXFx1MDAzYyAwKVxcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUihnb3QpO1xcbi1cXG4tXFx0dm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7XFxuLVxcdGlmIChXQVJOX09OX09OQ0UoIXZtYSkpIHtcXG4tXFx0XFx0cHV0X3BhZ2UocGFnZSk7XFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbi1cXHR9XFxuLVxcbi1cXHQqdm1hcCA9IHZtYTtcXG4tXFx0cmV0dXJuIHBhZ2U7XFxuLX1cXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbnQgZ3VwX2ZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTtcXG4gXFxuIGxvbmcgZ2V0X3VzZXJfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4gXFx0XFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXFxuaW5kZXggZWRkYmJiNjVjY2M0ZjguLjdlNmU0Yzg5MTg0Y2Q3IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXFxuKysrIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmhcXG5AQCAtMzQsNiArMzQsMTMgQEBcXG4gfSlcXG4gI2VuZGlmXFxuIFxcbisjaWZuZGVmIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkXFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXFx0KHtcXHRcXFxcXFxuK1xcdCh2b2lkKShtbSk7XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHR1bnRhZ2dlZF9hZGRyKGFkZHIpO1xcdFxcdFxcdFxcdFxcXFxcXG4rfSlcXG4rI2VuZGlmXFxuK1xcbiAjaWZkZWYgbWFza2VkX3VzZXJfYWNjZXNzX2JlZ2luXFxuICAjZGVmaW5lIGNhbl9kb19tYXNrZWRfdXNlcl9hY2Nlc3MoKSAxXFxuICMgaWZuZGVmIG1hc2tlZF91c2VyX3dyaXRlX2FjY2Vzc19iZWdpblxcbmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jXFxuaW5kZXggMDY5MjExOWI3OTA0MzEuLjQ5MTBjOTNiYTAwM2U4IDEwMDY0NFxcbi0tLSBhL21tL2d1cC5jXFxuKysrIGIvbW0vZ3VwLmNcXG5AQCAtNjQ3LDggKzY0Nyw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLFxcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXFxuLVxcdFxcdFxcdFxcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdFxcdCAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXFxuIHtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG5AQCAtNjcyLDEwICs2NzMsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xcbiBcXG4gXFx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xcbi1cXHRpZiAocmV0KVxcbitcXHRpZiAocmV0KSB7XFxuIFxcdFxcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0KnBhZ2VfbWFzayA9IEhQQUdFX1BVRF9OUiAtIDE7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgb2ZmID0gKGFkZHIgXFx1MDAyNiB+UFVEX01BU0spIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRcXHQqbnJfcGFnZXMgPSBtaW4oSFBBR0VfUFVEX05SIC0gb2ZmLCAoZW5kIC0gYWRkcikgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuK1xcdH1cXG4gXFxuIFxcdHJldHVybiBwYWdlO1xcbiB9XFxuQEAgLTY5OSw5ICs3MDMsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXFxuIHtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXHRwbWRfdCBwbWR2YWwgPSAqcG1kO1xcbkBAIC03MzgsMjMgKzc0MiwyNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gI2VuZGlmXFx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXFxuIFxcbiBcXHRwYWdlICs9IChhZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbi1cXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcXG4rXFx0Km5yX3BhZ2VzID0gbWluKEhQQUdFX1BNRF9OUiAtICgoYWRkciBcXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCksXFxuK1xcdFxcdFxcdChlbmQgLSBhZGRyKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4gXFxuIFxcdHJldHVybiBwYWdlO1xcbiB9XFxuIFxcbiAjZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcXG4tXFx0XFx0XFx0XFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0XFx0ICAgIHB1ZF90ICpwdWRwLCBpbnQgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXFxuIHtcXG4gXFx0cmV0dXJuIE5VTEw7XFxuIH1cXG5AQCAtNzk5LDggKzgwNSw0NiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4gXFx0cmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkXFxuKyAqIGxhcmdlIEBmb2xpbyBtYXBzIGNvbnRpZ3VvdXNseSBhbmQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGVcXG4rICogcGFnZSBhdCBAYWRkcmVzczogY29uc2VjdXRpdmUgcHJlc2VudCBQVEVzIG1hcHBpbmcgY29uc2VjdXRpdmUgcGFnZXMgb2ZcXG4rICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLlxcbisgKiBSZXR1cm5zIGF0IGxlYXN0IDEuXFxuKyAqXFxuKyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpc1xcbisgKiBhbHdheXMgc2FmZTogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLCBhbmQgRk9MTF9XUklURSBpcyBzYXRpc2ZpZWQuXFxuKyAqIEEgcmVhZC1vbmx5IHJ1biBpcyBvbmx5IHNhZmUgZm9yIGEgcGxhaW4gcmVhZDsgRk9MTF9XUklURSB3b3VsZCBuZWVkIGEgQ09XXFxuKyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLFxcbisgKiBzbyB0aG9zZSBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgcGFnZS5cXG4rICovXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xcbitcXHR1bnNpZ25lZCBsb25nIG1heDtcXG4rXFxuK1xcdGlmICghcHRlX3dyaXRlKHB0ZSkgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGZvbGlvX3B0ZV9iYXRjaF9mbGFncygpIHNjYW5zIGZvcndhcmQgZnJvbSBAcHRlcCwgc28gdGhlIHJ1biBtdXN0XFxuK1xcdCAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kXFxuK1xcdCAqIHRoZSBWTUEsIHNpbmNlIGEgbGFyZ2UgZm9saW8gY2FuIGJlIFBURS1tYXBwZWQgYWNyb3NzIGEgUE1EIGJvdW5kYXJ5LlxcbitcXHQgKi9cXG4rXFx0bWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsXFxuK1xcdFxcdCAgKHZtYS1cXHUwMDNldm1fZW5kIC0gYWRkcmVzcykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuK1xcdGlmIChtYXggXFx1MDAzYz0gMSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRyZXR1cm4gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB0ZXAsIFxcdTAwMjZiYXRjaF9wdGUsIG1heCxcXG4rXFx0XFx0XFx0XFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSk7XFxuK31cXG4rXFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncylcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcXG4rXFx0XFx0dW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuQEAgLTg4NSw2ICs5MjksMTUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRmb2xpb19tYXJrX2FjY2Vzc2VkKGZvbGlvKTtcXG4gXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvIGNhbiBiZSBoYW5kZWQgYmFjayBhcyBhIGNvbnRpZ3VvdXMgYmF0Y2gsXFxuK1xcdCAqIHNvIHRoZSBjYWxsZXIgYWR2YW5jZXMgb3ZlciB0aGUgd2hvbGUgcnVuIGluIG9uZSBzdGVwIGluc3RlYWQgb2ZcXG4rXFx0ICogd2Fsa2luZyB0aGUgcGFnZSB0YWJsZXMgZm9yIGV2ZXJ5IHBhZ2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuK1xcdFxcdCpucl9wYWdlcyA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCBlbmQsIGZvbGlvLCBwYWdlLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHB0ZXAsIHB0ZSwgZmxhZ3MpO1xcbiBvdXQ6XFxuIFxcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcXG4gXFx0cmV0dXJuIHBhZ2U7XFxuQEAgLTg5Niw5ICs5NDksOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0XFx0ICAgIHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRwbWRfdCAqcG1kLCBwbWR2YWw7XFxuIFxcdHNwaW5sb2NrX3QgKnB0bDtcXG5AQCAtOTEyLDcgKzk2NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRpZiAoIXBtZF9wcmVzZW50KHBtZHZhbCkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXHRpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSlcXG4tXFx0XFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xcbitcXHRcXHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBucl9wYWdlcyk7XFxuIFxcbiBcXHRpZiAocG1kX3Byb3Rub25lKHBtZHZhbCkgXFx1MDAyNlxcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxcbiBcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG5AQCAtOTI1LDI0ICs5NzgsMjQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdH1cXG4gXFx0aWYgKHVubGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSkge1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbi1cXHRcXHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XFxuK1xcdFxcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTtcXG4gXFx0fVxcbiBcXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcXHUwMDI2XFx1MDAyNiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1NQTElUX1BNRCkpIHtcXG4gXFx0XFx0c3Bpbl91bmxvY2socHRsKTtcXG4gXFx0XFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpO1xcbiBcXHRcXHQvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovXFxuIFxcdFxcdHJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDpcXG4tXFx0XFx0XFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XFxuK1xcdFxcdFxcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xcbiBcXHR9XFxuLVxcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wbWQodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBucl9wYWdlcyk7XFxuIFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuIFxcdHJldHVybiBwYWdlO1xcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcDRkX3QgKnA0ZHAsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcDRkX3QgKnA0ZHAsIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxcbiB7XFxuIFxcdHB1ZF90ICpwdWRwLCBwdWQ7XFxuIFxcdHNwaW5sb2NrX3QgKnB0bDtcXG5AQCAtOTU1LDcgKzEwMDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuIFxcdGlmIChwdWRfbGVhZihwdWQpKSB7XFxuIFxcdFxcdHB0bCA9IHB1ZF9sb2NrKG1tLCBwdWRwKTtcXG4tXFx0XFx0cGFnZSA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRcXHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpO1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbiBcXHRcXHRpZiAocGFnZSlcXG4gXFx0XFx0XFx0cmV0dXJuIHBhZ2U7XFxuQEAgLTk2NCwxMyArMTAxNywxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXG4tXFx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpO1xcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcGdkX3QgKnBnZHAsIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxcbiB7XFxuIFxcdHA0ZF90ICpwNGRwLCBwNGQ7XFxuIFxcbkBAIC05ODEsMTUgKzEwMzQsMTYgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdGlmICghcDRkX3ByZXNlbnQocDRkKSB8fCBwNGRfYmFkKHA0ZCkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXG4tXFx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIHA0ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwNGRwLCBmbGFncywgbnJfcGFnZXMpO1xcbiB9XFxuIFxcbiAvKipcXG4gICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXFxuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcXG4gICogQGFkZHJlc3M6IHZpcnR1YWwgYWRkcmVzcyB0byBsb29rIHVwXFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxcbi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFza1xcbisgKiBAbnJfcGFnZXM6IG91dHB1dDsgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGNhbGxlciBjYW4gcmVhZFxcbiAgKlxcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAgKlxcbkBAIC05OTgsMTUgKzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxcbiAgKiByZWxldmFudCB3aXRoIEZPTExfUElOIGFuZCAhRk9MTF9XUklURS5cXG4gICpcXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXFxuKyAqIE9uIG91dHB1dCwgQG5yX3BhZ2VzIGhvbGRzIGhvdyBtYW55IGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGZvbGlvIHRoYXQgaW5jbHVkZXNcXG4rICogdGhlIHJldHVybmVkIHBhZ2UgaGFzIG1hcHBlZCBpbnRvIHRoaXMgcHJvY2Vzcywgc28gdGhlIGNhbGxlciBjYW4gYWR2YW5jZVxcbisgKiBvdmVyIGEgbGFyZ2UgZm9saW8gaW4gb25lIHN0ZXAuXFxuICAqXFxuICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxcbiAgKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXFxuICAqIGJ5IGEgcGFnZSBkZXNjcmlwdG9yIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cXG4gICovXFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcXG4rXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRwZ2RfdCAqcGdkO1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuQEAgLTEwMTQsMTMgKzEwNzAsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0dm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpO1xcbiBcXG4tXFx0KnBhZ2VfbWFzayA9IDA7XFxuK1xcdCpucl9wYWdlcyA9IDE7XFxuIFxcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpO1xcbiBcXG4gXFx0aWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKVxcbiBcXHRcXHRwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4gXFx0ZWxzZVxcbi1cXHRcXHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0XFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgbnJfcGFnZXMpO1xcbiBcXG4gXFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcXG4gXFxuQEAgLTEwODAsOSArMTEzNiwxNiBAQCBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4gfVxcbiBcXG4gLypcXG4tICogbW1hcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeS4gIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3RcXG4tICogRk9MTF9OT1dBSVQsIHRoZSBtbWFwX2xvY2sgbWF5IGJlIHJlbGVhc2VkLiAgSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0XFxuLSAqIHRvIDAgYW5kIC1FQlVTWSByZXR1cm5lZC5cXG4rICogVGhlIGNhbGxlciBob2xkcyBlaXRoZXIgdGhlIG1tYXAgbG9jaywgb3IgdGhlIHBlci1WTUEgbG9jayAod2l0aFxcbisgKiBGT0xMX1ZNQV9MT0NLKSwgb24gZW50cnkuIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3QgRk9MTF9OT1dBSVQsXFxuKyAqIHRoZSBtbWFwX2xvY2sgbWF5IGJlIHJlbGVhc2VkLiBJZiBpdCBpcywgKkBsb2NrZWQgd2lsbCBiZSBzZXQgdG8gMCBhbmRcXG4rICogLUVBR0FJTiByZXR1cm5lZC5cXG4rICpcXG4rICogVGhlIHJldHVybiB2YWx1ZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGxvY2sgdHlwZTogYSBmYXVsdCB0aGF0IG1hZGVcXG4rICogcHJvZ3Jlc3MgYnV0IG5lZWRzIGEgcmV0cnkgKFZNX0ZBVUxUX1JFVFJZIC8gVk1fRkFVTFRfQ09NUExFVEVEKSBpcyByZXBvcnRlZFxcbisgKiBhcyAtRUFHQUlOIGZvciBib3RoIHRoZSBtbWFwIGxvY2sgYW5kIHRoZSBwZXItVk1BIGxvY2sgKEZPTExfVk1BX0xPQ0spLiBPbmx5XFxuKyAqIHRoZSAqQGxvY2tlZCBzaWRlIGVmZmVjdCBpcyBsb2NrLXR5cGUgc3BlY2lmaWMsIGFzIHRoZSBwZXItVk1BIGxvY2sgcGF0aCBoYXNcXG4rICogbm8gdW5sb2NrYWJsZSBtbWFwX2xvY2sgdG8gZHJvcC5cXG4gICovXFxuIHN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBmbGFncywgYm9vbCB1bnNoYXJlLFxcbkBAIC0xMDk3LDYgKzExNjAsOCBAQCBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19XUklURTtcXG4gXFx0aWYgKGZsYWdzIFxcdTAwMjYgRk9MTF9SRU1PVEUpXFxuIFxcdFxcdGZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfUkVNT1RFO1xcbitcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1ZNQV9MT0NLKVxcbitcXHRcXHRmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1ZNQV9MT0NLO1xcbiBcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1VOTE9DS0FCTEUpIHtcXG4gXFx0XFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19BTExPV19SRVRSWSB8IEZBVUxUX0ZMQUdfS0lMTEFCTEU7XFxuIFxcdFxcdC8qXFxuQEAgLTExMjUsNDEgKzExOTAsMTk1IEBAIHN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0cmV0ID0gaGFuZGxlX21tX2ZhdWx0KHZtYSwgYWRkcmVzcywgZmF1bHRfZmxhZ3MsIE5VTEwpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogQSBmdWxseSBjb21wbGV0ZWQgZmF1bHQgKFZNX0ZBVUxUX0NPTVBMRVRFRCkgb3Igb25lIHRoYXQgbmVlZHMgYSByZXRyeVxcbitcXHQgKiAoVk1fRkFVTFRfUkVUUlkpIGhhcyByZWxlYXNlZCB0aGUgbG9jayBpdCB3YXMgaG9sZGluZy4gUmVwb3J0IGJvdGggYXNcXG4rXFx0ICogLUVBR0FJTiBzbyB0aGUgY2FsbGVyIHJldHJpZXM6IHRoZSBtbWFwIGxvY2sgY2FsbGVyIHJldGFrZXMgaXQgaGVyZSxcXG4rXFx0ICogdGhlIHBlci1WTUEgbG9jayBjYWxsZXIgKEZPTExfVk1BX0xPQ0spIGZhbGxzIGJhY2sgdG8gdGhlIG1tYXAgbG9jay5cXG4rXFx0ICpcXG4rXFx0ICogRHJvcHBpbmcgdGhlIG1tYXAgbG9jayBpcyByZWNvcmRlZCBpbiAqQGxvY2tlZC4gVGhlcmUgaXMgbm8gc3VjaCBsb2NrXFxuK1xcdCAqIHRvIGRyb3AgdW5kZXIgdGhlIHBlci1WTUEgbG9jaywgd2hlcmUgQGxvY2tlZCBpcyBub3QgdXNlZCwgc28gbGVhdmUgaXRcXG4rXFx0ICogYWxvbmUgaW4gdGhhdCBjYXNlLlxcbitcXHQgKi9cXG4gXFx0aWYgKHJldCBcXHUwMDI2IFZNX0ZBVUxUX0NPTVBMRVRFRCkge1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJ2xsIG5ldmVyIHJlbGVhc2UgdGhlXFxuLVxcdFxcdCAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcXHUwMDI2IEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUKTtcXG4tXFx0XFx0KmxvY2tlZCA9IDA7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXZSBzaG91bGQgZG8gdGhlIHNhbWUgYXMgVk1fRkFVTFRfUkVUUlksIGJ1dCBsZXQncyBub3RcXG4tXFx0XFx0ICogcmV0dXJuIC1FQlVTWSBzaW5jZSB0aGF0J3Mgbm90IHJlZmxlY3RpbmcgdGhlIHJlYWxpdHkgb2ZcXG4tXFx0XFx0ICogd2hhdCBoYXMgaGFwcGVuZWQgLSB3ZSd2ZSBqdXN0IGZ1bGx5IGNvbXBsZXRlZCBhIHBhZ2VcXG4tXFx0XFx0ICogZmF1bHQsIHdpdGggdGhlIG1tYXAgbG9jayByZWxlYXNlZC4gIFVzZSAtRUFHQUlOIHRvIHNob3dcXG4tXFx0XFx0ICogdGhhdCB3ZSB3YW50IHRvIHRha2UgdGhlIG1tYXAgbG9jayBfYWdhaW5fLlxcbi1cXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCEoZmxhZ3MgXFx1MDAyNiBGT0xMX1ZNQV9MT0NLKSkge1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJ2xsIG5ldmVyIHJlbGVhc2UgdGhlXFxuK1xcdFxcdFxcdCAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcXHUwMDI2IEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUKTtcXG4rXFx0XFx0XFx0KmxvY2tlZCA9IDA7XFxuK1xcdFxcdH1cXG4gXFx0XFx0cmV0dXJuIC1FQUdBSU47XFxuIFxcdH1cXG4gXFxuIFxcdGlmIChyZXQgXFx1MDAyNiBWTV9GQVVMVF9FUlJPUikge1xcbiBcXHRcXHRpbnQgZXJyID0gdm1fZmF1bHRfdG9fZXJybm8ocmV0LCBmbGFncyk7XFxuIFxcbi1cXHRcXHRpZiAoZXJyKVxcbi1cXHRcXHRcXHRyZXR1cm4gZXJyO1xcbi1cXHRcXHRCVUcoKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVk1fRkFVTFRfRVJST1IgYWx3YXlzIGRlY29kZXMgdG8gYW4gZXJybm87IGEgemVybyBoZXJlIHdvdWxkXFxuK1xcdFxcdCAqIG1lYW4gaGFuZGxlX21tX2ZhdWx0KCkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCBjb21iaW5hdGlvbi5cXG4rXFx0XFx0ICogUmVwb3J0IC1FRkFVTFQgcmF0aGVyIHRoYW4gY3Jhc2g6IHVuZGVyIHRoZSBwZXItVk1BIGxvY2sgdGhlXFxuK1xcdFxcdCAqIG1tYXAgbG9jayByZXRyeSBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSByZXN1bHQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRWTV9XQVJOX09OX09OQ0UoIWVycik7XFxuK1xcdFxcdHJldHVybiBlcnIgPyBlcnIgOiAtRUZBVUxUO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAocmV0IFxcdTAwMjYgVk1fRkFVTFRfUkVUUlkpIHtcXG4tXFx0XFx0aWYgKCEoZmF1bHRfZmxhZ3MgXFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCkpXFxuK1xcdFxcdGlmICghKGZsYWdzIFxcdTAwMjYgRk9MTF9WTUFfTE9DSykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgICEoZmF1bHRfZmxhZ3MgXFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCkpXFxuIFxcdFxcdFxcdCpsb2NrZWQgPSAwO1xcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRcXHRyZXR1cm4gLUVBR0FJTjtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIGdldF91c2VyX3BhZ2Vfdm1hIC0gZ2V0IG9uZSBwYWdlIGZyb20gQHZtYSwgd2hvc2UgbG9jayB0aGUgY2FsbGVyIGFscmVhZHlcXG4rICogaG9sZHM6IHRoZSBtbWFwIGxvY2ssIG9yICh3aXRoIEZPTExfVk1BX0xPQ0spIHRoZSBwZXItVk1BIGxvY2suIFdhbGtzIHRoZVxcbisgKiBwYWdlIHRhYmxlcywgZmF1bHRpbmcgdGhlIHBhZ2UgaW4gaWYgbmVlZGVkLCBhbmQgb24gc3VjY2VzcyByZXR1cm5zIGl0IHdpdGhcXG4rICogYSByZWZlcmVuY2UgYW5kIHRoZSBsb2NrIHN0aWxsIGhlbGQuXFxuKyAqXFxuKyAqIFJ1bnMgY2hlY2tfdm1hX2ZsYWdzKCkgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHNvIGNhbGxlcnMgbmVlZCBub3QgcHJlLWNoZWNrXFxuKyAqIHRoZSBWTUE7IG1vc3QgcmVqZWN0aW9ucyBhcmUgcmV0dXJuZWQgYXMgdGhlaXIgZXJyb3IuIEEgVk1fSU8vVk1fUEZOTUFQIFZNQVxcbisgKiBpcyB0aGUgZXhjZXB0aW9uOiBhIENPV2VkIHBhZ2Ugd2l0aCBhIHN0cnVjdCBwYWdlIGlzIHJldHVybmVkLCB3aGlsZSBhIHJhd1xcbisgKiBQRk4gaGFzIG5vbmUgYW5kIHlpZWxkcyAtRUZBVUxULCB0byBiZSByZWFjaGVkIHZpYSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKCkuXFxuKyAqXFxuKyAqIFVuZGVyIEZPTExfVk1BX0xPQ0ssIGFueXRoaW5nIHRoYXQgY2Fubm90IGJlIGZpbmlzaGVkIHVuZGVyIHRoZSBwZXItVk1BIGxvY2tcXG4rICogKGEgZHJvcHBlZCBmYXVsdCwgdXNlcmZhdWx0ZmQsIGEgaGFyZCBlcnJvciwgb3IgLVxcdTAwM2VhY2Nlc3MoKSBtZW1vcnkpIHJlbGVhc2VzXFxuKyAqIHRoZSBsb2NrIGFuZCByZXR1cm5zIC1FQUdBSU4sIHNvIHRoZSBjYWxsZXIgcmV0cmllcyB1bmRlciB0aGUgbW1hcCBsb2NrLlxcbisgKi9cXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxcbit7XFxuK1xcdGJvb2wgdm1hX2xvY2tlZCA9IGd1cF9mbGFncyBcXHUwMDI2IEZPTExfVk1BX0xPQ0s7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XFxuK1xcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRpbnQgbG9ja2VkID0gMTtcXG4rXFx0Ym9vbCBwZm5tYXA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUd28gbG9jayBtb2RlcyBhcmUgc3VwcG9ydGVkOiB0aGUgbW1hcCBsb2NrLCB3aXRoIG5laXRoZXIgZmxhZywgb3JcXG4rXFx0ICogdGhlIHBlci1WTUEgbG9jaywgd2l0aCBib3RoIEZPTExfVk1BX0xPQ0sgYW5kIEZPTExfVU5MT0NLQUJMRS4gQW5cXG4rXFx0ICogdW5sb2NrYWJsZSBtbWFwIGZhdWx0IHdvdWxkIGRyb3AgdGhlIGxvY2sgYW5kIHJlcG9ydCBpdCBpbiAqbG9ja2VkLFxcbitcXHQgKiB3aGljaCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlbGF5LCBzbyByZWplY3QgYSBsb25lIGZsYWcuXFxuK1xcdCAqL1xcbitcXHRWTV9XQVJOX09OX09OQ0UoIShndXBfZmxhZ3MgXFx1MDAyNiBGT0xMX1ZNQV9MT0NLKSAhPSAhKGd1cF9mbGFncyBcXHUwMDI2IEZPTExfVU5MT0NLQUJMRSkpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVmFsaWRhdGUgdGhlIFZNQSB1cCBmcm9udCwgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCkuIEEgVk1fSU8vVk1fUEZOTUFQXFxuK1xcdCAqIFZNQSBpcyBub3QgcmVqZWN0ZWQgb3V0cmlnaHQ6IGl0IGNhbiBob2xkIENPV2VkIHBhZ2VzIHRoYXQgaGF2ZSBhXFxuK1xcdCAqIHN0cnVjdCBwYWdlOyBsZXQgZm9sbG93X3BhZ2VfbWFzaygpIGxvb2sgZm9yIHRoZW0sIGFuZCB0cmVhdCBvbmx5XFxuK1xcdCAqIGl0cyBzdHJ1Y3QtcGFnZS1sZXNzIFBGTnMgYXMgdW5yZWFjaGFibGUuIE90aGVyIHJlamVjdGlvbnNcXG4rXFx0ICogKHNlY3JldG1lbSwgcGVybWlzc2lvbnMsIGV0YykgcmVzdWx0IGluIGltbWVkaWF0ZSBmYWlsdXJlLlxcbitcXHQgKi9cXG4rXFx0cmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCBWTV9JTyB8IFZNX1BGTk1BUCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0cGZubWFwID0gdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IChWTV9JTyB8IFZNX1BGTk1BUCk7XFxuK1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdGlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkge1xcbitcXHRcXHRcXHRyZXQgPSAtRUlOVFI7XFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0fVxcbitcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4rXFxuK1xcdFxcdC8qIFRoaXMgaGVscGVyIGhhbmRzIGJhY2sgYSBzaW5nbGUgcGFnZTsgY2FwIHRoZSBiYXRjaCBhdCBvbmUuICovXFxuK1xcdFxcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgYWRkciwgYWRkciArIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0Z3VwX2ZsYWdzIHwgRk9MTF9UT1VDSCB8IEZPTExfR0VULFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2bnJfcGFnZXMpO1xcbitcXHRcXHRpZiAoIUlTX0VSUl9PUl9OVUxMKHBhZ2UpKSB7XFxuK1xcdFxcdFxcdC8qIE1hdGNoIF9fZ2V0X3VzZXJfcGFnZXMoKTogZmx1c2ggZm9yIFZJVlQvYWxpYXNpbmcgY2FjaGVzLiAqL1xcbitcXHRcXHRcXHRmbHVzaF9hbm9uX3BhZ2Uodm1hLCBwYWdlLCBhZGRyKTtcXG4rXFx0XFx0XFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7XFxuK1xcdFxcdFxcdHJldHVybiBwYWdlO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBObyBzdHJ1Y3QgcGFnZTogYSByYXcgUEZOIG9mIGEgVk1fSU8vVk1fUEZOTUFQIFZNQSwgd2hldGhlclxcbitcXHRcXHQgKiBzZWVuIGJ5IHRoZSB1cC1mcm9udCBjaGVjayAoQHBmbm1hcCkgb3IgcmVwb3J0ZWQgYXMgLUVFWElTVFxcbitcXHRcXHQgKiBmb3IgYSBwcmVzZW50IFBGTi4gUmV0dXJuIC1FRkFVTFQgc28gdGhlIGNhbGxlciByZWFjaGVzIGl0XFxuK1xcdFxcdCAqIHRocm91Z2ggdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWFjY2VzcygpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHBmbm1hcCB8fCBQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVGQVVMVDtcXG4rXFx0XFx0XFx0Z290byBmYWlsO1xcbitcXHRcXHR9XFxuK1xcdFxcdC8qIEEgaGFyZCBlcnJvciBmcm9tIHRoZSB3YWxrIGl0c2VsZi4gKi9cXG4rXFx0XFx0aWYgKHBhZ2UgXFx1MDAyNlxcdTAwMjYgUFRSX0VSUihwYWdlKSAhPSAtRU1MSU5LKSB7XFxuK1xcdFxcdFxcdHJldCA9IFBUUl9FUlIocGFnZSk7XFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhlIHBhZ2UgaXMgbm90IHByZXNlbnQsIG9yIG5lZWRzIHVuc2hhcmluZy4gQSByZW1vdGUgZmF1bHRcXG4rXFx0XFx0ICogdW5kZXIgdGhlIHBlci1WTUEgbG9jayBjYW5ub3QgZGVsaXZlciB1c2VyZmF1bHRmZCAod2hpY2hcXG4rXFx0XFx0ICogYXNzdW1lcyBjdXJyZW50IGlzIHRoZSBmYXVsdGluZyB0YXNrKSwgc28gZmFsbCBiYWNrIGZvciB0aG9zZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmICh2bWFfbG9ja2VkIFxcdTAwMjZcXHUwMDI2IHVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0XFx0Z290byBmYWlsO1xcbitcXHRcXHR9XFxuK1xcdFxcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9HRVQsXFxuK1xcdFxcdFxcdFxcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgXFx1MDAyNmxvY2tlZCk7XFxuK1xcdFxcdGlmIChyZXQgPT0gLUVBR0FJTilcXG4rXFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XFx0LyogZmF1bHQgcmVsZWFzZWQgdGhlIHBlci1WTUEgbG9jayAqL1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK2ZhaWw6XFxuK1xcdC8qXFxuK1xcdCAqIFVuZGVyIHRoZSBwZXItVk1BIGxvY2sgdGhlIGNhbGxlciBjYW5ub3QgcmVhY2ggLVxcdTAwM2VhY2Nlc3MoKSBvciBhY3Qgb24gYVxcbitcXHQgKiBoYXJkIGVycm9yIChib3RoIG5lZWQgdGhlIG1tYXAgbG9jayksIHNvIHJlbGVhc2UgdGhlIGxvY2sgYW5kIGhhdmUgaXRcXG4rXFx0ICogcmV0cnkgdGhlcmU7IHRoZSBtbWFwLWxvY2sgcGFzcyBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSBlcnJvci5cXG4rXFx0ICovXFxuK1xcdGlmICh2bWFfbG9ja2VkKSB7XFxuK1xcdFxcdHZtYV9lbmRfcmVhZCh2bWEpO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gRVJSX1BUUihyZXQpO1xcbit9XFxuK1xcbisvKlxcbisgKiBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEgLSBmYXVsdCBpbiBvbmUgcGFnZSBvZiBhIHJlbW90ZSBtbSBhbmQgaGFuZCBiYWNrIHRoZVxcbisgKiBwYWdlIGFsb25nIHdpdGggdGhlIFZNQSB0aGF0IGNvdmVycyBpdC4gVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIG1tYXBfbG9jay5cXG4rICogUmV0dXJucyB3aXRoIHRoZSBtbWFwX2xvY2sgc3RpbGwgaGVsZC5cXG4rICpcXG4rICogTG9va3MgdXAgdGhlIFZNQSwgYW5kIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgdGhyb3VnaFxcbisgKiBnZXRfdXNlcl9wYWdlX3ZtYSgpLCBmYXVsdGluZyBpbiB0aGUgcGFnZSBpZiBuZWVkZWQuXFxuKyAqXFxuKyAqIEZPTExfTk9XQUlUIGFuZCBGT0xMX1VOTE9DS0FCTEUgYXJlIHJlamVjdGVkOiBib3RoIGxldCB0aGUgZmF1bHQgaGFuZGxlclxcbisgKiBkcm9wIHRoZSBtbWFwIGxvY2ssIHdoaWNoIGNvdWxkIGludmFsaWRhdGUgdGhlIGxvb2tlZC11cCBWTUEuXFxuKyAqL1xcbitzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGludCBndXBfZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXFxuK3tcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuK1xcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXG4rXFx0aWYgKFdBUk5fT05fT05DRSh1bmxpa2VseShndXBfZmxhZ3MgXFx1MDAyNiAoRk9MTF9OT1dBSVQgfCBGT0xMX1VOTE9DS0FCTEUpKSkpXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXG4rXFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcXG4rXFxuK1xcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xcbitcXHRpZiAoIXZtYSlcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuK1xcbitcXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWEodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfVE9VQ0gpO1xcbitcXHRpZiAoSVNfRVJSKHBhZ2UpKVxcbitcXHRcXHRyZXR1cm4gcGFnZTtcXG4rXFxuK1xcdCp2bWFwID0gdm1hO1xcbitcXHRyZXR1cm4gcGFnZTtcXG4rfVxcbitcXG4gLypcXG4gICogV3JpdGluZyB0byBmaWxlLWJhY2tlZCBtYXBwaW5ncyB3aGljaCByZXF1aXJlIGZvbGlvIGRpcnR5IHRyYWNraW5nIHVzaW5nIEdVUFxcbiAgKiBpcyBhIGZ1bmRhbWVudGFsbHkgYnJva2VuIG9wZXJhdGlvbiwgYXMga2VybmVsIHdyaXRlIGFjY2VzcyB0byBHVVAgbWFwcGluZ3NcXG5AQCAtMTE5NywxMyArMTQxNiwyMSBAQCBzdGF0aWMgYm9vbCB3cml0YWJsZV9maWxlX21hcHBpbmdfYWxsb3dlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0cmV0dXJuICF2bWFfbmVlZHNfZGlydHlfdHJhY2tpbmcodm1hKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBjaGVja192bWFfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZ3VwX2ZsYWdzKVxcbitpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncyxcXG4rXFx0XFx0ICAgIHZtX2ZsYWdzX3QgaWdub3JlX2ZsYWdzKVxcbiB7XFxuIFxcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MgPSB2bWEtXFx1MDAzZXZtX2ZsYWdzO1xcbiBcXHRpbnQgd3JpdGUgPSAoZ3VwX2ZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSk7XFxuIFxcdGludCBmb3JlaWduID0gKGd1cF9mbGFncyBcXHUwMDI2IEZPTExfUkVNT1RFKTtcXG4gXFx0Ym9vbCB2bWFfYW5vbiA9IHZtYV9pc19hbm9ueW1vdXModm1hKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIE9wdCBvdXQgb2YgdGhlIGZsYWcgY2hlY2tzIHRoYXQgcmVhZCB0aGlzIGxvY2FsIGNvcHkgKHRoZVxcbitcXHQgKiBWTV9JTy9WTV9QRk5NQVAgZ2F0ZSBhbmQgdGhlIHdyaXRlL3JlYWQvY293IGJpdHMpOyBjaGVja3MgdGhhdFxcbitcXHQgKiByZS1yZWFkIHZtYS1cXHUwMDNldm1fZmxhZ3MgdGhyb3VnaCBoZWxwZXJzIGFyZSB1bmFmZmVjdGVkLlxcbitcXHQgKi9cXG4rXFx0dm1fZmxhZ3MgXFx1MDAyNj0gfmlnbm9yZV9mbGFncztcXG4rXFxuIFxcdGlmICh2bV9mbGFncyBcXHUwMDI2IChWTV9JTyB8IFZNX1BGTk1BUCkpXFxuIFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiBcXG5AQCAtMTM1OCw3ICsxNTg1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4ge1xcbiBcXHRsb25nIHJldCA9IDAsIGkgPSAwO1xcbiBcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcXG4gXFxuIFxcdGlmICghbnJfcGFnZXMpXFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC0xMzczLDcgKzE1OTksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXG4gXFx0ZG8ge1xcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0XFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaW5jcmVtO1xcbiBcXG4gXFx0XFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xcbiBcXHRcXHRpZiAoIXZtYSB8fCBzdGFydCBcXHUwMDNlPSB2bWEtXFx1MDAzZXZtX2VuZCkge1xcbkBAIC0xMzg3LDcgKzE2MTMsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbiBcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRcXHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkge1xcbitcXHRcXHRcXHRcXHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKSkge1xcbiBcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbiBcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0XFx0fVxcbkBAIC0xNDAwLDcgKzE2MjYsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRwYWdlcyA/IFxcdTAwMjZwYWdlIDogTlVMTCk7XFxuIFxcdFxcdFxcdFxcdGlmIChyZXQpXFxuIFxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHRcXHRwYWdlX21hc2sgPSAwO1xcbitcXHRcXHRcXHRcXHRwYWdlX2luY3JlbSA9IDE7XFxuIFxcdFxcdFxcdFxcdGdvdG8gbmV4dF9wYWdlO1xcbiBcXHRcXHRcXHR9XFxuIFxcbkBAIC0xNDA4LDcgKzE2MzQsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHRcXHRcXHRyZXQgPSAtRUZBVUxUO1xcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MpO1xcbitcXHRcXHRcXHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApO1xcbiBcXHRcXHRcXHRpZiAocmV0KVxcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbkBAIC0xNDIzLDcgKzE2NDksOCBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHR9XFxuIFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbiBcXG4tXFx0XFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCBcXHUwMDI2cGFnZV9tYXNrKTtcXG4rXFx0XFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgKyBucl9wYWdlcyAqIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0Z3VwX2ZsYWdzLCBcXHUwMDI2cGFnZV9pbmNyZW0pO1xcbiBcXHRcXHRpZiAoIXBhZ2UgfHwgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LKSB7XFxuIFxcdFxcdFxcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXFxuIFxcdFxcdFxcdFxcdFxcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcXG5AQCAtMTQ1Niw3ICsxNjgzLDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdFxcdH1cXG4gbmV4dF9wYWdlOlxcbi1cXHRcXHRwYWdlX2luY3JlbSA9IDEgKyAofihzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKSBcXHUwMDI2IHBhZ2VfbWFzayk7XFxuIFxcdFxcdGlmIChwYWdlX2luY3JlbSBcXHUwMDNlIG5yX3BhZ2VzKVxcbiBcXHRcXHRcXHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xcbiBcXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcXG5pbmRleCAxODFlNzlmMWQ2YTIwNy4uNzA2ZjdmMDhmZDE4MTUgMTAwNjQ0XFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxcbisrKyBiL21tL2ludGVybmFsLmhcXG5AQCAtMTU5NSw2ICsxNTk1LDEwIEBAIHN0cnVjdCB2bV9zdHJ1Y3QgKl9fZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsXFxuICAqL1xcbiBpbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxcbiBcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MpO1xcbitpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncyxcXG4rXFx0XFx0ICAgIHZtX2ZsYWdzX3QgaWdub3JlX2ZsYWdzKTtcXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKTtcXG4gXFxuIC8qXFxuICAqIG1tL2h1Z2VfbWVtb3J5LmNcXG5AQCAtMTY0MSwxMSArMTY0NSwxMyBAQCBlbnVtIHtcXG4gXFx0Rk9MTF9VTkxPQ0tBQkxFID0gMSBcXHUwMDNjXFx1MDAzYyAyMSxcXG4gXFx0LyogVk1BIGxvb2t1cCtjaGVja3MgY29tcGF0aWJsZSB3aXRoIE1BRFZfUE9QVUxBVEVfKFJFQUR8V1JJVEUpICovXFxuIFxcdEZPTExfTUFEVl9QT1BVTEFURSA9IDEgXFx1MDAzY1xcdTAwM2MgMjIsXFxuK1xcdC8qIGNhbGxlciBob2xkcyB0aGUgcGVyLVZNQSBsb2NrLCBub3QgdGhlIG1tYXAgbG9jayAqL1xcbitcXHRGT0xMX1ZNQV9MT0NLID0gMSBcXHUwMDNjXFx1MDAzYyAyMyxcXG4gfTtcXG4gXFxuICNkZWZpbmUgSU5URVJOQUxfR1VQX0ZMQUdTIChGT0xMX1RPVUNIIHwgRk9MTF9UUklFRCB8IEZPTExfUkVNT1RFIHwgRk9MTF9QSU4gfCBcXFxcXFxuIFxcdFxcdFxcdCAgICBGT0xMX0ZBU1RfT05MWSB8IEZPTExfVU5MT0NLQUJMRSB8IFxcXFxcXG4tXFx0XFx0XFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSlcXG4rXFx0XFx0XFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSB8IEZPTExfVk1BX0xPQ0spXFxuIFxcbiAvKlxcbiAgKiBJbmRpY2F0ZXMgZm9yIHdoaWNoIHBhZ2VzIHRoYXQgYXJlIHdyaXRlLXByb3RlY3RlZCBpbiB0aGUgcGFnZSB0YWJsZSxcXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuY1xcbmluZGV4IGZmMzM4YzJhYmU5MjMxLi5hYWY2MjAwMTdmMzQ0MiAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnkuY1xcbisrKyBiL21tL21lbW9yeS5jXFxuQEAgLTcwMTUsODYgKzcwMTUsMjQ0IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGdlbmVyaWNfYWNjZXNzX3BoeXMpO1xcbiAjZW5kaWZcXG4gXFxuIC8qXFxuLSAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXFxuKyAqIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeSwgc3VjaCBhcyBhbiBpb3JlbWFwcGVkIGRldmljZSBtYXBwaW5nLCBtYXBzXFxuKyAqIFBGTnMgdGhhdCBoYXZlIG5vIHN0cnVjdCBwYWdlLCBzbyBnZXRfdXNlcl9wYWdlX3ZtYSgpIGNhbm5vdCBmZXRjaCBpdFxcbisgKiBldmVuIHRob3VnaCB0aGUgcGFnZSB0YWJsZXMgYXJlIHBvcHVsYXRlZC4gSXQgY2FuIHN0aWxsIGJlIHJlYWNoZWRcXG4rICogdGhyb3VnaCB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKCkuXFxuKyAqXFxuKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3IgXFx1MDAzYz0gMCBpZiBAdm1hIGNhbm5vdCBiZVxcbisgKiBhY2Nlc3NlZCB0aGlzIHdheS5cXG4gICovXFxuLXN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLVxcdFxcdFxcdCAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4rc3RhdGljIGludCBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4rXFx0XFx0XFx0XFx0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxcbit7XFxuKyNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1RcXG4rXFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxuK1xcdFxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTtcXG4rI2VuZGlmXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBMb2NrIEBtbSB0byByZWFjaCB0aGUgcmVtb3RlIHJhbmdlIFtAYWRkciwgQGFkZHIgKyBAbGVuKS5cXG4rICpcXG4rICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlXFxuKyAqIGZsYWdzIHBlcm1pdCB0aGUgYWNjZXNzLiBUaGUgUkNVIGZyZWVkIHBhZ2UgdGFibGVzIHRoZW4ga2VlcCBwYWdlIHRhYmxlXFxuKyAqIG1lbW9yeSBmcm9tIGJlaW5nIHJldXNlZCB3aXRoIHVuZXhwZWN0ZWQgY29udGVudHMgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC5cXG4rICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLFxcbisgKiBzdGFjayBleHBhbnNpb24sIGFuZCAtXFx1MDAzZWFjY2VzcygpIG1lbW9yeS5cXG4rICpcXG4rICogUmV0dXJuIHdoZXRoZXIgdGhlIG1tYXAgbG9jayBpcyBoZWxkLiBUaGUgcGVyLVZNQSBsb2NrZWQgVk1BLCB3aGVuIG9uZSBpc1xcbisgKiB0YWtlbiwgaXMgc3RvcmVkIGluICpAdm1hcDsgaXQgaXMgTlVMTCBvbiB0aGUgbW1hcCBsb2NrIHBhdGguICpAdm1hcCBpc1xcbisgKiBzZXQgdG8gYW4gRVJSX1BUUigpIHdoZW4gdGhlIG1tYXAgbG9jayBjb3VsZCBub3QgYmUgdGFrZW4sIHNvIGNhbGxlcnMgbXVzdFxcbisgKiBjaGVjayBJU19FUlIoKkB2bWFwKSBiZWZvcmUgdXNpbmcgZWl0aGVyIHJlc3VsdC5cXG4rICovXFxuK3N0YXRpYyBib29sIHJlbW90ZV9hY2Nlc3NfbG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHQgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncyxcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXFxuK3tcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xcbitcXG4rI2lmIGRlZmluZWQoQ09ORklHX1BFUl9WTUFfTE9DSykgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRSlcXG4rXFx0dm1hID0gbG9ja192bWFfdW5kZXJfcmN1KG1tLCBhZGRyKTtcXG4rXFx0aWYgKHZtYSkge1xcbitcXHRcXHQvKiBhZGRyICsgbGVuIG11c3Qgbm90IHdyYXAsIGFuZCBtdXN0IGZpdCB3aXRoaW4gdGhlIG9uZSBWTUEuICovXFxuK1xcdFxcdGlmIChhZGRyICsgbGVuIFxcdTAwM2MgYWRkciB8fCBhZGRyICsgbGVuIFxcdTAwM2Ugdm1hLVxcdTAwM2V2bV9lbmQgfHxcXG4rXFx0XFx0ICAgIGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCkpIHtcXG4rXFx0XFx0XFx0dm1hX2VuZF9yZWFkKHZtYSk7XFxuK1xcdFxcdFxcdHZtYSA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbisjZW5kaWZcXG4rXFxuK1xcdGlmICghdm1hKSB7XFxuK1xcdFxcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpIHtcXG4rXFx0XFx0XFx0KnZtYXAgPSBFUlJfUFRSKC1FSU5UUik7XFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQqdm1hcCA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHQqdm1hcCA9IHZtYTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbisvKiBSZWxlYXNlIHRoZSBsb2NrIHRha2VuIGJ5IHJlbW90ZV9hY2Nlc3NfbG9jaygpLiAqL1xcbitzdGF0aWMgdm9pZCByZW1vdGVfYWNjZXNzX3VubG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sIGhhdmVfbW1hcF9sb2NrKVxcbit7XFxuK1xcdGlmIChoYXZlX21tYXBfbG9jaylcXG4rXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuK1xcdGVsc2UgaWYgKHZtYSlcXG4rXFx0XFx0dm1hX2VuZF9yZWFkKHZtYSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFBlci1wYWdlIGFjdGlvbiBmb3IgYSByZW1vdGUgVk0gd2Fsay4gSGFuZGxlIHVwIHRvIEBsZW4gYnl0ZXMgYXQgQGFkZHIgb25cXG4rICogQHBhZ2UsIGFkdmFuY2luZyAqQGJ1ZiBwYXN0IHRoZSBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBpdC4gQHBhZ2UgaXNcXG4rICogTlVMTCBmb3Igc3RydWN0LXBhZ2UtbGVzcyBtZW1vcnkgKFZNX0lPIC8gVk1fUEZOTUFQKSByZWFjaGVkIHVuZGVyIHRoZSBtbWFwXFxuKyAqIGxvY2suXFxuKyAqXFxuKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNvdXJjZSBieXRlcyBoYW5kbGVkIGF0IEBhZGRyLCAwIHRvIGVuZCB0aGUgd2FsayAoYVxcbisgKiBzdHJpbmcgcmVhY2hlZCBpdHMgTlVMLCBvciAtXFx1MDAzZWFjY2VzcygpIG1lbW9yeSBjb3VsZCBub3QgYmUgcmVhY2hlZCksIG9yIGFcXG4rICogbmVnYXRpdmUgZXJybm8gdG8gYWJvcnQuXFxuKyAqL1xcbit0eXBlZGVmIGludCAoKnJlbW90ZV92bV9hY3Rpb24pKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4rXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLFxcbitcXHRcXHRcXHRcXHRpbnQgd3JpdGUpO1xcbitcXG4rLypcXG4rICogV2FsayB0aGUgcmVtb3RlIHJhbmdlIFtAYWRkciwgQGFkZHIgKyBAbGVuKSBvZiBAbW0sIGhhbmRpbmcgZWFjaCBwYWdlIHRvXFxuKyAqIEBhY3Rpb24uIFVzZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHJhbmdlIGZpdHMgb25lIFZNQSwgYW5kIGZhbGwgYmFjayB0b1xcbisgKiB0aGUgbW1hcCBsb2NrIGZvciBtdWx0aS1WTUEgcmFuZ2VzLCBzdGFjayBleHBhbnNpb24gKHdoZW4gQGNhbl9leHBhbmRfc3RhY2tcXG4rICogaXMgc2V0KSwgb3Igd2hlbiB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBmaW5pc2ggYSBmYXVsdC5cXG4rICpcXG4rICogRWFjaCBwYWdlIGlzIGZhdWx0ZWQgaW4gd2l0aCBnZXRfdXNlcl9wYWdlX3ZtYSgpIHVuZGVyIHdoaWNoZXZlciBsb2NrIGlzXFxuKyAqIGhlbGQuIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIEBhY3Rpb24gY29uc3VtZWQ7ICpAZXJyIGlzIGEgbmVnYXRpdmVcXG4rICogZXJybm8gd2hlbiB0aGUgd2FsayBhYm9ydGVkLCBlbHNlIDAuXFxuKyAqL1xcbitzdGF0aWMgaW50IHJlbW90ZV92bV93YWxrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZixcXG4rXFx0XFx0XFx0ICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBib29sIGNhbl9leHBhbmRfc3RhY2ssXFxuK1xcdFxcdFxcdCAgcmVtb3RlX3ZtX2FjdGlvbiBhY3Rpb24sIGludCAqZXJyKVxcbiB7XFxuIFxcdHZvaWQgKm9sZF9idWYgPSBidWY7XFxuIFxcdGludCB3cml0ZSA9IGd1cF9mbGFncyBcXHUwMDI2IEZPTExfV1JJVEU7XFxuK1xcdGJvb2wgaGF2ZV9tbWFwX2xvY2s7XFxuK1xcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xcbiBcXG4tXFx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSlcXG4tXFx0XFx0cmV0dXJuIDA7XFxuK1xcdCplcnIgPSAwO1xcbitcXG4rXFx0LypcXG4rXFx0ICogU2V0IEZPTExfUkVNT1RFIHNvIGNoZWNrX3ZtYV9mbGFncygpIGFwcGxpZXMgdGhlIHNhbWUgcHJvdGVjdGlvbiBrZXlcXG4rXFx0ICogcnVsZXMgYXMgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKCkgZGlkOiB0aGUgY3VycmVudCBQS1JVIGlzIG5vdCBjaGVja2VkXFxuK1xcdCAqIGFnYWluc3QgYSBWTUEgcmVhY2hlZCBvbiBAbW0ncyBiZWhhbGYuXFxuK1xcdCAqL1xcbitcXHRndXBfZmxhZ3MgfD0gRk9MTF9SRU1PVEU7XFxuIFxcbi1cXHQvKiBVbnRhZyB0aGUgYWRkcmVzcyBiZWZvcmUgbG9va2luZyB1cCB0aGUgVk1BICovXFxuLVxcdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcik7XFxuK1xcdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XFxuIFxcbi1cXHQvKiBBdm9pZCB0cmlnZ2VyaW5nIHRoZSB0ZW1wb3Jhcnkgd2FybmluZyBpbiBfX2dldF91c2VyX3BhZ2VzICovXFxuLVxcdGlmICghdm1hX2xvb2t1cChtbSwgYWRkcikgXFx1MDAyNlxcdTAwMjYgIWV4cGFuZF9zdGFjayhtbSwgYWRkcikpXFxuK1xcdGhhdmVfbW1hcF9sb2NrID0gcmVtb3RlX2FjY2Vzc19sb2NrKG1tLCBhZGRyLCBsZW4sIGd1cF9mbGFncywgXFx1MDAyNnZtYSk7XFxuK1xcdGlmIChJU19FUlIodm1hKSkge1xcbitcXHRcXHQqZXJyID0gLUVGQVVMVDtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4gXFxuLVxcdC8qIGlnbm9yZSBlcnJvcnMsIGp1c3QgY2hlY2sgaG93IG11Y2ggd2FzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCAqL1xcbiBcXHR3aGlsZSAobGVuKSB7XFxuLVxcdFxcdGludCBieXRlcywgb2Zmc2V0O1xcbi1cXHRcXHR2b2lkICptYWRkcjtcXG4tXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4tXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xcbi1cXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgYWRkcixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBndXBfZmxhZ3MsIFxcdTAwMjZ2bWEpO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgZm9sbF9mbGFncyA9IGd1cF9mbGFncztcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdFxcdGludCByZXQ7XFxuIFxcbi1cXHRcXHRpZiAoSVNfRVJSKHBhZ2UpKSB7XFxuLVxcdFxcdFxcdC8qIFdlIG1pZ2h0IG5lZWQgdG8gZXhwYW5kIHRoZSBzdGFjayB0byBhY2Nlc3MgaXQgKi9cXG4rXFx0XFx0aWYgKCF2bWEgfHwgYWRkciBcXHUwMDNlPSB2bWEtXFx1MDAzZXZtX2VuZCkge1xcbitcXHRcXHRcXHQvKiBBbnkgbG9va3VwIGhlcmUgaG9sZHMgdGhlIG1tYXAgbG9jay4gKi9cXG4rXFx0XFx0XFx0Vk1fQlVHX09OKCFoYXZlX21tYXBfbG9jayk7XFxuIFxcdFxcdFxcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xcbi1cXHRcXHRcXHRpZiAoIXZtYSkge1xcbitcXHRcXHRcXHRpZiAoIXZtYSBcXHUwMDI2XFx1MDAyNiBjYW5fZXhwYW5kX3N0YWNrKSB7XFxuK1xcdFxcdFxcdFxcdC8qIGV4cGFuZF9zdGFjaygpIGRyb3BzIHRoZSBtbWFwIGxvY2sgaWYgaXQgZmFpbHMgKi9cXG4gXFx0XFx0XFx0XFx0dm1hID0gZXhwYW5kX3N0YWNrKG1tLCBhZGRyKTtcXG4tXFxuLVxcdFxcdFxcdFxcdC8qIG1tYXBfbG9jayB3YXMgZHJvcHBlZCBvbiBmYWlsdXJlICovXFxuIFxcdFxcdFxcdFxcdGlmICghdm1hKVxcbi1cXHRcXHRcXHRcXHRcXHRyZXR1cm4gYnVmIC0gb2xkX2J1ZjtcXG4tXFxuLVxcdFxcdFxcdFxcdC8qIFRyeSBhZ2FpbiBpZiBzdGFjayBleHBhbnNpb24gd29ya2VkICovXFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRcXHRcXHRoYXZlX21tYXBfbG9jayA9IGZhbHNlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmICghdm1hKSB7XFxuK1xcdFxcdFxcdFxcdCplcnIgPSAtRUZBVUxUO1xcbitcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBGT0xMX1VOTE9DS0FCTEUgbGV0cyB0aGUgcGVyLVZNQSBmYXVsdCByZXRyeSwgZHJvcHBpbmcgdGhlXFxuK1xcdFxcdCAqIGxvY2ssIHNvIHRoZSB3YWxrIGNhbiBmYWxsIGJhY2sgdG8gdGhlIG1tYXAgbG9jay5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmICghaGF2ZV9tbWFwX2xvY2spXFxuK1xcdFxcdFxcdGZvbGxfZmxhZ3MgfD0gRk9MTF9WTUFfTE9DSyB8IEZPTExfVU5MT0NLQUJMRTtcXG4gXFxuK1xcdFxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGZvbGxfZmxhZ3MpO1xcbitcXHRcXHRpZiAoSVNfRVJSKHBhZ2UpKSB7XFxuIFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIENoZWNrIGlmIHRoaXMgaXMgYSBWTV9JTyB8IFZNX1BGTk1BUCBWTUEsIHdoaWNoXFxuLVxcdFxcdFxcdCAqIHdlIGNhbiBhY2Nlc3MgdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUuXFxuK1xcdFxcdFxcdCAqIGdldF91c2VyX3BhZ2Vfdm1hKCkgcmV0dXJucyAtRUFHQUlOLCB3aXRoIHRoZSBwZXItVk1BXFxuK1xcdFxcdFxcdCAqIGxvY2sgcmVsZWFzZWQsIGZvciBhbnl0aGluZyBpdCBjb3VsZCBub3QgZmluaXNoIHVuZGVyXFxuK1xcdFxcdFxcdCAqIGl0OyByZXRha2UgdGhlIG1tYXAgbG9jayBhbmQgcmV0cnkuIEEgZGlmZmVyZW50IGVycm9yXFxuK1xcdFxcdFxcdCAqIHRoZXJlZm9yZSBvbmx5IGFycml2ZXMgdW5kZXIgdGhlIG1tYXAgbG9jaywgd2hlcmVcXG4rXFx0XFx0XFx0ICogc3RydWN0LXBhZ2UtbGVzcyBtZW1vcnkgY2FuIGJlIHJlYWNoZWQgdmlhIC1cXHUwMDNlYWNjZXNzKCkuXFxuIFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRieXRlcyA9IDA7XFxuLSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1RcXG4tXFx0XFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxuLVxcdFxcdFxcdFxcdGJ5dGVzID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWFjY2Vzcyh2bWEsIGFkZHIsIGJ1ZixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGxlbiwgd3JpdGUpO1xcbi0jZW5kaWZcXG4tXFx0XFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2M9IDApXFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcdFxcdFxcdGJ5dGVzID0gbGVuO1xcbi1cXHRcXHRcXHRvZmZzZXQgPSBhZGRyIFxcdTAwMjYgKFBBR0VfU0laRS0xKTtcXG4tXFx0XFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2UgUEFHRV9TSVpFLW9mZnNldClcXG4tXFx0XFx0XFx0XFx0Ynl0ZXMgPSBQQUdFX1NJWkUtb2Zmc2V0O1xcbi1cXG4tXFx0XFx0XFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xcbi1cXHRcXHRcXHRpZiAod3JpdGUpIHtcXG4tXFx0XFx0XFx0XFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgIG1hZGRyICsgb2Zmc2V0LCBidWYsIGJ5dGVzKTtcXG4tXFx0XFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eV9sb2NrKGZvbGlvKTtcXG4tXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICBidWYsIG1hZGRyICsgb2Zmc2V0LCBieXRlcyk7XFxuK1xcdFxcdFxcdGlmIChQVFJfRVJSKHBhZ2UpID09IC1FQUdBSU4pIHtcXG4rXFx0XFx0XFx0XFx0dm1hID0gTlVMTDtcXG4rXFx0XFx0XFx0XFx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkge1xcbitcXHRcXHRcXHRcXHRcXHQqZXJyID0gLUVGQVVMVDtcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0aGF2ZV9tbWFwX2xvY2sgPSB0cnVlO1xcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSghaGF2ZV9tbWFwX2xvY2spKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0cGFnZSA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHJldCA9IGFjdGlvbih2bWEsIHBhZ2UsIGFkZHIsIFxcdTAwMjZidWYsIGxlbiwgd3JpdGUpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2M9IDApIHtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdCplcnIgPSByZXQ7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGxlbiAtPSBieXRlcztcXG4tXFx0XFx0YnVmICs9IGJ5dGVzO1xcbi1cXHRcXHRhZGRyICs9IGJ5dGVzO1xcbitcXHRcXHRhZGRyICs9IHJldDtcXG4rXFx0XFx0bGVuIC09IHJldDtcXG4gXFx0fVxcbi1cXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG4rXFxuK1xcdHJlbW90ZV9hY2Nlc3NfdW5sb2NrKG1tLCB2bWEsIGhhdmVfbW1hcF9sb2NrKTtcXG4gXFxuIFxcdHJldHVybiBidWYgLSBvbGRfYnVmO1xcbiB9XFxuIFxcbisvKlxcbisgKiBDb3B5IG9uZSBwYWdlJ3Mgd29ydGggb2YgW0BhZGRyLCBAYWRkciArIEBsZW4pIHRvIG9yIGZyb20gKkBidWYuIFJlYWNoZXNcXG4rICogc3RydWN0LXBhZ2UtbGVzcyBWTV9JTyAvIFZNX1BGTk1BUCBtZW1vcnkgdGhyb3VnaCB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKCkuXFxuKyAqL1xcbitzdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4rXFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKipidWYsIGludCBsZW4sIGludCB3cml0ZSlcXG4re1xcbitcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbitcXHRpbnQgYnl0ZXMsIG9mZnNldDtcXG4rXFx0dm9pZCAqbWFkZHI7XFxuK1xcbitcXHRpZiAoIXBhZ2UpIHtcXG4rXFx0XFx0Ynl0ZXMgPSBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHModm1hLCBhZGRyLCAqYnVmLCBsZW4sIHdyaXRlKTtcXG4rXFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2UgMClcXG4rXFx0XFx0XFx0KmJ1ZiArPSBieXRlcztcXG4rXFx0XFx0cmV0dXJuIGJ5dGVzO1xcbitcXHR9XFxuK1xcbitcXHRieXRlcyA9IGxlbjtcXG4rXFx0b2Zmc2V0ID0gYWRkciBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0aWYgKGJ5dGVzIFxcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxcbitcXHRcXHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcXG4rXFxuK1xcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4rXFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xcbitcXHRpZiAod3JpdGUpIHtcXG4rXFx0XFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLCBtYWRkciArIG9mZnNldCwgKmJ1ZiwgYnl0ZXMpO1xcbitcXHRcXHRmb2xpb19tYXJrX2RpcnR5X2xvY2soZm9saW8pO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgKmJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcXG4rXFx0fVxcbitcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4rXFxuK1xcdCpidWYgKz0gYnl0ZXM7XFxuK1xcdHJldHVybiBieXRlcztcXG4rfVxcbitcXG4rLypcXG4rICogQWNjZXNzIGFub3RoZXIgcHJvY2VzcycgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cXG4rICovXFxuK3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdCAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4re1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0cmV0dXJuIHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCB0cnVlLFxcbitcXHRcXHRcXHQgICAgICBhY2Nlc3Nfdm1fcGFnZSwgXFx1MDAyNmVycik7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBhY2Nlc3NfcmVtb3RlX3ZtIC0gYWNjZXNzIGFub3RoZXIgcHJvY2VzcycgYWRkcmVzcyBzcGFjZVxcbiAgKiBAbW06XFx0XFx0dGhlIG1tX3N0cnVjdCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3Mgc3BhY2VcXG5AQCAtNzEzOCw4NCArNzI5Niw2NyBAQCBFWFBPUlRfU1lNQk9MX0dQTChhY2Nlc3NfcHJvY2Vzc192bSk7XFxuIFxcbiAjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxuIC8qXFxuLSAqIENvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MncyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLlxcbi0gKiBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgcmV0dXJuIC1FRkFVTFQuXFxuKyAqIENvcHkgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSBAYWRkciBpbnRvICpAYnVmLCB1cCB0byBAbGVuIGJ5dGVzLFxcbisgKiBzdG9wcGluZyBhdCB0aGUgTlVMLiBzdHJzY3B5KCkgYWx3YXlzIE5VTCB0ZXJtaW5hdGVzLCBzbyByZWNvcHkgdGhlIGxhc3RcXG4rICogYnl0ZSBvZiBhIHBhZ2Ugd2hlbiBtb3JlIHBhZ2VzIGZvbGxvdy4gQSBzdHJpbmcgaXMgbmV2ZXIgcmVhZCBmcm9tXFxuKyAqIHN0cnVjdC1wYWdlLWxlc3MgVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5LlxcbiAgKi9cXG4tc3RhdGljIGludCBfX2NvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi1cXHRcXHRcXHRcXHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXFxuK3N0YXRpYyBpbnQgY29weV92bV9zdHIoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxcbitcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpXFxuIHtcXG4tXFx0dm9pZCAqb2xkX2J1ZiA9IGJ1ZjtcXG4tXFx0aW50IGVyciA9IDA7XFxuLVxcbi1cXHQqKGNoYXIgKilidWYgPSAnXFxcXDAnO1xcbitcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbitcXHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xcbitcXHR2b2lkICptYWRkcjtcXG4gXFxuLVxcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpXFxuK1xcdGlmICghcGFnZSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcbi1cXHRhZGRyID0gdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpO1xcbitcXHRieXRlcyA9IGxlbjtcXG4rXFx0b2Zmc2V0ID0gYWRkciBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0aWYgKGJ5dGVzIFxcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxcbitcXHRcXHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcXG4gXFxuLVxcdC8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi9cXG4tXFx0aWYgKCF2bWFfbG9va3VwKG1tLCBhZGRyKSkge1xcbi1cXHRcXHRlcnIgPSAtRUZBVUxUO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbitcXHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XFxuK1xcdHJldHZhbCA9IHN0cnNjcHkoKmJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcXG4rXFx0aWYgKHJldHZhbCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdC8qIEZvdW5kIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi9cXG4rXFx0XFx0KmJ1ZiArPSByZXR2YWw7XFxuK1xcdFxcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0fVxcbiBcXG4tXFx0d2hpbGUgKGxlbikge1xcbi1cXHRcXHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xcbi1cXHRcXHR2b2lkICptYWRkcjtcXG4tXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4tXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuLVxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcXG4rXFx0KmJ1ZiArPSBieXRlcyAtIDE7XFxuK1xcdGlmIChieXRlcyAhPSBsZW4pIHtcXG4rXFx0XFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIgKyBieXRlcyAtIDEsICpidWYsXFxuK1xcdFxcdFxcdFxcdCAgICBtYWRkciArIChQQUdFX1NJWkUgLSAxKSwgMSk7XFxuK1xcdFxcdCpidWYgKz0gMTtcXG4rXFx0fVxcbitcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4gXFxuLVxcdFxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsIGd1cF9mbGFncywgXFx1MDAyNnZtYSk7XFxuLVxcdFxcdGlmIChJU19FUlIocGFnZSkpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogVHJlYXQgYXMgYSB0b3RhbCBmYWlsdXJlIGZvciBub3cgdW50aWwgd2UgZGVjaWRlIGhvd1xcbi1cXHRcXHRcXHQgKiB0byBoYW5kbGUgdGhlIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBjYXNlIGFuZFxcbi1cXHRcXHRcXHQgKiBzdGFjayBleHBhbnNpb24uXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHQqKGNoYXIgKilidWYgPSAnXFxcXDAnO1xcbi1cXHRcXHRcXHRlcnIgPSAtRUZBVUxUO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbitcXHRyZXR1cm4gYnl0ZXM7XFxuK31cXG4gXFxuLVxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFx0XFx0Ynl0ZXMgPSBsZW47XFxuLVxcdFxcdG9mZnNldCA9IGFkZHIgXFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XFxuLVxcdFxcdGlmIChieXRlcyBcXHUwMDNlIFBBR0VfU0laRSAtIG9mZnNldClcXG4tXFx0XFx0XFx0Ynl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XFxuLVxcbi1cXHRcXHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XFxuLVxcdFxcdHJldHZhbCA9IHN0cnNjcHkoYnVmLCBtYWRkciArIG9mZnNldCwgYnl0ZXMpO1xcbi1cXHRcXHRpZiAocmV0dmFsIFxcdTAwM2U9IDApIHtcXG4tXFx0XFx0XFx0LyogRm91bmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovXFxuLVxcdFxcdFxcdGJ1ZiArPSByZXR2YWw7XFxuLVxcdFxcdFxcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0fVxcbisvKlxcbisgKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cXG4rICogSWYgdGhlcmUgaXMgYW55IGVycm9yIHJldHVybiAtRUZBVUxULlxcbisgKi9cXG4rc3RhdGljIGludCBfX2NvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHRcXHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXFxuK3tcXG4rXFx0aW50IGJ5dGVzLCBlcnI7XFxuIFxcbi1cXHRcXHRidWYgKz0gYnl0ZXMgLSAxO1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBCZWNhdXNlIHN0cnNjcHkgYWx3YXlzIE5VTCB0ZXJtaW5hdGVzIHdlIG5lZWQgdG9cXG4tXFx0XFx0ICogY29weSB0aGUgbGFzdCBieXRlIGluIHRoZSBwYWdlIGlmIHdlIGFyZSBnb2luZyB0b1xcbi1cXHRcXHQgKiBsb2FkIG1vcmUgcGFnZXNcXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChieXRlcyAhPSBsZW4pIHtcXG4tXFx0XFx0XFx0YWRkciArPSBieXRlcyAtIDE7XFxuLVxcdFxcdFxcdGNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLCBidWYsIG1hZGRyICsgKFBBR0VfU0laRSAtIDEpLCAxKTtcXG4tXFx0XFx0XFx0YnVmICs9IDE7XFxuLVxcdFxcdFxcdGFkZHIgKz0gMTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRsZW4gLT0gYnl0ZXM7XFxuK1xcdCooY2hhciAqKWJ1ZiA9ICdcXFxcMCc7XFxuIFxcbi1cXHRcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4rXFx0Ynl0ZXMgPSByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgZmFsc2UsXFxuK1xcdFxcdFxcdCAgICAgICBjb3B5X3ZtX3N0ciwgXFx1MDAyNmVycik7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0LyogVGhlIGNvbnRyYWN0IGd1YXJhbnRlZXMgYSB0ZXJtaW5hdGVkIGJ1ZmZlciBldmVuIG9uIGVycm9yLiAqL1xcbitcXHRcXHQoKGNoYXIgKilidWYpW2J5dGVzXSA9ICdcXFxcMCc7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG4gXFxuLW91dDpcXG4tXFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuLVxcdGlmIChlcnIpXFxuLVxcdFxcdHJldHVybiBlcnI7XFxuLVxcdHJldHVybiBidWYgLSBvbGRfYnVmO1xcbitcXHRyZXR1cm4gYnl0ZXM7XFxuIH1cXG4gXFxuIC8qKlxcbmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmNcXG5pbmRleCAxYzc3ZDVkYzA2ZTlmYS4uYjM2ZjJlMjE5YjhmNDkgMTAwNjQ0XFxuLS0tIGEvbW0vcm1hcC5jXFxuKysrIGIvbW0vcm1hcC5jXFxuQEAgLTI4MzgsNyArMjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gXFx0ICogKG5vbi1kZXZpY2UtZXhjbHVzaXZlKSBQVEUgYW5kIGlzc3VlIGEgTU1VX05PVElGWV9FWENMVVNJVkUuXFxuIFxcdCAqL1xcbiByZXRyeTpcXG4tXFx0cGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgYWRkcixcXG4rXFx0cGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkcixcXG4gXFx0XFx0XFx0XFx0XFx0Rk9MTF9HRVQgfCBGT0xMX1dSSVRFIHwgRk9MTF9TUExJVF9QTUQsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZ2bWEpO1xcbiBcXHRpZiAoSVNfRVJSKHBhZ2UpKVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuaW5kZXggZTZkZjk2OGYwOTcxYzguLjZiOTE3YTRmNzNlMDBmIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG5AQCAtODMsNiArODMsNyBAQCBURVNUX0dFTl9GSUxFUyArPSBtcmVsZWFzZV90ZXN0XFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1yZW1hcF9kb250dW5tYXBcXG4gVEVTVF9HRU5fRklMRVMgKz0gbXJlbWFwX3Rlc3RcXG4gVEVTVF9HRU5fRklMRVMgKz0gbXNlYWxfdGVzdFxcbitURVNUX0dFTl9GSUxFUyArPSBtdGhwX2d1cF9jb3dfdGVzdFxcbiBURVNUX0dFTl9GSUxFUyArPSBvbi1mYXVsdC1saW1pdFxcbiBURVNUX0dFTl9GSUxFUyArPSBwYWdlbWFwX2lvY3RsXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHBmbm1hcFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbXRocF9ndXBfY293X3Rlc3QuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUyZWUzMjlkODY0MWMwXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmNcXG5AQCAtMCwwICsxLDIxMyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKy8qXFxuKyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtXFx1MDAzZSBmb2xsb3dfcGFnZV9tYXNrIC1cXHUwMDNlXFxuKyAqIGZvbGxvd19wdGVfYmF0Y2gpIHJldHVybnMgdGhlIGNvcnJlY3QgcGFnZXMgZm9yIGEgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb1xcbisgKiAobVRIUCksIGluY2x1ZGluZyB0aGF0IENPVyBjb3BpZXMgcHJvZHVjZSB0aGUgcmlnaHQgY29udGVudC5cXG4rICpcXG4rICogVXNlcyB0aGUgQ09ORklHX0dVUF9URVNUIFBJTl9MT05HVEVSTSBpbnRlcmZhY2U6IFNUQVJUIHBpbnMgYSByYW5nZSBvbiB0aGVcXG4rICogc2xvdyBwYXRoLCBSRUFEIGNvcGllcyB0aGUgcGlubmVkIHBhZ2VzJyBieXRlcyBiYWNrIHNvIHdlIGNhbiBjb21wYXJlIHRoZW1cXG4rICogYWdhaW5zdCB0aGUgcGF0dGVybiB3ZSB3cm90ZS5cXG4rICovXFxuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW50LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIEFSUkFZX1NJWkUoYSlcXHQoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpXFxuK1xcbisjZGVmaW5lIEdVUF9ERVYgXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0XFxcIlxcbitcXG4rI2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVFxcdF9JT1coJ2cnLCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXFxuKyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RPUFxcdF9JTygnZycsIDgpXFxuKyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfUkVBRFxcdF9JT1coJ2cnLCA5LCBfX3U2NClcXG4rI2RlZmluZSBVU0VfV1JJVEVcXHQxXFxuKyNkZWZpbmUgVVNFX0ZBU1RcXHQyXFxuK1xcbitzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3Qge1xcbitcXHRfX3U2NCBhZGRyO1xcbitcXHRfX3U2NCBzaXplO1xcbitcXHRfX3UzMiBmbGFncztcXG4rfTtcXG4rXFxuKyNkZWZpbmUgT1JERVJfS0JcXHQ2NFxcbisjZGVmaW5lIE5SX0ZPTElPU1xcdDE2XFxuKyNkZWZpbmUgUkVHSU9OXFx0XFx0KChzaXplX3QpT1JERVJfS0IgKiAxMDI0ICogTlJfRk9MSU9TKVxcbitcXG4rc3RhdGljIGxvbmcgUFM7XFxuK3N0YXRpYyBpbnQgZmFpbHM7XFxuK3N0YXRpYyBpbnQgdGFwO1xcbitcXG4rc3RhdGljIHZvaWQgb2soaW50IGNvbmQsIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0cHJpbnRmKFxcXCIlcyAlZCAlc1xcXFxuXFxcIiwgY29uZCA/IFxcXCJva1xcXCIgOiBcXFwibm90IG9rXFxcIiwgKyt0YXAsIGRlc2MpO1xcbitcXHRpZiAoIWNvbmQpXFxuK1xcdFxcdGZhaWxzKys7XFxuK31cXG4rXFxuKy8qIERldGVybWluaXN0aWMsIHBlci1wYWdlLWRpc3RpbmN0IHBhdHRlcm4gc28gYW55IG1pcy1vcmRlciBvciBsZWFrIHNob3dzLiAqL1xcbitzdGF0aWMgdm9pZCBmaWxsKGNoYXIgKmJhc2UsIHNpemVfdCBzeiwgdWludDMyX3Qgc2FsdClcXG4re1xcbitcXHRmb3IgKHNpemVfdCBvZmYgPSAwOyBvZmYgXFx1MDAzYyBzejsgb2ZmICs9IFBTKSB7XFxuK1xcdFxcdHVpbnQzMl90IGsgPSBvZmYgLyBQUztcXG4rXFx0XFx0dWludDY0X3QgdiA9ICgodWludDY0X3Qpc2FsdCBcXHUwMDNjXFx1MDAzYyAzMikgXiAoayAqIDB4OUUzNzc5QjF1ICsgMHgxMjM0KTtcXG4rXFxuK1xcdFxcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFxcdTAwM2MgUFM7IGkgKz0gc2l6ZW9mKHYpKVxcbitcXHRcXHRcXHRtZW1jcHkoYmFzZSArIG9mZiArIGksIFxcdTAwMjZ2LCBzaXplb2YodikpO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3N5c2ZzKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnZhbClcXG4re1xcbitcXHRpbnQgZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0aW50IHIgPSB3cml0ZShmZCwgdmFsLCBzdHJsZW4odmFsKSk7XFxuK1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByIFxcdTAwM2MgMCA/IC0xIDogMDtcXG4rfVxcbitcXG4rLyogRm9yY2Ugc3ViLVBNRCA2NGtCIG1USFAgb25seSwgc28gZmF1bHRzIHByb2R1Y2UgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MuICovXFxuK3N0YXRpYyB2b2lkIHNldHVwX210aHAodm9pZClcXG4re1xcbitcXHRjb25zdCBjaGFyICp0aHAgPSBcXFwiL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2VcXFwiO1xcbitcXHRjaGFyIHBbMjU2XTtcXG4rXFx0c3RhdGljIGNvbnN0IGludCBrYltdID0geyAxNiwgMzIsIDY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4IH07XFxuK1xcbitcXHR3c3lzZnMoXFxcIi9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcXFwiLCBcXFwibmV2ZXJcXFwiKTtcXG4rXFx0Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGtiKTsgaSsrKSB7XFxuK1xcdFxcdHNucHJpbnRmKHAsIHNpemVvZihwKSwgXFxcIiVzL2h1Z2VwYWdlcy0lZGtCL2VuYWJsZWRcXFwiLCB0aHAsIGtiW2ldKTtcXG4rXFx0XFx0d3N5c2ZzKHAsIGtiW2ldID09IE9SREVSX0tCID8gXFxcImFsd2F5c1xcXCIgOiBcXFwibmV2ZXJcXFwiKTtcXG4rXFx0fVxcbit9XFxuK1xcbisvKiBDb3VudCBob3cgbWFueSBwYWdlcyBzaXQgaW4gYSBjb250aWd1b3VzIFxcdTAwM2U9T1JERVJfS0IgUEZOIHJ1biAodmlhIHBhZ2VtYXApLiAqL1xcbitzdGF0aWMgaW50IGNvdW50X2xhcmdlX3BhZ2VzKGNoYXIgKmJhc2UsIHNpemVfdCBzeilcXG4re1xcbitcXHRpbnQgcG0gPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdHNpemVfdCBuID0gc3ogLyBQUywgbGFyZ2UgPSAwO1xcbitcXHR1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7XFxuK1xcbitcXHRpZiAocG0gXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGZvciAoc2l6ZV90IGsgPSAwOyBrIFxcdTAwM2MgbjsgaysrKSB7XFxuK1xcdFxcdHVpbnQ2NF90IGVudDtcXG4rXFx0XFx0b2ZmX3QgaWR4ID0gKCh1aW50cHRyX3QpYmFzZSArIGsgKiBQUykgLyBQUyAqIHNpemVvZihlbnQpO1xcbitcXG4rXFx0XFx0aWYgKHByZWFkKHBtLCBcXHUwMDI2ZW50LCBzaXplb2YoZW50KSwgaWR4KSAhPSBzaXplb2YoZW50KSB8fFxcbitcXHRcXHQgICAgIShlbnQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyA2MykpKVxcbitcXHRcXHRcXHRwZm5ba10gPSAwO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdHBmbltrXSA9IGVudCBcXHUwMDI2ICgoMVVMTCBcXHUwMDNjXFx1MDAzYyA1NSkgLSAxKTtcXG4rXFx0fVxcbitcXHRjbG9zZShwbSk7XFxuK1xcdGZvciAoc2l6ZV90IGsgPSAwOyBrIFxcdTAwM2MgbjsgaysrKVxcbitcXHRcXHRpZiAoayArIDEgXFx1MDAzYyBuIFxcdTAwMjZcXHUwMDI2IHBmbltrXSBcXHUwMDI2XFx1MDAyNiBwZm5bayArIDFdID09IHBmbltrXSArIDEpXFxuK1xcdFxcdFxcdGxhcmdlKys7XFxuK1xcdGZyZWUocGZuKTtcXG4rXFx0cmV0dXJuIGxhcmdlO1xcbit9XFxuK1xcbisvKiBQaW4gQGJhc2UuLkBzeiBvbiB0aGUgc2xvdyBwYXRoLCByZWFkIHRoZSBwaW5uZWQgYnl0ZXMgYmFjaywgY29tcGFyZSB0byBleHAuICovXFxuK3N0YXRpYyBpbnQgcGluX3ZlcmlmeShpbnQgZmQsIGNoYXIgKmJhc2UsIHNpemVfdCBzeiwgdWludDMyX3Qgd3IsIGNoYXIgKmV4cClcXG4re1xcbitcXHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QgYSA9IHtcXG4rXFx0XFx0LmFkZHIgPSAodWludHB0cl90KWJhc2UsIC5zaXplID0gc3osXFxuK1xcdFxcdC5mbGFncyA9IHdyID8gVVNFX1dSSVRFIDogMCxcXHRcXHQvKiBVU0VfRkFTVCB1bnNldCA9XFx1MDAzZSBzbG93ICovXFxuK1xcdH07XFxuK1xcdGNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdFxcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcXG4rXFx0X191NjQgZ2EgPSAodWludHB0cl90KWdvdDtcXG4rXFx0aW50IHJjID0gLTE7XFxuK1xcbitcXHRpZiAoZ290ID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVCwgXFx1MDAyNmEpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiU1RBUlQoJXMpIGZhaWxlZDogJXNcXFxcblxcXCIsXFxuK1xcdFxcdFxcdHdyID8gXFxcIndyaXRlXFxcIiA6IFxcXCJyZWFkXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9SRUFELCBcXHUwMDI2Z2EpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiUkVBRCBmYWlsZWQ6ICVzXFxcXG5cXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QKTtcXG4rXFx0cmMgPSBtZW1jbXAoZ290LCBleHAsIHN6KSA/IDEgOiAwO1xcbitvdXQ6XFxuK1xcdG11bm1hcChnb3QsIHN6KTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitpbnQgbWFpbih2b2lkKVxcbit7XFxuK1xcdFBTID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRzZXR1cF9tdGhwKCk7XFxuK1xcbitcXHRpbnQgZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7XFxuK1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwib3BlbiAlczogJXMgKENPTkZJR19HVVBfVEVTVD8pXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRHVVBfREVWLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRyZXR1cm4gMjtcXG4rXFx0fVxcbitcXG4rXFx0Y2hhciAqciA9IG1tYXAoTlVMTCwgUkVHSU9OLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHQgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7XFxuK1xcdGlmIChyID09IE1BUF9GQUlMRUQpIHtcXG4rXFx0XFx0cGVycm9yKFxcXCJtbWFwXFxcIik7XFxuK1xcdFxcdHJldHVybiAyO1xcbitcXHR9XFxuK1xcdGZpbGwociwgUkVHSU9OLCAweEExKTtcXHRcXHRcXHRcXHQvKiBwYXR0ZXJuIFAgKi9cXG4rXFx0Y2hhciAqZXhwUCA9IG1hbGxvYyhSRUdJT04pO1xcbitcXG4rXFx0bWVtY3B5KGV4cFAsIHIsIFJFR0lPTik7XFxuK1xcbitcXHRpbnQgbGFyZ2UgPSBjb3VudF9sYXJnZV9wYWdlcyhyLCBSRUdJT04pO1xcbitcXG4rXFx0cHJpbnRmKFxcXCIjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcXFxcblxcXCIsXFxuK1xcdCAgICAgICBsYXJnZSwgUkVHSU9OIC8gUFMpO1xcbitcXHRpZiAobGFyZ2UgXFx1MDAzYyAoaW50KShSRUdJT04gLyBQUykgLyA0KVxcbitcXHRcXHRwcmludGYoXFxcIiMgV0FSTjogbGl0dGxlIG1USFAgYmFja2luZzsgYmF0Y2ggcGF0aCBsaWdodGx5IGNvdmVyZWRcXFxcblxcXCIpO1xcbitcXG4rXFx0LyogQTogcmVhZCBwaW4gb3ZlciB3cml0YWJsZSBtVEhQIC1cXHUwMDNlIGJhdGNoZXMgLVxcdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXFxuK1xcdG9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMCwgZXhwUCkgPT0gMCxcXG4rXFx0ICAgXFxcInNsb3cgcmVhZC1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHNcXFwiKTtcXG4rXFxuK1xcdC8qIEI6IHdyaXRlIHBpbiAtXFx1MDAzZSBGT0xMX1dSSVRFIGJhdGNoIHBhdGggLVxcdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXFxuK1xcdG9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMSwgZXhwUCkgPT0gMCxcXG4rXFx0ICAgXFxcInNsb3cgd3JpdGUtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzXFxcIik7XFxuK1xcbitcXHQvKiBDOiBDT1cgaXNvbGF0aW9uLiBDaGlsZCB3cml0ZS1waW5zICh1bnNoYXJlcykgdGhlbiByZXdyaXRlczsgcGFyZW50IFAuICovXFxuK1xcdHBpZF90IHBpZCA9IGZvcmsoKTtcXG4rXFxuK1xcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRpbnQgY2ZkID0gb3BlbihHVVBfREVWLCBPX1JEV1IpO1xcbitcXHRcXHRpbnQgYSA9IHBpbl92ZXJpZnkoY2ZkLCByLCBSRUdJT04sIDEsIGV4cFApO1xcdC8qIENPVyBjb3B5ID09IFAgKi9cXG4rXFxuK1xcdFxcdGZpbGwociwgUkVHSU9OLCAweEIyKTtcXHRcXHRcXHQvKiBjaGlsZCB3cml0ZXMgUSAqL1xcbitcXHRcXHRfZXhpdChhID09IDAgPyAwIDogMSk7XFxuK1xcdH1cXG4rXFx0aW50IHN0ID0gMDtcXG4rXFxuK1xcdHdhaXRwaWQocGlkLCBcXHUwMDI2c3QsIDApO1xcbitcXHRvayhXSUZFWElURUQoc3QpIFxcdTAwMjZcXHUwMDI2IFdFWElUU1RBVFVTKHN0KSA9PSAwLFxcbitcXHQgICBcXFwiY2hpbGQgd3JpdGUtcGluIGFmdGVyIENPVyByZXR1cm5zIGNvcnJlY3QgKGNvcGllZCkgY29udGVudHNcXFwiKTtcXG4rXFx0b2sobWVtY21wKHIsIGV4cFAsIFJFR0lPTikgPT0gMCxcXG4rXFx0ICAgXFxcInBhcmVudCBjb250ZW50cyBpbnRhY3QgYWZ0ZXIgY2hpbGQgQ09XIHdyaXRlc1xcXCIpO1xcbitcXHQvKiBEOiBwYXJlbnQgcmVhZC1waW4gYWdhaW4gYWZ0ZXIgdGhlIENPVyBzcGxpdCBzdGlsbCBjb3JyZWN0LiAqL1xcbitcXHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDAsIGV4cFApID09IDAsXFxuK1xcdCAgIFxcXCJwYXJlbnQgc2xvdyByZWFkLXBpbiBhZnRlciBDT1cgc3RpbGwgY29ycmVjdFxcXCIpO1xcbitcXG4rXFx0cHJpbnRmKFxcXCIjIHRvdGFsczogcGFzczolZCBmYWlsOiVkXFxcXG5cXFwiLCB0YXAgLSBmYWlscywgZmFpbHMpO1xcbitcXHRyZXR1cm4gZmFpbHMgPyAxIDogMDtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXFxuaW5kZXggNGY1NTA4MjIzODVhMjAuLjZmZjVkMTAyOTUxN2UzIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmNcXG5AQCAtMzEsNiArMzEsNyBAQCBzdGF0aWMgc2lnam1wX2J1ZiBzaWdqbXBfYnVmX2VudjtcXG4gc3RhdGljIGNoYXIgKmZpbGUgPSBcXFwiL2Rldi9tZW1cXFwiO1xcbiBzdGF0aWMgb2ZmX3QgZmlsZV9vZmZzZXQ7XFxuIHN0YXRpYyBpbnQgZmQ7XFxuK3N0YXRpYyBpbnQgdGFyZ2V0X2lzX3JhbTtcXG4gXFxuIHN0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpXFxuIHtcXG5AQCAtMTEzLDYgKzExNCw3IEBAIHN0YXRpYyB2b2lkIHBmbm1hcF9pbml0KHZvaWQpXFxuIFxcdFxcdGlmIChlcnIpXFxuIFxcdFxcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJDYW5ub3QgZmluZCByYW0gdGFyZ2V0IGluICcvcHJvYy9pb21lbSc6ICVzXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRcXHQgICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHR0YXJnZXRfaXNfcmFtID0gMTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0ZmlsZV9vZmZzZXQgPSAwO1xcbiBcXHR9XFxuQEAgLTI3MSw2ICsyNzMsNzAgQEAgVEVTVF9GKHBmbm1hcCwgZm9yaylcXG4gXFx0QVNTRVJUX0VRKHJldCwgMCk7XFxuIH1cXG4gXFxuK1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpXFxuK3tcXG4rXFx0Y2hhciAqcHJpdiwgKmJ1ZjtcXG4rXFx0c3NpemVfdCByYztcXG4rXFx0aW50IG1lbV9mZDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgQ09XZWQgcGFnZSBpbiBhIFZNX1BGTk1BUCBtYXBwaW5nIGhhcyBhIHN0cnVjdCBwYWdlLCBzbyByZWFkaW5nIGl0XFxuK1xcdCAqIHRocm91Z2ggL3Byb2Mvc2VsZi9tZW0gLS0gX19hY2Nlc3NfcmVtb3RlX3ZtKCkgLVxcdTAwM2UgZ2V0X3VzZXJfcGFnZV92bWEoKVxcbitcXHQgKiAtLSByZXR1cm5zIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIG9mIHJvdXRpbmcgdG8gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWFjY2VzcygpLFxcbitcXHQgKiB3aGljaCBpb3JlbWFwcyB0aGUgUEZOIGFuZCBjYW5ub3QgcmVhY2ggYSBDT1dlZCBSQU0gcGFnZS5cXG4rXFx0ICpcXG4rXFx0ICogTWFwIHRoZSBmaWxlIE1BUF9QUklWQVRFIGFuZCB3cml0YWJsZSwgd3JpdGUgdG8gQ09XIGEgcGFnZSBpbnRvIGFub25cXG4rXFx0ICogbWVtb3J5LCB0aGVuIHJlYWQgdGhlIHBhZ2UgYmFjayB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtLlxcbitcXHQgKi9cXG4rXFx0c2VsZi1cXHUwMDNlc2l6ZTIgPSBzZWxmLVxcdTAwM2VwYWdlc2l6ZTtcXG4rXFx0c2VsZi1cXHUwMDNlYWRkcjIgPSBtbWFwKE5VTEwsIHNlbGYtXFx1MDAzZXNpemUyLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHRcXHQgICBNQVBfUFJJVkFURSwgZmQsIGZpbGVfb2Zmc2V0KTtcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZWFkZHIyID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiQ2Fubm90IGNyZWF0ZSBhIHdyaXRhYmxlIHByaXZhdGUgcGZubWFwIG1hcHBpbmdcXFwiKTtcXG4rXFx0cHJpdiA9IHNlbGYtXFx1MDAzZWFkZHIyO1xcbitcXG4rXFx0LyogQ09XIHRoZSBwYWdlIGFuZCBzdGFtcCBrbm93biBieXRlcyBpbnRvIHRoZSBhbm9uIGNvcHkuICovXFxuK1xcdHByaXZbMF0gPSAweDQyO1xcbitcXHRwcml2W3NlbGYtXFx1MDAzZXBhZ2VzaXplIC0gMV0gPSAweDI0O1xcbitcXG4rXFx0YnVmID0gbWFsbG9jKHNlbGYtXFx1MDAzZXBhZ2VzaXplKTtcXG4rXFx0QVNTRVJUX05FKGJ1ZiwgTlVMTCk7XFxuK1xcbitcXHRtZW1fZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL21lbVxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0QVNTRVJUX0dFKG1lbV9mZCwgMCk7XFxuK1xcdHJjID0gcHJlYWQobWVtX2ZkLCBidWYsIHNlbGYtXFx1MDAzZXBhZ2VzaXplLCAob2ZmX3QpKHVpbnRwdHJfdClwcml2KTtcXG4rXFx0Y2xvc2UobWVtX2ZkKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShyYywgKHNzaXplX3Qpc2VsZi1cXHUwMDNlcGFnZXNpemUpO1xcbitcXHRFWFBFQ1RfRVEoYnVmWzBdLCAweDQyKTtcXG4rXFx0RVhQRUNUX0VRKGJ1ZltzZWxmLVxcdTAwM2VwYWdlc2l6ZSAtIDFdLCAweDI0KTtcXG4rXFxuK1xcdGZyZWUoYnVmKTtcXG4rfVxcbitcXG4rVEVTVF9GKHBmbm1hcCwgcHJvY21lbV9wZm5fcmVhZClcXG4re1xcbitcXHRjaGFyIGJ1Zls2NF07XFxuK1xcdHNzaXplX3QgcmM7XFxuK1xcdGludCBtZW1fZmQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgbWFwcGluZyBoYXMgbm8gc3RydWN0IHBhZ2UsIHNvXFxuK1xcdCAqIF9fYWNjZXNzX3JlbW90ZV92bSgpIHJlYWNoZXMgaXQgdGhyb3VnaCB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKClcXG4rXFx0ICogKGdlbmVyaWNfYWNjZXNzX3BoeXMoKSkuIFRoYXQgaW9yZW1hcHMgdGhlIFBGTiwgd2hpY2ggaXMgcmVqZWN0ZWQgZm9yXFxuK1xcdCAqIFJBTSwgc28gdGhpcyBvbmx5IGFwcGxpZXMgdG8gZ2VudWluZSBkZXZpY2UgbWVtb3J5LlxcbitcXHQgKi9cXG4rXFx0aWYgKHRhcmdldF9pc19yYW0pXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiVGFyZ2V0IGlzIFN5c3RlbSBSQU07IC1cXHUwMDNlYWNjZXNzKCkgY2Fubm90IGlvcmVtYXAgUkFNXFxcIik7XFxuK1xcbitcXHRtZW1fZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL21lbVxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0QVNTRVJUX0dFKG1lbV9mZCwgMCk7XFxuK1xcdHJjID0gcHJlYWQobWVtX2ZkLCBidWYsIHNpemVvZihidWYpLCAob2ZmX3QpKHVpbnRwdHJfdClzZWxmLVxcdTAwM2VhZGRyMSk7XFxuK1xcdGNsb3NlKG1lbV9mZCk7XFxuK1xcbitcXHRBU1NFUlRfRVEocmMsIChzc2l6ZV90KXNpemVvZihidWYpKTtcXG4rfVxcbitcXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuIFxcdGZvciAoaW50IGkgPSAxOyBpIFxcdTAwM2MgYXJnYzsgaSsrKSB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5pbmRleCA4YzI5NmRlZGYwNDc0ZC4uYjQ5YTNlYjBjMjA1MDggMTAwNzU1XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbkBAIC0yODksNiArMjg5LDcgQEAgZmlcXG4gIyBEdW1wIHBhZ2VzIDAsIDE5LCBhbmQgNDA5NiwgdXNpbmcgcGluX3VzZXJfcGFnZXM6XFxuIENBVEVHT1JZPVxcXCJndXBfdGVzdFxcXCIgcnVuX3Rlc3QgLi9ndXBfdGVzdCAtY3QgLUYgMHgxIDAgMTkgMHgxMDAwXFxuIENBVEVHT1JZPVxcXCJndXBfdGVzdFxcXCIgcnVuX3Rlc3QgLi9ndXBfbG9uZ3Rlcm1cXG4rQ0FURUdPUlk9XFxcImd1cF90ZXN0XFxcIiBydW5fdGVzdCAuL210aHBfZ3VwX2Nvd190ZXN0XFxuIFxcbiBDQVRFR09SWT1cXFwidXNlcmZhdWx0ZmRcXFwiIHJ1bl90ZXN0IC4vdWZmZC11bml0LXRlc3RzXFxuIHVmZmRfc3RyZXNzX2Jpbj0uL3VmZmQtc3RyZXNzXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjExLjY5NDc3MjMwN1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjk2NTIwODQyNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQUREUkVTU19NQVNLSU5HXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZV92bWFcIixcbiAgICBcImdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYVwiLFxuICAgIFwiYWNjZXNzX3JlbW90ZV92bVwiLFxuICAgIFwiYWNjZXNzX3Byb2Nlc3Nfdm1cIixcbiAgICBcImNvcHlfcmVtb3RlX3ZtX3N0clwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjdjMjA5ODdkZTZkOTJkN2VmYzIxYTAwMTg4NWFkMzE4YjYwNTRmZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gSnVsIDI2IDEwOjA3OjA2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xuaW5kZXggMWE5YWFkNmVmMjJhMDQuLjdhNmVjYzNkOTI5NDhjIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmNcbisrKyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jXG5AQCAtNDU5LDcgKzQ1OSw3IEBAIHN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3RhZ3Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4gXHRcdHVuc2lnbmVkIGxvbmcgdGFncywgb2Zmc2V0O1xuIFx0XHR2b2lkICptYWRkcjtcbi1cdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCBhZGRyLFxuIFx0XHRcdFx0XHRcdFx0ICAgICBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4gXHRcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4gXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXG5pbmRleCBkYmYyN2E3OGRmNmM4Ny4uM2NlMTY3OTZlNWEyNWQgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxuQEAgLTIxLDcgKzIxLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsXG4gXHRcdFx0ICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpXG4ge1xuICNpZmRlZiBDT05GSUdfUklTQ1ZfSVNBX1NVUE1cbi1cdG5leHQtXHUwMDNlY29udGV4dC5wbWxlbiA9IDA7XG4rXHRXUklURV9PTkNFKG5leHQtXHUwMDNlY29udGV4dC5wbWxlbiwgMCk7XG4gI2VuZGlmXG4gXHRzd2l0Y2hfbW0ocHJldiwgbmV4dCwgTlVMTCk7XG4gfVxuQEAgLTQ0LDcgKzQ0LDcgQEAgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKHVzZV9hc2lkX2FsbG9jYXRvcik7XG4gI2RlZmluZSBtbV91bnRhZ19tYXNrIG1tX3VudGFnX21hc2tcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRyZXR1cm4gLTFVTCBcdTAwM2VcdTAwM2UgbW0tXHUwMDNlY29udGV4dC5wbWxlbjtcbitcdHJldHVybiAtMVVMIFx1MDAzZVx1MDAzZSBSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbik7XG4gfVxuICNlbmRpZlxuIFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmhcbmluZGV4IDVkNGVjMTU1ODRjZmE0Li41MzgwNmUwZjdkY2ZlMyAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxuQEAgLTE2LDcgKzE2LDcgQEBcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bnRhZ2dlZF9hZGRyX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxuIHtcbiBcdGlmIChyaXNjdl9oYXNfZXh0ZW5zaW9uX3VubGlrZWx5KFJJU0NWX0lTQV9FWFRfU1VQTSkpIHtcbi1cdFx0dTggcG1sZW4gPSBtbS1cdTAwM2Vjb250ZXh0LnBtbGVuO1xuK1x0XHR1OCBwbWxlbiA9IFJFQURfT05DRShtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKTtcbiBcbiBcdFx0LyogVmlydHVhbCBhZGRyZXNzZXMgYXJlIHNpZ24tZXh0ZW5kZWQ7IHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUgemVyby1leHRlbmRlZC4gKi9cbiBcdFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX01NVSkpXG5AQCAtMzMsMTIgKzMzLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lXG4gXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUoY3VycmVudC1cdTAwM2VtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbi0jZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoe1x0XHRcdFx0XHRcXFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpICh7XHRcdFx0XHRcXFxuIFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcdFx0XHRcXFxuLVx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcdFx0XHRcdFx0XHRcdFxcXG4gXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIF9fYWRkcik7XHRcdFxcXG4gfSlcbiBcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoe1x0XHRcdFx0XHRcXFxuK1x0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcdFx0XHRcdFx0XHRcdFxcXG4rXHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XHRcdFx0XHRcXFxuK30pXG4rXG4gI2RlZmluZSBhY2Nlc3Nfb2soYWRkciwgc2l6ZSkgbGlrZWx5KF9fYWNjZXNzX29rKHVudGFnZ2VkX2FkZHIoYWRkciksIHNpemUpKVxuICNlbHNlXG4gI2RlZmluZSB1bnRhZ2dlZF9hZGRyKGFkZHIpIChhZGRyKVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuY1xuaW5kZXggYjJkZjdmNzIyNDFhNWYuLjZhZTc1NTJmZWQwOWYzIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwvcHJvY2Vzcy5jXG4rKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcbkBAIC0zNTcsMTMgKzM1NywxNSBAQCBsb25nIHNldF90YWdnZWRfYWRkcl9jdHJsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBhcmcpXG4gXHRpZiAobW1hcF93cml0ZV9sb2NrX2tpbGxhYmxlKG1tKSlcbiBcdFx0cmV0dXJuIC1FSU5UUjtcbiBcbi1cdGlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sIFx1MDAyNm1tLVx1MDAzZWNvbnRleHQuZmxhZ3MpIFx1MDAyNlx1MDAyNiBtbS1cdTAwM2Vjb250ZXh0LnBtbGVuICE9IHBtbGVuKSB7XG4tXHRcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbitcdGlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sIFx1MDAyNm1tLVx1MDAzZWNvbnRleHQuZmxhZ3MpKSB7XG4rXHRcdGlmIChSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbikgIT0gcG1sZW4pIHtcbitcdFx0XHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdFx0fVxuIFx0fVxuIFxuIFx0ZW52Y2ZnX3VwZGF0ZV9iaXRzKHRhc2ssIEVOVkNGR19QTU0sIHBtbSk7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnBtbGVuID0gcG1sZW47XG4rXHRXUklURV9PTkNFKG1tLVx1MDAzZWNvbnRleHQucG1sZW4sIHBtbGVuKTtcbiBcbiBcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbiBcbkBAIC0zOTQsNyArMzk2LDcgQEAgbG9uZyBnZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4gXHRcdGJyZWFrO1xuIFx0fVxuIFxuLVx0aWYgKHRhc2stXHUwMDNlbW0tXHUwMDNlY29udGV4dC5wbWxlbilcbitcdGlmIChSRUFEX09OQ0UodGFzay1cdTAwM2VtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKSlcbiBcdFx0cmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTtcbiBcbiBcdHJldHVybiByZXQ7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbmluZGV4IGVmNWI1MDdkZTM0ZTJlLi5jZWU3MTBmNjQ2NThhYSAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbkBAIC0xMDAsMTggKzEwMCwxOCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fbGFtX2NyM19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBkdXBfbGFtKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4gXHRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IG9sZG1tLVx1MDAzZWNvbnRleHQubGFtX2NyM19tYXNrO1xuLVx0bW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrID0gb2xkbW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xuK1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIFJFQURfT05DRShvbGRtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2spKTtcbiB9XG4gXG4gI2RlZmluZSBtbV91bnRhZ19tYXNrIG1tX3VudGFnX21hc2tcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRyZXR1cm4gbW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xuK1x0cmV0dXJuIFJFQURfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2spO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgbW1fcmVzZXRfdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgPSAtMVVMO1xuK1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIC0xVUwpO1xuIH1cbiBcbiAjZGVmaW5lIGFyY2hfcGd0YWJsZV9kbWFfY29tcGF0IGFyY2hfcGd0YWJsZV9kbWFfY29tcGF0XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXG5pbmRleCAyMGRlMzRjYzlhYTZlNy4uYTA5NTE2NWViNjQ4ZWIgMTAwNjQ0XG4tLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmhcbisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaFxuQEAgLTM5LDE4ICszOSwyNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bnRhZ2dlZF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcilcbiBcdChfX2ZvcmNlIF9fdHlwZW9mX18oYWRkcikpX191bnRhZ2dlZF9hZGRyKF9fYWRkcik7XHRcdFxcXG4gfSlcbiBcbisvKlxuKyAqIG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayBjaGFuZ2VzIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IGVuYWJsZXMgTEFNIG9yIGV4ZWNzLFxuKyAqIGFsd2F5cyBzaW5nbGUtdGhyZWFkZWQuIEFuIHVubG9ja2VkIHJlbW90ZSByZWFkZXIgY2FuIHJhY2UgdGhhdDsgUkVBRF9PTkNFXG4rICoga2VlcHMgdGhlIHZhbHVlIHdob2xlIGFuZCB0aGUgdW50YWcgaXMgYmVzdC1lZmZvcnQuXG4rICovXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBhZGRyKVxuIHtcbi1cdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XG4tXHRyZXR1cm4gYWRkciBcdTAwMjYgKG1tKS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2s7XG4rXHRyZXR1cm4gYWRkciBcdTAwMjYgUkVBRF9PTkNFKG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayk7XG4gfVxuIFxuLSNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpXHQoe1x0XHRcdFx0XFxcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKVx0KHtcdFx0XHRcXFxuIFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcdFx0XFxcbiBcdChfX2ZvcmNlIF9fdHlwZW9mX18oYWRkcikpX191bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKVx0KHtcdFx0XHRcdFxcXG4rXHRtbWFwX2Fzc2VydF9sb2NrZWQobW0pO1x0XHRcdFx0XHRcdFxcXG4rXHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XHRcdFx0XFxcbit9KVxuK1xuICNlbmRpZlxuIFxuICNkZWZpbmUgdmFsaWRfdXNlcl9hZGRyZXNzKHgpIFxcXG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcbmluZGV4IGQ0NGFmYmUwMDViYjUxLi45ZmE2NTkxMTdmMzgyNiAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcbisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcbkBAIC04MTQsNyArODE0LDcgQEAgc3RhdGljIHZvaWQgZW5hYmxlX2xhbV9mdW5jKHZvaWQgKl9fbW0pXG4gc3RhdGljIHZvaWQgbW1fZW5hYmxlX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4gXHRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IFg4Nl9DUjNfTEFNX1U1Nztcbi1cdG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpO1xuK1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIH5HRU5NQVNLKDYyLCA1NykpO1xuIFxuIFx0LypcbiBcdCAqIEV2ZW4gdGhvdWdoIHRoZSBwcm9jZXNzIG11c3Qgc3RpbGwgYmUgc2luZ2xlLXRocmVhZGVkIGF0IHRoaXNcbkBAIC05NTIsNyArOTUyLDcgQEAgbG9uZyBkb19hcmNoX3ByY3RsXzY0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9wdGlvbiwgdW5zaWduZWQgbG9uZyBhcmcyKVxuICNlbmRpZlxuICNpZmRlZiBDT05GSUdfQUREUkVTU19NQVNLSU5HXG4gXHRjYXNlIEFSQ0hfR0VUX1VOVEFHX01BU0s6XG4tXHRcdHJldHVybiBwdXRfdXNlcih0YXNrLVx1MDAzZW1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayxcbitcdFx0cmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay1cdTAwM2VtbSksXG4gXHRcdFx0XHQodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcyKTtcbiBcdGNhc2UgQVJDSF9FTkFCTEVfVEFHR0VEX0FERFI6XG4gXHRcdHJldHVybiBwcmN0bF9lbmFibGVfdGFnZ2VkX2FkZHIodGFzay1cdTAwM2VtbSwgYXJnMik7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbmluZGV4IDNhZjk3OWZiNDFkMzhkLi4zMjllZmFjMGNmYjM3ZCAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbisrKyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbkBAIC0xMDM2LDcgKzEwMzYsNyBAQCBzdGF0aWMgaW50IGNvcHlfZnJvbV92YWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LFxuIFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcbi1cdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIHZhZGRyLCBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4rXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCBcdTAwMjZ2bWEpO1xuIFx0aWYgKElTX0VSUihwYWdlKSlcbiBcdFx0cmV0dXJuIFBUUl9FUlIocGFnZSk7XG4gXHR1cHJvYmVfY29weV9mcm9tX3BhZ2UocGFnZSwgdmFkZHIsIGRzdCwgbGVuKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmhcbmluZGV4IDQ4NWRmOWMyZGJkZGIzLi4wZjY2ZDc2ZTZjYTcxOSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbW0uaFxuKysrIGIvaW5jbHVkZS9saW51eC9tbS5oXG5AQCAtMzIzNSwzNSArMzIzNSw5IEBAIGxvbmcgcGluX3VzZXJfcGFnZXNfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdCAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4gXHRcdFx0ICAgaW50ICpsb2NrZWQpO1xuIFxuLS8qXG4tICogUmV0cmlldmVzIGEgc2luZ2xlIHBhZ2UgYWxvbmdzaWRlIGl0cyBWTUEuIERvZXMgbm90IHN1cHBvcnQgRk9MTF9OT1dBSVQuXG4tICovXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLVx0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHRcdFx0ICAgIGludCBndXBfZmxhZ3MsXG4tXHRcdFx0XHRcdFx0ICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXG4te1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbi1cdGludCBnb3Q7XG4tXG4tXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgRk9MTF9OT1dBSVQpKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4tXG4tXHRnb3QgPSBnZXRfdXNlcl9wYWdlc19yZW1vdGUobW0sIGFkZHIsIDEsIGd1cF9mbGFncywgXHUwMDI2cGFnZSwgTlVMTCk7XG4tXG4tXHRpZiAoZ290IFx1MDAzYyAwKVxuLVx0XHRyZXR1cm4gRVJSX1BUUihnb3QpO1xuLVxuLVx0dm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7XG4tXHRpZiAoV0FSTl9PTl9PTkNFKCF2bWEpKSB7XG4tXHRcdHB1dF9wYWdlKHBhZ2UpO1xuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbi1cdH1cbi1cbi1cdCp2bWFwID0gdm1hO1xuLVx0cmV0dXJuIHBhZ2U7XG4tfVxuK3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbitcdFx0XHRcdCAgICAgIGludCBndXBfZmxhZ3MsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTtcbiBcbiBsb25nIGdldF91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXG5pbmRleCBlZGRiYmI2NWNjYzRmOC4uN2U2ZTRjODkxODRjZDcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaFxuKysrIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmhcbkBAIC0zNCw2ICszNCwxMyBAQFxuIH0pXG4gI2VuZGlmXG4gXG4rI2lmbmRlZiB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXHQoe1x0XFxcbitcdCh2b2lkKShtbSk7XHRcdFx0XHRcdFxcXG4rXHR1bnRhZ2dlZF9hZGRyKGFkZHIpO1x0XHRcdFx0XFxcbit9KVxuKyNlbmRpZlxuK1xuICNpZmRlZiBtYXNrZWRfdXNlcl9hY2Nlc3NfYmVnaW5cbiAgI2RlZmluZSBjYW5fZG9fbWFza2VkX3VzZXJfYWNjZXNzKCkgMVxuICMgaWZuZGVmIG1hc2tlZF91c2VyX3dyaXRlX2FjY2Vzc19iZWdpblxuZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmNcbmluZGV4IDA2OTIxMTliNzkwNDMxLi40OTEwYzkzYmEwMDNlOCAxMDA2NDRcbi0tLSBhL21tL2d1cC5jXG4rKysgYi9tbS9ndXAuY1xuQEAgLTY0Nyw4ICs2NDcsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0ICAgIHB1ZF90ICpwdWRwLCBpbnQgZmxhZ3MsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbkBAIC02NzIsMTAgKzY3MywxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7XG4gXG4gXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4tXHRpZiAocmV0KVxuK1x0aWYgKHJldCkge1xuIFx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0ZWxzZVxuLVx0XHQqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTtcbitcdH0gZWxzZSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgb2ZmID0gKGFkZHIgXHUwMDI2IH5QVURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHRcdCpucl9wYWdlcyA9IG1pbihIUEFHRV9QVURfTlIgLSBvZmYsIChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4rXHR9XG4gXG4gXHRyZXR1cm4gcGFnZTtcbiB9XG5AQCAtNjk5LDkgKzcwMyw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3BtZChwbWRfdCBwbWQsIHN0cnVjdCBwYWdlICpwYWdlLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0ICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHBtZF90IHBtZHZhbCA9ICpwbWQ7XG5AQCAtNzM4LDIzICs3NDIsMjUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gI2VuZGlmXHQvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi9cbiBcbiBcdHBhZ2UgKz0gKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcbitcdCpucl9wYWdlcyA9IG1pbihIUEFHRV9QTURfTlIgLSAoKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpLFxuK1x0XHRcdChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4gXHRyZXR1cm4gcGFnZTtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0XHRcdCAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0ICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtNzk5LDggKzgwNSw0NiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTtcbiB9XG4gXG4rLypcbisgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkXG4rICogbGFyZ2UgQGZvbGlvIG1hcHMgY29udGlndW91c2x5IGFuZCB0aGF0IGNhbiBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZVxuKyAqIHBhZ2UgYXQgQGFkZHJlc3M6IGNvbnNlY3V0aXZlIHByZXNlbnQgUFRFcyBtYXBwaW5nIGNvbnNlY3V0aXZlIHBhZ2VzIG9mXG4rICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLlxuKyAqIFJldHVybnMgYXQgbGVhc3QgMS5cbisgKlxuKyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpc1xuKyAqIGFsd2F5cyBzYWZlOiBhIHdyaXRhYmxlIGFub24gcGFnZSBpcyBleGNsdXNpdmUsIGFuZCBGT0xMX1dSSVRFIGlzIHNhdGlzZmllZC5cbisgKiBBIHJlYWQtb25seSBydW4gaXMgb25seSBzYWZlIGZvciBhIHBsYWluIHJlYWQ7IEZPTExfV1JJVEUgd291bGQgbmVlZCBhIENPV1xuKyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLFxuKyAqIHNvIHRob3NlIGZhbGwgYmFjayB0byBhIHNpbmdsZSBwYWdlLlxuKyAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4re1xuK1x0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xuK1x0dW5zaWduZWQgbG9uZyBtYXg7XG4rXG4rXHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IChGT0xMX1dSSVRFIHwgRk9MTF9QSU4pKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKlxuK1x0ICogZm9saW9fcHRlX2JhdGNoX2ZsYWdzKCkgc2NhbnMgZm9yd2FyZCBmcm9tIEBwdGVwLCBzbyB0aGUgcnVuIG11c3RcbitcdCAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kXG4rXHQgKiB0aGUgVk1BLCBzaW5jZSBhIGxhcmdlIGZvbGlvIGNhbiBiZSBQVEUtbWFwcGVkIGFjcm9zcyBhIFBNRCBib3VuZGFyeS5cbitcdCAqL1xuK1x0bWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuK1x0XHQgICh2bWEtXHUwMDNldm1fZW5kIC0gYWRkcmVzcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuK1x0aWYgKG1heCBcdTAwM2M9IDEpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0cmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBcdTAwMjZiYXRjaF9wdGUsIG1heCxcbitcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUpO1xuK31cbitcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuQEAgLTg4NSw2ICs5MjksMTUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdCAqL1xuIFx0XHRmb2xpb19tYXJrX2FjY2Vzc2VkKGZvbGlvKTtcbiBcdH1cbitcbitcdC8qXG4rXHQgKiBBIFBURS1tYXBwZWQgbGFyZ2UgZm9saW8gY2FuIGJlIGhhbmRlZCBiYWNrIGFzIGEgY29udGlndW91cyBiYXRjaCxcbitcdCAqIHNvIHRoZSBjYWxsZXIgYWR2YW5jZXMgb3ZlciB0aGUgd2hvbGUgcnVuIGluIG9uZSBzdGVwIGluc3RlYWQgb2ZcbitcdCAqIHdhbGtpbmcgdGhlIHBhZ2UgdGFibGVzIGZvciBldmVyeSBwYWdlLlxuK1x0ICovXG4rXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4rXHRcdCpucl9wYWdlcyA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCBlbmQsIGZvbGlvLCBwYWdlLFxuK1x0XHRcdFx0XHQgICAgIHB0ZXAsIHB0ZSwgZmxhZ3MpO1xuIG91dDpcbiBcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcbiBcdHJldHVybiBwYWdlO1xuQEAgLTg5Niw5ICs5NDksOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHQgICAgcHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwbWRfdCAqcG1kLCBwbWR2YWw7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTEyLDcgKzk2NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGlmIChsaWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKVxuLVx0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4rXHRcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiBcbiBcdGlmIChwbWRfcHJvdG5vbmUocG1kdmFsKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbkBAIC05MjUsMjQgKzk3OCwyNCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBucl9wYWdlcyk7XG4gXHR9XG4gXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBGT0xMX1NQTElUX1BNRCkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpO1xuIFx0XHQvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovXG4gXHRcdHJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDpcbi1cdFx0XHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcbitcdFx0XHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiBcdH1cbi1cdHBhZ2UgPSBmb2xsb3dfaHVnZV9wbWQodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdHJldHVybiBwYWdlO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0XHRcdCAgICBwNGRfdCAqcDRkcCwgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHB1ZF90ICpwdWRwLCBwdWQ7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTU1LDcgKzEwMDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAocHVkX2xlYWYocHVkKSkge1xuIFx0XHRwdGwgPSBwdWRfbG9jayhtbSwgcHVkcCk7XG4tXHRcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cGFnZSA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdFx0aWYgKHBhZ2UpXG4gXHRcdFx0cmV0dXJuIHBhZ2U7XG5AQCAtOTY0LDEzICsxMDE3LDEzIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHQgICAgcGdkX3QgKnBnZHAsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwNGRfdCAqcDRkcCwgcDRkO1xuIFxuQEAgLTk4MSwxNSArMTAzNCwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcDRkX3ByZXNlbnQocDRkKSB8fCBwNGRfYmFkKHA0ZCkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIHA0ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiB9XG4gXG4gLyoqXG4gICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4gICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzc1xuICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcbiAgKiBAZmxhZ3M6IGZsYWdzIG1vZGlmeWluZyBsb29rdXAgYmVoYXZpb3VyXG4tICogQHBhZ2VfbWFzazogYSBwb2ludGVyIHRvIG91dHB1dCBwYWdlX21hc2tcbisgKiBAbnJfcGFnZXM6IG91dHB1dDsgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGNhbGxlciBjYW4gcmVhZFxuICAqXG4gICogQGZsYWdzIGNhbiBoYXZlIEZPTExfIGZsYWdzIHNldCwgZGVmaW5lZCBpbiBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gICpcbkBAIC05OTgsMTUgKzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gICogdHJpZ2dlciBhIGZhdWx0IHdpdGggRkFVTFRfRkxBR19VTlNIQVJFIHNldC4gTm90ZSB0aGF0IHVuc2hhcmluZyBpcyBvbmx5XG4gICogcmVsZXZhbnQgd2l0aCBGT0xMX1BJTiBhbmQgIUZPTExfV1JJVEUuXG4gICpcbi0gKiBPbiBvdXRwdXQsIEBwYWdlX21hc2sgaXMgc2V0IGFjY29yZGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgcGFnZS5cbisgKiBPbiBvdXRwdXQsIEBucl9wYWdlcyBob2xkcyBob3cgbWFueSBjb250aWd1b3VzIHBhZ2VzIHRoZSBmb2xpbyB0aGF0IGluY2x1ZGVzXG4rICogdGhlIHJldHVybmVkIHBhZ2UgaGFzIG1hcHBlZCBpbnRvIHRoaXMgcHJvY2Vzcywgc28gdGhlIGNhbGxlciBjYW4gYWR2YW5jZVxuKyAqIG92ZXIgYSBsYXJnZSBmb2xpbyBpbiBvbmUgc3RlcC5cbiAgKlxuICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxuICAqIGFuIGVycm9yIHBvaW50ZXIgaWYgdGhlcmUgaXMgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWRcbiAgKiBieSBhIHBhZ2UgZGVzY3JpcHRvciAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXG4gICovXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdCAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0cGdkX3QgKnBnZDtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuQEAgLTEwMTQsMTMgKzEwNzAsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpO1xuIFxuLVx0KnBhZ2VfbWFzayA9IDA7XG4rXHQqbnJfcGFnZXMgPSAxO1xuIFx0cGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7XG4gXG4gXHRpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpXG4gXHRcdHBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0ZWxzZVxuLVx0XHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgbnJfcGFnZXMpO1xuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcbiBcbkBAIC0xMDgwLDkgKzExMzYsMTYgQEAgc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gfVxuIFxuIC8qXG4tICogbW1hcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeS4gIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3Rcbi0gKiBGT0xMX05PV0FJVCwgdGhlIG1tYXBfbG9jayBtYXkgYmUgcmVsZWFzZWQuICBJZiBpdCBpcywgKkBsb2NrZWQgd2lsbCBiZSBzZXRcbi0gKiB0byAwIGFuZCAtRUJVU1kgcmV0dXJuZWQuXG4rICogVGhlIGNhbGxlciBob2xkcyBlaXRoZXIgdGhlIG1tYXAgbG9jaywgb3IgdGhlIHBlci1WTUEgbG9jayAod2l0aFxuKyAqIEZPTExfVk1BX0xPQ0spLCBvbiBlbnRyeS4gSWYgQGZsYWdzIGhhcyBGT0xMX1VOTE9DS0FCTEUgYnV0IG5vdCBGT0xMX05PV0FJVCxcbisgKiB0aGUgbW1hcF9sb2NrIG1heSBiZSByZWxlYXNlZC4gSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0IHRvIDAgYW5kXG4rICogLUVBR0FJTiByZXR1cm5lZC5cbisgKlxuKyAqIFRoZSByZXR1cm4gdmFsdWUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBsb2NrIHR5cGU6IGEgZmF1bHQgdGhhdCBtYWRlXG4rICogcHJvZ3Jlc3MgYnV0IG5lZWRzIGEgcmV0cnkgKFZNX0ZBVUxUX1JFVFJZIC8gVk1fRkFVTFRfQ09NUExFVEVEKSBpcyByZXBvcnRlZFxuKyAqIGFzIC1FQUdBSU4gZm9yIGJvdGggdGhlIG1tYXAgbG9jayBhbmQgdGhlIHBlci1WTUEgbG9jayAoRk9MTF9WTUFfTE9DSykuIE9ubHlcbisgKiB0aGUgKkBsb2NrZWQgc2lkZSBlZmZlY3QgaXMgbG9jay10eXBlIHNwZWNpZmljLCBhcyB0aGUgcGVyLVZNQSBsb2NrIHBhdGggaGFzXG4rICogbm8gdW5sb2NrYWJsZSBtbWFwX2xvY2sgdG8gZHJvcC5cbiAgKi9cbiBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGJvb2wgdW5zaGFyZSxcbkBAIC0xMDk3LDYgKzExNjAsOCBAQCBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19XUklURTtcbiBcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9SRU1PVEUpXG4gXHRcdGZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfUkVNT1RFO1xuK1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1ZNQV9MT0NLKVxuK1x0XHRmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1ZNQV9MT0NLO1xuIFx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1VOTE9DS0FCTEUpIHtcbiBcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19BTExPV19SRVRSWSB8IEZBVUxUX0ZMQUdfS0lMTEFCTEU7XG4gXHRcdC8qXG5AQCAtMTEyNSw0MSArMTE5MCwxOTUgQEAgc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRyZXQgPSBoYW5kbGVfbW1fZmF1bHQodm1hLCBhZGRyZXNzLCBmYXVsdF9mbGFncywgTlVMTCk7XG4gXG4rXHQvKlxuK1x0ICogQSBmdWxseSBjb21wbGV0ZWQgZmF1bHQgKFZNX0ZBVUxUX0NPTVBMRVRFRCkgb3Igb25lIHRoYXQgbmVlZHMgYSByZXRyeVxuK1x0ICogKFZNX0ZBVUxUX1JFVFJZKSBoYXMgcmVsZWFzZWQgdGhlIGxvY2sgaXQgd2FzIGhvbGRpbmcuIFJlcG9ydCBib3RoIGFzXG4rXHQgKiAtRUFHQUlOIHNvIHRoZSBjYWxsZXIgcmV0cmllczogdGhlIG1tYXAgbG9jayBjYWxsZXIgcmV0YWtlcyBpdCBoZXJlLFxuK1x0ICogdGhlIHBlci1WTUEgbG9jayBjYWxsZXIgKEZPTExfVk1BX0xPQ0spIGZhbGxzIGJhY2sgdG8gdGhlIG1tYXAgbG9jay5cbitcdCAqXG4rXHQgKiBEcm9wcGluZyB0aGUgbW1hcCBsb2NrIGlzIHJlY29yZGVkIGluICpAbG9ja2VkLiBUaGVyZSBpcyBubyBzdWNoIGxvY2tcbitcdCAqIHRvIGRyb3AgdW5kZXIgdGhlIHBlci1WTUEgbG9jaywgd2hlcmUgQGxvY2tlZCBpcyBub3QgdXNlZCwgc28gbGVhdmUgaXRcbitcdCAqIGFsb25lIGluIHRoYXQgY2FzZS5cbitcdCAqL1xuIFx0aWYgKHJldCBcdTAwMjYgVk1fRkFVTFRfQ09NUExFVEVEKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFdpdGggRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQgd2UnbGwgbmV2ZXIgcmVsZWFzZSB0aGVcbi1cdFx0ICogbW1hcCBsb2NrIGluIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIuIFNhbml0eSBjaGVjayB0aGlzLlxuLVx0XHQgKi9cbi1cdFx0V0FSTl9PTl9PTkNFKGZhdWx0X2ZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCk7XG4tXHRcdCpsb2NrZWQgPSAwO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSBzaG91bGQgZG8gdGhlIHNhbWUgYXMgVk1fRkFVTFRfUkVUUlksIGJ1dCBsZXQncyBub3Rcbi1cdFx0ICogcmV0dXJuIC1FQlVTWSBzaW5jZSB0aGF0J3Mgbm90IHJlZmxlY3RpbmcgdGhlIHJlYWxpdHkgb2Zcbi1cdFx0ICogd2hhdCBoYXMgaGFwcGVuZWQgLSB3ZSd2ZSBqdXN0IGZ1bGx5IGNvbXBsZXRlZCBhIHBhZ2Vcbi1cdFx0ICogZmF1bHQsIHdpdGggdGhlIG1tYXAgbG9jayByZWxlYXNlZC4gIFVzZSAtRUFHQUlOIHRvIHNob3dcbi1cdFx0ICogdGhhdCB3ZSB3YW50IHRvIHRha2UgdGhlIG1tYXAgbG9jayBfYWdhaW5fLlxuLVx0XHQgKi9cbitcdFx0aWYgKCEoZmxhZ3MgXHUwMDI2IEZPTExfVk1BX0xPQ0spKSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJ2xsIG5ldmVyIHJlbGVhc2UgdGhlXG4rXHRcdFx0ICogbW1hcCBsb2NrIGluIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIuIFNhbml0eSBjaGVjayB0aGlzLlxuK1x0XHRcdCAqL1xuK1x0XHRcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpO1xuK1x0XHRcdCpsb2NrZWQgPSAwO1xuK1x0XHR9XG4gXHRcdHJldHVybiAtRUFHQUlOO1xuIFx0fVxuIFxuIFx0aWYgKHJldCBcdTAwMjYgVk1fRkFVTFRfRVJST1IpIHtcbiBcdFx0aW50IGVyciA9IHZtX2ZhdWx0X3RvX2Vycm5vKHJldCwgZmxhZ3MpO1xuIFxuLVx0XHRpZiAoZXJyKVxuLVx0XHRcdHJldHVybiBlcnI7XG4tXHRcdEJVRygpO1xuK1x0XHQvKlxuK1x0XHQgKiBWTV9GQVVMVF9FUlJPUiBhbHdheXMgZGVjb2RlcyB0byBhbiBlcnJubzsgYSB6ZXJvIGhlcmUgd291bGRcbitcdFx0ICogbWVhbiBoYW5kbGVfbW1fZmF1bHQoKSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIGNvbWJpbmF0aW9uLlxuK1x0XHQgKiBSZXBvcnQgLUVGQVVMVCByYXRoZXIgdGhhbiBjcmFzaDogdW5kZXIgdGhlIHBlci1WTUEgbG9jayB0aGVcbitcdFx0ICogbW1hcCBsb2NrIHJldHJ5IHByb2R1Y2VzIHRoZSBkZWZpbml0aXZlIHJlc3VsdC5cbitcdFx0ICovXG4rXHRcdFZNX1dBUk5fT05fT05DRSghZXJyKTtcbitcdFx0cmV0dXJuIGVyciA/IGVyciA6IC1FRkFVTFQ7XG4gXHR9XG4gXG4gXHRpZiAocmV0IFx1MDAyNiBWTV9GQVVMVF9SRVRSWSkge1xuLVx0XHRpZiAoIShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKVxuK1x0XHRpZiAoIShmbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSykgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhKGZhdWx0X2ZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCkpXG4gXHRcdFx0KmxvY2tlZCA9IDA7XG4tXHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdHJldHVybiAtRUFHQUlOO1xuIFx0fVxuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKy8qXG4rICogZ2V0X3VzZXJfcGFnZV92bWEgLSBnZXQgb25lIHBhZ2UgZnJvbSBAdm1hLCB3aG9zZSBsb2NrIHRoZSBjYWxsZXIgYWxyZWFkeVxuKyAqIGhvbGRzOiB0aGUgbW1hcCBsb2NrLCBvciAod2l0aCBGT0xMX1ZNQV9MT0NLKSB0aGUgcGVyLVZNQSBsb2NrLiBXYWxrcyB0aGVcbisgKiBwYWdlIHRhYmxlcywgZmF1bHRpbmcgdGhlIHBhZ2UgaW4gaWYgbmVlZGVkLCBhbmQgb24gc3VjY2VzcyByZXR1cm5zIGl0IHdpdGhcbisgKiBhIHJlZmVyZW5jZSBhbmQgdGhlIGxvY2sgc3RpbGwgaGVsZC5cbisgKlxuKyAqIFJ1bnMgY2hlY2tfdm1hX2ZsYWdzKCkgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHNvIGNhbGxlcnMgbmVlZCBub3QgcHJlLWNoZWNrXG4rICogdGhlIFZNQTsgbW9zdCByZWplY3Rpb25zIGFyZSByZXR1cm5lZCBhcyB0aGVpciBlcnJvci4gQSBWTV9JTy9WTV9QRk5NQVAgVk1BXG4rICogaXMgdGhlIGV4Y2VwdGlvbjogYSBDT1dlZCBwYWdlIHdpdGggYSBzdHJ1Y3QgcGFnZSBpcyByZXR1cm5lZCwgd2hpbGUgYSByYXdcbisgKiBQRk4gaGFzIG5vbmUgYW5kIHlpZWxkcyAtRUZBVUxULCB0byBiZSByZWFjaGVkIHZpYSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuKyAqXG4rICogVW5kZXIgRk9MTF9WTUFfTE9DSywgYW55dGhpbmcgdGhhdCBjYW5ub3QgYmUgZmluaXNoZWQgdW5kZXIgdGhlIHBlci1WTUEgbG9ja1xuKyAqIChhIGRyb3BwZWQgZmF1bHQsIHVzZXJmYXVsdGZkLCBhIGhhcmQgZXJyb3IsIG9yIC1cdTAwM2VhY2Nlc3MoKSBtZW1vcnkpIHJlbGVhc2VzXG4rICogdGhlIGxvY2sgYW5kIHJldHVybnMgLUVBR0FJTiwgc28gdGhlIGNhbGxlciByZXRyaWVzIHVuZGVyIHRoZSBtbWFwIGxvY2suXG4rICovXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4re1xuK1x0Ym9vbCB2bWFfbG9ja2VkID0gZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX1ZNQV9MT0NLO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcbitcdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0aW50IGxvY2tlZCA9IDE7XG4rXHRib29sIHBmbm1hcDtcbitcdGludCByZXQ7XG4rXG4rXHQvKlxuK1x0ICogVHdvIGxvY2sgbW9kZXMgYXJlIHN1cHBvcnRlZDogdGhlIG1tYXAgbG9jaywgd2l0aCBuZWl0aGVyIGZsYWcsIG9yXG4rXHQgKiB0aGUgcGVyLVZNQSBsb2NrLCB3aXRoIGJvdGggRk9MTF9WTUFfTE9DSyBhbmQgRk9MTF9VTkxPQ0tBQkxFLiBBblxuK1x0ICogdW5sb2NrYWJsZSBtbWFwIGZhdWx0IHdvdWxkIGRyb3AgdGhlIGxvY2sgYW5kIHJlcG9ydCBpdCBpbiAqbG9ja2VkLFxuK1x0ICogd2hpY2ggdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWxheSwgc28gcmVqZWN0IGEgbG9uZSBmbGFnLlxuK1x0ICovXG4rXHRWTV9XQVJOX09OX09OQ0UoIShndXBfZmxhZ3MgXHUwMDI2IEZPTExfVk1BX0xPQ0spICE9ICEoZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX1VOTE9DS0FCTEUpKTtcbitcbitcdC8qXG4rXHQgKiBWYWxpZGF0ZSB0aGUgVk1BIHVwIGZyb250LCBsaWtlIF9fZ2V0X3VzZXJfcGFnZXMoKS4gQSBWTV9JTy9WTV9QRk5NQVBcbitcdCAqIFZNQSBpcyBub3QgcmVqZWN0ZWQgb3V0cmlnaHQ6IGl0IGNhbiBob2xkIENPV2VkIHBhZ2VzIHRoYXQgaGF2ZSBhXG4rXHQgKiBzdHJ1Y3QgcGFnZTsgbGV0IGZvbGxvd19wYWdlX21hc2soKSBsb29rIGZvciB0aGVtLCBhbmQgdHJlYXQgb25seVxuK1x0ICogaXRzIHN0cnVjdC1wYWdlLWxlc3MgUEZOcyBhcyB1bnJlYWNoYWJsZS4gT3RoZXIgcmVqZWN0aW9uc1xuK1x0ICogKHNlY3JldG1lbSwgcGVybWlzc2lvbnMsIGV0YykgcmVzdWx0IGluIGltbWVkaWF0ZSBmYWlsdXJlLlxuK1x0ICovXG4rXHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIFZNX0lPIHwgVk1fUEZOTUFQKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gZmFpbDtcbitcdHBmbm1hcCA9IHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgKFZNX0lPIHwgVk1fUEZOTUFQKTtcbitcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7XG4rXHRcdFx0cmV0ID0gLUVJTlRSO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRjb25kX3Jlc2NoZWQoKTtcbitcbitcdFx0LyogVGhpcyBoZWxwZXIgaGFuZHMgYmFjayBhIHNpbmdsZSBwYWdlOyBjYXAgdGhlIGJhdGNoIGF0IG9uZS4gKi9cbitcdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBhZGRyLCBhZGRyICsgUEFHRV9TSVpFLFxuK1x0XHRcdFx0XHRndXBfZmxhZ3MgfCBGT0xMX1RPVUNIIHwgRk9MTF9HRVQsXG4rXHRcdFx0XHRcdFx1MDAyNm5yX3BhZ2VzKTtcbitcdFx0aWYgKCFJU19FUlJfT1JfTlVMTChwYWdlKSkge1xuK1x0XHRcdC8qIE1hdGNoIF9fZ2V0X3VzZXJfcGFnZXMoKTogZmx1c2ggZm9yIFZJVlQvYWxpYXNpbmcgY2FjaGVzLiAqL1xuK1x0XHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHBhZ2UsIGFkZHIpO1xuK1x0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpO1xuK1x0XHRcdHJldHVybiBwYWdlO1xuK1x0XHR9XG4rXG4rXHRcdC8qXG4rXHRcdCAqIE5vIHN0cnVjdCBwYWdlOiBhIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgVk1BLCB3aGV0aGVyXG4rXHRcdCAqIHNlZW4gYnkgdGhlIHVwLWZyb250IGNoZWNrIChAcGZubWFwKSBvciByZXBvcnRlZCBhcyAtRUVYSVNUXG4rXHRcdCAqIGZvciBhIHByZXNlbnQgUEZOLiBSZXR1cm4gLUVGQVVMVCBzbyB0aGUgY2FsbGVyIHJlYWNoZXMgaXRcbitcdFx0ICogdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuK1x0XHQgKi9cbitcdFx0aWYgKHBmbm1hcCB8fCBQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcbitcdFx0XHRyZXQgPSAtRUZBVUxUO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHQvKiBBIGhhcmQgZXJyb3IgZnJvbSB0aGUgd2FsayBpdHNlbGYuICovXG4rXHRcdGlmIChwYWdlIFx1MDAyNlx1MDAyNiBQVFJfRVJSKHBhZ2UpICE9IC1FTUxJTkspIHtcbitcdFx0XHRyZXQgPSBQVFJfRVJSKHBhZ2UpO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1xuK1x0XHQvKlxuK1x0XHQgKiBUaGUgcGFnZSBpcyBub3QgcHJlc2VudCwgb3IgbmVlZHMgdW5zaGFyaW5nLiBBIHJlbW90ZSBmYXVsdFxuK1x0XHQgKiB1bmRlciB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBkZWxpdmVyIHVzZXJmYXVsdGZkICh3aGljaFxuK1x0XHQgKiBhc3N1bWVzIGN1cnJlbnQgaXMgdGhlIGZhdWx0aW5nIHRhc2spLCBzbyBmYWxsIGJhY2sgZm9yIHRob3NlLlxuK1x0XHQgKi9cbitcdFx0aWYgKHZtYV9sb2NrZWQgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcbitcdFx0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfR0VULFxuK1x0XHRcdFx0ICAgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LLCBcdTAwMjZsb2NrZWQpO1xuK1x0XHRpZiAocmV0ID09IC1FQUdBSU4pXG4rXHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XHQvKiBmYXVsdCByZWxlYXNlZCB0aGUgcGVyLVZNQSBsb2NrICovXG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK2ZhaWw6XG4rXHQvKlxuK1x0ICogVW5kZXIgdGhlIHBlci1WTUEgbG9jayB0aGUgY2FsbGVyIGNhbm5vdCByZWFjaCAtXHUwMDNlYWNjZXNzKCkgb3IgYWN0IG9uIGFcbitcdCAqIGhhcmQgZXJyb3IgKGJvdGggbmVlZCB0aGUgbW1hcCBsb2NrKSwgc28gcmVsZWFzZSB0aGUgbG9jayBhbmQgaGF2ZSBpdFxuK1x0ICogcmV0cnkgdGhlcmU7IHRoZSBtbWFwLWxvY2sgcGFzcyBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSBlcnJvci5cbitcdCAqL1xuK1x0aWYgKHZtYV9sb2NrZWQpIHtcbitcdFx0dm1hX2VuZF9yZWFkKHZtYSk7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FQUdBSU4pO1xuK1x0fVxuK1x0cmV0dXJuIEVSUl9QVFIocmV0KTtcbit9XG4rXG4rLypcbisgKiBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEgLSBmYXVsdCBpbiBvbmUgcGFnZSBvZiBhIHJlbW90ZSBtbSBhbmQgaGFuZCBiYWNrIHRoZVxuKyAqIHBhZ2UgYWxvbmcgd2l0aCB0aGUgVk1BIHRoYXQgY292ZXJzIGl0LiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgbW1hcF9sb2NrLlxuKyAqIFJldHVybnMgd2l0aCB0aGUgbW1hcF9sb2NrIHN0aWxsIGhlbGQuXG4rICpcbisgKiBMb29rcyB1cCB0aGUgVk1BLCBhbmQgZ2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgcGFnZSB0aHJvdWdoXG4rICogZ2V0X3VzZXJfcGFnZV92bWEoKSwgZmF1bHRpbmcgaW4gdGhlIHBhZ2UgaWYgbmVlZGVkLlxuKyAqXG4rICogRk9MTF9OT1dBSVQgYW5kIEZPTExfVU5MT0NLQUJMRSBhcmUgcmVqZWN0ZWQ6IGJvdGggbGV0IHRoZSBmYXVsdCBoYW5kbGVyXG4rICogZHJvcCB0aGUgbW1hcCBsb2NrLCB3aGljaCBjb3VsZCBpbnZhbGlkYXRlIHRoZSBsb29rZWQtdXAgVk1BLlxuKyAqL1xuK3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbitcdFx0XHRcdCAgICAgIGludCBndXBfZmxhZ3MsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKVxuK3tcbitcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXG4rXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgKEZPTExfTk9XQUlUIHwgRk9MTF9VTkxPQ0tBQkxFKSkpKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbitcbitcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XG4rXG4rXHR2bWEgPSB2bWFfbG9va3VwKG1tLCBhZGRyKTtcbitcdGlmICghdm1hKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcbitcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7XG4rXHRpZiAoSVNfRVJSKHBhZ2UpKVxuK1x0XHRyZXR1cm4gcGFnZTtcbitcbitcdCp2bWFwID0gdm1hO1xuK1x0cmV0dXJuIHBhZ2U7XG4rfVxuK1xuIC8qXG4gICogV3JpdGluZyB0byBmaWxlLWJhY2tlZCBtYXBwaW5ncyB3aGljaCByZXF1aXJlIGZvbGlvIGRpcnR5IHRyYWNraW5nIHVzaW5nIEdVUFxuICAqIGlzIGEgZnVuZGFtZW50YWxseSBicm9rZW4gb3BlcmF0aW9uLCBhcyBrZXJuZWwgd3JpdGUgYWNjZXNzIHRvIEdVUCBtYXBwaW5nc1xuQEAgLTExOTcsMTMgKzE0MTYsMjEgQEAgc3RhdGljIGJvb2wgd3JpdGFibGVfZmlsZV9tYXBwaW5nX2FsbG93ZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRyZXR1cm4gIXZtYV9uZWVkc19kaXJ0eV90cmFja2luZyh2bWEpO1xuIH1cbiBcbi1zdGF0aWMgaW50IGNoZWNrX3ZtYV9mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBndXBfZmxhZ3MpXG4raW50IGNoZWNrX3ZtYV9mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBndXBfZmxhZ3MsXG4rXHRcdCAgICB2bV9mbGFnc190IGlnbm9yZV9mbGFncylcbiB7XG4gXHR2bV9mbGFnc190IHZtX2ZsYWdzID0gdm1hLVx1MDAzZXZtX2ZsYWdzO1xuIFx0aW50IHdyaXRlID0gKGd1cF9mbGFncyBcdTAwMjYgRk9MTF9XUklURSk7XG4gXHRpbnQgZm9yZWlnbiA9IChndXBfZmxhZ3MgXHUwMDI2IEZPTExfUkVNT1RFKTtcbiBcdGJvb2wgdm1hX2Fub24gPSB2bWFfaXNfYW5vbnltb3VzKHZtYSk7XG4gXG4rXHQvKlxuK1x0ICogT3B0IG91dCBvZiB0aGUgZmxhZyBjaGVja3MgdGhhdCByZWFkIHRoaXMgbG9jYWwgY29weSAodGhlXG4rXHQgKiBWTV9JTy9WTV9QRk5NQVAgZ2F0ZSBhbmQgdGhlIHdyaXRlL3JlYWQvY293IGJpdHMpOyBjaGVja3MgdGhhdFxuK1x0ICogcmUtcmVhZCB2bWEtXHUwMDNldm1fZmxhZ3MgdGhyb3VnaCBoZWxwZXJzIGFyZSB1bmFmZmVjdGVkLlxuK1x0ICovXG4rXHR2bV9mbGFncyBcdTAwMjY9IH5pZ25vcmVfZmxhZ3M7XG4rXG4gXHRpZiAodm1fZmxhZ3MgXHUwMDI2IChWTV9JTyB8IFZNX1BGTk1BUCkpXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFxuQEAgLTEzNTgsNyArMTU4NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4ge1xuIFx0bG9uZyByZXQgPSAwLCBpID0gMDtcbiBcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbi1cdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcbiBcbiBcdGlmICghbnJfcGFnZXMpXG4gXHRcdHJldHVybiAwO1xuQEAgLTEzNzMsNyArMTU5OSw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRkbyB7XG4gXHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0XHR1bnNpZ25lZCBpbnQgcGFnZV9pbmNyZW07XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pbmNyZW07XG4gXG4gXHRcdC8qIGZpcnN0IGl0ZXJhdGlvbiBvciBjcm9zcyB2bWEgYm91bmQgKi9cbiBcdFx0aWYgKCF2bWEgfHwgc3RhcnQgXHUwMDNlPSB2bWEtXHUwMDNldm1fZW5kKSB7XG5AQCAtMTM4Nyw3ICsxNjEzLDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0cmV0ID0gLUVOT01FTTtcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0XHR9XG4tXHRcdFx0XHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkge1xuK1x0XHRcdFx0aWYgKGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCkpIHtcbiBcdFx0XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0XHR9XG5AQCAtMTQwMCw3ICsxNjI2LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0XHRwYWdlcyA/IFx1MDAyNnBhZ2UgOiBOVUxMKTtcbiBcdFx0XHRcdGlmIChyZXQpXG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0cGFnZV9tYXNrID0gMDtcbitcdFx0XHRcdHBhZ2VfaW5jcmVtID0gMTtcbiBcdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuIFx0XHRcdH1cbiBcbkBAIC0xNDA4LDcgKzE2MzQsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0cmV0ID0gLUVGQVVMVDtcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbi1cdFx0XHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MpO1xuK1x0XHRcdHJldCA9IGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCk7XG4gXHRcdFx0aWYgKHJldClcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG5AQCAtMTQyMyw3ICsxNjQ5LDggQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcbi1cdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCBcdTAwMjZwYWdlX21hc2spO1xuK1x0XHRwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBzdGFydCArIG5yX3BhZ2VzICogUEFHRV9TSVpFLFxuK1x0XHRcdFx0XHRndXBfZmxhZ3MsIFx1MDAyNnBhZ2VfaW5jcmVtKTtcbiBcdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuIFx0XHRcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXG4gXHRcdFx0XHRcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcbkBAIC0xNDU2LDcgKzE2ODMsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gbmV4dF9wYWdlOlxuLVx0XHRwYWdlX2luY3JlbSA9IDEgKyAofihzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IHBhZ2VfbWFzayk7XG4gXHRcdGlmIChwYWdlX2luY3JlbSBcdTAwM2UgbnJfcGFnZXMpXG4gXHRcdFx0cGFnZV9pbmNyZW0gPSBucl9wYWdlcztcbiBcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggMTgxZTc5ZjFkNmEyMDcuLjcwNmY3ZjA4ZmQxODE1IDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuKysrIGIvbW0vaW50ZXJuYWwuaFxuQEAgLTE1OTUsNiArMTU5NSwxMCBAQCBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLFxuICAqL1xuIGludCBfX211c3RfY2hlY2sgdHJ5X2dyYWJfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IHJlZnMsXG4gXHRcdFx0XHR1bnNpZ25lZCBpbnQgZmxhZ3MpO1xuK2ludCBjaGVja192bWFfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZ3VwX2ZsYWdzLFxuK1x0XHQgICAgdm1fZmxhZ3NfdCBpZ25vcmVfZmxhZ3MpO1xuK3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKTtcbiBcbiAvKlxuICAqIG1tL2h1Z2VfbWVtb3J5LmNcbkBAIC0xNjQxLDExICsxNjQ1LDEzIEBAIGVudW0ge1xuIFx0Rk9MTF9VTkxPQ0tBQkxFID0gMSBcdTAwM2NcdTAwM2MgMjEsXG4gXHQvKiBWTUEgbG9va3VwK2NoZWNrcyBjb21wYXRpYmxlIHdpdGggTUFEVl9QT1BVTEFURV8oUkVBRHxXUklURSkgKi9cbiBcdEZPTExfTUFEVl9QT1BVTEFURSA9IDEgXHUwMDNjXHUwMDNjIDIyLFxuK1x0LyogY2FsbGVyIGhvbGRzIHRoZSBwZXItVk1BIGxvY2ssIG5vdCB0aGUgbW1hcCBsb2NrICovXG4rXHRGT0xMX1ZNQV9MT0NLID0gMSBcdTAwM2NcdTAwM2MgMjMsXG4gfTtcbiBcbiAjZGVmaW5lIElOVEVSTkFMX0dVUF9GTEFHUyAoRk9MTF9UT1VDSCB8IEZPTExfVFJJRUQgfCBGT0xMX1JFTU9URSB8IEZPTExfUElOIHwgXFxcbiBcdFx0XHQgICAgRk9MTF9GQVNUX09OTFkgfCBGT0xMX1VOTE9DS0FCTEUgfCBcXFxuLVx0XHRcdCAgICBGT0xMX01BRFZfUE9QVUxBVEUpXG4rXHRcdFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSB8IEZPTExfVk1BX0xPQ0spXG4gXG4gLypcbiAgKiBJbmRpY2F0ZXMgZm9yIHdoaWNoIHBhZ2VzIHRoYXQgYXJlIHdyaXRlLXByb3RlY3RlZCBpbiB0aGUgcGFnZSB0YWJsZSxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXG5pbmRleCBmZjMzOGMyYWJlOTIzMS4uYWFmNjIwMDE3ZjM0NDIgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnkuY1xuKysrIGIvbW0vbWVtb3J5LmNcbkBAIC03MDE1LDg2ICs3MDE1LDI0NCBAQCBFWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX2FjY2Vzc19waHlzKTtcbiAjZW5kaWZcbiBcbiAvKlxuLSAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4rICogVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5LCBzdWNoIGFzIGFuIGlvcmVtYXBwZWQgZGV2aWNlIG1hcHBpbmcsIG1hcHNcbisgKiBQRk5zIHRoYXQgaGF2ZSBubyBzdHJ1Y3QgcGFnZSwgc28gZ2V0X3VzZXJfcGFnZV92bWEoKSBjYW5ub3QgZmV0Y2ggaXRcbisgKiBldmVuIHRob3VnaCB0aGUgcGFnZSB0YWJsZXMgYXJlIHBvcHVsYXRlZC4gSXQgY2FuIHN0aWxsIGJlIHJlYWNoZWRcbisgKiB0aHJvdWdoIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCkuXG4rICpcbisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG9yIFx1MDAzYz0gMCBpZiBAdm1hIGNhbm5vdCBiZVxuKyAqIGFjY2Vzc2VkIHRoaXMgd2F5LlxuICAqL1xuLXN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuK3N0YXRpYyBpbnQgYWNjZXNzX3JlbW90ZV92bWFfb3BzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4rXHRcdFx0XHQgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpXG4re1xuKyNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1RcbitcdGlmICh2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcylcbitcdFx0cmV0dXJuIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTtcbisjZW5kaWZcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIExvY2sgQG1tIHRvIHJlYWNoIHRoZSByZW1vdGUgcmFuZ2UgW0BhZGRyLCBAYWRkciArIEBsZW4pLlxuKyAqXG4rICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlXG4rICogZmxhZ3MgcGVybWl0IHRoZSBhY2Nlc3MuIFRoZSBSQ1UgZnJlZWQgcGFnZSB0YWJsZXMgdGhlbiBrZWVwIHBhZ2UgdGFibGVcbisgKiBtZW1vcnkgZnJvbSBiZWluZyByZXVzZWQgd2l0aCB1bmV4cGVjdGVkIGNvbnRlbnRzIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuXG4rICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLFxuKyAqIHN0YWNrIGV4cGFuc2lvbiwgYW5kIC1cdTAwM2VhY2Nlc3MoKSBtZW1vcnkuXG4rICpcbisgKiBSZXR1cm4gd2hldGhlciB0aGUgbW1hcCBsb2NrIGlzIGhlbGQuIFRoZSBwZXItVk1BIGxvY2tlZCBWTUEsIHdoZW4gb25lIGlzXG4rICogdGFrZW4sIGlzIHN0b3JlZCBpbiAqQHZtYXA7IGl0IGlzIE5VTEwgb24gdGhlIG1tYXAgbG9jayBwYXRoLiAqQHZtYXAgaXNcbisgKiBzZXQgdG8gYW4gRVJSX1BUUigpIHdoZW4gdGhlIG1tYXAgbG9jayBjb3VsZCBub3QgYmUgdGFrZW4sIHNvIGNhbGxlcnMgbXVzdFxuKyAqIGNoZWNrIElTX0VSUigqQHZtYXApIGJlZm9yZSB1c2luZyBlaXRoZXIgcmVzdWx0LlxuKyAqL1xuK3N0YXRpYyBib29sIHJlbW90ZV9hY2Nlc3NfbG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuK1x0XHRcdCAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKVxuK3tcbitcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbitcbisjaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZNQV9MT0NLKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRSlcbitcdHZtYSA9IGxvY2tfdm1hX3VuZGVyX3JjdShtbSwgYWRkcik7XG4rXHRpZiAodm1hKSB7XG4rXHRcdC8qIGFkZHIgKyBsZW4gbXVzdCBub3Qgd3JhcCwgYW5kIG11c3QgZml0IHdpdGhpbiB0aGUgb25lIFZNQS4gKi9cbitcdFx0aWYgKGFkZHIgKyBsZW4gXHUwMDNjIGFkZHIgfHwgYWRkciArIGxlbiBcdTAwM2Ugdm1hLVx1MDAzZXZtX2VuZCB8fFxuK1x0XHQgICAgY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKSkge1xuK1x0XHRcdHZtYV9lbmRfcmVhZCh2bWEpO1xuK1x0XHRcdHZtYSA9IE5VTEw7XG4rXHRcdH1cbitcdH1cbisjZW5kaWZcbitcbitcdGlmICghdm1hKSB7XG4rXHRcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpIHtcbitcdFx0XHQqdm1hcCA9IEVSUl9QVFIoLUVJTlRSKTtcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdH1cbitcdFx0KnZtYXAgPSBOVUxMO1xuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdH1cbitcbitcdCp2bWFwID0gdm1hO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKiBSZWxlYXNlIHRoZSBsb2NrIHRha2VuIGJ5IHJlbW90ZV9hY2Nlc3NfbG9jaygpLiAqL1xuK3N0YXRpYyB2b2lkIHJlbW90ZV9hY2Nlc3NfdW5sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuK1x0XHRcdFx0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sIGhhdmVfbW1hcF9sb2NrKVxuK3tcbitcdGlmIChoYXZlX21tYXBfbG9jaylcbitcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4rXHRlbHNlIGlmICh2bWEpXG4rXHRcdHZtYV9lbmRfcmVhZCh2bWEpO1xuK31cbitcbisvKlxuKyAqIFBlci1wYWdlIGFjdGlvbiBmb3IgYSByZW1vdGUgVk0gd2Fsay4gSGFuZGxlIHVwIHRvIEBsZW4gYnl0ZXMgYXQgQGFkZHIgb25cbisgKiBAcGFnZSwgYWR2YW5jaW5nICpAYnVmIHBhc3QgdGhlIGJ5dGVzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGl0LiBAcGFnZSBpc1xuKyAqIE5VTEwgZm9yIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IChWTV9JTyAvIFZNX1BGTk1BUCkgcmVhY2hlZCB1bmRlciB0aGUgbW1hcFxuKyAqIGxvY2suXG4rICpcbisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzb3VyY2UgYnl0ZXMgaGFuZGxlZCBhdCBAYWRkciwgMCB0byBlbmQgdGhlIHdhbGsgKGFcbisgKiBzdHJpbmcgcmVhY2hlZCBpdHMgTlVMLCBvciAtXHUwMDNlYWNjZXNzKCkgbWVtb3J5IGNvdWxkIG5vdCBiZSByZWFjaGVkKSwgb3IgYVxuKyAqIG5lZ2F0aXZlIGVycm5vIHRvIGFib3J0LlxuKyAqL1xuK3R5cGVkZWYgaW50ICgqcmVtb3RlX3ZtX2FjdGlvbikoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLFxuK1x0XHRcdFx0aW50IHdyaXRlKTtcbitcbisvKlxuKyAqIFdhbGsgdGhlIHJlbW90ZSByYW5nZSBbQGFkZHIsIEBhZGRyICsgQGxlbikgb2YgQG1tLCBoYW5kaW5nIGVhY2ggcGFnZSB0b1xuKyAqIEBhY3Rpb24uIFVzZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHJhbmdlIGZpdHMgb25lIFZNQSwgYW5kIGZhbGwgYmFjayB0b1xuKyAqIHRoZSBtbWFwIGxvY2sgZm9yIG11bHRpLVZNQSByYW5nZXMsIHN0YWNrIGV4cGFuc2lvbiAod2hlbiBAY2FuX2V4cGFuZF9zdGFja1xuKyAqIGlzIHNldCksIG9yIHdoZW4gdGhlIHBlci1WTUEgbG9jayBjYW5ub3QgZmluaXNoIGEgZmF1bHQuXG4rICpcbisgKiBFYWNoIHBhZ2UgaXMgZmF1bHRlZCBpbiB3aXRoIGdldF91c2VyX3BhZ2Vfdm1hKCkgdW5kZXIgd2hpY2hldmVyIGxvY2sgaXNcbisgKiBoZWxkLiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBAYWN0aW9uIGNvbnN1bWVkOyAqQGVyciBpcyBhIG5lZ2F0aXZlXG4rICogZXJybm8gd2hlbiB0aGUgd2FsayBhYm9ydGVkLCBlbHNlIDAuXG4rICovXG4rc3RhdGljIGludCByZW1vdGVfdm1fd2FsayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsXG4rXHRcdFx0ICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBib29sIGNhbl9leHBhbmRfc3RhY2ssXG4rXHRcdFx0ICByZW1vdGVfdm1fYWN0aW9uIGFjdGlvbiwgaW50ICplcnIpXG4ge1xuIFx0dm9pZCAqb2xkX2J1ZiA9IGJ1ZjtcbiBcdGludCB3cml0ZSA9IGd1cF9mbGFncyBcdTAwMjYgRk9MTF9XUklURTtcbitcdGJvb2wgaGF2ZV9tbWFwX2xvY2s7XG4rXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiBcbi1cdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpXG4tXHRcdHJldHVybiAwO1xuK1x0KmVyciA9IDA7XG4rXG4rXHQvKlxuK1x0ICogU2V0IEZPTExfUkVNT1RFIHNvIGNoZWNrX3ZtYV9mbGFncygpIGFwcGxpZXMgdGhlIHNhbWUgcHJvdGVjdGlvbiBrZXlcbitcdCAqIHJ1bGVzIGFzIGdldF91c2VyX3BhZ2VzX3JlbW90ZSgpIGRpZDogdGhlIGN1cnJlbnQgUEtSVSBpcyBub3QgY2hlY2tlZFxuK1x0ICogYWdhaW5zdCBhIFZNQSByZWFjaGVkIG9uIEBtbSdzIGJlaGFsZi5cbitcdCAqL1xuK1x0Z3VwX2ZsYWdzIHw9IEZPTExfUkVNT1RFO1xuIFxuLVx0LyogVW50YWcgdGhlIGFkZHJlc3MgYmVmb3JlIGxvb2tpbmcgdXAgdGhlIFZNQSAqL1xuLVx0YWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTtcbitcdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XG4gXG4tXHQvKiBBdm9pZCB0cmlnZ2VyaW5nIHRoZSB0ZW1wb3Jhcnkgd2FybmluZyBpbiBfX2dldF91c2VyX3BhZ2VzICovXG4tXHRpZiAoIXZtYV9sb29rdXAobW0sIGFkZHIpIFx1MDAyNlx1MDAyNiAhZXhwYW5kX3N0YWNrKG1tLCBhZGRyKSlcbitcdGhhdmVfbW1hcF9sb2NrID0gcmVtb3RlX2FjY2Vzc19sb2NrKG1tLCBhZGRyLCBsZW4sIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbitcdGlmIChJU19FUlIodm1hKSkge1xuK1x0XHQqZXJyID0gLUVGQVVMVDtcbiBcdFx0cmV0dXJuIDA7XG4rXHR9XG4gXG4tXHQvKiBpZ25vcmUgZXJyb3JzLCBqdXN0IGNoZWNrIGhvdyBtdWNoIHdhcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgKi9cbiBcdHdoaWxlIChsZW4pIHtcbi1cdFx0aW50IGJ5dGVzLCBvZmZzZXQ7XG4tXHRcdHZvaWQgKm1hZGRyO1xuLVx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuLVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuLVx0XHRcdFx0XHRcdFx0ICAgICBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4rXHRcdHVuc2lnbmVkIGludCBmb2xsX2ZsYWdzID0gZ3VwX2ZsYWdzO1xuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdFx0aW50IHJldDtcbiBcbi1cdFx0aWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdC8qIFdlIG1pZ2h0IG5lZWQgdG8gZXhwYW5kIHRoZSBzdGFjayB0byBhY2Nlc3MgaXQgKi9cbitcdFx0aWYgKCF2bWEgfHwgYWRkciBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbitcdFx0XHQvKiBBbnkgbG9va3VwIGhlcmUgaG9sZHMgdGhlIG1tYXAgbG9jay4gKi9cbitcdFx0XHRWTV9CVUdfT04oIWhhdmVfbW1hcF9sb2NrKTtcbiBcdFx0XHR2bWEgPSB2bWFfbG9va3VwKG1tLCBhZGRyKTtcbi1cdFx0XHRpZiAoIXZtYSkge1xuK1x0XHRcdGlmICghdm1hIFx1MDAyNlx1MDAyNiBjYW5fZXhwYW5kX3N0YWNrKSB7XG4rXHRcdFx0XHQvKiBleHBhbmRfc3RhY2soKSBkcm9wcyB0aGUgbW1hcCBsb2NrIGlmIGl0IGZhaWxzICovXG4gXHRcdFx0XHR2bWEgPSBleHBhbmRfc3RhY2sobW0sIGFkZHIpO1xuLVxuLVx0XHRcdFx0LyogbW1hcF9sb2NrIHdhcyBkcm9wcGVkIG9uIGZhaWx1cmUgKi9cbiBcdFx0XHRcdGlmICghdm1hKVxuLVx0XHRcdFx0XHRyZXR1cm4gYnVmIC0gb2xkX2J1Zjtcbi1cbi1cdFx0XHRcdC8qIFRyeSBhZ2FpbiBpZiBzdGFjayBleHBhbnNpb24gd29ya2VkICovXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRcdFx0aGF2ZV9tbWFwX2xvY2sgPSBmYWxzZTtcbitcdFx0XHR9XG4rXHRcdFx0aWYgKCF2bWEpIHtcbitcdFx0XHRcdCplcnIgPSAtRUZBVUxUO1xuK1x0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuK1x0XHR9XG4rXG4rXHRcdC8qXG4rXHRcdCAqIEZPTExfVU5MT0NLQUJMRSBsZXRzIHRoZSBwZXItVk1BIGZhdWx0IHJldHJ5LCBkcm9wcGluZyB0aGVcbitcdFx0ICogbG9jaywgc28gdGhlIHdhbGsgY2FuIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFoYXZlX21tYXBfbG9jaylcbitcdFx0XHRmb2xsX2ZsYWdzIHw9IEZPTExfVk1BX0xPQ0sgfCBGT0xMX1VOTE9DS0FCTEU7XG4gXG4rXHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGZvbGxfZmxhZ3MpO1xuK1x0XHRpZiAoSVNfRVJSKHBhZ2UpKSB7XG4gXHRcdFx0Lypcbi1cdFx0XHQgKiBDaGVjayBpZiB0aGlzIGlzIGEgVk1fSU8gfCBWTV9QRk5NQVAgVk1BLCB3aGljaFxuLVx0XHRcdCAqIHdlIGNhbiBhY2Nlc3MgdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUuXG4rXHRcdFx0ICogZ2V0X3VzZXJfcGFnZV92bWEoKSByZXR1cm5zIC1FQUdBSU4sIHdpdGggdGhlIHBlci1WTUFcbitcdFx0XHQgKiBsb2NrIHJlbGVhc2VkLCBmb3IgYW55dGhpbmcgaXQgY291bGQgbm90IGZpbmlzaCB1bmRlclxuK1x0XHRcdCAqIGl0OyByZXRha2UgdGhlIG1tYXAgbG9jayBhbmQgcmV0cnkuIEEgZGlmZmVyZW50IGVycm9yXG4rXHRcdFx0ICogdGhlcmVmb3JlIG9ubHkgYXJyaXZlcyB1bmRlciB0aGUgbW1hcCBsb2NrLCB3aGVyZVxuK1x0XHRcdCAqIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IGNhbiBiZSByZWFjaGVkIHZpYSAtXHUwMDNlYWNjZXNzKCkuXG4gXHRcdFx0ICovXG4tXHRcdFx0Ynl0ZXMgPSAwO1xuLSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbi1cdFx0XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MpXG4tXHRcdFx0XHRieXRlcyA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGxlbiwgd3JpdGUpO1xuLSNlbmRpZlxuLVx0XHRcdGlmIChieXRlcyBcdTAwM2M9IDApXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0Ynl0ZXMgPSBsZW47XG4tXHRcdFx0b2Zmc2V0ID0gYWRkciBcdTAwMjYgKFBBR0VfU0laRS0xKTtcbi1cdFx0XHRpZiAoYnl0ZXMgXHUwMDNlIFBBR0VfU0laRS1vZmZzZXQpXG4tXHRcdFx0XHRieXRlcyA9IFBBR0VfU0laRS1vZmZzZXQ7XG4tXG4tXHRcdFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xuLVx0XHRcdGlmICh3cml0ZSkge1xuLVx0XHRcdFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxuLVx0XHRcdFx0XHRcdCAgbWFkZHIgKyBvZmZzZXQsIGJ1ZiwgYnl0ZXMpO1xuLVx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eV9sb2NrKGZvbGlvKTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsXG4tXHRcdFx0XHRcdFx0ICAgIGJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcbitcdFx0XHRpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUFHQUlOKSB7XG4rXHRcdFx0XHR2bWEgPSBOVUxMO1xuK1x0XHRcdFx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkge1xuK1x0XHRcdFx0XHQqZXJyID0gLUVGQVVMVDtcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRoYXZlX21tYXBfbG9jayA9IHRydWU7XG4rXHRcdFx0XHRjb250aW51ZTtcbiBcdFx0XHR9XG4tXHRcdFx0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRSghaGF2ZV9tbWFwX2xvY2spKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdFx0cGFnZSA9IE5VTEw7XG4rXHRcdH1cbitcbitcdFx0cmV0ID0gYWN0aW9uKHZtYSwgcGFnZSwgYWRkciwgXHUwMDI2YnVmLCBsZW4sIHdyaXRlKTtcbitcdFx0aWYgKHJldCBcdTAwM2M9IDApIHtcbitcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdFx0KmVyciA9IHJldDtcbitcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRsZW4gLT0gYnl0ZXM7XG4tXHRcdGJ1ZiArPSBieXRlcztcbi1cdFx0YWRkciArPSBieXRlcztcbitcdFx0YWRkciArPSByZXQ7XG4rXHRcdGxlbiAtPSByZXQ7XG4gXHR9XG4tXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbitcbitcdHJlbW90ZV9hY2Nlc3NfdW5sb2NrKG1tLCB2bWEsIGhhdmVfbW1hcF9sb2NrKTtcbiBcbiBcdHJldHVybiBidWYgLSBvbGRfYnVmO1xuIH1cbiBcbisvKlxuKyAqIENvcHkgb25lIHBhZ2UncyB3b3J0aCBvZiBbQGFkZHIsIEBhZGRyICsgQGxlbikgdG8gb3IgZnJvbSAqQGJ1Zi4gUmVhY2hlc1xuKyAqIHN0cnVjdC1wYWdlLWxlc3MgVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5IHRocm91Z2ggdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MoKS5cbisgKi9cbitzdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxuK3tcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHRpbnQgYnl0ZXMsIG9mZnNldDtcbitcdHZvaWQgKm1hZGRyO1xuK1xuK1x0aWYgKCFwYWdlKSB7XG4rXHRcdGJ5dGVzID0gYWNjZXNzX3JlbW90ZV92bWFfb3BzKHZtYSwgYWRkciwgKmJ1ZiwgbGVuLCB3cml0ZSk7XG4rXHRcdGlmIChieXRlcyBcdTAwM2UgMClcbitcdFx0XHQqYnVmICs9IGJ5dGVzO1xuK1x0XHRyZXR1cm4gYnl0ZXM7XG4rXHR9XG4rXG4rXHRieXRlcyA9IGxlbjtcbitcdG9mZnNldCA9IGFkZHIgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbitcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuK1x0XHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcbitcbitcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbitcdG1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTtcbitcdGlmICh3cml0ZSkge1xuK1x0XHRjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsIG1hZGRyICsgb2Zmc2V0LCAqYnVmLCBieXRlcyk7XG4rXHRcdGZvbGlvX21hcmtfZGlydHlfbG9jayhmb2xpbyk7XG4rXHR9IGVsc2Uge1xuK1x0XHRjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgKmJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcbitcdH1cbitcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xuK1xuK1x0KmJ1ZiArPSBieXRlcztcbitcdHJldHVybiBieXRlcztcbit9XG4rXG4rLypcbisgKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLlxuKyAqL1xuK3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4rXHRcdFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRyZXR1cm4gcmVtb3RlX3ZtX3dhbGsobW0sIGFkZHIsIGJ1ZiwgbGVuLCBndXBfZmxhZ3MsIHRydWUsXG4rXHRcdFx0ICAgICAgYWNjZXNzX3ZtX3BhZ2UsIFx1MDAyNmVycik7XG4rfVxuK1xuIC8qKlxuICAqIGFjY2Vzc19yZW1vdGVfdm0gLSBhY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlXG4gICogQG1tOlx0XHR0aGUgbW1fc3RydWN0IG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZVxuQEAgLTcxMzgsODQgKzcyOTYsNjcgQEAgRVhQT1JUX1NZTUJPTF9HUEwoYWNjZXNzX3Byb2Nlc3Nfdm0pO1xuIFxuICNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbiAvKlxuLSAqIENvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MncyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLlxuLSAqIElmIHRoZXJlIGlzIGFueSBlcnJvciByZXR1cm4gLUVGQVVMVC5cbisgKiBDb3B5IGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gQGFkZHIgaW50byAqQGJ1ZiwgdXAgdG8gQGxlbiBieXRlcyxcbisgKiBzdG9wcGluZyBhdCB0aGUgTlVMLiBzdHJzY3B5KCkgYWx3YXlzIE5VTCB0ZXJtaW5hdGVzLCBzbyByZWNvcHkgdGhlIGxhc3RcbisgKiBieXRlIG9mIGEgcGFnZSB3aGVuIG1vcmUgcGFnZXMgZm9sbG93LiBBIHN0cmluZyBpcyBuZXZlciByZWFkIGZyb21cbisgKiBzdHJ1Y3QtcGFnZS1sZXNzIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeS5cbiAgKi9cbi1zdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4rc3RhdGljIGludCBjb3B5X3ZtX3N0cihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4rXHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKipidWYsIGludCBsZW4sIGludCB3cml0ZSlcbiB7XG4tXHR2b2lkICpvbGRfYnVmID0gYnVmO1xuLVx0aW50IGVyciA9IDA7XG4tXG4tXHQqKGNoYXIgKilidWYgPSAnXFwwJztcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xuK1x0dm9pZCAqbWFkZHI7XG4gXG4tXHRpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKVxuK1x0aWYgKCFwYWdlKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbi1cdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcik7XG4rXHRieXRlcyA9IGxlbjtcbitcdG9mZnNldCA9IGFkZHIgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbitcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuK1x0XHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcbiBcbi1cdC8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi9cbi1cdGlmICghdm1hX2xvb2t1cChtbSwgYWRkcikpIHtcbi1cdFx0ZXJyID0gLUVGQVVMVDtcbi1cdFx0Z290byBvdXQ7XG4rXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XG4rXHRyZXR2YWwgPSBzdHJzY3B5KCpidWYsIG1hZGRyICsgb2Zmc2V0LCBieXRlcyk7XG4rXHRpZiAocmV0dmFsIFx1MDAzZT0gMCkge1xuK1x0XHQvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICovXG4rXHRcdCpidWYgKz0gcmV0dmFsO1xuK1x0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbitcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4tXHR3aGlsZSAobGVuKSB7XG4tXHRcdGludCBieXRlcywgb2Zmc2V0LCByZXR2YWw7XG4tXHRcdHZvaWQgKm1hZGRyO1xuLVx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuLVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xuK1x0KmJ1ZiArPSBieXRlcyAtIDE7XG4rXHRpZiAoYnl0ZXMgIT0gbGVuKSB7XG4rXHRcdGNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyICsgYnl0ZXMgLSAxLCAqYnVmLFxuK1x0XHRcdFx0ICAgIG1hZGRyICsgKFBBR0VfU0laRSAtIDEpLCAxKTtcbitcdFx0KmJ1ZiArPSAxO1xuK1x0fVxuK1x0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4gXG4tXHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbi1cdFx0aWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVHJlYXQgYXMgYSB0b3RhbCBmYWlsdXJlIGZvciBub3cgdW50aWwgd2UgZGVjaWRlIGhvd1xuLVx0XHRcdCAqIHRvIGhhbmRsZSB0aGUgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGNhc2UgYW5kXG4tXHRcdFx0ICogc3RhY2sgZXhwYW5zaW9uLlxuLVx0XHRcdCAqL1xuLVx0XHRcdCooY2hhciAqKWJ1ZiA9ICdcXDAnO1xuLVx0XHRcdGVyciA9IC1FRkFVTFQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbitcdHJldHVybiBieXRlcztcbit9XG4gXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Ynl0ZXMgPSBsZW47XG4tXHRcdG9mZnNldCA9IGFkZHIgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbi1cdFx0aWYgKGJ5dGVzIFx1MDAzZSBQQUdFX1NJWkUgLSBvZmZzZXQpXG4tXHRcdFx0Ynl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XG4tXG4tXHRcdG1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTtcbi1cdFx0cmV0dmFsID0gc3Ryc2NweShidWYsIG1hZGRyICsgb2Zmc2V0LCBieXRlcyk7XG4tXHRcdGlmIChyZXR2YWwgXHUwMDNlPSAwKSB7XG4tXHRcdFx0LyogRm91bmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovXG4tXHRcdFx0YnVmICs9IHJldHZhbDtcbi1cdFx0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuKy8qXG4rICogQ29weSBhIHN0cmluZyBmcm9tIGFub3RoZXIgcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4rICogSWYgdGhlcmUgaXMgYW55IGVycm9yIHJldHVybiAtRUZBVUxULlxuKyAqL1xuK3N0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbitcdFx0XHRcdHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcbit7XG4rXHRpbnQgYnl0ZXMsIGVycjtcbiBcbi1cdFx0YnVmICs9IGJ5dGVzIC0gMTtcbi1cdFx0Lypcbi1cdFx0ICogQmVjYXVzZSBzdHJzY3B5IGFsd2F5cyBOVUwgdGVybWluYXRlcyB3ZSBuZWVkIHRvXG4tXHRcdCAqIGNvcHkgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgcGFnZSBpZiB3ZSBhcmUgZ29pbmcgdG9cbi1cdFx0ICogbG9hZCBtb3JlIHBhZ2VzXG4tXHRcdCAqL1xuLVx0XHRpZiAoYnl0ZXMgIT0gbGVuKSB7XG4tXHRcdFx0YWRkciArPSBieXRlcyAtIDE7XG4tXHRcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsIGJ1ZiwgbWFkZHIgKyAoUEFHRV9TSVpFIC0gMSksIDEpO1xuLVx0XHRcdGJ1ZiArPSAxO1xuLVx0XHRcdGFkZHIgKz0gMTtcbi1cdFx0fVxuLVx0XHRsZW4gLT0gYnl0ZXM7XG4rXHQqKGNoYXIgKilidWYgPSAnXFwwJztcbiBcbi1cdFx0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4rXHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcbitcdFx0XHQgICAgICAgY29weV92bV9zdHIsIFx1MDAyNmVycik7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdC8qIFRoZSBjb250cmFjdCBndWFyYW50ZWVzIGEgdGVybWluYXRlZCBidWZmZXIgZXZlbiBvbiBlcnJvci4gKi9cbitcdFx0KChjaGFyICopYnVmKVtieXRlc10gPSAnXFwwJztcbitcdFx0cmV0dXJuIGVycjtcbiBcdH1cbiBcbi1vdXQ6XG4tXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbi1cdGlmIChlcnIpXG4tXHRcdHJldHVybiBlcnI7XG4tXHRyZXR1cm4gYnVmIC0gb2xkX2J1ZjtcbitcdHJldHVybiBieXRlcztcbiB9XG4gXG4gLyoqXG5kaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jXG5pbmRleCAxYzc3ZDVkYzA2ZTlmYS4uYjM2ZjJlMjE5YjhmNDkgMTAwNjQ0XG4tLS0gYS9tbS9ybWFwLmNcbisrKyBiL21tL3JtYXAuY1xuQEAgLTI4MzgsNyArMjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdCAqIChub24tZGV2aWNlLWV4Y2x1c2l2ZSkgUFRFIGFuZCBpc3N1ZSBhIE1NVV9OT1RJRllfRVhDTFVTSVZFLlxuIFx0ICovXG4gcmV0cnk6XG4tXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuK1x0cGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkcixcbiBcdFx0XHRcdFx0Rk9MTF9HRVQgfCBGT0xMX1dSSVRFIHwgRk9MTF9TUExJVF9QTUQsXG4gXHRcdFx0XHRcdFx1MDAyNnZtYSk7XG4gXHRpZiAoSVNfRVJSKHBhZ2UpKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IGU2ZGY5NjhmMDk3MWM4Li42YjkxN2E0ZjczZTAwZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTgzLDYgKzgzLDcgQEAgVEVTVF9HRU5fRklMRVMgKz0gbXJlbGVhc2VfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1yZW1hcF9kb250dW5tYXBcbiBURVNUX0dFTl9GSUxFUyArPSBtcmVtYXBfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1zZWFsX3Rlc3RcbitURVNUX0dFTl9GSUxFUyArPSBtdGhwX2d1cF9jb3dfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICs9IG9uLWZhdWx0LWxpbWl0XG4gVEVTVF9HRU5fRklMRVMgKz0gcGFnZW1hcF9pb2N0bFxuIFRFU1RfR0VOX0ZJTEVTICs9IHBmbm1hcFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUyZWUzMjlkODY0MWMwXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jXG5AQCAtMCwwICsxLDIxMyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisvKlxuKyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtXHUwMDNlIGZvbGxvd19wYWdlX21hc2sgLVx1MDAzZVxuKyAqIGZvbGxvd19wdGVfYmF0Y2gpIHJldHVybnMgdGhlIGNvcnJlY3QgcGFnZXMgZm9yIGEgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb1xuKyAqIChtVEhQKSwgaW5jbHVkaW5nIHRoYXQgQ09XIGNvcGllcyBwcm9kdWNlIHRoZSByaWdodCBjb250ZW50LlxuKyAqXG4rICogVXNlcyB0aGUgQ09ORklHX0dVUF9URVNUIFBJTl9MT05HVEVSTSBpbnRlcmZhY2U6IFNUQVJUIHBpbnMgYSByYW5nZSBvbiB0aGVcbisgKiBzbG93IHBhdGgsIFJFQUQgY29waWVzIHRoZSBwaW5uZWQgcGFnZXMnIGJ5dGVzIGJhY2sgc28gd2UgY2FuIGNvbXBhcmUgdGhlbVxuKyAqIGFnYWluc3QgdGhlIHBhdHRlcm4gd2Ugd3JvdGUuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbitcbisjZGVmaW5lIEFSUkFZX1NJWkUoYSlcdChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSlcbitcbisjZGVmaW5lIEdVUF9ERVYgXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwiXG4rXG4rI2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVFx0X0lPVygnZycsIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcbisjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUT1BcdF9JTygnZycsIDgpXG4rI2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEXHRfSU9XKCdnJywgOSwgX191NjQpXG4rI2RlZmluZSBVU0VfV1JJVEVcdDFcbisjZGVmaW5lIFVTRV9GQVNUXHQyXG4rXG4rc3RydWN0IHBpbl9sb25ndGVybV90ZXN0IHtcbitcdF9fdTY0IGFkZHI7XG4rXHRfX3U2NCBzaXplO1xuK1x0X191MzIgZmxhZ3M7XG4rfTtcbitcbisjZGVmaW5lIE9SREVSX0tCXHQ2NFxuKyNkZWZpbmUgTlJfRk9MSU9TXHQxNlxuKyNkZWZpbmUgUkVHSU9OXHRcdCgoc2l6ZV90KU9SREVSX0tCICogMTAyNCAqIE5SX0ZPTElPUylcbitcbitzdGF0aWMgbG9uZyBQUztcbitzdGF0aWMgaW50IGZhaWxzO1xuK3N0YXRpYyBpbnQgdGFwO1xuK1xuK3N0YXRpYyB2b2lkIG9rKGludCBjb25kLCBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdHByaW50ZihcIiVzICVkICVzXFxuXCIsIGNvbmQgPyBcIm9rXCIgOiBcIm5vdCBva1wiLCArK3RhcCwgZGVzYyk7XG4rXHRpZiAoIWNvbmQpXG4rXHRcdGZhaWxzKys7XG4rfVxuK1xuKy8qIERldGVybWluaXN0aWMsIHBlci1wYWdlLWRpc3RpbmN0IHBhdHRlcm4gc28gYW55IG1pcy1vcmRlciBvciBsZWFrIHNob3dzLiAqL1xuK3N0YXRpYyB2b2lkIGZpbGwoY2hhciAqYmFzZSwgc2l6ZV90IHN6LCB1aW50MzJfdCBzYWx0KVxuK3tcbitcdGZvciAoc2l6ZV90IG9mZiA9IDA7IG9mZiBcdTAwM2Mgc3o7IG9mZiArPSBQUykge1xuK1x0XHR1aW50MzJfdCBrID0gb2ZmIC8gUFM7XG4rXHRcdHVpbnQ2NF90IHYgPSAoKHVpbnQ2NF90KXNhbHQgXHUwMDNjXHUwMDNjIDMyKSBeIChrICogMHg5RTM3NzlCMXUgKyAweDEyMzQpO1xuK1xuK1x0XHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgUFM7IGkgKz0gc2l6ZW9mKHYpKVxuK1x0XHRcdG1lbWNweShiYXNlICsgb2ZmICsgaSwgXHUwMDI2diwgc2l6ZW9mKHYpKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCB3c3lzZnMoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqdmFsKVxuK3tcbitcdGludCBmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpbnQgciA9IHdyaXRlKGZkLCB2YWwsIHN0cmxlbih2YWwpKTtcbitcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByIFx1MDAzYyAwID8gLTEgOiAwO1xuK31cbitcbisvKiBGb3JjZSBzdWItUE1EIDY0a0IgbVRIUCBvbmx5LCBzbyBmYXVsdHMgcHJvZHVjZSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcy4gKi9cbitzdGF0aWMgdm9pZCBzZXR1cF9tdGhwKHZvaWQpXG4re1xuK1x0Y29uc3QgY2hhciAqdGhwID0gXCIvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZVwiO1xuK1x0Y2hhciBwWzI1Nl07XG4rXHRzdGF0aWMgY29uc3QgaW50IGtiW10gPSB7IDE2LCAzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDggfTtcbitcbitcdHdzeXNmcyhcIi9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcIiwgXCJuZXZlclwiKTtcbitcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGtiKTsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHAsIHNpemVvZihwKSwgXCIlcy9odWdlcGFnZXMtJWRrQi9lbmFibGVkXCIsIHRocCwga2JbaV0pO1xuK1x0XHR3c3lzZnMocCwga2JbaV0gPT0gT1JERVJfS0IgPyBcImFsd2F5c1wiIDogXCJuZXZlclwiKTtcbitcdH1cbit9XG4rXG4rLyogQ291bnQgaG93IG1hbnkgcGFnZXMgc2l0IGluIGEgY29udGlndW91cyBcdTAwM2U9T1JERVJfS0IgUEZOIHJ1biAodmlhIHBhZ2VtYXApLiAqL1xuK3N0YXRpYyBpbnQgY291bnRfbGFyZ2VfcGFnZXMoY2hhciAqYmFzZSwgc2l6ZV90IHN6KVxuK3tcbitcdGludCBwbSA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0c2l6ZV90IG4gPSBzeiAvIFBTLCBsYXJnZSA9IDA7XG4rXHR1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7XG4rXG4rXHRpZiAocG0gXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGZvciAoc2l6ZV90IGsgPSAwOyBrIFx1MDAzYyBuOyBrKyspIHtcbitcdFx0dWludDY0X3QgZW50O1xuK1x0XHRvZmZfdCBpZHggPSAoKHVpbnRwdHJfdCliYXNlICsgayAqIFBTKSAvIFBTICogc2l6ZW9mKGVudCk7XG4rXG4rXHRcdGlmIChwcmVhZChwbSwgXHUwMDI2ZW50LCBzaXplb2YoZW50KSwgaWR4KSAhPSBzaXplb2YoZW50KSB8fFxuK1x0XHQgICAgIShlbnQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyA2MykpKVxuK1x0XHRcdHBmbltrXSA9IDA7XG4rXHRcdGVsc2VcbitcdFx0XHRwZm5ba10gPSBlbnQgXHUwMDI2ICgoMVVMTCBcdTAwM2NcdTAwM2MgNTUpIC0gMSk7XG4rXHR9XG4rXHRjbG9zZShwbSk7XG4rXHRmb3IgKHNpemVfdCBrID0gMDsgayBcdTAwM2MgbjsgaysrKVxuK1x0XHRpZiAoayArIDEgXHUwMDNjIG4gXHUwMDI2XHUwMDI2IHBmbltrXSBcdTAwMjZcdTAwMjYgcGZuW2sgKyAxXSA9PSBwZm5ba10gKyAxKVxuK1x0XHRcdGxhcmdlKys7XG4rXHRmcmVlKHBmbik7XG4rXHRyZXR1cm4gbGFyZ2U7XG4rfVxuK1xuKy8qIFBpbiBAYmFzZS4uQHN6IG9uIHRoZSBzbG93IHBhdGgsIHJlYWQgdGhlIHBpbm5lZCBieXRlcyBiYWNrLCBjb21wYXJlIHRvIGV4cC4gKi9cbitzdGF0aWMgaW50IHBpbl92ZXJpZnkoaW50IGZkLCBjaGFyICpiYXNlLCBzaXplX3Qgc3osIHVpbnQzMl90IHdyLCBjaGFyICpleHApXG4re1xuK1x0c3RydWN0IHBpbl9sb25ndGVybV90ZXN0IGEgPSB7XG4rXHRcdC5hZGRyID0gKHVpbnRwdHJfdCliYXNlLCAuc2l6ZSA9IHN6LFxuK1x0XHQuZmxhZ3MgPSB3ciA/IFVTRV9XUklURSA6IDAsXHRcdC8qIFVTRV9GQVNUIHVuc2V0ID1cdTAwM2Ugc2xvdyAqL1xuK1x0fTtcbitcdGNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdFx0IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApO1xuK1x0X191NjQgZ2EgPSAodWludHB0cl90KWdvdDtcbitcdGludCByYyA9IC0xO1xuK1xuK1x0aWYgKGdvdCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAoaW9jdGwoZmQsIFBJTl9MT05HVEVSTV9URVNUX1NUQVJULCBcdTAwMjZhKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJTVEFSVCglcykgZmFpbGVkOiAlc1xcblwiLFxuK1x0XHRcdHdyID8gXCJ3cml0ZVwiIDogXCJyZWFkXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9SRUFELCBcdTAwMjZnYSkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiUkVBRCBmYWlsZWQ6ICVzXFxuXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7XG4rXHRyYyA9IG1lbWNtcChnb3QsIGV4cCwgc3opID8gMSA6IDA7XG4rb3V0OlxuK1x0bXVubWFwKGdvdCwgc3opO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdFBTID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0c2V0dXBfbXRocCgpO1xuK1xuK1x0aW50IGZkID0gb3BlbihHVVBfREVWLCBPX1JEV1IpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIm9wZW4gJXM6ICVzIChDT05GSUdfR1VQX1RFU1Q/KVxcblwiLFxuK1x0XHRcdEdVUF9ERVYsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdHJldHVybiAyO1xuK1x0fVxuK1xuK1x0Y2hhciAqciA9IG1tYXAoTlVMTCwgUkVHSU9OLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7XG4rXHRpZiAociA9PSBNQVBfRkFJTEVEKSB7XG4rXHRcdHBlcnJvcihcIm1tYXBcIik7XG4rXHRcdHJldHVybiAyO1xuK1x0fVxuK1x0ZmlsbChyLCBSRUdJT04sIDB4QTEpO1x0XHRcdFx0LyogcGF0dGVybiBQICovXG4rXHRjaGFyICpleHBQID0gbWFsbG9jKFJFR0lPTik7XG4rXG4rXHRtZW1jcHkoZXhwUCwgciwgUkVHSU9OKTtcbitcbitcdGludCBsYXJnZSA9IGNvdW50X2xhcmdlX3BhZ2VzKHIsIFJFR0lPTik7XG4rXG4rXHRwcmludGYoXCIjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcXG5cIixcbitcdCAgICAgICBsYXJnZSwgUkVHSU9OIC8gUFMpO1xuK1x0aWYgKGxhcmdlIFx1MDAzYyAoaW50KShSRUdJT04gLyBQUykgLyA0KVxuK1x0XHRwcmludGYoXCIjIFdBUk46IGxpdHRsZSBtVEhQIGJhY2tpbmc7IGJhdGNoIHBhdGggbGlnaHRseSBjb3ZlcmVkXFxuXCIpO1xuK1xuK1x0LyogQTogcmVhZCBwaW4gb3ZlciB3cml0YWJsZSBtVEhQIC1cdTAwM2UgYmF0Y2hlcyAtXHUwMDNlIGNvbnRlbnQgbXVzdCBlcXVhbCBQLiAqL1xuK1x0b2socGluX3ZlcmlmeShmZCwgciwgUkVHSU9OLCAwLCBleHBQKSA9PSAwLFxuK1x0ICAgXCJzbG93IHJlYWQtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzXCIpO1xuK1xuK1x0LyogQjogd3JpdGUgcGluIC1cdTAwM2UgRk9MTF9XUklURSBiYXRjaCBwYXRoIC1cdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXG4rXHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDEsIGV4cFApID09IDAsXG4rXHQgICBcInNsb3cgd3JpdGUtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzXCIpO1xuK1xuK1x0LyogQzogQ09XIGlzb2xhdGlvbi4gQ2hpbGQgd3JpdGUtcGlucyAodW5zaGFyZXMpIHRoZW4gcmV3cml0ZXM7IHBhcmVudCBQLiAqL1xuK1x0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0aWYgKHBpZCA9PSAwKSB7XG4rXHRcdGludCBjZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7XG4rXHRcdGludCBhID0gcGluX3ZlcmlmeShjZmQsIHIsIFJFR0lPTiwgMSwgZXhwUCk7XHQvKiBDT1cgY29weSA9PSBQICovXG4rXG4rXHRcdGZpbGwociwgUkVHSU9OLCAweEIyKTtcdFx0XHQvKiBjaGlsZCB3cml0ZXMgUSAqL1xuK1x0XHRfZXhpdChhID09IDAgPyAwIDogMSk7XG4rXHR9XG4rXHRpbnQgc3QgPSAwO1xuK1xuK1x0d2FpdHBpZChwaWQsIFx1MDAyNnN0LCAwKTtcbitcdG9rKFdJRkVYSVRFRChzdCkgXHUwMDI2XHUwMDI2IFdFWElUU1RBVFVTKHN0KSA9PSAwLFxuK1x0ICAgXCJjaGlsZCB3cml0ZS1waW4gYWZ0ZXIgQ09XIHJldHVybnMgY29ycmVjdCAoY29waWVkKSBjb250ZW50c1wiKTtcbitcdG9rKG1lbWNtcChyLCBleHBQLCBSRUdJT04pID09IDAsXG4rXHQgICBcInBhcmVudCBjb250ZW50cyBpbnRhY3QgYWZ0ZXIgY2hpbGQgQ09XIHdyaXRlc1wiKTtcbitcdC8qIEQ6IHBhcmVudCByZWFkLXBpbiBhZ2FpbiBhZnRlciB0aGUgQ09XIHNwbGl0IHN0aWxsIGNvcnJlY3QuICovXG4rXHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDAsIGV4cFApID09IDAsXG4rXHQgICBcInBhcmVudCBzbG93IHJlYWQtcGluIGFmdGVyIENPVyBzdGlsbCBjb3JyZWN0XCIpO1xuK1xuK1x0cHJpbnRmKFwiIyB0b3RhbHM6IHBhc3M6JWQgZmFpbDolZFxcblwiLCB0YXAgLSBmYWlscywgZmFpbHMpO1xuK1x0cmV0dXJuIGZhaWxzID8gMSA6IDA7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmNcbmluZGV4IDRmNTUwODIyMzg1YTIwLi42ZmY1ZDEwMjk1MTdlMyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuY1xuQEAgLTMxLDYgKzMxLDcgQEAgc3RhdGljIHNpZ2ptcF9idWYgc2lnam1wX2J1Zl9lbnY7XG4gc3RhdGljIGNoYXIgKmZpbGUgPSBcIi9kZXYvbWVtXCI7XG4gc3RhdGljIG9mZl90IGZpbGVfb2Zmc2V0O1xuIHN0YXRpYyBpbnQgZmQ7XG4rc3RhdGljIGludCB0YXJnZXRfaXNfcmFtO1xuIFxuIHN0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpXG4ge1xuQEAgLTExMyw2ICsxMTQsNyBAQCBzdGF0aWMgdm9pZCBwZm5tYXBfaW5pdCh2b2lkKVxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGtzZnRfZXhpdF9za2lwKFwiQ2Fubm90IGZpbmQgcmFtIHRhcmdldCBpbiAnL3Byb2MvaW9tZW0nOiAlc1xcblwiLFxuIFx0XHRcdFx0ICAgICAgIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0dGFyZ2V0X2lzX3JhbSA9IDE7XG4gXHR9IGVsc2Uge1xuIFx0XHRmaWxlX29mZnNldCA9IDA7XG4gXHR9XG5AQCAtMjcxLDYgKzI3Myw3MCBAQCBURVNUX0YocGZubWFwLCBmb3JrKVxuIFx0QVNTRVJUX0VRKHJldCwgMCk7XG4gfVxuIFxuK1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpXG4re1xuK1x0Y2hhciAqcHJpdiwgKmJ1ZjtcbitcdHNzaXplX3QgcmM7XG4rXHRpbnQgbWVtX2ZkO1xuK1xuK1x0LypcbitcdCAqIEEgQ09XZWQgcGFnZSBpbiBhIFZNX1BGTk1BUCBtYXBwaW5nIGhhcyBhIHN0cnVjdCBwYWdlLCBzbyByZWFkaW5nIGl0XG4rXHQgKiB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtIC0tIF9fYWNjZXNzX3JlbW90ZV92bSgpIC1cdTAwM2UgZ2V0X3VzZXJfcGFnZV92bWEoKVxuK1x0ICogLS0gcmV0dXJucyBpdCBkaXJlY3RseSwgaW5zdGVhZCBvZiByb3V0aW5nIHRvIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCksXG4rXHQgKiB3aGljaCBpb3JlbWFwcyB0aGUgUEZOIGFuZCBjYW5ub3QgcmVhY2ggYSBDT1dlZCBSQU0gcGFnZS5cbitcdCAqXG4rXHQgKiBNYXAgdGhlIGZpbGUgTUFQX1BSSVZBVEUgYW5kIHdyaXRhYmxlLCB3cml0ZSB0byBDT1cgYSBwYWdlIGludG8gYW5vblxuK1x0ICogbWVtb3J5LCB0aGVuIHJlYWQgdGhlIHBhZ2UgYmFjayB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtLlxuK1x0ICovXG4rXHRzZWxmLVx1MDAzZXNpemUyID0gc2VsZi1cdTAwM2VwYWdlc2l6ZTtcbitcdHNlbGYtXHUwMDNlYWRkcjIgPSBtbWFwKE5VTEwsIHNlbGYtXHUwMDNlc2l6ZTIsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdFx0ICAgTUFQX1BSSVZBVEUsIGZkLCBmaWxlX29mZnNldCk7XG4rXHRpZiAoc2VsZi1cdTAwM2VhZGRyMiA9PSBNQVBfRkFJTEVEKVxuK1x0XHRTS0lQKHJldHVybiwgXCJDYW5ub3QgY3JlYXRlIGEgd3JpdGFibGUgcHJpdmF0ZSBwZm5tYXAgbWFwcGluZ1wiKTtcbitcdHByaXYgPSBzZWxmLVx1MDAzZWFkZHIyO1xuK1xuK1x0LyogQ09XIHRoZSBwYWdlIGFuZCBzdGFtcCBrbm93biBieXRlcyBpbnRvIHRoZSBhbm9uIGNvcHkuICovXG4rXHRwcml2WzBdID0gMHg0MjtcbitcdHByaXZbc2VsZi1cdTAwM2VwYWdlc2l6ZSAtIDFdID0gMHgyNDtcbitcbitcdGJ1ZiA9IG1hbGxvYyhzZWxmLVx1MDAzZXBhZ2VzaXplKTtcbitcdEFTU0VSVF9ORShidWYsIE5VTEwpO1xuK1xuK1x0bWVtX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvbWVtXCIsIE9fUkRPTkxZKTtcbitcdEFTU0VSVF9HRShtZW1fZmQsIDApO1xuK1x0cmMgPSBwcmVhZChtZW1fZmQsIGJ1Ziwgc2VsZi1cdTAwM2VwYWdlc2l6ZSwgKG9mZl90KSh1aW50cHRyX3QpcHJpdik7XG4rXHRjbG9zZShtZW1fZmQpO1xuK1xuK1x0QVNTRVJUX0VRKHJjLCAoc3NpemVfdClzZWxmLVx1MDAzZXBhZ2VzaXplKTtcbitcdEVYUEVDVF9FUShidWZbMF0sIDB4NDIpO1xuK1x0RVhQRUNUX0VRKGJ1ZltzZWxmLVx1MDAzZXBhZ2VzaXplIC0gMV0sIDB4MjQpO1xuK1xuK1x0ZnJlZShidWYpO1xuK31cbitcbitURVNUX0YocGZubWFwLCBwcm9jbWVtX3Bmbl9yZWFkKVxuK3tcbitcdGNoYXIgYnVmWzY0XTtcbitcdHNzaXplX3QgcmM7XG4rXHRpbnQgbWVtX2ZkO1xuK1xuK1x0LypcbitcdCAqIEEgcmF3IFBGTiBvZiBhIFZNX0lPL1ZNX1BGTk1BUCBtYXBwaW5nIGhhcyBubyBzdHJ1Y3QgcGFnZSwgc29cbitcdCAqIF9fYWNjZXNzX3JlbW90ZV92bSgpIHJlYWNoZXMgaXQgdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpXG4rXHQgKiAoZ2VuZXJpY19hY2Nlc3NfcGh5cygpKS4gVGhhdCBpb3JlbWFwcyB0aGUgUEZOLCB3aGljaCBpcyByZWplY3RlZCBmb3JcbitcdCAqIFJBTSwgc28gdGhpcyBvbmx5IGFwcGxpZXMgdG8gZ2VudWluZSBkZXZpY2UgbWVtb3J5LlxuK1x0ICovXG4rXHRpZiAodGFyZ2V0X2lzX3JhbSlcbitcdFx0U0tJUChyZXR1cm4sIFwiVGFyZ2V0IGlzIFN5c3RlbSBSQU07IC1cdTAwM2VhY2Nlc3MoKSBjYW5ub3QgaW9yZW1hcCBSQU1cIik7XG4rXG4rXHRtZW1fZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9tZW1cIiwgT19SRE9OTFkpO1xuK1x0QVNTRVJUX0dFKG1lbV9mZCwgMCk7XG4rXHRyYyA9IHByZWFkKG1lbV9mZCwgYnVmLCBzaXplb2YoYnVmKSwgKG9mZl90KSh1aW50cHRyX3Qpc2VsZi1cdTAwM2VhZGRyMSk7XG4rXHRjbG9zZShtZW1fZmQpO1xuK1xuK1x0QVNTRVJUX0VRKHJjLCAoc3NpemVfdClzaXplb2YoYnVmKSk7XG4rfVxuK1xuIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRmb3IgKGludCBpID0gMTsgaSBcdTAwM2MgYXJnYzsgaSsrKSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggOGMyOTZkZWRmMDQ3NGQuLmI0OWEzZWIwYzIwNTA4IDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG5AQCAtMjg5LDYgKzI4OSw3IEBAIGZpXG4gIyBEdW1wIHBhZ2VzIDAsIDE5LCBhbmQgNDA5NiwgdXNpbmcgcGluX3VzZXJfcGFnZXM6XG4gQ0FURUdPUlk9XCJndXBfdGVzdFwiIHJ1bl90ZXN0IC4vZ3VwX3Rlc3QgLWN0IC1GIDB4MSAwIDE5IDB4MTAwMFxuIENBVEVHT1JZPVwiZ3VwX3Rlc3RcIiBydW5fdGVzdCAuL2d1cF9sb25ndGVybVxuK0NBVEVHT1JZPVwiZ3VwX3Rlc3RcIiBydW5fdGVzdCAuL210aHBfZ3VwX2Nvd190ZXN0XG4gXG4gQ0FURUdPUlk9XCJ1c2VyZmF1bHRmZFwiIHJ1bl90ZXN0IC4vdWZmZC11bml0LXRlc3RzXG4gdWZmZF9zdHJlc3NfYmluPS4vdWZmZC1zdHJlc3NcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjExLjY5NDc3NzY0N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExNjAyNjIwNDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEdVUCBhbmQgUmVtb3RlIFZNIEFjY2VzcyBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHNlcmllcyB0aGF0J3Mgb3ZlcmhhdWxpbmcgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCBoaXR0aW5nIGBtbS9ndXAuY2AsIGBtbS9tZW1vcnkuY2AsIGFuZCBzb21lIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIGxpa2UgYXJtNjQsIHJpc2N2LCBhbmQgeDg2LiBUaGUgY29yZSBvZiBpdCBzZWVtcyB0byBiZSBhYm91dCByZWZpbmluZyB0aGUgbWVjaGFuaXNtcyBmb3IgR1VQIChHZXQgVXNlciBQYWdlKSBhbmQgcmVtb3RlIFZNIGFjY2Vzcy5cblxuVGhlIG1haW4gZ2lzdCBpcyB0aGUgaW50cm9kdWN0aW9uIG9mIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV92bWFgLCBhbmQgYSBuZXcgYHJlbW90ZV92bV93YWxrYCBtZWNoYW5pc20sIHdoaWNoIHdpbGwgbGlrZWx5IGFmZmVjdCB0aGUgZWZmaWNpZW5jeSBvZiB0aGVzZSBvcGVyYXRpb25zLiBXZSBzZWUgYHJlbW90ZV92bV93YWxrYCBiZWluZyB1c2VkIGJ5IGBfX2FjY2Vzc19yZW1vdGVfdm1gIGFuZCBgX19jb3B5X3JlbW90ZV92bV9zdHJgIHRvIG1ha2UgYSBtb3JlIHN0cnVjdHVyZWQgd2F5IHRvIGFjY2VzcyBhbmQgY29weSBkYXRhIGJldHdlZW4gVk1zLiAgVGhleSd2ZSBhbHNvIGJlZWZlZCB1cCB0aGUgYmF0Y2hpbmcgZm9yIGNvbnRpZ3VvdXMgcGFnZXMgaW4gYGZvbGxvd19wYWdlX21hc2tgIGFuZCBgZm9sbG93X3BhZ2VfcHRlYCwgaW1wb3J0YW50IGZvciB0aG9zZSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkuXG5cbkRpdmluZyBpbnRvIGBtbS9ndXAuY2AsIHRoZSBuZXcgYGZvbGxvd19wdGVfYmF0Y2hgIGlzIGEgd2VsY29tZSBhZGRpdGlvbiwgYW5kIHRoZSB1cGRhdGVzIHRvIHRoZSBgZm9sbG93X2h1Z2VfKmAgZnVuY3Rpb25zIHN1Z2dlc3QgYSBmb2N1cyBvbiBtVEhQIHN1cHBvcnQsIG1ha2luZyB0aGVtIHJldHVybiBgbnJfcGFnZXNgLiBJIHNlZSB0aGF0IGBmYXVsdGluX3BhZ2VgIGlzIGdldHRpbmcgYSBiaXQgb2YgbG92ZSB0b28sIGhhbmRsaW5nIGBGT0xMX1ZNQV9MT0NLYC4gIGBnZXRfdXNlcl9wYWdlX3ZtYWAgc291bmRzIGxpa2UgYSBuaWNlIGFic3RyYWN0aW9uIGZvciBnZXR0aW5nIGEgcGFnZSBmcm9tIGEgVk1BLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbnQgbG9ja2luZyBzY2hlbWVzLiBBbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgaXMgdGhlIHJlcGxhY2VtZW50IGZvciBgZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlYCwgd2hpY2ggaXMgYSBrZXkgY2hhbmdlIHRvIHRyYWNrLlxuXG5Ob3csIG92ZXIgaW4gYG1tL21lbW9yeS5jYCwgdGhlIGFkZGl0aW9uIG9mIGBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHNgLCBgcmVtb3RlX2FjY2Vzc19sb2NrYCBhbmQgYHJlbW90ZV9hY2Nlc3NfdW5sb2NrYCBsb29rIGxpa2UgdGhleSdyZSBzb2xpZGlmeWluZyB0aGUgcmVtb3RlIFZNIGFjY2VzcyBpbmZyYXN0cnVjdHVyZS4gVGhlIHJlYWwgd29ya2hvcnNlIGhlcmUgaXMgYHJlbW90ZV92bV93YWxrYCwgd2hpY2ggaXMgbm93IHRoZSBjb3JlIG1lY2hhbmlzbSB1c2VkIGJ5IGBfX2FjY2Vzc19yZW1vdGVfdm1gIChhbG9uZyB3aXRoIGBhY2Nlc3Nfdm1fcGFnZWApIGFuZCBgX19jb3B5X3JlbW90ZV92bV9zdHJgICh3aXRoIGBjb3B5X3ZtX3N0cmApIHRvIG1ha2UgdGhlIG9wZXJhdGlvbnMgbXVjaCBtb3JlIHN0cnVjdHVyZWQuXG5cblRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgc2hpZnQgaW4gaG93IHdlIGhhbmRsZSBHVVAgYW5kIHJlbW90ZSBhY2Nlc3MuIFRoaXMgbmVlZHMgc29tZSBzZXJpb3VzIGZ1enppbmcgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcm9jayBzb2xpZC4gSSdtIGdvaW5nIHRvIGtlZXAgYW4gZXllIG9uIHRoZXNlIHN5bWJvbHM6IGBnZXRfdXNlcl9wYWdlX3ZtYWAsIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgLCBgcmVtb3RlX3ZtX3dhbGtgLCBgYWNjZXNzX3ZtX3BhZ2VgLCBgY29weV92bV9zdHJgLCBgZm9sbG93X3B0ZV9iYXRjaGAsIGBmYXVsdGluX3BhZ2VgLCBgX19hY2Nlc3NfcmVtb3RlX3ZtYCwgYW5kIGBfX2NvcHlfcmVtb3RlX3ZtX3N0cmAuXG5cbkxldCdzIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbmZpZ3Mgd2UgbmVlZCB0byBrZWVwIGluIG1pbmQuIFNpbmNlIGl0J3MgdG91Y2hpbmcgYG1tL2d1cC5jYCBhbmQgYG1tL21lbW9yeS5jYCwgdGhhdCBtZWFucyB3ZSdyZSBpbiBjb3JlIE1NIHRlcnJpdG9yeS4gSSBzZWUgYENPTkZJR19QRVJfVk1BX0xPQ0tgIGlzIG1lbnRpb25lZCBpbiBgcmVtb3RlX2FjY2Vzc19sb2NrYCwgYW5kIGBDT05GSUdfTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgaXMgYW5vdGhlciBvbmUgdG8gY29uc2lkZXIuIEFuZCBvZiBjb3Vyc2UsIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGRlZmluaXRlbHkgcmVsZXZhbnQgZ2l2ZW4gdGhlIGNoYW5nZXMgdG8gbVRIUCBhbmQgdGhlIGBmb2xsb3dfaHVnZV8qYCBmdW5jdGlvbnMuXG5cbkkgdGhpbmsgSSdsbCBlbmFibGUgYENPTkZJR19QRVJfVk1BX0xPQ0tgIGFuZCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBkdXJpbmcgdGVzdGluZywganVzdCB0byBjb3ZlciBhbGwgYmFzZXMuIEknbGwgc2VhcmNoIGZvciBgcmVtb3RlX3ZtX3dhbGtgIGluIGBtbS9tZW1vcnkuY2AgdG8gc2VlIGlmIGl0J3MgdW5kZXIgYW55IHNwZWNpZmljIGNvbmZpZywgYnV0IGl0IGxvb2tzIGxpa2UgaXQncyBpbiB0aGUgbWFpbiBib2R5LlxuXG5UaW1lIHRvIHBlZWsgaW50byB0aGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN0dWZmLiBMb29rcyBsaWtlIGBDT05GSUdfUklTQ1ZfSVNBX1NVUE1gIGlzIHJlbGV2YW50IGZvciBSSVNDLVYgYW5kIGBDT05GSUdfQUREUkVTU19NQVNLSU5HYCBmb3IgeDg2LlxuXG5BbHJpZ2h0LCBJJ2xsIG5lZWQgdG8gcnVuIHRoaXMgdGhyb3VnaCBzb21lIHZlcmlmaWNhdGlvbiB0b29scyB0byBiZSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzc3NywiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg2MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjIzLjI5NzQwNDU4NVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTQ1MzQ0MDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJlbW90ZV92bV93YWxrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTcxMDE9dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5tbS9tZW1vcnkuYy03MTE0LSAqL1xcbm1tL21lbW9yeS5jOjcxMTU6c3RhdGljIGludCByZW1vdGVfdm1fd2FsayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsXFxubW0vbWVtb3J5LmMtNzExNi1cXHRcXHRcXHQgIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIGJvb2wgY2FuX2V4cGFuZF9zdGFjayxcXG4tLVxcbm1tL21lbW9yeS5jPTcyNDc9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcyNTEtXFxubW0vbWVtb3J5LmM6NzI1MjpcXHRyZXR1cm4gcmVtb3RlX3ZtX3dhbGsobW0sIGFkZHIsIGJ1ZiwgbGVuLCBndXBfZmxhZ3MsIHRydWUsXFxubW0vbWVtb3J5LmMtNzI1My1cXHRcXHRcXHQgICAgICBhY2Nlc3Nfdm1fcGFnZSwgXFx1MDAyNmVycik7XFxuLS1cXG5tbS9tZW1vcnkuYz03MzQ0PXN0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTczNTAtXFxubW0vbWVtb3J5LmM6NzM1MTpcXHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcXG5tbS9tZW1vcnkuYy03MzUyLVxcdFxcdFxcdCAgICAgICBjb3B5X3ZtX3N0ciwgXFx1MDAyNmVycik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjI1LjQ0Mjc1NzAwMloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4NDY5NDUwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIGNvbnNpZGVyYXRpb25zLCBmcm9tIG15IHBlcnNwZWN0aXZlIGFzIHNvbWVvbmUgZGVlcGx5IGZhbWlsaWFyIHdpdGgga2VybmVsIGludGVybmFsczpcblxuKipQcmlvcml0aXppbmcgRnV6emluZyBUYXJnZXRzIGluIHRoZSBWTSBTdWJzeXN0ZW0qKlxuXG5BbHJpZ2h0LCBsb29raW5nIGF0IHRoZSBsYW5kc2NhcGUsIGl0J3MgY2xlYXIgdGhhdCBgcmVtb3RlX3ZtX3dhbGtgLCBgZ2V0X3VzZXJfcGFnZV92bWFgLCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCwgYW5kIGBmb2xsb3dfcHRlX2JhdGNoYCBhcmUgdGhlIHJlYWwgcHJlc3N1cmUgcG9pbnRzIGluIHRoZSB2aXJ0dWFsIG1lbW9yeSBzdWJzeXN0ZW0uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYWJzb2x1dGVseSBjcml0aWNhbCwgc2VydmluZyBhcyB0aGUgZ2F0ZXdheXMgZm9yIHVzZXItc3BhY2UgaW50ZXJhY3Rpb25zIGFuZCBwYWdlIHRhYmxlIHRyYXZlcnNhbC4gVGhleSdyZSB0aGUga2luZCBvZiBmdW5jdGlvbnMgdGhhdCwgaWYgdGhleSBoYXZlIHZ1bG5lcmFiaWxpdGllcywgY291bGQgbGVhZCB0byB3aWRlc3ByZWFkIGFuZCBkZXZhc3RhdGluZyBjb25zZXF1ZW5jZXMuIFRoZXJlZm9yZSwgdGhlc2UgYXJlICphYnNvbHV0ZWx5KiB0aGUgZnVuY3Rpb25zIHRoYXQgSSB3YW50IHRvIHN1YmplY3QgdG8gaW50ZW5zZSBmdXp6aW5nIGVmZm9ydHMuIFRoZXkncmUgdGhlIGxvdy1oYW5naW5nIGZydWl0IHdoZXJlIHRoZSByZXdhcmQgaXMgaGlnaCwgYW5kIGJ1Z3MgaGF2ZSB0aGUgcG90ZW50aWFsIGZvciBkcmFtYXRpYyBpbXBhY3QuXG5cbkFuZCBzaW5jZSB3ZSBhcmUgdGFsa2luZyBhYm91dCBWTSBhbmQgbWVtb3J5LW1hbmFnZW1lbnQsIEkgc2hvdWxkIGFsc28gY2hlY2sgdGhvc2Ugb2JzY3VyZSBjb25maWd1cmF0aW9uczogYENPTkZJR19QRVJfVk1BX0xPQ0tgIGFuZCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSBhbSBzdXJlIHRoZXknbGwgYWRkIGNvbXBsZXhpdHkgdG8gdGhlIGZ1bmN0aW9ucyBJIG1lbnRpb25lZCBhYm92ZSBhbmQgYXJlIGNyaXRpY2FsIHBvaW50cyBmb3Igc2VjdXJpdHkuIFdlIG1heSBuZWVkIHRvIGFkZCBhZGRpdGlvbmFsIGZ1enppbmcgdmVjdG9ycyB0byB0YXJnZXQgdGhlc2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgYW5kIGZpbmQgbW9yZSBidWdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTkyNCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjI5LjI4OTcwNjc3N1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NjgzMjcyOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiUEVSX1ZNQV9MT0NLXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz0xNDMzPWNvbmZpZyBMUlVfR0VOX1dBTEtTX01NVVxcbi0tXFxubW0vS2NvbmZpZy0xNDM3LVxcbm1tL0tjb25maWc6MTQzODpjb25maWcgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0MzktICAgICAgIGRlZl9ib29sIG5cXG5tbS9LY29uZmlnLTE0NDAtXFxubW0vS2NvbmZpZzoxNDQxOmNvbmZpZyBQRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0NDItXFx0ZGVmX2Jvb2wgeVxcbm1tL0tjb25maWc6MTQ0MzpcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUEVSX1ZNQV9MT0NLIFxcdTAwMjZcXHUwMDI2IE1NVSBcXHUwMDI2XFx1MDAyNiBTTVBcXG5tbS9LY29uZmlnLTE0NDQtXFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzoyOS45NTgwNTE4OTdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzk2MTU5OTg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqQ2hlY2tpbmcgdGhlIFZNQSBMb2NraW5nIENvbmZpZ3VyYXRpb24qKlxuXG5BbHJpZ2h0LCBzbyB0aGUgc3lzdGVtIEknbSB3b3JraW5nIHdpdGggaXMgbGlrZWx5IGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBsZXZlcmFnZSBgUEVSX1ZNQV9MT0NLYCwgYnV0IG9ubHkgaWYgdGhlIGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBpdCwgd2hpY2ggbWFrZXMgcGVyZmVjdCBzZW5zZS4gVGhlIGNvZGUncyBhbHJlYWR5IGhhbmRsaW5nIHRoZSBjb25kaXRpb25hbCBlbmFibGluZyBiYXNlZCBvbiBgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tgLCBzbyB0aGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBOb3csIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaW50ZXJhY3RzIHdpdGggdGhlIG92ZXJhbGwgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3ksIEkgbmVlZCB0byBjb25zaWRlciB0cmFuc3BhcmVudCBodWdlcGFnZXMuIExldCBtZSBqdXN0IHF1aWNrbHkgY2hlY2sgaG93IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHNldC4gVGhhdCdsbCBnaXZlIG1lIGEgY2xlYXJlciBwaWN0dXJlIG9mIHBvdGVudGlhbCBsb2NrIGNvbnRlbnRpb24gYW5kIGhvdyB0aGVzZSBWTUEgbG9ja3MgYXJlIGludGVyYWN0aW5nIHdpdGggdGhlIGh1Z2VwYWdlIGFsbG9jYXRpb25zLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhlc2UgdHdvIGNvbmZpZ3MgYWZmZWN0IGVhY2ggb3RoZXIgc28gSSBjYW4gb3B0aW1pemUgdGhlIG1lbW9yeSBzZXR1cCBmb3IgdGhpcyB3b3JrbG9hZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY0NzQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzozMy4zNTQyMTYyMzRaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ1Mjg4MTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04Mjc9Y29uZmlnIFBFUlNJU1RFTlRfSFVHRV9aRVJPX0ZPTElPXFxubW0vS2NvbmZpZy04MjgtXFx0Ym9vbCBcXFwiQWxsb2NhdGUgYSBQTUQgc2l6ZWQgZm9saW8gZm9yIHplcm9pbmdcXFwiXFxubW0vS2NvbmZpZzo4Mjk6XFx0ZGVwZW5kcyBvbiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODMwLVxcdGhlbHBcXG4tLVxcbm1tL0tjb25maWc9ODQzPWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04NDUtXFxubW0vS2NvbmZpZzo4NDY6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODQ3LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxubW0vS2NvbmZpZzo4NDg6XFx0ZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UgXFx1MDAyNlxcdTAwMjYgIVBSRUVNUFRfUlRcXG5tbS9LY29uZmlnLTg0OS1cXHRzZWxlY3QgQ09NUEFDVElPTlxcbi0tXFxubW0vS2NvbmZpZy04NjEtXFxubW0vS2NvbmZpZzo4NjI6aWYgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTg2My1cXG5tbS9LY29uZmlnPTg2ND1jaG9pY2VcXG5tbS9LY29uZmlnLTg2NS1cXHRwcm9tcHQgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQgc3lzZnMgZGVmYXVsdHNcXFwiXFxubW0vS2NvbmZpZzo4NjY6XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2Ny1cXHRoZWxwXFxuLS1cXG5tbS9LY29uZmlnLTg2OS1cXG5tbS9LY29uZmlnOjg3MDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NzEtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzYtXFxubW0vS2NvbmZpZzo4Nzc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg3OC1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04ODUtXFxubW0vS2NvbmZpZzo4ODY6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04ODctXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg5Mz1jaG9pY2VcXG5tbS9LY29uZmlnLTg5NC1cXHRwcm9tcHQgXFxcIlNobWVtIGh1Z2VwYWdlIGFsbG9jYXRpb24gZGVmYXVsdHNcXFwiXFxubW0vS2NvbmZpZzo4OTU6XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTYtXFx0aGVscFxcbi0tXFxubW0vS2NvbmZpZy05MDItXFxubW0vS2NvbmZpZzo5MDM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTkwNC1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTEyLVxcbm1tL0tjb25maWc6OTEzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTE0LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTIwLVxcbm1tL0tjb25maWc6OTIxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MjItXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkyOC1cXG5tbS9LY29uZmlnOjkyOTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkzMC1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkzOD1jaG9pY2VcXG5tbS9LY29uZmlnLTkzOS1cXHRwcm9tcHQgXFxcIlRtcGZzIGh1Z2VwYWdlIGFsbG9jYXRpb24gZGVmYXVsdHNcXFwiXFxubW0vS2NvbmZpZzo5NDA6XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05NDEtXFx0aGVscFxcbi0tXFxubW0vS2NvbmZpZy05NDctXFxubW0vS2NvbmZpZzo5NDg6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTk0OS1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTU2LVxcbm1tL0tjb25maWc6OTU3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTU4LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTY0LVxcbm1tL0tjb25maWc6OTY1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NjYtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk3Mi1cXG5tbS9LY29uZmlnOjk3MzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk3NC1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTk5Mj1jb25maWcgTk9fUEFHRV9NQVBDT1VOVFxcbi0tXFxubW0vS2NvbmZpZy0xMDA0LVxcbm1tL0tjb25maWc6MTAwNTplbmRpZiAjIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy0xMDA2LVxcbi0tXFxubW0vS2NvbmZpZz0xMDE0PWNvbmZpZyBQR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xcbm1tL0tjb25maWc6MTAxNTpcXHRkZWZfYm9vbCBUUkFOU1BBUkVOVF9IVUdFUEFHRSB8fCBIVUdFVExCX1BBR0VcXG5tbS9LY29uZmlnLTEwMTYtXFxuLS1cXG5tbS9LY29uZmlnPTEwMjA9Y29uZmlnIEhBVkVfR0lHQU5USUNfRk9MSU9TXFxubW0vS2NvbmZpZy0xMDIxLVxcdGRlZl9ib29sIChIVUdFVExCX1BBR0UgXFx1MDAyNlxcdTAwMjYgQVJDSF9IQVNfR0lHQU5USUNfUEFHRSkgfHwgXFxcXFxcbm1tL0tjb25maWc6MTAyMjpcXHRcXHQgKFpPTkVfREVWSUNFIFxcdTAwMjZcXHUwMDI2IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRV9QVUQpXFxubW0vS2NvbmZpZy0xMDIzLVxcbi0tXFxubW0vS2NvbmZpZz0xMDI4PWNvbmZpZyBBUkNIX1NVUFBPUlRTX0hVR0VfUEZOTUFQXFxubW0vS2NvbmZpZy0xMDI5LVxcdGRlZl9ib29sIG5cXG5tbS9LY29uZmlnOjEwMzA6XFx0ZGVwZW5kcyBvbiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctMTAzMS1cXG5tbS9LY29uZmlnPTEwMzI9Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUE1EX1BGTk1BUFxcbm1tL0tjb25maWctMTAzMy1cXHRkZWZfYm9vbCB5XFxubW0vS2NvbmZpZzoxMDM0OlxcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19IVUdFX1BGTk1BUCBcXHUwMDI2XFx1MDAyNiBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTEwMzUtXFxubW0vS2NvbmZpZz0xMDM2PWNvbmZpZyBBUkNIX1NVUFBPUlRTX1BVRF9QRk5NQVBcXG5tbS9LY29uZmlnLTEwMzctXFx0ZGVmX2Jvb2wgeVxcbm1tL0tjb25maWc6MTAzODpcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfSFVHRV9QRk5NQVAgXFx1MDAyNlxcdTAwMjYgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BVRFxcbm1tL0tjb25maWctMTAzOS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDc6MzMuNTk5NTEzODUxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUxMzk5MTcxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgS2VybmVsIENvbmZpZ3VyYXRpb25zIGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgY29uZmlnOyB0aGF0IHNlZW1zIGxpa2UgYSBzb2xpZCBhZGRpdGlvbiwgZ2VuZXJhbGx5IHNwZWFraW5nLiBJJ20gYWxzbyBzZWVpbmcgcmVmZXJlbmNlcyB0byBgR1VQX1RFU1RgIGluIHRoZSBzZWxmdGVzdCBwcm9jZWR1cmUsIGJ1dCB0aGUgYWN0dWFsLCBjb3JlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWxhdGVkIGxvZ2ljIHNlZW1zIHRvIGJlIHJlc2lkaW5nIHdpdGhpbiBgbW0vZ3VwLmNgIGFuZCBgbW0vbWVtb3J5LmNgLiBJJ2xsIHdhbnQgdG8gcXVpY2tseSB2ZXJpZnkgaWYgdGhlIGBHVVBfVEVTVGAgZGVmaW5lIGlzIGFjdHVhbGx5ICpyZXF1aXJlZCogZm9yIHRoZSBmdW5jdGlvbmFsaXR5IGluIHRob3NlIGNvcmUgZmlsZXMsIG9yIGlmIGl0J3Mgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIHNlbGYtdGVzdCBwcm9jZWR1cmVzLiBIbW0sIGl0IGxvb2tzIGxpa2UgaXQgaXMganVzdCBmb3IgdGhlIHNlbGZ0ZXN0LlxuXG5Ob3csIGxldCdzIHR1cm4gbXkgYXR0ZW50aW9uIHRvIGBDT05GSUdfUklTQ1ZfSVNBX1NVUE1gLi4uIEknbGwgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGF0IG5leHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MjcxLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjM3LjExMzUxMTI4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2ODM1Mjc4MTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiUklTQ1ZfSVNBX1NVUE1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYXJjaC9yaXNjdi9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvcmlzY3YvS2NvbmZpZz01NTM9Y29uZmlnIFJJU0NWX0lTQV9DXFxuLS1cXG5hcmNoL3Jpc2N2L0tjb25maWctNTYzLVxcbmFyY2gvcmlzY3YvS2NvbmZpZzo1NjQ6Y29uZmlnIFJJU0NWX0lTQV9TVVBNXFxuYXJjaC9yaXNjdi9LY29uZmlnLTU2NS1cXHRib29sIFxcXCJTdXBtIGV4dGVuc2lvbiBmb3IgdXNlcnNwYWNlIHBvaW50ZXIgbWFza2luZ1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDc6MzcuNzk3MDUzNjcxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM3ODIzMTI1NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqTmF2aWdhdGluZyBQcm9jZXNzb3IgQXJjaGl0ZWN0dXJlcyoqXG5cblJpZ2h0LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIFJJU0MtViBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIChJU0EpIGhlcmUuIFNwZWNpZmljYWxseSwgYFJJU0NWX0lTQV9TVVBNYOKAlHRoYXQncyBhIHByZXR0eSBjbGVhciBpbmRpY2F0b3Igd2UncmUgZGVhbGluZyB3aXRoIFJJU0MtViwgYW5kIHByb2JhYmx5IHNvbWV0aGluZyB0byBkbyB3aXRoIHN1cGVydmlzb3IgbW9kZSBvciBzb21lIHJlbGF0ZWQgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiBzZXQgZXh0ZW5zaW9uLiBJJ2xsIG5lZWQgdG8gZGlnIGRlZXBlciBvbiB0aGF0IGlmIGl0IGNvbWVzIHVwLlxuXG5CdXQgbm93LCBJJ20gc3dpdGNoaW5nIGdlYXJzIGFuZCBteSBtaW5kIGlzIGF1dG9tYXRpY2FsbHkgZ29pbmcgdG8gdGhlIHg4NiBhcmNoaXRlY3R1cmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBOb3csIGEgY3JpdGljYWwgcG9pbnQgZm9yIHg4NiBpcyBgQ09ORklHX0FERFJFU1NfTUFTS0lOR2AuIFRoaXMgc3VnZ2VzdHMgc29tZXRoaW5nIGFib3V0IGhvdyBtZW1vcnkgYWRkcmVzc2VzIGFyZSBoYW5kbGVkLCBwb3RlbnRpYWxseSByZWxhdGVkIHRvIFBBRSAoUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24pLCBvciBwZXJoYXBzIGEgbW9yZSBmaW5lLWdyYWluZWQgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50IHNjaGVtZS4gSSdsbCBjaGVjayB0aGF0IHZhcmlhYmxlLCBhbmQgc2VlIGV4YWN0bHkgd2hpY2ggY29uZmlndXJhdGlvbiBmbGFncyBhcmUgaW4gdXNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODY3NSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjQxLjU3OTM3MjAwM1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk5NzEwNjQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkFERFJFU1NfTUFTS0lOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL3g4Ni9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gveDg2L0tjb25maWc9MjEzNT1jb25maWcgUkFORE9NSVpFX01FTU9SWV9QSFlTSUNBTF9QQURESU5HXFxuLS1cXG5hcmNoL3g4Ni9LY29uZmlnLTIxNDktXFxuYXJjaC94ODYvS2NvbmZpZzoyMTUwOmNvbmZpZyBBRERSRVNTX01BU0tJTkdcXG5hcmNoL3g4Ni9LY29uZmlnLTIxNTEtXFx0Ym9vbCBcXFwiTGluZWFyIEFkZHJlc3MgTWFza2luZyBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzo0MS43NzkwOTA1OTdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Njk3NDEyMTUyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBpbXBsZW1lbnRpbmcgYEFERFJFU1NfTUFTS0lOR2AgZm9yIHg4NiDigJMgZ290IGl0LiBJdCdzIHRvdWNoaW5nIGBtbS9ndXAuY2AgYW5kIGBtbS9tZW1vcnkuY2AsIHdoaWNoIGFyZSBjcml0aWNhbCBrZXJuZWwgZmlsZXMsIHNvIHRoYXQgaW1tZWRpYXRlbHkgZmxhZ3MgaXQgYXMgaW50ZXJlc3RpbmcuIEkgc2VlIGEgd2hvbGUgc2xldyBvZiBuZXcgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gdGhpcyBwYXRjaDogYGdldF91c2VyX3BhZ2Vfdm1hYCwgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAsIGByZW1vdGVfdm1fd2Fsa2AsIGBhY2Nlc3Nfdm1fcGFnZWAsIGBjb3B5X3ZtX3N0cmAsIGFuZCBgZm9sbG93X3B0ZV9iYXRjaGAuIFRoZXNlIGFyZSBzY3JlYW1pbmcgZm9yIGZ1enppbmcsIG5vIGRvdWJ0LlxuXG5MZXQncyBtYWtlIGEgbGlzdCBvZiB0aGUga2V5IHN5bWJvbHMgdG8gZm9jdXMgb24uIE9rYXksIHNvIHdlJ3ZlIGdvdCB0aGUgb3JpZ2luYWwgbGlzdCwgYnV0IG5vdyB3ZSBzaG91bGQgYWxzbyBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9uczpcbi0gYGZhdWx0aW5fcGFnZWBcbi0gYF9fYWNjZXNzX3JlbW90ZV92bWBcbi0gYF9fY29weV9yZW1vdGVfdm1fc3RyYFxuXG5Ob3csIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGNsZWFyOiBwcmlvcml0aXplIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIGVudHJ5IHBvaW50cy4gU28sIGxldCdzIHNlZSBpZiB0aG9zZSBuZXcgZnVuY3Rpb25zIGFyZSBzdGF0aWMgYmVjYXVzZSBzdGF0aWMgaGVscGVycyBhcmUgb2Z0ZW4gaW5saW5lZCBhbmQgZG9uJ3Qgb2ZmZXIgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBmb3IgZnV6emluZy4gRGFtbiwgbG9va3MgbGlrZSB0aGV5IGFyZSBhbGwgc3RhdGljIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBmb3IgZnV6emluZyFcblxuT2theSwgbGV0J3MgZGlnIGludG8gdGhlIG5vbi1zdGF0aWMgZW50cnkgcG9pbnRzIGluIGBtbS9tZW1vcnkuY2AuIEkgc2VlIGBhY2Nlc3NfcmVtb3RlX3ZtYCBhbmQgYGFjY2Vzc19wcm9jZXNzX3ZtYCAoYm90aCBgRVhQT1JUX1NZTUJPTF9HUExgKS4gIEFuZCB0aGVuIGBjb3B5X2Zyb21fdXNlcl9wYWdlYCBhbmQgYGNvcHlfdG9fdXNlcl9wYWdlYCB0aGF0IHdlcmVuJ3QgY2hhbmdlZC4gR29vZC4gV2FpdCwgaXQgbG9va3MgbGlrZSBgX19hY2Nlc3NfcmVtb3RlX3ZtYCBpcyBjYWxsZWQgYnkgYGFjY2Vzc19yZW1vdGVfdm1gIGFuZCBgYWNjZXNzX3Byb2Nlc3Nfdm1gLiBMb29rcyBsaWtlIGBfX2NvcHlfcmVtb3RlX3ZtX3N0cmAgaXMgY2FsbGVkIGJ5IGBjb3B5X3JlbW90ZV92bV9zdHJgLiBJcyB0aGlzIGV4cG9ydGVkPyBJIHNob3VsZCBjaGVjayB0aGlzLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDQ4LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjQ4Ljc1MzIxODM1NloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwNjg0OTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcHlfcmVtb3RlX3ZtX3N0clwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnkuYz03MzA0PXN0YXRpYyBpbnQgY29weV92bV9zdHIoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxcbi0tXFxubW0vbWVtb3J5LmMtNzM0My0gKi9cXG5tbS9tZW1vcnkuYzo3MzQ0OnN0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5tbS9tZW1vcnkuYy03MzQ1LVxcdFxcdFxcdFxcdHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL21lbW9yeS5jLTczNjItLyoqXFxubW0vbWVtb3J5LmM6NzM2MzogKiBjb3B5X3JlbW90ZV92bV9zdHIgLSBjb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZS5cXG5tbS9tZW1vcnkuYy03MzY0LSAqIEB0c2s6XFx0dGhlIHRhc2sgb2YgdGhlIHRhcmdldCBhZGRyZXNzIHNwYWNlXFxuLS1cXG5tbS9tZW1vcnkuYy03Mzc1LSAqL1xcbm1tL21lbW9yeS5jOjczNzY6aW50IGNvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTczNzctXFx0XFx0ICAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL21lbW9yeS5jLTczOTAtXFxubW0vbWVtb3J5LmM6NzM5MTpcXHRyZXQgPSBfX2NvcHlfcmVtb3RlX3ZtX3N0cihtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XFxubW0vbWVtb3J5LmMtNzM5Mi1cXG4tLVxcbm1tL21lbW9yeS5jLTczOTYtfVxcbm1tL21lbW9yeS5jOjczOTc6RVhQT1JUX1NZTUJPTF9HUEwoY29weV9yZW1vdGVfdm1fc3RyKTtcXG5tbS9tZW1vcnkuYy03Mzk4LSNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDc6NDguOTgzOTE4ODAxWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzODM0NjY2MzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1lbW9yeSBBY2Nlc3MgRnVuY3Rpb25zIGluIHRoZSBLZXJuZWwqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBvZiBgbW0vbWVtb3J5LmNgIGhhcyBmbGFnZ2VkIGBhY2Nlc3NfcmVtb3RlX3ZtYCwgYGFjY2Vzc19wcm9jZXNzX3ZtYCwgYW5kIGBjb3B5X3JlbW90ZV92bV9zdHJgIGFzIHRoZSBrZXkgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zLCBiYXNlZCBvbiB0aGVpciBuYW1lcywgdGhhdCBsaWtlbHkgaGFuZGxlIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgYWNjZXNzIGFuZCBtZW1vcnkgY29weWluZyBvcGVyYXRpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgYW5kIGJlaGF2aW9yLlxuXG5Ob3csIHNoaWZ0aW5nIGZvY3VzIHRvIGBtbS9ndXAuY2AsIEkndmUgaWRlbnRpZmllZCBzZXZlcmFsIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdC4gYGdldF91c2VyX3BhZ2Vfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYXJlIG5vbi1zdGF0aWMgYW5kIGFwcGVhciBjcml0aWNhbCB0byB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIGEgdXNlciBwYWdlIGFuZCBsb29rdXBzLiBgX19nZXRfdXNlcl9wYWdlc2AgaXMgc3RhdGljIHdoaWNoIG1ha2VzIGl0IGEgaGVscGVyIGZ1bmN0aW9uIHdpdGhpbiB0aGUgYGd1cC5jYCBmaWxlLiBJJ2xsIG5lZWQgdG8gc2VlIGhvdyBgZ2V0X3VzZXJfcGFnZXNgLCBgcGluX3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIGFyZSB0aWVkIHRvIHRob3NlIGZ1bmN0aW9ucywgZXNwZWNpYWxseSB0aGUgb25lcyB0aGF0IGFyZSBhbHNvIG5vbi1zdGF0aWMuIFRoZSAncmVtb3RlJyBmdW5jdGlvbnMgYXJlIHByb2JhYmx5IGNydWNpYWwgdG8gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgYXJjaGl0ZWN0dXJlLCBhcyB0aGV5IGRlYWwgd2l0aCBjcm9zcy1WTSBhY2Nlc3MuXG5cblRoZSBjb3JlIHF1ZXN0aW9uIG5vdyBpcywgd2hhdCdzIGhhcHBlbmluZyB3aXRoaW4gYGdldF91c2VyX3BhZ2Vfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWA/IEknbGwgbmVlZCB0byBkaWcgaW50byB0aG9zZSBmdW5jdGlvbnMgdG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmlzbXMgYW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggdGhlIG92ZXJhbGwgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3kuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNDEwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjUzLjM2NzM5MDI2MloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjYxNDAxNTU0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImdldF91c2VyX3BhZ2Vfdm1hXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTExNTA9c3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy0xMjM4LS8qXFxubW0vZ3VwLmM6MTIzOTogKiBnZXRfdXNlcl9wYWdlX3ZtYSAtIGdldCBvbmUgcGFnZSBmcm9tIEB2bWEsIHdob3NlIGxvY2sgdGhlIGNhbGxlciBhbHJlYWR5XFxubW0vZ3VwLmMtMTI0MC0gKiBob2xkczogdGhlIG1tYXAgbG9jaywgb3IgKHdpdGggRk9MTF9WTUFfTE9DSykgdGhlIHBlci1WTUEgbG9jay4gV2Fsa3MgdGhlXFxuLS1cXG5tbS9ndXAuYy0xMjUyLSAqL1xcbm1tL2d1cC5jOjEyNTM6c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0vZ3VwLmMtMTI1NC1cXHRcXHRcXHQgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL2d1cC5jLTEzNTItICogTG9va3MgdXAgdGhlIFZNQSwgYW5kIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgdGhyb3VnaFxcbm1tL2d1cC5jOjEzNTM6ICogZ2V0X3VzZXJfcGFnZV92bWEoKSwgZmF1bHRpbmcgaW4gdGhlIHBhZ2UgaWYgbmVlZGVkLlxcbm1tL2d1cC5jLTEzNTQtICpcXG4tLVxcbm1tL2d1cC5jPTEzNTg9c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vZ3VwLmMtMTM3My1cXG5tbS9ndXAuYzoxMzc0OlxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7XFxubW0vZ3VwLmMtMTM3NS1cXHRpZiAoSVNfRVJSKHBhZ2UpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzo1NC4wMjg4MzA2MDZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODE1ODIyMTA3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipSZWZpbmluZyB0aGUgRm9jdXMgZm9yIFN5c3RlbSBDYWxsIEFuYWx5c2lzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgYW5hbHlzaXMuIEZpcnN0LCBJIGNvbmZpcm1lZCB0aGF0IGBnZXRfdXNlcl9wYWdlX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgIGFyZSBpbmRlZWQgbm9uLXN0YXRpYyDigJMgdGhhdCdzIGdvb2QgZm9yIG91ciBwdXJwb3Nlcy4gTm93LCBsZXQncyBsb29rIGF0IGBmb2xsb3dfcGFnZV9tYXNrYCAtIGl0J3Mgc3RhdGljLCBzbyBpdCdzIG5vdCBhIGRpcmVjdCBlbnRyeSBwb2ludC4gSG93ZXZlciwgYF9fZ2V0X3VzZXJfcGFnZXNgICppcyogc3RhdGljIGFuZCBjYWxscyBpdC4gYF9fZ2V0X3VzZXJfcGFnZXNgIGlzIGNhbGxlZCBieSBhIGhvc3Qgb2YgZnVuY3Rpb25zIGluY2x1ZGluZyBgZ2V0X3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYHBpbl91c2VyX3BhZ2VzYCBhbmQgYSBmZXcgb3RoZXJzLlxuXG5NeSBpbml0aWFsIHRob3VnaHQgd2FzIHRvIGluY2x1ZGUgdGhvc2UsIGJ1dCB0aGUgaW5zdHJ1Y3Rpb25zIHdhcm4gYWdhaW5zdCBpbmNsdWRpbmcgZ2VuZXJpYyBcImhvdCBwYXRoXCIgZnVuY3Rpb25zIHRvIGF2b2lkIHNrZXdpbmcgdGhlIHRlc3QgZGlzdHJpYnV0aW9ucy4gSSBuZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gYGdldF91c2VyX3BhZ2VzYCBhbmQgYHBpbl91c2VyX3BhZ2VzYCBhcmUgZGVmaW5pdGVseSBpbiB0aGF0IGhvdCBwYXRoIGNhdGVnb3J5LlxuXG5TbyBJJ3ZlIHJlZmluZWQgdGhlIGNvcmUgZm9jdXMgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMsIGF2b2lkaW5nIHRoZSBob3QgcGF0aHM6XG5cbiogICBgZ2V0X3VzZXJfcGFnZV92bWFgXG4qICAgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWBcbiogICBgYWNjZXNzX3JlbW90ZV92bWBcbiogICBgYWNjZXNzX3Byb2Nlc3Nfdm1gXG4qICAgYGNvcHlfcmVtb3RlX3ZtX3N0cmBcblxuVGhvc2Ugc2hvdWxkIHByb3ZpZGUgYSBtb3JlIHRhcmdldGVkIHZpZXcuXG5cbk5vdywgbGV0J3MgbW92ZSBvbiB0byB0aGUgY29uZmlndXJhdGlvbnMuIEkgbmVlZCB0byBub3RlIGFueSByZWxldmFudCBvbmVzLiBJJ20gc2VlaW5nOlxuXG4qICAgYFBFUl9WTUFfTE9DS2AgKGRlcGVuZGVudCBvbiBgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tgLCBgTU1VYCwgYW5kIGBTTVBgKVxuKiAgIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWBcbiogICBgUklTQ1ZfSVNBX1NVUE1gXG4qICAgYEFERFJFU1NfTUFTS0lOR2BcblxuSSBoYXZlIHRvIG1ha2Ugc3VyZSBgUEVSX1ZNQV9MT0NLYCBpcyBlbmFibGVkIHByb3Blcmx5Li4uIEFoLCBpdCdzIGEgYGRlZl9ib29sIHlgIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgY29uZmlncy4gVGhhdCdzIGZpbmUsIEkgY2FuIGxpc3QgaXQuIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgYSBtZW51Y29uZmlnLCB3aGljaCBtZWFucyBpdCB3aWxsIG5lZWQgdG8gYmUgZXhwbGljaXRseSBzZXQuIGBSSVNDVl9JU0FfU1VQTWAgYW5kIGBBRERSRVNTX01BU0tJTkdgIGFyZSBqdXN0IGJvb2xzLlxuXG5JIHdpbGwgYWxzbyBxdWlja2x5IGNoZWNrIGBCUEZfU1lTQ0FMTGAgd2l0aCByZWxhdGlvbiB0byBgY29weV9yZW1vdGVfdm1fc3RyYCBiZWNhdXNlIEkgcmVjYWxsIGEgcG90ZW50aWFsIGxpbmsgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMxMzY2LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTk0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjAyLjE4NzA1NjUxNFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ5MTI0MjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJQRl9TWVNDQUxMXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTcyOTU9RVhQT1JUX1NZTUJPTF9HUEwoYWNjZXNzX3Byb2Nlc3Nfdm0pO1xcbm1tL21lbW9yeS5jLTcyOTYtXFxubW0vbWVtb3J5LmM6NzI5NzojaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vbWVtb3J5LmMtNzI5OC0vKlxcbi0tXFxubW0vbWVtb3J5LmM9NzM5Nz1FWFBPUlRfU1lNQk9MX0dQTChjb3B5X3JlbW90ZV92bV9zdHIpO1xcbm1tL21lbW9yeS5jOjczOTg6I2VuZGlmIC8qIENPTkZJR19CUEZfU1lTQ0FMTCAqL1xcbm1tL21lbW9yeS5jLTczOTktXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjAyLjQzNjE5MTM4OVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDEwMDc3MDA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipLZXJuZWwgSW50ZXJuYWxzOiBSZW1vdGUgVk0gU3RyaW5nIENvcHkgYW5kIEkvTyBSZW1hcHBpbmcqKlxuXG5SaWdodCwgc28sIGFzIEkgc2VlIGl0LCB0aGUgaW5jbHVzaW9uIG9mIGBCUEZfU1lTQ0FMTGAgaXMgZGVmaW5pdGVseSBuZWNlc3NhcnkgZm9yIHRoZSBgY29weV9yZW1vdGVfdm1fc3RyYCBmdW5jdGlvbi4gSXTigJlzIHByZXR0eSBjbGVhciBmcm9tIHRoZSBjb250ZXh0LiBXZeKAmXJlIGRlYWxpbmcgd2l0aCBhIHN5c3RlbSBjYWxsIGludm9sdmVkIGluIGNvcHlpbmcgc3RyaW5ncyBmcm9tIGEgcmVtb3RlIHZpcnR1YWwgbWFjaGluZSwgc28gdGhlIEJQRiBob29rcyBhbmQgY2FwYWJpbGl0aWVzIGFyZSBmdW5kYW1lbnRhbGx5IHJlcXVpcmVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIGFuZCBzZWN1cml0eSBpbiB0aGF0IHNjZW5hcmlvLiBNYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG5Ob3csIG9uIHRoZSBvdGhlciBoYW5kLCBmb3IgaGFuZGxpbmcgdGhvc2UgYGFjY2Vzc19yZW1vdGVfdm1hX29wc2Agb3BlcmF0aW9ucywgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IGBIQVZFX0lPUkVNQVBfUFJPVGAgaXMgZGVmaW5lZC4gVGhpcyBpcyBhIGNyaXRpY2FsIGNoZWNrIHRvIGVuc3VyZSB3ZSBoYXZlIHRoZSBuZWNlc3NhcnkgaGFyZHdhcmUgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIEkvTyByZW1hcHBpbmcuIFdlIGhhdmUgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyBleGlzdCBiZWZvcmUgd2UgZXZlbiB0aGluayBhYm91dCB0b3VjaGluZyB0aGUgcmVtb3RlIFZNJ3MgbWVtb3J5IGFuZCB0cnlpbmcgdG8gcmVhZCBvciB3cml0ZSBpdC4gSSdsbCBuZWVkIHRvIGdvIG92ZXIgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zIGFuZCBlbnN1cmUgdGhhdCB0aGUgcmlnaHQgY2hlY2tzIGFyZSBpbiBwbGFjZS4gVGhpcyBpcyB3aGVyZSB0aGUgaW50cmljYWNpZXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBhbmQgaGFyZHdhcmUgYmVjb21lIGNyaXRpY2FsLCBhbmQgSSB3YW50IHRvIGJlIDEwMCUgY2VydGFpbiB3ZSdyZSBoYW5kbGluZyB0aGF0IHJlbWFwcGluZyBzYWZlbHkgYW5kIHJlbGlhYmx5LiBHb3R0YSBjb3ZlciBhbGwgdGhlIGJhc2VzIVxuXG5cbiIsIklucHV0VG9rZW5zIjozMjY2MiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjA2LjQ0NjI3MjYxOFoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg0NzUxNTIyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkhBVkVfSU9SRU1BUF9QUk9UXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTY5NTE9RVhQT1JUX1NZTUJPTF9HUEwoZm9sbG93X3Bmbm1hcF9lbmQpO1xcbm1tL21lbW9yeS5jLTY5NTItXFxubW0vbWVtb3J5LmM6Njk1MzojaWZkZWYgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UXFxubW0vbWVtb3J5LmMtNjk1NC0vKipcXG4tLVxcbm1tL21lbW9yeS5jPTcwMjY9c3RhdGljIGludCBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcwMjgte1xcbm1tL21lbW9yeS5jOjcwMjk6I2lmZGVmIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVFxcbm1tL21lbW9yeS5jLTcwMzAtXFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjA2LjYzMTAzNjAxWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MzE5MjUwNjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzLCBnaXZlbiBteSBleHBlcnRpc2U6XG5cbioqQ2hlY2tpbmcgS2VybmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqXG5cblJpZ2h0LCBgSEFWRV9JT1JFTUFQX1BST1RgIGlzIGRlZmluaXRlbHkgd29ydGggYWRkaW5nIHRvIG15IG1lbnRhbCBjaGVja2xpc3Qgd2hlbiByZXZpZXdpbmcgdGhpcyBrZXJuZWwgY29uZmlndXJhdGlvbi4gSXQncyBhIHNpZ25pZmljYW50IGluZGljYXRvciBvZiBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIG1lbW9yeS1tYXBwZWQgSS9PLCBhbmQgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgdGhhdCBmZWF0dXJlIGNhbiBoYXZlIGEgcHJvZm91bmQgaW1wYWN0IG9uIGRldmljZSBkcml2ZXIgZGV2ZWxvcG1lbnQgYW5kIHBlcmZvcm1hbmNlLiBLbm93aW5nIHdoZXRoZXIgd2UgaGF2ZSBwcm90ZWN0aW9uIGVuYWJsZWQgZHVyaW5nIHJlbWFwcGluZyBpcyBjcnVjaWFsIGZvciBzZWN1cml0eSBhbmQgc3RhYmlsaXR5LlxuXG5Ob3csIGxldCdzIHBpdm90IHRvIHRoZSBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgb3B0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoYXQgb25lLiBJJ20gcmVjYWxsaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgUkNVIHdpdGggcmVzcGVjdCB0byBmcmVlaW5nIE1NVSB0YWJsZXMuIFdlIG5lZWQgdG8gZXZhbHVhdGUgd2hldGhlciBlbmFibGluZyB0aGF0IG9wdGlvbiBtYWtlcyBzZW5zZSBmb3IgdGhlIGN1cnJlbnQgdXNlIGNhc2UsIG9yIGlmIGl0IG1pZ2h0IHByZXNlbnQgcHJvYmxlbXMgd2l0aCB0aGUgYXJjaGl0ZWN0dXJlLiBUaW1lIHRvIGRlbHZlIGludG8gdGhlIGRldGFpbHMgYW5kIGNvbnNpZGVyIHRoZSBtZW1vcnkgbWFuYWdlbWVudCB0cmFkZW9mZnMgdGhpcyBlbnRhaWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMzIxOSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjEwLjE2Mjk2NjI5OFoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ2MTY1NzY2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIk1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LmM9NzA1MD1zdGF0aWMgYm9vbCByZW1vdGVfYWNjZXNzX2xvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcwNTUtXFxubW0vbWVtb3J5LmM6NzA1NjojaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZNQV9MT0NLKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19NTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFKVxcbm1tL21lbW9yeS5jLTcwNTctXFx0dm1hID0gbG9ja192bWFfdW5kZXJfcmN1KG1tLCBhZGRyKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MTAuNDA5MTQ1NDc1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4NjYwNjE0NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQ29uZmlndXJhdGlvbiBBdWRpdCoqXG5cbk9rYXksIGxldCdzIHJlZmluZSB0aGlzIGxpc3Qgb2YgaW50ZXJlc3Rpbmcga2VybmVsIGNvbmZpZ3VyYXRpb25zLiBXZSd2ZSBnb3QgYSBzb2xpZCBzdGFydGluZyBwb2ludDogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEJQRl9TWVNDQUxMYCwgYEhBVkVfSU9SRU1BUF9QUk9UYCwgYFJJU0NWX0lTQV9TVVBNYCwgYW5kIGBBRERSRVNTX01BU0tJTkdgLiBHb29kLCBnb29kLi4uIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCBkZWZpbml0ZWx5IGFkZCBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgdG8gdGhhdCBsaXN0OyBpdCdzIGdvdCByZWFsIHBvdGVudGlhbCBmb3IgYW5hbHlzaXMuXG5cbk5vdywgbGV0J3MgZGlnIGludG8gYEhBVkVfSU9SRU1BUF9QUk9UYCBhbmQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgIHNwZWNpZmljYWxseS4gTmVlZCB0byBkZXRlcm1pbmUgaWYgdGhleSdyZSBldmVuICpzZWxlY3RhYmxlKiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBHb3R0YSBjaGVjayB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25zdHJhaW50cy4gV2UnbGwgYmUgYWJsZSB0byB0ZWxsIG11Y2ggbW9yZSBvbmNlIHdlIGtub3cgd2hldGhlciB0aGVzZSBhcmUgaW4gc2NvcGUgb3Igbm90LlxuXG5cbiIsIklucHV0VG9rZW5zIjozMzYzMSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODoxNC4yNzUyMTIwNDhaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4NjE5NzAwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJIQVZFX0lPUkVNQVBfUFJPVFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9LY29uZmlnPTI1OD1jb25maWcgVVNFUl9SRVRVUk5fTk9USUZJRVJcXG4tLVxcbmFyY2gvS2NvbmZpZy0yNjQtXFxuYXJjaC9LY29uZmlnOjI2NTpjb25maWcgSEFWRV9JT1JFTUFQX1BST1RcXG5hcmNoL0tjb25maWctMjY2LVxcdGJvb2xcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MTQuNDYxNDE5OVoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjgxNjAzOTgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkNvbnNpZGVyaW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIE9wdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBhbmQgdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIGBIQVZFX0lPUkVNQVBfUFJPVGAuIFRoaXMgb25lJ3MgYSBiaXQgb2YgYSBzcGVjaWFsIGNhc2UuIEl0J3MgYSBoaWRkZW4gYm9vbCwgcmlnaHQ/IEFyY2hpdGVjdHVyZS1zcGVjaWZpYy4gVGhlIHdob2xlIHBvaW50IGlzLCBpdCdzIG5vdCBzb21ldGhpbmcgd2UgZXhwb3NlIGZvciB1c2VycyB0byB0d2VhayBkaXJlY3RseS4gV2Ugc2hvdWxkbid0IGV2ZW4gbGlzdCBpdDsgaXQncyBpbXBsaWNpdC4gTm8gcG9pbnQgaW4gY2x1dHRlcmluZyB0aGUgYXZhaWxhYmxlIGNob2ljZXMgd2l0aCBzb21ldGhpbmcgdGhhdCBjYW4ndCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuIFRoYXQgd291bGQganVzdCBiZSBjb25mdXNpbmcuXG5cbk5leHQgdXAsIHdoYXQgYWJvdXQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgPyBJIG5lZWQgdG8gdGhpbmsgdGhpcyBvbmUgdGhyb3VnaCBjYXJlZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0MDYwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MTguMTQzMDI4OFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjI0NTg5MTA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIk1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYXJjaC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvS2NvbmZpZz01MTI9Y29uZmlnIE1NVV9HQVRIRVJfVEFCTEVfRlJFRVxcbi0tXFxuYXJjaC9LY29uZmlnLTUxNC1cXG5hcmNoL0tjb25maWc6NTE1OmNvbmZpZyBNTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFXFxuYXJjaC9LY29uZmlnLTUxNi1cXHRib29sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjE4Ljc2NzYyNjY2NloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjc3MDE2MDM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aG9zZSB0aG91Z2h0cyBmcm9tIGEgZmlyc3QtcGVyc29uLCBleHBlcnQgcGVyc3BlY3RpdmUsIGtlZXBpbmcgaXQgY29uY2lzZSBhbmQgZm9jdXNpbmcgb24gdGhlIHVuZGVybHlpbmcgcmVhc29uaW5nOlxuXG4qKkhpZGRlbiBCb29sZWFuIGFuZCBWTUEgTG9jayBDb25zaWRlcmF0aW9ucyoqXG5cbkFscmlnaHQsIHNvIEknbSB0aGlua2luZyBhYm91dCB0aGlzIGRhdGEgc3RydWN0dXJlIGFuZCBJIHNlZSB0aGlzIFwiaGlkZGVuIGJvb2wuXCIgSXQncyBpbnRlbnRpb25hbGx5IGhpZGRlbiwgYW5kIHdlIHNob3VsZG4ndCByZXZlYWwgaXQgb3IgaW5jbHVkZSBpdCBpbiBvdXIgbGlzdGluZ3MuIFRoZSBkZXNpZ24gY2hvaWNlIGlzIGNsZWFyIOKAkyBpdCdzIGFuIGludGVybmFsIGRldGFpbCwgbWF5YmUgYW4gb3B0aW1pemF0aW9uLCBhbmQgZXhwb3NpbmcgaXQgd291bGQganVzdCBjbHV0dGVyIHRoaW5ncyBmb3IgdGhlIHVzZXIgYW5kIHBvdGVudGlhbGx5IGxlYWQgdG8gbWlzdXNlLiBXZSBzaG91bGQgbWFpbnRhaW4gdGhlIGFic3RyYWN0aW9uIGxldmVsLlxuXG5UaGVuIG15IG1pbmQganVtcHMgdG8gdGhlIGBQRVJfVk1BX0xPQ0tgLiAgSSdtIHdvbmRlcmluZyBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IGNob2ljZSBvciBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IHBsYWNlIGZvciBpdC4gVGhpbmtpbmcgYWJvdXQgdGhlIHBvdGVudGlhbCBjb250ZW50aW9uLCB0aGUgc2NvcGUgb2YgcHJvdGVjdGlvbiwgYW5kIHRoZSBzcGVjaWZpYyBvcGVyYXRpb25zIGl0J3MgZ3VhcmRpbmcuIElzIGl0IHJlYWxseSB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIHRoZSBjb25jdXJyZW5jeSBjaGFsbGVuZ2VzPyBXaGF0IGFyZSB0aGUgYWx0ZXJuYXRpdmVzPyBBcmUgdGhlcmUgb3RoZXIgbG9ja3MgdGhhdCBwcm92aWRlIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSwgYnV0IG1heSBiZSBtb3JlIHBlcmZvcm1hbnQgaW4gdGhlIGNpcmN1bXN0YW5jZXM/IE9yIHNob3VsZCB3ZSBleHBsb3JlIGEgbG9jay1mcmVlIHNvbHV0aW9uPyBXZSBuZWVkIHRvIHdlaWdoIHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0Mzc3LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MjIuMDQ0NjQ4MjgzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDMyOTI2NjgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiUEVSX1ZNQV9MT0NLXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz0xNDMzPWNvbmZpZyBMUlVfR0VOX1dBTEtTX01NVVxcbi0tXFxubW0vS2NvbmZpZy0xNDM3LVxcbm1tL0tjb25maWc6MTQzODpjb25maWcgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0MzktICAgICAgIGRlZl9ib29sIG5cXG5tbS9LY29uZmlnLTE0NDAtXFxubW0vS2NvbmZpZzoxNDQxOmNvbmZpZyBQRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0NDItXFx0ZGVmX2Jvb2wgeVxcbm1tL0tjb25maWc6MTQ0MzpcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUEVSX1ZNQV9MT0NLIFxcdTAwMjZcXHUwMDI2IE1NVSBcXHUwMDI2XFx1MDAyNiBTTVBcXG5tbS9LY29uZmlnLTE0NDQtXFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODoyMi4yODc5NTE2ODFaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjYzNDM4NjU2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLZXJuZWwgUGF0Y2gncyBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBzbyBsb29raW5nIGF0IHRoaXMgcGF0Y2gsIEkgc2VlIHRoYXQgYFBFUl9WTUFfTE9DS2AgaXMgZGVmaW5lZCBhcyBhIGBkZWZfYm9vbCB5YCwgd2hpY2ggbWVhbnMgaXQncyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgaWYgaXRzIGRlcGVuZGVuY2llcyBhcmUgbWV0LiBJIGRvbid0IG5lZWQgdG8gZXhwbGljaXRseSBsaXN0IGl0IGZvciBjb25maWd1cmF0aW9uIHB1cnBvc2VzLlxuXG5UaGVyZWZvcmUsIHRoZSBrZXkgY29uZmlndXJhdGlvbnMgdG8gd2F0Y2ggb3V0IGZvciBhcmU6IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBCUEZfU1lTQ0FMTGAsIGBSSVNDVl9JU0FfU1VQTWAsIGFuZCBgQUREUkVTU19NQVNLSU5HYC4gVGhvc2UgYXJlIHRoZSByZWxldmFudCBrbm9icyB0byBjb25zaWRlciB3aGVuIHRlc3RpbmcuXG5cbk5vdywgbGV0J3MgcmV2aWV3IHRoZSBjcml0aWNhbCBzeW1ib2xzIHRoaXMgcGF0Y2ggdG91Y2hlcy4gVGhlIG9uZXMgdGhhdCBpbW1lZGlhdGVseSBzdGFuZCBvdXQgYXJlIGBnZXRfdXNlcl9wYWdlX3ZtYWAsIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgLCBgYWNjZXNzX3JlbW90ZV92bWAsIGBhY2Nlc3NfcHJvY2Vzc192bWAsIGFuZCBgY29weV9yZW1vdGVfdm1fc3RyYC4gWXVwLCB0aG9zZSBhbGwgbG9vayBsaWtlIHRoZSByaWdodCBzZXQgb2YgcHJpbWl0aXZlcyB0byBmb2N1cyBvbi5cblxuTXkgcmVhc29uaW5nPyBUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBicmFuZCBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIHZpYSBgcmVtb3RlX3ZtX3dhbGtgIGFuZCBpcyByZXBsYWNpbmcgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBicmluZ3MgYmF0Y2hpbmcgc3VwcG9ydCBmb3IgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MgKG1USFApIGluIHRoZSBzbG93ZXIgR1VQIHBhdGguIFRoaXMgaW5kaWNhdGVzIHNvbWUgKnNpZ25pZmljYW50KiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMuIFRoZXNlIGNoYW5nZXMgYXJlIGdvaW5nIHRvIGltcGFjdCBwYWdlIGZhdWx0IGhhbmRsaW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyBvcGVyYXRpb25zICh0aGluZ3MgbGlrZSBwdHJhY2UsIGFjY2Vzc2luZyBgL3Byb2MvcGlkL21lbWApLCBhbmQgZXZlbiBCUEYgc3RyaW5nIGNvcHlpbmcuIFRoaXMgbWVhbnMgZnV6emluZyBlZmZvcnRzIHNob3VsZCBhYnNvbHV0ZWx5IGNvbmNlbnRyYXRlIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCB0aGUgcmVtb3RlIGFjY2VzcyBBUElzLlxuXG5KdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0IG1lIHF1aWNrbHkgZG91YmxlLWNoZWNrIGlmIGBhY2Nlc3NfcmVtb3RlX3ZtYCBpcyBleHBvcnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQ4MzQsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MjguOTIyMzQ0MDU4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTU5MzE3NTYsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0xfR1BMXFxcXChhY2Nlc3NfcmVtb3RlX3ZtXFxcXClcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjI5LjExODI4ODcxNFoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzY0NTAxMzEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6XG5cbioqRGl2aW5nIGludG8gdGhlIGBtbS9tZW1vcnkuY2AgUmFiYml0IEhvbGUqKlxuXG5Pa2F5LCBiZWZvcmUgSSBnbyBhbnkgZnVydGhlciwgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGFjY2Vzc19yZW1vdGVfdm1gLiBJdCdzIGNydWNpYWwsIGFuZCB0aGUgY29udGV4dCBvZiBtZW1vcnkgYWNjZXNzIGlzIGNyaXRpY2FsLiBMZXQncyBzZWUgaG93IHRoYXQgZnVuY3Rpb24gaXMgZGVmaW5lZCB3aXRoaW4gdGhlIGBtbS9tZW1vcnkuY2AgbW9kdWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBoYW5kbGVzIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgbWVtb3J5IGFjY2VzcyBzcGVjaWZpY2FsbHkg4oCTIGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIG9yIHJhY2UgY29uZGl0aW9ucyB0aGVyZSBjb3VsZCBiZSBuYXN0eS4gSSdsbCBuZWVkIHRvIGxvb2sgdmVyeSBjbG9zZWx5IGF0IHRoZSBjb2RlIGFuZCBzZWUgZXhhY3RseSB3aGF0J3MgaGFwcGVuaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNTU3NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjMyLjg4Mjc5NDU2N1oiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE3NDY5NzI0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFjY2Vzc19yZW1vdGVfdm1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LmM9NzAxND1FWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX2FjY2Vzc19waHlzKTtcXG4tLVxcbm1tL21lbW9yeS5jLTcwMjUtICovXFxubW0vbWVtb3J5LmM6NzAyNjpzdGF0aWMgaW50IGFjY2Vzc19yZW1vdGVfdm1hX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTcwMjctXFx0XFx0XFx0XFx0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxcbi0tXFxubW0vbWVtb3J5LmM9NzIxMT1zdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL21lbW9yeS5jLTcyMTgtXFx0aWYgKCFwYWdlKSB7XFxubW0vbWVtb3J5LmM6NzIxOTpcXHRcXHRieXRlcyA9IGFjY2Vzc19yZW1vdGVfdm1hX29wcyh2bWEsIGFkZHIsICpidWYsIGxlbiwgd3JpdGUpO1xcbm1tL21lbW9yeS5jLTcyMjAtXFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2UgMClcXG4tLVxcbm1tL21lbW9yeS5jLTcyNDYtICovXFxubW0vbWVtb3J5LmM6NzI0NzpzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTcyNDgtXFx0XFx0XFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxcbi0tXFxubW0vbWVtb3J5LmMtNzI1Ni0vKipcXG5tbS9tZW1vcnkuYzo3MjU3OiAqIGFjY2Vzc19yZW1vdGVfdm0gLSBhY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlXFxubW0vbWVtb3J5LmMtNzI1OC0gKiBAbW06XFx0XFx0dGhlIG1tX3N0cnVjdCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3Mgc3BhY2VcXG4tLVxcbm1tL21lbW9yeS5jLTcyNjctICovXFxubW0vbWVtb3J5LmM6NzI2ODppbnQgYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTcyNjktXFx0XFx0dm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxcbm1tL21lbW9yeS5jLTcyNzAte1xcbm1tL21lbW9yeS5jOjcyNzE6XFx0cmV0dXJuIF9fYWNjZXNzX3JlbW90ZV92bShtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XFxubW0vbWVtb3J5LmMtNzI3Mi19XFxuLS1cXG5tbS9tZW1vcnkuYz03Mjc5PWludCBhY2Nlc3NfcHJvY2Vzc192bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtNzI4OC1cXG5tbS9tZW1vcnkuYzo3Mjg5OlxcdHJldCA9IF9fYWNjZXNzX3JlbW90ZV92bShtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XFxubW0vbWVtb3J5LmMtNzI5MC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MzMuMTAwMjgwODg5WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU5OTI3MTM1NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUmVtb3RlIFZNIEFjY2VzcyBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBsb29raW5nIGludG8gdGhpcyBgYWNjZXNzX3JlbW90ZV92bWAgc2l0dWF0aW9uLiBJIHNlZSBub3c7IGl0J3MgKm5vdCogZXhwb3J0ZWQsIGJ1dCBpdCdzIGFsc28gbm90IHN0YXRpYy4gVGhhdCBtYWtlcyBpdCBhIHBlcmZlY3Qgc3ltYm9sIHRvIHplcm8gaW4gb24sIGVzcGVjaWFsbHkgc2luY2UgYGFjY2Vzc19wcm9jZXNzX3ZtYCAqaXMqIGV4cG9ydGVkLiBGb2N1c2luZyBvbiBgYWNjZXNzX3JlbW90ZV92bWAgc2VlbXMgbGlrZSBhIHNvbGlkIGFwcHJvYWNoLlxuXG5JIGFsc28gY29uc2lkZXJlZCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCBhbmQgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAuIFRoZXkncmUgZGVmaW5pdGVseSByZWxldmFudCwgYnV0IEkgaGF2ZSBhIGh1bmNoIHRoZXkncmUgbGlrZWx5IHRvIGJlIHBlcmZvcm1hbmNlLWNyaXRpY2FsIHBhdGhzLCBhbmQgSSdkIHByZWZlciB0byBzdGFydCB3aXRoIHNvbWV0aGluZyBhIGJpdCBtb3JlIGZ1bmRhbWVudGFsLiBUaGUgcGF0Y2ggdG91Y2hlcyBgbW0vZ3VwLmNgIGFuZCBgbW0vbWVtb3J5LmNgLCB3aGljaCBjb25maXJtcyBteSBpbml0aWFsIGludHVpdGlvbi4gU28sIEknbSBzdGlja2luZyB3aXRoIG15IG9yaWdpbmFsIHNlbGVjdGlvbiBvZiBmb2N1cyBzeW1ib2xzIGZvciBub3cg4oCTIGBhY2Nlc3NfcmVtb3RlX3ZtYCBzZWVtcyBsaWtlIHRoZSBtb3N0IHN0cmF0ZWdpYyBzdGFydGluZyBwb2ludC5cblxuQmVmb3JlIEkgY29tbWl0IHRvIHRoaXMgYXBwcm9hY2gsIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgaW4gcGxheS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJ20gbm90IG92ZXJsb29raW5nIGFueXRoaW5nIGNyaXRpY2FsLiBMZXQncyBzZWUuLi4gYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEJQRl9TWVNDQUxMYCwgYFJJU0NWX0lTQV9TVVBNYCwgYW5kIGBBRERSRVNTX01BU0tJTkdgLiBBbHJpZ2h0LCBJJ3ZlIGdvdCB0aGVtLiBMb29rcyBsaWtlIEkndmUgY29uc2lkZXJlZCB0aGUgcmVsZXZhbnQgZmFjdG9ycy5cblxuTm93LCBJIHRoaW5rIEknbSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIEknbGwgZ28gYWhlYWQgYW5kIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzYzNTIsIk91dHB1dFRva2VucyI6MjQ5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjM5LjA5Mjk5OTY4MloiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2OTEzMjc3MywiRXJyb3IiOiJ0aGUgZm9sbG93aW5nIGNvbmZpZ3MgZG8gbm90IGV4aXN0IGluIHRoZSBrZXJuZWwgdHJlZTogUklTQ1ZfSVNBX1NVUE0iLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJSSVNDVl9JU0FfU1VQTVwiLFxuICAgIFwiQUREUkVTU19NQVNLSU5HXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZV92bWFcIixcbiAgICBcImdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYVwiLFxuICAgIFwiYWNjZXNzX3JlbW90ZV92bVwiLFxuICAgIFwiYWNjZXNzX3Byb2Nlc3Nfdm1cIixcbiAgICBcImNvcHlfcmVtb3RlX3ZtX3N0clwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJ0aGUgZm9sbG93aW5nIGNvbmZpZ3MgZG8gbm90IGV4aXN0IGluIHRoZSBrZXJuZWwgdHJlZTogUklTQ1ZfSVNBX1NVUE1cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MzkuMzYyMTc0NzM1WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MDgwMTU5MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGVidWdnaW5nIGEgUklTQy1WIENvbmZpZ3VyYXRpb24gSXNzdWUqKlxuXG5Pa2F5LCBob2xkIG9uIGEgbWludXRlLiBgUklTQ1ZfSVNBX1NVUE1gIGlzbid0IHNob3dpbmcgdXAgd2hlcmUgSSBleHBlY3QgaXQgdG8uIFRoYXQncyBhIHJlZCBmbGFnLiBCZWZvcmUgSSBzdGFydCBnb2luZyBkb3duIGEgcmFiYml0IGhvbGUgb2YgaW5jbHVkZSBwYXRocyBvciBidWlsZCBzeXN0ZW0gb2RkaXRpZXMsIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGV2ZW4gYSAqZGVmaW5lZCogc3ltYm9sLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gY2hlY2sgdGhlIGNvcmUgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSwgc3BlY2lmaWNhbGx5IGBhcmNoL3Jpc2N2L0tjb25maWdgLiBUaGF0J3MgdGhlIGRlZmluaXRpdmUgc291cmNlIG9mIHRydXRoIGZvciBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzIGFuZCBvcHRpb25zLiBHb3R0YSBzZWUgaWYgaXQncyBkZWNsYXJlZCB0aGVyZSwgY29ycmVjdGx5LCBvciBpZiB0aGVyZSdzIGEgdHlwbywgY29uZGl0aW9uLCBvciBkZXBlbmRlbmN5IEknbSBtaXNzaW5nLiBMZXQncyBnZXQgdGhhdCBLY29uZmlnIGZpbGUgb3BlbiBhbmQgZG8gYSBxdWljayBzZWFyY2guIEhvcGVmdWxseSwgdGhpcyBpcyBhIHNpbXBsZSBjb25maWd1cmF0aW9uIG1pc3N0ZXAuIElmIG5vdCwgSSdsbCBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYnVpbGQgc3lzdGVtIGFuZCBwb3RlbnRpYWxseSB0aGUgaGVhZGVycyB0aGVtc2VsdmVzIHRvIGZpZ3VyZSBvdXQgd2hhdCdzIGdvaW5nIG9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzEyOCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsic2V0LXJlc3VsdHMiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODo0Mi43NzAxOTYyNTVaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1Nzk0NDI5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJSSVNDVl9JU0FfU1VQTVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL3Jpc2N2L0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9yaXNjdi9LY29uZmlnPTU1Mz1jb25maWcgUklTQ1ZfSVNBX0NcXG4tLVxcbmFyY2gvcmlzY3YvS2NvbmZpZy01NjMtXFxuYXJjaC9yaXNjdi9LY29uZmlnOjU2NDpjb25maWcgUklTQ1ZfSVNBX1NVUE1cXG5hcmNoL3Jpc2N2L0tjb25maWctNTY1LVxcdGJvb2wgXFxcIlN1cG0gZXh0ZW5zaW9uIGZvciB1c2Vyc3BhY2UgcG9pbnRlciBtYXNraW5nXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODo0Mi45MjgxNDgzODNaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTAzMTkxOTcyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipUcm91Ymxlc2hvb3RpbmcgYSBDb25maWd1cmF0aW9uIEVycm9yKipcblxuT2theSwgc28gdGhlIHRvb2wgaXMgdGVsbGluZyBtZSB0aGlzIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lc24ndCBleGlzdC4gVGhhdCdzIGEgY2xhc3NpYy4gTXkgaW5pdGlhbCBodW5jaCBpcyB0aGF0IGl0J3MgZWl0aGVyIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIHRyZWUsIG9yIHRoZSB0b29sIGlzIHVzaW5nIGEgbW9yZSByZXN0cmljdGl2ZSBsb29rdXAgdGhhbiBJIGV4cGVjdC4gTGV0J3Mgc3RhcnQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGlzc3VlLiBJJ2xsIHJlbW92ZSBgUklTQ1ZfSVNBX1NVUE1gIGFuZCBgQUREUkVTU19NQVNLSU5HYCBmcm9tIG15IGFjdGl2ZSBjb25maWd1cmF0aW9uIHRvIHRyeSBhbmQgaXNvbGF0ZSB0aGUgcHJvYmxlbS4gVGhvc2Ugc2VlbSBsaWtlIHBvdGVudGlhbCBjdWxwcml0cywgYmVpbmcgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBhbmQgbWlnaHQgbm90IGJlIHByZXNlbnQgaW4gdGhlIHRvb2wncyBkZWZhdWx0IGNoZWNrLiBXYWl0IGEgc2Vjb25kLCBkaWRuJ3QgSSBqdXN0IHNlZSBgQUREUkVTU19NQVNLSU5HYCBpbiB0aGUgeDg2IEtjb25maWcgZmlsZXM/IEknbGwgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCwganVzdCB0byBiZSBzdXJlLiBJdCdzIGltcG9ydGFudCB0byB2ZXJpZnkgdGhvc2UgZGV0YWlscywgbm8gcG9pbnQgYXNzdW1pbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM3NTAxLCJPdXRwdXRUb2tlbnMiOjIzOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODo0Ny45NjAwNzE5MjZaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTU1MzE4NDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQUREUkVTU19NQVNLSU5HXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZV92bWFcIixcbiAgICBcImdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYVwiLFxuICAgIFwiYWNjZXNzX3JlbW90ZV92bVwiLFxuICAgIFwiYWNjZXNzX3Byb2Nlc3Nfdm1cIixcbiAgICBcImNvcHlfcmVtb3RlX3ZtX3N0clwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkFERFJFU1NfTUFTS0lOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF91c2VyX3BhZ2Vfdm1hXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFcIixcbiAgICBcImFjY2Vzc19yZW1vdGVfdm1cIixcbiAgICBcImFjY2Vzc19wcm9jZXNzX3ZtXCIsXG4gICAgXCJjb3B5X3JlbW90ZV92bV9zdHJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow98vll[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-26 09:42:12 +0000 UTC FinishedAt: 2026-07-26 10:08:49 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "248951ddc14de84de3910f9b13f51491a8cd91df", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "BPF_SYSCALL", "ADDRESS_MASKING" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "248951ddc14de84de3910f9b13f51491a8cd91df", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "BPF_SYSCALL", "ADDRESS_MASKING" ], "series_id": "dcd2e194-d976-41b3-9678-ea27e80f2379" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "get_user_page_vma", "get_user_page_lookup_vma", "access_remote_vm", "access_process_vm", "copy_remote_vm_str" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0FERFJFU1NfTUFTS0lORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2Vfdm1hJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcmVtb3RlX3ZtJiMzNDssCiAgICAmIzM0O2FjY2Vzc19wcm9jZXNzX3ZtJiMzNDssCiAgICAmIzM0O2NvcHlfcmVtb3RlX3ZtX3N0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2N2MyMDk4N2RlNmQ5MmQ3ZWZjMjFhMDAxODg1YWQzMThiNjA1NGZlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFN1biBKdWwgMjYgMTA6MDc6MDYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xuaW5kZXggMWE5YWFkNmVmMjJhMDQuLjdhNmVjYzNkOTI5NDhjIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jXG5AQCAtNDU5LDcgJiM0Mzs0NTksNyBAQCBzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV90YWdzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuIFx0XHR1bnNpZ25lZCBsb25nIHRhZ3MsIG9mZnNldDtcbiBcdFx0dm9pZCAqbWFkZHI7XG4tXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIGFkZHIsXG4gXHRcdFx0XHRcdFx0XHQgICAgIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbiBcdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiBcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbmluZGV4IGRiZjI3YTc4ZGY2Yzg3Li4zY2UxNjc5NmU1YTI1ZCAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXG5AQCAtMjEsNyAmIzQzOzIxLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsXG4gXHRcdFx0ICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpXG4ge1xuICNpZmRlZiBDT05GSUdfUklTQ1ZfSVNBX1NVUE1cbi1cdG5leHQtXHUwMDNlY29udGV4dC5wbWxlbiA9IDA7XG4mIzQzO1x0V1JJVEVfT05DRShuZXh0LVx1MDAzZWNvbnRleHQucG1sZW4sIDApO1xuICNlbmRpZlxuIFx0c3dpdGNoX21tKHByZXYsIG5leHQsIE5VTEwpO1xuIH1cbkBAIC00NCw3ICYjNDM7NDQsNyBAQCBERUNMQVJFX1NUQVRJQ19LRVlfRkFMU0UodXNlX2FzaWRfYWxsb2NhdG9yKTtcbiAjZGVmaW5lIG1tX3VudGFnX21hc2sgbW1fdW50YWdfbWFza1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIHtcbi1cdHJldHVybiAtMVVMIFx1MDAzZVx1MDAzZSBtbS1cdTAwM2Vjb250ZXh0LnBtbGVuO1xuJiM0MztcdHJldHVybiAtMVVMIFx1MDAzZVx1MDAzZSBSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbik7XG4gfVxuICNlbmRpZlxuIFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmhcbmluZGV4IDVkNGVjMTU1ODRjZmE0Li41MzgwNmUwZjdkY2ZlMyAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxuQEAgLTE2LDcgJiM0MzsxNiw3IEBAXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcbiB7XG4gXHRpZiAocmlzY3ZfaGFzX2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfRVhUX1NVUE0pKSB7XG4tXHRcdHU4IHBtbGVuID0gbW0tXHUwMDNlY29udGV4dC5wbWxlbjtcbiYjNDM7XHRcdHU4IHBtbGVuID0gUkVBRF9PTkNFKG1tLVx1MDAzZWNvbnRleHQucG1sZW4pO1xuIFxuIFx0XHQvKiBWaXJ0dWFsIGFkZHJlc3NlcyBhcmUgc2lnbi1leHRlbmRlZDsgcGh5c2ljYWwgYWRkcmVzc2VzIGFyZSB6ZXJvLWV4dGVuZGVkLiAqL1xuIFx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTU1VKSlcbkBAIC0zMywxMiAmIzQzOzMzLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lXG4gXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUoY3VycmVudC1cdTAwM2VtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbi0jZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoe1x0XHRcdFx0XHRcXFxuJiM0MzsjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKSAoe1x0XHRcdFx0XFxcbiBcdHVuc2lnbmVkIGxvbmcgX19hZGRyID0gKF9fZm9yY2UgdW5zaWduZWQgbG9uZykoYWRkcik7XHRcdFx0XFxcbi1cdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XHRcdFx0XHRcdFx0XHRcXFxuIFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBfX2FkZHIpO1x0XHRcXFxuIH0pXG4gXG4mIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpICh7XHRcdFx0XHRcdFxcXG4mIzQzO1x0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcdFx0XHRcdFx0XHRcdFxcXG4mIzQzO1x0dW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpO1x0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4gI2RlZmluZSBhY2Nlc3Nfb2soYWRkciwgc2l6ZSkgbGlrZWx5KF9fYWNjZXNzX29rKHVudGFnZ2VkX2FkZHIoYWRkciksIHNpemUpKVxuICNlbHNlXG4gI2RlZmluZSB1bnRhZ2dlZF9hZGRyKGFkZHIpIChhZGRyKVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuY1xuaW5kZXggYjJkZjdmNzIyNDFhNWYuLjZhZTc1NTJmZWQwOWYzIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwvcHJvY2Vzcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcbkBAIC0zNTcsMTMgJiM0MzszNTcsMTUgQEAgbG9uZyBzZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYXJnKVxuIFx0aWYgKG1tYXBfd3JpdGVfbG9ja19raWxsYWJsZShtbSkpXG4gXHRcdHJldHVybiAtRUlOVFI7XG4gXG4tXHRpZiAodGVzdF9iaXQoTU1fQ09OVEVYVF9MT0NLX1BNTEVOLCBcdTAwMjZtbS1cdTAwM2Vjb250ZXh0LmZsYWdzKSBcdTAwMjZcdTAwMjYgbW0tXHUwMDNlY29udGV4dC5wbWxlbiAhPSBwbWxlbikge1xuLVx0XHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4tXHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1x0aWYgKHRlc3RfYml0KE1NX0NPTlRFWFRfTE9DS19QTUxFTiwgXHUwMDI2bW0tXHUwMDNlY29udGV4dC5mbGFncykpIHtcbiYjNDM7XHRcdGlmIChSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbikgIT0gcG1sZW4pIHtcbiYjNDM7XHRcdFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdFx0fVxuIFx0fVxuIFxuIFx0ZW52Y2ZnX3VwZGF0ZV9iaXRzKHRhc2ssIEVOVkNGR19QTU0sIHBtbSk7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnBtbGVuID0gcG1sZW47XG4mIzQzO1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnBtbGVuLCBwbWxlbik7XG4gXG4gXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4gXG5AQCAtMzk0LDcgJiM0MzszOTYsNyBAQCBsb25nIGdldF90YWdnZWRfYWRkcl9jdHJsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiBcdFx0YnJlYWs7XG4gXHR9XG4gXG4tXHRpZiAodGFzay1cdTAwM2VtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKVxuJiM0MztcdGlmIChSRUFEX09OQ0UodGFzay1cdTAwM2VtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKSlcbiBcdFx0cmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTtcbiBcbiBcdHJldHVybiByZXQ7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbmluZGV4IGVmNWI1MDdkZTM0ZTJlLi5jZWU3MTBmNjQ2NThhYSAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbkBAIC0xMDAsMTggJiM0MzsxMDAsMTggQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1tX2xhbV9jcjNfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBzdGF0aWMgaW5saW5lIHZvaWQgZHVwX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4ge1xuIFx0bW0tXHUwMDNlY29udGV4dC5sYW1fY3IzX21hc2sgPSBvbGRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzaztcbi1cdG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9IG9sZG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzaztcbiYjNDM7XHRXUklURV9PTkNFKG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzaywgUkVBRF9PTkNFKG9sZG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzaykpO1xuIH1cbiBcbiAjZGVmaW5lIG1tX3VudGFnX21hc2sgbW1fdW50YWdfbWFza1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIHtcbi1cdHJldHVybiBtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2s7XG4mIzQzO1x0cmV0dXJuIFJFQURfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2spO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgbW1fcmVzZXRfdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgPSAtMVVMO1xuJiM0MztcdFdSSVRFX09OQ0UobW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLCAtMVVMKTtcbiB9XG4gXG4gI2RlZmluZSBhcmNoX3BndGFibGVfZG1hX2NvbXBhdCBhcmNoX3BndGFibGVfZG1hX2NvbXBhdFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaFxuaW5kZXggMjBkZTM0Y2M5YWE2ZTcuLmEwOTUxNjVlYjY0OGViIDEwMDY0NFxuLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmhcbkBAIC0zOSwxOCAmIzQzOzM5LDI3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHIodW5zaWduZWQgbG9uZyBhZGRyKVxuIFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHIoX19hZGRyKTtcdFx0XFxcbiB9KVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgY2hhbmdlcyBvbmx5IHdoZW4gdGhlIHRhcmdldCBlbmFibGVzIExBTSBvciBleGVjcyxcbiYjNDM7ICogYWx3YXlzIHNpbmdsZS10aHJlYWRlZC4gQW4gdW5sb2NrZWQgcmVtb3RlIHJlYWRlciBjYW4gcmFjZSB0aGF0OyBSRUFEX09OQ0VcbiYjNDM7ICoga2VlcHMgdGhlIHZhbHVlIHdob2xlIGFuZCB0aGUgdW50YWcgaXMgYmVzdC1lZmZvcnQuXG4mIzQzOyAqL1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgYWRkcilcbiB7XG4tXHRtbWFwX2Fzc2VydF9sb2NrZWQobW0pO1xuLVx0cmV0dXJuIGFkZHIgXHUwMDI2IChtbSktXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xuJiM0MztcdHJldHVybiBhZGRyIFx1MDAyNiBSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrKTtcbiB9XG4gXG4tI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcilcdCh7XHRcdFx0XHRcXFxuJiM0MzsjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKVx0KHtcdFx0XHRcXFxuIFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcdFx0XFxcbiBcdChfX2ZvcmNlIF9fdHlwZW9mX18oYWRkcikpX191bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbiYjNDM7I2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcilcdCh7XHRcdFx0XHRcXFxuJiM0MztcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4gI2VuZGlmXG4gXG4gI2RlZmluZSB2YWxpZF91c2VyX2FkZHJlc3MoeCkgXFxcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xuaW5kZXggZDQ0YWZiZTAwNWJiNTEuLjlmYTY1OTExN2YzODI2IDEwMDY0NFxuLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xuQEAgLTgxNCw3ICYjNDM7ODE0LDcgQEAgc3RhdGljIHZvaWQgZW5hYmxlX2xhbV9mdW5jKHZvaWQgKl9fbW0pXG4gc3RhdGljIHZvaWQgbW1fZW5hYmxlX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4gXHRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IFg4Nl9DUjNfTEFNX1U1Nztcbi1cdG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpO1xuJiM0MztcdFdSSVRFX09OQ0UobW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLCB+R0VOTUFTSyg2MiwgNTcpKTtcbiBcbiBcdC8qXG4gXHQgKiBFdmVuIHRob3VnaCB0aGUgcHJvY2VzcyBtdXN0IHN0aWxsIGJlIHNpbmdsZS10aHJlYWRlZCBhdCB0aGlzXG5AQCAtOTUyLDcgJiM0Mzs5NTIsNyBAQCBsb25nIGRvX2FyY2hfcHJjdGxfNjQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb3B0aW9uLCB1bnNpZ25lZCBsb25nIGFyZzIpXG4gI2VuZGlmXG4gI2lmZGVmIENPTkZJR19BRERSRVNTX01BU0tJTkdcbiBcdGNhc2UgQVJDSF9HRVRfVU5UQUdfTUFTSzpcbi1cdFx0cmV0dXJuIHB1dF91c2VyKHRhc2stXHUwMDNlbW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLFxuJiM0MztcdFx0cmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay1cdTAwM2VtbSksXG4gXHRcdFx0XHQodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcyKTtcbiBcdGNhc2UgQVJDSF9FTkFCTEVfVEFHR0VEX0FERFI6XG4gXHRcdHJldHVybiBwcmN0bF9lbmFibGVfdGFnZ2VkX2FkZHIodGFzay1cdTAwM2VtbSwgYXJnMik7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbmluZGV4IDNhZjk3OWZiNDFkMzhkLi4zMjllZmFjMGNmYjM3ZCAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbkBAIC0xMDM2LDcgJiM0MzsxMDM2LDcgQEAgc3RhdGljIGludCBjb3B5X2Zyb21fdmFkZHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHZvaWQgKmRzdCxcbiBcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXG4tXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCBcdTAwMjZ2bWEpO1xuJiM0MztcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIHZhZGRyLCBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4gXHRpZiAoSVNfRVJSKHBhZ2UpKVxuIFx0XHRyZXR1cm4gUFRSX0VSUihwYWdlKTtcbiBcdHVwcm9iZV9jb3B5X2Zyb21fcGFnZShwYWdlLCB2YWRkciwgZHN0LCBsZW4pO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaFxuaW5kZXggNDg1ZGY5YzJkYmRkYjMuLjBmNjZkNzZlNmNhNzE5IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21tLmhcbkBAIC0zMjM1LDM1ICYjNDM7MzIzNSw5IEBAIGxvbmcgcGluX3VzZXJfcGFnZXNfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdCAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4gXHRcdFx0ICAgaW50ICpsb2NrZWQpO1xuIFxuLS8qXG4tICogUmV0cmlldmVzIGEgc2luZ2xlIHBhZ2UgYWxvbmdzaWRlIGl0cyBWTUEuIERvZXMgbm90IHN1cHBvcnQgRk9MTF9OT1dBSVQuXG4tICovXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLVx0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHRcdFx0ICAgIGludCBndXBfZmxhZ3MsXG4tXHRcdFx0XHRcdFx0ICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXG4te1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbi1cdGludCBnb3Q7XG4tXG4tXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgRk9MTF9OT1dBSVQpKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4tXG4tXHRnb3QgPSBnZXRfdXNlcl9wYWdlc19yZW1vdGUobW0sIGFkZHIsIDEsIGd1cF9mbGFncywgXHUwMDI2cGFnZSwgTlVMTCk7XG4tXG4tXHRpZiAoZ290IFx1MDAzYyAwKVxuLVx0XHRyZXR1cm4gRVJSX1BUUihnb3QpO1xuLVxuLVx0dm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7XG4tXHRpZiAoV0FSTl9PTl9PTkNFKCF2bWEpKSB7XG4tXHRcdHB1dF9wYWdlKHBhZ2UpO1xuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbi1cdH1cbi1cbi1cdCp2bWFwID0gdm1hO1xuLVx0cmV0dXJuIHBhZ2U7XG4tfVxuJiM0MztzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4mIzQzO1x0XHRcdFx0ICAgICAgaW50IGd1cF9mbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTtcbiBcbiBsb25nIGdldF91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXG5pbmRleCBlZGRiYmI2NWNjYzRmOC4uN2U2ZTRjODkxODRjZDcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmhcbkBAIC0zNCw2ICYjNDM7MzQsMTMgQEBcbiB9KVxuICNlbmRpZlxuIFxuJiM0MzsjaWZuZGVmIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkXG4mIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXHQoe1x0XFxcbiYjNDM7XHQodm9pZCkobW0pO1x0XHRcdFx0XHRcXFxuJiM0MztcdHVudGFnZ2VkX2FkZHIoYWRkcik7XHRcdFx0XHRcXFxuJiM0Mzt9KVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4gI2lmZGVmIG1hc2tlZF91c2VyX2FjY2Vzc19iZWdpblxuICAjZGVmaW5lIGNhbl9kb19tYXNrZWRfdXNlcl9hY2Nlc3MoKSAxXG4gIyBpZm5kZWYgbWFza2VkX3VzZXJfd3JpdGVfYWNjZXNzX2JlZ2luXG5kaWZmIC0tZ2l0IGEvbW0vZ3VwLmMgYi9tbS9ndXAuY1xuaW5kZXggMDY5MjExOWI3OTA0MzEuLjQ5MTBjOTNiYTAwM2U4IDEwMDY0NFxuLS0tIGEvbW0vZ3VwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cC5jXG5AQCAtNjQ3LDggJiM0Mzs2NDcsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHQgICAgcHVkX3QgKnB1ZHAsIGludCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbkBAIC02NzIsMTAgJiM0Mzs2NzMsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xuIFxuIFx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xuLVx0aWYgKHJldClcbiYjNDM7XHRpZiAocmV0KSB7XG4gXHRcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XG4tXHRlbHNlXG4tXHRcdCpwYWdlX21hc2sgPSBIUEFHRV9QVURfTlIgLSAxO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG9mZiA9IChhZGRyIFx1MDAyNiB+UFVEX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcbiYjNDM7XHRcdCpucl9wYWdlcyA9IG1pbihIUEFHRV9QVURfTlIgLSBvZmYsIChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4mIzQzO1x0fVxuIFxuIFx0cmV0dXJuIHBhZ2U7XG4gfVxuQEAgLTY5OSw5ICYjNDM7NzAzLDkgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZF90IHBtZCwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdCAgICBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuIFx0cG1kX3QgcG1kdmFsID0gKnBtZDtcbkBAIC03MzgsMjMgJiM0Mzs3NDIsMjUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gI2VuZGlmXHQvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi9cbiBcbiBcdHBhZ2UgJiM0Mzs9IChhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuLVx0KnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7XG4mIzQzO1x0Km5yX3BhZ2VzID0gbWluKEhQQUdFX1BNRF9OUiAtICgoYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCksXG4mIzQzO1x0XHRcdChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4gXHRyZXR1cm4gcGFnZTtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXG4mIzQzO1x0XHRcdFx0ICAgIHB1ZF90ICpwdWRwLCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHQgICAgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtNzk5LDggJiM0Mzs4MDUsNDYgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRyZXR1cm4gIXVzZXJmYXVsdGZkX3B0ZV93cCh2bWEsIHB0ZSk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkXG4mIzQzOyAqIGxhcmdlIEBmb2xpbyBtYXBzIGNvbnRpZ3VvdXNseSBhbmQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGVcbiYjNDM7ICogcGFnZSBhdCBAYWRkcmVzczogY29uc2VjdXRpdmUgcHJlc2VudCBQVEVzIG1hcHBpbmcgY29uc2VjdXRpdmUgcGFnZXMgb2ZcbiYjNDM7ICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLlxuJiM0MzsgKiBSZXR1cm5zIGF0IGxlYXN0IDEuXG4mIzQzOyAqXG4mIzQzOyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpc1xuJiM0MzsgKiBhbHdheXMgc2FmZTogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLCBhbmQgRk9MTF9XUklURSBpcyBzYXRpc2ZpZWQuXG4mIzQzOyAqIEEgcmVhZC1vbmx5IHJ1biBpcyBvbmx5IHNhZmUgZm9yIGEgcGxhaW4gcmVhZDsgRk9MTF9XUklURSB3b3VsZCBuZWVkIGEgQ09XXG4mIzQzOyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLFxuJiM0MzsgKiBzbyB0aG9zZSBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgcGFnZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG1heDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwdGVfd3JpdGUocHRlKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiAoRk9MTF9XUklURSB8IEZPTExfUElOKSkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoKSBzY2FucyBmb3J3YXJkIGZyb20gQHB0ZXAsIHNvIHRoZSBydW4gbXVzdFxuJiM0MztcdCAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kXG4mIzQzO1x0ICogdGhlIFZNQSwgc2luY2UgYSBsYXJnZSBmb2xpbyBjYW4gYmUgUFRFLW1hcHBlZCBhY3Jvc3MgYSBQTUQgYm91bmRhcnkuXG4mIzQzO1x0ICovXG4mIzQzO1x0bWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuJiM0MztcdFx0ICAodm1hLVx1MDAzZXZtX2VuZCAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbiYjNDM7XHRpZiAobWF4IFx1MDAzYz0gMSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB0ZXAsIFx1MDAyNmJhdGNoX3B0ZSwgbWF4LFxuJiM0MztcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbztcbkBAIC04ODUsNiAmIzQzOzkyOSwxNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0ICovXG4gXHRcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xuIFx0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgUFRFLW1hcHBlZCBsYXJnZSBmb2xpbyBjYW4gYmUgaGFuZGVkIGJhY2sgYXMgYSBjb250aWd1b3VzIGJhdGNoLFxuJiM0MztcdCAqIHNvIHRoZSBjYWxsZXIgYWR2YW5jZXMgb3ZlciB0aGUgd2hvbGUgcnVuIGluIG9uZSBzdGVwIGluc3RlYWQgb2ZcbiYjNDM7XHQgKiB3YWxraW5nIHRoZSBwYWdlIHRhYmxlcyBmb3IgZXZlcnkgcGFnZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4mIzQzO1x0XHQqbnJfcGFnZXMgPSBmb2xsb3dfcHRlX2JhdGNoKHZtYSwgYWRkcmVzcywgZW5kLCBmb2xpbywgcGFnZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgcHRlcCwgcHRlLCBmbGFncyk7XG4gb3V0OlxuIFx0cHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpO1xuIFx0cmV0dXJuIHBhZ2U7XG5AQCAtODk2LDkgJiM0Mzs5NDksOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdCAgICBwdWRfdCAqcHVkcCwgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwbWRfdCAqcG1kLCBwbWR2YWw7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTEyLDcgJiM0Mzs5NjUsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcG1kX3ByZXNlbnQocG1kdmFsKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSlcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuJiM0MztcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuQEAgLTkyNSwyNCAmIzQzOzk3OCwyNCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuJiM0MztcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0fVxuIFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9TUExJVF9QTUQpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4gXHRcdHNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTtcbiBcdFx0LyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqL1xuIFx0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gRVJSX1BUUigtRU5PTUVNKSA6XG4tXHRcdFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4mIzQzO1x0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0fVxuLVx0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdHJldHVybiBwYWdlO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXG4mIzQzO1x0XHRcdFx0ICAgIHA0ZF90ICpwNGRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHB1ZF90ICpwdWRwLCBwdWQ7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTU1LDcgJiM0MzsxMDA4LDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuIFx0XHRpZiAocGFnZSlcbiBcdFx0XHRyZXR1cm4gcGFnZTtcbkBAIC05NjQsMTMgJiM0MzsxMDE3LDEzIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuJiM0MztcdHJldHVybiBmb2xsb3dfcG1kX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBucl9wYWdlcyk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHQgICAgcGdkX3QgKnBnZHAsIHVuc2lnbmVkIGludCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0cDRkX3QgKnA0ZHAsIHA0ZDtcbiBcbkBAIC05ODEsMTUgJiM0MzsxMDM0LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwNGRfcHJlc2VudChwNGQpIHx8IHA0ZF9iYWQocDRkKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgcDRkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiB9XG4gXG4gLyoqXG4gICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4gICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzc1xuICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cFxuJiM0MzsgKiBAZW5kOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RvcCBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxuLSAqIEBwYWdlX21hc2s6IGEgcG9pbnRlciB0byBvdXRwdXQgcGFnZV9tYXNrXG4mIzQzOyAqIEBucl9wYWdlczogb3V0cHV0OyBudW1iZXIgb2YgY29udGlndW91cyBwYWdlcyB0aGUgY2FsbGVyIGNhbiByZWFkXG4gICpcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAgKlxuQEAgLTk5OCwxNSAmIzQzOzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gICogdHJpZ2dlciBhIGZhdWx0IHdpdGggRkFVTFRfRkxBR19VTlNIQVJFIHNldC4gTm90ZSB0aGF0IHVuc2hhcmluZyBpcyBvbmx5XG4gICogcmVsZXZhbnQgd2l0aCBGT0xMX1BJTiBhbmQgIUZPTExfV1JJVEUuXG4gICpcbi0gKiBPbiBvdXRwdXQsIEBwYWdlX21hc2sgaXMgc2V0IGFjY29yZGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgcGFnZS5cbiYjNDM7ICogT24gb3V0cHV0LCBAbnJfcGFnZXMgaG9sZHMgaG93IG1hbnkgY29udGlndW91cyBwYWdlcyB0aGUgZm9saW8gdGhhdCBpbmNsdWRlc1xuJiM0MzsgKiB0aGUgcmV0dXJuZWQgcGFnZSBoYXMgbWFwcGVkIGludG8gdGhpcyBwcm9jZXNzLCBzbyB0aGUgY2FsbGVyIGNhbiBhZHZhbmNlXG4mIzQzOyAqIG92ZXIgYSBsYXJnZSBmb2xpbyBpbiBvbmUgc3RlcC5cbiAgKlxuICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxuICAqIGFuIGVycm9yIHBvaW50ZXIgaWYgdGhlcmUgaXMgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWRcbiAgKiBieSBhIHBhZ2UgZGVzY3JpcHRvciAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXG4gICovXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwZ2RfdCAqcGdkO1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG5AQCAtMTAxNCwxMyAmIzQzOzEwNzAsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpO1xuIFxuLVx0KnBhZ2VfbWFzayA9IDA7XG4mIzQzO1x0Km5yX3BhZ2VzID0gMTtcbiBcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpO1xuIFxuIFx0aWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKVxuIFx0XHRwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGVsc2Vcbi1cdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwZ2QsIGZsYWdzLCBucl9wYWdlcyk7XG4gXG4gXHR2bWFfcGd0YWJsZV93YWxrX2VuZCh2bWEpO1xuIFxuQEAgLTEwODAsOSAmIzQzOzExMzYsMTYgQEAgc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gfVxuIFxuIC8qXG4tICogbW1hcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeS4gIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3Rcbi0gKiBGT0xMX05PV0FJVCwgdGhlIG1tYXBfbG9jayBtYXkgYmUgcmVsZWFzZWQuICBJZiBpdCBpcywgKkBsb2NrZWQgd2lsbCBiZSBzZXRcbi0gKiB0byAwIGFuZCAtRUJVU1kgcmV0dXJuZWQuXG4mIzQzOyAqIFRoZSBjYWxsZXIgaG9sZHMgZWl0aGVyIHRoZSBtbWFwIGxvY2ssIG9yIHRoZSBwZXItVk1BIGxvY2sgKHdpdGhcbiYjNDM7ICogRk9MTF9WTUFfTE9DSyksIG9uIGVudHJ5LiBJZiBAZmxhZ3MgaGFzIEZPTExfVU5MT0NLQUJMRSBidXQgbm90IEZPTExfTk9XQUlULFxuJiM0MzsgKiB0aGUgbW1hcF9sb2NrIG1heSBiZSByZWxlYXNlZC4gSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0IHRvIDAgYW5kXG4mIzQzOyAqIC1FQUdBSU4gcmV0dXJuZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByZXR1cm4gdmFsdWUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBsb2NrIHR5cGU6IGEgZmF1bHQgdGhhdCBtYWRlXG4mIzQzOyAqIHByb2dyZXNzIGJ1dCBuZWVkcyBhIHJldHJ5IChWTV9GQVVMVF9SRVRSWSAvIFZNX0ZBVUxUX0NPTVBMRVRFRCkgaXMgcmVwb3J0ZWRcbiYjNDM7ICogYXMgLUVBR0FJTiBmb3IgYm90aCB0aGUgbW1hcCBsb2NrIGFuZCB0aGUgcGVyLVZNQSBsb2NrIChGT0xMX1ZNQV9MT0NLKS4gT25seVxuJiM0MzsgKiB0aGUgKkBsb2NrZWQgc2lkZSBlZmZlY3QgaXMgbG9jay10eXBlIHNwZWNpZmljLCBhcyB0aGUgcGVyLVZNQSBsb2NrIHBhdGggaGFzXG4mIzQzOyAqIG5vIHVubG9ja2FibGUgbW1hcF9sb2NrIHRvIGRyb3AuXG4gICovXG4gc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLCBib29sIHVuc2hhcmUsXG5AQCAtMTA5Nyw2ICYjNDM7MTE2MCw4IEBAIHN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1dSSVRFO1xuIFx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1JFTU9URSlcbiBcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19SRU1PVEU7XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1ZNQV9MT0NLKVxuJiM0MztcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19WTUFfTE9DSztcbiBcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9VTkxPQ0tBQkxFKSB7XG4gXHRcdGZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfQUxMT1dfUkVUUlkgfCBGQVVMVF9GTEFHX0tJTExBQkxFO1xuIFx0XHQvKlxuQEAgLTExMjUsNDEgJiM0MzsxMTkwLDE5NSBAQCBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdHJldCA9IGhhbmRsZV9tbV9mYXVsdCh2bWEsIGFkZHJlc3MsIGZhdWx0X2ZsYWdzLCBOVUxMKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgZnVsbHkgY29tcGxldGVkIGZhdWx0IChWTV9GQVVMVF9DT01QTEVURUQpIG9yIG9uZSB0aGF0IG5lZWRzIGEgcmV0cnlcbiYjNDM7XHQgKiAoVk1fRkFVTFRfUkVUUlkpIGhhcyByZWxlYXNlZCB0aGUgbG9jayBpdCB3YXMgaG9sZGluZy4gUmVwb3J0IGJvdGggYXNcbiYjNDM7XHQgKiAtRUFHQUlOIHNvIHRoZSBjYWxsZXIgcmV0cmllczogdGhlIG1tYXAgbG9jayBjYWxsZXIgcmV0YWtlcyBpdCBoZXJlLFxuJiM0MztcdCAqIHRoZSBwZXItVk1BIGxvY2sgY2FsbGVyIChGT0xMX1ZNQV9MT0NLKSBmYWxscyBiYWNrIHRvIHRoZSBtbWFwIGxvY2suXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBEcm9wcGluZyB0aGUgbW1hcCBsb2NrIGlzIHJlY29yZGVkIGluICpAbG9ja2VkLiBUaGVyZSBpcyBubyBzdWNoIGxvY2tcbiYjNDM7XHQgKiB0byBkcm9wIHVuZGVyIHRoZSBwZXItVk1BIGxvY2ssIHdoZXJlIEBsb2NrZWQgaXMgbm90IHVzZWQsIHNvIGxlYXZlIGl0XG4mIzQzO1x0ICogYWxvbmUgaW4gdGhhdCBjYXNlLlxuJiM0MztcdCAqL1xuIFx0aWYgKHJldCBcdTAwMjYgVk1fRkFVTFRfQ09NUExFVEVEKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFdpdGggRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQgd2UmIzM5O2xsIG5ldmVyIHJlbGVhc2UgdGhlXG4tXHRcdCAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy5cbi1cdFx0ICovXG4tXHRcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpO1xuLVx0XHQqbG9ja2VkID0gMDtcbi1cbi1cdFx0Lypcbi1cdFx0ICogV2Ugc2hvdWxkIGRvIHRoZSBzYW1lIGFzIFZNX0ZBVUxUX1JFVFJZLCBidXQgbGV0JiMzOTtzIG5vdFxuLVx0XHQgKiByZXR1cm4gLUVCVVNZIHNpbmNlIHRoYXQmIzM5O3Mgbm90IHJlZmxlY3RpbmcgdGhlIHJlYWxpdHkgb2Zcbi1cdFx0ICogd2hhdCBoYXMgaGFwcGVuZWQgLSB3ZSYjMzk7dmUganVzdCBmdWxseSBjb21wbGV0ZWQgYSBwYWdlXG4tXHRcdCAqIGZhdWx0LCB3aXRoIHRoZSBtbWFwIGxvY2sgcmVsZWFzZWQuICBVc2UgLUVBR0FJTiB0byBzaG93XG4tXHRcdCAqIHRoYXQgd2Ugd2FudCB0byB0YWtlIHRoZSBtbWFwIGxvY2sgX2FnYWluXy5cbi1cdFx0ICovXG4mIzQzO1x0XHRpZiAoIShmbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSykpIHtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogV2l0aCBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCB3ZSYjMzk7bGwgbmV2ZXIgcmVsZWFzZSB0aGVcbiYjNDM7XHRcdFx0ICogbW1hcCBsb2NrIGluIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIuIFNhbml0eSBjaGVjayB0aGlzLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKGZhdWx0X2ZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCk7XG4mIzQzO1x0XHRcdCpsb2NrZWQgPSAwO1xuJiM0MztcdFx0fVxuIFx0XHRyZXR1cm4gLUVBR0FJTjtcbiBcdH1cbiBcbiBcdGlmIChyZXQgXHUwMDI2IFZNX0ZBVUxUX0VSUk9SKSB7XG4gXHRcdGludCBlcnIgPSB2bV9mYXVsdF90b19lcnJubyhyZXQsIGZsYWdzKTtcbiBcbi1cdFx0aWYgKGVycilcbi1cdFx0XHRyZXR1cm4gZXJyO1xuLVx0XHRCVUcoKTtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBWTV9GQVVMVF9FUlJPUiBhbHdheXMgZGVjb2RlcyB0byBhbiBlcnJubzsgYSB6ZXJvIGhlcmUgd291bGRcbiYjNDM7XHRcdCAqIG1lYW4gaGFuZGxlX21tX2ZhdWx0KCkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCBjb21iaW5hdGlvbi5cbiYjNDM7XHRcdCAqIFJlcG9ydCAtRUZBVUxUIHJhdGhlciB0aGFuIGNyYXNoOiB1bmRlciB0aGUgcGVyLVZNQSBsb2NrIHRoZVxuJiM0MztcdFx0ICogbW1hcCBsb2NrIHJldHJ5IHByb2R1Y2VzIHRoZSBkZWZpbml0aXZlIHJlc3VsdC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9PTkNFKCFlcnIpO1xuJiM0MztcdFx0cmV0dXJuIGVyciA/IGVyciA6IC1FRkFVTFQ7XG4gXHR9XG4gXG4gXHRpZiAocmV0IFx1MDAyNiBWTV9GQVVMVF9SRVRSWSkge1xuLVx0XHRpZiAoIShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKVxuJiM0MztcdFx0aWYgKCEoZmxhZ3MgXHUwMDI2IEZPTExfVk1BX0xPQ0spIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICEoZmF1bHRfZmxhZ3MgXHUwMDI2IEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUKSlcbiBcdFx0XHQqbG9ja2VkID0gMDtcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHRcdHJldHVybiAtRUFHQUlOO1xuIFx0fVxuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBnZXRfdXNlcl9wYWdlX3ZtYSAtIGdldCBvbmUgcGFnZSBmcm9tIEB2bWEsIHdob3NlIGxvY2sgdGhlIGNhbGxlciBhbHJlYWR5XG4mIzQzOyAqIGhvbGRzOiB0aGUgbW1hcCBsb2NrLCBvciAod2l0aCBGT0xMX1ZNQV9MT0NLKSB0aGUgcGVyLVZNQSBsb2NrLiBXYWxrcyB0aGVcbiYjNDM7ICogcGFnZSB0YWJsZXMsIGZhdWx0aW5nIHRoZSBwYWdlIGluIGlmIG5lZWRlZCwgYW5kIG9uIHN1Y2Nlc3MgcmV0dXJucyBpdCB3aXRoXG4mIzQzOyAqIGEgcmVmZXJlbmNlIGFuZCB0aGUgbG9jayBzdGlsbCBoZWxkLlxuJiM0MzsgKlxuJiM0MzsgKiBSdW5zIGNoZWNrX3ZtYV9mbGFncygpIGxpa2UgX19nZXRfdXNlcl9wYWdlcygpLCBzbyBjYWxsZXJzIG5lZWQgbm90IHByZS1jaGVja1xuJiM0MzsgKiB0aGUgVk1BOyBtb3N0IHJlamVjdGlvbnMgYXJlIHJldHVybmVkIGFzIHRoZWlyIGVycm9yLiBBIFZNX0lPL1ZNX1BGTk1BUCBWTUFcbiYjNDM7ICogaXMgdGhlIGV4Y2VwdGlvbjogYSBDT1dlZCBwYWdlIHdpdGggYSBzdHJ1Y3QgcGFnZSBpcyByZXR1cm5lZCwgd2hpbGUgYSByYXdcbiYjNDM7ICogUEZOIGhhcyBub25lIGFuZCB5aWVsZHMgLUVGQVVMVCwgdG8gYmUgcmVhY2hlZCB2aWEgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MoKS5cbiYjNDM7ICpcbiYjNDM7ICogVW5kZXIgRk9MTF9WTUFfTE9DSywgYW55dGhpbmcgdGhhdCBjYW5ub3QgYmUgZmluaXNoZWQgdW5kZXIgdGhlIHBlci1WTUEgbG9ja1xuJiM0MzsgKiAoYSBkcm9wcGVkIGZhdWx0LCB1c2VyZmF1bHRmZCwgYSBoYXJkIGVycm9yLCBvciAtXHUwMDNlYWNjZXNzKCkgbWVtb3J5KSByZWxlYXNlc1xuJiM0MzsgKiB0aGUgbG9jayBhbmQgcmV0dXJucyAtRUFHQUlOLCBzbyB0aGUgY2FsbGVyIHJldHJpZXMgdW5kZXIgdGhlIG1tYXAgbG9jay5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncylcbiYjNDM7e1xuJiM0MztcdGJvb2wgdm1hX2xvY2tlZCA9IGd1cF9mbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzO1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdGludCBsb2NrZWQgPSAxO1xuJiM0MztcdGJvb2wgcGZubWFwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVHdvIGxvY2sgbW9kZXMgYXJlIHN1cHBvcnRlZDogdGhlIG1tYXAgbG9jaywgd2l0aCBuZWl0aGVyIGZsYWcsIG9yXG4mIzQzO1x0ICogdGhlIHBlci1WTUEgbG9jaywgd2l0aCBib3RoIEZPTExfVk1BX0xPQ0sgYW5kIEZPTExfVU5MT0NLQUJMRS4gQW5cbiYjNDM7XHQgKiB1bmxvY2thYmxlIG1tYXAgZmF1bHQgd291bGQgZHJvcCB0aGUgbG9jayBhbmQgcmVwb3J0IGl0IGluICpsb2NrZWQsXG4mIzQzO1x0ICogd2hpY2ggdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWxheSwgc28gcmVqZWN0IGEgbG9uZSBmbGFnLlxuJiM0MztcdCAqL1xuJiM0MztcdFZNX1dBUk5fT05fT05DRSghKGd1cF9mbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSykgIT0gIShndXBfZmxhZ3MgXHUwMDI2IEZPTExfVU5MT0NLQUJMRSkpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFZhbGlkYXRlIHRoZSBWTUEgdXAgZnJvbnQsIGxpa2UgX19nZXRfdXNlcl9wYWdlcygpLiBBIFZNX0lPL1ZNX1BGTk1BUFxuJiM0MztcdCAqIFZNQSBpcyBub3QgcmVqZWN0ZWQgb3V0cmlnaHQ6IGl0IGNhbiBob2xkIENPV2VkIHBhZ2VzIHRoYXQgaGF2ZSBhXG4mIzQzO1x0ICogc3RydWN0IHBhZ2U7IGxldCBmb2xsb3dfcGFnZV9tYXNrKCkgbG9vayBmb3IgdGhlbSwgYW5kIHRyZWF0IG9ubHlcbiYjNDM7XHQgKiBpdHMgc3RydWN0LXBhZ2UtbGVzcyBQRk5zIGFzIHVucmVhY2hhYmxlLiBPdGhlciByZWplY3Rpb25zXG4mIzQzO1x0ICogKHNlY3JldG1lbSwgcGVybWlzc2lvbnMsIGV0YykgcmVzdWx0IGluIGltbWVkaWF0ZSBmYWlsdXJlLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldCA9IGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgVk1fSU8gfCBWTV9QRk5NQVApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0cGZubWFwID0gdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiAoVk1fSU8gfCBWTV9QRk5NQVApO1xuJiM0MztcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gLUVJTlRSO1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjb25kX3Jlc2NoZWQoKTtcbiYjNDM7XG4mIzQzO1x0XHQvKiBUaGlzIGhlbHBlciBoYW5kcyBiYWNrIGEgc2luZ2xlIHBhZ2U7IGNhcCB0aGUgYmF0Y2ggYXQgb25lLiAqL1xuJiM0MztcdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBhZGRyLCBhZGRyICYjNDM7IFBBR0VfU0laRSxcbiYjNDM7XHRcdFx0XHRcdGd1cF9mbGFncyB8IEZPTExfVE9VQ0ggfCBGT0xMX0dFVCxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNm5yX3BhZ2VzKTtcbiYjNDM7XHRcdGlmICghSVNfRVJSX09SX05VTEwocGFnZSkpIHtcbiYjNDM7XHRcdFx0LyogTWF0Y2ggX19nZXRfdXNlcl9wYWdlcygpOiBmbHVzaCBmb3IgVklWVC9hbGlhc2luZyBjYWNoZXMuICovXG4mIzQzO1x0XHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHBhZ2UsIGFkZHIpO1xuJiM0MztcdFx0XHRmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHBhZ2U7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE5vIHN0cnVjdCBwYWdlOiBhIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgVk1BLCB3aGV0aGVyXG4mIzQzO1x0XHQgKiBzZWVuIGJ5IHRoZSB1cC1mcm9udCBjaGVjayAoQHBmbm1hcCkgb3IgcmVwb3J0ZWQgYXMgLUVFWElTVFxuJiM0MztcdFx0ICogZm9yIGEgcHJlc2VudCBQRk4uIFJldHVybiAtRUZBVUxUIHNvIHRoZSBjYWxsZXIgcmVhY2hlcyBpdFxuJiM0MztcdFx0ICogdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocGZubWFwIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVFWElTVCkge1xuJiM0MztcdFx0XHRyZXQgPSAtRUZBVUxUO1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBBIGhhcmQgZXJyb3IgZnJvbSB0aGUgd2FsayBpdHNlbGYuICovXG4mIzQzO1x0XHRpZiAocGFnZSBcdTAwMjZcdTAwMjYgUFRSX0VSUihwYWdlKSAhPSAtRU1MSU5LKSB7XG4mIzQzO1x0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4mIzQzO1x0XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhlIHBhZ2UgaXMgbm90IHByZXNlbnQsIG9yIG5lZWRzIHVuc2hhcmluZy4gQSByZW1vdGUgZmF1bHRcbiYjNDM7XHRcdCAqIHVuZGVyIHRoZSBwZXItVk1BIGxvY2sgY2Fubm90IGRlbGl2ZXIgdXNlcmZhdWx0ZmQgKHdoaWNoXG4mIzQzO1x0XHQgKiBhc3N1bWVzIGN1cnJlbnQgaXMgdGhlIGZhdWx0aW5nIHRhc2spLCBzbyBmYWxsIGJhY2sgZm9yIHRob3NlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAodm1hX2xvY2tlZCBcdTAwMjZcdTAwMjYgdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuJiM0MztcdFx0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfR0VULFxuJiM0MztcdFx0XHRcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgXHUwMDI2bG9ja2VkKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gLUVBR0FJTilcbiYjNDM7XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XHQvKiBmYXVsdCByZWxlYXNlZCB0aGUgcGVyLVZNQSBsb2NrICovXG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZGVyIHRoZSBwZXItVk1BIGxvY2sgdGhlIGNhbGxlciBjYW5ub3QgcmVhY2ggLVx1MDAzZWFjY2VzcygpIG9yIGFjdCBvbiBhXG4mIzQzO1x0ICogaGFyZCBlcnJvciAoYm90aCBuZWVkIHRoZSBtbWFwIGxvY2spLCBzbyByZWxlYXNlIHRoZSBsb2NrIGFuZCBoYXZlIGl0XG4mIzQzO1x0ICogcmV0cnkgdGhlcmU7IHRoZSBtbWFwLWxvY2sgcGFzcyBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSBlcnJvci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodm1hX2xvY2tlZCkge1xuJiM0MztcdFx0dm1hX2VuZF9yZWFkKHZtYSk7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEVSUl9QVFIocmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hIC0gZmF1bHQgaW4gb25lIHBhZ2Ugb2YgYSByZW1vdGUgbW0gYW5kIGhhbmQgYmFjayB0aGVcbiYjNDM7ICogcGFnZSBhbG9uZyB3aXRoIHRoZSBWTUEgdGhhdCBjb3ZlcnMgaXQuIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBtbWFwX2xvY2suXG4mIzQzOyAqIFJldHVybnMgd2l0aCB0aGUgbW1hcF9sb2NrIHN0aWxsIGhlbGQuXG4mIzQzOyAqXG4mIzQzOyAqIExvb2tzIHVwIHRoZSBWTUEsIGFuZCBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwYWdlIHRocm91Z2hcbiYjNDM7ICogZ2V0X3VzZXJfcGFnZV92bWEoKSwgZmF1bHRpbmcgaW4gdGhlIHBhZ2UgaWYgbmVlZGVkLlxuJiM0MzsgKlxuJiM0MzsgKiBGT0xMX05PV0FJVCBhbmQgRk9MTF9VTkxPQ0tBQkxFIGFyZSByZWplY3RlZDogYm90aCBsZXQgdGhlIGZhdWx0IGhhbmRsZXJcbiYjNDM7ICogZHJvcCB0aGUgbW1hcCBsb2NrLCB3aGljaCBjb3VsZCBpbnZhbGlkYXRlIHRoZSBsb29rZWQtdXAgVk1BLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgIGludCBndXBfZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgKEZPTExfTk9XQUlUIHwgRk9MTF9VTkxPQ0tBQkxFKSkpKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4mIzQzO1xuJiM0MztcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XG4mIzQzO1xuJiM0MztcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xuJiM0MztcdGlmICghdm1hKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4mIzQzO1xuJiM0MztcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7XG4mIzQzO1x0aWYgKElTX0VSUihwYWdlKSlcbiYjNDM7XHRcdHJldHVybiBwYWdlO1xuJiM0MztcbiYjNDM7XHQqdm1hcCA9IHZtYTtcbiYjNDM7XHRyZXR1cm4gcGFnZTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIFdyaXRpbmcgdG8gZmlsZS1iYWNrZWQgbWFwcGluZ3Mgd2hpY2ggcmVxdWlyZSBmb2xpbyBkaXJ0eSB0cmFja2luZyB1c2luZyBHVVBcbiAgKiBpcyBhIGZ1bmRhbWVudGFsbHkgYnJva2VuIG9wZXJhdGlvbiwgYXMga2VybmVsIHdyaXRlIGFjY2VzcyB0byBHVVAgbWFwcGluZ3NcbkBAIC0xMTk3LDEzICYjNDM7MTQxNiwyMSBAQCBzdGF0aWMgYm9vbCB3cml0YWJsZV9maWxlX21hcHBpbmdfYWxsb3dlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJldHVybiAhdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHZtYSk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncylcbiYjNDM7aW50IGNoZWNrX3ZtYV9mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBndXBfZmxhZ3MsXG4mIzQzO1x0XHQgICAgdm1fZmxhZ3NfdCBpZ25vcmVfZmxhZ3MpXG4ge1xuIFx0dm1fZmxhZ3NfdCB2bV9mbGFncyA9IHZtYS1cdTAwM2V2bV9mbGFncztcbiBcdGludCB3cml0ZSA9IChndXBfZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpO1xuIFx0aW50IGZvcmVpZ24gPSAoZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX1JFTU9URSk7XG4gXHRib29sIHZtYV9hbm9uID0gdm1hX2lzX2Fub255bW91cyh2bWEpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogT3B0IG91dCBvZiB0aGUgZmxhZyBjaGVja3MgdGhhdCByZWFkIHRoaXMgbG9jYWwgY29weSAodGhlXG4mIzQzO1x0ICogVk1fSU8vVk1fUEZOTUFQIGdhdGUgYW5kIHRoZSB3cml0ZS9yZWFkL2NvdyBiaXRzKTsgY2hlY2tzIHRoYXRcbiYjNDM7XHQgKiByZS1yZWFkIHZtYS1cdTAwM2V2bV9mbGFncyB0aHJvdWdoIGhlbHBlcnMgYXJlIHVuYWZmZWN0ZWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1fZmxhZ3MgXHUwMDI2PSB+aWdub3JlX2ZsYWdzO1xuJiM0MztcbiBcdGlmICh2bV9mbGFncyBcdTAwMjYgKFZNX0lPIHwgVk1fUEZOTUFQKSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG5AQCAtMTM1OCw3ICYjNDM7MTU4NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4ge1xuIFx0bG9uZyByZXQgPSAwLCBpID0gMDtcbiBcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbi1cdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcbiBcbiBcdGlmICghbnJfcGFnZXMpXG4gXHRcdHJldHVybiAwO1xuQEAgLTEzNzMsNyAmIzQzOzE1OTksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0ZG8ge1xuIFx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2luY3JlbTtcbiBcbiBcdFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xuIFx0XHRpZiAoIXZtYSB8fCBzdGFydCBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbkBAIC0xMzg3LDcgJiM0MzsxNjEzLDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0cmV0ID0gLUVOT01FTTtcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0XHR9XG4tXHRcdFx0XHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkge1xuJiM0MztcdFx0XHRcdGlmIChjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApKSB7XG4gXHRcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdFx0fVxuQEAgLTE0MDAsNyAmIzQzOzE2MjYsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0XHRcdHBhZ2VzID8gXHUwMDI2cGFnZSA6IE5VTEwpO1xuIFx0XHRcdFx0aWYgKHJldClcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0XHRwYWdlX21hc2sgPSAwO1xuJiM0MztcdFx0XHRcdHBhZ2VfaW5jcmVtID0gMTtcbiBcdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuIFx0XHRcdH1cbiBcbkBAIC0xNDA4LDcgJiM0MzsxNjM0LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdHJldCA9IC1FRkFVTFQ7XG4gXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4tXHRcdFx0cmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKTtcbiYjNDM7XHRcdFx0cmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKTtcbiBcdFx0XHRpZiAocmV0KVxuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbkBAIC0xNDIzLDcgJiM0MzsxNjQ5LDggQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcbi1cdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCBcdTAwMjZwYWdlX21hc2spO1xuJiM0MztcdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsXG4mIzQzO1x0XHRcdFx0XHRndXBfZmxhZ3MsIFx1MDAyNnBhZ2VfaW5jcmVtKTtcbiBcdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuIFx0XHRcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXG4gXHRcdFx0XHRcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcbkBAIC0xNDU2LDcgJiM0MzsxNjgzLDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIG5leHRfcGFnZTpcbi1cdFx0cGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgcGFnZV9tYXNrKTtcbiBcdFx0aWYgKHBhZ2VfaW5jcmVtIFx1MDAzZSBucl9wYWdlcylcbiBcdFx0XHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xuIFxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXG5pbmRleCAxODFlNzlmMWQ2YTIwNy4uNzA2ZjdmMDhmZDE4MTUgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oXG5AQCAtMTU5NSw2ICYjNDM7MTU5NSwxMCBAQCBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLFxuICAqL1xuIGludCBfX211c3RfY2hlY2sgdHJ5X2dyYWJfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IHJlZnMsXG4gXHRcdFx0XHR1bnNpZ25lZCBpbnQgZmxhZ3MpO1xuJiM0MztpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncyxcbiYjNDM7XHRcdCAgICB2bV9mbGFnc190IGlnbm9yZV9mbGFncyk7XG4mIzQzO3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncyk7XG4gXG4gLypcbiAgKiBtbS9odWdlX21lbW9yeS5jXG5AQCAtMTY0MSwxMSAmIzQzOzE2NDUsMTMgQEAgZW51bSB7XG4gXHRGT0xMX1VOTE9DS0FCTEUgPSAxIFx1MDAzY1x1MDAzYyAyMSxcbiBcdC8qIFZNQSBsb29rdXAmIzQzO2NoZWNrcyBjb21wYXRpYmxlIHdpdGggTUFEVl9QT1BVTEFURV8oUkVBRHxXUklURSkgKi9cbiBcdEZPTExfTUFEVl9QT1BVTEFURSA9IDEgXHUwMDNjXHUwMDNjIDIyLFxuJiM0MztcdC8qIGNhbGxlciBob2xkcyB0aGUgcGVyLVZNQSBsb2NrLCBub3QgdGhlIG1tYXAgbG9jayAqL1xuJiM0MztcdEZPTExfVk1BX0xPQ0sgPSAxIFx1MDAzY1x1MDAzYyAyMyxcbiB9O1xuIFxuICNkZWZpbmUgSU5URVJOQUxfR1VQX0ZMQUdTIChGT0xMX1RPVUNIIHwgRk9MTF9UUklFRCB8IEZPTExfUkVNT1RFIHwgRk9MTF9QSU4gfCBcXFxuIFx0XHRcdCAgICBGT0xMX0ZBU1RfT05MWSB8IEZPTExfVU5MT0NLQUJMRSB8IFxcXG4tXHRcdFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSlcbiYjNDM7XHRcdFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSB8IEZPTExfVk1BX0xPQ0spXG4gXG4gLypcbiAgKiBJbmRpY2F0ZXMgZm9yIHdoaWNoIHBhZ2VzIHRoYXQgYXJlIHdyaXRlLXByb3RlY3RlZCBpbiB0aGUgcGFnZSB0YWJsZSxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXG5pbmRleCBmZjMzOGMyYWJlOTIzMS4uYWFmNjIwMDE3ZjM0NDIgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnkuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LmNcbkBAIC03MDE1LDg2ICYjNDM7NzAxNSwyNDQgQEAgRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19hY2Nlc3NfcGh5cyk7XG4gI2VuZGlmXG4gXG4gLypcbi0gKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJiMzOTsgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cbiYjNDM7ICogVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5LCBzdWNoIGFzIGFuIGlvcmVtYXBwZWQgZGV2aWNlIG1hcHBpbmcsIG1hcHNcbiYjNDM7ICogUEZOcyB0aGF0IGhhdmUgbm8gc3RydWN0IHBhZ2UsIHNvIGdldF91c2VyX3BhZ2Vfdm1hKCkgY2Fubm90IGZldGNoIGl0XG4mIzQzOyAqIGV2ZW4gdGhvdWdoIHRoZSBwYWdlIHRhYmxlcyBhcmUgcG9wdWxhdGVkLiBJdCBjYW4gc3RpbGwgYmUgcmVhY2hlZFxuJiM0MzsgKiB0aHJvdWdoIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3IgXHUwMDNjPSAwIGlmIEB2bWEgY2Fubm90IGJlXG4mIzQzOyAqIGFjY2Vzc2VkIHRoaXMgd2F5LlxuICAqL1xuLXN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuJiM0MztzdGF0aWMgaW50IGFjY2Vzc19yZW1vdGVfdm1hX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuJiM0MztcdFx0XHRcdCB2b2lkICpidWYsIGludCBsZW4sIGludCB3cml0ZSlcbiYjNDM7e1xuJiM0MzsjaWZkZWYgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UXG4mIzQzO1x0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKVxuJiM0MztcdFx0cmV0dXJuIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTtcbiYjNDM7I2VuZGlmXG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIExvY2sgQG1tIHRvIHJlYWNoIHRoZSByZW1vdGUgcmFuZ2UgW0BhZGRyLCBAYWRkciAmIzQzOyBAbGVuKS5cbiYjNDM7ICpcbiYjNDM7ICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlXG4mIzQzOyAqIGZsYWdzIHBlcm1pdCB0aGUgYWNjZXNzLiBUaGUgUkNVIGZyZWVkIHBhZ2UgdGFibGVzIHRoZW4ga2VlcCBwYWdlIHRhYmxlXG4mIzQzOyAqIG1lbW9yeSBmcm9tIGJlaW5nIHJldXNlZCB3aXRoIHVuZXhwZWN0ZWQgY29udGVudHMgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC5cbiYjNDM7ICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLFxuJiM0MzsgKiBzdGFjayBleHBhbnNpb24sIGFuZCAtXHUwMDNlYWNjZXNzKCkgbWVtb3J5LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm4gd2hldGhlciB0aGUgbW1hcCBsb2NrIGlzIGhlbGQuIFRoZSBwZXItVk1BIGxvY2tlZCBWTUEsIHdoZW4gb25lIGlzXG4mIzQzOyAqIHRha2VuLCBpcyBzdG9yZWQgaW4gKkB2bWFwOyBpdCBpcyBOVUxMIG9uIHRoZSBtbWFwIGxvY2sgcGF0aC4gKkB2bWFwIGlzXG4mIzQzOyAqIHNldCB0byBhbiBFUlJfUFRSKCkgd2hlbiB0aGUgbW1hcCBsb2NrIGNvdWxkIG5vdCBiZSB0YWtlbiwgc28gY2FsbGVycyBtdXN0XG4mIzQzOyAqIGNoZWNrIElTX0VSUigqQHZtYXApIGJlZm9yZSB1c2luZyBlaXRoZXIgcmVzdWx0LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgcmVtb3RlX2FjY2Vzc19sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4mIzQzO1x0XHRcdCAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbiYjNDM7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19QRVJfVk1BX0xPQ0spIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19NTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFKVxuJiM0MztcdHZtYSA9IGxvY2tfdm1hX3VuZGVyX3JjdShtbSwgYWRkcik7XG4mIzQzO1x0aWYgKHZtYSkge1xuJiM0MztcdFx0LyogYWRkciAmIzQzOyBsZW4gbXVzdCBub3Qgd3JhcCwgYW5kIG11c3QgZml0IHdpdGhpbiB0aGUgb25lIFZNQS4gKi9cbiYjNDM7XHRcdGlmIChhZGRyICYjNDM7IGxlbiBcdTAwM2MgYWRkciB8fCBhZGRyICYjNDM7IGxlbiBcdTAwM2Ugdm1hLVx1MDAzZXZtX2VuZCB8fFxuJiM0MztcdFx0ICAgIGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCkpIHtcbiYjNDM7XHRcdFx0dm1hX2VuZF9yZWFkKHZtYSk7XG4mIzQzO1x0XHRcdHZtYSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzO1x0aWYgKCF2bWEpIHtcbiYjNDM7XHRcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpIHtcbiYjNDM7XHRcdFx0KnZtYXAgPSBFUlJfUFRSKC1FSU5UUik7XG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdCp2bWFwID0gTlVMTDtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0KnZtYXAgPSB2bWE7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBSZWxlYXNlIHRoZSBsb2NrIHRha2VuIGJ5IHJlbW90ZV9hY2Nlc3NfbG9jaygpLiAqL1xuJiM0MztzdGF0aWMgdm9pZCByZW1vdGVfYWNjZXNzX3VubG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiYjNDM7XHRcdFx0XHQgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgaGF2ZV9tbWFwX2xvY2spXG4mIzQzO3tcbiYjNDM7XHRpZiAoaGF2ZV9tbWFwX2xvY2spXG4mIzQzO1x0XHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiYjNDM7XHRlbHNlIGlmICh2bWEpXG4mIzQzO1x0XHR2bWFfZW5kX3JlYWQodm1hKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUGVyLXBhZ2UgYWN0aW9uIGZvciBhIHJlbW90ZSBWTSB3YWxrLiBIYW5kbGUgdXAgdG8gQGxlbiBieXRlcyBhdCBAYWRkciBvblxuJiM0MzsgKiBAcGFnZSwgYWR2YW5jaW5nICpAYnVmIHBhc3QgdGhlIGJ5dGVzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGl0LiBAcGFnZSBpc1xuJiM0MzsgKiBOVUxMIGZvciBzdHJ1Y3QtcGFnZS1sZXNzIG1lbW9yeSAoVk1fSU8gLyBWTV9QRk5NQVApIHJlYWNoZWQgdW5kZXIgdGhlIG1tYXBcbiYjNDM7ICogbG9jay5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIGJ5dGVzIGhhbmRsZWQgYXQgQGFkZHIsIDAgdG8gZW5kIHRoZSB3YWxrIChhXG4mIzQzOyAqIHN0cmluZyByZWFjaGVkIGl0cyBOVUwsIG9yIC1cdTAwM2VhY2Nlc3MoKSBtZW1vcnkgY291bGQgbm90IGJlIHJlYWNoZWQpLCBvciBhXG4mIzQzOyAqIG5lZ2F0aXZlIGVycm5vIHRvIGFib3J0LlxuJiM0MzsgKi9cbiYjNDM7dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4mIzQzO1x0XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLFxuJiM0MztcdFx0XHRcdGludCB3cml0ZSk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBXYWxrIHRoZSByZW1vdGUgcmFuZ2UgW0BhZGRyLCBAYWRkciAmIzQzOyBAbGVuKSBvZiBAbW0sIGhhbmRpbmcgZWFjaCBwYWdlIHRvXG4mIzQzOyAqIEBhY3Rpb24uIFVzZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHJhbmdlIGZpdHMgb25lIFZNQSwgYW5kIGZhbGwgYmFjayB0b1xuJiM0MzsgKiB0aGUgbW1hcCBsb2NrIGZvciBtdWx0aS1WTUEgcmFuZ2VzLCBzdGFjayBleHBhbnNpb24gKHdoZW4gQGNhbl9leHBhbmRfc3RhY2tcbiYjNDM7ICogaXMgc2V0KSwgb3Igd2hlbiB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBmaW5pc2ggYSBmYXVsdC5cbiYjNDM7ICpcbiYjNDM7ICogRWFjaCBwYWdlIGlzIGZhdWx0ZWQgaW4gd2l0aCBnZXRfdXNlcl9wYWdlX3ZtYSgpIHVuZGVyIHdoaWNoZXZlciBsb2NrIGlzXG4mIzQzOyAqIGhlbGQuIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIEBhY3Rpb24gY29uc3VtZWQ7ICpAZXJyIGlzIGEgbmVnYXRpdmVcbiYjNDM7ICogZXJybm8gd2hlbiB0aGUgd2FsayBhYm9ydGVkLCBlbHNlIDAuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHJlbW90ZV92bV93YWxrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZixcbiYjNDM7XHRcdFx0ICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBib29sIGNhbl9leHBhbmRfc3RhY2ssXG4mIzQzO1x0XHRcdCAgcmVtb3RlX3ZtX2FjdGlvbiBhY3Rpb24sIGludCAqZXJyKVxuIHtcbiBcdHZvaWQgKm9sZF9idWYgPSBidWY7XG4gXHRpbnQgd3JpdGUgPSBndXBfZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEU7XG4mIzQzO1x0Ym9vbCBoYXZlX21tYXBfbG9jaztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiBcbi1cdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpXG4tXHRcdHJldHVybiAwO1xuJiM0MztcdCplcnIgPSAwO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNldCBGT0xMX1JFTU9URSBzbyBjaGVja192bWFfZmxhZ3MoKSBhcHBsaWVzIHRoZSBzYW1lIHByb3RlY3Rpb24ga2V5XG4mIzQzO1x0ICogcnVsZXMgYXMgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKCkgZGlkOiB0aGUgY3VycmVudCBQS1JVIGlzIG5vdCBjaGVja2VkXG4mIzQzO1x0ICogYWdhaW5zdCBhIFZNQSByZWFjaGVkIG9uIEBtbSYjMzk7cyBiZWhhbGYuXG4mIzQzO1x0ICovXG4mIzQzO1x0Z3VwX2ZsYWdzIHw9IEZPTExfUkVNT1RFO1xuIFxuLVx0LyogVW50YWcgdGhlIGFkZHJlc3MgYmVmb3JlIGxvb2tpbmcgdXAgdGhlIFZNQSAqL1xuLVx0YWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTtcbiYjNDM7XHRhZGRyID0gdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpO1xuIFxuLVx0LyogQXZvaWQgdHJpZ2dlcmluZyB0aGUgdGVtcG9yYXJ5IHdhcm5pbmcgaW4gX19nZXRfdXNlcl9wYWdlcyAqL1xuLVx0aWYgKCF2bWFfbG9va3VwKG1tLCBhZGRyKSBcdTAwMjZcdTAwMjYgIWV4cGFuZF9zdGFjayhtbSwgYWRkcikpXG4mIzQzO1x0aGF2ZV9tbWFwX2xvY2sgPSByZW1vdGVfYWNjZXNzX2xvY2sobW0sIGFkZHIsIGxlbiwgZ3VwX2ZsYWdzLCBcdTAwMjZ2bWEpO1xuJiM0MztcdGlmIChJU19FUlIodm1hKSkge1xuJiM0MztcdFx0KmVyciA9IC1FRkFVTFQ7XG4gXHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiBcbi1cdC8qIGlnbm9yZSBlcnJvcnMsIGp1c3QgY2hlY2sgaG93IG11Y2ggd2FzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCAqL1xuIFx0d2hpbGUgKGxlbikge1xuLVx0XHRpbnQgYnl0ZXMsIG9mZnNldDtcbi1cdFx0dm9pZCAqbWFkZHI7XG4tXHRcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbi1cdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsXG4tXHRcdFx0XHRcdFx0XHQgICAgIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmb2xsX2ZsYWdzID0gZ3VwX2ZsYWdzO1xuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4mIzQzO1x0XHRpbnQgcmV0O1xuIFxuLVx0XHRpZiAoSVNfRVJSKHBhZ2UpKSB7XG4tXHRcdFx0LyogV2UgbWlnaHQgbmVlZCB0byBleHBhbmQgdGhlIHN0YWNrIHRvIGFjY2VzcyBpdCAqL1xuJiM0MztcdFx0aWYgKCF2bWEgfHwgYWRkciBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbiYjNDM7XHRcdFx0LyogQW55IGxvb2t1cCBoZXJlIGhvbGRzIHRoZSBtbWFwIGxvY2suICovXG4mIzQzO1x0XHRcdFZNX0JVR19PTighaGF2ZV9tbWFwX2xvY2spO1xuIFx0XHRcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xuLVx0XHRcdGlmICghdm1hKSB7XG4mIzQzO1x0XHRcdGlmICghdm1hIFx1MDAyNlx1MDAyNiBjYW5fZXhwYW5kX3N0YWNrKSB7XG4mIzQzO1x0XHRcdFx0LyogZXhwYW5kX3N0YWNrKCkgZHJvcHMgdGhlIG1tYXAgbG9jayBpZiBpdCBmYWlscyAqL1xuIFx0XHRcdFx0dm1hID0gZXhwYW5kX3N0YWNrKG1tLCBhZGRyKTtcbi1cbi1cdFx0XHRcdC8qIG1tYXBfbG9jayB3YXMgZHJvcHBlZCBvbiBmYWlsdXJlICovXG4gXHRcdFx0XHRpZiAoIXZtYSlcbi1cdFx0XHRcdFx0cmV0dXJuIGJ1ZiAtIG9sZF9idWY7XG4tXG4tXHRcdFx0XHQvKiBUcnkgYWdhaW4gaWYgc3RhY2sgZXhwYW5zaW9uIHdvcmtlZCAqL1xuLVx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdFx0XHRoYXZlX21tYXBfbG9jayA9IGZhbHNlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGlmICghdm1hKSB7XG4mIzQzO1x0XHRcdFx0KmVyciA9IC1FRkFVTFQ7XG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBGT0xMX1VOTE9DS0FCTEUgbGV0cyB0aGUgcGVyLVZNQSBmYXVsdCByZXRyeSwgZHJvcHBpbmcgdGhlXG4mIzQzO1x0XHQgKiBsb2NrLCBzbyB0aGUgd2FsayBjYW4gZmFsbCBiYWNrIHRvIHRoZSBtbWFwIGxvY2suXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmICghaGF2ZV9tbWFwX2xvY2spXG4mIzQzO1x0XHRcdGZvbGxfZmxhZ3MgfD0gRk9MTF9WTUFfTE9DSyB8IEZPTExfVU5MT0NLQUJMRTtcbiBcbiYjNDM7XHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGZvbGxfZmxhZ3MpO1xuJiM0MztcdFx0aWYgKElTX0VSUihwYWdlKSkge1xuIFx0XHRcdC8qXG4tXHRcdFx0ICogQ2hlY2sgaWYgdGhpcyBpcyBhIFZNX0lPIHwgVk1fUEZOTUFQIFZNQSwgd2hpY2hcbi1cdFx0XHQgKiB3ZSBjYW4gYWNjZXNzIHVzaW5nIHNsaWdodGx5IGRpZmZlcmVudCBjb2RlLlxuJiM0MztcdFx0XHQgKiBnZXRfdXNlcl9wYWdlX3ZtYSgpIHJldHVybnMgLUVBR0FJTiwgd2l0aCB0aGUgcGVyLVZNQVxuJiM0MztcdFx0XHQgKiBsb2NrIHJlbGVhc2VkLCBmb3IgYW55dGhpbmcgaXQgY291bGQgbm90IGZpbmlzaCB1bmRlclxuJiM0MztcdFx0XHQgKiBpdDsgcmV0YWtlIHRoZSBtbWFwIGxvY2sgYW5kIHJldHJ5LiBBIGRpZmZlcmVudCBlcnJvclxuJiM0MztcdFx0XHQgKiB0aGVyZWZvcmUgb25seSBhcnJpdmVzIHVuZGVyIHRoZSBtbWFwIGxvY2ssIHdoZXJlXG4mIzQzO1x0XHRcdCAqIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IGNhbiBiZSByZWFjaGVkIHZpYSAtXHUwMDNlYWNjZXNzKCkuXG4gXHRcdFx0ICovXG4tXHRcdFx0Ynl0ZXMgPSAwO1xuLSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbi1cdFx0XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MpXG4tXHRcdFx0XHRieXRlcyA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGxlbiwgd3JpdGUpO1xuLSNlbmRpZlxuLVx0XHRcdGlmIChieXRlcyBcdTAwM2M9IDApXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0Ynl0ZXMgPSBsZW47XG4tXHRcdFx0b2Zmc2V0ID0gYWRkciBcdTAwMjYgKFBBR0VfU0laRS0xKTtcbi1cdFx0XHRpZiAoYnl0ZXMgXHUwMDNlIFBBR0VfU0laRS1vZmZzZXQpXG4tXHRcdFx0XHRieXRlcyA9IFBBR0VfU0laRS1vZmZzZXQ7XG4tXG4tXHRcdFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xuLVx0XHRcdGlmICh3cml0ZSkge1xuLVx0XHRcdFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxuLVx0XHRcdFx0XHRcdCAgbWFkZHIgJiM0Mzsgb2Zmc2V0LCBidWYsIGJ5dGVzKTtcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHlfbG9jayhmb2xpbyk7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxuLVx0XHRcdFx0XHRcdCAgICBidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpO1xuJiM0MztcdFx0XHRpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUFHQUlOKSB7XG4mIzQzO1x0XHRcdFx0dm1hID0gTlVMTDtcbiYjNDM7XHRcdFx0XHRpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKSB7XG4mIzQzO1x0XHRcdFx0XHQqZXJyID0gLUVGQVVMVDtcbiYjNDM7XHRcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRcdH1cbiYjNDM7XHRcdFx0XHRoYXZlX21tYXBfbG9jayA9IHRydWU7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0fVxuLVx0XHRcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKCFoYXZlX21tYXBfbG9jaykpXG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdHBhZ2UgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHJldCA9IGFjdGlvbih2bWEsIHBhZ2UsIGFkZHIsIFx1MDAyNmJ1ZiwgbGVuLCB3cml0ZSk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuJiM0MztcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdCplcnIgPSByZXQ7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGxlbiAtPSBieXRlcztcbi1cdFx0YnVmICYjNDM7PSBieXRlcztcbi1cdFx0YWRkciAmIzQzOz0gYnl0ZXM7XG4mIzQzO1x0XHRhZGRyICYjNDM7PSByZXQ7XG4mIzQzO1x0XHRsZW4gLT0gcmV0O1xuIFx0fVxuLVx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4mIzQzO1xuJiM0MztcdHJlbW90ZV9hY2Nlc3NfdW5sb2NrKG1tLCB2bWEsIGhhdmVfbW1hcF9sb2NrKTtcbiBcbiBcdHJldHVybiBidWYgLSBvbGRfYnVmO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogQ29weSBvbmUgcGFnZSYjMzk7cyB3b3J0aCBvZiBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pIHRvIG9yIGZyb20gKkBidWYuIFJlYWNoZXNcbiYjNDM7ICogc3RydWN0LXBhZ2UtbGVzcyBWTV9JTyAvIFZNX1BGTk1BUCBtZW1vcnkgdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBhY2Nlc3Nfdm1fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4mIzQzO1x0XHRcdCAgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuJiM0MztcdGludCBieXRlcywgb2Zmc2V0O1xuJiM0MztcdHZvaWQgKm1hZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoIXBhZ2UpIHtcbiYjNDM7XHRcdGJ5dGVzID0gYWNjZXNzX3JlbW90ZV92bWFfb3BzKHZtYSwgYWRkciwgKmJ1ZiwgbGVuLCB3cml0ZSk7XG4mIzQzO1x0XHRpZiAoYnl0ZXMgXHUwMDNlIDApXG4mIzQzO1x0XHRcdCpidWYgJiM0Mzs9IGJ5dGVzO1xuJiM0MztcdFx0cmV0dXJuIGJ5dGVzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Ynl0ZXMgPSBsZW47XG4mIzQzO1x0b2Zmc2V0ID0gYWRkciBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuJiM0MztcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuJiM0MztcdFx0Ynl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XG4mIzQzO1xuJiM0MztcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XG4mIzQzO1x0aWYgKHdyaXRlKSB7XG4mIzQzO1x0XHRjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsIG1hZGRyICYjNDM7IG9mZnNldCwgKmJ1ZiwgYnl0ZXMpO1xuJiM0MztcdFx0Zm9saW9fbWFya19kaXJ0eV9sb2NrKGZvbGlvKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsICpidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpO1xuJiM0MztcdH1cbiYjNDM7XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbiYjNDM7XG4mIzQzO1x0KmJ1ZiAmIzQzOz0gYnl0ZXM7XG4mIzQzO1x0cmV0dXJuIGJ5dGVzO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJiMzOTsgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4mIzQzO1x0XHRcdCAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcbiYjNDM7e1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgdHJ1ZSxcbiYjNDM7XHRcdFx0ICAgICAgYWNjZXNzX3ZtX3BhZ2UsIFx1MDAyNmVycik7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogYWNjZXNzX3JlbW90ZV92bSAtIGFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlXG4gICogQG1tOlx0XHR0aGUgbW1fc3RydWN0IG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZVxuQEAgLTcxMzgsODQgJiM0Mzs3Mjk2LDY3IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFjY2Vzc19wcm9jZXNzX3ZtKTtcbiBcbiAjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4gLypcbi0gKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJiMzOTtzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4tICogSWYgdGhlcmUgaXMgYW55IGVycm9yIHJldHVybiAtRUZBVUxULlxuJiM0MzsgKiBDb3B5IGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gQGFkZHIgaW50byAqQGJ1ZiwgdXAgdG8gQGxlbiBieXRlcyxcbiYjNDM7ICogc3RvcHBpbmcgYXQgdGhlIE5VTC4gc3Ryc2NweSgpIGFsd2F5cyBOVUwgdGVybWluYXRlcywgc28gcmVjb3B5IHRoZSBsYXN0XG4mIzQzOyAqIGJ5dGUgb2YgYSBwYWdlIHdoZW4gbW9yZSBwYWdlcyBmb2xsb3cuIEEgc3RyaW5nIGlzIG5ldmVyIHJlYWQgZnJvbVxuJiM0MzsgKiBzdHJ1Y3QtcGFnZS1sZXNzIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeS5cbiAgKi9cbi1zdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4mIzQzO3N0YXRpYyBpbnQgY29weV92bV9zdHIoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxuJiM0MztcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxuIHtcbi1cdHZvaWQgKm9sZF9idWYgPSBidWY7XG4tXHRpbnQgZXJyID0gMDtcbi1cbi1cdCooY2hhciAqKWJ1ZiA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xuJiM0MztcdHZvaWQgKm1hZGRyO1xuIFxuLVx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSlcbiYjNDM7XHRpZiAoIXBhZ2UpXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFxuLVx0YWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTtcbiYjNDM7XHRieXRlcyA9IGxlbjtcbiYjNDM7XHRvZmZzZXQgPSBhZGRyIFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4mIzQzO1x0aWYgKGJ5dGVzIFx1MDAzZSBQQUdFX1NJWkUgLSBvZmZzZXQpXG4mIzQzO1x0XHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcbiBcbi1cdC8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi9cbi1cdGlmICghdm1hX2xvb2t1cChtbSwgYWRkcikpIHtcbi1cdFx0ZXJyID0gLUVGQVVMVDtcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuJiM0MztcdG1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTtcbiYjNDM7XHRyZXR2YWwgPSBzdHJzY3B5KCpidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpO1xuJiM0MztcdGlmIChyZXR2YWwgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHQvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICovXG4mIzQzO1x0XHQqYnVmICYjNDM7PSByZXR2YWw7XG4mIzQzO1x0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFx0fVxuIFxuLVx0d2hpbGUgKGxlbikge1xuLVx0XHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xuLVx0XHR2b2lkICptYWRkcjtcbi1cdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbi1cdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbiYjNDM7XHQqYnVmICYjNDM7PSBieXRlcyAtIDE7XG4mIzQzO1x0aWYgKGJ5dGVzICE9IGxlbikge1xuJiM0MztcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIgJiM0MzsgYnl0ZXMgLSAxLCAqYnVmLFxuJiM0MztcdFx0XHRcdCAgICBtYWRkciAmIzQzOyAoUEFHRV9TSVpFIC0gMSksIDEpO1xuJiM0MztcdFx0KmJ1ZiAmIzQzOz0gMTtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4gXG4tXHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbi1cdFx0aWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVHJlYXQgYXMgYSB0b3RhbCBmYWlsdXJlIGZvciBub3cgdW50aWwgd2UgZGVjaWRlIGhvd1xuLVx0XHRcdCAqIHRvIGhhbmRsZSB0aGUgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGNhc2UgYW5kXG4tXHRcdFx0ICogc3RhY2sgZXhwYW5zaW9uLlxuLVx0XHRcdCAqL1xuLVx0XHRcdCooY2hhciAqKWJ1ZiA9ICYjMzk7XFwwJiMzOTs7XG4tXHRcdFx0ZXJyID0gLUVGQVVMVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuJiM0MztcdHJldHVybiBieXRlcztcbiYjNDM7fVxuIFxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdGJ5dGVzID0gbGVuO1xuLVx0XHRvZmZzZXQgPSBhZGRyIFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4tXHRcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuLVx0XHRcdGJ5dGVzID0gUEFHRV9TSVpFIC0gb2Zmc2V0O1xuLVxuLVx0XHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XG4tXHRcdHJldHZhbCA9IHN0cnNjcHkoYnVmLCBtYWRkciAmIzQzOyBvZmZzZXQsIGJ5dGVzKTtcbi1cdFx0aWYgKHJldHZhbCBcdTAwM2U9IDApIHtcbi1cdFx0XHQvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi9cbi1cdFx0XHRidWYgJiM0Mzs9IHJldHZhbDtcbi1cdFx0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuJiM0MzsvKlxuJiM0MzsgKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJiMzOTtzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4mIzQzOyAqIElmIHRoZXJlIGlzIGFueSBlcnJvciByZXR1cm4gLUVGQVVMVC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiYjNDM7XHRcdFx0XHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4mIzQzO3tcbiYjNDM7XHRpbnQgYnl0ZXMsIGVycjtcbiBcbi1cdFx0YnVmICYjNDM7PSBieXRlcyAtIDE7XG4tXHRcdC8qXG4tXHRcdCAqIEJlY2F1c2Ugc3Ryc2NweSBhbHdheXMgTlVMIHRlcm1pbmF0ZXMgd2UgbmVlZCB0b1xuLVx0XHQgKiBjb3B5IHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHBhZ2UgaWYgd2UgYXJlIGdvaW5nIHRvXG4tXHRcdCAqIGxvYWQgbW9yZSBwYWdlc1xuLVx0XHQgKi9cbi1cdFx0aWYgKGJ5dGVzICE9IGxlbikge1xuLVx0XHRcdGFkZHIgJiM0Mzs9IGJ5dGVzIC0gMTtcbi1cdFx0XHRjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgYnVmLCBtYWRkciAmIzQzOyAoUEFHRV9TSVpFIC0gMSksIDEpO1xuLVx0XHRcdGJ1ZiAmIzQzOz0gMTtcbi1cdFx0XHRhZGRyICYjNDM7PSAxO1xuLVx0XHR9XG4tXHRcdGxlbiAtPSBieXRlcztcbiYjNDM7XHQqKGNoYXIgKilidWYgPSAmIzM5O1xcMCYjMzk7O1xuIFxuLVx0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbiYjNDM7XHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcbiYjNDM7XHRcdFx0ICAgICAgIGNvcHlfdm1fc3RyLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdC8qIFRoZSBjb250cmFjdCBndWFyYW50ZWVzIGEgdGVybWluYXRlZCBidWZmZXIgZXZlbiBvbiBlcnJvci4gKi9cbiYjNDM7XHRcdCgoY2hhciAqKWJ1ZilbYnl0ZXNdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4gXHR9XG4gXG4tb3V0OlxuLVx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4tXHRpZiAoZXJyKVxuLVx0XHRyZXR1cm4gZXJyO1xuLVx0cmV0dXJuIGJ1ZiAtIG9sZF9idWY7XG4mIzQzO1x0cmV0dXJuIGJ5dGVzO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmNcbmluZGV4IDFjNzdkNWRjMDZlOWZhLi5iMzZmMmUyMTliOGY0OSAxMDA2NDRcbi0tLSBhL21tL3JtYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcm1hcC5jXG5AQCAtMjgzOCw3ICYjNDM7MjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdCAqIChub24tZGV2aWNlLWV4Y2x1c2l2ZSkgUFRFIGFuZCBpc3N1ZSBhIE1NVV9OT1RJRllfRVhDTFVTSVZFLlxuIFx0ICovXG4gcmV0cnk6XG4tXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuJiM0MztcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIGFkZHIsXG4gXHRcdFx0XHRcdEZPTExfR0VUIHwgRk9MTF9XUklURSB8IEZPTExfU1BMSVRfUE1ELFxuIFx0XHRcdFx0XHRcdTAwMjZ2bWEpO1xuIFx0aWYgKElTX0VSUihwYWdlKSlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG5pbmRleCBlNmRmOTY4ZjA5NzFjOC4uNmI5MTdhNGY3M2UwMGYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC04Myw2ICYjNDM7ODMsNyBAQCBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbXJlbGVhc2VfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBtcmVtYXBfZG9udHVubWFwXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1yZW1hcF90ZXN0XG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1zZWFsX3Rlc3RcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IG10aHBfZ3VwX2Nvd190ZXN0XG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG9uLWZhdWx0LWxpbWl0XG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHBhZ2VtYXBfaW9jdGxcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcGZubWFwXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbXRocF9ndXBfY293X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJlZTMyOWQ4NjQxYzBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmNcbkBAIC0wLDAgJiM0MzsxLDIxMyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzOy8qXG4mIzQzOyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtXHUwMDNlIGZvbGxvd19wYWdlX21hc2sgLVx1MDAzZVxuJiM0MzsgKiBmb2xsb3dfcHRlX2JhdGNoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHBhZ2VzIGZvciBhIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9cbiYjNDM7ICogKG1USFApLCBpbmNsdWRpbmcgdGhhdCBDT1cgY29waWVzIHByb2R1Y2UgdGhlIHJpZ2h0IGNvbnRlbnQuXG4mIzQzOyAqXG4mIzQzOyAqIFVzZXMgdGhlIENPTkZJR19HVVBfVEVTVCBQSU5fTE9OR1RFUk0gaW50ZXJmYWNlOiBTVEFSVCBwaW5zIGEgcmFuZ2Ugb24gdGhlXG4mIzQzOyAqIHNsb3cgcGF0aCwgUkVBRCBjb3BpZXMgdGhlIHBpbm5lZCBwYWdlcyYjMzk7IGJ5dGVzIGJhY2sgc28gd2UgY2FuIGNvbXBhcmUgdGhlbVxuJiM0MzsgKiBhZ2FpbnN0IHRoZSBwYXR0ZXJuIHdlIHdyb3RlLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGludC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBBUlJBWV9TSVpFKGEpXHQoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIEdVUF9ERVYgXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RBUlRcdF9JT1coJiMzOTtnJiMzOTssIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcbiYjNDM7I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QXHRfSU8oJiMzOTtnJiMzOTssIDgpXG4mIzQzOyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfUkVBRFx0X0lPVygmIzM5O2cmIzM5OywgOSwgX191NjQpXG4mIzQzOyNkZWZpbmUgVVNFX1dSSVRFXHQxXG4mIzQzOyNkZWZpbmUgVVNFX0ZBU1RcdDJcbiYjNDM7XG4mIzQzO3N0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCB7XG4mIzQzO1x0X191NjQgYWRkcjtcbiYjNDM7XHRfX3U2NCBzaXplO1xuJiM0MztcdF9fdTMyIGZsYWdzO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBPUkRFUl9LQlx0NjRcbiYjNDM7I2RlZmluZSBOUl9GT0xJT1NcdDE2XG4mIzQzOyNkZWZpbmUgUkVHSU9OXHRcdCgoc2l6ZV90KU9SREVSX0tCICogMTAyNCAqIE5SX0ZPTElPUylcbiYjNDM7XG4mIzQzO3N0YXRpYyBsb25nIFBTO1xuJiM0MztzdGF0aWMgaW50IGZhaWxzO1xuJiM0MztzdGF0aWMgaW50IHRhcDtcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIG9rKGludCBjb25kLCBjb25zdCBjaGFyICpkZXNjKVxuJiM0Mzt7XG4mIzQzO1x0cHJpbnRmKFwmIzM0OyVzICVkICVzXFxuXCYjMzQ7LCBjb25kID8gXCYjMzQ7b2tcJiMzNDsgOiBcJiMzNDtub3Qgb2tcJiMzNDssICYjNDM7JiM0Mzt0YXAsIGRlc2MpO1xuJiM0MztcdGlmICghY29uZClcbiYjNDM7XHRcdGZhaWxzJiM0MzsmIzQzOztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRGV0ZXJtaW5pc3RpYywgcGVyLXBhZ2UtZGlzdGluY3QgcGF0dGVybiBzbyBhbnkgbWlzLW9yZGVyIG9yIGxlYWsgc2hvd3MuICovXG4mIzQzO3N0YXRpYyB2b2lkIGZpbGwoY2hhciAqYmFzZSwgc2l6ZV90IHN6LCB1aW50MzJfdCBzYWx0KVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChzaXplX3Qgb2ZmID0gMDsgb2ZmIFx1MDAzYyBzejsgb2ZmICYjNDM7PSBQUykge1xuJiM0MztcdFx0dWludDMyX3QgayA9IG9mZiAvIFBTO1xuJiM0MztcdFx0dWludDY0X3QgdiA9ICgodWludDY0X3Qpc2FsdCBcdTAwM2NcdTAwM2MgMzIpIF4gKGsgKiAweDlFMzc3OUIxdSAmIzQzOyAweDEyMzQpO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBQUzsgaSAmIzQzOz0gc2l6ZW9mKHYpKVxuJiM0MztcdFx0XHRtZW1jcHkoYmFzZSAmIzQzOyBvZmYgJiM0MzsgaSwgXHUwMDI2diwgc2l6ZW9mKHYpKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3N5c2ZzKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnZhbClcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0aW50IHIgPSB3cml0ZShmZCwgdmFsLCBzdHJsZW4odmFsKSk7XG4mIzQzO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gciBcdTAwM2MgMCA/IC0xIDogMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRm9yY2Ugc3ViLVBNRCA2NGtCIG1USFAgb25seSwgc28gZmF1bHRzIHByb2R1Y2UgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MuICovXG4mIzQzO3N0YXRpYyB2b2lkIHNldHVwX210aHAodm9pZClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnRocCA9IFwmIzM0Oy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlXCYjMzQ7O1xuJiM0MztcdGNoYXIgcFsyNTZdO1xuJiM0MztcdHN0YXRpYyBjb25zdCBpbnQga2JbXSA9IHsgMTYsIDMyLCA2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCB9O1xuJiM0MztcbiYjNDM7XHR3c3lzZnMoXCYjMzQ7L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZFwmIzM0OywgXCYjMzQ7bmV2ZXJcJiMzNDspO1xuJiM0MztcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGtiKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHNucHJpbnRmKHAsIHNpemVvZihwKSwgXCYjMzQ7JXMvaHVnZXBhZ2VzLSVka0IvZW5hYmxlZFwmIzM0OywgdGhwLCBrYltpXSk7XG4mIzQzO1x0XHR3c3lzZnMocCwga2JbaV0gPT0gT1JERVJfS0IgPyBcJiMzNDthbHdheXNcJiMzNDsgOiBcJiMzNDtuZXZlclwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDb3VudCBob3cgbWFueSBwYWdlcyBzaXQgaW4gYSBjb250aWd1b3VzIFx1MDAzZT1PUkRFUl9LQiBQRk4gcnVuICh2aWEgcGFnZW1hcCkuICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfbGFyZ2VfcGFnZXMoY2hhciAqYmFzZSwgc2l6ZV90IHN6KVxuJiM0Mzt7XG4mIzQzO1x0aW50IHBtID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRzaXplX3QgbiA9IHN6IC8gUFMsIGxhcmdlID0gMDtcbiYjNDM7XHR1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7XG4mIzQzO1xuJiM0MztcdGlmIChwbSBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRmb3IgKHNpemVfdCBrID0gMDsgayBcdTAwM2MgbjsgayYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVpbnQ2NF90IGVudDtcbiYjNDM7XHRcdG9mZl90IGlkeCA9ICgodWludHB0cl90KWJhc2UgJiM0MzsgayAqIFBTKSAvIFBTICogc2l6ZW9mKGVudCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHByZWFkKHBtLCBcdTAwMjZlbnQsIHNpemVvZihlbnQpLCBpZHgpICE9IHNpemVvZihlbnQpIHx8XG4mIzQzO1x0XHQgICAgIShlbnQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyA2MykpKVxuJiM0MztcdFx0XHRwZm5ba10gPSAwO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRwZm5ba10gPSBlbnQgXHUwMDI2ICgoMVVMTCBcdTAwM2NcdTAwM2MgNTUpIC0gMSk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKHBtKTtcbiYjNDM7XHRmb3IgKHNpemVfdCBrID0gMDsgayBcdTAwM2MgbjsgayYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoayAmIzQzOyAxIFx1MDAzYyBuIFx1MDAyNlx1MDAyNiBwZm5ba10gXHUwMDI2XHUwMDI2IHBmbltrICYjNDM7IDFdID09IHBmbltrXSAmIzQzOyAxKVxuJiM0MztcdFx0XHRsYXJnZSYjNDM7JiM0Mzs7XG4mIzQzO1x0ZnJlZShwZm4pO1xuJiM0MztcdHJldHVybiBsYXJnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUGluIEBiYXNlLi5Ac3ogb24gdGhlIHNsb3cgcGF0aCwgcmVhZCB0aGUgcGlubmVkIGJ5dGVzIGJhY2ssIGNvbXBhcmUgdG8gZXhwLiAqL1xuJiM0MztzdGF0aWMgaW50IHBpbl92ZXJpZnkoaW50IGZkLCBjaGFyICpiYXNlLCBzaXplX3Qgc3osIHVpbnQzMl90IHdyLCBjaGFyICpleHApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QgYSA9IHtcbiYjNDM7XHRcdC5hZGRyID0gKHVpbnRwdHJfdCliYXNlLCAuc2l6ZSA9IHN6LFxuJiM0MztcdFx0LmZsYWdzID0gd3IgPyBVU0VfV1JJVEUgOiAwLFx0XHQvKiBVU0VfRkFTVCB1bnNldCA9XHUwMDNlIHNsb3cgKi9cbiYjNDM7XHR9O1xuJiM0MztcdGNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbiYjNDM7XHRfX3U2NCBnYSA9ICh1aW50cHRyX3QpZ290O1xuJiM0MztcdGludCByYyA9IC0xO1xuJiM0MztcbiYjNDM7XHRpZiAoZ290ID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVCwgXHUwMDI2YSkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtTVEFSVCglcykgZmFpbGVkOiAlc1xcblwmIzM0OyxcbiYjNDM7XHRcdFx0d3IgPyBcJiMzNDt3cml0ZVwmIzM0OyA6IFwmIzM0O3JlYWRcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9SRUFELCBcdTAwMjZnYSkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtSRUFEIGZhaWxlZDogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aW9jdGwoZmQsIFBJTl9MT05HVEVSTV9URVNUX1NUT1ApO1xuJiM0MztcdHJjID0gbWVtY21wKGdvdCwgZXhwLCBzeikgPyAxIDogMDtcbiYjNDM7b3V0OlxuJiM0MztcdG11bm1hcChnb3QsIHN6KTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRQUyA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRzZXR1cF9tdGhwKCk7XG4mIzQzO1xuJiM0MztcdGludCBmZCA9IG9wZW4oR1VQX0RFViwgT19SRFdSKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7b3BlbiAlczogJXMgKENPTkZJR19HVVBfVEVTVD8pXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRHVVBfREVWLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0cmV0dXJuIDI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjaGFyICpyID0gbW1hcChOVUxMLCBSRUdJT04sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHIgPT0gTUFQX0ZBSUxFRCkge1xuJiM0MztcdFx0cGVycm9yKFwmIzM0O21tYXBcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIDI7XG4mIzQzO1x0fVxuJiM0MztcdGZpbGwociwgUkVHSU9OLCAweEExKTtcdFx0XHRcdC8qIHBhdHRlcm4gUCAqL1xuJiM0MztcdGNoYXIgKmV4cFAgPSBtYWxsb2MoUkVHSU9OKTtcbiYjNDM7XG4mIzQzO1x0bWVtY3B5KGV4cFAsIHIsIFJFR0lPTik7XG4mIzQzO1xuJiM0MztcdGludCBsYXJnZSA9IGNvdW50X2xhcmdlX3BhZ2VzKHIsIFJFR0lPTik7XG4mIzQzO1xuJiM0MztcdHByaW50ZihcJiMzNDsjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcXG5cJiMzNDssXG4mIzQzO1x0ICAgICAgIGxhcmdlLCBSRUdJT04gLyBQUyk7XG4mIzQzO1x0aWYgKGxhcmdlIFx1MDAzYyAoaW50KShSRUdJT04gLyBQUykgLyA0KVxuJiM0MztcdFx0cHJpbnRmKFwmIzM0OyMgV0FSTjogbGl0dGxlIG1USFAgYmFja2luZzsgYmF0Y2ggcGF0aCBsaWdodGx5IGNvdmVyZWRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBBOiByZWFkIHBpbiBvdmVyIHdyaXRhYmxlIG1USFAgLVx1MDAzZSBiYXRjaGVzIC1cdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXG4mIzQzO1x0b2socGluX3ZlcmlmeShmZCwgciwgUkVHSU9OLCAwLCBleHBQKSA9PSAwLFxuJiM0MztcdCAgIFwmIzM0O3Nsb3cgcmVhZC1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHNcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBCOiB3cml0ZSBwaW4gLVx1MDAzZSBGT0xMX1dSSVRFIGJhdGNoIHBhdGggLVx1MDAzZSBjb250ZW50IG11c3QgZXF1YWwgUC4gKi9cbiYjNDM7XHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDEsIGV4cFApID09IDAsXG4mIzQzO1x0ICAgXCYjMzQ7c2xvdyB3cml0ZS1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHNcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBDOiBDT1cgaXNvbGF0aW9uLiBDaGlsZCB3cml0ZS1waW5zICh1bnNoYXJlcykgdGhlbiByZXdyaXRlczsgcGFyZW50IFAuICovXG4mIzQzO1x0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRpZiAocGlkID09IDApIHtcbiYjNDM7XHRcdGludCBjZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7XG4mIzQzO1x0XHRpbnQgYSA9IHBpbl92ZXJpZnkoY2ZkLCByLCBSRUdJT04sIDEsIGV4cFApO1x0LyogQ09XIGNvcHkgPT0gUCAqL1xuJiM0MztcbiYjNDM7XHRcdGZpbGwociwgUkVHSU9OLCAweEIyKTtcdFx0XHQvKiBjaGlsZCB3cml0ZXMgUSAqL1xuJiM0MztcdFx0X2V4aXQoYSA9PSAwID8gMCA6IDEpO1xuJiM0MztcdH1cbiYjNDM7XHRpbnQgc3QgPSAwO1xuJiM0MztcbiYjNDM7XHR3YWl0cGlkKHBpZCwgXHUwMDI2c3QsIDApO1xuJiM0MztcdG9rKFdJRkVYSVRFRChzdCkgXHUwMDI2XHUwMDI2IFdFWElUU1RBVFVTKHN0KSA9PSAwLFxuJiM0MztcdCAgIFwmIzM0O2NoaWxkIHdyaXRlLXBpbiBhZnRlciBDT1cgcmV0dXJucyBjb3JyZWN0IChjb3BpZWQpIGNvbnRlbnRzXCYjMzQ7KTtcbiYjNDM7XHRvayhtZW1jbXAociwgZXhwUCwgUkVHSU9OKSA9PSAwLFxuJiM0MztcdCAgIFwmIzM0O3BhcmVudCBjb250ZW50cyBpbnRhY3QgYWZ0ZXIgY2hpbGQgQ09XIHdyaXRlc1wmIzM0Oyk7XG4mIzQzO1x0LyogRDogcGFyZW50IHJlYWQtcGluIGFnYWluIGFmdGVyIHRoZSBDT1cgc3BsaXQgc3RpbGwgY29ycmVjdC4gKi9cbiYjNDM7XHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDAsIGV4cFApID09IDAsXG4mIzQzO1x0ICAgXCYjMzQ7cGFyZW50IHNsb3cgcmVhZC1waW4gYWZ0ZXIgQ09XIHN0aWxsIGNvcnJlY3RcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwcmludGYoXCYjMzQ7IyB0b3RhbHM6IHBhc3M6JWQgZmFpbDolZFxcblwmIzM0OywgdGFwIC0gZmFpbHMsIGZhaWxzKTtcbiYjNDM7XHRyZXR1cm4gZmFpbHMgPyAxIDogMDtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmNcbmluZGV4IDRmNTUwODIyMzg1YTIwLi42ZmY1ZDEwMjk1MTdlMyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuY1xuQEAgLTMxLDYgJiM0MzszMSw3IEBAIHN0YXRpYyBzaWdqbXBfYnVmIHNpZ2ptcF9idWZfZW52O1xuIHN0YXRpYyBjaGFyICpmaWxlID0gXCYjMzQ7L2Rldi9tZW1cJiMzNDs7XG4gc3RhdGljIG9mZl90IGZpbGVfb2Zmc2V0O1xuIHN0YXRpYyBpbnQgZmQ7XG4mIzQzO3N0YXRpYyBpbnQgdGFyZ2V0X2lzX3JhbTtcbiBcbiBzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnKVxuIHtcbkBAIC0xMTMsNiAmIzQzOzExNCw3IEBAIHN0YXRpYyB2b2lkIHBmbm1hcF9pbml0KHZvaWQpXG4gXHRcdGlmIChlcnIpXG4gXHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Q2Fubm90IGZpbmQgcmFtIHRhcmdldCBpbiAmIzM5Oy9wcm9jL2lvbWVtJiMzOTs6ICVzXFxuXCYjMzQ7LFxuIFx0XHRcdFx0ICAgICAgIHN0cmVycm9yKC1lcnIpKTtcbiYjNDM7XHRcdHRhcmdldF9pc19yYW0gPSAxO1xuIFx0fSBlbHNlIHtcbiBcdFx0ZmlsZV9vZmZzZXQgPSAwO1xuIFx0fVxuQEAgLTI3MSw2ICYjNDM7MjczLDcwIEBAIFRFU1RfRihwZm5tYXAsIGZvcmspXG4gXHRBU1NFUlRfRVEocmV0LCAwKTtcbiB9XG4gXG4mIzQzO1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyICpwcml2LCAqYnVmO1xuJiM0MztcdHNzaXplX3QgcmM7XG4mIzQzO1x0aW50IG1lbV9mZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIENPV2VkIHBhZ2UgaW4gYSBWTV9QRk5NQVAgbWFwcGluZyBoYXMgYSBzdHJ1Y3QgcGFnZSwgc28gcmVhZGluZyBpdFxuJiM0MztcdCAqIHRocm91Z2ggL3Byb2Mvc2VsZi9tZW0gLS0gX19hY2Nlc3NfcmVtb3RlX3ZtKCkgLVx1MDAzZSBnZXRfdXNlcl9wYWdlX3ZtYSgpXG4mIzQzO1x0ICogLS0gcmV0dXJucyBpdCBkaXJlY3RseSwgaW5zdGVhZCBvZiByb3V0aW5nIHRvIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCksXG4mIzQzO1x0ICogd2hpY2ggaW9yZW1hcHMgdGhlIFBGTiBhbmQgY2Fubm90IHJlYWNoIGEgQ09XZWQgUkFNIHBhZ2UuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBNYXAgdGhlIGZpbGUgTUFQX1BSSVZBVEUgYW5kIHdyaXRhYmxlLCB3cml0ZSB0byBDT1cgYSBwYWdlIGludG8gYW5vblxuJiM0MztcdCAqIG1lbW9yeSwgdGhlbiByZWFkIHRoZSBwYWdlIGJhY2sgdGhyb3VnaCAvcHJvYy9zZWxmL21lbS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzZWxmLVx1MDAzZXNpemUyID0gc2VsZi1cdTAwM2VwYWdlc2l6ZTtcbiYjNDM7XHRzZWxmLVx1MDAzZWFkZHIyID0gbW1hcChOVUxMLCBzZWxmLVx1MDAzZXNpemUyLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHQgICBNQVBfUFJJVkFURSwgZmQsIGZpbGVfb2Zmc2V0KTtcbiYjNDM7XHRpZiAoc2VsZi1cdTAwM2VhZGRyMiA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0U0tJUChyZXR1cm4sIFwmIzM0O0Nhbm5vdCBjcmVhdGUgYSB3cml0YWJsZSBwcml2YXRlIHBmbm1hcCBtYXBwaW5nXCYjMzQ7KTtcbiYjNDM7XHRwcml2ID0gc2VsZi1cdTAwM2VhZGRyMjtcbiYjNDM7XG4mIzQzO1x0LyogQ09XIHRoZSBwYWdlIGFuZCBzdGFtcCBrbm93biBieXRlcyBpbnRvIHRoZSBhbm9uIGNvcHkuICovXG4mIzQzO1x0cHJpdlswXSA9IDB4NDI7XG4mIzQzO1x0cHJpdltzZWxmLVx1MDAzZXBhZ2VzaXplIC0gMV0gPSAweDI0O1xuJiM0MztcbiYjNDM7XHRidWYgPSBtYWxsb2Moc2VsZi1cdTAwM2VwYWdlc2l6ZSk7XG4mIzQzO1x0QVNTRVJUX05FKGJ1ZiwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdG1lbV9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9tZW1cJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRBU1NFUlRfR0UobWVtX2ZkLCAwKTtcbiYjNDM7XHRyYyA9IHByZWFkKG1lbV9mZCwgYnVmLCBzZWxmLVx1MDAzZXBhZ2VzaXplLCAob2ZmX3QpKHVpbnRwdHJfdClwcml2KTtcbiYjNDM7XHRjbG9zZShtZW1fZmQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEocmMsIChzc2l6ZV90KXNlbGYtXHUwMDNlcGFnZXNpemUpO1xuJiM0MztcdEVYUEVDVF9FUShidWZbMF0sIDB4NDIpO1xuJiM0MztcdEVYUEVDVF9FUShidWZbc2VsZi1cdTAwM2VwYWdlc2l6ZSAtIDFdLCAweDI0KTtcbiYjNDM7XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YocGZubWFwLCBwcm9jbWVtX3Bmbl9yZWFkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBidWZbNjRdO1xuJiM0MztcdHNzaXplX3QgcmM7XG4mIzQzO1x0aW50IG1lbV9mZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgbWFwcGluZyBoYXMgbm8gc3RydWN0IHBhZ2UsIHNvXG4mIzQzO1x0ICogX19hY2Nlc3NfcmVtb3RlX3ZtKCkgcmVhY2hlcyBpdCB0aHJvdWdoIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKClcbiYjNDM7XHQgKiAoZ2VuZXJpY19hY2Nlc3NfcGh5cygpKS4gVGhhdCBpb3JlbWFwcyB0aGUgUEZOLCB3aGljaCBpcyByZWplY3RlZCBmb3JcbiYjNDM7XHQgKiBSQU0sIHNvIHRoaXMgb25seSBhcHBsaWVzIHRvIGdlbnVpbmUgZGV2aWNlIG1lbW9yeS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodGFyZ2V0X2lzX3JhbSlcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtUYXJnZXQgaXMgU3lzdGVtIFJBTTsgLVx1MDAzZWFjY2VzcygpIGNhbm5vdCBpb3JlbWFwIFJBTVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1lbV9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9tZW1cJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRBU1NFUlRfR0UobWVtX2ZkLCAwKTtcbiYjNDM7XHRyYyA9IHByZWFkKG1lbV9mZCwgYnVmLCBzaXplb2YoYnVmKSwgKG9mZl90KSh1aW50cHRyX3Qpc2VsZi1cdTAwM2VhZGRyMSk7XG4mIzQzO1x0Y2xvc2UobWVtX2ZkKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHJjLCAoc3NpemVfdClzaXplb2YoYnVmKSk7XG4mIzQzO31cbiYjNDM7XG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdGZvciAoaW50IGkgPSAxOyBpIFx1MDAzYyBhcmdjOyBpJiM0MzsmIzQzOykge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbmluZGV4IDhjMjk2ZGVkZjA0NzRkLi5iNDlhM2ViMGMyMDUwOCAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTI4OSw2ICYjNDM7Mjg5LDcgQEAgZmlcbiAjIER1bXAgcGFnZXMgMCwgMTksIGFuZCA0MDk2LCB1c2luZyBwaW5fdXNlcl9wYWdlczpcbiBDQVRFR09SWT1cJiMzNDtndXBfdGVzdFwmIzM0OyBydW5fdGVzdCAuL2d1cF90ZXN0IC1jdCAtRiAweDEgMCAxOSAweDEwMDBcbiBDQVRFR09SWT1cJiMzNDtndXBfdGVzdFwmIzM0OyBydW5fdGVzdCAuL2d1cF9sb25ndGVybVxuJiM0MztDQVRFR09SWT1cJiMzNDtndXBfdGVzdFwmIzM0OyBydW5fdGVzdCAuL210aHBfZ3VwX2Nvd190ZXN0XG4gXG4gQ0FURUdPUlk9XCYjMzQ7dXNlcmZhdWx0ZmRcJiMzNDsgcnVuX3Rlc3QgLi91ZmZkLXVuaXQtdGVzdHNcbiB1ZmZkX3N0cmVzc19iaW49Li91ZmZkLXN0cmVzc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtBRERSRVNTX01BU0tJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdXNlcl9wYWdlX3ZtYSYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEmIzM0OywKICAgICYjMzQ7YWNjZXNzX3JlbW90ZV92bSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcHJvY2Vzc192bSYjMzQ7LAogICAgJiMzNDtjb3B5X3JlbW90ZV92bV9zdHImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyByZW1vdGUgVk0gd2FsayBtZWNoYW5pc20gKGByZW1vdGVfdm1fd2Fsa2ApIGFuZCByZXBsYWNlcyBgZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlYCB3aXRoIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV92bWFgLiBJdCBhbHNvIGFkZHMgc3VwcG9ydCBmb3IgYmF0Y2hpbmcgY29udGlndW91cyBwYWdlcyBmb3IgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MgKG1USFApIGluIHRoZSBzbG93IEdVUCBwYXRoLiBUaGVzZSBhcmUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIHRoYXQgYWZmZWN0IHBhZ2UgZmF1bHRpbmcsIHJlbW90ZSBtZW1vcnkgYWNjZXNzIChlLmcuLCBwdHJhY2UsIC9wcm9jL3BpZC9tZW0pLCBhbmQgQlBGIHN0cmluZyBjb3B5aW5nLiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgbmV3IGVudHJ5IHBvaW50cyBhbmQgcmVtb3RlIGFjY2VzcyBBUElzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdjMjA5ODdkZTZkOTJkN2VmYzIxYTAwMTg4NWFkMzE4YjYwNTRmZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gSnVsIDI2IDEwOjA3OjA2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuYwppbmRleCAxYTlhYWQ2ZWYyMmEwNC4uN2E2ZWNjM2Q5Mjk0OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL210ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jCkBAIC00NTksNyAmIzQzOzQ1OSw3IEBAIHN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3RhZ3Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJCXVuc2lnbmVkIGxvbmcgdGFncywgb2Zmc2V0OwogCQl2b2lkICptYWRkcjsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsCiYjNDM7CQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkciwKIAkJCQkJCQkgICAgIGd1cF9mbGFncywgJmFtcDt2bWEpOwogCQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwogCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggZGJmMjdhNzhkZjZjODcuLjNjZTE2Nzk2ZTVhMjVkIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0yMSw3ICYjNDM7MjEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwKIAkJCSAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0KQogewogI2lmZGVmIENPTkZJR19SSVNDVl9JU0FfU1VQTQotCW5leHQtJmd0O2NvbnRleHQucG1sZW4gPSAwOwomIzQzOwlXUklURV9PTkNFKG5leHQtJmd0O2NvbnRleHQucG1sZW4sIDApOwogI2VuZGlmCiAJc3dpdGNoX21tKHByZXYsIG5leHQsIE5VTEwpOwogfQpAQCAtNDQsNyAmIzQzOzQ0LDcgQEAgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKHVzZV9hc2lkX2FsbG9jYXRvcik7CiAjZGVmaW5lIG1tX3VudGFnX21hc2sgbW1fdW50YWdfbWFzawogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1tX3VudGFnX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JcmV0dXJuIC0xVUwgJmd0OyZndDsgbW0tJmd0O2NvbnRleHQucG1sZW47CiYjNDM7CXJldHVybiAtMVVMICZndDsmZ3Q7IFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC5wbWxlbik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA1ZDRlYzE1NTg0Y2ZhNC4uNTM4MDZlMGY3ZGNmZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNiw3ICYjNDM7MTYsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpZiAocmlzY3ZfaGFzX2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfRVhUX1NVUE0pKSB7Ci0JCXU4IHBtbGVuID0gbW0tJmd0O2NvbnRleHQucG1sZW47CiYjNDM7CQl1OCBwbWxlbiA9IFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC5wbWxlbik7CiAKIAkJLyogVmlydHVhbCBhZGRyZXNzZXMgYXJlIHNpZ24tZXh0ZW5kZWQ7IHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUgemVyby1leHRlbmRlZC4gKi8KIAkJaWYgKElTX0VOQUJMRUQoQ09ORklHX01NVSkpCkBAIC0zMywxMiAmIzQzOzMzLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKGN1cnJlbnQtJmd0O21tLCBfX2FkZHIpOwlcCiB9KQogCi0jZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoewkJCQkJXAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpICh7CQkJCVwKIAl1bnNpZ25lZCBsb25nIF9fYWRkciA9IChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpKGFkZHIpOwkJCVwKLQltbWFwX2Fzc2VydF9sb2NrZWQobW0pOwkJCQkJCQlcCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBfX2FkZHIpOwkJXAogfSkKIAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpICh7CQkJCQlcCiYjNDM7CW1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7CQkJCQkJCVwKJiM0MzsJdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpOwkJCQlcCiYjNDM7fSkKJiM0MzsKICNkZWZpbmUgYWNjZXNzX29rKGFkZHIsIHNpemUpIGxpa2VseShfX2FjY2Vzc19vayh1bnRhZ2dlZF9hZGRyKGFkZHIpLCBzaXplKSkKICNlbHNlCiAjZGVmaW5lIHVudGFnZ2VkX2FkZHIoYWRkcikgKGFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYjJkZjdmNzIyNDFhNWYuLjZhZTc1NTJmZWQwOWYzIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNTcsMTMgJiM0MzszNTcsMTUgQEAgbG9uZyBzZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYXJnKQogCWlmIChtbWFwX3dyaXRlX2xvY2tfa2lsbGFibGUobW0pKQogCQlyZXR1cm4gLUVJTlRSOwogCi0JaWYgKHRlc3RfYml0KE1NX0NPTlRFWFRfTE9DS19QTUxFTiwgJmFtcDttbS0mZ3Q7Y29udGV4dC5mbGFncykgJmFtcDsmYW1wOyBtbS0mZ3Q7Y29udGV4dC5wbWxlbiAhPSBwbWxlbikgewotCQltbWFwX3dyaXRlX3VubG9jayhtbSk7Ci0JCXJldHVybiAtRUJVU1k7CiYjNDM7CWlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sICZhbXA7bW0tJmd0O2NvbnRleHQuZmxhZ3MpKSB7CiYjNDM7CQlpZiAoUkVBRF9PTkNFKG1tLSZndDtjb250ZXh0LnBtbGVuKSAhPSBwbWxlbikgewomIzQzOwkJCW1tYXBfd3JpdGVfdW5sb2NrKG1tKTsKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJfQogCX0KIAogCWVudmNmZ191cGRhdGVfYml0cyh0YXNrLCBFTlZDRkdfUE1NLCBwbW0pOwotCW1tLSZndDtjb250ZXh0LnBtbGVuID0gcG1sZW47CiYjNDM7CVdSSVRFX09OQ0UobW0tJmd0O2NvbnRleHQucG1sZW4sIHBtbGVuKTsKIAogCW1tYXBfd3JpdGVfdW5sb2NrKG1tKTsKIApAQCAtMzk0LDcgJiM0MzszOTYsNyBAQCBsb25nIGdldF90YWdnZWRfYWRkcl9jdHJsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIAkJYnJlYWs7CiAJfQogCi0JaWYgKHRhc2stJmd0O21tLSZndDtjb250ZXh0LnBtbGVuKQomIzQzOwlpZiAoUkVBRF9PTkNFKHRhc2stJmd0O21tLSZndDtjb250ZXh0LnBtbGVuKSkKIAkJcmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCBlZjViNTA3ZGUzNGUyZS4uY2VlNzEwZjY0NjU4YWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMTAwLDE4ICYjNDM7MTAwLDE4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV9sYW1fY3IzX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pCiBzdGF0aWMgaW5saW5lIHZvaWQgZHVwX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJbW0tJmd0O2NvbnRleHQubGFtX2NyM19tYXNrID0gb2xkbW0tJmd0O2NvbnRleHQubGFtX2NyM19tYXNrOwotCW1tLSZndDtjb250ZXh0LnVudGFnX21hc2sgPSBvbGRtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrOwomIzQzOwlXUklURV9PTkNFKG1tLSZndDtjb250ZXh0LnVudGFnX21hc2ssIFJFQURfT05DRShvbGRtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrKSk7CiB9CiAKICNkZWZpbmUgbW1fdW50YWdfbWFzayBtbV91bnRhZ19tYXNrCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlyZXR1cm4gbW0tJmd0O2NvbnRleHQudW50YWdfbWFzazsKJiM0MzsJcmV0dXJuIFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG1tX3Jlc2V0X3VudGFnX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JbW0tJmd0O2NvbnRleHQudW50YWdfbWFzayA9IC0xVUw7CiYjNDM7CVdSSVRFX09OQ0UobW0tJmd0O2NvbnRleHQudW50YWdfbWFzaywgLTFVTCk7CiB9CiAKICNkZWZpbmUgYXJjaF9wZ3RhYmxlX2RtYV9jb21wYXQgYXJjaF9wZ3RhYmxlX2RtYV9jb21wYXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAppbmRleCAyMGRlMzRjYzlhYTZlNy4uYTA5NTE2NWViNjQ4ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKQEAgLTM5LDE4ICYjNDM7MzksMjcgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHIoX19hZGRyKTsJCVwKIH0pCiAKJiM0MzsvKgomIzQzOyAqIG1tLSZndDtjb250ZXh0LnVudGFnX21hc2sgY2hhbmdlcyBvbmx5IHdoZW4gdGhlIHRhcmdldCBlbmFibGVzIExBTSBvciBleGVjcywKJiM0MzsgKiBhbHdheXMgc2luZ2xlLXRocmVhZGVkLiBBbiB1bmxvY2tlZCByZW1vdGUgcmVhZGVyIGNhbiByYWNlIHRoYXQ7IFJFQURfT05DRQomIzQzOyAqIGtlZXBzIHRoZSB2YWx1ZSB3aG9sZSBhbmQgdGhlIHVudGFnIGlzIGJlc3QtZWZmb3J0LgomIzQzOyAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JbW1hcF9hc3NlcnRfbG9ja2VkKG1tKTsKLQlyZXR1cm4gYWRkciAmYW1wOyAobW0pLSZndDtjb250ZXh0LnVudGFnX21hc2s7CiYjNDM7CXJldHVybiBhZGRyICZhbXA7IFJFQURfT05DRShtbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrKTsKIH0KIAotI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcikJKHsJCQkJXAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpCSh7CQkJXAogCXVuc2lnbmVkIGxvbmcgX19hZGRyID0gKF9fZm9yY2UgdW5zaWduZWQgbG9uZykoYWRkcik7CQlcCiAJKF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBfX2FkZHIpOwlcCiB9KQogCiYjNDM7I2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcikJKHsJCQkJXAomIzQzOwltbWFwX2Fzc2VydF9sb2NrZWQobW0pOwkJCQkJCVwKJiM0MzsJdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpOwkJCVwKJiM0Mzt9KQomIzQzOwogI2VuZGlmCiAKICNkZWZpbmUgdmFsaWRfdXNlcl9hZGRyZXNzKHgpIFwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IGQ0NGFmYmUwMDViYjUxLi45ZmE2NTkxMTdmMzgyNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC04MTQsNyAmIzQzOzgxNCw3IEBAIHN0YXRpYyB2b2lkIGVuYWJsZV9sYW1fZnVuYyh2b2lkICpfX21tKQogc3RhdGljIHZvaWQgbW1fZW5hYmxlX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAltbS0mZ3Q7Y29udGV4dC5sYW1fY3IzX21hc2sgPSBYODZfQ1IzX0xBTV9VNTc7Ci0JbW0tJmd0O2NvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpOwomIzQzOwlXUklURV9PTkNFKG1tLSZndDtjb250ZXh0LnVudGFnX21hc2ssIH5HRU5NQVNLKDYyLCA1NykpOwogCiAJLyoKIAkgKiBFdmVuIHRob3VnaCB0aGUgcHJvY2VzcyBtdXN0IHN0aWxsIGJlIHNpbmdsZS10aHJlYWRlZCBhdCB0aGlzCkBAIC05NTIsNyAmIzQzOzk1Miw3IEBAIGxvbmcgZG9fYXJjaF9wcmN0bF82NChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMikKICNlbmRpZgogI2lmZGVmIENPTkZJR19BRERSRVNTX01BU0tJTkcKIAljYXNlIEFSQ0hfR0VUX1VOVEFHX01BU0s6Ci0JCXJldHVybiBwdXRfdXNlcih0YXNrLSZndDttbS0mZ3Q7Y29udGV4dC51bnRhZ19tYXNrLAomIzQzOwkJcmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay0mZ3Q7bW0pLAogCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZzIpOwogCWNhc2UgQVJDSF9FTkFCTEVfVEFHR0VEX0FERFI6CiAJCXJldHVybiBwcmN0bF9lbmFibGVfdGFnZ2VkX2FkZHIodGFzay0mZ3Q7bW0sIGFyZzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMKaW5kZXggM2FmOTc5ZmI0MWQzOGQuLjMyOWVmYWMwY2ZiMzdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMKQEAgLTEwMzYsNyAmIzQzOzEwMzYsNyBAQCBzdGF0aWMgaW50IGNvcHlfZnJvbV92YWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgdmFkZHIsIGd1cF9mbGFncywgJmFtcDt2bWEpOwomIzQzOwlwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCAmYW1wO3ZtYSk7CiAJaWYgKElTX0VSUihwYWdlKSkKIAkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAJdXByb2JlX2NvcHlfZnJvbV9wYWdlKHBhZ2UsIHZhZGRyLCBkc3QsIGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggNDg1ZGY5YzJkYmRkYjMuLjBmNjZkNzZlNmNhNzE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0zMjM1LDM1ICYjNDM7MzIzNSw5IEBAIGxvbmcgcGluX3VzZXJfcGFnZXNfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJCSAgIGludCAqbG9ja2VkKTsKIAotLyoKLSAqIFJldHJpZXZlcyBhIHNpbmdsZSBwYWdlIGFsb25nc2lkZSBpdHMgVk1BLiBEb2VzIG5vdCBzdXBwb3J0IEZPTExfTk9XQUlULgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCQkJICAgIGludCBndXBfZmxhZ3MsCi0JCQkJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcCkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlpbnQgZ290OwotCi0JaWYgKFdBUk5fT05fT05DRSh1bmxpa2VseShndXBfZmxhZ3MgJmFtcDsgRk9MTF9OT1dBSVQpKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlnb3QgPSBnZXRfdXNlcl9wYWdlc19yZW1vdGUobW0sIGFkZHIsIDEsIGd1cF9mbGFncywgJmFtcDtwYWdlLCBOVUxMKTsKLQotCWlmIChnb3QgJmx0OyAwKQotCQlyZXR1cm4gRVJSX1BUUihnb3QpOwotCi0Jdm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7Ci0JaWYgKFdBUk5fT05fT05DRSghdm1hKSkgewotCQlwdXRfcGFnZShwYWdlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCi0JKnZtYXAgPSB2bWE7Ci0JcmV0dXJuIHBhZ2U7Ci19CiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQkgICAgICBpbnQgZ3VwX2ZsYWdzLAomIzQzOwkJCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTsKIAogbG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAogCQkgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oCmluZGV4IGVkZGJiYjY1Y2NjNGY4Li43ZTZlNGM4OTE4NGNkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKQEAgLTM0LDYgJiM0MzszNCwxMyBAQAogfSkKICNlbmRpZgogCiYjNDM7I2lmbmRlZiB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZAomIzQzOyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpCSh7CVwKJiM0MzsJKHZvaWQpKG1tKTsJCQkJCVwKJiM0MzsJdW50YWdnZWRfYWRkcihhZGRyKTsJCQkJXAomIzQzO30pCiYjNDM7I2VuZGlmCiYjNDM7CiAjaWZkZWYgbWFza2VkX3VzZXJfYWNjZXNzX2JlZ2luCiAgI2RlZmluZSBjYW5fZG9fbWFza2VkX3VzZXJfYWNjZXNzKCkgMQogIyBpZm5kZWYgbWFza2VkX3VzZXJfd3JpdGVfYWNjZXNzX2JlZ2luCmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jCmluZGV4IDA2OTIxMTliNzkwNDMxLi40OTEwYzkzYmEwMDNlOCAxMDA2NDQKLS0tIGEvbW0vZ3VwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmMKQEAgLTY0Nyw4ICYjNDM7NjQ3LDkgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZF90IHB1ZCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLAotCQkJCSAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNjcyLDEwICYjNDM7NjczLDEzIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlyZXR1cm4gRVJSX1BUUigtRU1MSU5LKTsKIAogCXJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIDEsIGZsYWdzKTsKLQlpZiAocmV0KQomIzQzOwlpZiAocmV0KSB7CiAJCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JZWxzZQotCQkqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgb2ZmID0gKGFkZHIgJmFtcDsgflBVRF9NQVNLKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkJKm5yX3BhZ2VzID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgKGVuZCAtIGFkZHIpICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwomIzQzOwl9CiAKIAlyZXR1cm4gcGFnZTsKIH0KQEAgLTY5OSw5ICYjNDM7NzAzLDkgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZF90IHBtZCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlwbWRfdCBwbWR2YWwgPSAqcG1kOwpAQCAtNzM4LDIzICYjNDM7NzQyLDI1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogI2VuZGlmCS8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwogCiAJcGFnZSAmIzQzOz0gKGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwotCSpwYWdlX21hc2sgPSBIUEFHRV9QTURfTlIgLSAxOwomIzQzOwkqbnJfcGFnZXMgPSBtaW4oSFBBR0VfUE1EX05SIC0gKChhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSykgJmd0OyZndDsgUEFHRV9TSElGVCksCiYjNDM7CQkJKGVuZCAtIGFkZHIpICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwogCiAJcmV0dXJuIHBhZ2U7CiB9CiAKICNlbHNlICAvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi8KIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLAotCQkJCSAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKQogewogCXJldHVybiBOVUxMOwogfQpAQCAtNzk5LDggJiM0Mzs4MDUsNDYgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkCiYjNDM7ICogbGFyZ2UgQGZvbGlvIG1hcHMgY29udGlndW91c2x5IGFuZCB0aGF0IGNhbiBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZQomIzQzOyAqIHBhZ2UgYXQgQGFkZHJlc3M6IGNvbnNlY3V0aXZlIHByZXNlbnQgUFRFcyBtYXBwaW5nIGNvbnNlY3V0aXZlIHBhZ2VzIG9mCiYjNDM7ICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLgomIzQzOyAqIFJldHVybnMgYXQgbGVhc3QgMS4KJiM0MzsgKgomIzQzOyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpcwomIzQzOyAqIGFsd2F5cyBzYWZlOiBhIHdyaXRhYmxlIGFub24gcGFnZSBpcyBleGNsdXNpdmUsIGFuZCBGT0xMX1dSSVRFIGlzIHNhdGlzZmllZC4KJiM0MzsgKiBBIHJlYWQtb25seSBydW4gaXMgb25seSBzYWZlIGZvciBhIHBsYWluIHJlYWQ7IEZPTExfV1JJVEUgd291bGQgbmVlZCBhIENPVwomIzQzOyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLAomIzQzOyAqIHNvIHRob3NlIGZhbGwgYmFjayB0byBhIHNpbmdsZSBwYWdlLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLAomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2UsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CXB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBtYXg7CiYjNDM7CiYjNDM7CWlmICghcHRlX3dyaXRlKHB0ZSkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGZvbGlvX3B0ZV9iYXRjaF9mbGFncygpIHNjYW5zIGZvcndhcmQgZnJvbSBAcHRlcCwgc28gdGhlIHJ1biBtdXN0CiYjNDM7CSAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kCiYjNDM7CSAqIHRoZSBWTUEsIHNpbmNlIGEgbGFyZ2UgZm9saW8gY2FuIGJlIFBURS1tYXBwZWQgYWNyb3NzIGEgUE1EIGJvdW5kYXJ5LgomIzQzOwkgKi8KJiM0MzsJbWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpICZndDsmZ3Q7IFBBR0VfU0hJRlQsCiYjNDM7CQkgICh2bWEtJmd0O3ZtX2VuZCAtIGFkZHJlc3MpICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwomIzQzOwlpZiAobWF4ICZsdDs9IDEpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJcmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCAmYW1wO2JhdGNoX3B0ZSwgbWF4LAomIzQzOwkJCQkgICAgIEZQQl9SRVNQRUNUX1dSSVRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAJc3RydWN0IGZvbGlvICpmb2xpbzsKQEAgLTg4NSw2ICYjNDM7OTI5LDE1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkgKi8KIAkJZm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7CiAJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBBIFBURS1tYXBwZWQgbGFyZ2UgZm9saW8gY2FuIGJlIGhhbmRlZCBiYWNrIGFzIGEgY29udGlndW91cyBiYXRjaCwKJiM0MzsJICogc28gdGhlIGNhbGxlciBhZHZhbmNlcyBvdmVyIHRoZSB3aG9sZSBydW4gaW4gb25lIHN0ZXAgaW5zdGVhZCBvZgomIzQzOwkgKiB3YWxraW5nIHRoZSBwYWdlIHRhYmxlcyBmb3IgZXZlcnkgcGFnZS4KJiM0MzsJICovCiYjNDM7CWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKJiM0MzsJCSpucl9wYWdlcyA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCBlbmQsIGZvbGlvLCBwYWdlLAomIzQzOwkJCQkJICAgICBwdGVwLCBwdGUsIGZsYWdzKTsKIG91dDoKIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CiAJcmV0dXJuIHBhZ2U7CkBAIC04OTYsOSAmIzQzOzk0OSw5IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogfQogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJCQkgICAgcHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKQogewogCXBtZF90ICpwbWQsIHBtZHZhbDsKIAlzcGlubG9ja190ICpwdGw7CkBAIC05MTIsNyAmIzQzOzk2NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCWlmICghcG1kX3ByZXNlbnQocG1kdmFsKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpCi0JCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTsKIAogCWlmIChwbWRfcHJvdG5vbmUocG1kdmFsKSAmYW1wOyZhbXA7ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CkBAIC05MjUsMjQgJiM0Mzs5NzgsMjQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJfQogCWlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKLQkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpOwogCX0KIAlpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBGT0xMX1NQTElUX1BNRCkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKIAkJc3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpOwogCQkvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovCiAJCXJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDoKLQkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpOwogCX0KLQlwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpOwogCXNwaW5fdW5sb2NrKHB0bCk7CiAJcmV0dXJuIHBhZ2U7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwNGRfdCAqcDRkcCwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcHVkX3QgKnB1ZHAsIHB1ZDsKIAlzcGlubG9ja190ICpwdGw7CkBAIC05NTUsNyAmIzQzOzEwMDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKHB1ZF9sZWFmKHB1ZCkpIHsKIAkJcHRsID0gcHVkX2xvY2sobW0sIHB1ZHApOwotCQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpOwogCQlzcGluX3VubG9jayhwdGwpOwogCQlpZiAocGFnZSkKIAkJCXJldHVybiBwYWdlOwpAQCAtOTY0LDEzICYjNDM7MTAxNywxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlpZiAodW5saWtlbHkocHVkX2JhZChwdWQpKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAKLQlyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CXJldHVybiBmb2xsb3dfcG1kX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBucl9wYWdlcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBnZF90ICpwZ2RwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCSAgICBwZ2RfdCAqcGdkcCwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcDRkX3QgKnA0ZHAsIHA0ZDsKIApAQCAtOTgxLDE1ICYjNDM7MTAzNCwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAotCXJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIG5yX3BhZ2VzKTsKIH0KIAogLyoqCiAgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3MKICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3MKICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cAomIzQzOyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMKICAqIEBmbGFnczogZmxhZ3MgbW9kaWZ5aW5nIGxvb2t1cCBiZWhhdmlvdXIKLSAqIEBwYWdlX21hc2s6IGEgcG9pbnRlciB0byBvdXRwdXQgcGFnZV9tYXNrCiYjNDM7ICogQG5yX3BhZ2VzOiBvdXRwdXQ7IG51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHRoZSBjYWxsZXIgY2FuIHJlYWQKICAqCiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluICZsdDtsaW51eC9tbS5oJmd0OwogICoKQEAgLTk5OCwxNSAmIzQzOzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAgKiB0cmlnZ2VyIGEgZmF1bHQgd2l0aCBGQVVMVF9GTEFHX1VOU0hBUkUgc2V0LiBOb3RlIHRoYXQgdW5zaGFyaW5nIGlzIG9ubHkKICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLgogICoKLSAqIE9uIG91dHB1dCwgQHBhZ2VfbWFzayBpcyBzZXQgYWNjb3JkaW5nIHRvIHRoZSBzaXplIG9mIHRoZSBwYWdlLgomIzQzOyAqIE9uIG91dHB1dCwgQG5yX3BhZ2VzIGhvbGRzIGhvdyBtYW55IGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGZvbGlvIHRoYXQgaW5jbHVkZXMKJiM0MzsgKiB0aGUgcmV0dXJuZWQgcGFnZSBoYXMgbWFwcGVkIGludG8gdGhpcyBwcm9jZXNzLCBzbyB0aGUgY2FsbGVyIGNhbiBhZHZhbmNlCiYjNDM7ICogb3ZlciBhIGxhcmdlIGZvbGlvIGluIG9uZSBzdGVwLgogICoKICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvcgogICogYW4gZXJyb3IgcG9pbnRlciBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZAogICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLgogICovCiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBmbGFncywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpCiB7CiAJcGdkX3QgKnBnZDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CkBAIC0xMDE0LDEzICYjNDM7MTA3MCwxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAl2bWFfcGd0YWJsZV93YWxrX2JlZ2luKHZtYSk7CiAKLQkqcGFnZV9tYXNrID0gMDsKJiM0MzsJKm5yX3BhZ2VzID0gMTsKIAlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKIAogCWlmIChwZ2Rfbm9uZSgqcGdkKSB8fCB1bmxpa2VseShwZ2RfYmFkKCpwZ2QpKSkKIAkJcGFnZSA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJZWxzZQotCQlwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJCXBhZ2UgPSBmb2xsb3dfcDRkX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHBnZCwgZmxhZ3MsIG5yX3BhZ2VzKTsKIAogCXZtYV9wZ3RhYmxlX3dhbGtfZW5kKHZtYSk7CiAKQEAgLTEwODAsOSAmIzQzOzExMzYsMTYgQEAgc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiB9CiAKIC8qCi0gKiBtbWFwX2xvY2sgbXVzdCBiZSBoZWxkIG9uIGVudHJ5LiAgSWYgQGZsYWdzIGhhcyBGT0xMX1VOTE9DS0FCTEUgYnV0IG5vdAotICogRk9MTF9OT1dBSVQsIHRoZSBtbWFwX2xvY2sgbWF5IGJlIHJlbGVhc2VkLiAgSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0Ci0gKiB0byAwIGFuZCAtRUJVU1kgcmV0dXJuZWQuCiYjNDM7ICogVGhlIGNhbGxlciBob2xkcyBlaXRoZXIgdGhlIG1tYXAgbG9jaywgb3IgdGhlIHBlci1WTUEgbG9jayAod2l0aAomIzQzOyAqIEZPTExfVk1BX0xPQ0spLCBvbiBlbnRyeS4gSWYgQGZsYWdzIGhhcyBGT0xMX1VOTE9DS0FCTEUgYnV0IG5vdCBGT0xMX05PV0FJVCwKJiM0MzsgKiB0aGUgbW1hcF9sb2NrIG1heSBiZSByZWxlYXNlZC4gSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0IHRvIDAgYW5kCiYjNDM7ICogLUVBR0FJTiByZXR1cm5lZC4KJiM0MzsgKgomIzQzOyAqIFRoZSByZXR1cm4gdmFsdWUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBsb2NrIHR5cGU6IGEgZmF1bHQgdGhhdCBtYWRlCiYjNDM7ICogcHJvZ3Jlc3MgYnV0IG5lZWRzIGEgcmV0cnkgKFZNX0ZBVUxUX1JFVFJZIC8gVk1fRkFVTFRfQ09NUExFVEVEKSBpcyByZXBvcnRlZAomIzQzOyAqIGFzIC1FQUdBSU4gZm9yIGJvdGggdGhlIG1tYXAgbG9jayBhbmQgdGhlIHBlci1WTUEgbG9jayAoRk9MTF9WTUFfTE9DSykuIE9ubHkKJiM0MzsgKiB0aGUgKkBsb2NrZWQgc2lkZSBlZmZlY3QgaXMgbG9jay10eXBlIHNwZWNpZmljLCBhcyB0aGUgcGVyLVZNQSBsb2NrIHBhdGggaGFzCiYjNDM7ICogbm8gdW5sb2NrYWJsZSBtbWFwX2xvY2sgdG8gZHJvcC4KICAqLwogc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLCBib29sIHVuc2hhcmUsCkBAIC0xMDk3LDYgJiM0MzsxMTYwLDggQEAgc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCWZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfV1JJVEU7CiAJaWYgKGZsYWdzICZhbXA7IEZPTExfUkVNT1RFKQogCQlmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1JFTU9URTsKJiM0MzsJaWYgKGZsYWdzICZhbXA7IEZPTExfVk1BX0xPQ0spCiYjNDM7CQlmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1ZNQV9MT0NLOwogCWlmIChmbGFncyAmYW1wOyBGT0xMX1VOTE9DS0FCTEUpIHsKIAkJZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19BTExPV19SRVRSWSB8IEZBVUxUX0ZMQUdfS0lMTEFCTEU7CiAJCS8qCkBAIC0xMTI1LDQxICYjNDM7MTE5MCwxOTUgQEAgc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAlyZXQgPSBoYW5kbGVfbW1fZmF1bHQodm1hLCBhZGRyZXNzLCBmYXVsdF9mbGFncywgTlVMTCk7CiAKJiM0MzsJLyoKJiM0MzsJICogQSBmdWxseSBjb21wbGV0ZWQgZmF1bHQgKFZNX0ZBVUxUX0NPTVBMRVRFRCkgb3Igb25lIHRoYXQgbmVlZHMgYSByZXRyeQomIzQzOwkgKiAoVk1fRkFVTFRfUkVUUlkpIGhhcyByZWxlYXNlZCB0aGUgbG9jayBpdCB3YXMgaG9sZGluZy4gUmVwb3J0IGJvdGggYXMKJiM0MzsJICogLUVBR0FJTiBzbyB0aGUgY2FsbGVyIHJldHJpZXM6IHRoZSBtbWFwIGxvY2sgY2FsbGVyIHJldGFrZXMgaXQgaGVyZSwKJiM0MzsJICogdGhlIHBlci1WTUEgbG9jayBjYWxsZXIgKEZPTExfVk1BX0xPQ0spIGZhbGxzIGJhY2sgdG8gdGhlIG1tYXAgbG9jay4KJiM0MzsJICoKJiM0MzsJICogRHJvcHBpbmcgdGhlIG1tYXAgbG9jayBpcyByZWNvcmRlZCBpbiAqQGxvY2tlZC4gVGhlcmUgaXMgbm8gc3VjaCBsb2NrCiYjNDM7CSAqIHRvIGRyb3AgdW5kZXIgdGhlIHBlci1WTUEgbG9jaywgd2hlcmUgQGxvY2tlZCBpcyBub3QgdXNlZCwgc28gbGVhdmUgaXQKJiM0MzsJICogYWxvbmUgaW4gdGhhdCBjYXNlLgomIzQzOwkgKi8KIAlpZiAocmV0ICZhbXA7IFZNX0ZBVUxUX0NPTVBMRVRFRCkgewotCQkvKgotCQkgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJiMzOTtsbCBuZXZlciByZWxlYXNlIHRoZQotCQkgKiBtbWFwIGxvY2sgaW4gdGhlIHBhZ2UgZmF1bHQgaGFuZGxlci4gU2FuaXR5IGNoZWNrIHRoaXMuCi0JCSAqLwotCQlXQVJOX09OX09OQ0UoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpOwotCQkqbG9ja2VkID0gMDsKLQotCQkvKgotCQkgKiBXZSBzaG91bGQgZG8gdGhlIHNhbWUgYXMgVk1fRkFVTFRfUkVUUlksIGJ1dCBsZXQmIzM5O3Mgbm90Ci0JCSAqIHJldHVybiAtRUJVU1kgc2luY2UgdGhhdCYjMzk7cyBub3QgcmVmbGVjdGluZyB0aGUgcmVhbGl0eSBvZgotCQkgKiB3aGF0IGhhcyBoYXBwZW5lZCAtIHdlJiMzOTt2ZSBqdXN0IGZ1bGx5IGNvbXBsZXRlZCBhIHBhZ2UKLQkJICogZmF1bHQsIHdpdGggdGhlIG1tYXAgbG9jayByZWxlYXNlZC4gIFVzZSAtRUFHQUlOIHRvIHNob3cKLQkJICogdGhhdCB3ZSB3YW50IHRvIHRha2UgdGhlIG1tYXAgbG9jayBfYWdhaW5fLgotCQkgKi8KJiM0MzsJCWlmICghKGZsYWdzICZhbXA7IEZPTExfVk1BX0xPQ0spKSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJiMzOTtsbCBuZXZlciByZWxlYXNlIHRoZQomIzQzOwkJCSAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy4KJiM0MzsJCQkgKi8KJiM0MzsJCQlXQVJOX09OX09OQ0UoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpOwomIzQzOwkJCSpsb2NrZWQgPSAwOwomIzQzOwkJfQogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKIAlpZiAocmV0ICZhbXA7IFZNX0ZBVUxUX0VSUk9SKSB7CiAJCWludCBlcnIgPSB2bV9mYXVsdF90b19lcnJubyhyZXQsIGZsYWdzKTsKIAotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJQlVHKCk7CiYjNDM7CQkvKgomIzQzOwkJICogVk1fRkFVTFRfRVJST1IgYWx3YXlzIGRlY29kZXMgdG8gYW4gZXJybm87IGEgemVybyBoZXJlIHdvdWxkCiYjNDM7CQkgKiBtZWFuIGhhbmRsZV9tbV9mYXVsdCgpIHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgY29tYmluYXRpb24uCiYjNDM7CQkgKiBSZXBvcnQgLUVGQVVMVCByYXRoZXIgdGhhbiBjcmFzaDogdW5kZXIgdGhlIHBlci1WTUEgbG9jayB0aGUKJiM0MzsJCSAqIG1tYXAgbG9jayByZXRyeSBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSByZXN1bHQuCiYjNDM7CQkgKi8KJiM0MzsJCVZNX1dBUk5fT05fT05DRSghZXJyKTsKJiM0MzsJCXJldHVybiBlcnIgPyBlcnIgOiAtRUZBVUxUOwogCX0KIAogCWlmIChyZXQgJmFtcDsgVk1fRkFVTFRfUkVUUlkpIHsKLQkJaWYgKCEoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKQomIzQzOwkJaWYgKCEoZmxhZ3MgJmFtcDsgRk9MTF9WTUFfTE9DSykgJmFtcDsmYW1wOwomIzQzOwkJICAgICEoZmF1bHRfZmxhZ3MgJmFtcDsgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKQogCQkJKmxvY2tlZCA9IDA7Ci0JCXJldHVybiAtRUJVU1k7CiYjNDM7CQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAomIzQzOy8qCiYjNDM7ICogZ2V0X3VzZXJfcGFnZV92bWEgLSBnZXQgb25lIHBhZ2UgZnJvbSBAdm1hLCB3aG9zZSBsb2NrIHRoZSBjYWxsZXIgYWxyZWFkeQomIzQzOyAqIGhvbGRzOiB0aGUgbW1hcCBsb2NrLCBvciAod2l0aCBGT0xMX1ZNQV9MT0NLKSB0aGUgcGVyLVZNQSBsb2NrLiBXYWxrcyB0aGUKJiM0MzsgKiBwYWdlIHRhYmxlcywgZmF1bHRpbmcgdGhlIHBhZ2UgaW4gaWYgbmVlZGVkLCBhbmQgb24gc3VjY2VzcyByZXR1cm5zIGl0IHdpdGgKJiM0MzsgKiBhIHJlZmVyZW5jZSBhbmQgdGhlIGxvY2sgc3RpbGwgaGVsZC4KJiM0MzsgKgomIzQzOyAqIFJ1bnMgY2hlY2tfdm1hX2ZsYWdzKCkgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHNvIGNhbGxlcnMgbmVlZCBub3QgcHJlLWNoZWNrCiYjNDM7ICogdGhlIFZNQTsgbW9zdCByZWplY3Rpb25zIGFyZSByZXR1cm5lZCBhcyB0aGVpciBlcnJvci4gQSBWTV9JTy9WTV9QRk5NQVAgVk1BCiYjNDM7ICogaXMgdGhlIGV4Y2VwdGlvbjogYSBDT1dlZCBwYWdlIHdpdGggYSBzdHJ1Y3QgcGFnZSBpcyByZXR1cm5lZCwgd2hpbGUgYSByYXcKJiM0MzsgKiBQRk4gaGFzIG5vbmUgYW5kIHlpZWxkcyAtRUZBVUxULCB0byBiZSByZWFjaGVkIHZpYSB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKCkuCiYjNDM7ICoKJiM0MzsgKiBVbmRlciBGT0xMX1ZNQV9MT0NLLCBhbnl0aGluZyB0aGF0IGNhbm5vdCBiZSBmaW5pc2hlZCB1bmRlciB0aGUgcGVyLVZNQSBsb2NrCiYjNDM7ICogKGEgZHJvcHBlZCBmYXVsdCwgdXNlcmZhdWx0ZmQsIGEgaGFyZCBlcnJvciwgb3IgLSZndDthY2Nlc3MoKSBtZW1vcnkpIHJlbGVhc2VzCiYjNDM7ICogdGhlIGxvY2sgYW5kIHJldHVybnMgLUVBR0FJTiwgc28gdGhlIGNhbGxlciByZXRyaWVzIHVuZGVyIHRoZSBtbWFwIGxvY2suCiYjNDM7ICovCiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpCiYjNDM7ewomIzQzOwlib29sIHZtYV9sb2NrZWQgPSBndXBfZmxhZ3MgJmFtcDsgRk9MTF9WTUFfTE9DSzsKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWludCBsb2NrZWQgPSAxOwomIzQzOwlib29sIHBmbm1hcDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVHdvIGxvY2sgbW9kZXMgYXJlIHN1cHBvcnRlZDogdGhlIG1tYXAgbG9jaywgd2l0aCBuZWl0aGVyIGZsYWcsIG9yCiYjNDM7CSAqIHRoZSBwZXItVk1BIGxvY2ssIHdpdGggYm90aCBGT0xMX1ZNQV9MT0NLIGFuZCBGT0xMX1VOTE9DS0FCTEUuIEFuCiYjNDM7CSAqIHVubG9ja2FibGUgbW1hcCBmYXVsdCB3b3VsZCBkcm9wIHRoZSBsb2NrIGFuZCByZXBvcnQgaXQgaW4gKmxvY2tlZCwKJiM0MzsJICogd2hpY2ggdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWxheSwgc28gcmVqZWN0IGEgbG9uZSBmbGFnLgomIzQzOwkgKi8KJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCEoZ3VwX2ZsYWdzICZhbXA7IEZPTExfVk1BX0xPQ0spICE9ICEoZ3VwX2ZsYWdzICZhbXA7IEZPTExfVU5MT0NLQUJMRSkpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBWYWxpZGF0ZSB0aGUgVk1BIHVwIGZyb250LCBsaWtlIF9fZ2V0X3VzZXJfcGFnZXMoKS4gQSBWTV9JTy9WTV9QRk5NQVAKJiM0MzsJICogVk1BIGlzIG5vdCByZWplY3RlZCBvdXRyaWdodDogaXQgY2FuIGhvbGQgQ09XZWQgcGFnZXMgdGhhdCBoYXZlIGEKJiM0MzsJICogc3RydWN0IHBhZ2U7IGxldCBmb2xsb3dfcGFnZV9tYXNrKCkgbG9vayBmb3IgdGhlbSwgYW5kIHRyZWF0IG9ubHkKJiM0MzsJICogaXRzIHN0cnVjdC1wYWdlLWxlc3MgUEZOcyBhcyB1bnJlYWNoYWJsZS4gT3RoZXIgcmVqZWN0aW9ucwomIzQzOwkgKiAoc2VjcmV0bWVtLCBwZXJtaXNzaW9ucywgZXRjKSByZXN1bHQgaW4gaW1tZWRpYXRlIGZhaWx1cmUuCiYjNDM7CSAqLwomIzQzOwlyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIFZNX0lPIHwgVk1fUEZOTUFQKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJcGZubWFwID0gdm1hLSZndDt2bV9mbGFncyAmYW1wOyAoVk1fSU8gfCBWTV9QRk5NQVApOwomIzQzOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKJiM0MzsJCQlyZXQgPSAtRUlOVFI7CiYjNDM7CQkJZ290byBmYWlsOwomIzQzOwkJfQomIzQzOwkJY29uZF9yZXNjaGVkKCk7CiYjNDM7CiYjNDM7CQkvKiBUaGlzIGhlbHBlciBoYW5kcyBiYWNrIGEgc2luZ2xlIHBhZ2U7IGNhcCB0aGUgYmF0Y2ggYXQgb25lLiAqLwomIzQzOwkJcGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBhZGRyLCBhZGRyICYjNDM7IFBBR0VfU0laRSwKJiM0MzsJCQkJCWd1cF9mbGFncyB8IEZPTExfVE9VQ0ggfCBGT0xMX0dFVCwKJiM0MzsJCQkJCSZhbXA7bnJfcGFnZXMpOwomIzQzOwkJaWYgKCFJU19FUlJfT1JfTlVMTChwYWdlKSkgewomIzQzOwkJCS8qIE1hdGNoIF9fZ2V0X3VzZXJfcGFnZXMoKTogZmx1c2ggZm9yIFZJVlQvYWxpYXNpbmcgY2FjaGVzLiAqLwomIzQzOwkJCWZsdXNoX2Fub25fcGFnZSh2bWEsIHBhZ2UsIGFkZHIpOwomIzQzOwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwomIzQzOwkJCXJldHVybiBwYWdlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIE5vIHN0cnVjdCBwYWdlOiBhIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgVk1BLCB3aGV0aGVyCiYjNDM7CQkgKiBzZWVuIGJ5IHRoZSB1cC1mcm9udCBjaGVjayAoQHBmbm1hcCkgb3IgcmVwb3J0ZWQgYXMgLUVFWElTVAomIzQzOwkJICogZm9yIGEgcHJlc2VudCBQRk4uIFJldHVybiAtRUZBVUxUIHNvIHRoZSBjYWxsZXIgcmVhY2hlcyBpdAomIzQzOwkJICogdGhyb3VnaCB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKCkuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChwZm5tYXAgfHwgUFRSX0VSUihwYWdlKSA9PSAtRUVYSVNUKSB7CiYjNDM7CQkJcmV0ID0gLUVGQVVMVDsKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQl9CiYjNDM7CQkvKiBBIGhhcmQgZXJyb3IgZnJvbSB0aGUgd2FsayBpdHNlbGYuICovCiYjNDM7CQlpZiAocGFnZSAmYW1wOyZhbXA7IFBUUl9FUlIocGFnZSkgIT0gLUVNTElOSykgewomIzQzOwkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiYjNDM7CQkJZ290byBmYWlsOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSBwYWdlIGlzIG5vdCBwcmVzZW50LCBvciBuZWVkcyB1bnNoYXJpbmcuIEEgcmVtb3RlIGZhdWx0CiYjNDM7CQkgKiB1bmRlciB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBkZWxpdmVyIHVzZXJmYXVsdGZkICh3aGljaAomIzQzOwkJICogYXNzdW1lcyBjdXJyZW50IGlzIHRoZSBmYXVsdGluZyB0YXNrKSwgc28gZmFsbCBiYWNrIGZvciB0aG9zZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHZtYV9sb2NrZWQgJmFtcDsmYW1wOyB1c2VyZmF1bHRmZF9hcm1lZCh2bWEpKSB7CiYjNDM7CQkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQl9CiYjNDM7CQlyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfR0VULAomIzQzOwkJCQkgICBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkssICZhbXA7bG9ja2VkKTsKJiM0MzsJCWlmIChyZXQgPT0gLUVBR0FJTikKJiM0MzsJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsJLyogZmF1bHQgcmVsZWFzZWQgdGhlIHBlci1WTUEgbG9jayAqLwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MztmYWlsOgomIzQzOwkvKgomIzQzOwkgKiBVbmRlciB0aGUgcGVyLVZNQSBsb2NrIHRoZSBjYWxsZXIgY2Fubm90IHJlYWNoIC0mZ3Q7YWNjZXNzKCkgb3IgYWN0IG9uIGEKJiM0MzsJICogaGFyZCBlcnJvciAoYm90aCBuZWVkIHRoZSBtbWFwIGxvY2spLCBzbyByZWxlYXNlIHRoZSBsb2NrIGFuZCBoYXZlIGl0CiYjNDM7CSAqIHJldHJ5IHRoZXJlOyB0aGUgbW1hcC1sb2NrIHBhc3MgcHJvZHVjZXMgdGhlIGRlZmluaXRpdmUgZXJyb3IuCiYjNDM7CSAqLwomIzQzOwlpZiAodm1hX2xvY2tlZCkgewomIzQzOwkJdm1hX2VuZF9yZWFkKHZtYSk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gRVJSX1BUUihyZXQpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSAtIGZhdWx0IGluIG9uZSBwYWdlIG9mIGEgcmVtb3RlIG1tIGFuZCBoYW5kIGJhY2sgdGhlCiYjNDM7ICogcGFnZSBhbG9uZyB3aXRoIHRoZSBWTUEgdGhhdCBjb3ZlcnMgaXQuIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBtbWFwX2xvY2suCiYjNDM7ICogUmV0dXJucyB3aXRoIHRoZSBtbWFwX2xvY2sgc3RpbGwgaGVsZC4KJiM0MzsgKgomIzQzOyAqIExvb2tzIHVwIHRoZSBWTUEsIGFuZCBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwYWdlIHRocm91Z2gKJiM0MzsgKiBnZXRfdXNlcl9wYWdlX3ZtYSgpLCBmYXVsdGluZyBpbiB0aGUgcGFnZSBpZiBuZWVkZWQuCiYjNDM7ICoKJiM0MzsgKiBGT0xMX05PV0FJVCBhbmQgRk9MTF9VTkxPQ0tBQkxFIGFyZSByZWplY3RlZDogYm90aCBsZXQgdGhlIGZhdWx0IGhhbmRsZXIKJiM0MzsgKiBkcm9wIHRoZSBtbWFwIGxvY2ssIHdoaWNoIGNvdWxkIGludmFsaWRhdGUgdGhlIGxvb2tlZC11cCBWTUEuCiYjNDM7ICovCiYjNDM7c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQkgICAgICBpbnQgZ3VwX2ZsYWdzLAomIzQzOwkJCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKQomIzQzO3sKJiM0MzsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiYjNDM7CXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyAmYW1wOyAoRk9MTF9OT1dBSVQgfCBGT0xMX1VOTE9DS0FCTEUpKSkpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKJiM0MzsKJiM0MzsJbW1hcF9hc3NlcnRfbG9ja2VkKG1tKTsKJiM0MzsKJiM0MzsJdm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7CiYjNDM7CWlmICghdm1hKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CiYjNDM7CXBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7CiYjNDM7CWlmIChJU19FUlIocGFnZSkpCiYjNDM7CQlyZXR1cm4gcGFnZTsKJiM0MzsKJiM0MzsJKnZtYXAgPSB2bWE7CiYjNDM7CXJldHVybiBwYWdlOwomIzQzO30KJiM0MzsKIC8qCiAgKiBXcml0aW5nIHRvIGZpbGUtYmFja2VkIG1hcHBpbmdzIHdoaWNoIHJlcXVpcmUgZm9saW8gZGlydHkgdHJhY2tpbmcgdXNpbmcgR1VQCiAgKiBpcyBhIGZ1bmRhbWVudGFsbHkgYnJva2VuIG9wZXJhdGlvbiwgYXMga2VybmVsIHdyaXRlIGFjY2VzcyB0byBHVVAgbWFwcGluZ3MKQEAgLTExOTcsMTMgJiM0MzsxNDE2LDIxIEBAIHN0YXRpYyBib29sIHdyaXRhYmxlX2ZpbGVfbWFwcGluZ19hbGxvd2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXJldHVybiAhdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHZtYSk7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncykKJiM0MztpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncywKJiM0MzsJCSAgICB2bV9mbGFnc190IGlnbm9yZV9mbGFncykKIHsKIAl2bV9mbGFnc190IHZtX2ZsYWdzID0gdm1hLSZndDt2bV9mbGFnczsKIAlpbnQgd3JpdGUgPSAoZ3VwX2ZsYWdzICZhbXA7IEZPTExfV1JJVEUpOwogCWludCBmb3JlaWduID0gKGd1cF9mbGFncyAmYW1wOyBGT0xMX1JFTU9URSk7CiAJYm9vbCB2bWFfYW5vbiA9IHZtYV9pc19hbm9ueW1vdXModm1hKTsKIAomIzQzOwkvKgomIzQzOwkgKiBPcHQgb3V0IG9mIHRoZSBmbGFnIGNoZWNrcyB0aGF0IHJlYWQgdGhpcyBsb2NhbCBjb3B5ICh0aGUKJiM0MzsJICogVk1fSU8vVk1fUEZOTUFQIGdhdGUgYW5kIHRoZSB3cml0ZS9yZWFkL2NvdyBiaXRzKTsgY2hlY2tzIHRoYXQKJiM0MzsJICogcmUtcmVhZCB2bWEtJmd0O3ZtX2ZsYWdzIHRocm91Z2ggaGVscGVycyBhcmUgdW5hZmZlY3RlZC4KJiM0MzsJICovCiYjNDM7CXZtX2ZsYWdzICZhbXA7PSB+aWdub3JlX2ZsYWdzOwomIzQzOwogCWlmICh2bV9mbGFncyAmYW1wOyAoVk1fSU8gfCBWTV9QRk5NQVApKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMTM1OCw3ICYjNDM7MTU4NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiB7CiAJbG9uZyByZXQgPSAwLCBpID0gMDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwOwogCiAJaWYgKCFucl9wYWdlcykKIAkJcmV0dXJuIDA7CkBAIC0xMzczLDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogCWRvIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIGludCBwYWdlX2luY3JlbTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pbmNyZW07CiAKIAkJLyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqLwogCQlpZiAoIXZtYSB8fCBzdGFydCAmZ3Q7PSB2bWEtJmd0O3ZtX2VuZCkgewpAQCAtMTM4Nyw3ICYjNDM7MTYxMyw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJCWdvdG8gb3V0OwogCQkJCX0KLQkJCQlpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkgewomIzQzOwkJCQlpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKSkgewogCQkJCQlyZXQgPSAtRUlOVkFMOwogCQkJCQlnb3RvIG91dDsKIAkJCQl9CkBAIC0xNDAwLDcgJiM0MzsxNjI2LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJCXBhZ2VzID8gJmFtcDtwYWdlIDogTlVMTCk7CiAJCQkJaWYgKHJldCkKIAkJCQkJZ290byBvdXQ7Ci0JCQkJcGFnZV9tYXNrID0gMDsKJiM0MzsJCQkJcGFnZV9pbmNyZW0gPSAxOwogCQkJCWdvdG8gbmV4dF9wYWdlOwogCQkJfQogCkBAIC0xNDA4LDcgJiM0MzsxNjM0LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJcmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKTsKJiM0MzsJCQlyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTQyMyw3ICYjNDM7MTY0OSw4IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCX0KIAkJY29uZF9yZXNjaGVkKCk7CiAKLQkJcGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCAmYW1wO3BhZ2VfbWFzayk7CiYjNDM7CQlwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBzdGFydCAmIzQzOyBucl9wYWdlcyAqIFBBR0VfU0laRSwKJiM0MzsJCQkJCWd1cF9mbGFncywgJmFtcDtwYWdlX2luY3JlbSk7CiAJCWlmICghcGFnZSB8fCBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkspIHsKIAkJCXJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsCiAJCQkJCSAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTsKQEAgLTE0NTYsNyAmIzQzOzE2ODMsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJZ290byBvdXQ7CiAJCX0KIG5leHRfcGFnZToKLQkJcGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0ICZndDsmZ3Q7IFBBR0VfU0hJRlQpICZhbXA7IHBhZ2VfbWFzayk7CiAJCWlmIChwYWdlX2luY3JlbSAmZ3Q7IG5yX3BhZ2VzKQogCQkJcGFnZV9pbmNyZW0gPSBucl9wYWdlczsKIApkaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmgKaW5kZXggMTgxZTc5ZjFkNmEyMDcuLjcwNmY3ZjA4ZmQxODE1IDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTE1OTUsNiAmIzQzOzE1OTUsMTAgQEAgc3RydWN0IHZtX3N0cnVjdCAqX19nZXRfdm1fYXJlYV9ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwKICAqLwogaW50IF9fbXVzdF9jaGVjayB0cnlfZ3JhYl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgcmVmcywKIAkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpOwomIzQzO2ludCBjaGVja192bWFfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZ3VwX2ZsYWdzLAomIzQzOwkJICAgIHZtX2ZsYWdzX3QgaWdub3JlX2ZsYWdzKTsKJiM0MztzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncyk7CiAKIC8qCiAgKiBtbS9odWdlX21lbW9yeS5jCkBAIC0xNjQxLDExICYjNDM7MTY0NSwxMyBAQCBlbnVtIHsKIAlGT0xMX1VOTE9DS0FCTEUgPSAxICZsdDsmbHQ7IDIxLAogCS8qIFZNQSBsb29rdXAmIzQzO2NoZWNrcyBjb21wYXRpYmxlIHdpdGggTUFEVl9QT1BVTEFURV8oUkVBRHxXUklURSkgKi8KIAlGT0xMX01BRFZfUE9QVUxBVEUgPSAxICZsdDsmbHQ7IDIyLAomIzQzOwkvKiBjYWxsZXIgaG9sZHMgdGhlIHBlci1WTUEgbG9jaywgbm90IHRoZSBtbWFwIGxvY2sgKi8KJiM0MzsJRk9MTF9WTUFfTE9DSyA9IDEgJmx0OyZsdDsgMjMsCiB9OwogCiAjZGVmaW5lIElOVEVSTkFMX0dVUF9GTEFHUyAoRk9MTF9UT1VDSCB8IEZPTExfVFJJRUQgfCBGT0xMX1JFTU9URSB8IEZPTExfUElOIHwgXAogCQkJICAgIEZPTExfRkFTVF9PTkxZIHwgRk9MTF9VTkxPQ0tBQkxFIHwgXAotCQkJICAgIEZPTExfTUFEVl9QT1BVTEFURSkKJiM0MzsJCQkgICAgRk9MTF9NQURWX1BPUFVMQVRFIHwgRk9MTF9WTUFfTE9DSykKIAogLyoKICAqIEluZGljYXRlcyBmb3Igd2hpY2ggcGFnZXMgdGhhdCBhcmUgd3JpdGUtcHJvdGVjdGVkIGluIHRoZSBwYWdlIHRhYmxlLApkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCBmZjMzOGMyYWJlOTIzMS4uYWFmNjIwMDE3ZjM0NDIgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbW9yeS5jCkBAIC03MDE1LDg2ICYjNDM7NzAxNSwyNDQgQEAgRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19hY2Nlc3NfcGh5cyk7CiAjZW5kaWYKIAogLyoKLSAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLgomIzQzOyAqIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeSwgc3VjaCBhcyBhbiBpb3JlbWFwcGVkIGRldmljZSBtYXBwaW5nLCBtYXBzCiYjNDM7ICogUEZOcyB0aGF0IGhhdmUgbm8gc3RydWN0IHBhZ2UsIHNvIGdldF91c2VyX3BhZ2Vfdm1hKCkgY2Fubm90IGZldGNoIGl0CiYjNDM7ICogZXZlbiB0aG91Z2ggdGhlIHBhZ2UgdGFibGVzIGFyZSBwb3B1bGF0ZWQuIEl0IGNhbiBzdGlsbCBiZSByZWFjaGVkCiYjNDM7ICogdGhyb3VnaCB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKCkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG9yICZsdDs9IDAgaWYgQHZtYSBjYW5ub3QgYmUKJiM0MzsgKiBhY2Nlc3NlZCB0aGlzIHdheS4KICAqLwotc3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncykKJiM0MztzdGF0aWMgaW50IGFjY2Vzc19yZW1vdGVfdm1hX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpCiYjNDM7ewomIzQzOyNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QKJiM0MzsJaWYgKHZtYS0mZ3Q7dm1fb3BzICZhbXA7JmFtcDsgdm1hLSZndDt2bV9vcHMtJmd0O2FjY2VzcykKJiM0MzsJCXJldHVybiB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTsKJiM0MzsjZW5kaWYKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTG9jayBAbW0gdG8gcmVhY2ggdGhlIHJlbW90ZSByYW5nZSBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pLgomIzQzOyAqCiYjNDM7ICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlCiYjNDM7ICogZmxhZ3MgcGVybWl0IHRoZSBhY2Nlc3MuIFRoZSBSQ1UgZnJlZWQgcGFnZSB0YWJsZXMgdGhlbiBrZWVwIHBhZ2UgdGFibGUKJiM0MzsgKiBtZW1vcnkgZnJvbSBiZWluZyByZXVzZWQgd2l0aCB1bmV4cGVjdGVkIGNvbnRlbnRzIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuCiYjNDM7ICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLAomIzQzOyAqIHN0YWNrIGV4cGFuc2lvbiwgYW5kIC0mZ3Q7YWNjZXNzKCkgbWVtb3J5LgomIzQzOyAqCiYjNDM7ICogUmV0dXJuIHdoZXRoZXIgdGhlIG1tYXAgbG9jayBpcyBoZWxkLiBUaGUgcGVyLVZNQSBsb2NrZWQgVk1BLCB3aGVuIG9uZSBpcwomIzQzOyAqIHRha2VuLCBpcyBzdG9yZWQgaW4gKkB2bWFwOyBpdCBpcyBOVUxMIG9uIHRoZSBtbWFwIGxvY2sgcGF0aC4gKkB2bWFwIGlzCiYjNDM7ICogc2V0IHRvIGFuIEVSUl9QVFIoKSB3aGVuIHRoZSBtbWFwIGxvY2sgY291bGQgbm90IGJlIHRha2VuLCBzbyBjYWxsZXJzIG11c3QKJiM0MzsgKiBjaGVjayBJU19FUlIoKkB2bWFwKSBiZWZvcmUgdXNpbmcgZWl0aGVyIHJlc3VsdC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCByZW1vdGVfYWNjZXNzX2xvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKJiM0MzsJCQkgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncywKJiM0MzsJCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKJiM0MzsKJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZNQV9MT0NLKSAmYW1wOyZhbXA7IGRlZmluZWQoQ09ORklHX01NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUUpCiYjNDM7CXZtYSA9IGxvY2tfdm1hX3VuZGVyX3JjdShtbSwgYWRkcik7CiYjNDM7CWlmICh2bWEpIHsKJiM0MzsJCS8qIGFkZHIgJiM0MzsgbGVuIG11c3Qgbm90IHdyYXAsIGFuZCBtdXN0IGZpdCB3aXRoaW4gdGhlIG9uZSBWTUEuICovCiYjNDM7CQlpZiAoYWRkciAmIzQzOyBsZW4gJmx0OyBhZGRyIHx8IGFkZHIgJiM0MzsgbGVuICZndDsgdm1hLSZndDt2bV9lbmQgfHwKJiM0MzsJCSAgICBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApKSB7CiYjNDM7CQkJdm1hX2VuZF9yZWFkKHZtYSk7CiYjNDM7CQkJdm1hID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOyNlbmRpZgomIzQzOwomIzQzOwlpZiAoIXZtYSkgewomIzQzOwkJaWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkgewomIzQzOwkJCSp2bWFwID0gRVJSX1BUUigtRUlOVFIpOwomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsJCSp2bWFwID0gTlVMTDsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CSp2bWFwID0gdm1hOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlbGVhc2UgdGhlIGxvY2sgdGFrZW4gYnkgcmVtb3RlX2FjY2Vzc19sb2NrKCkuICovCiYjNDM7c3RhdGljIHZvaWQgcmVtb3RlX2FjY2Vzc191bmxvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0sCiYjNDM7CQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCBoYXZlX21tYXBfbG9jaykKJiM0Mzt7CiYjNDM7CWlmIChoYXZlX21tYXBfbG9jaykKJiM0MzsJCW1tYXBfcmVhZF91bmxvY2sobW0pOwomIzQzOwllbHNlIGlmICh2bWEpCiYjNDM7CQl2bWFfZW5kX3JlYWQodm1hKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBQZXItcGFnZSBhY3Rpb24gZm9yIGEgcmVtb3RlIFZNIHdhbGsuIEhhbmRsZSB1cCB0byBAbGVuIGJ5dGVzIGF0IEBhZGRyIG9uCiYjNDM7ICogQHBhZ2UsIGFkdmFuY2luZyAqQGJ1ZiBwYXN0IHRoZSBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBpdC4gQHBhZ2UgaXMKJiM0MzsgKiBOVUxMIGZvciBzdHJ1Y3QtcGFnZS1sZXNzIG1lbW9yeSAoVk1fSU8gLyBWTV9QRk5NQVApIHJlYWNoZWQgdW5kZXIgdGhlIG1tYXAKJiM0MzsgKiBsb2NrLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIGJ5dGVzIGhhbmRsZWQgYXQgQGFkZHIsIDAgdG8gZW5kIHRoZSB3YWxrIChhCiYjNDM7ICogc3RyaW5nIHJlYWNoZWQgaXRzIE5VTCwgb3IgLSZndDthY2Nlc3MoKSBtZW1vcnkgY291bGQgbm90IGJlIHJlYWNoZWQpLCBvciBhCiYjNDM7ICogbmVnYXRpdmUgZXJybm8gdG8gYWJvcnQuCiYjNDM7ICovCiYjNDM7dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiYjNDM7CQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwKJiM0MzsJCQkJaW50IHdyaXRlKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdhbGsgdGhlIHJlbW90ZSByYW5nZSBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pIG9mIEBtbSwgaGFuZGluZyBlYWNoIHBhZ2UgdG8KJiM0MzsgKiBAYWN0aW9uLiBVc2UgdGhlIHBlci1WTUEgbG9jayB3aGVuIHRoZSByYW5nZSBmaXRzIG9uZSBWTUEsIGFuZCBmYWxsIGJhY2sgdG8KJiM0MzsgKiB0aGUgbW1hcCBsb2NrIGZvciBtdWx0aS1WTUEgcmFuZ2VzLCBzdGFjayBleHBhbnNpb24gKHdoZW4gQGNhbl9leHBhbmRfc3RhY2sKJiM0MzsgKiBpcyBzZXQpLCBvciB3aGVuIHRoZSBwZXItVk1BIGxvY2sgY2Fubm90IGZpbmlzaCBhIGZhdWx0LgomIzQzOyAqCiYjNDM7ICogRWFjaCBwYWdlIGlzIGZhdWx0ZWQgaW4gd2l0aCBnZXRfdXNlcl9wYWdlX3ZtYSgpIHVuZGVyIHdoaWNoZXZlciBsb2NrIGlzCiYjNDM7ICogaGVsZC4gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgQGFjdGlvbiBjb25zdW1lZDsgKkBlcnIgaXMgYSBuZWdhdGl2ZQomIzQzOyAqIGVycm5vIHdoZW4gdGhlIHdhbGsgYWJvcnRlZCwgZWxzZSAwLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcmVtb3RlX3ZtX3dhbGsoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLAomIzQzOwkJCSAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncywgYm9vbCBjYW5fZXhwYW5kX3N0YWNrLAomIzQzOwkJCSAgcmVtb3RlX3ZtX2FjdGlvbiBhY3Rpb24sIGludCAqZXJyKQogewogCXZvaWQgKm9sZF9idWYgPSBidWY7CiAJaW50IHdyaXRlID0gZ3VwX2ZsYWdzICZhbXA7IEZPTExfV1JJVEU7CiYjNDM7CWJvb2wgaGF2ZV9tbWFwX2xvY2s7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCi0JaWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkKLQkJcmV0dXJuIDA7CiYjNDM7CSplcnIgPSAwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTZXQgRk9MTF9SRU1PVEUgc28gY2hlY2tfdm1hX2ZsYWdzKCkgYXBwbGllcyB0aGUgc2FtZSBwcm90ZWN0aW9uIGtleQomIzQzOwkgKiBydWxlcyBhcyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoKSBkaWQ6IHRoZSBjdXJyZW50IFBLUlUgaXMgbm90IGNoZWNrZWQKJiM0MzsJICogYWdhaW5zdCBhIFZNQSByZWFjaGVkIG9uIEBtbSYjMzk7cyBiZWhhbGYuCiYjNDM7CSAqLwomIzQzOwlndXBfZmxhZ3MgfD0gRk9MTF9SRU1PVEU7CiAKLQkvKiBVbnRhZyB0aGUgYWRkcmVzcyBiZWZvcmUgbG9va2luZyB1cCB0aGUgVk1BICovCi0JYWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTsKJiM0MzsJYWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKTsKIAotCS8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi8KLQlpZiAoIXZtYV9sb29rdXAobW0sIGFkZHIpICZhbXA7JmFtcDsgIWV4cGFuZF9zdGFjayhtbSwgYWRkcikpCiYjNDM7CWhhdmVfbW1hcF9sb2NrID0gcmVtb3RlX2FjY2Vzc19sb2NrKG1tLCBhZGRyLCBsZW4sIGd1cF9mbGFncywgJmFtcDt2bWEpOwomIzQzOwlpZiAoSVNfRVJSKHZtYSkpIHsKJiM0MzsJCSplcnIgPSAtRUZBVUxUOwogCQlyZXR1cm4gMDsKJiM0MzsJfQogCi0JLyogaWdub3JlIGVycm9ycywganVzdCBjaGVjayBob3cgbXVjaCB3YXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkICovCiAJd2hpbGUgKGxlbikgewotCQlpbnQgYnl0ZXMsIG9mZnNldDsKLQkJdm9pZCAqbWFkZHI7Ci0JCXN0cnVjdCBmb2xpbyAqZm9saW87Ci0JCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsCi0JCQkJCQkJICAgICBndXBfZmxhZ3MsICZhbXA7dm1hKTsKJiM0MzsJCXVuc2lnbmVkIGludCBmb2xsX2ZsYWdzID0gZ3VwX2ZsYWdzOwomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CQlpbnQgcmV0OwogCi0JCWlmIChJU19FUlIocGFnZSkpIHsKLQkJCS8qIFdlIG1pZ2h0IG5lZWQgdG8gZXhwYW5kIHRoZSBzdGFjayB0byBhY2Nlc3MgaXQgKi8KJiM0MzsJCWlmICghdm1hIHx8IGFkZHIgJmd0Oz0gdm1hLSZndDt2bV9lbmQpIHsKJiM0MzsJCQkvKiBBbnkgbG9va3VwIGhlcmUgaG9sZHMgdGhlIG1tYXAgbG9jay4gKi8KJiM0MzsJCQlWTV9CVUdfT04oIWhhdmVfbW1hcF9sb2NrKTsKIAkJCXZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpOwotCQkJaWYgKCF2bWEpIHsKJiM0MzsJCQlpZiAoIXZtYSAmYW1wOyZhbXA7IGNhbl9leHBhbmRfc3RhY2spIHsKJiM0MzsJCQkJLyogZXhwYW5kX3N0YWNrKCkgZHJvcHMgdGhlIG1tYXAgbG9jayBpZiBpdCBmYWlscyAqLwogCQkJCXZtYSA9IGV4cGFuZF9zdGFjayhtbSwgYWRkcik7Ci0KLQkJCQkvKiBtbWFwX2xvY2sgd2FzIGRyb3BwZWQgb24gZmFpbHVyZSAqLwogCQkJCWlmICghdm1hKQotCQkJCQlyZXR1cm4gYnVmIC0gb2xkX2J1ZjsKLQotCQkJCS8qIFRyeSBhZ2FpbiBpZiBzdGFjayBleHBhbnNpb24gd29ya2VkICovCi0JCQkJY29udGludWU7CiYjNDM7CQkJCQloYXZlX21tYXBfbG9jayA9IGZhbHNlOwomIzQzOwkJCX0KJiM0MzsJCQlpZiAoIXZtYSkgewomIzQzOwkJCQkqZXJyID0gLUVGQVVMVDsKJiM0MzsJCQkJYnJlYWs7CiAJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogRk9MTF9VTkxPQ0tBQkxFIGxldHMgdGhlIHBlci1WTUEgZmF1bHQgcmV0cnksIGRyb3BwaW5nIHRoZQomIzQzOwkJICogbG9jaywgc28gdGhlIHdhbGsgY2FuIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIWhhdmVfbW1hcF9sb2NrKQomIzQzOwkJCWZvbGxfZmxhZ3MgfD0gRk9MTF9WTUFfTE9DSyB8IEZPTExfVU5MT0NLQUJMRTsKIAomIzQzOwkJcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hKHZtYSwgYWRkciwgZm9sbF9mbGFncyk7CiYjNDM7CQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQkvKgotCQkJICogQ2hlY2sgaWYgdGhpcyBpcyBhIFZNX0lPIHwgVk1fUEZOTUFQIFZNQSwgd2hpY2gKLQkJCSAqIHdlIGNhbiBhY2Nlc3MgdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUuCiYjNDM7CQkJICogZ2V0X3VzZXJfcGFnZV92bWEoKSByZXR1cm5zIC1FQUdBSU4sIHdpdGggdGhlIHBlci1WTUEKJiM0MzsJCQkgKiBsb2NrIHJlbGVhc2VkLCBmb3IgYW55dGhpbmcgaXQgY291bGQgbm90IGZpbmlzaCB1bmRlcgomIzQzOwkJCSAqIGl0OyByZXRha2UgdGhlIG1tYXAgbG9jayBhbmQgcmV0cnkuIEEgZGlmZmVyZW50IGVycm9yCiYjNDM7CQkJICogdGhlcmVmb3JlIG9ubHkgYXJyaXZlcyB1bmRlciB0aGUgbW1hcCBsb2NrLCB3aGVyZQomIzQzOwkJCSAqIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IGNhbiBiZSByZWFjaGVkIHZpYSAtJmd0O2FjY2VzcygpLgogCQkJICovCi0JCQlieXRlcyA9IDA7Ci0jaWZkZWYgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UCi0JCQlpZiAodm1hLSZndDt2bV9vcHMgJmFtcDsmYW1wOyB2bWEtJmd0O3ZtX29wcy0mZ3Q7YWNjZXNzKQotCQkJCWJ5dGVzID0gdm1hLSZndDt2bV9vcHMtJmd0O2FjY2Vzcyh2bWEsIGFkZHIsIGJ1ZiwKLQkJCQkJCQkgICAgbGVuLCB3cml0ZSk7Ci0jZW5kaWYKLQkJCWlmIChieXRlcyAmbHQ7PSAwKQotCQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQkJYnl0ZXMgPSBsZW47Ci0JCQlvZmZzZXQgPSBhZGRyICZhbXA7IChQQUdFX1NJWkUtMSk7Ci0JCQlpZiAoYnl0ZXMgJmd0OyBQQUdFX1NJWkUtb2Zmc2V0KQotCQkJCWJ5dGVzID0gUEFHRV9TSVpFLW9mZnNldDsKLQotCQkJbWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpOwotCQkJaWYgKHdyaXRlKSB7Ci0JCQkJY29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLAotCQkJCQkJICBtYWRkciAmIzQzOyBvZmZzZXQsIGJ1ZiwgYnl0ZXMpOwotCQkJCWZvbGlvX21hcmtfZGlydHlfbG9jayhmb2xpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLAotCQkJCQkJICAgIGJ1ZiwgbWFkZHIgJiM0Mzsgb2Zmc2V0LCBieXRlcyk7CiYjNDM7CQkJaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVBR0FJTikgewomIzQzOwkJCQl2bWEgPSBOVUxMOwomIzQzOwkJCQlpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKSB7CiYjNDM7CQkJCQkqZXJyID0gLUVGQVVMVDsKJiM0MzsJCQkJCWJyZWFrOwomIzQzOwkJCQl9CiYjNDM7CQkJCWhhdmVfbW1hcF9sb2NrID0gdHJ1ZTsKJiM0MzsJCQkJY29udGludWU7CiAJCQl9Ci0JCQlmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTsKJiM0MzsJCQlpZiAoV0FSTl9PTl9PTkNFKCFoYXZlX21tYXBfbG9jaykpCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCXBhZ2UgPSBOVUxMOwomIzQzOwkJfQomIzQzOwomIzQzOwkJcmV0ID0gYWN0aW9uKHZtYSwgcGFnZSwgYWRkciwgJmFtcDtidWYsIGxlbiwgd3JpdGUpOwomIzQzOwkJaWYgKHJldCAmbHQ7PSAwKSB7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJCSplcnIgPSByZXQ7CiYjNDM7CQkJYnJlYWs7CiAJCX0KLQkJbGVuIC09IGJ5dGVzOwotCQlidWYgJiM0Mzs9IGJ5dGVzOwotCQlhZGRyICYjNDM7PSBieXRlczsKJiM0MzsJCWFkZHIgJiM0Mzs9IHJldDsKJiM0MzsJCWxlbiAtPSByZXQ7CiAJfQotCW1tYXBfcmVhZF91bmxvY2sobW0pOwomIzQzOwomIzQzOwlyZW1vdGVfYWNjZXNzX3VubG9jayhtbSwgdm1hLCBoYXZlX21tYXBfbG9jayk7CiAKIAlyZXR1cm4gYnVmIC0gb2xkX2J1ZjsKIH0KIAomIzQzOy8qCiYjNDM7ICogQ29weSBvbmUgcGFnZSYjMzk7cyB3b3J0aCBvZiBbQGFkZHIsIEBhZGRyICYjNDM7IEBsZW4pIHRvIG9yIGZyb20gKkBidWYuIFJlYWNoZXMKJiM0MzsgKiBzdHJ1Y3QtcGFnZS1sZXNzIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeSB0aHJvdWdoIHZtYS0mZ3Q7dm1fb3BzLSZndDthY2Nlc3MoKS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKJiM0MzsJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKQomIzQzO3sKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJaW50IGJ5dGVzLCBvZmZzZXQ7CiYjNDM7CXZvaWQgKm1hZGRyOwomIzQzOwomIzQzOwlpZiAoIXBhZ2UpIHsKJiM0MzsJCWJ5dGVzID0gYWNjZXNzX3JlbW90ZV92bWFfb3BzKHZtYSwgYWRkciwgKmJ1ZiwgbGVuLCB3cml0ZSk7CiYjNDM7CQlpZiAoYnl0ZXMgJmd0OyAwKQomIzQzOwkJCSpidWYgJiM0Mzs9IGJ5dGVzOwomIzQzOwkJcmV0dXJuIGJ5dGVzOwomIzQzOwl9CiYjNDM7CiYjNDM7CWJ5dGVzID0gbGVuOwomIzQzOwlvZmZzZXQgPSBhZGRyICZhbXA7IChQQUdFX1NJWkUgLSAxKTsKJiM0MzsJaWYgKGJ5dGVzICZndDsgUEFHRV9TSVpFIC0gb2Zmc2V0KQomIzQzOwkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CiYjNDM7CiYjNDM7CWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKJiM0MzsJbWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpOwomIzQzOwlpZiAod3JpdGUpIHsKJiM0MzsJCWNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgbWFkZHIgJiM0Mzsgb2Zmc2V0LCAqYnVmLCBieXRlcyk7CiYjNDM7CQlmb2xpb19tYXJrX2RpcnR5X2xvY2soZm9saW8pOwomIzQzOwl9IGVsc2UgewomIzQzOwkJY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsICpidWYsIG1hZGRyICYjNDM7IG9mZnNldCwgYnl0ZXMpOwomIzQzOwl9CiYjNDM7CWZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpOwomIzQzOwomIzQzOwkqYnVmICYjNDM7PSBieXRlczsKJiM0MzsJcmV0dXJuIGJ5dGVzOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiYjNDM7CQkJICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKQomIzQzO3sKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCB0cnVlLAomIzQzOwkJCSAgICAgIGFjY2Vzc192bV9wYWdlLCAmYW1wO2Vycik7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBhY2Nlc3NfcmVtb3RlX3ZtIC0gYWNjZXNzIGFub3RoZXIgcHJvY2VzcyYjMzk7IGFkZHJlc3Mgc3BhY2UKICAqIEBtbToJCXRoZSBtbV9zdHJ1Y3Qgb2YgdGhlIHRhcmdldCBhZGRyZXNzIHNwYWNlCkBAIC03MTM4LDg0ICYjNDM7NzI5Niw2NyBAQCBFWFBPUlRfU1lNQk9MX0dQTChhY2Nlc3NfcHJvY2Vzc192bSk7CiAKICNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTEwKIC8qCi0gKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJiMzOTtzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uCi0gKiBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgcmV0dXJuIC1FRkFVTFQuCiYjNDM7ICogQ29weSBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIEBhZGRyIGludG8gKkBidWYsIHVwIHRvIEBsZW4gYnl0ZXMsCiYjNDM7ICogc3RvcHBpbmcgYXQgdGhlIE5VTC4gc3Ryc2NweSgpIGFsd2F5cyBOVUwgdGVybWluYXRlcywgc28gcmVjb3B5IHRoZSBsYXN0CiYjNDM7ICogYnl0ZSBvZiBhIHBhZ2Ugd2hlbiBtb3JlIHBhZ2VzIGZvbGxvdy4gQSBzdHJpbmcgaXMgbmV2ZXIgcmVhZCBmcm9tCiYjNDM7ICogc3RydWN0LXBhZ2UtbGVzcyBWTV9JTyAvIFZNX1BGTk1BUCBtZW1vcnkuCiAgKi8KLXN0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQl2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpCiYjNDM7c3RhdGljIGludCBjb3B5X3ZtX3N0cihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiYjNDM7CQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpCiB7Ci0Jdm9pZCAqb2xkX2J1ZiA9IGJ1ZjsKLQlpbnQgZXJyID0gMDsKLQotCSooY2hhciAqKWJ1ZiA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJaW50IGJ5dGVzLCBvZmZzZXQsIHJldHZhbDsKJiM0MzsJdm9pZCAqbWFkZHI7CiAKLQlpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKQomIzQzOwlpZiAoIXBhZ2UpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JYWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTsKJiM0MzsJYnl0ZXMgPSBsZW47CiYjNDM7CW9mZnNldCA9IGFkZHIgJmFtcDsgKFBBR0VfU0laRSAtIDEpOwomIzQzOwlpZiAoYnl0ZXMgJmd0OyBQQUdFX1NJWkUgLSBvZmZzZXQpCiYjNDM7CQlieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDsKIAotCS8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi8KLQlpZiAoIXZtYV9sb29rdXAobW0sIGFkZHIpKSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OwomIzQzOwlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CW1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTsKJiM0MzsJcmV0dmFsID0gc3Ryc2NweSgqYnVmLCBtYWRkciAmIzQzOyBvZmZzZXQsIGJ5dGVzKTsKJiM0MzsJaWYgKHJldHZhbCAmZ3Q7PSAwKSB7CiYjNDM7CQkvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICovCiYjNDM7CQkqYnVmICYjNDM7PSByZXR2YWw7CiYjNDM7CQlmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTsKJiM0MzsJCXJldHVybiAwOwogCX0KIAotCXdoaWxlIChsZW4pIHsKLQkJaW50IGJ5dGVzLCBvZmZzZXQsIHJldHZhbDsKLQkJdm9pZCAqbWFkZHI7Ci0JCXN0cnVjdCBmb2xpbyAqZm9saW87Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwotCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CiYjNDM7CSpidWYgJiM0Mzs9IGJ5dGVzIC0gMTsKJiM0MzsJaWYgKGJ5dGVzICE9IGxlbikgewomIzQzOwkJY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIgJiM0MzsgYnl0ZXMgLSAxLCAqYnVmLAomIzQzOwkJCQkgICAgbWFkZHIgJiM0MzsgKFBBR0VfU0laRSAtIDEpLCAxKTsKJiM0MzsJCSpidWYgJiM0Mzs9IDE7CiYjNDM7CX0KJiM0MzsJZm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7CiAKLQkJcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgYWRkciwgZ3VwX2ZsYWdzLCAmYW1wO3ZtYSk7Ci0JCWlmIChJU19FUlIocGFnZSkpIHsKLQkJCS8qCi0JCQkgKiBUcmVhdCBhcyBhIHRvdGFsIGZhaWx1cmUgZm9yIG5vdyB1bnRpbCB3ZSBkZWNpZGUgaG93Ci0JCQkgKiB0byBoYW5kbGUgdGhlIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBjYXNlIGFuZAotCQkJICogc3RhY2sgZXhwYW5zaW9uLgotCQkJICovCi0JCQkqKGNoYXIgKilidWYgPSAmIzM5O1wwJiMzOTs7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KJiM0MzsJcmV0dXJuIGJ5dGVzOwomIzQzO30KIAotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCWJ5dGVzID0gbGVuOwotCQlvZmZzZXQgPSBhZGRyICZhbXA7IChQQUdFX1NJWkUgLSAxKTsKLQkJaWYgKGJ5dGVzICZndDsgUEFHRV9TSVpFIC0gb2Zmc2V0KQotCQkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7Ci0KLQkJbWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpOwotCQlyZXR2YWwgPSBzdHJzY3B5KGJ1ZiwgbWFkZHIgJiM0Mzsgb2Zmc2V0LCBieXRlcyk7Ci0JCWlmIChyZXR2YWwgJmd0Oz0gMCkgewotCQkJLyogRm91bmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0JCQlidWYgJiM0Mzs9IHJldHZhbDsKLQkJCWZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpOwotCQkJYnJlYWs7Ci0JCX0KJiM0MzsvKgomIzQzOyAqIENvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MmIzM5O3MgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS4KJiM0MzsgKiBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgcmV0dXJuIC1FRkFVTFQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2NvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAomIzQzOwkJCQl2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpCiYjNDM7ewomIzQzOwlpbnQgYnl0ZXMsIGVycjsKIAotCQlidWYgJiM0Mzs9IGJ5dGVzIC0gMTsKLQkJLyoKLQkJICogQmVjYXVzZSBzdHJzY3B5IGFsd2F5cyBOVUwgdGVybWluYXRlcyB3ZSBuZWVkIHRvCi0JCSAqIGNvcHkgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgcGFnZSBpZiB3ZSBhcmUgZ29pbmcgdG8KLQkJICogbG9hZCBtb3JlIHBhZ2VzCi0JCSAqLwotCQlpZiAoYnl0ZXMgIT0gbGVuKSB7Ci0JCQlhZGRyICYjNDM7PSBieXRlcyAtIDE7Ci0JCQljb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgYnVmLCBtYWRkciAmIzQzOyAoUEFHRV9TSVpFIC0gMSksIDEpOwotCQkJYnVmICYjNDM7PSAxOwotCQkJYWRkciAmIzQzOz0gMTsKLQkJfQotCQlsZW4gLT0gYnl0ZXM7CiYjNDM7CSooY2hhciAqKWJ1ZiA9ICYjMzk7XDAmIzM5OzsKIAotCQlmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTsKJiM0MzsJYnl0ZXMgPSByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgZmFsc2UsCiYjNDM7CQkJICAgICAgIGNvcHlfdm1fc3RyLCAmYW1wO2Vycik7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCS8qIFRoZSBjb250cmFjdCBndWFyYW50ZWVzIGEgdGVybWluYXRlZCBidWZmZXIgZXZlbiBvbiBlcnJvci4gKi8KJiM0MzsJCSgoY2hhciAqKWJ1ZilbYnl0ZXNdID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJcmV0dXJuIGVycjsKIAl9CiAKLW91dDoKLQltbWFwX3JlYWRfdW5sb2NrKG1tKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiBidWYgLSBvbGRfYnVmOwomIzQzOwlyZXR1cm4gYnl0ZXM7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDFjNzdkNWRjMDZlOWZhLi5iMzZmMmUyMTliOGY0OSAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3JtYXAuYwpAQCAtMjgzOCw3ICYjNDM7MjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkgKiAobm9uLWRldmljZS1leGNsdXNpdmUpIFBURSBhbmQgaXNzdWUgYSBNTVVfTk9USUZZX0VYQ0xVU0lWRS4KIAkgKi8KIHJldHJ5OgotCXBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsCiYjNDM7CXBhZ2UgPSBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEobW0sIGFkZHIsCiAJCQkJCUZPTExfR0VUIHwgRk9MTF9XUklURSB8IEZPTExfU1BMSVRfUE1ELAogCQkJCQkmYW1wO3ZtYSk7CiAJaWYgKElTX0VSUihwYWdlKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUKaW5kZXggZTZkZjk2OGYwOTcxYzguLjZiOTE3YTRmNzNlMDBmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQpAQCAtODMsNiAmIzQzOzgzLDcgQEAgVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1yZWxlYXNlX3Rlc3QKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBtcmVtYXBfZG9udHVubWFwCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbXJlbWFwX3Rlc3QKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBtc2VhbF90ZXN0CiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IG10aHBfZ3VwX2Nvd190ZXN0CiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gb24tZmF1bHQtbGltaXQKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBwYWdlbWFwX2lvY3RsCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcGZubWFwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbXRocF9ndXBfY293X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJlZTMyOWQ4NjQxYzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDIxMyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKgomIzQzOyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtJmd0OyBmb2xsb3dfcGFnZV9tYXNrIC0mZ3Q7CiYjNDM7ICogZm9sbG93X3B0ZV9iYXRjaCkgcmV0dXJucyB0aGUgY29ycmVjdCBwYWdlcyBmb3IgYSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvCiYjNDM7ICogKG1USFApLCBpbmNsdWRpbmcgdGhhdCBDT1cgY29waWVzIHByb2R1Y2UgdGhlIHJpZ2h0IGNvbnRlbnQuCiYjNDM7ICoKJiM0MzsgKiBVc2VzIHRoZSBDT05GSUdfR1VQX1RFU1QgUElOX0xPTkdURVJNIGludGVyZmFjZTogU1RBUlQgcGlucyBhIHJhbmdlIG9uIHRoZQomIzQzOyAqIHNsb3cgcGF0aCwgUkVBRCBjb3BpZXMgdGhlIHBpbm5lZCBwYWdlcyYjMzk7IGJ5dGVzIGJhY2sgc28gd2UgY2FuIGNvbXBhcmUgdGhlbQomIzQzOyAqIGFnYWluc3QgdGhlIHBhdHRlcm4gd2Ugd3JvdGUuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGludC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBBUlJBWV9TSVpFKGEpCShzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKJiM0MzsKJiM0MzsjZGVmaW5lIEdVUF9ERVYgJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVAlfSU9XKCYjMzk7ZyYjMzk7LCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpCiYjNDM7I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QCV9JTygmIzM5O2cmIzM5OywgOCkKJiM0MzsjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1JFQUQJX0lPVygmIzM5O2cmIzM5OywgOSwgX191NjQpCiYjNDM7I2RlZmluZSBVU0VfV1JJVEUJMQomIzQzOyNkZWZpbmUgVVNFX0ZBU1QJMgomIzQzOwomIzQzO3N0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCB7CiYjNDM7CV9fdTY0IGFkZHI7CiYjNDM7CV9fdTY0IHNpemU7CiYjNDM7CV9fdTMyIGZsYWdzOwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBPUkRFUl9LQgk2NAomIzQzOyNkZWZpbmUgTlJfRk9MSU9TCTE2CiYjNDM7I2RlZmluZSBSRUdJT04JCSgoc2l6ZV90KU9SREVSX0tCICogMTAyNCAqIE5SX0ZPTElPUykKJiM0MzsKJiM0MztzdGF0aWMgbG9uZyBQUzsKJiM0MztzdGF0aWMgaW50IGZhaWxzOwomIzQzO3N0YXRpYyBpbnQgdGFwOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9rKGludCBjb25kLCBjb25zdCBjaGFyICpkZXNjKQomIzQzO3sKJiM0MzsJcHJpbnRmKCYjMzQ7JXMgJWQgJXNcbiYjMzQ7LCBjb25kID8gJiMzNDtvayYjMzQ7IDogJiMzNDtub3Qgb2smIzM0OywgJiM0MzsmIzQzO3RhcCwgZGVzYyk7CiYjNDM7CWlmICghY29uZCkKJiM0MzsJCWZhaWxzJiM0MzsmIzQzOzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRGV0ZXJtaW5pc3RpYywgcGVyLXBhZ2UtZGlzdGluY3QgcGF0dGVybiBzbyBhbnkgbWlzLW9yZGVyIG9yIGxlYWsgc2hvd3MuICovCiYjNDM7c3RhdGljIHZvaWQgZmlsbChjaGFyICpiYXNlLCBzaXplX3Qgc3osIHVpbnQzMl90IHNhbHQpCiYjNDM7ewomIzQzOwlmb3IgKHNpemVfdCBvZmYgPSAwOyBvZmYgJmx0OyBzejsgb2ZmICYjNDM7PSBQUykgewomIzQzOwkJdWludDMyX3QgayA9IG9mZiAvIFBTOwomIzQzOwkJdWludDY0X3QgdiA9ICgodWludDY0X3Qpc2FsdCAmbHQ7Jmx0OyAzMikgXiAoayAqIDB4OUUzNzc5QjF1ICYjNDM7IDB4MTIzNCk7CiYjNDM7CiYjNDM7CQlmb3IgKHNpemVfdCBpID0gMDsgaSAmbHQ7IFBTOyBpICYjNDM7PSBzaXplb2YodikpCiYjNDM7CQkJbWVtY3B5KGJhc2UgJiM0Mzsgb2ZmICYjNDM7IGksICZhbXA7diwgc2l6ZW9mKHYpKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdzeXNmcyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICp2YWwpCiYjNDM7ewomIzQzOwlpbnQgZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaW50IHIgPSB3cml0ZShmZCwgdmFsLCBzdHJsZW4odmFsKSk7CiYjNDM7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHIgJmx0OyAwID8gLTEgOiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBGb3JjZSBzdWItUE1EIDY0a0IgbVRIUCBvbmx5LCBzbyBmYXVsdHMgcHJvZHVjZSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcy4gKi8KJiM0MztzdGF0aWMgdm9pZCBzZXR1cF9tdGhwKHZvaWQpCiYjNDM7ewomIzQzOwljb25zdCBjaGFyICp0aHAgPSAmIzM0Oy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlJiMzNDs7CiYjNDM7CWNoYXIgcFsyNTZdOwomIzQzOwlzdGF0aWMgY29uc3QgaW50IGtiW10gPSB7IDE2LCAzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDggfTsKJiM0MzsKJiM0MzsJd3N5c2ZzKCYjMzQ7L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZCYjMzQ7LCAmIzM0O25ldmVyJiMzNDspOwomIzQzOwlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoa2IpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc25wcmludGYocCwgc2l6ZW9mKHApLCAmIzM0OyVzL2h1Z2VwYWdlcy0lZGtCL2VuYWJsZWQmIzM0OywgdGhwLCBrYltpXSk7CiYjNDM7CQl3c3lzZnMocCwga2JbaV0gPT0gT1JERVJfS0IgPyAmIzM0O2Fsd2F5cyYjMzQ7IDogJiMzNDtuZXZlciYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBDb3VudCBob3cgbWFueSBwYWdlcyBzaXQgaW4gYSBjb250aWd1b3VzICZndDs9T1JERVJfS0IgUEZOIHJ1biAodmlhIHBhZ2VtYXApLiAqLwomIzQzO3N0YXRpYyBpbnQgY291bnRfbGFyZ2VfcGFnZXMoY2hhciAqYmFzZSwgc2l6ZV90IHN6KQomIzQzO3sKJiM0MzsJaW50IHBtID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CXNpemVfdCBuID0gc3ogLyBQUywgbGFyZ2UgPSAwOwomIzQzOwl1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7CiYjNDM7CiYjNDM7CWlmIChwbSAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWZvciAoc2l6ZV90IGsgPSAwOyBrICZsdDsgbjsgayYjNDM7JiM0MzspIHsKJiM0MzsJCXVpbnQ2NF90IGVudDsKJiM0MzsJCW9mZl90IGlkeCA9ICgodWludHB0cl90KWJhc2UgJiM0MzsgayAqIFBTKSAvIFBTICogc2l6ZW9mKGVudCk7CiYjNDM7CiYjNDM7CQlpZiAocHJlYWQocG0sICZhbXA7ZW50LCBzaXplb2YoZW50KSwgaWR4KSAhPSBzaXplb2YoZW50KSB8fAomIzQzOwkJICAgICEoZW50ICZhbXA7ICgxVUxMICZsdDsmbHQ7IDYzKSkpCiYjNDM7CQkJcGZuW2tdID0gMDsKJiM0MzsJCWVsc2UKJiM0MzsJCQlwZm5ba10gPSBlbnQgJmFtcDsgKCgxVUxMICZsdDsmbHQ7IDU1KSAtIDEpOwomIzQzOwl9CiYjNDM7CWNsb3NlKHBtKTsKJiM0MzsJZm9yIChzaXplX3QgayA9IDA7IGsgJmx0OyBuOyBrJiM0MzsmIzQzOykKJiM0MzsJCWlmIChrICYjNDM7IDEgJmx0OyBuICZhbXA7JmFtcDsgcGZuW2tdICZhbXA7JmFtcDsgcGZuW2sgJiM0MzsgMV0gPT0gcGZuW2tdICYjNDM7IDEpCiYjNDM7CQkJbGFyZ2UmIzQzOyYjNDM7OwomIzQzOwlmcmVlKHBmbik7CiYjNDM7CXJldHVybiBsYXJnZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGluIEBiYXNlLi5Ac3ogb24gdGhlIHNsb3cgcGF0aCwgcmVhZCB0aGUgcGlubmVkIGJ5dGVzIGJhY2ssIGNvbXBhcmUgdG8gZXhwLiAqLwomIzQzO3N0YXRpYyBpbnQgcGluX3ZlcmlmeShpbnQgZmQsIGNoYXIgKmJhc2UsIHNpemVfdCBzeiwgdWludDMyX3Qgd3IsIGNoYXIgKmV4cCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCBhID0gewomIzQzOwkJLmFkZHIgPSAodWludHB0cl90KWJhc2UsIC5zaXplID0gc3osCiYjNDM7CQkuZmxhZ3MgPSB3ciA/IFVTRV9XUklURSA6IDAsCQkvKiBVU0VfRkFTVCB1bnNldCA9Jmd0OyBzbG93ICovCiYjNDM7CX07CiYjNDM7CWNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkJIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOwomIzQzOwlfX3U2NCBnYSA9ICh1aW50cHRyX3QpZ290OwomIzQzOwlpbnQgcmMgPSAtMTsKJiM0MzsKJiM0MzsJaWYgKGdvdCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAoaW9jdGwoZmQsIFBJTl9MT05HVEVSTV9URVNUX1NUQVJULCAmYW1wO2EpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtTVEFSVCglcykgZmFpbGVkOiAlc1xuJiMzNDssCiYjNDM7CQkJd3IgPyAmIzM0O3dyaXRlJiMzNDsgOiAmIzM0O3JlYWQmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlmIChpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfUkVBRCwgJmFtcDtnYSkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O1JFQUQgZmFpbGVkOiAlc1xuJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQlpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7CiYjNDM7CXJjID0gbWVtY21wKGdvdCwgZXhwLCBzeikgPyAxIDogMDsKJiM0MztvdXQ6CiYjNDM7CW11bm1hcChnb3QsIHN6KTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJUFMgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CXNldHVwX210aHAoKTsKJiM0MzsKJiM0MzsJaW50IGZkID0gb3BlbihHVVBfREVWLCBPX1JEV1IpOwomIzQzOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtvcGVuICVzOiAlcyAoQ09ORklHX0dVUF9URVNUPylcbiYjMzQ7LAomIzQzOwkJCUdVUF9ERVYsIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQlyZXR1cm4gMjsKJiM0MzsJfQomIzQzOwomIzQzOwljaGFyICpyID0gbW1hcChOVUxMLCBSRUdJT04sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChyID09IE1BUF9GQUlMRUQpIHsKJiM0MzsJCXBlcnJvcigmIzM0O21tYXAmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gMjsKJiM0MzsJfQomIzQzOwlmaWxsKHIsIFJFR0lPTiwgMHhBMSk7CQkJCS8qIHBhdHRlcm4gUCAqLwomIzQzOwljaGFyICpleHBQID0gbWFsbG9jKFJFR0lPTik7CiYjNDM7CiYjNDM7CW1lbWNweShleHBQLCByLCBSRUdJT04pOwomIzQzOwomIzQzOwlpbnQgbGFyZ2UgPSBjb3VudF9sYXJnZV9wYWdlcyhyLCBSRUdJT04pOwomIzQzOwomIzQzOwlwcmludGYoJiMzNDsjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcbiYjMzQ7LAomIzQzOwkgICAgICAgbGFyZ2UsIFJFR0lPTiAvIFBTKTsKJiM0MzsJaWYgKGxhcmdlICZsdDsgKGludCkoUkVHSU9OIC8gUFMpIC8gNCkKJiM0MzsJCXByaW50ZigmIzM0OyMgV0FSTjogbGl0dGxlIG1USFAgYmFja2luZzsgYmF0Y2ggcGF0aCBsaWdodGx5IGNvdmVyZWRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyogQTogcmVhZCBwaW4gb3ZlciB3cml0YWJsZSBtVEhQIC0mZ3Q7IGJhdGNoZXMgLSZndDsgY29udGVudCBtdXN0IGVxdWFsIFAuICovCiYjNDM7CW9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMCwgZXhwUCkgPT0gMCwKJiM0MzsJICAgJiMzNDtzbG93IHJlYWQtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzJiMzNDspOwomIzQzOwomIzQzOwkvKiBCOiB3cml0ZSBwaW4gLSZndDsgRk9MTF9XUklURSBiYXRjaCBwYXRoIC0mZ3Q7IGNvbnRlbnQgbXVzdCBlcXVhbCBQLiAqLwomIzQzOwlvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDEsIGV4cFApID09IDAsCiYjNDM7CSAgICYjMzQ7c2xvdyB3cml0ZS1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHMmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIEM6IENPVyBpc29sYXRpb24uIENoaWxkIHdyaXRlLXBpbnMgKHVuc2hhcmVzKSB0aGVuIHJld3JpdGVzOyBwYXJlbnQgUC4gKi8KJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkID09IDApIHsKJiM0MzsJCWludCBjZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7CiYjNDM7CQlpbnQgYSA9IHBpbl92ZXJpZnkoY2ZkLCByLCBSRUdJT04sIDEsIGV4cFApOwkvKiBDT1cgY29weSA9PSBQICovCiYjNDM7CiYjNDM7CQlmaWxsKHIsIFJFR0lPTiwgMHhCMik7CQkJLyogY2hpbGQgd3JpdGVzIFEgKi8KJiM0MzsJCV9leGl0KGEgPT0gMCA/IDAgOiAxKTsKJiM0MzsJfQomIzQzOwlpbnQgc3QgPSAwOwomIzQzOwomIzQzOwl3YWl0cGlkKHBpZCwgJmFtcDtzdCwgMCk7CiYjNDM7CW9rKFdJRkVYSVRFRChzdCkgJmFtcDsmYW1wOyBXRVhJVFNUQVRVUyhzdCkgPT0gMCwKJiM0MzsJICAgJiMzNDtjaGlsZCB3cml0ZS1waW4gYWZ0ZXIgQ09XIHJldHVybnMgY29ycmVjdCAoY29waWVkKSBjb250ZW50cyYjMzQ7KTsKJiM0MzsJb2sobWVtY21wKHIsIGV4cFAsIFJFR0lPTikgPT0gMCwKJiM0MzsJICAgJiMzNDtwYXJlbnQgY29udGVudHMgaW50YWN0IGFmdGVyIGNoaWxkIENPVyB3cml0ZXMmIzM0Oyk7CiYjNDM7CS8qIEQ6IHBhcmVudCByZWFkLXBpbiBhZ2FpbiBhZnRlciB0aGUgQ09XIHNwbGl0IHN0aWxsIGNvcnJlY3QuICovCiYjNDM7CW9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMCwgZXhwUCkgPT0gMCwKJiM0MzsJICAgJiMzNDtwYXJlbnQgc2xvdyByZWFkLXBpbiBhZnRlciBDT1cgc3RpbGwgY29ycmVjdCYjMzQ7KTsKJiM0MzsKJiM0MzsJcHJpbnRmKCYjMzQ7IyB0b3RhbHM6IHBhc3M6JWQgZmFpbDolZFxuJiMzNDssIHRhcCAtIGZhaWxzLCBmYWlscyk7CiYjNDM7CXJldHVybiBmYWlscyA/IDEgOiAwOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmMKaW5kZXggNGY1NTA4MjIzODVhMjAuLjZmZjVkMTAyOTUxN2UzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuYwpAQCAtMzEsNiAmIzQzOzMxLDcgQEAgc3RhdGljIHNpZ2ptcF9idWYgc2lnam1wX2J1Zl9lbnY7CiBzdGF0aWMgY2hhciAqZmlsZSA9ICYjMzQ7L2Rldi9tZW0mIzM0OzsKIHN0YXRpYyBvZmZfdCBmaWxlX29mZnNldDsKIHN0YXRpYyBpbnQgZmQ7CiYjNDM7c3RhdGljIGludCB0YXJnZXRfaXNfcmFtOwogCiBzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnKQogewpAQCAtMTEzLDYgJiM0MzsxMTQsNyBAQCBzdGF0aWMgdm9pZCBwZm5tYXBfaW5pdCh2b2lkKQogCQlpZiAoZXJyKQogCQkJa3NmdF9leGl0X3NraXAoJiMzNDtDYW5ub3QgZmluZCByYW0gdGFyZ2V0IGluICYjMzk7L3Byb2MvaW9tZW0mIzM5OzogJXNcbiYjMzQ7LAogCQkJCSAgICAgICBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQl0YXJnZXRfaXNfcmFtID0gMTsKIAl9IGVsc2UgewogCQlmaWxlX29mZnNldCA9IDA7CiAJfQpAQCAtMjcxLDYgJiM0MzsyNzMsNzAgQEAgVEVTVF9GKHBmbm1hcCwgZm9yaykKIAlBU1NFUlRfRVEocmV0LCAwKTsKIH0KIAomIzQzO1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpCiYjNDM7ewomIzQzOwljaGFyICpwcml2LCAqYnVmOwomIzQzOwlzc2l6ZV90IHJjOwomIzQzOwlpbnQgbWVtX2ZkOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBBIENPV2VkIHBhZ2UgaW4gYSBWTV9QRk5NQVAgbWFwcGluZyBoYXMgYSBzdHJ1Y3QgcGFnZSwgc28gcmVhZGluZyBpdAomIzQzOwkgKiB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtIC0tIF9fYWNjZXNzX3JlbW90ZV92bSgpIC0mZ3Q7IGdldF91c2VyX3BhZ2Vfdm1hKCkKJiM0MzsJICogLS0gcmV0dXJucyBpdCBkaXJlY3RseSwgaW5zdGVhZCBvZiByb3V0aW5nIHRvIHZtYS0mZ3Q7dm1fb3BzLSZndDthY2Nlc3MoKSwKJiM0MzsJICogd2hpY2ggaW9yZW1hcHMgdGhlIFBGTiBhbmQgY2Fubm90IHJlYWNoIGEgQ09XZWQgUkFNIHBhZ2UuCiYjNDM7CSAqCiYjNDM7CSAqIE1hcCB0aGUgZmlsZSBNQVBfUFJJVkFURSBhbmQgd3JpdGFibGUsIHdyaXRlIHRvIENPVyBhIHBhZ2UgaW50byBhbm9uCiYjNDM7CSAqIG1lbW9yeSwgdGhlbiByZWFkIHRoZSBwYWdlIGJhY2sgdGhyb3VnaCAvcHJvYy9zZWxmL21lbS4KJiM0MzsJICovCiYjNDM7CXNlbGYtJmd0O3NpemUyID0gc2VsZi0mZ3Q7cGFnZXNpemU7CiYjNDM7CXNlbGYtJmd0O2FkZHIyID0gbW1hcChOVUxMLCBzZWxmLSZndDtzaXplMiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkgICBNQVBfUFJJVkFURSwgZmQsIGZpbGVfb2Zmc2V0KTsKJiM0MzsJaWYgKHNlbGYtJmd0O2FkZHIyID09IE1BUF9GQUlMRUQpCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtDYW5ub3QgY3JlYXRlIGEgd3JpdGFibGUgcHJpdmF0ZSBwZm5tYXAgbWFwcGluZyYjMzQ7KTsKJiM0MzsJcHJpdiA9IHNlbGYtJmd0O2FkZHIyOwomIzQzOwomIzQzOwkvKiBDT1cgdGhlIHBhZ2UgYW5kIHN0YW1wIGtub3duIGJ5dGVzIGludG8gdGhlIGFub24gY29weS4gKi8KJiM0MzsJcHJpdlswXSA9IDB4NDI7CiYjNDM7CXByaXZbc2VsZi0mZ3Q7cGFnZXNpemUgLSAxXSA9IDB4MjQ7CiYjNDM7CiYjNDM7CWJ1ZiA9IG1hbGxvYyhzZWxmLSZndDtwYWdlc2l6ZSk7CiYjNDM7CUFTU0VSVF9ORShidWYsIE5VTEwpOwomIzQzOwomIzQzOwltZW1fZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9tZW0mIzM0OywgT19SRE9OTFkpOwomIzQzOwlBU1NFUlRfR0UobWVtX2ZkLCAwKTsKJiM0MzsJcmMgPSBwcmVhZChtZW1fZmQsIGJ1Ziwgc2VsZi0mZ3Q7cGFnZXNpemUsIChvZmZfdCkodWludHB0cl90KXByaXYpOwomIzQzOwljbG9zZShtZW1fZmQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEocmMsIChzc2l6ZV90KXNlbGYtJmd0O3BhZ2VzaXplKTsKJiM0MzsJRVhQRUNUX0VRKGJ1ZlswXSwgMHg0Mik7CiYjNDM7CUVYUEVDVF9FUShidWZbc2VsZi0mZ3Q7cGFnZXNpemUgLSAxXSwgMHgyNCk7CiYjNDM7CiYjNDM7CWZyZWUoYnVmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKHBmbm1hcCwgcHJvY21lbV9wZm5fcmVhZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzY0XTsKJiM0MzsJc3NpemVfdCByYzsKJiM0MzsJaW50IG1lbV9mZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQSByYXcgUEZOIG9mIGEgVk1fSU8vVk1fUEZOTUFQIG1hcHBpbmcgaGFzIG5vIHN0cnVjdCBwYWdlLCBzbwomIzQzOwkgKiBfX2FjY2Vzc19yZW1vdGVfdm0oKSByZWFjaGVzIGl0IHRocm91Z2ggdm1hLSZndDt2bV9vcHMtJmd0O2FjY2VzcygpCiYjNDM7CSAqIChnZW5lcmljX2FjY2Vzc19waHlzKCkpLiBUaGF0IGlvcmVtYXBzIHRoZSBQRk4sIHdoaWNoIGlzIHJlamVjdGVkIGZvcgomIzQzOwkgKiBSQU0sIHNvIHRoaXMgb25seSBhcHBsaWVzIHRvIGdlbnVpbmUgZGV2aWNlIG1lbW9yeS4KJiM0MzsJICovCiYjNDM7CWlmICh0YXJnZXRfaXNfcmFtKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7VGFyZ2V0IGlzIFN5c3RlbSBSQU07IC0mZ3Q7YWNjZXNzKCkgY2Fubm90IGlvcmVtYXAgUkFNJiMzNDspOwomIzQzOwomIzQzOwltZW1fZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9tZW0mIzM0OywgT19SRE9OTFkpOwomIzQzOwlBU1NFUlRfR0UobWVtX2ZkLCAwKTsKJiM0MzsJcmMgPSBwcmVhZChtZW1fZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIChvZmZfdCkodWludHB0cl90KXNlbGYtJmd0O2FkZHIxKTsKJiM0MzsJY2xvc2UobWVtX2ZkKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHJjLCAoc3NpemVfdClzaXplb2YoYnVmKSk7CiYjNDM7fQomIzQzOwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWZvciAoaW50IGkgPSAxOyBpICZsdDsgYXJnYzsgaSYjNDM7JiM0MzspIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKaW5kZXggOGMyOTZkZWRmMDQ3NGQuLmI0OWEzZWIwYzIwNTA4IDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaApAQCAtMjg5LDYgJiM0MzsyODksNyBAQCBmaQogIyBEdW1wIHBhZ2VzIDAsIDE5LCBhbmQgNDA5NiwgdXNpbmcgcGluX3VzZXJfcGFnZXM6CiBDQVRFR09SWT0mIzM0O2d1cF90ZXN0JiMzNDsgcnVuX3Rlc3QgLi9ndXBfdGVzdCAtY3QgLUYgMHgxIDAgMTkgMHgxMDAwCiBDQVRFR09SWT0mIzM0O2d1cF90ZXN0JiMzNDsgcnVuX3Rlc3QgLi9ndXBfbG9uZ3Rlcm0KJiM0MztDQVRFR09SWT0mIzM0O2d1cF90ZXN0JiMzNDsgcnVuX3Rlc3QgLi9tdGhwX2d1cF9jb3dfdGVzdAogCiBDQVRFR09SWT0mIzM0O3VzZXJmYXVsdGZkJiMzNDsgcnVuX3Rlc3QgLi91ZmZkLXVuaXQtdGVzdHMKIHVmZmRfc3RyZXNzX2Jpbj0uL3VmZmQtc3RyZXNzCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNzc3CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogODYwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEdVUCBhbmQgUmVtb3RlIFZNIEFjY2VzcyBQYXRjaCBTZXJpZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIHRoYXQmIzM5O3Mgb3ZlcmhhdWxpbmcgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCBoaXR0aW5nIGBtbS9ndXAuY2AsIGBtbS9tZW1vcnkuY2AsIGFuZCBzb21lIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIGxpa2UgYXJtNjQsIHJpc2N2LCBhbmQgeDg2LiBUaGUgY29yZSBvZiBpdCBzZWVtcyB0byBiZSBhYm91dCByZWZpbmluZyB0aGUgbWVjaGFuaXNtcyBmb3IgR1VQIChHZXQgVXNlciBQYWdlKSBhbmQgcmVtb3RlIFZNIGFjY2Vzcy4KClRoZSBtYWluIGdpc3QgaXMgdGhlIGludHJvZHVjdGlvbiBvZiBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYCwgYW5kIGEgbmV3IGByZW1vdGVfdm1fd2Fsa2AgbWVjaGFuaXNtLCB3aGljaCB3aWxsIGxpa2VseSBhZmZlY3QgdGhlIGVmZmljaWVuY3kgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gV2Ugc2VlIGByZW1vdGVfdm1fd2Fsa2AgYmVpbmcgdXNlZCBieSBgX19hY2Nlc3NfcmVtb3RlX3ZtYCBhbmQgYF9fY29weV9yZW1vdGVfdm1fc3RyYCB0byBtYWtlIGEgbW9yZSBzdHJ1Y3R1cmVkIHdheSB0byBhY2Nlc3MgYW5kIGNvcHkgZGF0YSBiZXR3ZWVuIFZNcy4gIFRoZXkmIzM5O3ZlIGFsc28gYmVlZmVkIHVwIHRoZSBiYXRjaGluZyBmb3IgY29udGlndW91cyBwYWdlcyBpbiBgZm9sbG93X3BhZ2VfbWFza2AgYW5kIGBmb2xsb3dfcGFnZV9wdGVgLCBpbXBvcnRhbnQgZm9yIHRob3NlIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKS4KCkRpdmluZyBpbnRvIGBtbS9ndXAuY2AsIHRoZSBuZXcgYGZvbGxvd19wdGVfYmF0Y2hgIGlzIGEgd2VsY29tZSBhZGRpdGlvbiwgYW5kIHRoZSB1cGRhdGVzIHRvIHRoZSBgZm9sbG93X2h1Z2VfKmAgZnVuY3Rpb25zIHN1Z2dlc3QgYSBmb2N1cyBvbiBtVEhQIHN1cHBvcnQsIG1ha2luZyB0aGVtIHJldHVybiBgbnJfcGFnZXNgLiBJIHNlZSB0aGF0IGBmYXVsdGluX3BhZ2VgIGlzIGdldHRpbmcgYSBiaXQgb2YgbG92ZSB0b28sIGhhbmRsaW5nIGBGT0xMX1ZNQV9MT0NLYC4gIGBnZXRfdXNlcl9wYWdlX3ZtYWAgc291bmRzIGxpa2UgYSBuaWNlIGFic3RyYWN0aW9uIGZvciBnZXR0aW5nIGEgcGFnZSBmcm9tIGEgVk1BLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbnQgbG9ja2luZyBzY2hlbWVzLiBBbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgaXMgdGhlIHJlcGxhY2VtZW50IGZvciBgZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlYCwgd2hpY2ggaXMgYSBrZXkgY2hhbmdlIHRvIHRyYWNrLgoKTm93LCBvdmVyIGluIGBtbS9tZW1vcnkuY2AsIHRoZSBhZGRpdGlvbiBvZiBgYWNjZXNzX3JlbW90ZV92bWFfb3BzYCwgYHJlbW90ZV9hY2Nlc3NfbG9ja2AgYW5kIGByZW1vdGVfYWNjZXNzX3VubG9ja2AgbG9vayBsaWtlIHRoZXkmIzM5O3JlIHNvbGlkaWZ5aW5nIHRoZSByZW1vdGUgVk0gYWNjZXNzIGluZnJhc3RydWN0dXJlLiBUaGUgcmVhbCB3b3JraG9yc2UgaGVyZSBpcyBgcmVtb3RlX3ZtX3dhbGtgLCB3aGljaCBpcyBub3cgdGhlIGNvcmUgbWVjaGFuaXNtIHVzZWQgYnkgYF9fYWNjZXNzX3JlbW90ZV92bWAgKGFsb25nIHdpdGggYGFjY2Vzc192bV9wYWdlYCkgYW5kIGBfX2NvcHlfcmVtb3RlX3ZtX3N0cmAgKHdpdGggYGNvcHlfdm1fc3RyYCkgdG8gbWFrZSB0aGUgb3BlcmF0aW9ucyBtdWNoIG1vcmUgc3RydWN0dXJlZC4KClRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgc2hpZnQgaW4gaG93IHdlIGhhbmRsZSBHVVAgYW5kIHJlbW90ZSBhY2Nlc3MuIFRoaXMgbmVlZHMgc29tZSBzZXJpb3VzIGZ1enppbmcgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcm9jayBzb2xpZC4gSSYjMzk7bSBnb2luZyB0byBrZWVwIGFuIGV5ZSBvbiB0aGVzZSBzeW1ib2xzOiBgZ2V0X3VzZXJfcGFnZV92bWFgLCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCwgYHJlbW90ZV92bV93YWxrYCwgYGFjY2Vzc192bV9wYWdlYCwgYGNvcHlfdm1fc3RyYCwgYGZvbGxvd19wdGVfYmF0Y2hgLCBgZmF1bHRpbl9wYWdlYCwgYF9fYWNjZXNzX3JlbW90ZV92bWAsIGFuZCBgX19jb3B5X3JlbW90ZV92bV9zdHJgLgoKTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbmZpZ3Mgd2UgbmVlZCB0byBrZWVwIGluIG1pbmQuIFNpbmNlIGl0JiMzOTtzIHRvdWNoaW5nIGBtbS9ndXAuY2AgYW5kIGBtbS9tZW1vcnkuY2AsIHRoYXQgbWVhbnMgd2UmIzM5O3JlIGluIGNvcmUgTU0gdGVycml0b3J5LiBJIHNlZSBgQ09ORklHX1BFUl9WTUFfTE9DS2AgaXMgbWVudGlvbmVkIGluIGByZW1vdGVfYWNjZXNzX2xvY2tgLCBhbmQgYENPTkZJR19NTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFYCBpcyBhbm90aGVyIG9uZSB0byBjb25zaWRlci4gQW5kIG9mIGNvdXJzZSwgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZGVmaW5pdGVseSByZWxldmFudCBnaXZlbiB0aGUgY2hhbmdlcyB0byBtVEhQIGFuZCB0aGUgYGZvbGxvd19odWdlXypgIGZ1bmN0aW9ucy4KCkkgdGhpbmsgSSYjMzk7bGwgZW5hYmxlIGBDT05GSUdfUEVSX1ZNQV9MT0NLYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgZHVyaW5nIHRlc3RpbmcsIGp1c3QgdG8gY292ZXIgYWxsIGJhc2VzLiBJJiMzOTtsbCBzZWFyY2ggZm9yIGByZW1vdGVfdm1fd2Fsa2AgaW4gYG1tL21lbW9yeS5jYCB0byBzZWUgaWYgaXQmIzM5O3MgdW5kZXIgYW55IHNwZWNpZmljIGNvbmZpZywgYnV0IGl0IGxvb2tzIGxpa2UgaXQmIzM5O3MgaW4gdGhlIG1haW4gYm9keS4KClRpbWUgdG8gcGVlayBpbnRvIHRoZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgc3R1ZmYuIExvb2tzIGxpa2UgYENPTkZJR19SSVNDVl9JU0FfU1VQTWAgaXMgcmVsZXZhbnQgZm9yIFJJU0MtViBhbmQgYENPTkZJR19BRERSRVNTX01BU0tJTkdgIGZvciB4ODYuCgpBbHJpZ2h0LCBJJiMzOTtsbCBuZWVkIHRvIHJ1biB0aGlzIHRocm91Z2ggc29tZSB2ZXJpZmljYXRpb24gdG9vbHMgdG8gYmUgc3VyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtyZW1vdGVfdm1fd2FsayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTcxMDE9dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vbWVtb3J5LmMtNzExNC0gKi9cbm1tL21lbW9yeS5jOjcxMTU6c3RhdGljIGludCByZW1vdGVfdm1fd2FsayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsXG5tbS9tZW1vcnkuYy03MTE2LVx0XHRcdCAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncywgYm9vbCBjYW5fZXhwYW5kX3N0YWNrLFxuLS1cbm1tL21lbW9yeS5jPTcyNDc9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy03MjUxLVxubW0vbWVtb3J5LmM6NzI1MjpcdHJldHVybiByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgdHJ1ZSxcbm1tL21lbW9yeS5jLTcyNTMtXHRcdFx0ICAgICAgYWNjZXNzX3ZtX3BhZ2UsIFx1MDAyNmVycik7XG4tLVxubW0vbWVtb3J5LmM9NzM0ND1zdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtNzM1MC1cbm1tL21lbW9yeS5jOjczNTE6XHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcbm1tL21lbW9yeS5jLTczNTItXHRcdFx0ICAgICAgIGNvcHlfdm1fc3RyLCBcdTAwMjZlcnIpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1OTI0CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBjb25zaWRlcmF0aW9ucywgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGRlZXBseSBmYW1pbGlhciB3aXRoIGtlcm5lbCBpbnRlcm5hbHM6CgoqKlByaW9yaXRpemluZyBGdXp6aW5nIFRhcmdldHMgaW4gdGhlIFZNIFN1YnN5c3RlbSoqCgpBbHJpZ2h0LCBsb29raW5nIGF0IHRoZSBsYW5kc2NhcGUsIGl0JiMzOTtzIGNsZWFyIHRoYXQgYHJlbW90ZV92bV93YWxrYCwgYGdldF91c2VyX3BhZ2Vfdm1hYCwgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAsIGFuZCBgZm9sbG93X3B0ZV9iYXRjaGAgYXJlIHRoZSByZWFsIHByZXNzdXJlIHBvaW50cyBpbiB0aGUgdmlydHVhbCBtZW1vcnkgc3Vic3lzdGVtLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGFic29sdXRlbHkgY3JpdGljYWwsIHNlcnZpbmcgYXMgdGhlIGdhdGV3YXlzIGZvciB1c2VyLXNwYWNlIGludGVyYWN0aW9ucyBhbmQgcGFnZSB0YWJsZSB0cmF2ZXJzYWwuIFRoZXkmIzM5O3JlIHRoZSBraW5kIG9mIGZ1bmN0aW9ucyB0aGF0LCBpZiB0aGV5IGhhdmUgdnVsbmVyYWJpbGl0aWVzLCBjb3VsZCBsZWFkIHRvIHdpZGVzcHJlYWQgYW5kIGRldmFzdGF0aW5nIGNvbnNlcXVlbmNlcy4gVGhlcmVmb3JlLCB0aGVzZSBhcmUgKmFic29sdXRlbHkqIHRoZSBmdW5jdGlvbnMgdGhhdCBJIHdhbnQgdG8gc3ViamVjdCB0byBpbnRlbnNlIGZ1enppbmcgZWZmb3J0cy4gVGhleSYjMzk7cmUgdGhlIGxvdy1oYW5naW5nIGZydWl0IHdoZXJlIHRoZSByZXdhcmQgaXMgaGlnaCwgYW5kIGJ1Z3MgaGF2ZSB0aGUgcG90ZW50aWFsIGZvciBkcmFtYXRpYyBpbXBhY3QuCgpBbmQgc2luY2Ugd2UgYXJlIHRhbGtpbmcgYWJvdXQgVk0gYW5kIG1lbW9yeS1tYW5hZ2VtZW50LCBJIHNob3VsZCBhbHNvIGNoZWNrIHRob3NlIG9ic2N1cmUgY29uZmlndXJhdGlvbnM6IGBDT05GSUdfUEVSX1ZNQV9MT0NLYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkgYW0gc3VyZSB0aGV5JiMzOTtsbCBhZGQgY29tcGxleGl0eSB0byB0aGUgZnVuY3Rpb25zIEkgbWVudGlvbmVkIGFib3ZlIGFuZCBhcmUgY3JpdGljYWwgcG9pbnRzIGZvciBzZWN1cml0eS4gV2UgbWF5IG5lZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnV6emluZyB2ZWN0b3JzIHRvIHRhcmdldCB0aGVzZSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyBhbmQgZmluZCBtb3JlIGJ1Z3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UEVSX1ZNQV9MT0NLJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTE0MzM9Y29uZmlnIExSVV9HRU5fV0FMS1NfTU1VXG4tLVxubW0vS2NvbmZpZy0xNDM3LVxubW0vS2NvbmZpZzoxNDM4OmNvbmZpZyBBUkNIX1NVUFBPUlRTX1BFUl9WTUFfTE9DS1xubW0vS2NvbmZpZy0xNDM5LSAgICAgICBkZWZfYm9vbCBuXG5tbS9LY29uZmlnLTE0NDAtXG5tbS9LY29uZmlnOjE0NDE6Y29uZmlnIFBFUl9WTUFfTE9DS1xubW0vS2NvbmZpZy0xNDQyLVx0ZGVmX2Jvb2wgeVxubW0vS2NvbmZpZzoxNDQzOlx0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1BFUl9WTUFfTE9DSyBcdTAwMjZcdTAwMjYgTU1VIFx1MDAyNlx1MDAyNiBTTVBcbm1tL0tjb25maWctMTQ0NC1cdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQ3NAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqQ2hlY2tpbmcgdGhlIFZNQSBMb2NraW5nIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgc28gdGhlIHN5c3RlbSBJJiMzOTttIHdvcmtpbmcgd2l0aCBpcyBsaWtlbHkgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IGxldmVyYWdlIGBQRVJfVk1BX0xPQ0tgLCBidXQgb25seSBpZiB0aGUgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIGl0LCB3aGljaCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBUaGUgY29kZSYjMzk7cyBhbHJlYWR5IGhhbmRsaW5nIHRoZSBjb25kaXRpb25hbCBlbmFibGluZyBiYXNlZCBvbiBgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tgLCBzbyB0aGF0JiMzOTtzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGludGVyYWN0cyB3aXRoIHRoZSBvdmVyYWxsIG1lbW9yeSBtYW5hZ2VtZW50IHN0cmF0ZWd5LCBJIG5lZWQgdG8gY29uc2lkZXIgdHJhbnNwYXJlbnQgaHVnZXBhZ2VzLiBMZXQgbWUganVzdCBxdWlja2x5IGNoZWNrIGhvdyBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBzZXQuIFRoYXQmIzM5O2xsIGdpdmUgbWUgYSBjbGVhcmVyIHBpY3R1cmUgb2YgcG90ZW50aWFsIGxvY2sgY29udGVudGlvbiBhbmQgaG93IHRoZXNlIFZNQSBsb2NrcyBhcmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgaHVnZXBhZ2UgYWxsb2NhdGlvbnMuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0aGVzZSB0d28gY29uZmlncyBhZmZlY3QgZWFjaCBvdGhlciBzbyBJIGNhbiBvcHRpbWl6ZSB0aGUgbWVtb3J5IHNldHVwIGZvciB0aGlzIHdvcmtsb2FkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgyNz1jb25maWcgUEVSU0lTVEVOVF9IVUdFX1pFUk9fRk9MSU9cbm1tL0tjb25maWctODI4LVx0Ym9vbCBcJiMzNDtBbGxvY2F0ZSBhIFBNRCBzaXplZCBmb2xpbyBmb3IgemVyb2luZ1wmIzM0O1xubW0vS2NvbmZpZzo4Mjk6XHRkZXBlbmRzIG9uIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTgzMC1cdGhlbHBcbi0tXG5tbS9LY29uZmlnPTg0Mz1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTg0NS1cbm1tL0tjb25maWc6ODQ2Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODQ3LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG5tbS9LY29uZmlnOjg0ODpcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVFxubW0vS2NvbmZpZy04NDktXHRzZWxlY3QgQ09NUEFDVElPTlxuLS1cbm1tL0tjb25maWctODYxLVxubW0vS2NvbmZpZzo4NjI6aWYgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODYzLVxubW0vS2NvbmZpZz04NjQ9Y2hvaWNlXG5tbS9LY29uZmlnLTg2NS1cdHByb21wdCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0IHN5c2ZzIGRlZmF1bHRzXCYjMzQ7XG5tbS9LY29uZmlnOjg2NjpcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg2Ny1cdGhlbHBcbi0tXG5tbS9LY29uZmlnLTg2OS1cbm1tL0tjb25maWc6ODcwOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NzEtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzYtXG5tbS9LY29uZmlnOjg3NzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg3OC1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04ODUtXG5tbS9LY29uZmlnOjg4NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04ODctXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg5Mz1jaG9pY2Vcbm1tL0tjb25maWctODk0LVx0cHJvbXB0IFwmIzM0O1NobWVtIGh1Z2VwYWdlIGFsbG9jYXRpb24gZGVmYXVsdHNcJiMzNDtcbm1tL0tjb25maWc6ODk1Olx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5Ni1cdGhlbHBcbi0tXG5tbS9LY29uZmlnLTkwMi1cbm1tL0tjb25maWc6OTAzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTA0LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTItXG5tbS9LY29uZmlnOjkxMzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MTQtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MjAtXG5tbS9LY29uZmlnOjkyMTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkyMi1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTI4LVxubW0vS2NvbmZpZzo5Mjk6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTMwLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTM4PWNob2ljZVxubW0vS2NvbmZpZy05MzktXHRwcm9tcHQgXCYjMzQ7VG1wZnMgaHVnZXBhZ2UgYWxsb2NhdGlvbiBkZWZhdWx0c1wmIzM0O1xubW0vS2NvbmZpZzo5NDA6XHRkZWZhdWx0IFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTQxLVx0aGVscFxuLS1cbm1tL0tjb25maWctOTQ3LVxubW0vS2NvbmZpZzo5NDg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05NDktXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Ni1cbm1tL0tjb25maWc6OTU3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk1OC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk2NC1cbm1tL0tjb25maWc6OTY1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTY2LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NzItXG5tbS9LY29uZmlnOjk3MzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NzQtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05OTI9Y29uZmlnIE5PX1BBR0VfTUFQQ09VTlRcbi0tXG5tbS9LY29uZmlnLTEwMDQtXG5tbS9LY29uZmlnOjEwMDU6ZW5kaWYgIyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy0xMDA2LVxuLS1cbm1tL0tjb25maWc9MTAxND1jb25maWcgUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVNcbm1tL0tjb25maWc6MTAxNTpcdGRlZl9ib29sIFRSQU5TUEFSRU5UX0hVR0VQQUdFIHx8IEhVR0VUTEJfUEFHRVxubW0vS2NvbmZpZy0xMDE2LVxuLS1cbm1tL0tjb25maWc9MTAyMD1jb25maWcgSEFWRV9HSUdBTlRJQ19GT0xJT1Ncbm1tL0tjb25maWctMTAyMS1cdGRlZl9ib29sIChIVUdFVExCX1BBR0UgXHUwMDI2XHUwMDI2IEFSQ0hfSEFTX0dJR0FOVElDX1BBR0UpIHx8IFxcXG5tbS9LY29uZmlnOjEwMjI6XHRcdCAoWk9ORV9ERVZJQ0UgXHUwMDI2XHUwMDI2IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRV9QVUQpXG5tbS9LY29uZmlnLTEwMjMtXG4tLVxubW0vS2NvbmZpZz0xMDI4PWNvbmZpZyBBUkNIX1NVUFBPUlRTX0hVR0VfUEZOTUFQXG5tbS9LY29uZmlnLTEwMjktXHRkZWZfYm9vbCBuXG5tbS9LY29uZmlnOjEwMzA6XHRkZXBlbmRzIG9uIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTEwMzEtXG5tbS9LY29uZmlnPTEwMzI9Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUE1EX1BGTk1BUFxubW0vS2NvbmZpZy0xMDMzLVx0ZGVmX2Jvb2wgeVxubW0vS2NvbmZpZzoxMDM0Olx0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX0hVR0VfUEZOTUFQIFx1MDAyNlx1MDAyNiBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctMTAzNS1cbm1tL0tjb25maWc9MTAzNj1jb25maWcgQVJDSF9TVVBQT1JUU19QVURfUEZOTUFQXG5tbS9LY29uZmlnLTEwMzctXHRkZWZfYm9vbCB5XG5tbS9LY29uZmlnOjEwMzg6XHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfSFVHRV9QRk5NQVAgXHUwMDI2XHUwMDI2IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRV9QVURcbm1tL0tjb25maWctMTAzOS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODI3MQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEwMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgS2VybmVsIENvbmZpZ3VyYXRpb25zIGFuZCBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBjb25maWc7IHRoYXQgc2VlbXMgbGlrZSBhIHNvbGlkIGFkZGl0aW9uLCBnZW5lcmFsbHkgc3BlYWtpbmcuIEkmIzM5O20gYWxzbyBzZWVpbmcgcmVmZXJlbmNlcyB0byBgR1VQX1RFU1RgIGluIHRoZSBzZWxmdGVzdCBwcm9jZWR1cmUsIGJ1dCB0aGUgYWN0dWFsLCBjb3JlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWxhdGVkIGxvZ2ljIHNlZW1zIHRvIGJlIHJlc2lkaW5nIHdpdGhpbiBgbW0vZ3VwLmNgIGFuZCBgbW0vbWVtb3J5LmNgLiBJJiMzOTtsbCB3YW50IHRvIHF1aWNrbHkgdmVyaWZ5IGlmIHRoZSBgR1VQX1RFU1RgIGRlZmluZSBpcyBhY3R1YWxseSAqcmVxdWlyZWQqIGZvciB0aGUgZnVuY3Rpb25hbGl0eSBpbiB0aG9zZSBjb3JlIGZpbGVzLCBvciBpZiBpdCYjMzk7cyBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgc2VsZi10ZXN0IHByb2NlZHVyZXMuIEhtbSwgaXQgbG9va3MgbGlrZSBpdCBpcyBqdXN0IGZvciB0aGUgc2VsZnRlc3QuCgpOb3csIGxldCYjMzk7cyB0dXJuIG15IGF0dGVudGlvbiB0byBgQ09ORklHX1JJU0NWX0lTQV9TVVBNYC4uLiBJJiMzOTtsbCBuZWVkIHRvIGludmVzdGlnYXRlIHRoYXQgbmV4dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UklTQ1ZfSVNBX1NVUE0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDthcmNoL3Jpc2N2L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9yaXNjdi9LY29uZmlnPTU1Mz1jb25maWcgUklTQ1ZfSVNBX0Ncbi0tXG5hcmNoL3Jpc2N2L0tjb25maWctNTYzLVxuYXJjaC9yaXNjdi9LY29uZmlnOjU2NDpjb25maWcgUklTQ1ZfSVNBX1NVUE1cbmFyY2gvcmlzY3YvS2NvbmZpZy01NjUtXHRib29sIFwmIzM0O1N1cG0gZXh0ZW5zaW9uIGZvciB1c2Vyc3BhY2UgcG9pbnRlciBtYXNraW5nXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4Njc1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipOYXZpZ2F0aW5nIFByb2Nlc3NvciBBcmNoaXRlY3R1cmVzKioKClJpZ2h0LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBSSVNDLVYgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSAoSVNBKSBoZXJlLiBTcGVjaWZpY2FsbHksIGBSSVNDVl9JU0FfU1VQTWDigJR0aGF0JiMzOTtzIGEgcHJldHR5IGNsZWFyIGluZGljYXRvciB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIFJJU0MtViwgYW5kIHByb2JhYmx5IHNvbWV0aGluZyB0byBkbyB3aXRoIHN1cGVydmlzb3IgbW9kZSBvciBzb21lIHJlbGF0ZWQgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiBzZXQgZXh0ZW5zaW9uLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBkZWVwZXIgb24gdGhhdCBpZiBpdCBjb21lcyB1cC4KCkJ1dCBub3csIEkmIzM5O20gc3dpdGNoaW5nIGdlYXJzIGFuZCBteSBtaW5kIGlzIGF1dG9tYXRpY2FsbHkgZ29pbmcgdG8gdGhlIHg4NiBhcmNoaXRlY3R1cmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBOb3csIGEgY3JpdGljYWwgcG9pbnQgZm9yIHg4NiBpcyBgQ09ORklHX0FERFJFU1NfTUFTS0lOR2AuIFRoaXMgc3VnZ2VzdHMgc29tZXRoaW5nIGFib3V0IGhvdyBtZW1vcnkgYWRkcmVzc2VzIGFyZSBoYW5kbGVkLCBwb3RlbnRpYWxseSByZWxhdGVkIHRvIFBBRSAoUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24pLCBvciBwZXJoYXBzIGEgbW9yZSBmaW5lLWdyYWluZWQgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50IHNjaGVtZS4gSSYjMzk7bGwgY2hlY2sgdGhhdCB2YXJpYWJsZSwgYW5kIHNlZSBleGFjdGx5IHdoaWNoIGNvbmZpZ3VyYXRpb24gZmxhZ3MgYXJlIGluIHVzZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QUREUkVTU19NQVNLSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC94ODYvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL3g4Ni9LY29uZmlnPTIxMzU9Y29uZmlnIFJBTkRPTUlaRV9NRU1PUllfUEhZU0lDQUxfUEFERElOR1xuLS1cbmFyY2gveDg2L0tjb25maWctMjE0OS1cbmFyY2gveDg2L0tjb25maWc6MjE1MDpjb25maWcgQUREUkVTU19NQVNLSU5HXG5hcmNoL3g4Ni9LY29uZmlnLTIxNTEtXHRib29sIFwmIzM0O0xpbmVhciBBZGRyZXNzIE1hc2tpbmcgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTA0OAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDUxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW1wbGVtZW50aW5nIGBBRERSRVNTX01BU0tJTkdgIGZvciB4ODYg4oCTIGdvdCBpdC4gSXQmIzM5O3MgdG91Y2hpbmcgYG1tL2d1cC5jYCBhbmQgYG1tL21lbW9yeS5jYCwgd2hpY2ggYXJlIGNyaXRpY2FsIGtlcm5lbCBmaWxlcywgc28gdGhhdCBpbW1lZGlhdGVseSBmbGFncyBpdCBhcyBpbnRlcmVzdGluZy4gSSBzZWUgYSB3aG9sZSBzbGV3IG9mIG5ldyBmdW5jdGlvbnMgaW50cm9kdWNlZCBpbiB0aGlzIHBhdGNoOiBgZ2V0X3VzZXJfcGFnZV92bWFgLCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCwgYHJlbW90ZV92bV93YWxrYCwgYGFjY2Vzc192bV9wYWdlYCwgYGNvcHlfdm1fc3RyYCwgYW5kIGBmb2xsb3dfcHRlX2JhdGNoYC4gVGhlc2UgYXJlIHNjcmVhbWluZyBmb3IgZnV6emluZywgbm8gZG91YnQuCgpMZXQmIzM5O3MgbWFrZSBhIGxpc3Qgb2YgdGhlIGtleSBzeW1ib2xzIHRvIGZvY3VzIG9uLiBPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoZSBvcmlnaW5hbCBsaXN0LCBidXQgbm93IHdlIHNob3VsZCBhbHNvIGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zOgotIGBmYXVsdGluX3BhZ2VgCi0gYF9fYWNjZXNzX3JlbW90ZV92bWAKLSBgX19jb3B5X3JlbW90ZV92bV9zdHJgCgpOb3csIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGNsZWFyOiBwcmlvcml0aXplIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIGVudHJ5IHBvaW50cy4gU28sIGxldCYjMzk7cyBzZWUgaWYgdGhvc2UgbmV3IGZ1bmN0aW9ucyBhcmUgc3RhdGljIGJlY2F1c2Ugc3RhdGljIGhlbHBlcnMgYXJlIG9mdGVuIGlubGluZWQgYW5kIGRvbiYjMzk7dCBvZmZlciBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGZvciBmdXp6aW5nLiBEYW1uLCBsb29rcyBsaWtlIHRoZXkgYXJlIGFsbCBzdGF0aWMgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGZvciBmdXp6aW5nIQoKT2theSwgbGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBub24tc3RhdGljIGVudHJ5IHBvaW50cyBpbiBgbW0vbWVtb3J5LmNgLiBJIHNlZSBgYWNjZXNzX3JlbW90ZV92bWAgYW5kIGBhY2Nlc3NfcHJvY2Vzc192bWAgKGJvdGggYEVYUE9SVF9TWU1CT0xfR1BMYCkuICBBbmQgdGhlbiBgY29weV9mcm9tX3VzZXJfcGFnZWAgYW5kIGBjb3B5X3RvX3VzZXJfcGFnZWAgdGhhdCB3ZXJlbiYjMzk7dCBjaGFuZ2VkLiBHb29kLiBXYWl0LCBpdCBsb29rcyBsaWtlIGBfX2FjY2Vzc19yZW1vdGVfdm1gIGlzIGNhbGxlZCBieSBgYWNjZXNzX3JlbW90ZV92bWAgYW5kIGBhY2Nlc3NfcHJvY2Vzc192bWAuIExvb2tzIGxpa2UgYF9fY29weV9yZW1vdGVfdm1fc3RyYCBpcyBjYWxsZWQgYnkgYGNvcHlfcmVtb3RlX3ZtX3N0cmAuIElzIHRoaXMgZXhwb3J0ZWQ/IEkgc2hvdWxkIGNoZWNrIHRoaXMuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29weV9yZW1vdGVfdm1fc3RyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmM9NzMwND1zdGF0aWMgaW50IGNvcHlfdm1fc3RyKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbi0tXG5tbS9tZW1vcnkuYy03MzQzLSAqL1xubW0vbWVtb3J5LmM6NzM0NDpzdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy03MzQ1LVx0XHRcdFx0dm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuLS1cbm1tL21lbW9yeS5jLTczNjItLyoqXG5tbS9tZW1vcnkuYzo3MzYzOiAqIGNvcHlfcmVtb3RlX3ZtX3N0ciAtIGNvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MmIzM5O3MgYWRkcmVzcyBzcGFjZS5cbm1tL21lbW9yeS5jLTczNjQtICogQHRzazpcdHRoZSB0YXNrIG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZVxuLS1cbm1tL21lbW9yeS5jLTczNzUtICovXG5tbS9tZW1vcnkuYzo3Mzc2OmludCBjb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL21lbW9yeS5jLTczNzctXHRcdCAgICAgICB2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vbWVtb3J5LmMtNzM5MC1cbm1tL21lbW9yeS5jOjczOTE6XHRyZXQgPSBfX2NvcHlfcmVtb3RlX3ZtX3N0cihtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XG5tbS9tZW1vcnkuYy03MzkyLVxuLS1cbm1tL21lbW9yeS5jLTczOTYtfVxubW0vbWVtb3J5LmM6NzM5NzpFWFBPUlRfU1lNQk9MX0dQTChjb3B5X3JlbW90ZV92bV9zdHIpO1xubW0vbWVtb3J5LmMtNzM5OC0jZW5kaWYgLyogQ09ORklHX0JQRl9TWVNDQUxMICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwNDEwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgQWNjZXNzIEZ1bmN0aW9ucyBpbiB0aGUgS2VybmVsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBvZiBgbW0vbWVtb3J5LmNgIGhhcyBmbGFnZ2VkIGBhY2Nlc3NfcmVtb3RlX3ZtYCwgYGFjY2Vzc19wcm9jZXNzX3ZtYCwgYW5kIGBjb3B5X3JlbW90ZV92bV9zdHJgIGFzIHRoZSBrZXkgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zLCBiYXNlZCBvbiB0aGVpciBuYW1lcywgdGhhdCBsaWtlbHkgaGFuZGxlIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgYWNjZXNzIGFuZCBtZW1vcnkgY29weWluZyBvcGVyYXRpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgYW5kIGJlaGF2aW9yLgoKTm93LCBzaGlmdGluZyBmb2N1cyB0byBgbW0vZ3VwLmNgLCBJJiMzOTt2ZSBpZGVudGlmaWVkIHNldmVyYWwgZnVuY3Rpb25zIG9mIGludGVyZXN0LiBgZ2V0X3VzZXJfcGFnZV92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhcmUgbm9uLXN0YXRpYyBhbmQgYXBwZWFyIGNyaXRpY2FsIHRvIHRoZSBwcm9jZXNzIG9mIGdldHRpbmcgYSB1c2VyIHBhZ2UgYW5kIGxvb2t1cHMuIGBfX2dldF91c2VyX3BhZ2VzYCBpcyBzdGF0aWMgd2hpY2ggbWFrZXMgaXQgYSBoZWxwZXIgZnVuY3Rpb24gd2l0aGluIHRoZSBgZ3VwLmNgIGZpbGUuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyBgZ2V0X3VzZXJfcGFnZXNgLCBgcGluX3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIGFyZSB0aWVkIHRvIHRob3NlIGZ1bmN0aW9ucywgZXNwZWNpYWxseSB0aGUgb25lcyB0aGF0IGFyZSBhbHNvIG5vbi1zdGF0aWMuIFRoZSAmIzM5O3JlbW90ZSYjMzk7IGZ1bmN0aW9ucyBhcmUgcHJvYmFibHkgY3J1Y2lhbCB0byBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBhcmNoaXRlY3R1cmUsIGFzIHRoZXkgZGVhbCB3aXRoIGNyb3NzLVZNIGFjY2Vzcy4KClRoZSBjb3JlIHF1ZXN0aW9uIG5vdyBpcywgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aGluIGBnZXRfdXNlcl9wYWdlX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgPyBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIHRob3NlIGZ1bmN0aW9ucyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIHVuZGVybHlpbmcgbWVjaGFuaXNtcyBhbmQgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgb3ZlcmFsbCBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Z2V0X3VzZXJfcGFnZV92bWEmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ndXAuYz0xMTUwPXN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTEyMzgtLypcbm1tL2d1cC5jOjEyMzk6ICogZ2V0X3VzZXJfcGFnZV92bWEgLSBnZXQgb25lIHBhZ2UgZnJvbSBAdm1hLCB3aG9zZSBsb2NrIHRoZSBjYWxsZXIgYWxyZWFkeVxubW0vZ3VwLmMtMTI0MC0gKiBob2xkczogdGhlIG1tYXAgbG9jaywgb3IgKHdpdGggRk9MTF9WTUFfTE9DSykgdGhlIHBlci1WTUEgbG9jay4gV2Fsa3MgdGhlXG4tLVxubW0vZ3VwLmMtMTI1Mi0gKi9cbm1tL2d1cC5jOjEyNTM6c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9ndXAuYy0xMjU0LVx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuLS1cbm1tL2d1cC5jLTEzNTItICogTG9va3MgdXAgdGhlIFZNQSwgYW5kIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgdGhyb3VnaFxubW0vZ3VwLmM6MTM1MzogKiBnZXRfdXNlcl9wYWdlX3ZtYSgpLCBmYXVsdGluZyBpbiB0aGUgcGFnZSBpZiBuZWVkZWQuXG5tbS9ndXAuYy0xMzU0LSAqXG4tLVxubW0vZ3VwLmM9MTM1OD1zdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vZ3VwLmMtMTM3My1cbm1tL2d1cC5jOjEzNzQ6XHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWEodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfVE9VQ0gpO1xubW0vZ3VwLmMtMTM3NS1cdGlmIChJU19FUlIocGFnZSkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxMzY2CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJlZmluaW5nIHRoZSBGb2N1cyBmb3IgU3lzdGVtIENhbGwgQW5hbHlzaXMqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIGFuYWx5c2lzLiBGaXJzdCwgSSBjb25maXJtZWQgdGhhdCBgZ2V0X3VzZXJfcGFnZV92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhcmUgaW5kZWVkIG5vbi1zdGF0aWMg4oCTIHRoYXQmIzM5O3MgZ29vZCBmb3Igb3VyIHB1cnBvc2VzLiBOb3csIGxldCYjMzk7cyBsb29rIGF0IGBmb2xsb3dfcGFnZV9tYXNrYCAtIGl0JiMzOTtzIHN0YXRpYywgc28gaXQmIzM5O3Mgbm90IGEgZGlyZWN0IGVudHJ5IHBvaW50LiBIb3dldmVyLCBgX19nZXRfdXNlcl9wYWdlc2AgKmlzKiBzdGF0aWMgYW5kIGNhbGxzIGl0LiBgX19nZXRfdXNlcl9wYWdlc2AgaXMgY2FsbGVkIGJ5IGEgaG9zdCBvZiBmdW5jdGlvbnMgaW5jbHVkaW5nIGBnZXRfdXNlcl9wYWdlc2AsIGBnZXRfdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNgIGFuZCBhIGZldyBvdGhlcnMuCgpNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRvIGluY2x1ZGUgdGhvc2UsIGJ1dCB0aGUgaW5zdHJ1Y3Rpb25zIHdhcm4gYWdhaW5zdCBpbmNsdWRpbmcgZ2VuZXJpYyAmIzM0O2hvdCBwYXRoJiMzNDsgZnVuY3Rpb25zIHRvIGF2b2lkIHNrZXdpbmcgdGhlIHRlc3QgZGlzdHJpYnV0aW9ucy4gSSBuZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gYGdldF91c2VyX3BhZ2VzYCBhbmQgYHBpbl91c2VyX3BhZ2VzYCBhcmUgZGVmaW5pdGVseSBpbiB0aGF0IGhvdCBwYXRoIGNhdGVnb3J5LgoKU28gSSYjMzk7dmUgcmVmaW5lZCB0aGUgY29yZSBmb2N1cyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucywgYXZvaWRpbmcgdGhlIGhvdCBwYXRoczoKCiogICBgZ2V0X3VzZXJfcGFnZV92bWFgCiogICBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYAoqICAgYGFjY2Vzc19yZW1vdGVfdm1gCiogICBgYWNjZXNzX3Byb2Nlc3Nfdm1gCiogICBgY29weV9yZW1vdGVfdm1fc3RyYAoKVGhvc2Ugc2hvdWxkIHByb3ZpZGUgYSBtb3JlIHRhcmdldGVkIHZpZXcuCgpOb3csIGxldCYjMzk7cyBtb3ZlIG9uIHRvIHRoZSBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIG5vdGUgYW55IHJlbGV2YW50IG9uZXMuIEkmIzM5O20gc2VlaW5nOgoKKiAgIGBQRVJfVk1BX0xPQ0tgIChkZXBlbmRlbnQgb24gYEFSQ0hfU1VQUE9SVFNfUEVSX1ZNQV9MT0NLYCwgYE1NVWAsIGFuZCBgU01QYCkKKiAgIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAKKiAgIGBSSVNDVl9JU0FfU1VQTWAKKiAgIGBBRERSRVNTX01BU0tJTkdgCgpJIGhhdmUgdG8gbWFrZSBzdXJlIGBQRVJfVk1BX0xPQ0tgIGlzIGVuYWJsZWQgcHJvcGVybHkuLi4gQWgsIGl0JiMzOTtzIGEgYGRlZl9ib29sIHlgIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgY29uZmlncy4gVGhhdCYjMzk7cyBmaW5lLCBJIGNhbiBsaXN0IGl0LiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGEgbWVudWNvbmZpZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgc2V0LiBgUklTQ1ZfSVNBX1NVUE1gIGFuZCBgQUREUkVTU19NQVNLSU5HYCBhcmUganVzdCBib29scy4KCkkgd2lsbCBhbHNvIHF1aWNrbHkgY2hlY2sgYEJQRl9TWVNDQUxMYCB3aXRoIHJlbGF0aW9uIHRvIGBjb3B5X3JlbW90ZV92bV9zdHJgIGJlY2F1c2UgSSByZWNhbGwgYSBwb3RlbnRpYWwgbGluayB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnkuYz03Mjk1PUVYUE9SVF9TWU1CT0xfR1BMKGFjY2Vzc19wcm9jZXNzX3ZtKTtcbm1tL21lbW9yeS5jLTcyOTYtXG5tbS9tZW1vcnkuYzo3Mjk3OiNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbm1tL21lbW9yeS5jLTcyOTgtLypcbi0tXG5tbS9tZW1vcnkuYz03Mzk3PUVYUE9SVF9TWU1CT0xfR1BMKGNvcHlfcmVtb3RlX3ZtX3N0cik7XG5tbS9tZW1vcnkuYzo3Mzk4OiNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cbm1tL21lbW9yeS5jLTczOTktXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyNjYyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqS2VybmVsIEludGVybmFsczogUmVtb3RlIFZNIFN0cmluZyBDb3B5IGFuZCBJL08gUmVtYXBwaW5nKioKClJpZ2h0LCBzbywgYXMgSSBzZWUgaXQsIHRoZSBpbmNsdXNpb24gb2YgYEJQRl9TWVNDQUxMYCBpcyBkZWZpbml0ZWx5IG5lY2Vzc2FyeSBmb3IgdGhlIGBjb3B5X3JlbW90ZV92bV9zdHJgIGZ1bmN0aW9uLiBJdOKAmXMgcHJldHR5IGNsZWFyIGZyb20gdGhlIGNvbnRleHQuIFdl4oCZcmUgZGVhbGluZyB3aXRoIGEgc3lzdGVtIGNhbGwgaW52b2x2ZWQgaW4gY29weWluZyBzdHJpbmdzIGZyb20gYSByZW1vdGUgdmlydHVhbCBtYWNoaW5lLCBzbyB0aGUgQlBGIGhvb2tzIGFuZCBjYXBhYmlsaXRpZXMgYXJlIGZ1bmRhbWVudGFsbHkgcmVxdWlyZWQgZm9yIHByb3BlciBvcGVyYXRpb24gYW5kIHNlY3VyaXR5IGluIHRoYXQgc2NlbmFyaW8uIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuCgpOb3csIG9uIHRoZSBvdGhlciBoYW5kLCBmb3IgaGFuZGxpbmcgdGhvc2UgYGFjY2Vzc19yZW1vdGVfdm1hX29wc2Agb3BlcmF0aW9ucywgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IGBIQVZFX0lPUkVNQVBfUFJPVGAgaXMgZGVmaW5lZC4gVGhpcyBpcyBhIGNyaXRpY2FsIGNoZWNrIHRvIGVuc3VyZSB3ZSBoYXZlIHRoZSBuZWNlc3NhcnkgaGFyZHdhcmUgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIEkvTyByZW1hcHBpbmcuIFdlIGhhdmUgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyBleGlzdCBiZWZvcmUgd2UgZXZlbiB0aGluayBhYm91dCB0b3VjaGluZyB0aGUgcmVtb3RlIFZNJiMzOTtzIG1lbW9yeSBhbmQgdHJ5aW5nIHRvIHJlYWQgb3Igd3JpdGUgaXQuIEkmIzM5O2xsIG5lZWQgdG8gZ28gb3ZlciB0aGUgcmVsZXZhbnQgY29uZmlnIG9wdGlvbnMgYW5kIGVuc3VyZSB0aGF0IHRoZSByaWdodCBjaGVja3MgYXJlIGluIHBsYWNlLiBUaGlzIGlzIHdoZXJlIHRoZSBpbnRyaWNhY2llcyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBoYXJkd2FyZSBiZWNvbWUgY3JpdGljYWwsIGFuZCBJIHdhbnQgdG8gYmUgMTAwJSBjZXJ0YWluIHdlJiMzOTtyZSBoYW5kbGluZyB0aGF0IHJlbWFwcGluZyBzYWZlbHkgYW5kIHJlbGlhYmx5LiBHb3R0YSBjb3ZlciBhbGwgdGhlIGJhc2VzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtIQVZFX0lPUkVNQVBfUFJPVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTY5NTE9RVhQT1JUX1NZTUJPTF9HUEwoZm9sbG93X3Bmbm1hcF9lbmQpO1xubW0vbWVtb3J5LmMtNjk1Mi1cbm1tL21lbW9yeS5jOjY5NTM6I2lmZGVmIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVFxubW0vbWVtb3J5LmMtNjk1NC0vKipcbi0tXG5tbS9tZW1vcnkuYz03MDI2PXN0YXRpYyBpbnQgYWNjZXNzX3JlbW90ZV92bWFfb3BzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtNzAyOC17XG5tbS9tZW1vcnkuYzo3MDI5OiNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbm1tL21lbW9yeS5jLTcwMzAtXHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzMjE5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2VzcywgZ2l2ZW4gbXkgZXhwZXJ0aXNlOgoKKipDaGVja2luZyBLZXJuZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zKioKClJpZ2h0LCBgSEFWRV9JT1JFTUFQX1BST1RgIGlzIGRlZmluaXRlbHkgd29ydGggYWRkaW5nIHRvIG15IG1lbnRhbCBjaGVja2xpc3Qgd2hlbiByZXZpZXdpbmcgdGhpcyBrZXJuZWwgY29uZmlndXJhdGlvbi4gSXQmIzM5O3MgYSBzaWduaWZpY2FudCBpbmRpY2F0b3Igb2YgaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBtZW1vcnktbWFwcGVkIEkvTywgYW5kIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoYXQgZmVhdHVyZSBjYW4gaGF2ZSBhIHByb2ZvdW5kIGltcGFjdCBvbiBkZXZpY2UgZHJpdmVyIGRldmVsb3BtZW50IGFuZCBwZXJmb3JtYW5jZS4gS25vd2luZyB3aGV0aGVyIHdlIGhhdmUgcHJvdGVjdGlvbiBlbmFibGVkIGR1cmluZyByZW1hcHBpbmcgaXMgY3J1Y2lhbCBmb3Igc2VjdXJpdHkgYW5kIHN0YWJpbGl0eS4KCk5vdywgbGV0JiMzOTtzIHBpdm90IHRvIHRoZSBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgb3B0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoYXQgb25lLiBJJiMzOTttIHJlY2FsbGluZyB0aGUgaW1wbGljYXRpb25zIG9mIFJDVSB3aXRoIHJlc3BlY3QgdG8gZnJlZWluZyBNTVUgdGFibGVzLiBXZSBuZWVkIHRvIGV2YWx1YXRlIHdoZXRoZXIgZW5hYmxpbmcgdGhhdCBvcHRpb24gbWFrZXMgc2Vuc2UgZm9yIHRoZSBjdXJyZW50IHVzZSBjYXNlLCBvciBpZiBpdCBtaWdodCBwcmVzZW50IHByb2JsZW1zIHdpdGggdGhlIGFyY2hpdGVjdHVyZS4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBkZXRhaWxzIGFuZCBjb25zaWRlciB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgdHJhZGVvZmZzIHRoaXMgZW50YWlscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTcwNTA9c3RhdGljIGJvb2wgcmVtb3RlX2FjY2Vzc19sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtNzA1NS1cbm1tL21lbW9yeS5jOjcwNTY6I2lmIGRlZmluZWQoQ09ORklHX1BFUl9WTUFfTE9DSykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX01NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUUpXG5tbS9tZW1vcnkuYy03MDU3LVx0dm1hID0gbG9ja192bWFfdW5kZXJfcmN1KG1tLCBhZGRyKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM2MzEKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQ29uZmlndXJhdGlvbiBBdWRpdCoqCgpPa2F5LCBsZXQmIzM5O3MgcmVmaW5lIHRoaXMgbGlzdCBvZiBpbnRlcmVzdGluZyBrZXJuZWwgY29uZmlndXJhdGlvbnMuIFdlJiMzOTt2ZSBnb3QgYSBzb2xpZCBzdGFydGluZyBwb2ludDogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEJQRl9TWVNDQUxMYCwgYEhBVkVfSU9SRU1BUF9QUk9UYCwgYFJJU0NWX0lTQV9TVVBNYCwgYW5kIGBBRERSRVNTX01BU0tJTkdgLiBHb29kLCBnb29kLi4uIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCBkZWZpbml0ZWx5IGFkZCBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgdG8gdGhhdCBsaXN0OyBpdCYjMzk7cyBnb3QgcmVhbCBwb3RlbnRpYWwgZm9yIGFuYWx5c2lzLgoKTm93LCBsZXQmIzM5O3MgZGlnIGludG8gYEhBVkVfSU9SRU1BUF9QUk9UYCBhbmQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgIHNwZWNpZmljYWxseS4gTmVlZCB0byBkZXRlcm1pbmUgaWYgdGhleSYjMzk7cmUgZXZlbiAqc2VsZWN0YWJsZSogaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gR290dGEgY2hlY2sgdGhlIGRlcGVuZGVuY2llcyBhbmQgY29uc3RyYWludHMuIFdlJiMzOTtsbCBiZSBhYmxlIHRvIHRlbGwgbXVjaCBtb3JlIG9uY2Ugd2Uga25vdyB3aGV0aGVyIHRoZXNlIGFyZSBpbiBzY29wZSBvciBub3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0hBVkVfSU9SRU1BUF9QUk9UJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvS2NvbmZpZz0yNTg9Y29uZmlnIFVTRVJfUkVUVVJOX05PVElGSUVSXG4tLVxuYXJjaC9LY29uZmlnLTI2NC1cbmFyY2gvS2NvbmZpZzoyNjU6Y29uZmlnIEhBVkVfSU9SRU1BUF9QUk9UXG5hcmNoL0tjb25maWctMjY2LVx0Ym9vbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDA2MAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDUzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkNvbnNpZGVyaW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIE9wdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoZXNlIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGFuZCB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgYEhBVkVfSU9SRU1BUF9QUk9UYC4gVGhpcyBvbmUmIzM5O3MgYSBiaXQgb2YgYSBzcGVjaWFsIGNhc2UuIEl0JiMzOTtzIGEgaGlkZGVuIGJvb2wsIHJpZ2h0PyBBcmNoaXRlY3R1cmUtc3BlY2lmaWMuIFRoZSB3aG9sZSBwb2ludCBpcywgaXQmIzM5O3Mgbm90IHNvbWV0aGluZyB3ZSBleHBvc2UgZm9yIHVzZXJzIHRvIHR3ZWFrIGRpcmVjdGx5LiBXZSBzaG91bGRuJiMzOTt0IGV2ZW4gbGlzdCBpdDsgaXQmIzM5O3MgaW1wbGljaXQuIE5vIHBvaW50IGluIGNsdXR0ZXJpbmcgdGhlIGF2YWlsYWJsZSBjaG9pY2VzIHdpdGggc29tZXRoaW5nIHRoYXQgY2FuJiMzOTt0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZC4gVGhhdCB3b3VsZCBqdXN0IGJlIGNvbmZ1c2luZy4KCk5leHQgdXAsIHdoYXQgYWJvdXQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgPyBJIG5lZWQgdG8gdGhpbmsgdGhpcyBvbmUgdGhyb3VnaCBjYXJlZnVsbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O01NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDthcmNoL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9LY29uZmlnPTUxMj1jb25maWcgTU1VX0dBVEhFUl9UQUJMRV9GUkVFXG4tLVxuYXJjaC9LY29uZmlnLTUxNC1cbmFyY2gvS2NvbmZpZzo1MTU6Y29uZmlnIE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVcbmFyY2gvS2NvbmZpZy01MTYtXHRib29sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0Mzc3CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aG9zZSB0aG91Z2h0cyBmcm9tIGEgZmlyc3QtcGVyc29uLCBleHBlcnQgcGVyc3BlY3RpdmUsIGtlZXBpbmcgaXQgY29uY2lzZSBhbmQgZm9jdXNpbmcgb24gdGhlIHVuZGVybHlpbmcgcmVhc29uaW5nOgoKKipIaWRkZW4gQm9vbGVhbiBhbmQgVk1BIExvY2sgQ29uc2lkZXJhdGlvbnMqKgoKQWxyaWdodCwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGlzIGRhdGEgc3RydWN0dXJlIGFuZCBJIHNlZSB0aGlzICYjMzQ7aGlkZGVuIGJvb2wuJiMzNDsgSXQmIzM5O3MgaW50ZW50aW9uYWxseSBoaWRkZW4sIGFuZCB3ZSBzaG91bGRuJiMzOTt0IHJldmVhbCBpdCBvciBpbmNsdWRlIGl0IGluIG91ciBsaXN0aW5ncy4gVGhlIGRlc2lnbiBjaG9pY2UgaXMgY2xlYXIg4oCTIGl0JiMzOTtzIGFuIGludGVybmFsIGRldGFpbCwgbWF5YmUgYW4gb3B0aW1pemF0aW9uLCBhbmQgZXhwb3NpbmcgaXQgd291bGQganVzdCBjbHV0dGVyIHRoaW5ncyBmb3IgdGhlIHVzZXIgYW5kIHBvdGVudGlhbGx5IGxlYWQgdG8gbWlzdXNlLiBXZSBzaG91bGQgbWFpbnRhaW4gdGhlIGFic3RyYWN0aW9uIGxldmVsLgoKVGhlbiBteSBtaW5kIGp1bXBzIHRvIHRoZSBgUEVSX1ZNQV9MT0NLYC4gIEkmIzM5O20gd29uZGVyaW5nIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QgY2hvaWNlIG9yIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QgcGxhY2UgZm9yIGl0LiBUaGlua2luZyBhYm91dCB0aGUgcG90ZW50aWFsIGNvbnRlbnRpb24sIHRoZSBzY29wZSBvZiBwcm90ZWN0aW9uLCBhbmQgdGhlIHNwZWNpZmljIG9wZXJhdGlvbnMgaXQmIzM5O3MgZ3VhcmRpbmcuIElzIGl0IHJlYWxseSB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIHRoZSBjb25jdXJyZW5jeSBjaGFsbGVuZ2VzPyBXaGF0IGFyZSB0aGUgYWx0ZXJuYXRpdmVzPyBBcmUgdGhlcmUgb3RoZXIgbG9ja3MgdGhhdCBwcm92aWRlIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSwgYnV0IG1heSBiZSBtb3JlIHBlcmZvcm1hbnQgaW4gdGhlIGNpcmN1bXN0YW5jZXM/IE9yIHNob3VsZCB3ZSBleHBsb3JlIGEgbG9jay1mcmVlIHNvbHV0aW9uPyBXZSBuZWVkIHRvIHdlaWdoIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1BFUl9WTUFfTE9DSyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz0xNDMzPWNvbmZpZyBMUlVfR0VOX1dBTEtTX01NVVxuLS1cbm1tL0tjb25maWctMTQzNy1cbm1tL0tjb25maWc6MTQzODpjb25maWcgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tcbm1tL0tjb25maWctMTQzOS0gICAgICAgZGVmX2Jvb2wgblxubW0vS2NvbmZpZy0xNDQwLVxubW0vS2NvbmZpZzoxNDQxOmNvbmZpZyBQRVJfVk1BX0xPQ0tcbm1tL0tjb25maWctMTQ0Mi1cdGRlZl9ib29sIHlcbm1tL0tjb25maWc6MTQ0MzpcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0sgXHUwMDI2XHUwMDI2IE1NVSBcdTAwMjZcdTAwMjYgU01QXG5tbS9LY29uZmlnLTE0NDQtXHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0ODM0CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzA5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIEtlcm5lbCBQYXRjaCYjMzk7cyBJbXBsaWNhdGlvbnMqKgoKT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBJIHNlZSB0aGF0IGBQRVJfVk1BX0xPQ0tgIGlzIGRlZmluZWQgYXMgYSBgZGVmX2Jvb2wgeWAsIHdoaWNoIG1lYW5zIGl0JiMzOTtzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBpZiBpdHMgZGVwZW5kZW5jaWVzIGFyZSBtZXQuIEkgZG9uJiMzOTt0IG5lZWQgdG8gZXhwbGljaXRseSBsaXN0IGl0IGZvciBjb25maWd1cmF0aW9uIHB1cnBvc2VzLgoKVGhlcmVmb3JlLCB0aGUga2V5IGNvbmZpZ3VyYXRpb25zIHRvIHdhdGNoIG91dCBmb3IgYXJlOiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQlBGX1NZU0NBTExgLCBgUklTQ1ZfSVNBX1NVUE1gLCBhbmQgYEFERFJFU1NfTUFTS0lOR2AuIFRob3NlIGFyZSB0aGUgcmVsZXZhbnQga25vYnMgdG8gY29uc2lkZXIgd2hlbiB0ZXN0aW5nLgoKTm93LCBsZXQmIzM5O3MgcmV2aWV3IHRoZSBjcml0aWNhbCBzeW1ib2xzIHRoaXMgcGF0Y2ggdG91Y2hlcy4gVGhlIG9uZXMgdGhhdCBpbW1lZGlhdGVseSBzdGFuZCBvdXQgYXJlIGBnZXRfdXNlcl9wYWdlX3ZtYWAsIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgLCBgYWNjZXNzX3JlbW90ZV92bWAsIGBhY2Nlc3NfcHJvY2Vzc192bWAsIGFuZCBgY29weV9yZW1vdGVfdm1fc3RyYC4gWXVwLCB0aG9zZSBhbGwgbG9vayBsaWtlIHRoZSByaWdodCBzZXQgb2YgcHJpbWl0aXZlcyB0byBmb2N1cyBvbi4KCk15IHJlYXNvbmluZz8gVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgYnJhbmQgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSB2aWEgYHJlbW90ZV92bV93YWxrYCBhbmQgaXMgcmVwbGFjaW5nIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYnJpbmdzIGJhdGNoaW5nIHN1cHBvcnQgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvd2VyIEdVUCBwYXRoLiBUaGlzIGluZGljYXRlcyBzb21lICpzaWduaWZpY2FudCogY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSBnb2luZyB0byBpbXBhY3QgcGFnZSBmYXVsdCBoYW5kbGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3Mgb3BlcmF0aW9ucyAodGhpbmdzIGxpa2UgcHRyYWNlLCBhY2Nlc3NpbmcgYC9wcm9jL3BpZC9tZW1gKSwgYW5kIGV2ZW4gQlBGIHN0cmluZyBjb3B5aW5nLiBUaGlzIG1lYW5zIGZ1enppbmcgZWZmb3J0cyBzaG91bGQgYWJzb2x1dGVseSBjb25jZW50cmF0ZSBvbiB0aGUgbmV3IGVudHJ5IHBvaW50cyBhbmQgdGhlIHJlbW90ZSBhY2Nlc3MgQVBJcy4KCkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgaWYgYGFjY2Vzc19yZW1vdGVfdm1gIGlzIGV4cG9ydGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYUE9SVF9TWU1CT0xfR1BMXFwoYWNjZXNzX3JlbW90ZV92bVxcKSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzU1NzYKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjoKCioqRGl2aW5nIGludG8gdGhlIGBtbS9tZW1vcnkuY2AgUmFiYml0IEhvbGUqKgoKT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIsIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBhY2Nlc3NfcmVtb3RlX3ZtYC4gSXQmIzM5O3MgY3J1Y2lhbCwgYW5kIHRoZSBjb250ZXh0IG9mIG1lbW9yeSBhY2Nlc3MgaXMgY3JpdGljYWwuIExldCYjMzk7cyBzZWUgaG93IHRoYXQgZnVuY3Rpb24gaXMgZGVmaW5lZCB3aXRoaW4gdGhlIGBtbS9tZW1vcnkuY2AgbW9kdWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBoYW5kbGVzIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgbWVtb3J5IGFjY2VzcyBzcGVjaWZpY2FsbHkg4oCTIGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIG9yIHJhY2UgY29uZGl0aW9ucyB0aGVyZSBjb3VsZCBiZSBuYXN0eS4gSSYjMzk7bGwgbmVlZCB0byBsb29rIHZlcnkgY2xvc2VseSBhdCB0aGUgY29kZSBhbmQgc2VlIGV4YWN0bHkgd2hhdCYjMzk7cyBoYXBwZW5pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2FjY2Vzc19yZW1vdGVfdm0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnkuYz03MDE0PUVYUE9SVF9TWU1CT0xfR1BMKGdlbmVyaWNfYWNjZXNzX3BoeXMpO1xuLS1cbm1tL21lbW9yeS5jLTcwMjUtICovXG5tbS9tZW1vcnkuYzo3MDI2OnN0YXRpYyBpbnQgYWNjZXNzX3JlbW90ZV92bWFfb3BzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy03MDI3LVx0XHRcdFx0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxuLS1cbm1tL21lbW9yeS5jPTcyMTE9c3RhdGljIGludCBhY2Nlc3Nfdm1fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vbWVtb3J5LmMtNzIxOC1cdGlmICghcGFnZSkge1xubW0vbWVtb3J5LmM6NzIxOTpcdFx0Ynl0ZXMgPSBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHModm1hLCBhZGRyLCAqYnVmLCBsZW4sIHdyaXRlKTtcbm1tL21lbW9yeS5jLTcyMjAtXHRcdGlmIChieXRlcyBcdTAwM2UgMClcbi0tXG5tbS9tZW1vcnkuYy03MjQ2LSAqL1xubW0vbWVtb3J5LmM6NzI0NzpzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxubW0vbWVtb3J5LmMtNzI0OC1cdFx0XHQgICAgICB2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vbWVtb3J5LmMtNzI1Ni0vKipcbm1tL21lbW9yeS5jOjcyNTc6ICogYWNjZXNzX3JlbW90ZV92bSAtIGFjY2VzcyBhbm90aGVyIHByb2Nlc3MmIzM5OyBhZGRyZXNzIHNwYWNlXG5tbS9tZW1vcnkuYy03MjU4LSAqIEBtbTpcdFx0dGhlIG1tX3N0cnVjdCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3Mgc3BhY2Vcbi0tXG5tbS9tZW1vcnkuYy03MjY3LSAqL1xubW0vbWVtb3J5LmM6NzI2ODppbnQgYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxubW0vbWVtb3J5LmMtNzI2OS1cdFx0dm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxubW0vbWVtb3J5LmMtNzI3MC17XG5tbS9tZW1vcnkuYzo3MjcxOlx0cmV0dXJuIF9fYWNjZXNzX3JlbW90ZV92bShtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XG5tbS9tZW1vcnkuYy03MjcyLX1cbi0tXG5tbS9tZW1vcnkuYz03Mjc5PWludCBhY2Nlc3NfcHJvY2Vzc192bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTcyODgtXG5tbS9tZW1vcnkuYzo3Mjg5Olx0cmV0ID0gX19hY2Nlc3NfcmVtb3RlX3ZtKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzKTtcbm1tL21lbW9yeS5jLTcyOTAtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM2MzUyCgkJCQkJCQlvdXRwdXQ6IDI0OQoJCQkJCQkJdGhvdWdodHM6IDE3MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBSZW1vdGUgVk0gQWNjZXNzIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gbG9va2luZyBpbnRvIHRoaXMgYGFjY2Vzc19yZW1vdGVfdm1gIHNpdHVhdGlvbi4gSSBzZWUgbm93OyBpdCYjMzk7cyAqbm90KiBleHBvcnRlZCwgYnV0IGl0JiMzOTtzIGFsc28gbm90IHN0YXRpYy4gVGhhdCBtYWtlcyBpdCBhIHBlcmZlY3Qgc3ltYm9sIHRvIHplcm8gaW4gb24sIGVzcGVjaWFsbHkgc2luY2UgYGFjY2Vzc19wcm9jZXNzX3ZtYCAqaXMqIGV4cG9ydGVkLiBGb2N1c2luZyBvbiBgYWNjZXNzX3JlbW90ZV92bWAgc2VlbXMgbGlrZSBhIHNvbGlkIGFwcHJvYWNoLgoKSSBhbHNvIGNvbnNpZGVyZWQgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLiBUaGV5JiMzOTtyZSBkZWZpbml0ZWx5IHJlbGV2YW50LCBidXQgSSBoYXZlIGEgaHVuY2ggdGhleSYjMzk7cmUgbGlrZWx5IHRvIGJlIHBlcmZvcm1hbmNlLWNyaXRpY2FsIHBhdGhzLCBhbmQgSSYjMzk7ZCBwcmVmZXIgdG8gc3RhcnQgd2l0aCBzb21ldGhpbmcgYSBiaXQgbW9yZSBmdW5kYW1lbnRhbC4gVGhlIHBhdGNoIHRvdWNoZXMgYG1tL2d1cC5jYCBhbmQgYG1tL21lbW9yeS5jYCwgd2hpY2ggY29uZmlybXMgbXkgaW5pdGlhbCBpbnR1aXRpb24uIFNvLCBJJiMzOTttIHN0aWNraW5nIHdpdGggbXkgb3JpZ2luYWwgc2VsZWN0aW9uIG9mIGZvY3VzIHN5bWJvbHMgZm9yIG5vdyDigJMgYGFjY2Vzc19yZW1vdGVfdm1gIHNlZW1zIGxpa2UgdGhlIG1vc3Qgc3RyYXRlZ2ljIHN0YXJ0aW5nIHBvaW50LgoKQmVmb3JlIEkgY29tbWl0IHRvIHRoaXMgYXBwcm9hY2gsIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgaW4gcGxheS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIG5vdCBvdmVybG9va2luZyBhbnl0aGluZyBjcml0aWNhbC4gTGV0JiMzOTtzIHNlZS4uLiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQlBGX1NZU0NBTExgLCBgUklTQ1ZfSVNBX1NVUE1gLCBhbmQgYEFERFJFU1NfTUFTS0lOR2AuIEFscmlnaHQsIEkmIzM5O3ZlIGdvdCB0aGVtLiBMb29rcyBsaWtlIEkmIzM5O3ZlIGNvbnNpZGVyZWQgdGhlIHJlbGV2YW50IGZhY3RvcnMuCgpOb3csIEkgdGhpbmsgSSYjMzk7bSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIEkmIzM5O2xsIGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT50aGUgZm9sbG93aW5nIGNvbmZpZ3MgZG8gbm90IGV4aXN0IGluIHRoZSBrZXJuZWwgdHJlZTogUklTQ1ZfSVNBX1NVUE08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7UklTQ1ZfSVNBX1NVUE0mIzM0OywKICAgICYjMzQ7QUREUkVTU19NQVNLSU5HJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZV92bWEmIzM0OywKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hJiMzNDssCiAgICAmIzM0O2FjY2Vzc19yZW1vdGVfdm0mIzM0OywKICAgICYjMzQ7YWNjZXNzX3Byb2Nlc3Nfdm0mIzM0OywKICAgICYjMzQ7Y29weV9yZW1vdGVfdm1fc3RyJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O3RoZSBmb2xsb3dpbmcgY29uZmlncyBkbyBub3QgZXhpc3QgaW4gdGhlIGtlcm5lbCB0cmVlOiBSSVNDVl9JU0FfU1VQTSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzcxMjgKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRlYnVnZ2luZyBhIFJJU0MtViBDb25maWd1cmF0aW9uIElzc3VlKioKCk9rYXksIGhvbGQgb24gYSBtaW51dGUuIGBSSVNDVl9JU0FfU1VQTWAgaXNuJiMzOTt0IHNob3dpbmcgdXAgd2hlcmUgSSBleHBlY3QgaXQgdG8uIFRoYXQmIzM5O3MgYSByZWQgZmxhZy4gQmVmb3JlIEkgc3RhcnQgZ29pbmcgZG93biBhIHJhYmJpdCBob2xlIG9mIGluY2x1ZGUgcGF0aHMgb3IgYnVpbGQgc3lzdGVtIG9kZGl0aWVzLCBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBldmVuIGEgKmRlZmluZWQqIHN5bWJvbC4gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGNoZWNrIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUsIHNwZWNpZmljYWxseSBgYXJjaC9yaXNjdi9LY29uZmlnYC4gVGhhdCYjMzk7cyB0aGUgZGVmaW5pdGl2ZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMgYW5kIG9wdGlvbnMuIEdvdHRhIHNlZSBpZiBpdCYjMzk7cyBkZWNsYXJlZCB0aGVyZSwgY29ycmVjdGx5LCBvciBpZiB0aGVyZSYjMzk7cyBhIHR5cG8sIGNvbmRpdGlvbiwgb3IgZGVwZW5kZW5jeSBJJiMzOTttIG1pc3NpbmcuIExldCYjMzk7cyBnZXQgdGhhdCBLY29uZmlnIGZpbGUgb3BlbiBhbmQgZG8gYSBxdWljayBzZWFyY2guIEhvcGVmdWxseSwgdGhpcyBpcyBhIHNpbXBsZSBjb25maWd1cmF0aW9uIG1pc3N0ZXAuIElmIG5vdCwgSSYjMzk7bGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgcG90ZW50aWFsbHkgdGhlIGhlYWRlcnMgdGhlbXNlbHZlcyB0byBmaWd1cmUgb3V0IHdoYXQmIzM5O3MgZ29pbmcgb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI2IDEwOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1JJU0NWX0lTQV9TVVBNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC9yaXNjdi9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvcmlzY3YvS2NvbmZpZz01NTM9Y29uZmlnIFJJU0NWX0lTQV9DXG4tLVxuYXJjaC9yaXNjdi9LY29uZmlnLTU2My1cbmFyY2gvcmlzY3YvS2NvbmZpZzo1NjQ6Y29uZmlnIFJJU0NWX0lTQV9TVVBNXG5hcmNoL3Jpc2N2L0tjb25maWctNTY1LVx0Ym9vbCBcJiMzNDtTdXBtIGV4dGVuc2lvbiBmb3IgdXNlcnNwYWNlIHBvaW50ZXIgbWFza2luZ1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNiAxMDowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzUwMQoJCQkJCQkJb3V0cHV0OiAyMzkKCQkJCQkJCXRob3VnaHRzOiAxMDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVHJvdWJsZXNob290aW5nIGEgQ29uZmlndXJhdGlvbiBFcnJvcioqCgpPa2F5LCBzbyB0aGUgdG9vbCBpcyB0ZWxsaW5nIG1lIHRoaXMgcGFydGljdWxhciBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzbiYjMzk7dCBleGlzdC4gVGhhdCYjMzk7cyBhIGNsYXNzaWMuIE15IGluaXRpYWwgaHVuY2ggaXMgdGhhdCBpdCYjMzk7cyBlaXRoZXIgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gdHJlZSwgb3IgdGhlIHRvb2wgaXMgdXNpbmcgYSBtb3JlIHJlc3RyaWN0aXZlIGxvb2t1cCB0aGFuIEkgZXhwZWN0LiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGlzc3VlLiBJJiMzOTtsbCByZW1vdmUgYFJJU0NWX0lTQV9TVVBNYCBhbmQgYEFERFJFU1NfTUFTS0lOR2AgZnJvbSBteSBhY3RpdmUgY29uZmlndXJhdGlvbiB0byB0cnkgYW5kIGlzb2xhdGUgdGhlIHByb2JsZW0uIFRob3NlIHNlZW0gbGlrZSBwb3RlbnRpYWwgY3VscHJpdHMsIGJlaW5nIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgYW5kIG1pZ2h0IG5vdCBiZSBwcmVzZW50IGluIHRoZSB0b29sJiMzOTtzIGRlZmF1bHQgY2hlY2suIFdhaXQgYSBzZWNvbmQsIGRpZG4mIzM5O3QgSSBqdXN0IHNlZSBgQUREUkVTU19NQVNLSU5HYCBpbiB0aGUgeDg2IEtjb25maWcgZmlsZXM/IEkmIzM5O2xsIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQsIGp1c3QgdG8gYmUgc3VyZS4gSXQmIzM5O3MgaW1wb3J0YW50IHRvIHZlcmlmeSB0aG9zZSBkZXRhaWxzLCBubyBwb2ludCBhc3N1bWluZyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjYgMTA6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0FERFJFU1NfTUFTS0lORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2Vfdm1hJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcmVtb3RlX3ZtJiMzNDssCiAgICAmIzM0O2FjY2Vzc19wcm9jZXNzX3ZtJiMzNDssCiAgICAmIzM0O2NvcHlfcmVtb3RlX3ZtX3N0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0FERFJFU1NfTUFTS0lORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2Vfdm1hJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VfbG9va3VwX3ZtYSYjMzQ7LAogICAgJiMzNDthY2Nlc3NfcmVtb3RlX3ZtJiMzNDssCiAgICAmIzM0O2FjY2Vzc19wcm9jZXNzX3ZtJiMzNDssCiAgICAmIzM0O2NvcHlfcmVtb3RlX3ZtX3N0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzowOC45MTIwMTA5ODJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTMwMzYyNDkyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkFERFJFU1NfTUFTS0lOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF91c2VyX3BhZ2Vfdm1hXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFcIixcbiAgICBcImFjY2Vzc19yZW1vdGVfdm1cIixcbiAgICBcImFjY2Vzc19wcm9jZXNzX3ZtXCIsXG4gICAgXCJjb3B5X3JlbW90ZV92bV9zdHJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjA4LjkxMjAyODAwMloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc4MTMwMTY4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY3YzIwOTg3ZGU2ZDkyZDdlZmMyMWEwMDE4ODVhZDMxOGI2MDU0ZmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFN1biBKdWwgMjYgMTA6MDc6MDYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xcbmluZGV4IDFhOWFhZDZlZjIyYTA0Li43YTZlY2MzZDkyOTQ4YyAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xcbisrKyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jXFxuQEAgLTQ1OSw3ICs0NTksNyBAQCBzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV90YWdzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuIFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xcbiBcXHRcXHR1bnNpZ25lZCBsb25nIHRhZ3MsIG9mZnNldDtcXG4gXFx0XFx0dm9pZCAqbWFkZHI7XFxuLVxcdFxcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxcbitcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkcixcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBndXBfZmxhZ3MsIFxcdTAwMjZ2bWEpO1xcbiBcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbiBcXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXFxuaW5kZXggZGJmMjdhNzhkZjZjODcuLjNjZTE2Nzk2ZTVhMjVkIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxcbkBAIC0yMSw3ICsyMSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LFxcbiBcXHRcXHRcXHQgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbmV4dClcXG4ge1xcbiAjaWZkZWYgQ09ORklHX1JJU0NWX0lTQV9TVVBNXFxuLVxcdG5leHQtXFx1MDAzZWNvbnRleHQucG1sZW4gPSAwO1xcbitcXHRXUklURV9PTkNFKG5leHQtXFx1MDAzZWNvbnRleHQucG1sZW4sIDApO1xcbiAjZW5kaWZcXG4gXFx0c3dpdGNoX21tKHByZXYsIG5leHQsIE5VTEwpO1xcbiB9XFxuQEAgLTQ0LDcgKzQ0LDcgQEAgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKHVzZV9hc2lkX2FsbG9jYXRvcik7XFxuICNkZWZpbmUgbW1fdW50YWdfbWFzayBtbV91bnRhZ19tYXNrXFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiB7XFxuLVxcdHJldHVybiAtMVVMIFxcdTAwM2VcXHUwMDNlIG1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuO1xcbitcXHRyZXR1cm4gLTFVTCBcXHUwMDNlXFx1MDAzZSBSRUFEX09OQ0UobW0tXFx1MDAzZWNvbnRleHQucG1sZW4pO1xcbiB9XFxuICNlbmRpZlxcbiBcXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxcbmluZGV4IDVkNGVjMTU1ODRjZmE0Li41MzgwNmUwZjdkY2ZlMyAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oXFxuQEAgLTE2LDcgKzE2LDcgQEBcXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcXG4ge1xcbiBcXHRpZiAocmlzY3ZfaGFzX2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfRVhUX1NVUE0pKSB7XFxuLVxcdFxcdHU4IHBtbGVuID0gbW0tXFx1MDAzZWNvbnRleHQucG1sZW47XFxuK1xcdFxcdHU4IHBtbGVuID0gUkVBRF9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuKTtcXG4gXFxuIFxcdFxcdC8qIFZpcnR1YWwgYWRkcmVzc2VzIGFyZSBzaWduLWV4dGVuZGVkOyBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlIHplcm8tZXh0ZW5kZWQuICovXFxuIFxcdFxcdGlmIChJU19FTkFCTEVEKENPTkZJR19NTVUpKVxcbkBAIC0zMywxMiArMzMsMTYgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVcXG4gXFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKGN1cnJlbnQtXFx1MDAzZW1tLCBfX2FkZHIpO1xcdFxcXFxcXG4gfSlcXG4gXFxuLSNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpICh7XFx0XFx0XFx0XFx0XFx0XFxcXFxcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKSAoe1xcdFxcdFxcdFxcdFxcXFxcXG4gXFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcXHRcXHRcXHRcXFxcXFxuLVxcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIF9fYWRkcik7XFx0XFx0XFxcXFxcbiB9KVxcbiBcXG4rI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcikgKHtcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XFx0XFx0XFx0XFx0XFxcXFxcbit9KVxcbitcXG4gI2RlZmluZSBhY2Nlc3Nfb2soYWRkciwgc2l6ZSkgbGlrZWx5KF9fYWNjZXNzX29rKHVudGFnZ2VkX2FkZHIoYWRkciksIHNpemUpKVxcbiAjZWxzZVxcbiAjZGVmaW5lIHVudGFnZ2VkX2FkZHIoYWRkcikgKGFkZHIpXFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuY1xcbmluZGV4IGIyZGY3ZjcyMjQxYTVmLi42YWU3NTUyZmVkMDlmMyAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcXG4rKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcXG5AQCAtMzU3LDEzICszNTcsMTUgQEAgbG9uZyBzZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYXJnKVxcbiBcXHRpZiAobW1hcF93cml0ZV9sb2NrX2tpbGxhYmxlKG1tKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5UUjtcXG4gXFxuLVxcdGlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sIFxcdTAwMjZtbS1cXHUwMDNlY29udGV4dC5mbGFncykgXFx1MDAyNlxcdTAwMjYgbW0tXFx1MDAzZWNvbnRleHQucG1sZW4gIT0gcG1sZW4pIHtcXG4tXFx0XFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRpZiAodGVzdF9iaXQoTU1fQ09OVEVYVF9MT0NLX1BNTEVOLCBcXHUwMDI2bW0tXFx1MDAzZWNvbnRleHQuZmxhZ3MpKSB7XFxuK1xcdFxcdGlmIChSRUFEX09OQ0UobW0tXFx1MDAzZWNvbnRleHQucG1sZW4pICE9IHBtbGVuKSB7XFxuK1xcdFxcdFxcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRlbnZjZmdfdXBkYXRlX2JpdHModGFzaywgRU5WQ0ZHX1BNTSwgcG1tKTtcXG4tXFx0bW0tXFx1MDAzZWNvbnRleHQucG1sZW4gPSBwbWxlbjtcXG4rXFx0V1JJVEVfT05DRShtbS1cXHUwMDNlY29udGV4dC5wbWxlbiwgcG1sZW4pO1xcbiBcXG4gXFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xcbiBcXG5AQCAtMzk0LDcgKzM5Niw3IEBAIGxvbmcgZ2V0X3RhZ2dlZF9hZGRyX2N0cmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbiBcXHRcXHRicmVhaztcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKHRhc2stXFx1MDAzZW1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuKVxcbitcXHRpZiAoUkVBRF9PTkNFKHRhc2stXFx1MDAzZW1tLVxcdTAwM2Vjb250ZXh0LnBtbGVuKSlcXG4gXFx0XFx0cmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTtcXG4gXFxuIFxcdHJldHVybiByZXQ7XFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXFxuaW5kZXggZWY1YjUwN2RlMzRlMmUuLmNlZTcxMGY2NDY1OGFhIDEwMDY0NFxcbi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcXG4rKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXFxuQEAgLTEwMCwxOCArMTAwLDE4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV9sYW1fY3IzX21hc2soc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBkdXBfbGFtKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4ge1xcbiBcXHRtbS1cXHUwMDNlY29udGV4dC5sYW1fY3IzX21hc2sgPSBvbGRtbS1cXHUwMDNlY29udGV4dC5sYW1fY3IzX21hc2s7XFxuLVxcdG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgPSBvbGRtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xcbitcXHRXUklURV9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIFJFQURfT05DRShvbGRtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrKSk7XFxuIH1cXG4gXFxuICNkZWZpbmUgbW1fdW50YWdfbWFzayBtbV91bnRhZ19tYXNrXFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbV91bnRhZ19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiB7XFxuLVxcdHJldHVybiBtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xcbitcXHRyZXR1cm4gUkVBRF9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2spO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW5saW5lIHZvaWQgbW1fcmVzZXRfdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4ge1xcbi1cXHRtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrID0gLTFVTDtcXG4rXFx0V1JJVEVfT05DRShtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrLCAtMVVMKTtcXG4gfVxcbiBcXG4gI2RlZmluZSBhcmNoX3BndGFibGVfZG1hX2NvbXBhdCBhcmNoX3BndGFibGVfZG1hX2NvbXBhdFxcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmhcXG5pbmRleCAyMGRlMzRjYzlhYTZlNy4uYTA5NTE2NWViNjQ4ZWIgMTAwNjQ0XFxuLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXFxuKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXFxuQEAgLTM5LDE4ICszOSwyNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bnRhZ2dlZF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcilcXG4gXFx0KF9fZm9yY2UgX190eXBlb2ZfXyhhZGRyKSlfX3VudGFnZ2VkX2FkZHIoX19hZGRyKTtcXHRcXHRcXFxcXFxuIH0pXFxuIFxcbisvKlxcbisgKiBtbS1cXHUwMDNlY29udGV4dC51bnRhZ19tYXNrIGNoYW5nZXMgb25seSB3aGVuIHRoZSB0YXJnZXQgZW5hYmxlcyBMQU0gb3IgZXhlY3MsXFxuKyAqIGFsd2F5cyBzaW5nbGUtdGhyZWFkZWQuIEFuIHVubG9ja2VkIHJlbW90ZSByZWFkZXIgY2FuIHJhY2UgdGhhdDsgUkVBRF9PTkNFXFxuKyAqIGtlZXBzIHRoZSB2YWx1ZSB3aG9sZSBhbmQgdGhlIHVudGFnIGlzIGJlc3QtZWZmb3J0LlxcbisgKi9cXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgYWRkcilcXG4ge1xcbi1cXHRtbWFwX2Fzc2VydF9sb2NrZWQobW0pO1xcbi1cXHRyZXR1cm4gYWRkciBcXHUwMDI2IChtbSktXFx1MDAzZWNvbnRleHQudW50YWdfbWFzaztcXG4rXFx0cmV0dXJuIGFkZHIgXFx1MDAyNiBSRUFEX09OQ0UobW0tXFx1MDAzZWNvbnRleHQudW50YWdfbWFzayk7XFxuIH1cXG4gXFxuLSNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpXFx0KHtcXHRcXHRcXHRcXHRcXFxcXFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXFx0KHtcXHRcXHRcXHRcXFxcXFxuIFxcdHVuc2lnbmVkIGxvbmcgX19hZGRyID0gKF9fZm9yY2UgdW5zaWduZWQgbG9uZykoYWRkcik7XFx0XFx0XFxcXFxcbiBcXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIF9fYWRkcik7XFx0XFxcXFxcbiB9KVxcbiBcXG4rI2RlZmluZSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcilcXHQoe1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKTtcXHRcXHRcXHRcXFxcXFxuK30pXFxuK1xcbiAjZW5kaWZcXG4gXFxuICNkZWZpbmUgdmFsaWRfdXNlcl9hZGRyZXNzKHgpIFxcXFxcXG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcXG5pbmRleCBkNDRhZmJlMDA1YmI1MS4uOWZhNjU5MTE3ZjM4MjYgMTAwNjQ0XFxuLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuY1xcbisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcXG5AQCAtODE0LDcgKzgxNCw3IEBAIHN0YXRpYyB2b2lkIGVuYWJsZV9sYW1fZnVuYyh2b2lkICpfX21tKVxcbiBzdGF0aWMgdm9pZCBtbV9lbmFibGVfbGFtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiB7XFxuIFxcdG1tLVxcdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IFg4Nl9DUjNfTEFNX1U1NztcXG4tXFx0bW0tXFx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpO1xcbitcXHRXUklURV9PTkNFKG1tLVxcdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIH5HRU5NQVNLKDYyLCA1NykpO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogRXZlbiB0aG91Z2ggdGhlIHByb2Nlc3MgbXVzdCBzdGlsbCBiZSBzaW5nbGUtdGhyZWFkZWQgYXQgdGhpc1xcbkBAIC05NTIsNyArOTUyLDcgQEAgbG9uZyBkb19hcmNoX3ByY3RsXzY0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9wdGlvbiwgdW5zaWduZWQgbG9uZyBhcmcyKVxcbiAjZW5kaWZcXG4gI2lmZGVmIENPTkZJR19BRERSRVNTX01BU0tJTkdcXG4gXFx0Y2FzZSBBUkNIX0dFVF9VTlRBR19NQVNLOlxcbi1cXHRcXHRyZXR1cm4gcHV0X3VzZXIodGFzay1cXHUwMDNlbW0tXFx1MDAzZWNvbnRleHQudW50YWdfbWFzayxcXG4rXFx0XFx0cmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay1cXHUwMDNlbW0pLFxcbiBcXHRcXHRcXHRcXHQodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcyKTtcXG4gXFx0Y2FzZSBBUkNIX0VOQUJMRV9UQUdHRURfQUREUjpcXG4gXFx0XFx0cmV0dXJuIHByY3RsX2VuYWJsZV90YWdnZWRfYWRkcih0YXNrLVxcdTAwM2VtbSwgYXJnMik7XFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jXFxuaW5kZXggM2FmOTc5ZmI0MWQzOGQuLjMyOWVmYWMwY2ZiMzdkIDEwMDY0NFxcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcXG4rKysgYi9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jXFxuQEAgLTEwMzYsNyArMTAzNiw3IEBAIHN0YXRpYyBpbnQgY29weV9mcm9tX3ZhZGRyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHZhZGRyLCB2b2lkICpkc3QsXFxuIFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gXFxuLVxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIHZhZGRyLCBndXBfZmxhZ3MsIFxcdTAwMjZ2bWEpO1xcbitcXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCBcXHUwMDI2dm1hKTtcXG4gXFx0aWYgKElTX0VSUihwYWdlKSlcXG4gXFx0XFx0cmV0dXJuIFBUUl9FUlIocGFnZSk7XFxuIFxcdHVwcm9iZV9jb3B5X2Zyb21fcGFnZShwYWdlLCB2YWRkciwgZHN0LCBsZW4pO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmhcXG5pbmRleCA0ODVkZjljMmRiZGRiMy4uMGY2NmQ3NmU2Y2E3MTkgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9tbS5oXFxuQEAgLTMyMzUsMzUgKzMyMzUsOSBAQCBsb25nIHBpbl91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4gXFx0XFx0XFx0ICAgaW50ICpsb2NrZWQpO1xcbiBcXG4tLypcXG4tICogUmV0cmlldmVzIGEgc2luZ2xlIHBhZ2UgYWxvbmdzaWRlIGl0cyBWTUEuIERvZXMgbm90IHN1cHBvcnQgRk9MTF9OT1dBSVQuXFxuLSAqL1xcbi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICBpbnQgZ3VwX2ZsYWdzLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcClcXG4te1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuLVxcdGludCBnb3Q7XFxuLVxcbi1cXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcXHUwMDI2IEZPTExfTk9XQUlUKSkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbi1cXG4tXFx0Z290ID0gZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKG1tLCBhZGRyLCAxLCBndXBfZmxhZ3MsIFxcdTAwMjZwYWdlLCBOVUxMKTtcXG4tXFxuLVxcdGlmIChnb3QgXFx1MDAzYyAwKVxcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUihnb3QpO1xcbi1cXG4tXFx0dm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7XFxuLVxcdGlmIChXQVJOX09OX09OQ0UoIXZtYSkpIHtcXG4tXFx0XFx0cHV0X3BhZ2UocGFnZSk7XFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbi1cXHR9XFxuLVxcbi1cXHQqdm1hcCA9IHZtYTtcXG4tXFx0cmV0dXJuIHBhZ2U7XFxuLX1cXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbnQgZ3VwX2ZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTtcXG4gXFxuIGxvbmcgZ2V0X3VzZXJfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4gXFx0XFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXFxuaW5kZXggZWRkYmJiNjVjY2M0ZjguLjdlNmU0Yzg5MTg0Y2Q3IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXFxuKysrIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmhcXG5AQCAtMzQsNiArMzQsMTMgQEBcXG4gfSlcXG4gI2VuZGlmXFxuIFxcbisjaWZuZGVmIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkXFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXFx0KHtcXHRcXFxcXFxuK1xcdCh2b2lkKShtbSk7XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHR1bnRhZ2dlZF9hZGRyKGFkZHIpO1xcdFxcdFxcdFxcdFxcXFxcXG4rfSlcXG4rI2VuZGlmXFxuK1xcbiAjaWZkZWYgbWFza2VkX3VzZXJfYWNjZXNzX2JlZ2luXFxuICAjZGVmaW5lIGNhbl9kb19tYXNrZWRfdXNlcl9hY2Nlc3MoKSAxXFxuICMgaWZuZGVmIG1hc2tlZF91c2VyX3dyaXRlX2FjY2Vzc19iZWdpblxcbmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jXFxuaW5kZXggMDY5MjExOWI3OTA0MzEuLjQ5MTBjOTNiYTAwM2U4IDEwMDY0NFxcbi0tLSBhL21tL2d1cC5jXFxuKysrIGIvbW0vZ3VwLmNcXG5AQCAtNjQ3LDggKzY0Nyw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLFxcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXFxuLVxcdFxcdFxcdFxcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdFxcdCAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXFxuIHtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG5AQCAtNjcyLDEwICs2NzMsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xcbiBcXG4gXFx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xcbi1cXHRpZiAocmV0KVxcbitcXHRpZiAocmV0KSB7XFxuIFxcdFxcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0KnBhZ2VfbWFzayA9IEhQQUdFX1BVRF9OUiAtIDE7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgb2ZmID0gKGFkZHIgXFx1MDAyNiB+UFVEX01BU0spIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRcXHQqbnJfcGFnZXMgPSBtaW4oSFBBR0VfUFVEX05SIC0gb2ZmLCAoZW5kIC0gYWRkcikgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuK1xcdH1cXG4gXFxuIFxcdHJldHVybiBwYWdlO1xcbiB9XFxuQEAgLTY5OSw5ICs3MDMsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXFxuIHtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXHRwbWRfdCBwbWR2YWwgPSAqcG1kO1xcbkBAIC03MzgsMjMgKzc0MiwyNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gI2VuZGlmXFx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXFxuIFxcbiBcXHRwYWdlICs9IChhZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbi1cXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcXG4rXFx0Km5yX3BhZ2VzID0gbWluKEhQQUdFX1BNRF9OUiAtICgoYWRkciBcXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCksXFxuK1xcdFxcdFxcdChlbmQgLSBhZGRyKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4gXFxuIFxcdHJldHVybiBwYWdlO1xcbiB9XFxuIFxcbiAjZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcXG4tXFx0XFx0XFx0XFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0XFx0ICAgIHB1ZF90ICpwdWRwLCBpbnQgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXFxuIHtcXG4gXFx0cmV0dXJuIE5VTEw7XFxuIH1cXG5AQCAtNzk5LDggKzgwNSw0NiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4gXFx0cmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkXFxuKyAqIGxhcmdlIEBmb2xpbyBtYXBzIGNvbnRpZ3VvdXNseSBhbmQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGVcXG4rICogcGFnZSBhdCBAYWRkcmVzczogY29uc2VjdXRpdmUgcHJlc2VudCBQVEVzIG1hcHBpbmcgY29uc2VjdXRpdmUgcGFnZXMgb2ZcXG4rICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLlxcbisgKiBSZXR1cm5zIGF0IGxlYXN0IDEuXFxuKyAqXFxuKyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpc1xcbisgKiBhbHdheXMgc2FmZTogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLCBhbmQgRk9MTF9XUklURSBpcyBzYXRpc2ZpZWQuXFxuKyAqIEEgcmVhZC1vbmx5IHJ1biBpcyBvbmx5IHNhZmUgZm9yIGEgcGxhaW4gcmVhZDsgRk9MTF9XUklURSB3b3VsZCBuZWVkIGEgQ09XXFxuKyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLFxcbisgKiBzbyB0aG9zZSBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgcGFnZS5cXG4rICovXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xcbitcXHR1bnNpZ25lZCBsb25nIG1heDtcXG4rXFxuK1xcdGlmICghcHRlX3dyaXRlKHB0ZSkgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGZvbGlvX3B0ZV9iYXRjaF9mbGFncygpIHNjYW5zIGZvcndhcmQgZnJvbSBAcHRlcCwgc28gdGhlIHJ1biBtdXN0XFxuK1xcdCAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kXFxuK1xcdCAqIHRoZSBWTUEsIHNpbmNlIGEgbGFyZ2UgZm9saW8gY2FuIGJlIFBURS1tYXBwZWQgYWNyb3NzIGEgUE1EIGJvdW5kYXJ5LlxcbitcXHQgKi9cXG4rXFx0bWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsXFxuK1xcdFxcdCAgKHZtYS1cXHUwMDNldm1fZW5kIC0gYWRkcmVzcykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuK1xcdGlmIChtYXggXFx1MDAzYz0gMSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRyZXR1cm4gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB0ZXAsIFxcdTAwMjZiYXRjaF9wdGUsIG1heCxcXG4rXFx0XFx0XFx0XFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSk7XFxuK31cXG4rXFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncylcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcXG4rXFx0XFx0dW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuQEAgLTg4NSw2ICs5MjksMTUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRmb2xpb19tYXJrX2FjY2Vzc2VkKGZvbGlvKTtcXG4gXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvIGNhbiBiZSBoYW5kZWQgYmFjayBhcyBhIGNvbnRpZ3VvdXMgYmF0Y2gsXFxuK1xcdCAqIHNvIHRoZSBjYWxsZXIgYWR2YW5jZXMgb3ZlciB0aGUgd2hvbGUgcnVuIGluIG9uZSBzdGVwIGluc3RlYWQgb2ZcXG4rXFx0ICogd2Fsa2luZyB0aGUgcGFnZSB0YWJsZXMgZm9yIGV2ZXJ5IHBhZ2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuK1xcdFxcdCpucl9wYWdlcyA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCBlbmQsIGZvbGlvLCBwYWdlLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHB0ZXAsIHB0ZSwgZmxhZ3MpO1xcbiBvdXQ6XFxuIFxcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcXG4gXFx0cmV0dXJuIHBhZ2U7XFxuQEAgLTg5Niw5ICs5NDksOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0XFx0ICAgIHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRwbWRfdCAqcG1kLCBwbWR2YWw7XFxuIFxcdHNwaW5sb2NrX3QgKnB0bDtcXG5AQCAtOTEyLDcgKzk2NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRpZiAoIXBtZF9wcmVzZW50KHBtZHZhbCkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXHRpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSlcXG4tXFx0XFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xcbitcXHRcXHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBucl9wYWdlcyk7XFxuIFxcbiBcXHRpZiAocG1kX3Byb3Rub25lKHBtZHZhbCkgXFx1MDAyNlxcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxcbiBcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG5AQCAtOTI1LDI0ICs5NzgsMjQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdH1cXG4gXFx0aWYgKHVubGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSkge1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbi1cXHRcXHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XFxuK1xcdFxcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTtcXG4gXFx0fVxcbiBcXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcXHUwMDI2XFx1MDAyNiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1NQTElUX1BNRCkpIHtcXG4gXFx0XFx0c3Bpbl91bmxvY2socHRsKTtcXG4gXFx0XFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpO1xcbiBcXHRcXHQvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovXFxuIFxcdFxcdHJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDpcXG4tXFx0XFx0XFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XFxuK1xcdFxcdFxcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xcbiBcXHR9XFxuLVxcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wbWQodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBucl9wYWdlcyk7XFxuIFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuIFxcdHJldHVybiBwYWdlO1xcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcDRkX3QgKnA0ZHAsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcDRkX3QgKnA0ZHAsIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxcbiB7XFxuIFxcdHB1ZF90ICpwdWRwLCBwdWQ7XFxuIFxcdHNwaW5sb2NrX3QgKnB0bDtcXG5AQCAtOTU1LDcgKzEwMDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuIFxcdGlmIChwdWRfbGVhZihwdWQpKSB7XFxuIFxcdFxcdHB0bCA9IHB1ZF9sb2NrKG1tLCBwdWRwKTtcXG4tXFx0XFx0cGFnZSA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRcXHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpO1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbiBcXHRcXHRpZiAocGFnZSlcXG4gXFx0XFx0XFx0cmV0dXJuIHBhZ2U7XFxuQEAgLTk2NCwxMyArMTAxNywxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXG4tXFx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgbnJfcGFnZXMpO1xcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHQgICAgcGdkX3QgKnBnZHAsIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxcbiB7XFxuIFxcdHA0ZF90ICpwNGRwLCBwNGQ7XFxuIFxcbkBAIC05ODEsMTUgKzEwMzQsMTYgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdGlmICghcDRkX3ByZXNlbnQocDRkKSB8fCBwNGRfYmFkKHA0ZCkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXG4tXFx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIHA0ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwNGRwLCBmbGFncywgbnJfcGFnZXMpO1xcbiB9XFxuIFxcbiAvKipcXG4gICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXFxuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcXG4gICogQGFkZHJlc3M6IHZpcnR1YWwgYWRkcmVzcyB0byBsb29rIHVwXFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxcbi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFza1xcbisgKiBAbnJfcGFnZXM6IG91dHB1dDsgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGNhbGxlciBjYW4gcmVhZFxcbiAgKlxcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAgKlxcbkBAIC05OTgsMTUgKzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxcbiAgKiByZWxldmFudCB3aXRoIEZPTExfUElOIGFuZCAhRk9MTF9XUklURS5cXG4gICpcXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXFxuKyAqIE9uIG91dHB1dCwgQG5yX3BhZ2VzIGhvbGRzIGhvdyBtYW55IGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGZvbGlvIHRoYXQgaW5jbHVkZXNcXG4rICogdGhlIHJldHVybmVkIHBhZ2UgaGFzIG1hcHBlZCBpbnRvIHRoaXMgcHJvY2Vzcywgc28gdGhlIGNhbGxlciBjYW4gYWR2YW5jZVxcbisgKiBvdmVyIGEgbGFyZ2UgZm9saW8gaW4gb25lIHN0ZXAuXFxuICAqXFxuICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxcbiAgKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXFxuICAqIGJ5IGEgcGFnZSBkZXNjcmlwdG9yIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cXG4gICovXFxuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcXG4rXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcXG4ge1xcbiBcXHRwZ2RfdCAqcGdkO1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuQEAgLTEwMTQsMTMgKzEwNzAsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0dm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpO1xcbiBcXG4tXFx0KnBhZ2VfbWFzayA9IDA7XFxuK1xcdCpucl9wYWdlcyA9IDE7XFxuIFxcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpO1xcbiBcXG4gXFx0aWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKVxcbiBcXHRcXHRwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4gXFx0ZWxzZVxcbi1cXHRcXHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0XFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgbnJfcGFnZXMpO1xcbiBcXG4gXFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcXG4gXFxuQEAgLTEwODAsOSArMTEzNiwxNiBAQCBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4gfVxcbiBcXG4gLypcXG4tICogbW1hcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeS4gIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3RcXG4tICogRk9MTF9OT1dBSVQsIHRoZSBtbWFwX2xvY2sgbWF5IGJlIHJlbGVhc2VkLiAgSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0XFxuLSAqIHRvIDAgYW5kIC1FQlVTWSByZXR1cm5lZC5cXG4rICogVGhlIGNhbGxlciBob2xkcyBlaXRoZXIgdGhlIG1tYXAgbG9jaywgb3IgdGhlIHBlci1WTUEgbG9jayAod2l0aFxcbisgKiBGT0xMX1ZNQV9MT0NLKSwgb24gZW50cnkuIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3QgRk9MTF9OT1dBSVQsXFxuKyAqIHRoZSBtbWFwX2xvY2sgbWF5IGJlIHJlbGVhc2VkLiBJZiBpdCBpcywgKkBsb2NrZWQgd2lsbCBiZSBzZXQgdG8gMCBhbmRcXG4rICogLUVBR0FJTiByZXR1cm5lZC5cXG4rICpcXG4rICogVGhlIHJldHVybiB2YWx1ZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGxvY2sgdHlwZTogYSBmYXVsdCB0aGF0IG1hZGVcXG4rICogcHJvZ3Jlc3MgYnV0IG5lZWRzIGEgcmV0cnkgKFZNX0ZBVUxUX1JFVFJZIC8gVk1fRkFVTFRfQ09NUExFVEVEKSBpcyByZXBvcnRlZFxcbisgKiBhcyAtRUFHQUlOIGZvciBib3RoIHRoZSBtbWFwIGxvY2sgYW5kIHRoZSBwZXItVk1BIGxvY2sgKEZPTExfVk1BX0xPQ0spLiBPbmx5XFxuKyAqIHRoZSAqQGxvY2tlZCBzaWRlIGVmZmVjdCBpcyBsb2NrLXR5cGUgc3BlY2lmaWMsIGFzIHRoZSBwZXItVk1BIGxvY2sgcGF0aCBoYXNcXG4rICogbm8gdW5sb2NrYWJsZSBtbWFwX2xvY2sgdG8gZHJvcC5cXG4gICovXFxuIHN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBmbGFncywgYm9vbCB1bnNoYXJlLFxcbkBAIC0xMDk3LDYgKzExNjAsOCBAQCBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19XUklURTtcXG4gXFx0aWYgKGZsYWdzIFxcdTAwMjYgRk9MTF9SRU1PVEUpXFxuIFxcdFxcdGZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfUkVNT1RFO1xcbitcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1ZNQV9MT0NLKVxcbitcXHRcXHRmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1ZNQV9MT0NLO1xcbiBcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1VOTE9DS0FCTEUpIHtcXG4gXFx0XFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19BTExPV19SRVRSWSB8IEZBVUxUX0ZMQUdfS0lMTEFCTEU7XFxuIFxcdFxcdC8qXFxuQEAgLTExMjUsNDEgKzExOTAsMTk1IEBAIHN0YXRpYyBpbnQgZmF1bHRpbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0cmV0ID0gaGFuZGxlX21tX2ZhdWx0KHZtYSwgYWRkcmVzcywgZmF1bHRfZmxhZ3MsIE5VTEwpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogQSBmdWxseSBjb21wbGV0ZWQgZmF1bHQgKFZNX0ZBVUxUX0NPTVBMRVRFRCkgb3Igb25lIHRoYXQgbmVlZHMgYSByZXRyeVxcbitcXHQgKiAoVk1fRkFVTFRfUkVUUlkpIGhhcyByZWxlYXNlZCB0aGUgbG9jayBpdCB3YXMgaG9sZGluZy4gUmVwb3J0IGJvdGggYXNcXG4rXFx0ICogLUVBR0FJTiBzbyB0aGUgY2FsbGVyIHJldHJpZXM6IHRoZSBtbWFwIGxvY2sgY2FsbGVyIHJldGFrZXMgaXQgaGVyZSxcXG4rXFx0ICogdGhlIHBlci1WTUEgbG9jayBjYWxsZXIgKEZPTExfVk1BX0xPQ0spIGZhbGxzIGJhY2sgdG8gdGhlIG1tYXAgbG9jay5cXG4rXFx0ICpcXG4rXFx0ICogRHJvcHBpbmcgdGhlIG1tYXAgbG9jayBpcyByZWNvcmRlZCBpbiAqQGxvY2tlZC4gVGhlcmUgaXMgbm8gc3VjaCBsb2NrXFxuK1xcdCAqIHRvIGRyb3AgdW5kZXIgdGhlIHBlci1WTUEgbG9jaywgd2hlcmUgQGxvY2tlZCBpcyBub3QgdXNlZCwgc28gbGVhdmUgaXRcXG4rXFx0ICogYWxvbmUgaW4gdGhhdCBjYXNlLlxcbitcXHQgKi9cXG4gXFx0aWYgKHJldCBcXHUwMDI2IFZNX0ZBVUxUX0NPTVBMRVRFRCkge1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJ2xsIG5ldmVyIHJlbGVhc2UgdGhlXFxuLVxcdFxcdCAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcXHUwMDI2IEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUKTtcXG4tXFx0XFx0KmxvY2tlZCA9IDA7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXZSBzaG91bGQgZG8gdGhlIHNhbWUgYXMgVk1fRkFVTFRfUkVUUlksIGJ1dCBsZXQncyBub3RcXG4tXFx0XFx0ICogcmV0dXJuIC1FQlVTWSBzaW5jZSB0aGF0J3Mgbm90IHJlZmxlY3RpbmcgdGhlIHJlYWxpdHkgb2ZcXG4tXFx0XFx0ICogd2hhdCBoYXMgaGFwcGVuZWQgLSB3ZSd2ZSBqdXN0IGZ1bGx5IGNvbXBsZXRlZCBhIHBhZ2VcXG4tXFx0XFx0ICogZmF1bHQsIHdpdGggdGhlIG1tYXAgbG9jayByZWxlYXNlZC4gIFVzZSAtRUFHQUlOIHRvIHNob3dcXG4tXFx0XFx0ICogdGhhdCB3ZSB3YW50IHRvIHRha2UgdGhlIG1tYXAgbG9jayBfYWdhaW5fLlxcbi1cXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCEoZmxhZ3MgXFx1MDAyNiBGT0xMX1ZNQV9MT0NLKSkge1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJ2xsIG5ldmVyIHJlbGVhc2UgdGhlXFxuK1xcdFxcdFxcdCAqIG1tYXAgbG9jayBpbiB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyLiBTYW5pdHkgY2hlY2sgdGhpcy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcXHUwMDI2IEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUKTtcXG4rXFx0XFx0XFx0KmxvY2tlZCA9IDA7XFxuK1xcdFxcdH1cXG4gXFx0XFx0cmV0dXJuIC1FQUdBSU47XFxuIFxcdH1cXG4gXFxuIFxcdGlmIChyZXQgXFx1MDAyNiBWTV9GQVVMVF9FUlJPUikge1xcbiBcXHRcXHRpbnQgZXJyID0gdm1fZmF1bHRfdG9fZXJybm8ocmV0LCBmbGFncyk7XFxuIFxcbi1cXHRcXHRpZiAoZXJyKVxcbi1cXHRcXHRcXHRyZXR1cm4gZXJyO1xcbi1cXHRcXHRCVUcoKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVk1fRkFVTFRfRVJST1IgYWx3YXlzIGRlY29kZXMgdG8gYW4gZXJybm87IGEgemVybyBoZXJlIHdvdWxkXFxuK1xcdFxcdCAqIG1lYW4gaGFuZGxlX21tX2ZhdWx0KCkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCBjb21iaW5hdGlvbi5cXG4rXFx0XFx0ICogUmVwb3J0IC1FRkFVTFQgcmF0aGVyIHRoYW4gY3Jhc2g6IHVuZGVyIHRoZSBwZXItVk1BIGxvY2sgdGhlXFxuK1xcdFxcdCAqIG1tYXAgbG9jayByZXRyeSBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSByZXN1bHQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRWTV9XQVJOX09OX09OQ0UoIWVycik7XFxuK1xcdFxcdHJldHVybiBlcnIgPyBlcnIgOiAtRUZBVUxUO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAocmV0IFxcdTAwMjYgVk1fRkFVTFRfUkVUUlkpIHtcXG4tXFx0XFx0aWYgKCEoZmF1bHRfZmxhZ3MgXFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCkpXFxuK1xcdFxcdGlmICghKGZsYWdzIFxcdTAwMjYgRk9MTF9WTUFfTE9DSykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgICEoZmF1bHRfZmxhZ3MgXFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCkpXFxuIFxcdFxcdFxcdCpsb2NrZWQgPSAwO1xcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRcXHRyZXR1cm4gLUVBR0FJTjtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIGdldF91c2VyX3BhZ2Vfdm1hIC0gZ2V0IG9uZSBwYWdlIGZyb20gQHZtYSwgd2hvc2UgbG9jayB0aGUgY2FsbGVyIGFscmVhZHlcXG4rICogaG9sZHM6IHRoZSBtbWFwIGxvY2ssIG9yICh3aXRoIEZPTExfVk1BX0xPQ0spIHRoZSBwZXItVk1BIGxvY2suIFdhbGtzIHRoZVxcbisgKiBwYWdlIHRhYmxlcywgZmF1bHRpbmcgdGhlIHBhZ2UgaW4gaWYgbmVlZGVkLCBhbmQgb24gc3VjY2VzcyByZXR1cm5zIGl0IHdpdGhcXG4rICogYSByZWZlcmVuY2UgYW5kIHRoZSBsb2NrIHN0aWxsIGhlbGQuXFxuKyAqXFxuKyAqIFJ1bnMgY2hlY2tfdm1hX2ZsYWdzKCkgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHNvIGNhbGxlcnMgbmVlZCBub3QgcHJlLWNoZWNrXFxuKyAqIHRoZSBWTUE7IG1vc3QgcmVqZWN0aW9ucyBhcmUgcmV0dXJuZWQgYXMgdGhlaXIgZXJyb3IuIEEgVk1fSU8vVk1fUEZOTUFQIFZNQVxcbisgKiBpcyB0aGUgZXhjZXB0aW9uOiBhIENPV2VkIHBhZ2Ugd2l0aCBhIHN0cnVjdCBwYWdlIGlzIHJldHVybmVkLCB3aGlsZSBhIHJhd1xcbisgKiBQRk4gaGFzIG5vbmUgYW5kIHlpZWxkcyAtRUZBVUxULCB0byBiZSByZWFjaGVkIHZpYSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKCkuXFxuKyAqXFxuKyAqIFVuZGVyIEZPTExfVk1BX0xPQ0ssIGFueXRoaW5nIHRoYXQgY2Fubm90IGJlIGZpbmlzaGVkIHVuZGVyIHRoZSBwZXItVk1BIGxvY2tcXG4rICogKGEgZHJvcHBlZCBmYXVsdCwgdXNlcmZhdWx0ZmQsIGEgaGFyZCBlcnJvciwgb3IgLVxcdTAwM2VhY2Nlc3MoKSBtZW1vcnkpIHJlbGVhc2VzXFxuKyAqIHRoZSBsb2NrIGFuZCByZXR1cm5zIC1FQUdBSU4sIHNvIHRoZSBjYWxsZXIgcmV0cmllcyB1bmRlciB0aGUgbW1hcCBsb2NrLlxcbisgKi9cXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxcbit7XFxuK1xcdGJvb2wgdm1hX2xvY2tlZCA9IGd1cF9mbGFncyBcXHUwMDI2IEZPTExfVk1BX0xPQ0s7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XFxuK1xcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRpbnQgbG9ja2VkID0gMTtcXG4rXFx0Ym9vbCBwZm5tYXA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUd28gbG9jayBtb2RlcyBhcmUgc3VwcG9ydGVkOiB0aGUgbW1hcCBsb2NrLCB3aXRoIG5laXRoZXIgZmxhZywgb3JcXG4rXFx0ICogdGhlIHBlci1WTUEgbG9jaywgd2l0aCBib3RoIEZPTExfVk1BX0xPQ0sgYW5kIEZPTExfVU5MT0NLQUJMRS4gQW5cXG4rXFx0ICogdW5sb2NrYWJsZSBtbWFwIGZhdWx0IHdvdWxkIGRyb3AgdGhlIGxvY2sgYW5kIHJlcG9ydCBpdCBpbiAqbG9ja2VkLFxcbitcXHQgKiB3aGljaCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlbGF5LCBzbyByZWplY3QgYSBsb25lIGZsYWcuXFxuK1xcdCAqL1xcbitcXHRWTV9XQVJOX09OX09OQ0UoIShndXBfZmxhZ3MgXFx1MDAyNiBGT0xMX1ZNQV9MT0NLKSAhPSAhKGd1cF9mbGFncyBcXHUwMDI2IEZPTExfVU5MT0NLQUJMRSkpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVmFsaWRhdGUgdGhlIFZNQSB1cCBmcm9udCwgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCkuIEEgVk1fSU8vVk1fUEZOTUFQXFxuK1xcdCAqIFZNQSBpcyBub3QgcmVqZWN0ZWQgb3V0cmlnaHQ6IGl0IGNhbiBob2xkIENPV2VkIHBhZ2VzIHRoYXQgaGF2ZSBhXFxuK1xcdCAqIHN0cnVjdCBwYWdlOyBsZXQgZm9sbG93X3BhZ2VfbWFzaygpIGxvb2sgZm9yIHRoZW0sIGFuZCB0cmVhdCBvbmx5XFxuK1xcdCAqIGl0cyBzdHJ1Y3QtcGFnZS1sZXNzIFBGTnMgYXMgdW5yZWFjaGFibGUuIE90aGVyIHJlamVjdGlvbnNcXG4rXFx0ICogKHNlY3JldG1lbSwgcGVybWlzc2lvbnMsIGV0YykgcmVzdWx0IGluIGltbWVkaWF0ZSBmYWlsdXJlLlxcbitcXHQgKi9cXG4rXFx0cmV0ID0gY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCBWTV9JTyB8IFZNX1BGTk1BUCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0cGZubWFwID0gdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IChWTV9JTyB8IFZNX1BGTk1BUCk7XFxuK1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdGlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkge1xcbitcXHRcXHRcXHRyZXQgPSAtRUlOVFI7XFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0fVxcbitcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4rXFxuK1xcdFxcdC8qIFRoaXMgaGVscGVyIGhhbmRzIGJhY2sgYSBzaW5nbGUgcGFnZTsgY2FwIHRoZSBiYXRjaCBhdCBvbmUuICovXFxuK1xcdFxcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgYWRkciwgYWRkciArIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0Z3VwX2ZsYWdzIHwgRk9MTF9UT1VDSCB8IEZPTExfR0VULFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2bnJfcGFnZXMpO1xcbitcXHRcXHRpZiAoIUlTX0VSUl9PUl9OVUxMKHBhZ2UpKSB7XFxuK1xcdFxcdFxcdC8qIE1hdGNoIF9fZ2V0X3VzZXJfcGFnZXMoKTogZmx1c2ggZm9yIFZJVlQvYWxpYXNpbmcgY2FjaGVzLiAqL1xcbitcXHRcXHRcXHRmbHVzaF9hbm9uX3BhZ2Uodm1hLCBwYWdlLCBhZGRyKTtcXG4rXFx0XFx0XFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7XFxuK1xcdFxcdFxcdHJldHVybiBwYWdlO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBObyBzdHJ1Y3QgcGFnZTogYSByYXcgUEZOIG9mIGEgVk1fSU8vVk1fUEZOTUFQIFZNQSwgd2hldGhlclxcbitcXHRcXHQgKiBzZWVuIGJ5IHRoZSB1cC1mcm9udCBjaGVjayAoQHBmbm1hcCkgb3IgcmVwb3J0ZWQgYXMgLUVFWElTVFxcbitcXHRcXHQgKiBmb3IgYSBwcmVzZW50IFBGTi4gUmV0dXJuIC1FRkFVTFQgc28gdGhlIGNhbGxlciByZWFjaGVzIGl0XFxuK1xcdFxcdCAqIHRocm91Z2ggdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWFjY2VzcygpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHBmbm1hcCB8fCBQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVGQVVMVDtcXG4rXFx0XFx0XFx0Z290byBmYWlsO1xcbitcXHRcXHR9XFxuK1xcdFxcdC8qIEEgaGFyZCBlcnJvciBmcm9tIHRoZSB3YWxrIGl0c2VsZi4gKi9cXG4rXFx0XFx0aWYgKHBhZ2UgXFx1MDAyNlxcdTAwMjYgUFRSX0VSUihwYWdlKSAhPSAtRU1MSU5LKSB7XFxuK1xcdFxcdFxcdHJldCA9IFBUUl9FUlIocGFnZSk7XFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhlIHBhZ2UgaXMgbm90IHByZXNlbnQsIG9yIG5lZWRzIHVuc2hhcmluZy4gQSByZW1vdGUgZmF1bHRcXG4rXFx0XFx0ICogdW5kZXIgdGhlIHBlci1WTUEgbG9jayBjYW5ub3QgZGVsaXZlciB1c2VyZmF1bHRmZCAod2hpY2hcXG4rXFx0XFx0ICogYXNzdW1lcyBjdXJyZW50IGlzIHRoZSBmYXVsdGluZyB0YXNrKSwgc28gZmFsbCBiYWNrIGZvciB0aG9zZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmICh2bWFfbG9ja2VkIFxcdTAwMjZcXHUwMDI2IHVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0XFx0Z290byBmYWlsO1xcbitcXHRcXHR9XFxuK1xcdFxcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9HRVQsXFxuK1xcdFxcdFxcdFxcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgXFx1MDAyNmxvY2tlZCk7XFxuK1xcdFxcdGlmIChyZXQgPT0gLUVBR0FJTilcXG4rXFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XFx0LyogZmF1bHQgcmVsZWFzZWQgdGhlIHBlci1WTUEgbG9jayAqL1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK2ZhaWw6XFxuK1xcdC8qXFxuK1xcdCAqIFVuZGVyIHRoZSBwZXItVk1BIGxvY2sgdGhlIGNhbGxlciBjYW5ub3QgcmVhY2ggLVxcdTAwM2VhY2Nlc3MoKSBvciBhY3Qgb24gYVxcbitcXHQgKiBoYXJkIGVycm9yIChib3RoIG5lZWQgdGhlIG1tYXAgbG9jayksIHNvIHJlbGVhc2UgdGhlIGxvY2sgYW5kIGhhdmUgaXRcXG4rXFx0ICogcmV0cnkgdGhlcmU7IHRoZSBtbWFwLWxvY2sgcGFzcyBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSBlcnJvci5cXG4rXFx0ICovXFxuK1xcdGlmICh2bWFfbG9ja2VkKSB7XFxuK1xcdFxcdHZtYV9lbmRfcmVhZCh2bWEpO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gRVJSX1BUUihyZXQpO1xcbit9XFxuK1xcbisvKlxcbisgKiBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEgLSBmYXVsdCBpbiBvbmUgcGFnZSBvZiBhIHJlbW90ZSBtbSBhbmQgaGFuZCBiYWNrIHRoZVxcbisgKiBwYWdlIGFsb25nIHdpdGggdGhlIFZNQSB0aGF0IGNvdmVycyBpdC4gVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIG1tYXBfbG9jay5cXG4rICogUmV0dXJucyB3aXRoIHRoZSBtbWFwX2xvY2sgc3RpbGwgaGVsZC5cXG4rICpcXG4rICogTG9va3MgdXAgdGhlIFZNQSwgYW5kIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgdGhyb3VnaFxcbisgKiBnZXRfdXNlcl9wYWdlX3ZtYSgpLCBmYXVsdGluZyBpbiB0aGUgcGFnZSBpZiBuZWVkZWQuXFxuKyAqXFxuKyAqIEZPTExfTk9XQUlUIGFuZCBGT0xMX1VOTE9DS0FCTEUgYXJlIHJlamVjdGVkOiBib3RoIGxldCB0aGUgZmF1bHQgaGFuZGxlclxcbisgKiBkcm9wIHRoZSBtbWFwIGxvY2ssIHdoaWNoIGNvdWxkIGludmFsaWRhdGUgdGhlIGxvb2tlZC11cCBWTUEuXFxuKyAqL1xcbitzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGludCBndXBfZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXFxuK3tcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuK1xcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXG4rXFx0aWYgKFdBUk5fT05fT05DRSh1bmxpa2VseShndXBfZmxhZ3MgXFx1MDAyNiAoRk9MTF9OT1dBSVQgfCBGT0xMX1VOTE9DS0FCTEUpKSkpXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXG4rXFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcXG4rXFxuK1xcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xcbitcXHRpZiAoIXZtYSlcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuK1xcbitcXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWEodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfVE9VQ0gpO1xcbitcXHRpZiAoSVNfRVJSKHBhZ2UpKVxcbitcXHRcXHRyZXR1cm4gcGFnZTtcXG4rXFxuK1xcdCp2bWFwID0gdm1hO1xcbitcXHRyZXR1cm4gcGFnZTtcXG4rfVxcbitcXG4gLypcXG4gICogV3JpdGluZyB0byBmaWxlLWJhY2tlZCBtYXBwaW5ncyB3aGljaCByZXF1aXJlIGZvbGlvIGRpcnR5IHRyYWNraW5nIHVzaW5nIEdVUFxcbiAgKiBpcyBhIGZ1bmRhbWVudGFsbHkgYnJva2VuIG9wZXJhdGlvbiwgYXMga2VybmVsIHdyaXRlIGFjY2VzcyB0byBHVVAgbWFwcGluZ3NcXG5AQCAtMTE5NywxMyArMTQxNiwyMSBAQCBzdGF0aWMgYm9vbCB3cml0YWJsZV9maWxlX21hcHBpbmdfYWxsb3dlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0cmV0dXJuICF2bWFfbmVlZHNfZGlydHlfdHJhY2tpbmcodm1hKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBjaGVja192bWFfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZ3VwX2ZsYWdzKVxcbitpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncyxcXG4rXFx0XFx0ICAgIHZtX2ZsYWdzX3QgaWdub3JlX2ZsYWdzKVxcbiB7XFxuIFxcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MgPSB2bWEtXFx1MDAzZXZtX2ZsYWdzO1xcbiBcXHRpbnQgd3JpdGUgPSAoZ3VwX2ZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSk7XFxuIFxcdGludCBmb3JlaWduID0gKGd1cF9mbGFncyBcXHUwMDI2IEZPTExfUkVNT1RFKTtcXG4gXFx0Ym9vbCB2bWFfYW5vbiA9IHZtYV9pc19hbm9ueW1vdXModm1hKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIE9wdCBvdXQgb2YgdGhlIGZsYWcgY2hlY2tzIHRoYXQgcmVhZCB0aGlzIGxvY2FsIGNvcHkgKHRoZVxcbitcXHQgKiBWTV9JTy9WTV9QRk5NQVAgZ2F0ZSBhbmQgdGhlIHdyaXRlL3JlYWQvY293IGJpdHMpOyBjaGVja3MgdGhhdFxcbitcXHQgKiByZS1yZWFkIHZtYS1cXHUwMDNldm1fZmxhZ3MgdGhyb3VnaCBoZWxwZXJzIGFyZSB1bmFmZmVjdGVkLlxcbitcXHQgKi9cXG4rXFx0dm1fZmxhZ3MgXFx1MDAyNj0gfmlnbm9yZV9mbGFncztcXG4rXFxuIFxcdGlmICh2bV9mbGFncyBcXHUwMDI2IChWTV9JTyB8IFZNX1BGTk1BUCkpXFxuIFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiBcXG5AQCAtMTM1OCw3ICsxNTg1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4ge1xcbiBcXHRsb25nIHJldCA9IDAsIGkgPSAwO1xcbiBcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcXG4gXFxuIFxcdGlmICghbnJfcGFnZXMpXFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC0xMzczLDcgKzE1OTksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXG4gXFx0ZG8ge1xcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0XFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaW5jcmVtO1xcbiBcXG4gXFx0XFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xcbiBcXHRcXHRpZiAoIXZtYSB8fCBzdGFydCBcXHUwMDNlPSB2bWEtXFx1MDAzZXZtX2VuZCkge1xcbkBAIC0xMzg3LDcgKzE2MTMsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbiBcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRcXHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkge1xcbitcXHRcXHRcXHRcXHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKSkge1xcbiBcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbiBcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0XFx0fVxcbkBAIC0xNDAwLDcgKzE2MjYsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRwYWdlcyA/IFxcdTAwMjZwYWdlIDogTlVMTCk7XFxuIFxcdFxcdFxcdFxcdGlmIChyZXQpXFxuIFxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHRcXHRwYWdlX21hc2sgPSAwO1xcbitcXHRcXHRcXHRcXHRwYWdlX2luY3JlbSA9IDE7XFxuIFxcdFxcdFxcdFxcdGdvdG8gbmV4dF9wYWdlO1xcbiBcXHRcXHRcXHR9XFxuIFxcbkBAIC0xNDA4LDcgKzE2MzQsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHRcXHRcXHRyZXQgPSAtRUZBVUxUO1xcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MpO1xcbitcXHRcXHRcXHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIDApO1xcbiBcXHRcXHRcXHRpZiAocmV0KVxcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbkBAIC0xNDIzLDcgKzE2NDksOCBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHR9XFxuIFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbiBcXG4tXFx0XFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCBcXHUwMDI2cGFnZV9tYXNrKTtcXG4rXFx0XFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgKyBucl9wYWdlcyAqIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0Z3VwX2ZsYWdzLCBcXHUwMDI2cGFnZV9pbmNyZW0pO1xcbiBcXHRcXHRpZiAoIXBhZ2UgfHwgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LKSB7XFxuIFxcdFxcdFxcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXFxuIFxcdFxcdFxcdFxcdFxcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcXG5AQCAtMTQ1Niw3ICsxNjgzLDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdFxcdH1cXG4gbmV4dF9wYWdlOlxcbi1cXHRcXHRwYWdlX2luY3JlbSA9IDEgKyAofihzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKSBcXHUwMDI2IHBhZ2VfbWFzayk7XFxuIFxcdFxcdGlmIChwYWdlX2luY3JlbSBcXHUwMDNlIG5yX3BhZ2VzKVxcbiBcXHRcXHRcXHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xcbiBcXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcXG5pbmRleCAxODFlNzlmMWQ2YTIwNy4uNzA2ZjdmMDhmZDE4MTUgMTAwNjQ0XFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxcbisrKyBiL21tL2ludGVybmFsLmhcXG5AQCAtMTU5NSw2ICsxNTk1LDEwIEBAIHN0cnVjdCB2bV9zdHJ1Y3QgKl9fZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsXFxuICAqL1xcbiBpbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxcbiBcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MpO1xcbitpbnQgY2hlY2tfdm1hX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGd1cF9mbGFncyxcXG4rXFx0XFx0ICAgIHZtX2ZsYWdzX3QgaWdub3JlX2ZsYWdzKTtcXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKTtcXG4gXFxuIC8qXFxuICAqIG1tL2h1Z2VfbWVtb3J5LmNcXG5AQCAtMTY0MSwxMSArMTY0NSwxMyBAQCBlbnVtIHtcXG4gXFx0Rk9MTF9VTkxPQ0tBQkxFID0gMSBcXHUwMDNjXFx1MDAzYyAyMSxcXG4gXFx0LyogVk1BIGxvb2t1cCtjaGVja3MgY29tcGF0aWJsZSB3aXRoIE1BRFZfUE9QVUxBVEVfKFJFQUR8V1JJVEUpICovXFxuIFxcdEZPTExfTUFEVl9QT1BVTEFURSA9IDEgXFx1MDAzY1xcdTAwM2MgMjIsXFxuK1xcdC8qIGNhbGxlciBob2xkcyB0aGUgcGVyLVZNQSBsb2NrLCBub3QgdGhlIG1tYXAgbG9jayAqL1xcbitcXHRGT0xMX1ZNQV9MT0NLID0gMSBcXHUwMDNjXFx1MDAzYyAyMyxcXG4gfTtcXG4gXFxuICNkZWZpbmUgSU5URVJOQUxfR1VQX0ZMQUdTIChGT0xMX1RPVUNIIHwgRk9MTF9UUklFRCB8IEZPTExfUkVNT1RFIHwgRk9MTF9QSU4gfCBcXFxcXFxuIFxcdFxcdFxcdCAgICBGT0xMX0ZBU1RfT05MWSB8IEZPTExfVU5MT0NLQUJMRSB8IFxcXFxcXG4tXFx0XFx0XFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSlcXG4rXFx0XFx0XFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSB8IEZPTExfVk1BX0xPQ0spXFxuIFxcbiAvKlxcbiAgKiBJbmRpY2F0ZXMgZm9yIHdoaWNoIHBhZ2VzIHRoYXQgYXJlIHdyaXRlLXByb3RlY3RlZCBpbiB0aGUgcGFnZSB0YWJsZSxcXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuY1xcbmluZGV4IGZmMzM4YzJhYmU5MjMxLi5hYWY2MjAwMTdmMzQ0MiAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnkuY1xcbisrKyBiL21tL21lbW9yeS5jXFxuQEAgLTcwMTUsODYgKzcwMTUsMjQ0IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGdlbmVyaWNfYWNjZXNzX3BoeXMpO1xcbiAjZW5kaWZcXG4gXFxuIC8qXFxuLSAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXFxuKyAqIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeSwgc3VjaCBhcyBhbiBpb3JlbWFwcGVkIGRldmljZSBtYXBwaW5nLCBtYXBzXFxuKyAqIFBGTnMgdGhhdCBoYXZlIG5vIHN0cnVjdCBwYWdlLCBzbyBnZXRfdXNlcl9wYWdlX3ZtYSgpIGNhbm5vdCBmZXRjaCBpdFxcbisgKiBldmVuIHRob3VnaCB0aGUgcGFnZSB0YWJsZXMgYXJlIHBvcHVsYXRlZC4gSXQgY2FuIHN0aWxsIGJlIHJlYWNoZWRcXG4rICogdGhyb3VnaCB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKCkuXFxuKyAqXFxuKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3IgXFx1MDAzYz0gMCBpZiBAdm1hIGNhbm5vdCBiZVxcbisgKiBhY2Nlc3NlZCB0aGlzIHdheS5cXG4gICovXFxuLXN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLVxcdFxcdFxcdCAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4rc3RhdGljIGludCBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4rXFx0XFx0XFx0XFx0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxcbit7XFxuKyNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1RcXG4rXFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxuK1xcdFxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTtcXG4rI2VuZGlmXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBMb2NrIEBtbSB0byByZWFjaCB0aGUgcmVtb3RlIHJhbmdlIFtAYWRkciwgQGFkZHIgKyBAbGVuKS5cXG4rICpcXG4rICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlXFxuKyAqIGZsYWdzIHBlcm1pdCB0aGUgYWNjZXNzLiBUaGUgUkNVIGZyZWVkIHBhZ2UgdGFibGVzIHRoZW4ga2VlcCBwYWdlIHRhYmxlXFxuKyAqIG1lbW9yeSBmcm9tIGJlaW5nIHJldXNlZCB3aXRoIHVuZXhwZWN0ZWQgY29udGVudHMgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC5cXG4rICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLFxcbisgKiBzdGFjayBleHBhbnNpb24sIGFuZCAtXFx1MDAzZWFjY2VzcygpIG1lbW9yeS5cXG4rICpcXG4rICogUmV0dXJuIHdoZXRoZXIgdGhlIG1tYXAgbG9jayBpcyBoZWxkLiBUaGUgcGVyLVZNQSBsb2NrZWQgVk1BLCB3aGVuIG9uZSBpc1xcbisgKiB0YWtlbiwgaXMgc3RvcmVkIGluICpAdm1hcDsgaXQgaXMgTlVMTCBvbiB0aGUgbW1hcCBsb2NrIHBhdGguICpAdm1hcCBpc1xcbisgKiBzZXQgdG8gYW4gRVJSX1BUUigpIHdoZW4gdGhlIG1tYXAgbG9jayBjb3VsZCBub3QgYmUgdGFrZW4sIHNvIGNhbGxlcnMgbXVzdFxcbisgKiBjaGVjayBJU19FUlIoKkB2bWFwKSBiZWZvcmUgdXNpbmcgZWl0aGVyIHJlc3VsdC5cXG4rICovXFxuK3N0YXRpYyBib29sIHJlbW90ZV9hY2Nlc3NfbG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHQgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncyxcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXFxuK3tcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xcbitcXG4rI2lmIGRlZmluZWQoQ09ORklHX1BFUl9WTUFfTE9DSykgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRSlcXG4rXFx0dm1hID0gbG9ja192bWFfdW5kZXJfcmN1KG1tLCBhZGRyKTtcXG4rXFx0aWYgKHZtYSkge1xcbitcXHRcXHQvKiBhZGRyICsgbGVuIG11c3Qgbm90IHdyYXAsIGFuZCBtdXN0IGZpdCB3aXRoaW4gdGhlIG9uZSBWTUEuICovXFxuK1xcdFxcdGlmIChhZGRyICsgbGVuIFxcdTAwM2MgYWRkciB8fCBhZGRyICsgbGVuIFxcdTAwM2Ugdm1hLVxcdTAwM2V2bV9lbmQgfHxcXG4rXFx0XFx0ICAgIGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCkpIHtcXG4rXFx0XFx0XFx0dm1hX2VuZF9yZWFkKHZtYSk7XFxuK1xcdFxcdFxcdHZtYSA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbisjZW5kaWZcXG4rXFxuK1xcdGlmICghdm1hKSB7XFxuK1xcdFxcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpIHtcXG4rXFx0XFx0XFx0KnZtYXAgPSBFUlJfUFRSKC1FSU5UUik7XFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQqdm1hcCA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHQqdm1hcCA9IHZtYTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbisvKiBSZWxlYXNlIHRoZSBsb2NrIHRha2VuIGJ5IHJlbW90ZV9hY2Nlc3NfbG9jaygpLiAqL1xcbitzdGF0aWMgdm9pZCByZW1vdGVfYWNjZXNzX3VubG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sIGhhdmVfbW1hcF9sb2NrKVxcbit7XFxuK1xcdGlmIChoYXZlX21tYXBfbG9jaylcXG4rXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuK1xcdGVsc2UgaWYgKHZtYSlcXG4rXFx0XFx0dm1hX2VuZF9yZWFkKHZtYSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFBlci1wYWdlIGFjdGlvbiBmb3IgYSByZW1vdGUgVk0gd2Fsay4gSGFuZGxlIHVwIHRvIEBsZW4gYnl0ZXMgYXQgQGFkZHIgb25cXG4rICogQHBhZ2UsIGFkdmFuY2luZyAqQGJ1ZiBwYXN0IHRoZSBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBpdC4gQHBhZ2UgaXNcXG4rICogTlVMTCBmb3Igc3RydWN0LXBhZ2UtbGVzcyBtZW1vcnkgKFZNX0lPIC8gVk1fUEZOTUFQKSByZWFjaGVkIHVuZGVyIHRoZSBtbWFwXFxuKyAqIGxvY2suXFxuKyAqXFxuKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNvdXJjZSBieXRlcyBoYW5kbGVkIGF0IEBhZGRyLCAwIHRvIGVuZCB0aGUgd2FsayAoYVxcbisgKiBzdHJpbmcgcmVhY2hlZCBpdHMgTlVMLCBvciAtXFx1MDAzZWFjY2VzcygpIG1lbW9yeSBjb3VsZCBub3QgYmUgcmVhY2hlZCksIG9yIGFcXG4rICogbmVnYXRpdmUgZXJybm8gdG8gYWJvcnQuXFxuKyAqL1xcbit0eXBlZGVmIGludCAoKnJlbW90ZV92bV9hY3Rpb24pKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4rXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLFxcbitcXHRcXHRcXHRcXHRpbnQgd3JpdGUpO1xcbitcXG4rLypcXG4rICogV2FsayB0aGUgcmVtb3RlIHJhbmdlIFtAYWRkciwgQGFkZHIgKyBAbGVuKSBvZiBAbW0sIGhhbmRpbmcgZWFjaCBwYWdlIHRvXFxuKyAqIEBhY3Rpb24uIFVzZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHJhbmdlIGZpdHMgb25lIFZNQSwgYW5kIGZhbGwgYmFjayB0b1xcbisgKiB0aGUgbW1hcCBsb2NrIGZvciBtdWx0aS1WTUEgcmFuZ2VzLCBzdGFjayBleHBhbnNpb24gKHdoZW4gQGNhbl9leHBhbmRfc3RhY2tcXG4rICogaXMgc2V0KSwgb3Igd2hlbiB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBmaW5pc2ggYSBmYXVsdC5cXG4rICpcXG4rICogRWFjaCBwYWdlIGlzIGZhdWx0ZWQgaW4gd2l0aCBnZXRfdXNlcl9wYWdlX3ZtYSgpIHVuZGVyIHdoaWNoZXZlciBsb2NrIGlzXFxuKyAqIGhlbGQuIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIEBhY3Rpb24gY29uc3VtZWQ7ICpAZXJyIGlzIGEgbmVnYXRpdmVcXG4rICogZXJybm8gd2hlbiB0aGUgd2FsayBhYm9ydGVkLCBlbHNlIDAuXFxuKyAqL1xcbitzdGF0aWMgaW50IHJlbW90ZV92bV93YWxrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZixcXG4rXFx0XFx0XFx0ICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBib29sIGNhbl9leHBhbmRfc3RhY2ssXFxuK1xcdFxcdFxcdCAgcmVtb3RlX3ZtX2FjdGlvbiBhY3Rpb24sIGludCAqZXJyKVxcbiB7XFxuIFxcdHZvaWQgKm9sZF9idWYgPSBidWY7XFxuIFxcdGludCB3cml0ZSA9IGd1cF9mbGFncyBcXHUwMDI2IEZPTExfV1JJVEU7XFxuK1xcdGJvb2wgaGF2ZV9tbWFwX2xvY2s7XFxuK1xcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xcbiBcXG4tXFx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSlcXG4tXFx0XFx0cmV0dXJuIDA7XFxuK1xcdCplcnIgPSAwO1xcbitcXG4rXFx0LypcXG4rXFx0ICogU2V0IEZPTExfUkVNT1RFIHNvIGNoZWNrX3ZtYV9mbGFncygpIGFwcGxpZXMgdGhlIHNhbWUgcHJvdGVjdGlvbiBrZXlcXG4rXFx0ICogcnVsZXMgYXMgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKCkgZGlkOiB0aGUgY3VycmVudCBQS1JVIGlzIG5vdCBjaGVja2VkXFxuK1xcdCAqIGFnYWluc3QgYSBWTUEgcmVhY2hlZCBvbiBAbW0ncyBiZWhhbGYuXFxuK1xcdCAqL1xcbitcXHRndXBfZmxhZ3MgfD0gRk9MTF9SRU1PVEU7XFxuIFxcbi1cXHQvKiBVbnRhZyB0aGUgYWRkcmVzcyBiZWZvcmUgbG9va2luZyB1cCB0aGUgVk1BICovXFxuLVxcdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcik7XFxuK1xcdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XFxuIFxcbi1cXHQvKiBBdm9pZCB0cmlnZ2VyaW5nIHRoZSB0ZW1wb3Jhcnkgd2FybmluZyBpbiBfX2dldF91c2VyX3BhZ2VzICovXFxuLVxcdGlmICghdm1hX2xvb2t1cChtbSwgYWRkcikgXFx1MDAyNlxcdTAwMjYgIWV4cGFuZF9zdGFjayhtbSwgYWRkcikpXFxuK1xcdGhhdmVfbW1hcF9sb2NrID0gcmVtb3RlX2FjY2Vzc19sb2NrKG1tLCBhZGRyLCBsZW4sIGd1cF9mbGFncywgXFx1MDAyNnZtYSk7XFxuK1xcdGlmIChJU19FUlIodm1hKSkge1xcbitcXHRcXHQqZXJyID0gLUVGQVVMVDtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4gXFxuLVxcdC8qIGlnbm9yZSBlcnJvcnMsIGp1c3QgY2hlY2sgaG93IG11Y2ggd2FzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCAqL1xcbiBcXHR3aGlsZSAobGVuKSB7XFxuLVxcdFxcdGludCBieXRlcywgb2Zmc2V0O1xcbi1cXHRcXHR2b2lkICptYWRkcjtcXG4tXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4tXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xcbi1cXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgYWRkcixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBndXBfZmxhZ3MsIFxcdTAwMjZ2bWEpO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgZm9sbF9mbGFncyA9IGd1cF9mbGFncztcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdFxcdGludCByZXQ7XFxuIFxcbi1cXHRcXHRpZiAoSVNfRVJSKHBhZ2UpKSB7XFxuLVxcdFxcdFxcdC8qIFdlIG1pZ2h0IG5lZWQgdG8gZXhwYW5kIHRoZSBzdGFjayB0byBhY2Nlc3MgaXQgKi9cXG4rXFx0XFx0aWYgKCF2bWEgfHwgYWRkciBcXHUwMDNlPSB2bWEtXFx1MDAzZXZtX2VuZCkge1xcbitcXHRcXHRcXHQvKiBBbnkgbG9va3VwIGhlcmUgaG9sZHMgdGhlIG1tYXAgbG9jay4gKi9cXG4rXFx0XFx0XFx0Vk1fQlVHX09OKCFoYXZlX21tYXBfbG9jayk7XFxuIFxcdFxcdFxcdHZtYSA9IHZtYV9sb29rdXAobW0sIGFkZHIpO1xcbi1cXHRcXHRcXHRpZiAoIXZtYSkge1xcbitcXHRcXHRcXHRpZiAoIXZtYSBcXHUwMDI2XFx1MDAyNiBjYW5fZXhwYW5kX3N0YWNrKSB7XFxuK1xcdFxcdFxcdFxcdC8qIGV4cGFuZF9zdGFjaygpIGRyb3BzIHRoZSBtbWFwIGxvY2sgaWYgaXQgZmFpbHMgKi9cXG4gXFx0XFx0XFx0XFx0dm1hID0gZXhwYW5kX3N0YWNrKG1tLCBhZGRyKTtcXG4tXFxuLVxcdFxcdFxcdFxcdC8qIG1tYXBfbG9jayB3YXMgZHJvcHBlZCBvbiBmYWlsdXJlICovXFxuIFxcdFxcdFxcdFxcdGlmICghdm1hKVxcbi1cXHRcXHRcXHRcXHRcXHRyZXR1cm4gYnVmIC0gb2xkX2J1ZjtcXG4tXFxuLVxcdFxcdFxcdFxcdC8qIFRyeSBhZ2FpbiBpZiBzdGFjayBleHBhbnNpb24gd29ya2VkICovXFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRcXHRcXHRoYXZlX21tYXBfbG9jayA9IGZhbHNlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmICghdm1hKSB7XFxuK1xcdFxcdFxcdFxcdCplcnIgPSAtRUZBVUxUO1xcbitcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBGT0xMX1VOTE9DS0FCTEUgbGV0cyB0aGUgcGVyLVZNQSBmYXVsdCByZXRyeSwgZHJvcHBpbmcgdGhlXFxuK1xcdFxcdCAqIGxvY2ssIHNvIHRoZSB3YWxrIGNhbiBmYWxsIGJhY2sgdG8gdGhlIG1tYXAgbG9jay5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmICghaGF2ZV9tbWFwX2xvY2spXFxuK1xcdFxcdFxcdGZvbGxfZmxhZ3MgfD0gRk9MTF9WTUFfTE9DSyB8IEZPTExfVU5MT0NLQUJMRTtcXG4gXFxuK1xcdFxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGZvbGxfZmxhZ3MpO1xcbitcXHRcXHRpZiAoSVNfRVJSKHBhZ2UpKSB7XFxuIFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIENoZWNrIGlmIHRoaXMgaXMgYSBWTV9JTyB8IFZNX1BGTk1BUCBWTUEsIHdoaWNoXFxuLVxcdFxcdFxcdCAqIHdlIGNhbiBhY2Nlc3MgdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUuXFxuK1xcdFxcdFxcdCAqIGdldF91c2VyX3BhZ2Vfdm1hKCkgcmV0dXJucyAtRUFHQUlOLCB3aXRoIHRoZSBwZXItVk1BXFxuK1xcdFxcdFxcdCAqIGxvY2sgcmVsZWFzZWQsIGZvciBhbnl0aGluZyBpdCBjb3VsZCBub3QgZmluaXNoIHVuZGVyXFxuK1xcdFxcdFxcdCAqIGl0OyByZXRha2UgdGhlIG1tYXAgbG9jayBhbmQgcmV0cnkuIEEgZGlmZmVyZW50IGVycm9yXFxuK1xcdFxcdFxcdCAqIHRoZXJlZm9yZSBvbmx5IGFycml2ZXMgdW5kZXIgdGhlIG1tYXAgbG9jaywgd2hlcmVcXG4rXFx0XFx0XFx0ICogc3RydWN0LXBhZ2UtbGVzcyBtZW1vcnkgY2FuIGJlIHJlYWNoZWQgdmlhIC1cXHUwMDNlYWNjZXNzKCkuXFxuIFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRieXRlcyA9IDA7XFxuLSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1RcXG4tXFx0XFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxuLVxcdFxcdFxcdFxcdGJ5dGVzID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWFjY2Vzcyh2bWEsIGFkZHIsIGJ1ZixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGxlbiwgd3JpdGUpO1xcbi0jZW5kaWZcXG4tXFx0XFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2M9IDApXFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcdFxcdFxcdGJ5dGVzID0gbGVuO1xcbi1cXHRcXHRcXHRvZmZzZXQgPSBhZGRyIFxcdTAwMjYgKFBBR0VfU0laRS0xKTtcXG4tXFx0XFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2UgUEFHRV9TSVpFLW9mZnNldClcXG4tXFx0XFx0XFx0XFx0Ynl0ZXMgPSBQQUdFX1NJWkUtb2Zmc2V0O1xcbi1cXG4tXFx0XFx0XFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xcbi1cXHRcXHRcXHRpZiAod3JpdGUpIHtcXG4tXFx0XFx0XFx0XFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgIG1hZGRyICsgb2Zmc2V0LCBidWYsIGJ5dGVzKTtcXG4tXFx0XFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eV9sb2NrKGZvbGlvKTtcXG4tXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICBidWYsIG1hZGRyICsgb2Zmc2V0LCBieXRlcyk7XFxuK1xcdFxcdFxcdGlmIChQVFJfRVJSKHBhZ2UpID09IC1FQUdBSU4pIHtcXG4rXFx0XFx0XFx0XFx0dm1hID0gTlVMTDtcXG4rXFx0XFx0XFx0XFx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkge1xcbitcXHRcXHRcXHRcXHRcXHQqZXJyID0gLUVGQVVMVDtcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0aGF2ZV9tbWFwX2xvY2sgPSB0cnVlO1xcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSghaGF2ZV9tbWFwX2xvY2spKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0cGFnZSA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHJldCA9IGFjdGlvbih2bWEsIHBhZ2UsIGFkZHIsIFxcdTAwMjZidWYsIGxlbiwgd3JpdGUpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2M9IDApIHtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdCplcnIgPSByZXQ7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGxlbiAtPSBieXRlcztcXG4tXFx0XFx0YnVmICs9IGJ5dGVzO1xcbi1cXHRcXHRhZGRyICs9IGJ5dGVzO1xcbitcXHRcXHRhZGRyICs9IHJldDtcXG4rXFx0XFx0bGVuIC09IHJldDtcXG4gXFx0fVxcbi1cXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG4rXFxuK1xcdHJlbW90ZV9hY2Nlc3NfdW5sb2NrKG1tLCB2bWEsIGhhdmVfbW1hcF9sb2NrKTtcXG4gXFxuIFxcdHJldHVybiBidWYgLSBvbGRfYnVmO1xcbiB9XFxuIFxcbisvKlxcbisgKiBDb3B5IG9uZSBwYWdlJ3Mgd29ydGggb2YgW0BhZGRyLCBAYWRkciArIEBsZW4pIHRvIG9yIGZyb20gKkBidWYuIFJlYWNoZXNcXG4rICogc3RydWN0LXBhZ2UtbGVzcyBWTV9JTyAvIFZNX1BGTk1BUCBtZW1vcnkgdGhyb3VnaCB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKCkuXFxuKyAqL1xcbitzdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4rXFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKipidWYsIGludCBsZW4sIGludCB3cml0ZSlcXG4re1xcbitcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbitcXHRpbnQgYnl0ZXMsIG9mZnNldDtcXG4rXFx0dm9pZCAqbWFkZHI7XFxuK1xcbitcXHRpZiAoIXBhZ2UpIHtcXG4rXFx0XFx0Ynl0ZXMgPSBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHModm1hLCBhZGRyLCAqYnVmLCBsZW4sIHdyaXRlKTtcXG4rXFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2UgMClcXG4rXFx0XFx0XFx0KmJ1ZiArPSBieXRlcztcXG4rXFx0XFx0cmV0dXJuIGJ5dGVzO1xcbitcXHR9XFxuK1xcbitcXHRieXRlcyA9IGxlbjtcXG4rXFx0b2Zmc2V0ID0gYWRkciBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0aWYgKGJ5dGVzIFxcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxcbitcXHRcXHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcXG4rXFxuK1xcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4rXFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xcbitcXHRpZiAod3JpdGUpIHtcXG4rXFx0XFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLCBtYWRkciArIG9mZnNldCwgKmJ1ZiwgYnl0ZXMpO1xcbitcXHRcXHRmb2xpb19tYXJrX2RpcnR5X2xvY2soZm9saW8pO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgKmJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcXG4rXFx0fVxcbitcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4rXFxuK1xcdCpidWYgKz0gYnl0ZXM7XFxuK1xcdHJldHVybiBieXRlcztcXG4rfVxcbitcXG4rLypcXG4rICogQWNjZXNzIGFub3RoZXIgcHJvY2VzcycgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cXG4rICovXFxuK3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuK1xcdFxcdFxcdCAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4re1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0cmV0dXJuIHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCB0cnVlLFxcbitcXHRcXHRcXHQgICAgICBhY2Nlc3Nfdm1fcGFnZSwgXFx1MDAyNmVycik7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBhY2Nlc3NfcmVtb3RlX3ZtIC0gYWNjZXNzIGFub3RoZXIgcHJvY2VzcycgYWRkcmVzcyBzcGFjZVxcbiAgKiBAbW06XFx0XFx0dGhlIG1tX3N0cnVjdCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3Mgc3BhY2VcXG5AQCAtNzEzOCw4NCArNzI5Niw2NyBAQCBFWFBPUlRfU1lNQk9MX0dQTChhY2Nlc3NfcHJvY2Vzc192bSk7XFxuIFxcbiAjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxuIC8qXFxuLSAqIENvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MncyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLlxcbi0gKiBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgcmV0dXJuIC1FRkFVTFQuXFxuKyAqIENvcHkgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSBAYWRkciBpbnRvICpAYnVmLCB1cCB0byBAbGVuIGJ5dGVzLFxcbisgKiBzdG9wcGluZyBhdCB0aGUgTlVMLiBzdHJzY3B5KCkgYWx3YXlzIE5VTCB0ZXJtaW5hdGVzLCBzbyByZWNvcHkgdGhlIGxhc3RcXG4rICogYnl0ZSBvZiBhIHBhZ2Ugd2hlbiBtb3JlIHBhZ2VzIGZvbGxvdy4gQSBzdHJpbmcgaXMgbmV2ZXIgcmVhZCBmcm9tXFxuKyAqIHN0cnVjdC1wYWdlLWxlc3MgVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5LlxcbiAgKi9cXG4tc3RhdGljIGludCBfX2NvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi1cXHRcXHRcXHRcXHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXFxuK3N0YXRpYyBpbnQgY29weV92bV9zdHIoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxcbitcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpXFxuIHtcXG4tXFx0dm9pZCAqb2xkX2J1ZiA9IGJ1ZjtcXG4tXFx0aW50IGVyciA9IDA7XFxuLVxcbi1cXHQqKGNoYXIgKilidWYgPSAnXFxcXDAnO1xcbitcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbitcXHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xcbitcXHR2b2lkICptYWRkcjtcXG4gXFxuLVxcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpXFxuK1xcdGlmICghcGFnZSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcbi1cXHRhZGRyID0gdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpO1xcbitcXHRieXRlcyA9IGxlbjtcXG4rXFx0b2Zmc2V0ID0gYWRkciBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0aWYgKGJ5dGVzIFxcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxcbitcXHRcXHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcXG4gXFxuLVxcdC8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi9cXG4tXFx0aWYgKCF2bWFfbG9va3VwKG1tLCBhZGRyKSkge1xcbi1cXHRcXHRlcnIgPSAtRUZBVUxUO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbitcXHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XFxuK1xcdHJldHZhbCA9IHN0cnNjcHkoKmJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcXG4rXFx0aWYgKHJldHZhbCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdC8qIEZvdW5kIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi9cXG4rXFx0XFx0KmJ1ZiArPSByZXR2YWw7XFxuK1xcdFxcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0fVxcbiBcXG4tXFx0d2hpbGUgKGxlbikge1xcbi1cXHRcXHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xcbi1cXHRcXHR2b2lkICptYWRkcjtcXG4tXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4tXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuLVxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcXG4rXFx0KmJ1ZiArPSBieXRlcyAtIDE7XFxuK1xcdGlmIChieXRlcyAhPSBsZW4pIHtcXG4rXFx0XFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIgKyBieXRlcyAtIDEsICpidWYsXFxuK1xcdFxcdFxcdFxcdCAgICBtYWRkciArIChQQUdFX1NJWkUgLSAxKSwgMSk7XFxuK1xcdFxcdCpidWYgKz0gMTtcXG4rXFx0fVxcbitcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4gXFxuLVxcdFxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsIGd1cF9mbGFncywgXFx1MDAyNnZtYSk7XFxuLVxcdFxcdGlmIChJU19FUlIocGFnZSkpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogVHJlYXQgYXMgYSB0b3RhbCBmYWlsdXJlIGZvciBub3cgdW50aWwgd2UgZGVjaWRlIGhvd1xcbi1cXHRcXHRcXHQgKiB0byBoYW5kbGUgdGhlIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBjYXNlIGFuZFxcbi1cXHRcXHRcXHQgKiBzdGFjayBleHBhbnNpb24uXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHQqKGNoYXIgKilidWYgPSAnXFxcXDAnO1xcbi1cXHRcXHRcXHRlcnIgPSAtRUZBVUxUO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbitcXHRyZXR1cm4gYnl0ZXM7XFxuK31cXG4gXFxuLVxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFx0XFx0Ynl0ZXMgPSBsZW47XFxuLVxcdFxcdG9mZnNldCA9IGFkZHIgXFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XFxuLVxcdFxcdGlmIChieXRlcyBcXHUwMDNlIFBBR0VfU0laRSAtIG9mZnNldClcXG4tXFx0XFx0XFx0Ynl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XFxuLVxcbi1cXHRcXHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XFxuLVxcdFxcdHJldHZhbCA9IHN0cnNjcHkoYnVmLCBtYWRkciArIG9mZnNldCwgYnl0ZXMpO1xcbi1cXHRcXHRpZiAocmV0dmFsIFxcdTAwM2U9IDApIHtcXG4tXFx0XFx0XFx0LyogRm91bmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovXFxuLVxcdFxcdFxcdGJ1ZiArPSByZXR2YWw7XFxuLVxcdFxcdFxcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0fVxcbisvKlxcbisgKiBDb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZSBhcyBnaXZlbiBpbiBtbS5cXG4rICogSWYgdGhlcmUgaXMgYW55IGVycm9yIHJldHVybiAtRUZBVUxULlxcbisgKi9cXG4rc3RhdGljIGludCBfX2NvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHRcXHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXFxuK3tcXG4rXFx0aW50IGJ5dGVzLCBlcnI7XFxuIFxcbi1cXHRcXHRidWYgKz0gYnl0ZXMgLSAxO1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBCZWNhdXNlIHN0cnNjcHkgYWx3YXlzIE5VTCB0ZXJtaW5hdGVzIHdlIG5lZWQgdG9cXG4tXFx0XFx0ICogY29weSB0aGUgbGFzdCBieXRlIGluIHRoZSBwYWdlIGlmIHdlIGFyZSBnb2luZyB0b1xcbi1cXHRcXHQgKiBsb2FkIG1vcmUgcGFnZXNcXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChieXRlcyAhPSBsZW4pIHtcXG4tXFx0XFx0XFx0YWRkciArPSBieXRlcyAtIDE7XFxuLVxcdFxcdFxcdGNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLCBidWYsIG1hZGRyICsgKFBBR0VfU0laRSAtIDEpLCAxKTtcXG4tXFx0XFx0XFx0YnVmICs9IDE7XFxuLVxcdFxcdFxcdGFkZHIgKz0gMTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRsZW4gLT0gYnl0ZXM7XFxuK1xcdCooY2hhciAqKWJ1ZiA9ICdcXFxcMCc7XFxuIFxcbi1cXHRcXHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcXG4rXFx0Ynl0ZXMgPSByZW1vdGVfdm1fd2FsayhtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncywgZmFsc2UsXFxuK1xcdFxcdFxcdCAgICAgICBjb3B5X3ZtX3N0ciwgXFx1MDAyNmVycik7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0LyogVGhlIGNvbnRyYWN0IGd1YXJhbnRlZXMgYSB0ZXJtaW5hdGVkIGJ1ZmZlciBldmVuIG9uIGVycm9yLiAqL1xcbitcXHRcXHQoKGNoYXIgKilidWYpW2J5dGVzXSA9ICdcXFxcMCc7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG4gXFxuLW91dDpcXG4tXFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuLVxcdGlmIChlcnIpXFxuLVxcdFxcdHJldHVybiBlcnI7XFxuLVxcdHJldHVybiBidWYgLSBvbGRfYnVmO1xcbitcXHRyZXR1cm4gYnl0ZXM7XFxuIH1cXG4gXFxuIC8qKlxcbmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmNcXG5pbmRleCAxYzc3ZDVkYzA2ZTlmYS4uYjM2ZjJlMjE5YjhmNDkgMTAwNjQ0XFxuLS0tIGEvbW0vcm1hcC5jXFxuKysrIGIvbW0vcm1hcC5jXFxuQEAgLTI4MzgsNyArMjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gXFx0ICogKG5vbi1kZXZpY2UtZXhjbHVzaXZlKSBQVEUgYW5kIGlzc3VlIGEgTU1VX05PVElGWV9FWENMVVNJVkUuXFxuIFxcdCAqL1xcbiByZXRyeTpcXG4tXFx0cGFnZSA9IGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZShtbSwgYWRkcixcXG4rXFx0cGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkcixcXG4gXFx0XFx0XFx0XFx0XFx0Rk9MTF9HRVQgfCBGT0xMX1dSSVRFIHwgRk9MTF9TUExJVF9QTUQsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZ2bWEpO1xcbiBcXHRpZiAoSVNfRVJSKHBhZ2UpKVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuaW5kZXggZTZkZjk2OGYwOTcxYzguLjZiOTE3YTRmNzNlMDBmIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG5AQCAtODMsNiArODMsNyBAQCBURVNUX0dFTl9GSUxFUyArPSBtcmVsZWFzZV90ZXN0XFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1yZW1hcF9kb250dW5tYXBcXG4gVEVTVF9HRU5fRklMRVMgKz0gbXJlbWFwX3Rlc3RcXG4gVEVTVF9HRU5fRklMRVMgKz0gbXNlYWxfdGVzdFxcbitURVNUX0dFTl9GSUxFUyArPSBtdGhwX2d1cF9jb3dfdGVzdFxcbiBURVNUX0dFTl9GSUxFUyArPSBvbi1mYXVsdC1saW1pdFxcbiBURVNUX0dFTl9GSUxFUyArPSBwYWdlbWFwX2lvY3RsXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHBmbm1hcFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbXRocF9ndXBfY293X3Rlc3QuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUyZWUzMjlkODY0MWMwXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmNcXG5AQCAtMCwwICsxLDIxMyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKy8qXFxuKyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtXFx1MDAzZSBmb2xsb3dfcGFnZV9tYXNrIC1cXHUwMDNlXFxuKyAqIGZvbGxvd19wdGVfYmF0Y2gpIHJldHVybnMgdGhlIGNvcnJlY3QgcGFnZXMgZm9yIGEgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb1xcbisgKiAobVRIUCksIGluY2x1ZGluZyB0aGF0IENPVyBjb3BpZXMgcHJvZHVjZSB0aGUgcmlnaHQgY29udGVudC5cXG4rICpcXG4rICogVXNlcyB0aGUgQ09ORklHX0dVUF9URVNUIFBJTl9MT05HVEVSTSBpbnRlcmZhY2U6IFNUQVJUIHBpbnMgYSByYW5nZSBvbiB0aGVcXG4rICogc2xvdyBwYXRoLCBSRUFEIGNvcGllcyB0aGUgcGlubmVkIHBhZ2VzJyBieXRlcyBiYWNrIHNvIHdlIGNhbiBjb21wYXJlIHRoZW1cXG4rICogYWdhaW5zdCB0aGUgcGF0dGVybiB3ZSB3cm90ZS5cXG4rICovXFxuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW50LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIEFSUkFZX1NJWkUoYSlcXHQoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpXFxuK1xcbisjZGVmaW5lIEdVUF9ERVYgXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0XFxcIlxcbitcXG4rI2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVFxcdF9JT1coJ2cnLCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXFxuKyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RPUFxcdF9JTygnZycsIDgpXFxuKyNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfUkVBRFxcdF9JT1coJ2cnLCA5LCBfX3U2NClcXG4rI2RlZmluZSBVU0VfV1JJVEVcXHQxXFxuKyNkZWZpbmUgVVNFX0ZBU1RcXHQyXFxuK1xcbitzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3Qge1xcbitcXHRfX3U2NCBhZGRyO1xcbitcXHRfX3U2NCBzaXplO1xcbitcXHRfX3UzMiBmbGFncztcXG4rfTtcXG4rXFxuKyNkZWZpbmUgT1JERVJfS0JcXHQ2NFxcbisjZGVmaW5lIE5SX0ZPTElPU1xcdDE2XFxuKyNkZWZpbmUgUkVHSU9OXFx0XFx0KChzaXplX3QpT1JERVJfS0IgKiAxMDI0ICogTlJfRk9MSU9TKVxcbitcXG4rc3RhdGljIGxvbmcgUFM7XFxuK3N0YXRpYyBpbnQgZmFpbHM7XFxuK3N0YXRpYyBpbnQgdGFwO1xcbitcXG4rc3RhdGljIHZvaWQgb2soaW50IGNvbmQsIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0cHJpbnRmKFxcXCIlcyAlZCAlc1xcXFxuXFxcIiwgY29uZCA/IFxcXCJva1xcXCIgOiBcXFwibm90IG9rXFxcIiwgKyt0YXAsIGRlc2MpO1xcbitcXHRpZiAoIWNvbmQpXFxuK1xcdFxcdGZhaWxzKys7XFxuK31cXG4rXFxuKy8qIERldGVybWluaXN0aWMsIHBlci1wYWdlLWRpc3RpbmN0IHBhdHRlcm4gc28gYW55IG1pcy1vcmRlciBvciBsZWFrIHNob3dzLiAqL1xcbitzdGF0aWMgdm9pZCBmaWxsKGNoYXIgKmJhc2UsIHNpemVfdCBzeiwgdWludDMyX3Qgc2FsdClcXG4re1xcbitcXHRmb3IgKHNpemVfdCBvZmYgPSAwOyBvZmYgXFx1MDAzYyBzejsgb2ZmICs9IFBTKSB7XFxuK1xcdFxcdHVpbnQzMl90IGsgPSBvZmYgLyBQUztcXG4rXFx0XFx0dWludDY0X3QgdiA9ICgodWludDY0X3Qpc2FsdCBcXHUwMDNjXFx1MDAzYyAzMikgXiAoayAqIDB4OUUzNzc5QjF1ICsgMHgxMjM0KTtcXG4rXFxuK1xcdFxcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFxcdTAwM2MgUFM7IGkgKz0gc2l6ZW9mKHYpKVxcbitcXHRcXHRcXHRtZW1jcHkoYmFzZSArIG9mZiArIGksIFxcdTAwMjZ2LCBzaXplb2YodikpO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3N5c2ZzKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnZhbClcXG4re1xcbitcXHRpbnQgZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0aW50IHIgPSB3cml0ZShmZCwgdmFsLCBzdHJsZW4odmFsKSk7XFxuK1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByIFxcdTAwM2MgMCA/IC0xIDogMDtcXG4rfVxcbitcXG4rLyogRm9yY2Ugc3ViLVBNRCA2NGtCIG1USFAgb25seSwgc28gZmF1bHRzIHByb2R1Y2UgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MuICovXFxuK3N0YXRpYyB2b2lkIHNldHVwX210aHAodm9pZClcXG4re1xcbitcXHRjb25zdCBjaGFyICp0aHAgPSBcXFwiL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2VcXFwiO1xcbitcXHRjaGFyIHBbMjU2XTtcXG4rXFx0c3RhdGljIGNvbnN0IGludCBrYltdID0geyAxNiwgMzIsIDY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4IH07XFxuK1xcbitcXHR3c3lzZnMoXFxcIi9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcXFwiLCBcXFwibmV2ZXJcXFwiKTtcXG4rXFx0Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGtiKTsgaSsrKSB7XFxuK1xcdFxcdHNucHJpbnRmKHAsIHNpemVvZihwKSwgXFxcIiVzL2h1Z2VwYWdlcy0lZGtCL2VuYWJsZWRcXFwiLCB0aHAsIGtiW2ldKTtcXG4rXFx0XFx0d3N5c2ZzKHAsIGtiW2ldID09IE9SREVSX0tCID8gXFxcImFsd2F5c1xcXCIgOiBcXFwibmV2ZXJcXFwiKTtcXG4rXFx0fVxcbit9XFxuK1xcbisvKiBDb3VudCBob3cgbWFueSBwYWdlcyBzaXQgaW4gYSBjb250aWd1b3VzIFxcdTAwM2U9T1JERVJfS0IgUEZOIHJ1biAodmlhIHBhZ2VtYXApLiAqL1xcbitzdGF0aWMgaW50IGNvdW50X2xhcmdlX3BhZ2VzKGNoYXIgKmJhc2UsIHNpemVfdCBzeilcXG4re1xcbitcXHRpbnQgcG0gPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdHNpemVfdCBuID0gc3ogLyBQUywgbGFyZ2UgPSAwO1xcbitcXHR1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7XFxuK1xcbitcXHRpZiAocG0gXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGZvciAoc2l6ZV90IGsgPSAwOyBrIFxcdTAwM2MgbjsgaysrKSB7XFxuK1xcdFxcdHVpbnQ2NF90IGVudDtcXG4rXFx0XFx0b2ZmX3QgaWR4ID0gKCh1aW50cHRyX3QpYmFzZSArIGsgKiBQUykgLyBQUyAqIHNpemVvZihlbnQpO1xcbitcXG4rXFx0XFx0aWYgKHByZWFkKHBtLCBcXHUwMDI2ZW50LCBzaXplb2YoZW50KSwgaWR4KSAhPSBzaXplb2YoZW50KSB8fFxcbitcXHRcXHQgICAgIShlbnQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyA2MykpKVxcbitcXHRcXHRcXHRwZm5ba10gPSAwO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdHBmbltrXSA9IGVudCBcXHUwMDI2ICgoMVVMTCBcXHUwMDNjXFx1MDAzYyA1NSkgLSAxKTtcXG4rXFx0fVxcbitcXHRjbG9zZShwbSk7XFxuK1xcdGZvciAoc2l6ZV90IGsgPSAwOyBrIFxcdTAwM2MgbjsgaysrKVxcbitcXHRcXHRpZiAoayArIDEgXFx1MDAzYyBuIFxcdTAwMjZcXHUwMDI2IHBmbltrXSBcXHUwMDI2XFx1MDAyNiBwZm5bayArIDFdID09IHBmbltrXSArIDEpXFxuK1xcdFxcdFxcdGxhcmdlKys7XFxuK1xcdGZyZWUocGZuKTtcXG4rXFx0cmV0dXJuIGxhcmdlO1xcbit9XFxuK1xcbisvKiBQaW4gQGJhc2UuLkBzeiBvbiB0aGUgc2xvdyBwYXRoLCByZWFkIHRoZSBwaW5uZWQgYnl0ZXMgYmFjaywgY29tcGFyZSB0byBleHAuICovXFxuK3N0YXRpYyBpbnQgcGluX3ZlcmlmeShpbnQgZmQsIGNoYXIgKmJhc2UsIHNpemVfdCBzeiwgdWludDMyX3Qgd3IsIGNoYXIgKmV4cClcXG4re1xcbitcXHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QgYSA9IHtcXG4rXFx0XFx0LmFkZHIgPSAodWludHB0cl90KWJhc2UsIC5zaXplID0gc3osXFxuK1xcdFxcdC5mbGFncyA9IHdyID8gVVNFX1dSSVRFIDogMCxcXHRcXHQvKiBVU0VfRkFTVCB1bnNldCA9XFx1MDAzZSBzbG93ICovXFxuK1xcdH07XFxuK1xcdGNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdFxcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcXG4rXFx0X191NjQgZ2EgPSAodWludHB0cl90KWdvdDtcXG4rXFx0aW50IHJjID0gLTE7XFxuK1xcbitcXHRpZiAoZ290ID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVCwgXFx1MDAyNmEpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiU1RBUlQoJXMpIGZhaWxlZDogJXNcXFxcblxcXCIsXFxuK1xcdFxcdFxcdHdyID8gXFxcIndyaXRlXFxcIiA6IFxcXCJyZWFkXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9SRUFELCBcXHUwMDI2Z2EpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiUkVBRCBmYWlsZWQ6ICVzXFxcXG5cXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QKTtcXG4rXFx0cmMgPSBtZW1jbXAoZ290LCBleHAsIHN6KSA/IDEgOiAwO1xcbitvdXQ6XFxuK1xcdG11bm1hcChnb3QsIHN6KTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitpbnQgbWFpbih2b2lkKVxcbit7XFxuK1xcdFBTID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRzZXR1cF9tdGhwKCk7XFxuK1xcbitcXHRpbnQgZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7XFxuK1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwib3BlbiAlczogJXMgKENPTkZJR19HVVBfVEVTVD8pXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRHVVBfREVWLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRyZXR1cm4gMjtcXG4rXFx0fVxcbitcXG4rXFx0Y2hhciAqciA9IG1tYXAoTlVMTCwgUkVHSU9OLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHQgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7XFxuK1xcdGlmIChyID09IE1BUF9GQUlMRUQpIHtcXG4rXFx0XFx0cGVycm9yKFxcXCJtbWFwXFxcIik7XFxuK1xcdFxcdHJldHVybiAyO1xcbitcXHR9XFxuK1xcdGZpbGwociwgUkVHSU9OLCAweEExKTtcXHRcXHRcXHRcXHQvKiBwYXR0ZXJuIFAgKi9cXG4rXFx0Y2hhciAqZXhwUCA9IG1hbGxvYyhSRUdJT04pO1xcbitcXG4rXFx0bWVtY3B5KGV4cFAsIHIsIFJFR0lPTik7XFxuK1xcbitcXHRpbnQgbGFyZ2UgPSBjb3VudF9sYXJnZV9wYWdlcyhyLCBSRUdJT04pO1xcbitcXG4rXFx0cHJpbnRmKFxcXCIjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcXFxcblxcXCIsXFxuK1xcdCAgICAgICBsYXJnZSwgUkVHSU9OIC8gUFMpO1xcbitcXHRpZiAobGFyZ2UgXFx1MDAzYyAoaW50KShSRUdJT04gLyBQUykgLyA0KVxcbitcXHRcXHRwcmludGYoXFxcIiMgV0FSTjogbGl0dGxlIG1USFAgYmFja2luZzsgYmF0Y2ggcGF0aCBsaWdodGx5IGNvdmVyZWRcXFxcblxcXCIpO1xcbitcXG4rXFx0LyogQTogcmVhZCBwaW4gb3ZlciB3cml0YWJsZSBtVEhQIC1cXHUwMDNlIGJhdGNoZXMgLVxcdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXFxuK1xcdG9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMCwgZXhwUCkgPT0gMCxcXG4rXFx0ICAgXFxcInNsb3cgcmVhZC1waW4gb2YgbVRIUCByZXR1cm5zIGNvcnJlY3QgY29udGVudHNcXFwiKTtcXG4rXFxuK1xcdC8qIEI6IHdyaXRlIHBpbiAtXFx1MDAzZSBGT0xMX1dSSVRFIGJhdGNoIHBhdGggLVxcdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXFxuK1xcdG9rKHBpbl92ZXJpZnkoZmQsIHIsIFJFR0lPTiwgMSwgZXhwUCkgPT0gMCxcXG4rXFx0ICAgXFxcInNsb3cgd3JpdGUtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzXFxcIik7XFxuK1xcbitcXHQvKiBDOiBDT1cgaXNvbGF0aW9uLiBDaGlsZCB3cml0ZS1waW5zICh1bnNoYXJlcykgdGhlbiByZXdyaXRlczsgcGFyZW50IFAuICovXFxuK1xcdHBpZF90IHBpZCA9IGZvcmsoKTtcXG4rXFxuK1xcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRpbnQgY2ZkID0gb3BlbihHVVBfREVWLCBPX1JEV1IpO1xcbitcXHRcXHRpbnQgYSA9IHBpbl92ZXJpZnkoY2ZkLCByLCBSRUdJT04sIDEsIGV4cFApO1xcdC8qIENPVyBjb3B5ID09IFAgKi9cXG4rXFxuK1xcdFxcdGZpbGwociwgUkVHSU9OLCAweEIyKTtcXHRcXHRcXHQvKiBjaGlsZCB3cml0ZXMgUSAqL1xcbitcXHRcXHRfZXhpdChhID09IDAgPyAwIDogMSk7XFxuK1xcdH1cXG4rXFx0aW50IHN0ID0gMDtcXG4rXFxuK1xcdHdhaXRwaWQocGlkLCBcXHUwMDI2c3QsIDApO1xcbitcXHRvayhXSUZFWElURUQoc3QpIFxcdTAwMjZcXHUwMDI2IFdFWElUU1RBVFVTKHN0KSA9PSAwLFxcbitcXHQgICBcXFwiY2hpbGQgd3JpdGUtcGluIGFmdGVyIENPVyByZXR1cm5zIGNvcnJlY3QgKGNvcGllZCkgY29udGVudHNcXFwiKTtcXG4rXFx0b2sobWVtY21wKHIsIGV4cFAsIFJFR0lPTikgPT0gMCxcXG4rXFx0ICAgXFxcInBhcmVudCBjb250ZW50cyBpbnRhY3QgYWZ0ZXIgY2hpbGQgQ09XIHdyaXRlc1xcXCIpO1xcbitcXHQvKiBEOiBwYXJlbnQgcmVhZC1waW4gYWdhaW4gYWZ0ZXIgdGhlIENPVyBzcGxpdCBzdGlsbCBjb3JyZWN0LiAqL1xcbitcXHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDAsIGV4cFApID09IDAsXFxuK1xcdCAgIFxcXCJwYXJlbnQgc2xvdyByZWFkLXBpbiBhZnRlciBDT1cgc3RpbGwgY29ycmVjdFxcXCIpO1xcbitcXG4rXFx0cHJpbnRmKFxcXCIjIHRvdGFsczogcGFzczolZCBmYWlsOiVkXFxcXG5cXFwiLCB0YXAgLSBmYWlscywgZmFpbHMpO1xcbitcXHRyZXR1cm4gZmFpbHMgPyAxIDogMDtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXFxuaW5kZXggNGY1NTA4MjIzODVhMjAuLjZmZjVkMTAyOTUxN2UzIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmNcXG5AQCAtMzEsNiArMzEsNyBAQCBzdGF0aWMgc2lnam1wX2J1ZiBzaWdqbXBfYnVmX2VudjtcXG4gc3RhdGljIGNoYXIgKmZpbGUgPSBcXFwiL2Rldi9tZW1cXFwiO1xcbiBzdGF0aWMgb2ZmX3QgZmlsZV9vZmZzZXQ7XFxuIHN0YXRpYyBpbnQgZmQ7XFxuK3N0YXRpYyBpbnQgdGFyZ2V0X2lzX3JhbTtcXG4gXFxuIHN0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpXFxuIHtcXG5AQCAtMTEzLDYgKzExNCw3IEBAIHN0YXRpYyB2b2lkIHBmbm1hcF9pbml0KHZvaWQpXFxuIFxcdFxcdGlmIChlcnIpXFxuIFxcdFxcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJDYW5ub3QgZmluZCByYW0gdGFyZ2V0IGluICcvcHJvYy9pb21lbSc6ICVzXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRcXHQgICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHR0YXJnZXRfaXNfcmFtID0gMTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0ZmlsZV9vZmZzZXQgPSAwO1xcbiBcXHR9XFxuQEAgLTI3MSw2ICsyNzMsNzAgQEAgVEVTVF9GKHBmbm1hcCwgZm9yaylcXG4gXFx0QVNTRVJUX0VRKHJldCwgMCk7XFxuIH1cXG4gXFxuK1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpXFxuK3tcXG4rXFx0Y2hhciAqcHJpdiwgKmJ1ZjtcXG4rXFx0c3NpemVfdCByYztcXG4rXFx0aW50IG1lbV9mZDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgQ09XZWQgcGFnZSBpbiBhIFZNX1BGTk1BUCBtYXBwaW5nIGhhcyBhIHN0cnVjdCBwYWdlLCBzbyByZWFkaW5nIGl0XFxuK1xcdCAqIHRocm91Z2ggL3Byb2Mvc2VsZi9tZW0gLS0gX19hY2Nlc3NfcmVtb3RlX3ZtKCkgLVxcdTAwM2UgZ2V0X3VzZXJfcGFnZV92bWEoKVxcbitcXHQgKiAtLSByZXR1cm5zIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIG9mIHJvdXRpbmcgdG8gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWFjY2VzcygpLFxcbitcXHQgKiB3aGljaCBpb3JlbWFwcyB0aGUgUEZOIGFuZCBjYW5ub3QgcmVhY2ggYSBDT1dlZCBSQU0gcGFnZS5cXG4rXFx0ICpcXG4rXFx0ICogTWFwIHRoZSBmaWxlIE1BUF9QUklWQVRFIGFuZCB3cml0YWJsZSwgd3JpdGUgdG8gQ09XIGEgcGFnZSBpbnRvIGFub25cXG4rXFx0ICogbWVtb3J5LCB0aGVuIHJlYWQgdGhlIHBhZ2UgYmFjayB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtLlxcbitcXHQgKi9cXG4rXFx0c2VsZi1cXHUwMDNlc2l6ZTIgPSBzZWxmLVxcdTAwM2VwYWdlc2l6ZTtcXG4rXFx0c2VsZi1cXHUwMDNlYWRkcjIgPSBtbWFwKE5VTEwsIHNlbGYtXFx1MDAzZXNpemUyLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHRcXHQgICBNQVBfUFJJVkFURSwgZmQsIGZpbGVfb2Zmc2V0KTtcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZWFkZHIyID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiQ2Fubm90IGNyZWF0ZSBhIHdyaXRhYmxlIHByaXZhdGUgcGZubWFwIG1hcHBpbmdcXFwiKTtcXG4rXFx0cHJpdiA9IHNlbGYtXFx1MDAzZWFkZHIyO1xcbitcXG4rXFx0LyogQ09XIHRoZSBwYWdlIGFuZCBzdGFtcCBrbm93biBieXRlcyBpbnRvIHRoZSBhbm9uIGNvcHkuICovXFxuK1xcdHByaXZbMF0gPSAweDQyO1xcbitcXHRwcml2W3NlbGYtXFx1MDAzZXBhZ2VzaXplIC0gMV0gPSAweDI0O1xcbitcXG4rXFx0YnVmID0gbWFsbG9jKHNlbGYtXFx1MDAzZXBhZ2VzaXplKTtcXG4rXFx0QVNTRVJUX05FKGJ1ZiwgTlVMTCk7XFxuK1xcbitcXHRtZW1fZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL21lbVxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0QVNTRVJUX0dFKG1lbV9mZCwgMCk7XFxuK1xcdHJjID0gcHJlYWQobWVtX2ZkLCBidWYsIHNlbGYtXFx1MDAzZXBhZ2VzaXplLCAob2ZmX3QpKHVpbnRwdHJfdClwcml2KTtcXG4rXFx0Y2xvc2UobWVtX2ZkKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShyYywgKHNzaXplX3Qpc2VsZi1cXHUwMDNlcGFnZXNpemUpO1xcbitcXHRFWFBFQ1RfRVEoYnVmWzBdLCAweDQyKTtcXG4rXFx0RVhQRUNUX0VRKGJ1ZltzZWxmLVxcdTAwM2VwYWdlc2l6ZSAtIDFdLCAweDI0KTtcXG4rXFxuK1xcdGZyZWUoYnVmKTtcXG4rfVxcbitcXG4rVEVTVF9GKHBmbm1hcCwgcHJvY21lbV9wZm5fcmVhZClcXG4re1xcbitcXHRjaGFyIGJ1Zls2NF07XFxuK1xcdHNzaXplX3QgcmM7XFxuK1xcdGludCBtZW1fZmQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgbWFwcGluZyBoYXMgbm8gc3RydWN0IHBhZ2UsIHNvXFxuK1xcdCAqIF9fYWNjZXNzX3JlbW90ZV92bSgpIHJlYWNoZXMgaXQgdGhyb3VnaCB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlYWNjZXNzKClcXG4rXFx0ICogKGdlbmVyaWNfYWNjZXNzX3BoeXMoKSkuIFRoYXQgaW9yZW1hcHMgdGhlIFBGTiwgd2hpY2ggaXMgcmVqZWN0ZWQgZm9yXFxuK1xcdCAqIFJBTSwgc28gdGhpcyBvbmx5IGFwcGxpZXMgdG8gZ2VudWluZSBkZXZpY2UgbWVtb3J5LlxcbitcXHQgKi9cXG4rXFx0aWYgKHRhcmdldF9pc19yYW0pXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiVGFyZ2V0IGlzIFN5c3RlbSBSQU07IC1cXHUwMDNlYWNjZXNzKCkgY2Fubm90IGlvcmVtYXAgUkFNXFxcIik7XFxuK1xcbitcXHRtZW1fZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL21lbVxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0QVNTRVJUX0dFKG1lbV9mZCwgMCk7XFxuK1xcdHJjID0gcHJlYWQobWVtX2ZkLCBidWYsIHNpemVvZihidWYpLCAob2ZmX3QpKHVpbnRwdHJfdClzZWxmLVxcdTAwM2VhZGRyMSk7XFxuK1xcdGNsb3NlKG1lbV9mZCk7XFxuK1xcbitcXHRBU1NFUlRfRVEocmMsIChzc2l6ZV90KXNpemVvZihidWYpKTtcXG4rfVxcbitcXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuIFxcdGZvciAoaW50IGkgPSAxOyBpIFxcdTAwM2MgYXJnYzsgaSsrKSB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5pbmRleCA4YzI5NmRlZGYwNDc0ZC4uYjQ5YTNlYjBjMjA1MDggMTAwNzU1XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbkBAIC0yODksNiArMjg5LDcgQEAgZmlcXG4gIyBEdW1wIHBhZ2VzIDAsIDE5LCBhbmQgNDA5NiwgdXNpbmcgcGluX3VzZXJfcGFnZXM6XFxuIENBVEVHT1JZPVxcXCJndXBfdGVzdFxcXCIgcnVuX3Rlc3QgLi9ndXBfdGVzdCAtY3QgLUYgMHgxIDAgMTkgMHgxMDAwXFxuIENBVEVHT1JZPVxcXCJndXBfdGVzdFxcXCIgcnVuX3Rlc3QgLi9ndXBfbG9uZ3Rlcm1cXG4rQ0FURUdPUlk9XFxcImd1cF90ZXN0XFxcIiBydW5fdGVzdCAuL210aHBfZ3VwX2Nvd190ZXN0XFxuIFxcbiBDQVRFR09SWT1cXFwidXNlcmZhdWx0ZmRcXFwiIHJ1bl90ZXN0IC4vdWZmZC11bml0LXRlc3RzXFxuIHVmZmRfc3RyZXNzX2Jpbj0uL3VmZmQtc3RyZXNzXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjExLjY5NDc3MjMwN1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjk2NTIwODQyNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQUREUkVTU19NQVNLSU5HXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZV92bWFcIixcbiAgICBcImdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYVwiLFxuICAgIFwiYWNjZXNzX3JlbW90ZV92bVwiLFxuICAgIFwiYWNjZXNzX3Byb2Nlc3Nfdm1cIixcbiAgICBcImNvcHlfcmVtb3RlX3ZtX3N0clwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjdjMjA5ODdkZTZkOTJkN2VmYzIxYTAwMTg4NWFkMzE4YjYwNTRmZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gSnVsIDI2IDEwOjA3OjA2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9tdGUuY1xuaW5kZXggMWE5YWFkNmVmMjJhMDQuLjdhNmVjYzNkOTI5NDhjIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvbXRlLmNcbisrKyBiL2FyY2gvYXJtNjQva2VybmVsL210ZS5jXG5AQCAtNDU5LDcgKzQ1OSw3IEBAIHN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3RhZ3Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4gXHRcdHVuc2lnbmVkIGxvbmcgdGFncywgb2Zmc2V0O1xuIFx0XHR2b2lkICptYWRkcjtcbi1cdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCBhZGRyLFxuIFx0XHRcdFx0XHRcdFx0ICAgICBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4gXHRcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4gXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oXG5pbmRleCBkYmYyN2E3OGRmNmM4Ny4uM2NlMTY3OTZlNWEyNWQgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaFxuQEAgLTIxLDcgKzIxLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsXG4gXHRcdFx0ICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpXG4ge1xuICNpZmRlZiBDT05GSUdfUklTQ1ZfSVNBX1NVUE1cbi1cdG5leHQtXHUwMDNlY29udGV4dC5wbWxlbiA9IDA7XG4rXHRXUklURV9PTkNFKG5leHQtXHUwMDNlY29udGV4dC5wbWxlbiwgMCk7XG4gI2VuZGlmXG4gXHRzd2l0Y2hfbW0ocHJldiwgbmV4dCwgTlVMTCk7XG4gfVxuQEAgLTQ0LDcgKzQ0LDcgQEAgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKHVzZV9hc2lkX2FsbG9jYXRvcik7XG4gI2RlZmluZSBtbV91bnRhZ19tYXNrIG1tX3VudGFnX21hc2tcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRyZXR1cm4gLTFVTCBcdTAwM2VcdTAwM2UgbW0tXHUwMDNlY29udGV4dC5wbWxlbjtcbitcdHJldHVybiAtMVVMIFx1MDAzZVx1MDAzZSBSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbik7XG4gfVxuICNlbmRpZlxuIFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS91YWNjZXNzLmhcbmluZGV4IDVkNGVjMTU1ODRjZmE0Li41MzgwNmUwZjdkY2ZlMyAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdWFjY2Vzcy5oXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaFxuQEAgLTE2LDcgKzE2LDcgQEBcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bnRhZ2dlZF9hZGRyX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxuIHtcbiBcdGlmIChyaXNjdl9oYXNfZXh0ZW5zaW9uX3VubGlrZWx5KFJJU0NWX0lTQV9FWFRfU1VQTSkpIHtcbi1cdFx0dTggcG1sZW4gPSBtbS1cdTAwM2Vjb250ZXh0LnBtbGVuO1xuK1x0XHR1OCBwbWxlbiA9IFJFQURfT05DRShtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKTtcbiBcbiBcdFx0LyogVmlydHVhbCBhZGRyZXNzZXMgYXJlIHNpZ24tZXh0ZW5kZWQ7IHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUgemVyby1leHRlbmRlZC4gKi9cbiBcdFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX01NVSkpXG5AQCAtMzMsMTIgKzMzLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VudGFnZ2VkX2FkZHJfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lXG4gXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUoY3VycmVudC1cdTAwM2VtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbi0jZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoe1x0XHRcdFx0XHRcXFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpICh7XHRcdFx0XHRcXFxuIFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcdFx0XHRcXFxuLVx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcdFx0XHRcdFx0XHRcdFxcXG4gXHQoX19mb3JjZSBfX3R5cGVvZl9fKGFkZHIpKV9fdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIF9fYWRkcik7XHRcdFxcXG4gfSlcbiBcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKSAoe1x0XHRcdFx0XHRcXFxuK1x0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcdFx0XHRcdFx0XHRcdFxcXG4rXHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XHRcdFx0XHRcXFxuK30pXG4rXG4gI2RlZmluZSBhY2Nlc3Nfb2soYWRkciwgc2l6ZSkgbGlrZWx5KF9fYWNjZXNzX29rKHVudGFnZ2VkX2FkZHIoYWRkciksIHNpemUpKVxuICNlbHNlXG4gI2RlZmluZSB1bnRhZ2dlZF9hZGRyKGFkZHIpIChhZGRyKVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuY1xuaW5kZXggYjJkZjdmNzIyNDFhNWYuLjZhZTc1NTJmZWQwOWYzIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwvcHJvY2Vzcy5jXG4rKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmNcbkBAIC0zNTcsMTMgKzM1NywxNSBAQCBsb25nIHNldF90YWdnZWRfYWRkcl9jdHJsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBhcmcpXG4gXHRpZiAobW1hcF93cml0ZV9sb2NrX2tpbGxhYmxlKG1tKSlcbiBcdFx0cmV0dXJuIC1FSU5UUjtcbiBcbi1cdGlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sIFx1MDAyNm1tLVx1MDAzZWNvbnRleHQuZmxhZ3MpIFx1MDAyNlx1MDAyNiBtbS1cdTAwM2Vjb250ZXh0LnBtbGVuICE9IHBtbGVuKSB7XG4tXHRcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbitcdGlmICh0ZXN0X2JpdChNTV9DT05URVhUX0xPQ0tfUE1MRU4sIFx1MDAyNm1tLVx1MDAzZWNvbnRleHQuZmxhZ3MpKSB7XG4rXHRcdGlmIChSRUFEX09OQ0UobW0tXHUwMDNlY29udGV4dC5wbWxlbikgIT0gcG1sZW4pIHtcbitcdFx0XHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdFx0fVxuIFx0fVxuIFxuIFx0ZW52Y2ZnX3VwZGF0ZV9iaXRzKHRhc2ssIEVOVkNGR19QTU0sIHBtbSk7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnBtbGVuID0gcG1sZW47XG4rXHRXUklURV9PTkNFKG1tLVx1MDAzZWNvbnRleHQucG1sZW4sIHBtbGVuKTtcbiBcbiBcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbiBcbkBAIC0zOTQsNyArMzk2LDcgQEAgbG9uZyBnZXRfdGFnZ2VkX2FkZHJfY3RybChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4gXHRcdGJyZWFrO1xuIFx0fVxuIFxuLVx0aWYgKHRhc2stXHUwMDNlbW0tXHUwMDNlY29udGV4dC5wbWxlbilcbitcdGlmIChSRUFEX09OQ0UodGFzay1cdTAwM2VtbS1cdTAwM2Vjb250ZXh0LnBtbGVuKSlcbiBcdFx0cmV0IHw9IFBSX1RBR0dFRF9BRERSX0VOQUJMRTtcbiBcbiBcdHJldHVybiByZXQ7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbmluZGV4IGVmNWI1MDdkZTM0ZTJlLi5jZWU3MTBmNjQ2NThhYSAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmhcbkBAIC0xMDAsMTggKzEwMCwxOCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fbGFtX2NyM19tYXNrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBkdXBfbGFtKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4gXHRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IG9sZG1tLVx1MDAzZWNvbnRleHQubGFtX2NyM19tYXNrO1xuLVx0bW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrID0gb2xkbW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xuK1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIFJFQURfT05DRShvbGRtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2spKTtcbiB9XG4gXG4gI2RlZmluZSBtbV91bnRhZ19tYXNrIG1tX3VudGFnX21hc2tcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRyZXR1cm4gbW0tXHUwMDNlY29udGV4dC51bnRhZ19tYXNrO1xuK1x0cmV0dXJuIFJFQURfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2spO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgbW1fcmVzZXRfdW50YWdfbWFzayhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4tXHRtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2sgPSAtMVVMO1xuK1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIC0xVUwpO1xuIH1cbiBcbiAjZGVmaW5lIGFyY2hfcGd0YWJsZV9kbWFfY29tcGF0IGFyY2hfcGd0YWJsZV9kbWFfY29tcGF0XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oXG5pbmRleCAyMGRlMzRjYzlhYTZlNy4uYTA5NTE2NWViNjQ4ZWIgMTAwNjQ0XG4tLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmhcbisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaFxuQEAgLTM5LDE4ICszOSwyNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bnRhZ2dlZF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcilcbiBcdChfX2ZvcmNlIF9fdHlwZW9mX18oYWRkcikpX191bnRhZ2dlZF9hZGRyKF9fYWRkcik7XHRcdFxcXG4gfSlcbiBcbisvKlxuKyAqIG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayBjaGFuZ2VzIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IGVuYWJsZXMgTEFNIG9yIGV4ZWNzLFxuKyAqIGFsd2F5cyBzaW5nbGUtdGhyZWFkZWQuIEFuIHVubG9ja2VkIHJlbW90ZSByZWFkZXIgY2FuIHJhY2UgdGhhdDsgUkVBRF9PTkNFXG4rICoga2VlcHMgdGhlIHZhbHVlIHdob2xlIGFuZCB0aGUgdW50YWcgaXMgYmVzdC1lZmZvcnQuXG4rICovXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fdW50YWdnZWRfYWRkcl9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBhZGRyKVxuIHtcbi1cdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XG4tXHRyZXR1cm4gYWRkciBcdTAwMjYgKG1tKS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2s7XG4rXHRyZXR1cm4gYWRkciBcdTAwMjYgUkVBRF9PTkNFKG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayk7XG4gfVxuIFxuLSNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGUobW0sIGFkZHIpXHQoe1x0XHRcdFx0XFxcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlX3VubG9ja2VkKG1tLCBhZGRyKVx0KHtcdFx0XHRcXFxuIFx0dW5zaWduZWQgbG9uZyBfX2FkZHIgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKTtcdFx0XFxcbiBcdChfX2ZvcmNlIF9fdHlwZW9mX18oYWRkcikpX191bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgX19hZGRyKTtcdFxcXG4gfSlcbiBcbisjZGVmaW5lIHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKVx0KHtcdFx0XHRcdFxcXG4rXHRtbWFwX2Fzc2VydF9sb2NrZWQobW0pO1x0XHRcdFx0XHRcdFxcXG4rXHR1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XHRcdFx0XFxcbit9KVxuK1xuICNlbmRpZlxuIFxuICNkZWZpbmUgdmFsaWRfdXNlcl9hZGRyZXNzKHgpIFxcXG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcbmluZGV4IGQ0NGFmYmUwMDViYjUxLi45ZmE2NTkxMTdmMzgyNiAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcbisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmNcbkBAIC04MTQsNyArODE0LDcgQEAgc3RhdGljIHZvaWQgZW5hYmxlX2xhbV9mdW5jKHZvaWQgKl9fbW0pXG4gc3RhdGljIHZvaWQgbW1fZW5hYmxlX2xhbShzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB7XG4gXHRtbS1cdTAwM2Vjb250ZXh0LmxhbV9jcjNfbWFzayA9IFg4Nl9DUjNfTEFNX1U1Nztcbi1cdG1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayA9ICB+R0VOTUFTSyg2MiwgNTcpO1xuK1x0V1JJVEVfT05DRShtbS1cdTAwM2Vjb250ZXh0LnVudGFnX21hc2ssIH5HRU5NQVNLKDYyLCA1NykpO1xuIFxuIFx0LypcbiBcdCAqIEV2ZW4gdGhvdWdoIHRoZSBwcm9jZXNzIG11c3Qgc3RpbGwgYmUgc2luZ2xlLXRocmVhZGVkIGF0IHRoaXNcbkBAIC05NTIsNyArOTUyLDcgQEAgbG9uZyBkb19hcmNoX3ByY3RsXzY0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9wdGlvbiwgdW5zaWduZWQgbG9uZyBhcmcyKVxuICNlbmRpZlxuICNpZmRlZiBDT05GSUdfQUREUkVTU19NQVNLSU5HXG4gXHRjYXNlIEFSQ0hfR0VUX1VOVEFHX01BU0s6XG4tXHRcdHJldHVybiBwdXRfdXNlcih0YXNrLVx1MDAzZW1tLVx1MDAzZWNvbnRleHQudW50YWdfbWFzayxcbitcdFx0cmV0dXJuIHB1dF91c2VyKG1tX3VudGFnX21hc2sodGFzay1cdTAwM2VtbSksXG4gXHRcdFx0XHQodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcyKTtcbiBcdGNhc2UgQVJDSF9FTkFCTEVfVEFHR0VEX0FERFI6XG4gXHRcdHJldHVybiBwcmN0bF9lbmFibGVfdGFnZ2VkX2FkZHIodGFzay1cdTAwM2VtbSwgYXJnMik7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbmluZGV4IDNhZjk3OWZiNDFkMzhkLi4zMjllZmFjMGNmYjM3ZCAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbisrKyBiL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmNcbkBAIC0xMDM2LDcgKzEwMzYsNyBAQCBzdGF0aWMgaW50IGNvcHlfZnJvbV92YWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LFxuIFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcbi1cdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIHZhZGRyLCBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4rXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hKG1tLCB2YWRkciwgZ3VwX2ZsYWdzLCBcdTAwMjZ2bWEpO1xuIFx0aWYgKElTX0VSUihwYWdlKSlcbiBcdFx0cmV0dXJuIFBUUl9FUlIocGFnZSk7XG4gXHR1cHJvYmVfY29weV9mcm9tX3BhZ2UocGFnZSwgdmFkZHIsIGRzdCwgbGVuKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmhcbmluZGV4IDQ4NWRmOWMyZGJkZGIzLi4wZjY2ZDc2ZTZjYTcxOSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbW0uaFxuKysrIGIvaW5jbHVkZS9saW51eC9tbS5oXG5AQCAtMzIzNSwzNSArMzIzNSw5IEBAIGxvbmcgcGluX3VzZXJfcGFnZXNfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdCAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4gXHRcdFx0ICAgaW50ICpsb2NrZWQpO1xuIFxuLS8qXG4tICogUmV0cmlldmVzIGEgc2luZ2xlIHBhZ2UgYWxvbmdzaWRlIGl0cyBWTUEuIERvZXMgbm90IHN1cHBvcnQgRk9MTF9OT1dBSVQuXG4tICovXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLVx0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHRcdFx0ICAgIGludCBndXBfZmxhZ3MsXG4tXHRcdFx0XHRcdFx0ICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApXG4te1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbi1cdGludCBnb3Q7XG4tXG4tXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgRk9MTF9OT1dBSVQpKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4tXG4tXHRnb3QgPSBnZXRfdXNlcl9wYWdlc19yZW1vdGUobW0sIGFkZHIsIDEsIGd1cF9mbGFncywgXHUwMDI2cGFnZSwgTlVMTCk7XG4tXG4tXHRpZiAoZ290IFx1MDAzYyAwKVxuLVx0XHRyZXR1cm4gRVJSX1BUUihnb3QpO1xuLVxuLVx0dm1hID0gdm1hX2xvb2t1cChtbSwgYWRkcik7XG4tXHRpZiAoV0FSTl9PTl9PTkNFKCF2bWEpKSB7XG4tXHRcdHB1dF9wYWdlKHBhZ2UpO1xuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbi1cdH1cbi1cbi1cdCp2bWFwID0gdm1hO1xuLVx0cmV0dXJuIHBhZ2U7XG4tfVxuK3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbitcdFx0XHRcdCAgICAgIGludCBndXBfZmxhZ3MsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKTtcbiBcbiBsb25nIGdldF91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaCBiL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oXG5pbmRleCBlZGRiYmI2NWNjYzRmOC4uN2U2ZTRjODkxODRjZDcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaFxuKysrIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmhcbkBAIC0zNCw2ICszNCwxMyBAQFxuIH0pXG4gI2VuZGlmXG4gXG4rI2lmbmRlZiB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZFxuKyNkZWZpbmUgdW50YWdnZWRfYWRkcl9yZW1vdGVfdW5sb2NrZWQobW0sIGFkZHIpXHQoe1x0XFxcbitcdCh2b2lkKShtbSk7XHRcdFx0XHRcdFxcXG4rXHR1bnRhZ2dlZF9hZGRyKGFkZHIpO1x0XHRcdFx0XFxcbit9KVxuKyNlbmRpZlxuK1xuICNpZmRlZiBtYXNrZWRfdXNlcl9hY2Nlc3NfYmVnaW5cbiAgI2RlZmluZSBjYW5fZG9fbWFza2VkX3VzZXJfYWNjZXNzKCkgMVxuICMgaWZuZGVmIG1hc2tlZF91c2VyX3dyaXRlX2FjY2Vzc19iZWdpblxuZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmNcbmluZGV4IDA2OTIxMTliNzkwNDMxLi40OTEwYzkzYmEwMDNlOCAxMDA2NDRcbi0tLSBhL21tL2d1cC5jXG4rKysgYi9tbS9ndXAuY1xuQEAgLTY0Nyw4ICs2NDcsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0ICAgIHB1ZF90ICpwdWRwLCBpbnQgZmxhZ3MsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbkBAIC02NzIsMTAgKzY3MywxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7XG4gXG4gXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4tXHRpZiAocmV0KVxuK1x0aWYgKHJldCkge1xuIFx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0ZWxzZVxuLVx0XHQqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTtcbitcdH0gZWxzZSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgb2ZmID0gKGFkZHIgXHUwMDI2IH5QVURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHRcdCpucl9wYWdlcyA9IG1pbihIUEFHRV9QVURfTlIgLSBvZmYsIChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4rXHR9XG4gXG4gXHRyZXR1cm4gcGFnZTtcbiB9XG5AQCAtNjk5LDkgKzcwMyw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3BtZChwbWRfdCBwbWQsIHN0cnVjdCBwYWdlICpwYWdlLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0ICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHBtZF90IHBtZHZhbCA9ICpwbWQ7XG5AQCAtNzM4LDIzICs3NDIsMjUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gI2VuZGlmXHQvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi9cbiBcbiBcdHBhZ2UgKz0gKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcbitcdCpucl9wYWdlcyA9IG1pbihIUEFHRV9QTURfTlIgLSAoKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpLFxuK1x0XHRcdChlbmQgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4gXHRyZXR1cm4gcGFnZTtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0XHRcdCAgICBwdWRfdCAqcHVkcCwgaW50IGZsYWdzLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0ICAgIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtNzk5LDggKzgwNSw0NiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTtcbiB9XG4gXG4rLypcbisgKiBDb3VudCB0aGUgcGFnZXMsIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIGFuZCBib3VuZGVkIGJ5IEBlbmQsIHRoYXQgYSBQVEUtbWFwcGVkXG4rICogbGFyZ2UgQGZvbGlvIG1hcHMgY29udGlndW91c2x5IGFuZCB0aGF0IGNhbiBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZVxuKyAqIHBhZ2UgYXQgQGFkZHJlc3M6IGNvbnNlY3V0aXZlIHByZXNlbnQgUFRFcyBtYXBwaW5nIGNvbnNlY3V0aXZlIHBhZ2VzIG9mXG4rICogQGZvbGlvIHdpdGggYSB1bmlmb3JtIHdyaXRlIGJpdCwgd2l0aGluIHRoaXMgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLlxuKyAqIFJldHVybnMgYXQgbGVhc3QgMS5cbisgKlxuKyAqIGd1cF9tdXN0X3Vuc2hhcmUoKSBhbmQgdGhlIHdyaXRlLWZhdWx0IGNoZWNrIGFyZSBwZXIgUFRFLiBBIHdyaXRhYmxlIHJ1biBpc1xuKyAqIGFsd2F5cyBzYWZlOiBhIHdyaXRhYmxlIGFub24gcGFnZSBpcyBleGNsdXNpdmUsIGFuZCBGT0xMX1dSSVRFIGlzIHNhdGlzZmllZC5cbisgKiBBIHJlYWQtb25seSBydW4gaXMgb25seSBzYWZlIGZvciBhIHBsYWluIHJlYWQ7IEZPTExfV1JJVEUgd291bGQgbmVlZCBhIENPV1xuKyAqIGZhdWx0IHBlciBwYWdlIGFuZCBGT0xMX1BJTiB3b3VsZCBuZWVkIGEgcGVyLXBhZ2UgZ3VwX211c3RfdW5zaGFyZSgpIGNoZWNrLFxuKyAqIHNvIHRob3NlIGZhbGwgYmFjayB0byBhIHNpbmdsZSBwYWdlLlxuKyAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4re1xuK1x0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xuK1x0dW5zaWduZWQgbG9uZyBtYXg7XG4rXG4rXHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IChGT0xMX1dSSVRFIHwgRk9MTF9QSU4pKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKlxuK1x0ICogZm9saW9fcHRlX2JhdGNoX2ZsYWdzKCkgc2NhbnMgZm9yd2FyZCBmcm9tIEBwdGVwLCBzbyB0aGUgcnVuIG11c3RcbitcdCAqIHN0YXkgd2l0aGluIHRoaXMgcGFnZSB0YWJsZTogYm91bmQgaXQgYnkgdGhlIFBNRCBhcyB3ZWxsIGFzIEBlbmQgYW5kXG4rXHQgKiB0aGUgVk1BLCBzaW5jZSBhIGxhcmdlIGZvbGlvIGNhbiBiZSBQVEUtbWFwcGVkIGFjcm9zcyBhIFBNRCBib3VuZGFyeS5cbitcdCAqL1xuK1x0bWF4ID0gbWluKChwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuK1x0XHQgICh2bWEtXHUwMDNldm1fZW5kIC0gYWRkcmVzcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuK1x0aWYgKG1heCBcdTAwM2M9IDEpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0cmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBcdTAwMjZiYXRjaF9wdGUsIG1heCxcbitcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUpO1xuK31cbitcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuQEAgLTg4NSw2ICs5MjksMTUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdCAqL1xuIFx0XHRmb2xpb19tYXJrX2FjY2Vzc2VkKGZvbGlvKTtcbiBcdH1cbitcbitcdC8qXG4rXHQgKiBBIFBURS1tYXBwZWQgbGFyZ2UgZm9saW8gY2FuIGJlIGhhbmRlZCBiYWNrIGFzIGEgY29udGlndW91cyBiYXRjaCxcbitcdCAqIHNvIHRoZSBjYWxsZXIgYWR2YW5jZXMgb3ZlciB0aGUgd2hvbGUgcnVuIGluIG9uZSBzdGVwIGluc3RlYWQgb2ZcbitcdCAqIHdhbGtpbmcgdGhlIHBhZ2UgdGFibGVzIGZvciBldmVyeSBwYWdlLlxuK1x0ICovXG4rXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4rXHRcdCpucl9wYWdlcyA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCBlbmQsIGZvbGlvLCBwYWdlLFxuK1x0XHRcdFx0XHQgICAgIHB0ZXAsIHB0ZSwgZmxhZ3MpO1xuIG91dDpcbiBcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcbiBcdHJldHVybiBwYWdlO1xuQEAgLTg5Niw5ICs5NDksOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHQgICAgcHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwbWRfdCAqcG1kLCBwbWR2YWw7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTEyLDcgKzk2NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGlmIChsaWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKVxuLVx0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4rXHRcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiBcbiBcdGlmIChwbWRfcHJvdG5vbmUocG1kdmFsKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbkBAIC05MjUsMjQgKzk3OCwyNCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBucl9wYWdlcyk7XG4gXHR9XG4gXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBGT0xMX1NQTElUX1BNRCkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpO1xuIFx0XHQvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovXG4gXHRcdHJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDpcbi1cdFx0XHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcbitcdFx0XHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiBcdH1cbi1cdHBhZ2UgPSBmb2xsb3dfaHVnZV9wbWQodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgbnJfcGFnZXMpO1xuIFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdHJldHVybiBwYWdlO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0XHRcdCAgICBwNGRfdCAqcDRkcCwgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm5yX3BhZ2VzKVxuIHtcbiBcdHB1ZF90ICpwdWRwLCBwdWQ7XG4gXHRzcGlubG9ja190ICpwdGw7XG5AQCAtOTU1LDcgKzEwMDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAocHVkX2xlYWYocHVkKSkge1xuIFx0XHRwdGwgPSBwdWRfbG9jayhtbSwgcHVkcCk7XG4tXHRcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cGFnZSA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdFx0aWYgKHBhZ2UpXG4gXHRcdFx0cmV0dXJuIHBhZ2U7XG5AQCAtOTY0LDEzICsxMDE3LDEzIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHQgICAgcGdkX3QgKnBnZHAsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpucl9wYWdlcylcbiB7XG4gXHRwNGRfdCAqcDRkcCwgcDRkO1xuIFxuQEAgLTk4MSwxNSArMTAzNCwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcDRkX3ByZXNlbnQocDRkKSB8fCBwNGRfYmFkKHA0ZCkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIHA0ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIG5yX3BhZ2VzKTtcbiB9XG4gXG4gLyoqXG4gICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4gICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzc1xuICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcbiAgKiBAZmxhZ3M6IGZsYWdzIG1vZGlmeWluZyBsb29rdXAgYmVoYXZpb3VyXG4tICogQHBhZ2VfbWFzazogYSBwb2ludGVyIHRvIG91dHB1dCBwYWdlX21hc2tcbisgKiBAbnJfcGFnZXM6IG91dHB1dDsgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgdGhlIGNhbGxlciBjYW4gcmVhZFxuICAqXG4gICogQGZsYWdzIGNhbiBoYXZlIEZPTExfIGZsYWdzIHNldCwgZGVmaW5lZCBpbiBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gICpcbkBAIC05OTgsMTUgKzEwNTIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gICogdHJpZ2dlciBhIGZhdWx0IHdpdGggRkFVTFRfRkxBR19VTlNIQVJFIHNldC4gTm90ZSB0aGF0IHVuc2hhcmluZyBpcyBvbmx5XG4gICogcmVsZXZhbnQgd2l0aCBGT0xMX1BJTiBhbmQgIUZPTExfV1JJVEUuXG4gICpcbi0gKiBPbiBvdXRwdXQsIEBwYWdlX21hc2sgaXMgc2V0IGFjY29yZGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgcGFnZS5cbisgKiBPbiBvdXRwdXQsIEBucl9wYWdlcyBob2xkcyBob3cgbWFueSBjb250aWd1b3VzIHBhZ2VzIHRoZSBmb2xpbyB0aGF0IGluY2x1ZGVzXG4rICogdGhlIHJldHVybmVkIHBhZ2UgaGFzIG1hcHBlZCBpbnRvIHRoaXMgcHJvY2Vzcywgc28gdGhlIGNhbGxlciBjYW4gYWR2YW5jZVxuKyAqIG92ZXIgYSBsYXJnZSBmb2xpbyBpbiBvbmUgc3RlcC5cbiAgKlxuICAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxuICAqIGFuIGVycm9yIHBvaW50ZXIgaWYgdGhlcmUgaXMgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWRcbiAgKiBieSBhIHBhZ2UgZGVzY3JpcHRvciAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXG4gICovXG4gc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdCAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqbnJfcGFnZXMpXG4ge1xuIFx0cGdkX3QgKnBnZDtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuQEAgLTEwMTQsMTMgKzEwNzAsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpO1xuIFxuLVx0KnBhZ2VfbWFzayA9IDA7XG4rXHQqbnJfcGFnZXMgPSAxO1xuIFx0cGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7XG4gXG4gXHRpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpXG4gXHRcdHBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0ZWxzZVxuLVx0XHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgbnJfcGFnZXMpO1xuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcbiBcbkBAIC0xMDgwLDkgKzExMzYsMTYgQEAgc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gfVxuIFxuIC8qXG4tICogbW1hcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeS4gIElmIEBmbGFncyBoYXMgRk9MTF9VTkxPQ0tBQkxFIGJ1dCBub3Rcbi0gKiBGT0xMX05PV0FJVCwgdGhlIG1tYXBfbG9jayBtYXkgYmUgcmVsZWFzZWQuICBJZiBpdCBpcywgKkBsb2NrZWQgd2lsbCBiZSBzZXRcbi0gKiB0byAwIGFuZCAtRUJVU1kgcmV0dXJuZWQuXG4rICogVGhlIGNhbGxlciBob2xkcyBlaXRoZXIgdGhlIG1tYXAgbG9jaywgb3IgdGhlIHBlci1WTUEgbG9jayAod2l0aFxuKyAqIEZPTExfVk1BX0xPQ0spLCBvbiBlbnRyeS4gSWYgQGZsYWdzIGhhcyBGT0xMX1VOTE9DS0FCTEUgYnV0IG5vdCBGT0xMX05PV0FJVCxcbisgKiB0aGUgbW1hcF9sb2NrIG1heSBiZSByZWxlYXNlZC4gSWYgaXQgaXMsICpAbG9ja2VkIHdpbGwgYmUgc2V0IHRvIDAgYW5kXG4rICogLUVBR0FJTiByZXR1cm5lZC5cbisgKlxuKyAqIFRoZSByZXR1cm4gdmFsdWUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBsb2NrIHR5cGU6IGEgZmF1bHQgdGhhdCBtYWRlXG4rICogcHJvZ3Jlc3MgYnV0IG5lZWRzIGEgcmV0cnkgKFZNX0ZBVUxUX1JFVFJZIC8gVk1fRkFVTFRfQ09NUExFVEVEKSBpcyByZXBvcnRlZFxuKyAqIGFzIC1FQUdBSU4gZm9yIGJvdGggdGhlIG1tYXAgbG9jayBhbmQgdGhlIHBlci1WTUEgbG9jayAoRk9MTF9WTUFfTE9DSykuIE9ubHlcbisgKiB0aGUgKkBsb2NrZWQgc2lkZSBlZmZlY3QgaXMgbG9jay10eXBlIHNwZWNpZmljLCBhcyB0aGUgcGVyLVZNQSBsb2NrIHBhdGggaGFzXG4rICogbm8gdW5sb2NrYWJsZSBtbWFwX2xvY2sgdG8gZHJvcC5cbiAgKi9cbiBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGJvb2wgdW5zaGFyZSxcbkBAIC0xMDk3LDYgKzExNjAsOCBAQCBzdGF0aWMgaW50IGZhdWx0aW5fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19XUklURTtcbiBcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9SRU1PVEUpXG4gXHRcdGZhdWx0X2ZsYWdzIHw9IEZBVUxUX0ZMQUdfUkVNT1RFO1xuK1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1ZNQV9MT0NLKVxuK1x0XHRmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1ZNQV9MT0NLO1xuIFx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1VOTE9DS0FCTEUpIHtcbiBcdFx0ZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19BTExPV19SRVRSWSB8IEZBVUxUX0ZMQUdfS0lMTEFCTEU7XG4gXHRcdC8qXG5AQCAtMTEyNSw0MSArMTE5MCwxOTUgQEAgc3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRyZXQgPSBoYW5kbGVfbW1fZmF1bHQodm1hLCBhZGRyZXNzLCBmYXVsdF9mbGFncywgTlVMTCk7XG4gXG4rXHQvKlxuK1x0ICogQSBmdWxseSBjb21wbGV0ZWQgZmF1bHQgKFZNX0ZBVUxUX0NPTVBMRVRFRCkgb3Igb25lIHRoYXQgbmVlZHMgYSByZXRyeVxuK1x0ICogKFZNX0ZBVUxUX1JFVFJZKSBoYXMgcmVsZWFzZWQgdGhlIGxvY2sgaXQgd2FzIGhvbGRpbmcuIFJlcG9ydCBib3RoIGFzXG4rXHQgKiAtRUFHQUlOIHNvIHRoZSBjYWxsZXIgcmV0cmllczogdGhlIG1tYXAgbG9jayBjYWxsZXIgcmV0YWtlcyBpdCBoZXJlLFxuK1x0ICogdGhlIHBlci1WTUEgbG9jayBjYWxsZXIgKEZPTExfVk1BX0xPQ0spIGZhbGxzIGJhY2sgdG8gdGhlIG1tYXAgbG9jay5cbitcdCAqXG4rXHQgKiBEcm9wcGluZyB0aGUgbW1hcCBsb2NrIGlzIHJlY29yZGVkIGluICpAbG9ja2VkLiBUaGVyZSBpcyBubyBzdWNoIGxvY2tcbitcdCAqIHRvIGRyb3AgdW5kZXIgdGhlIHBlci1WTUEgbG9jaywgd2hlcmUgQGxvY2tlZCBpcyBub3QgdXNlZCwgc28gbGVhdmUgaXRcbitcdCAqIGFsb25lIGluIHRoYXQgY2FzZS5cbitcdCAqL1xuIFx0aWYgKHJldCBcdTAwMjYgVk1fRkFVTFRfQ09NUExFVEVEKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFdpdGggRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQgd2UnbGwgbmV2ZXIgcmVsZWFzZSB0aGVcbi1cdFx0ICogbW1hcCBsb2NrIGluIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIuIFNhbml0eSBjaGVjayB0aGlzLlxuLVx0XHQgKi9cbi1cdFx0V0FSTl9PTl9PTkNFKGZhdWx0X2ZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCk7XG4tXHRcdCpsb2NrZWQgPSAwO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSBzaG91bGQgZG8gdGhlIHNhbWUgYXMgVk1fRkFVTFRfUkVUUlksIGJ1dCBsZXQncyBub3Rcbi1cdFx0ICogcmV0dXJuIC1FQlVTWSBzaW5jZSB0aGF0J3Mgbm90IHJlZmxlY3RpbmcgdGhlIHJlYWxpdHkgb2Zcbi1cdFx0ICogd2hhdCBoYXMgaGFwcGVuZWQgLSB3ZSd2ZSBqdXN0IGZ1bGx5IGNvbXBsZXRlZCBhIHBhZ2Vcbi1cdFx0ICogZmF1bHQsIHdpdGggdGhlIG1tYXAgbG9jayByZWxlYXNlZC4gIFVzZSAtRUFHQUlOIHRvIHNob3dcbi1cdFx0ICogdGhhdCB3ZSB3YW50IHRvIHRha2UgdGhlIG1tYXAgbG9jayBfYWdhaW5fLlxuLVx0XHQgKi9cbitcdFx0aWYgKCEoZmxhZ3MgXHUwMDI2IEZPTExfVk1BX0xPQ0spKSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBXaXRoIEZBVUxUX0ZMQUdfUkVUUllfTk9XQUlUIHdlJ2xsIG5ldmVyIHJlbGVhc2UgdGhlXG4rXHRcdFx0ICogbW1hcCBsb2NrIGluIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIuIFNhbml0eSBjaGVjayB0aGlzLlxuK1x0XHRcdCAqL1xuK1x0XHRcdFdBUk5fT05fT05DRShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpO1xuK1x0XHRcdCpsb2NrZWQgPSAwO1xuK1x0XHR9XG4gXHRcdHJldHVybiAtRUFHQUlOO1xuIFx0fVxuIFxuIFx0aWYgKHJldCBcdTAwMjYgVk1fRkFVTFRfRVJST1IpIHtcbiBcdFx0aW50IGVyciA9IHZtX2ZhdWx0X3RvX2Vycm5vKHJldCwgZmxhZ3MpO1xuIFxuLVx0XHRpZiAoZXJyKVxuLVx0XHRcdHJldHVybiBlcnI7XG4tXHRcdEJVRygpO1xuK1x0XHQvKlxuK1x0XHQgKiBWTV9GQVVMVF9FUlJPUiBhbHdheXMgZGVjb2RlcyB0byBhbiBlcnJubzsgYSB6ZXJvIGhlcmUgd291bGRcbitcdFx0ICogbWVhbiBoYW5kbGVfbW1fZmF1bHQoKSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIGNvbWJpbmF0aW9uLlxuK1x0XHQgKiBSZXBvcnQgLUVGQVVMVCByYXRoZXIgdGhhbiBjcmFzaDogdW5kZXIgdGhlIHBlci1WTUEgbG9jayB0aGVcbitcdFx0ICogbW1hcCBsb2NrIHJldHJ5IHByb2R1Y2VzIHRoZSBkZWZpbml0aXZlIHJlc3VsdC5cbitcdFx0ICovXG4rXHRcdFZNX1dBUk5fT05fT05DRSghZXJyKTtcbitcdFx0cmV0dXJuIGVyciA/IGVyciA6IC1FRkFVTFQ7XG4gXHR9XG4gXG4gXHRpZiAocmV0IFx1MDAyNiBWTV9GQVVMVF9SRVRSWSkge1xuLVx0XHRpZiAoIShmYXVsdF9mbGFncyBcdTAwMjYgRkFVTFRfRkxBR19SRVRSWV9OT1dBSVQpKVxuK1x0XHRpZiAoIShmbGFncyBcdTAwMjYgRk9MTF9WTUFfTE9DSykgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhKGZhdWx0X2ZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1JFVFJZX05PV0FJVCkpXG4gXHRcdFx0KmxvY2tlZCA9IDA7XG4tXHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdHJldHVybiAtRUFHQUlOO1xuIFx0fVxuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKy8qXG4rICogZ2V0X3VzZXJfcGFnZV92bWEgLSBnZXQgb25lIHBhZ2UgZnJvbSBAdm1hLCB3aG9zZSBsb2NrIHRoZSBjYWxsZXIgYWxyZWFkeVxuKyAqIGhvbGRzOiB0aGUgbW1hcCBsb2NrLCBvciAod2l0aCBGT0xMX1ZNQV9MT0NLKSB0aGUgcGVyLVZNQSBsb2NrLiBXYWxrcyB0aGVcbisgKiBwYWdlIHRhYmxlcywgZmF1bHRpbmcgdGhlIHBhZ2UgaW4gaWYgbmVlZGVkLCBhbmQgb24gc3VjY2VzcyByZXR1cm5zIGl0IHdpdGhcbisgKiBhIHJlZmVyZW5jZSBhbmQgdGhlIGxvY2sgc3RpbGwgaGVsZC5cbisgKlxuKyAqIFJ1bnMgY2hlY2tfdm1hX2ZsYWdzKCkgbGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHNvIGNhbGxlcnMgbmVlZCBub3QgcHJlLWNoZWNrXG4rICogdGhlIFZNQTsgbW9zdCByZWplY3Rpb25zIGFyZSByZXR1cm5lZCBhcyB0aGVpciBlcnJvci4gQSBWTV9JTy9WTV9QRk5NQVAgVk1BXG4rICogaXMgdGhlIGV4Y2VwdGlvbjogYSBDT1dlZCBwYWdlIHdpdGggYSBzdHJ1Y3QgcGFnZSBpcyByZXR1cm5lZCwgd2hpbGUgYSByYXdcbisgKiBQRk4gaGFzIG5vbmUgYW5kIHlpZWxkcyAtRUZBVUxULCB0byBiZSByZWFjaGVkIHZpYSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuKyAqXG4rICogVW5kZXIgRk9MTF9WTUFfTE9DSywgYW55dGhpbmcgdGhhdCBjYW5ub3QgYmUgZmluaXNoZWQgdW5kZXIgdGhlIHBlci1WTUEgbG9ja1xuKyAqIChhIGRyb3BwZWQgZmF1bHQsIHVzZXJmYXVsdGZkLCBhIGhhcmQgZXJyb3IsIG9yIC1cdTAwM2VhY2Nlc3MoKSBtZW1vcnkpIHJlbGVhc2VzXG4rICogdGhlIGxvY2sgYW5kIHJldHVybnMgLUVBR0FJTiwgc28gdGhlIGNhbGxlciByZXRyaWVzIHVuZGVyIHRoZSBtbWFwIGxvY2suXG4rICovXG4rc3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4re1xuK1x0Ym9vbCB2bWFfbG9ja2VkID0gZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX1ZNQV9MT0NLO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcbitcdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0aW50IGxvY2tlZCA9IDE7XG4rXHRib29sIHBmbm1hcDtcbitcdGludCByZXQ7XG4rXG4rXHQvKlxuK1x0ICogVHdvIGxvY2sgbW9kZXMgYXJlIHN1cHBvcnRlZDogdGhlIG1tYXAgbG9jaywgd2l0aCBuZWl0aGVyIGZsYWcsIG9yXG4rXHQgKiB0aGUgcGVyLVZNQSBsb2NrLCB3aXRoIGJvdGggRk9MTF9WTUFfTE9DSyBhbmQgRk9MTF9VTkxPQ0tBQkxFLiBBblxuK1x0ICogdW5sb2NrYWJsZSBtbWFwIGZhdWx0IHdvdWxkIGRyb3AgdGhlIGxvY2sgYW5kIHJlcG9ydCBpdCBpbiAqbG9ja2VkLFxuK1x0ICogd2hpY2ggdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWxheSwgc28gcmVqZWN0IGEgbG9uZSBmbGFnLlxuK1x0ICovXG4rXHRWTV9XQVJOX09OX09OQ0UoIShndXBfZmxhZ3MgXHUwMDI2IEZPTExfVk1BX0xPQ0spICE9ICEoZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX1VOTE9DS0FCTEUpKTtcbitcbitcdC8qXG4rXHQgKiBWYWxpZGF0ZSB0aGUgVk1BIHVwIGZyb250LCBsaWtlIF9fZ2V0X3VzZXJfcGFnZXMoKS4gQSBWTV9JTy9WTV9QRk5NQVBcbitcdCAqIFZNQSBpcyBub3QgcmVqZWN0ZWQgb3V0cmlnaHQ6IGl0IGNhbiBob2xkIENPV2VkIHBhZ2VzIHRoYXQgaGF2ZSBhXG4rXHQgKiBzdHJ1Y3QgcGFnZTsgbGV0IGZvbGxvd19wYWdlX21hc2soKSBsb29rIGZvciB0aGVtLCBhbmQgdHJlYXQgb25seVxuK1x0ICogaXRzIHN0cnVjdC1wYWdlLWxlc3MgUEZOcyBhcyB1bnJlYWNoYWJsZS4gT3RoZXIgcmVqZWN0aW9uc1xuK1x0ICogKHNlY3JldG1lbSwgcGVybWlzc2lvbnMsIGV0YykgcmVzdWx0IGluIGltbWVkaWF0ZSBmYWlsdXJlLlxuK1x0ICovXG4rXHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MsIFZNX0lPIHwgVk1fUEZOTUFQKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gZmFpbDtcbitcdHBmbm1hcCA9IHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgKFZNX0lPIHwgVk1fUEZOTUFQKTtcbitcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7XG4rXHRcdFx0cmV0ID0gLUVJTlRSO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRjb25kX3Jlc2NoZWQoKTtcbitcbitcdFx0LyogVGhpcyBoZWxwZXIgaGFuZHMgYmFjayBhIHNpbmdsZSBwYWdlOyBjYXAgdGhlIGJhdGNoIGF0IG9uZS4gKi9cbitcdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBhZGRyLCBhZGRyICsgUEFHRV9TSVpFLFxuK1x0XHRcdFx0XHRndXBfZmxhZ3MgfCBGT0xMX1RPVUNIIHwgRk9MTF9HRVQsXG4rXHRcdFx0XHRcdFx1MDAyNm5yX3BhZ2VzKTtcbitcdFx0aWYgKCFJU19FUlJfT1JfTlVMTChwYWdlKSkge1xuK1x0XHRcdC8qIE1hdGNoIF9fZ2V0X3VzZXJfcGFnZXMoKTogZmx1c2ggZm9yIFZJVlQvYWxpYXNpbmcgY2FjaGVzLiAqL1xuK1x0XHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHBhZ2UsIGFkZHIpO1xuK1x0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpO1xuK1x0XHRcdHJldHVybiBwYWdlO1xuK1x0XHR9XG4rXG4rXHRcdC8qXG4rXHRcdCAqIE5vIHN0cnVjdCBwYWdlOiBhIHJhdyBQRk4gb2YgYSBWTV9JTy9WTV9QRk5NQVAgVk1BLCB3aGV0aGVyXG4rXHRcdCAqIHNlZW4gYnkgdGhlIHVwLWZyb250IGNoZWNrIChAcGZubWFwKSBvciByZXBvcnRlZCBhcyAtRUVYSVNUXG4rXHRcdCAqIGZvciBhIHByZXNlbnQgUEZOLiBSZXR1cm4gLUVGQVVMVCBzbyB0aGUgY2FsbGVyIHJlYWNoZXMgaXRcbitcdFx0ICogdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpLlxuK1x0XHQgKi9cbitcdFx0aWYgKHBmbm1hcCB8fCBQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcbitcdFx0XHRyZXQgPSAtRUZBVUxUO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHQvKiBBIGhhcmQgZXJyb3IgZnJvbSB0aGUgd2FsayBpdHNlbGYuICovXG4rXHRcdGlmIChwYWdlIFx1MDAyNlx1MDAyNiBQVFJfRVJSKHBhZ2UpICE9IC1FTUxJTkspIHtcbitcdFx0XHRyZXQgPSBQVFJfRVJSKHBhZ2UpO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1xuK1x0XHQvKlxuK1x0XHQgKiBUaGUgcGFnZSBpcyBub3QgcHJlc2VudCwgb3IgbmVlZHMgdW5zaGFyaW5nLiBBIHJlbW90ZSBmYXVsdFxuK1x0XHQgKiB1bmRlciB0aGUgcGVyLVZNQSBsb2NrIGNhbm5vdCBkZWxpdmVyIHVzZXJmYXVsdGZkICh3aGljaFxuK1x0XHQgKiBhc3N1bWVzIGN1cnJlbnQgaXMgdGhlIGZhdWx0aW5nIHRhc2spLCBzbyBmYWxsIGJhY2sgZm9yIHRob3NlLlxuK1x0XHQgKi9cbitcdFx0aWYgKHZtYV9sb2NrZWQgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcbitcdFx0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBhZGRyLCBndXBfZmxhZ3MgfCBGT0xMX1JFTU9URSB8IEZPTExfR0VULFxuK1x0XHRcdFx0ICAgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LLCBcdTAwMjZsb2NrZWQpO1xuK1x0XHRpZiAocmV0ID09IC1FQUdBSU4pXG4rXHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XHQvKiBmYXVsdCByZWxlYXNlZCB0aGUgcGVyLVZNQSBsb2NrICovXG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK2ZhaWw6XG4rXHQvKlxuK1x0ICogVW5kZXIgdGhlIHBlci1WTUEgbG9jayB0aGUgY2FsbGVyIGNhbm5vdCByZWFjaCAtXHUwMDNlYWNjZXNzKCkgb3IgYWN0IG9uIGFcbitcdCAqIGhhcmQgZXJyb3IgKGJvdGggbmVlZCB0aGUgbW1hcCBsb2NrKSwgc28gcmVsZWFzZSB0aGUgbG9jayBhbmQgaGF2ZSBpdFxuK1x0ICogcmV0cnkgdGhlcmU7IHRoZSBtbWFwLWxvY2sgcGFzcyBwcm9kdWNlcyB0aGUgZGVmaW5pdGl2ZSBlcnJvci5cbitcdCAqL1xuK1x0aWYgKHZtYV9sb2NrZWQpIHtcbitcdFx0dm1hX2VuZF9yZWFkKHZtYSk7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FQUdBSU4pO1xuK1x0fVxuK1x0cmV0dXJuIEVSUl9QVFIocmV0KTtcbit9XG4rXG4rLypcbisgKiBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEgLSBmYXVsdCBpbiBvbmUgcGFnZSBvZiBhIHJlbW90ZSBtbSBhbmQgaGFuZCBiYWNrIHRoZVxuKyAqIHBhZ2UgYWxvbmcgd2l0aCB0aGUgVk1BIHRoYXQgY292ZXJzIGl0LiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgbW1hcF9sb2NrLlxuKyAqIFJldHVybnMgd2l0aCB0aGUgbW1hcF9sb2NrIHN0aWxsIGhlbGQuXG4rICpcbisgKiBMb29rcyB1cCB0aGUgVk1BLCBhbmQgZ2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgcGFnZSB0aHJvdWdoXG4rICogZ2V0X3VzZXJfcGFnZV92bWEoKSwgZmF1bHRpbmcgaW4gdGhlIHBhZ2UgaWYgbmVlZGVkLlxuKyAqXG4rICogRk9MTF9OT1dBSVQgYW5kIEZPTExfVU5MT0NLQUJMRSBhcmUgcmVqZWN0ZWQ6IGJvdGggbGV0IHRoZSBmYXVsdCBoYW5kbGVyXG4rICogZHJvcCB0aGUgbW1hcCBsb2NrLCB3aGljaCBjb3VsZCBpbnZhbGlkYXRlIHRoZSBsb29rZWQtdXAgVk1BLlxuKyAqL1xuK3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbitcdFx0XHRcdCAgICAgIGludCBndXBfZmxhZ3MsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKVxuK3tcbitcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXG4rXHRpZiAoV0FSTl9PTl9PTkNFKHVubGlrZWx5KGd1cF9mbGFncyBcdTAwMjYgKEZPTExfTk9XQUlUIHwgRk9MTF9VTkxPQ0tBQkxFKSkpKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbitcbitcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XG4rXG4rXHR2bWEgPSB2bWFfbG9va3VwKG1tLCBhZGRyKTtcbitcdGlmICghdm1hKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcbitcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7XG4rXHRpZiAoSVNfRVJSKHBhZ2UpKVxuK1x0XHRyZXR1cm4gcGFnZTtcbitcbitcdCp2bWFwID0gdm1hO1xuK1x0cmV0dXJuIHBhZ2U7XG4rfVxuK1xuIC8qXG4gICogV3JpdGluZyB0byBmaWxlLWJhY2tlZCBtYXBwaW5ncyB3aGljaCByZXF1aXJlIGZvbGlvIGRpcnR5IHRyYWNraW5nIHVzaW5nIEdVUFxuICAqIGlzIGEgZnVuZGFtZW50YWxseSBicm9rZW4gb3BlcmF0aW9uLCBhcyBrZXJuZWwgd3JpdGUgYWNjZXNzIHRvIEdVUCBtYXBwaW5nc1xuQEAgLTExOTcsMTMgKzE0MTYsMjEgQEAgc3RhdGljIGJvb2wgd3JpdGFibGVfZmlsZV9tYXBwaW5nX2FsbG93ZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRyZXR1cm4gIXZtYV9uZWVkc19kaXJ0eV90cmFja2luZyh2bWEpO1xuIH1cbiBcbi1zdGF0aWMgaW50IGNoZWNrX3ZtYV9mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBndXBfZmxhZ3MpXG4raW50IGNoZWNrX3ZtYV9mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBndXBfZmxhZ3MsXG4rXHRcdCAgICB2bV9mbGFnc190IGlnbm9yZV9mbGFncylcbiB7XG4gXHR2bV9mbGFnc190IHZtX2ZsYWdzID0gdm1hLVx1MDAzZXZtX2ZsYWdzO1xuIFx0aW50IHdyaXRlID0gKGd1cF9mbGFncyBcdTAwMjYgRk9MTF9XUklURSk7XG4gXHRpbnQgZm9yZWlnbiA9IChndXBfZmxhZ3MgXHUwMDI2IEZPTExfUkVNT1RFKTtcbiBcdGJvb2wgdm1hX2Fub24gPSB2bWFfaXNfYW5vbnltb3VzKHZtYSk7XG4gXG4rXHQvKlxuK1x0ICogT3B0IG91dCBvZiB0aGUgZmxhZyBjaGVja3MgdGhhdCByZWFkIHRoaXMgbG9jYWwgY29weSAodGhlXG4rXHQgKiBWTV9JTy9WTV9QRk5NQVAgZ2F0ZSBhbmQgdGhlIHdyaXRlL3JlYWQvY293IGJpdHMpOyBjaGVja3MgdGhhdFxuK1x0ICogcmUtcmVhZCB2bWEtXHUwMDNldm1fZmxhZ3MgdGhyb3VnaCBoZWxwZXJzIGFyZSB1bmFmZmVjdGVkLlxuK1x0ICovXG4rXHR2bV9mbGFncyBcdTAwMjY9IH5pZ25vcmVfZmxhZ3M7XG4rXG4gXHRpZiAodm1fZmxhZ3MgXHUwMDI2IChWTV9JTyB8IFZNX1BGTk1BUCkpXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFxuQEAgLTEzNTgsNyArMTU4NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4ge1xuIFx0bG9uZyByZXQgPSAwLCBpID0gMDtcbiBcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbi1cdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcbiBcbiBcdGlmICghbnJfcGFnZXMpXG4gXHRcdHJldHVybiAwO1xuQEAgLTEzNzMsNyArMTU5OSw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRkbyB7XG4gXHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0XHR1bnNpZ25lZCBpbnQgcGFnZV9pbmNyZW07XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pbmNyZW07XG4gXG4gXHRcdC8qIGZpcnN0IGl0ZXJhdGlvbiBvciBjcm9zcyB2bWEgYm91bmQgKi9cbiBcdFx0aWYgKCF2bWEgfHwgc3RhcnQgXHUwMDNlPSB2bWEtXHUwMDNldm1fZW5kKSB7XG5AQCAtMTM4Nyw3ICsxNjEzLDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0cmV0ID0gLUVOT01FTTtcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0XHR9XG4tXHRcdFx0XHRpZiAoY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzKSkge1xuK1x0XHRcdFx0aWYgKGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCkpIHtcbiBcdFx0XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0XHR9XG5AQCAtMTQwMCw3ICsxNjI2LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0XHRwYWdlcyA/IFx1MDAyNnBhZ2UgOiBOVUxMKTtcbiBcdFx0XHRcdGlmIChyZXQpXG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0cGFnZV9tYXNrID0gMDtcbitcdFx0XHRcdHBhZ2VfaW5jcmVtID0gMTtcbiBcdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuIFx0XHRcdH1cbiBcbkBAIC0xNDA4LDcgKzE2MzQsNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0cmV0ID0gLUVGQVVMVDtcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbi1cdFx0XHRyZXQgPSBjaGVja192bWFfZmxhZ3Modm1hLCBndXBfZmxhZ3MpO1xuK1x0XHRcdHJldCA9IGNoZWNrX3ZtYV9mbGFncyh2bWEsIGd1cF9mbGFncywgMCk7XG4gXHRcdFx0aWYgKHJldClcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG5AQCAtMTQyMyw3ICsxNjQ5LDggQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcbi1cdFx0cGFnZSA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLCBcdTAwMjZwYWdlX21hc2spO1xuK1x0XHRwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBzdGFydCArIG5yX3BhZ2VzICogUEFHRV9TSVpFLFxuK1x0XHRcdFx0XHRndXBfZmxhZ3MsIFx1MDAyNnBhZ2VfaW5jcmVtKTtcbiBcdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuIFx0XHRcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXG4gXHRcdFx0XHRcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcbkBAIC0xNDU2LDcgKzE2ODMsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gbmV4dF9wYWdlOlxuLVx0XHRwYWdlX2luY3JlbSA9IDEgKyAofihzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IHBhZ2VfbWFzayk7XG4gXHRcdGlmIChwYWdlX2luY3JlbSBcdTAwM2UgbnJfcGFnZXMpXG4gXHRcdFx0cGFnZV9pbmNyZW0gPSBucl9wYWdlcztcbiBcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggMTgxZTc5ZjFkNmEyMDcuLjcwNmY3ZjA4ZmQxODE1IDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuKysrIGIvbW0vaW50ZXJuYWwuaFxuQEAgLTE1OTUsNiArMTU5NSwxMCBAQCBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLFxuICAqL1xuIGludCBfX211c3RfY2hlY2sgdHJ5X2dyYWJfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IHJlZnMsXG4gXHRcdFx0XHR1bnNpZ25lZCBpbnQgZmxhZ3MpO1xuK2ludCBjaGVja192bWFfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZ3VwX2ZsYWdzLFxuK1x0XHQgICAgdm1fZmxhZ3NfdCBpZ25vcmVfZmxhZ3MpO1xuK3N0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKTtcbiBcbiAvKlxuICAqIG1tL2h1Z2VfbWVtb3J5LmNcbkBAIC0xNjQxLDExICsxNjQ1LDEzIEBAIGVudW0ge1xuIFx0Rk9MTF9VTkxPQ0tBQkxFID0gMSBcdTAwM2NcdTAwM2MgMjEsXG4gXHQvKiBWTUEgbG9va3VwK2NoZWNrcyBjb21wYXRpYmxlIHdpdGggTUFEVl9QT1BVTEFURV8oUkVBRHxXUklURSkgKi9cbiBcdEZPTExfTUFEVl9QT1BVTEFURSA9IDEgXHUwMDNjXHUwMDNjIDIyLFxuK1x0LyogY2FsbGVyIGhvbGRzIHRoZSBwZXItVk1BIGxvY2ssIG5vdCB0aGUgbW1hcCBsb2NrICovXG4rXHRGT0xMX1ZNQV9MT0NLID0gMSBcdTAwM2NcdTAwM2MgMjMsXG4gfTtcbiBcbiAjZGVmaW5lIElOVEVSTkFMX0dVUF9GTEFHUyAoRk9MTF9UT1VDSCB8IEZPTExfVFJJRUQgfCBGT0xMX1JFTU9URSB8IEZPTExfUElOIHwgXFxcbiBcdFx0XHQgICAgRk9MTF9GQVNUX09OTFkgfCBGT0xMX1VOTE9DS0FCTEUgfCBcXFxuLVx0XHRcdCAgICBGT0xMX01BRFZfUE9QVUxBVEUpXG4rXHRcdFx0ICAgIEZPTExfTUFEVl9QT1BVTEFURSB8IEZPTExfVk1BX0xPQ0spXG4gXG4gLypcbiAgKiBJbmRpY2F0ZXMgZm9yIHdoaWNoIHBhZ2VzIHRoYXQgYXJlIHdyaXRlLXByb3RlY3RlZCBpbiB0aGUgcGFnZSB0YWJsZSxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXG5pbmRleCBmZjMzOGMyYWJlOTIzMS4uYWFmNjIwMDE3ZjM0NDIgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnkuY1xuKysrIGIvbW0vbWVtb3J5LmNcbkBAIC03MDE1LDg2ICs3MDE1LDI0NCBAQCBFWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX2FjY2Vzc19waHlzKTtcbiAjZW5kaWZcbiBcbiAvKlxuLSAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4rICogVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5LCBzdWNoIGFzIGFuIGlvcmVtYXBwZWQgZGV2aWNlIG1hcHBpbmcsIG1hcHNcbisgKiBQRk5zIHRoYXQgaGF2ZSBubyBzdHJ1Y3QgcGFnZSwgc28gZ2V0X3VzZXJfcGFnZV92bWEoKSBjYW5ub3QgZmV0Y2ggaXRcbisgKiBldmVuIHRob3VnaCB0aGUgcGFnZSB0YWJsZXMgYXJlIHBvcHVsYXRlZC4gSXQgY2FuIHN0aWxsIGJlIHJlYWNoZWRcbisgKiB0aHJvdWdoIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCkuXG4rICpcbisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG9yIFx1MDAzYz0gMCBpZiBAdm1hIGNhbm5vdCBiZVxuKyAqIGFjY2Vzc2VkIHRoaXMgd2F5LlxuICAqL1xuLXN0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuK3N0YXRpYyBpbnQgYWNjZXNzX3JlbW90ZV92bWFfb3BzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4rXHRcdFx0XHQgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpXG4re1xuKyNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1RcbitcdGlmICh2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcylcbitcdFx0cmV0dXJuIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLCBsZW4sIHdyaXRlKTtcbisjZW5kaWZcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIExvY2sgQG1tIHRvIHJlYWNoIHRoZSByZW1vdGUgcmFuZ2UgW0BhZGRyLCBAYWRkciArIEBsZW4pLlxuKyAqXG4rICogVGFrZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHdob2xlIHJhbmdlIGZpdHMgaW4gYSBzaW5nbGUgVk1BIHdob3NlXG4rICogZmxhZ3MgcGVybWl0IHRoZSBhY2Nlc3MuIFRoZSBSQ1UgZnJlZWQgcGFnZSB0YWJsZXMgdGhlbiBrZWVwIHBhZ2UgdGFibGVcbisgKiBtZW1vcnkgZnJvbSBiZWluZyByZXVzZWQgd2l0aCB1bmV4cGVjdGVkIGNvbnRlbnRzIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuXG4rICogT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLCB3aGljaCBhbHNvIGNvdmVycyBtdWx0aS1WTUEgcmFuZ2VzLFxuKyAqIHN0YWNrIGV4cGFuc2lvbiwgYW5kIC1cdTAwM2VhY2Nlc3MoKSBtZW1vcnkuXG4rICpcbisgKiBSZXR1cm4gd2hldGhlciB0aGUgbW1hcCBsb2NrIGlzIGhlbGQuIFRoZSBwZXItVk1BIGxvY2tlZCBWTUEsIHdoZW4gb25lIGlzXG4rICogdGFrZW4sIGlzIHN0b3JlZCBpbiAqQHZtYXA7IGl0IGlzIE5VTEwgb24gdGhlIG1tYXAgbG9jayBwYXRoLiAqQHZtYXAgaXNcbisgKiBzZXQgdG8gYW4gRVJSX1BUUigpIHdoZW4gdGhlIG1tYXAgbG9jayBjb3VsZCBub3QgYmUgdGFrZW4sIHNvIGNhbGxlcnMgbXVzdFxuKyAqIGNoZWNrIElTX0VSUigqQHZtYXApIGJlZm9yZSB1c2luZyBlaXRoZXIgcmVzdWx0LlxuKyAqL1xuK3N0YXRpYyBib29sIHJlbW90ZV9hY2Nlc3NfbG9jayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuK1x0XHRcdCAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKVxuK3tcbitcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDtcbitcbisjaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZNQV9MT0NLKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRSlcbitcdHZtYSA9IGxvY2tfdm1hX3VuZGVyX3JjdShtbSwgYWRkcik7XG4rXHRpZiAodm1hKSB7XG4rXHRcdC8qIGFkZHIgKyBsZW4gbXVzdCBub3Qgd3JhcCwgYW5kIG11c3QgZml0IHdpdGhpbiB0aGUgb25lIFZNQS4gKi9cbitcdFx0aWYgKGFkZHIgKyBsZW4gXHUwMDNjIGFkZHIgfHwgYWRkciArIGxlbiBcdTAwM2Ugdm1hLVx1MDAzZXZtX2VuZCB8fFxuK1x0XHQgICAgY2hlY2tfdm1hX2ZsYWdzKHZtYSwgZ3VwX2ZsYWdzLCAwKSkge1xuK1x0XHRcdHZtYV9lbmRfcmVhZCh2bWEpO1xuK1x0XHRcdHZtYSA9IE5VTEw7XG4rXHRcdH1cbitcdH1cbisjZW5kaWZcbitcbitcdGlmICghdm1hKSB7XG4rXHRcdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpIHtcbitcdFx0XHQqdm1hcCA9IEVSUl9QVFIoLUVJTlRSKTtcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdH1cbitcdFx0KnZtYXAgPSBOVUxMO1xuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdH1cbitcbitcdCp2bWFwID0gdm1hO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKiBSZWxlYXNlIHRoZSBsb2NrIHRha2VuIGJ5IHJlbW90ZV9hY2Nlc3NfbG9jaygpLiAqL1xuK3N0YXRpYyB2b2lkIHJlbW90ZV9hY2Nlc3NfdW5sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuK1x0XHRcdFx0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sIGhhdmVfbW1hcF9sb2NrKVxuK3tcbitcdGlmIChoYXZlX21tYXBfbG9jaylcbitcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4rXHRlbHNlIGlmICh2bWEpXG4rXHRcdHZtYV9lbmRfcmVhZCh2bWEpO1xuK31cbitcbisvKlxuKyAqIFBlci1wYWdlIGFjdGlvbiBmb3IgYSByZW1vdGUgVk0gd2Fsay4gSGFuZGxlIHVwIHRvIEBsZW4gYnl0ZXMgYXQgQGFkZHIgb25cbisgKiBAcGFnZSwgYWR2YW5jaW5nICpAYnVmIHBhc3QgdGhlIGJ5dGVzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGl0LiBAcGFnZSBpc1xuKyAqIE5VTEwgZm9yIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IChWTV9JTyAvIFZNX1BGTk1BUCkgcmVhY2hlZCB1bmRlciB0aGUgbW1hcFxuKyAqIGxvY2suXG4rICpcbisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzb3VyY2UgYnl0ZXMgaGFuZGxlZCBhdCBAYWRkciwgMCB0byBlbmQgdGhlIHdhbGsgKGFcbisgKiBzdHJpbmcgcmVhY2hlZCBpdHMgTlVMLCBvciAtXHUwMDNlYWNjZXNzKCkgbWVtb3J5IGNvdWxkIG5vdCBiZSByZWFjaGVkKSwgb3IgYVxuKyAqIG5lZ2F0aXZlIGVycm5vIHRvIGFib3J0LlxuKyAqL1xuK3R5cGVkZWYgaW50ICgqcmVtb3RlX3ZtX2FjdGlvbikoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICoqYnVmLCBpbnQgbGVuLFxuK1x0XHRcdFx0aW50IHdyaXRlKTtcbitcbisvKlxuKyAqIFdhbGsgdGhlIHJlbW90ZSByYW5nZSBbQGFkZHIsIEBhZGRyICsgQGxlbikgb2YgQG1tLCBoYW5kaW5nIGVhY2ggcGFnZSB0b1xuKyAqIEBhY3Rpb24uIFVzZSB0aGUgcGVyLVZNQSBsb2NrIHdoZW4gdGhlIHJhbmdlIGZpdHMgb25lIFZNQSwgYW5kIGZhbGwgYmFjayB0b1xuKyAqIHRoZSBtbWFwIGxvY2sgZm9yIG11bHRpLVZNQSByYW5nZXMsIHN0YWNrIGV4cGFuc2lvbiAod2hlbiBAY2FuX2V4cGFuZF9zdGFja1xuKyAqIGlzIHNldCksIG9yIHdoZW4gdGhlIHBlci1WTUEgbG9jayBjYW5ub3QgZmluaXNoIGEgZmF1bHQuXG4rICpcbisgKiBFYWNoIHBhZ2UgaXMgZmF1bHRlZCBpbiB3aXRoIGdldF91c2VyX3BhZ2Vfdm1hKCkgdW5kZXIgd2hpY2hldmVyIGxvY2sgaXNcbisgKiBoZWxkLiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBAYWN0aW9uIGNvbnN1bWVkOyAqQGVyciBpcyBhIG5lZ2F0aXZlXG4rICogZXJybm8gd2hlbiB0aGUgd2FsayBhYm9ydGVkLCBlbHNlIDAuXG4rICovXG4rc3RhdGljIGludCByZW1vdGVfdm1fd2FsayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsXG4rXHRcdFx0ICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBib29sIGNhbl9leHBhbmRfc3RhY2ssXG4rXHRcdFx0ICByZW1vdGVfdm1fYWN0aW9uIGFjdGlvbiwgaW50ICplcnIpXG4ge1xuIFx0dm9pZCAqb2xkX2J1ZiA9IGJ1ZjtcbiBcdGludCB3cml0ZSA9IGd1cF9mbGFncyBcdTAwMjYgRk9MTF9XUklURTtcbitcdGJvb2wgaGF2ZV9tbWFwX2xvY2s7XG4rXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiBcbi1cdGlmIChtbWFwX3JlYWRfbG9ja19raWxsYWJsZShtbSkpXG4tXHRcdHJldHVybiAwO1xuK1x0KmVyciA9IDA7XG4rXG4rXHQvKlxuK1x0ICogU2V0IEZPTExfUkVNT1RFIHNvIGNoZWNrX3ZtYV9mbGFncygpIGFwcGxpZXMgdGhlIHNhbWUgcHJvdGVjdGlvbiBrZXlcbitcdCAqIHJ1bGVzIGFzIGdldF91c2VyX3BhZ2VzX3JlbW90ZSgpIGRpZDogdGhlIGN1cnJlbnQgUEtSVSBpcyBub3QgY2hlY2tlZFxuK1x0ICogYWdhaW5zdCBhIFZNQSByZWFjaGVkIG9uIEBtbSdzIGJlaGFsZi5cbitcdCAqL1xuK1x0Z3VwX2ZsYWdzIHw9IEZPTExfUkVNT1RFO1xuIFxuLVx0LyogVW50YWcgdGhlIGFkZHJlc3MgYmVmb3JlIGxvb2tpbmcgdXAgdGhlIFZNQSAqL1xuLVx0YWRkciA9IHVudGFnZ2VkX2FkZHJfcmVtb3RlKG1tLCBhZGRyKTtcbitcdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZV91bmxvY2tlZChtbSwgYWRkcik7XG4gXG4tXHQvKiBBdm9pZCB0cmlnZ2VyaW5nIHRoZSB0ZW1wb3Jhcnkgd2FybmluZyBpbiBfX2dldF91c2VyX3BhZ2VzICovXG4tXHRpZiAoIXZtYV9sb29rdXAobW0sIGFkZHIpIFx1MDAyNlx1MDAyNiAhZXhwYW5kX3N0YWNrKG1tLCBhZGRyKSlcbitcdGhhdmVfbW1hcF9sb2NrID0gcmVtb3RlX2FjY2Vzc19sb2NrKG1tLCBhZGRyLCBsZW4sIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbitcdGlmIChJU19FUlIodm1hKSkge1xuK1x0XHQqZXJyID0gLUVGQVVMVDtcbiBcdFx0cmV0dXJuIDA7XG4rXHR9XG4gXG4tXHQvKiBpZ25vcmUgZXJyb3JzLCBqdXN0IGNoZWNrIGhvdyBtdWNoIHdhcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgKi9cbiBcdHdoaWxlIChsZW4pIHtcbi1cdFx0aW50IGJ5dGVzLCBvZmZzZXQ7XG4tXHRcdHZvaWQgKm1hZGRyO1xuLVx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuLVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuLVx0XHRcdFx0XHRcdFx0ICAgICBndXBfZmxhZ3MsIFx1MDAyNnZtYSk7XG4rXHRcdHVuc2lnbmVkIGludCBmb2xsX2ZsYWdzID0gZ3VwX2ZsYWdzO1xuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdFx0aW50IHJldDtcbiBcbi1cdFx0aWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdC8qIFdlIG1pZ2h0IG5lZWQgdG8gZXhwYW5kIHRoZSBzdGFjayB0byBhY2Nlc3MgaXQgKi9cbitcdFx0aWYgKCF2bWEgfHwgYWRkciBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbitcdFx0XHQvKiBBbnkgbG9va3VwIGhlcmUgaG9sZHMgdGhlIG1tYXAgbG9jay4gKi9cbitcdFx0XHRWTV9CVUdfT04oIWhhdmVfbW1hcF9sb2NrKTtcbiBcdFx0XHR2bWEgPSB2bWFfbG9va3VwKG1tLCBhZGRyKTtcbi1cdFx0XHRpZiAoIXZtYSkge1xuK1x0XHRcdGlmICghdm1hIFx1MDAyNlx1MDAyNiBjYW5fZXhwYW5kX3N0YWNrKSB7XG4rXHRcdFx0XHQvKiBleHBhbmRfc3RhY2soKSBkcm9wcyB0aGUgbW1hcCBsb2NrIGlmIGl0IGZhaWxzICovXG4gXHRcdFx0XHR2bWEgPSBleHBhbmRfc3RhY2sobW0sIGFkZHIpO1xuLVxuLVx0XHRcdFx0LyogbW1hcF9sb2NrIHdhcyBkcm9wcGVkIG9uIGZhaWx1cmUgKi9cbiBcdFx0XHRcdGlmICghdm1hKVxuLVx0XHRcdFx0XHRyZXR1cm4gYnVmIC0gb2xkX2J1Zjtcbi1cbi1cdFx0XHRcdC8qIFRyeSBhZ2FpbiBpZiBzdGFjayBleHBhbnNpb24gd29ya2VkICovXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRcdFx0aGF2ZV9tbWFwX2xvY2sgPSBmYWxzZTtcbitcdFx0XHR9XG4rXHRcdFx0aWYgKCF2bWEpIHtcbitcdFx0XHRcdCplcnIgPSAtRUZBVUxUO1xuK1x0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuK1x0XHR9XG4rXG4rXHRcdC8qXG4rXHRcdCAqIEZPTExfVU5MT0NLQUJMRSBsZXRzIHRoZSBwZXItVk1BIGZhdWx0IHJldHJ5LCBkcm9wcGluZyB0aGVcbitcdFx0ICogbG9jaywgc28gdGhlIHdhbGsgY2FuIGZhbGwgYmFjayB0byB0aGUgbW1hcCBsb2NrLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFoYXZlX21tYXBfbG9jaylcbitcdFx0XHRmb2xsX2ZsYWdzIHw9IEZPTExfVk1BX0xPQ0sgfCBGT0xMX1VOTE9DS0FCTEU7XG4gXG4rXHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGZvbGxfZmxhZ3MpO1xuK1x0XHRpZiAoSVNfRVJSKHBhZ2UpKSB7XG4gXHRcdFx0Lypcbi1cdFx0XHQgKiBDaGVjayBpZiB0aGlzIGlzIGEgVk1fSU8gfCBWTV9QRk5NQVAgVk1BLCB3aGljaFxuLVx0XHRcdCAqIHdlIGNhbiBhY2Nlc3MgdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUuXG4rXHRcdFx0ICogZ2V0X3VzZXJfcGFnZV92bWEoKSByZXR1cm5zIC1FQUdBSU4sIHdpdGggdGhlIHBlci1WTUFcbitcdFx0XHQgKiBsb2NrIHJlbGVhc2VkLCBmb3IgYW55dGhpbmcgaXQgY291bGQgbm90IGZpbmlzaCB1bmRlclxuK1x0XHRcdCAqIGl0OyByZXRha2UgdGhlIG1tYXAgbG9jayBhbmQgcmV0cnkuIEEgZGlmZmVyZW50IGVycm9yXG4rXHRcdFx0ICogdGhlcmVmb3JlIG9ubHkgYXJyaXZlcyB1bmRlciB0aGUgbW1hcCBsb2NrLCB3aGVyZVxuK1x0XHRcdCAqIHN0cnVjdC1wYWdlLWxlc3MgbWVtb3J5IGNhbiBiZSByZWFjaGVkIHZpYSAtXHUwMDNlYWNjZXNzKCkuXG4gXHRcdFx0ICovXG4tXHRcdFx0Ynl0ZXMgPSAwO1xuLSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbi1cdFx0XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MpXG4tXHRcdFx0XHRieXRlcyA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKHZtYSwgYWRkciwgYnVmLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGxlbiwgd3JpdGUpO1xuLSNlbmRpZlxuLVx0XHRcdGlmIChieXRlcyBcdTAwM2M9IDApXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0Ynl0ZXMgPSBsZW47XG4tXHRcdFx0b2Zmc2V0ID0gYWRkciBcdTAwMjYgKFBBR0VfU0laRS0xKTtcbi1cdFx0XHRpZiAoYnl0ZXMgXHUwMDNlIFBBR0VfU0laRS1vZmZzZXQpXG4tXHRcdFx0XHRieXRlcyA9IFBBR0VfU0laRS1vZmZzZXQ7XG4tXG4tXHRcdFx0bWFkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBmb2xpb19wYWdlX2lkeChmb2xpbywgcGFnZSkgKiBQQUdFX1NJWkUpO1xuLVx0XHRcdGlmICh3cml0ZSkge1xuLVx0XHRcdFx0Y29weV90b191c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLFxuLVx0XHRcdFx0XHRcdCAgbWFkZHIgKyBvZmZzZXQsIGJ1ZiwgYnl0ZXMpO1xuLVx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eV9sb2NrKGZvbGlvKTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsXG4tXHRcdFx0XHRcdFx0ICAgIGJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcbitcdFx0XHRpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUFHQUlOKSB7XG4rXHRcdFx0XHR2bWEgPSBOVUxMO1xuK1x0XHRcdFx0aWYgKG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKG1tKSkge1xuK1x0XHRcdFx0XHQqZXJyID0gLUVGQVVMVDtcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRoYXZlX21tYXBfbG9jayA9IHRydWU7XG4rXHRcdFx0XHRjb250aW51ZTtcbiBcdFx0XHR9XG4tXHRcdFx0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRSghaGF2ZV9tbWFwX2xvY2spKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdFx0cGFnZSA9IE5VTEw7XG4rXHRcdH1cbitcbitcdFx0cmV0ID0gYWN0aW9uKHZtYSwgcGFnZSwgYWRkciwgXHUwMDI2YnVmLCBsZW4sIHdyaXRlKTtcbitcdFx0aWYgKHJldCBcdTAwM2M9IDApIHtcbitcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdFx0KmVyciA9IHJldDtcbitcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRsZW4gLT0gYnl0ZXM7XG4tXHRcdGJ1ZiArPSBieXRlcztcbi1cdFx0YWRkciArPSBieXRlcztcbitcdFx0YWRkciArPSByZXQ7XG4rXHRcdGxlbiAtPSByZXQ7XG4gXHR9XG4tXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbitcbitcdHJlbW90ZV9hY2Nlc3NfdW5sb2NrKG1tLCB2bWEsIGhhdmVfbW1hcF9sb2NrKTtcbiBcbiBcdHJldHVybiBidWYgLSBvbGRfYnVmO1xuIH1cbiBcbisvKlxuKyAqIENvcHkgb25lIHBhZ2UncyB3b3J0aCBvZiBbQGFkZHIsIEBhZGRyICsgQGxlbikgdG8gb3IgZnJvbSAqQGJ1Zi4gUmVhY2hlc1xuKyAqIHN0cnVjdC1wYWdlLWxlc3MgVk1fSU8gLyBWTV9QRk5NQVAgbWVtb3J5IHRocm91Z2ggdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3MoKS5cbisgKi9cbitzdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxuK3tcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHRpbnQgYnl0ZXMsIG9mZnNldDtcbitcdHZvaWQgKm1hZGRyO1xuK1xuK1x0aWYgKCFwYWdlKSB7XG4rXHRcdGJ5dGVzID0gYWNjZXNzX3JlbW90ZV92bWFfb3BzKHZtYSwgYWRkciwgKmJ1ZiwgbGVuLCB3cml0ZSk7XG4rXHRcdGlmIChieXRlcyBcdTAwM2UgMClcbitcdFx0XHQqYnVmICs9IGJ5dGVzO1xuK1x0XHRyZXR1cm4gYnl0ZXM7XG4rXHR9XG4rXG4rXHRieXRlcyA9IGxlbjtcbitcdG9mZnNldCA9IGFkZHIgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbitcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuK1x0XHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcbitcbitcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbitcdG1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTtcbitcdGlmICh3cml0ZSkge1xuK1x0XHRjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsIG1hZGRyICsgb2Zmc2V0LCAqYnVmLCBieXRlcyk7XG4rXHRcdGZvbGlvX21hcmtfZGlydHlfbG9jayhmb2xpbyk7XG4rXHR9IGVsc2Uge1xuK1x0XHRjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwgKmJ1ZiwgbWFkZHIgKyBvZmZzZXQsIGJ5dGVzKTtcbitcdH1cbitcdGZvbGlvX3JlbGVhc2Vfa21hcChmb2xpbywgbWFkZHIpO1xuK1xuK1x0KmJ1ZiArPSBieXRlcztcbitcdHJldHVybiBieXRlcztcbit9XG4rXG4rLypcbisgKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLlxuKyAqL1xuK3N0YXRpYyBpbnQgX19hY2Nlc3NfcmVtb3RlX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4rXHRcdFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRyZXR1cm4gcmVtb3RlX3ZtX3dhbGsobW0sIGFkZHIsIGJ1ZiwgbGVuLCBndXBfZmxhZ3MsIHRydWUsXG4rXHRcdFx0ICAgICAgYWNjZXNzX3ZtX3BhZ2UsIFx1MDAyNmVycik7XG4rfVxuK1xuIC8qKlxuICAqIGFjY2Vzc19yZW1vdGVfdm0gLSBhY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlXG4gICogQG1tOlx0XHR0aGUgbW1fc3RydWN0IG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZVxuQEAgLTcxMzgsODQgKzcyOTYsNjcgQEAgRVhQT1JUX1NZTUJPTF9HUEwoYWNjZXNzX3Byb2Nlc3Nfdm0pO1xuIFxuICNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbiAvKlxuLSAqIENvcHkgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MncyBhZGRyZXNzIHNwYWNlIGFzIGdpdmVuIGluIG1tLlxuLSAqIElmIHRoZXJlIGlzIGFueSBlcnJvciByZXR1cm4gLUVGQVVMVC5cbisgKiBDb3B5IGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gQGFkZHIgaW50byAqQGJ1ZiwgdXAgdG8gQGxlbiBieXRlcyxcbisgKiBzdG9wcGluZyBhdCB0aGUgTlVMLiBzdHJzY3B5KCkgYWx3YXlzIE5VTCB0ZXJtaW5hdGVzLCBzbyByZWNvcHkgdGhlIGxhc3RcbisgKiBieXRlIG9mIGEgcGFnZSB3aGVuIG1vcmUgcGFnZXMgZm9sbG93LiBBIHN0cmluZyBpcyBuZXZlciByZWFkIGZyb21cbisgKiBzdHJ1Y3QtcGFnZS1sZXNzIFZNX0lPIC8gVk1fUEZOTUFQIG1lbW9yeS5cbiAgKi9cbi1zdGF0aWMgaW50IF9fY29weV9yZW1vdGVfdm1fc3RyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0XHR2b2lkICpidWYsIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4rc3RhdGljIGludCBjb3B5X3ZtX3N0cihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4rXHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKipidWYsIGludCBsZW4sIGludCB3cml0ZSlcbiB7XG4tXHR2b2lkICpvbGRfYnVmID0gYnVmO1xuLVx0aW50IGVyciA9IDA7XG4tXG4tXHQqKGNoYXIgKilidWYgPSAnXFwwJztcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHRpbnQgYnl0ZXMsIG9mZnNldCwgcmV0dmFsO1xuK1x0dm9pZCAqbWFkZHI7XG4gXG4tXHRpZiAobW1hcF9yZWFkX2xvY2tfa2lsbGFibGUobW0pKVxuK1x0aWYgKCFwYWdlKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbi1cdGFkZHIgPSB1bnRhZ2dlZF9hZGRyX3JlbW90ZShtbSwgYWRkcik7XG4rXHRieXRlcyA9IGxlbjtcbitcdG9mZnNldCA9IGFkZHIgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbitcdGlmIChieXRlcyBcdTAwM2UgUEFHRV9TSVpFIC0gb2Zmc2V0KVxuK1x0XHRieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDtcbiBcbi1cdC8qIEF2b2lkIHRyaWdnZXJpbmcgdGhlIHRlbXBvcmFyeSB3YXJuaW5nIGluIF9fZ2V0X3VzZXJfcGFnZXMgKi9cbi1cdGlmICghdm1hX2xvb2t1cChtbSwgYWRkcikpIHtcbi1cdFx0ZXJyID0gLUVGQVVMVDtcbi1cdFx0Z290byBvdXQ7XG4rXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRtYWRkciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIGZvbGlvX3BhZ2VfaWR4KGZvbGlvLCBwYWdlKSAqIFBBR0VfU0laRSk7XG4rXHRyZXR2YWwgPSBzdHJzY3B5KCpidWYsIG1hZGRyICsgb2Zmc2V0LCBieXRlcyk7XG4rXHRpZiAocmV0dmFsIFx1MDAzZT0gMCkge1xuK1x0XHQvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICovXG4rXHRcdCpidWYgKz0gcmV0dmFsO1xuK1x0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbitcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4tXHR3aGlsZSAobGVuKSB7XG4tXHRcdGludCBieXRlcywgb2Zmc2V0LCByZXR2YWw7XG4tXHRcdHZvaWQgKm1hZGRyO1xuLVx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuLVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xuK1x0KmJ1ZiArPSBieXRlcyAtIDE7XG4rXHRpZiAoYnl0ZXMgIT0gbGVuKSB7XG4rXHRcdGNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyICsgYnl0ZXMgLSAxLCAqYnVmLFxuK1x0XHRcdFx0ICAgIG1hZGRyICsgKFBBR0VfU0laRSAtIDEpLCAxKTtcbitcdFx0KmJ1ZiArPSAxO1xuK1x0fVxuK1x0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4gXG4tXHRcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUobW0sIGFkZHIsIGd1cF9mbGFncywgXHUwMDI2dm1hKTtcbi1cdFx0aWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVHJlYXQgYXMgYSB0b3RhbCBmYWlsdXJlIGZvciBub3cgdW50aWwgd2UgZGVjaWRlIGhvd1xuLVx0XHRcdCAqIHRvIGhhbmRsZSB0aGUgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGNhc2UgYW5kXG4tXHRcdFx0ICogc3RhY2sgZXhwYW5zaW9uLlxuLVx0XHRcdCAqL1xuLVx0XHRcdCooY2hhciAqKWJ1ZiA9ICdcXDAnO1xuLVx0XHRcdGVyciA9IC1FRkFVTFQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbitcdHJldHVybiBieXRlcztcbit9XG4gXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Ynl0ZXMgPSBsZW47XG4tXHRcdG9mZnNldCA9IGFkZHIgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbi1cdFx0aWYgKGJ5dGVzIFx1MDAzZSBQQUdFX1NJWkUgLSBvZmZzZXQpXG4tXHRcdFx0Ynl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XG4tXG4tXHRcdG1hZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgZm9saW9fcGFnZV9pZHgoZm9saW8sIHBhZ2UpICogUEFHRV9TSVpFKTtcbi1cdFx0cmV0dmFsID0gc3Ryc2NweShidWYsIG1hZGRyICsgb2Zmc2V0LCBieXRlcyk7XG4tXHRcdGlmIChyZXR2YWwgXHUwMDNlPSAwKSB7XG4tXHRcdFx0LyogRm91bmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovXG4tXHRcdFx0YnVmICs9IHJldHZhbDtcbi1cdFx0XHRmb2xpb19yZWxlYXNlX2ttYXAoZm9saW8sIG1hZGRyKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuKy8qXG4rICogQ29weSBhIHN0cmluZyBmcm9tIGFub3RoZXIgcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2UgYXMgZ2l2ZW4gaW4gbW0uXG4rICogSWYgdGhlcmUgaXMgYW55IGVycm9yIHJldHVybiAtRUZBVUxULlxuKyAqL1xuK3N0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbitcdFx0XHRcdHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcbit7XG4rXHRpbnQgYnl0ZXMsIGVycjtcbiBcbi1cdFx0YnVmICs9IGJ5dGVzIC0gMTtcbi1cdFx0Lypcbi1cdFx0ICogQmVjYXVzZSBzdHJzY3B5IGFsd2F5cyBOVUwgdGVybWluYXRlcyB3ZSBuZWVkIHRvXG4tXHRcdCAqIGNvcHkgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgcGFnZSBpZiB3ZSBhcmUgZ29pbmcgdG9cbi1cdFx0ICogbG9hZCBtb3JlIHBhZ2VzXG4tXHRcdCAqL1xuLVx0XHRpZiAoYnl0ZXMgIT0gbGVuKSB7XG4tXHRcdFx0YWRkciArPSBieXRlcyAtIDE7XG4tXHRcdFx0Y29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsIGJ1ZiwgbWFkZHIgKyAoUEFHRV9TSVpFIC0gMSksIDEpO1xuLVx0XHRcdGJ1ZiArPSAxO1xuLVx0XHRcdGFkZHIgKz0gMTtcbi1cdFx0fVxuLVx0XHRsZW4gLT0gYnl0ZXM7XG4rXHQqKGNoYXIgKilidWYgPSAnXFwwJztcbiBcbi1cdFx0Zm9saW9fcmVsZWFzZV9rbWFwKGZvbGlvLCBtYWRkcik7XG4rXHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcbitcdFx0XHQgICAgICAgY29weV92bV9zdHIsIFx1MDAyNmVycik7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdC8qIFRoZSBjb250cmFjdCBndWFyYW50ZWVzIGEgdGVybWluYXRlZCBidWZmZXIgZXZlbiBvbiBlcnJvci4gKi9cbitcdFx0KChjaGFyICopYnVmKVtieXRlc10gPSAnXFwwJztcbitcdFx0cmV0dXJuIGVycjtcbiBcdH1cbiBcbi1vdXQ6XG4tXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbi1cdGlmIChlcnIpXG4tXHRcdHJldHVybiBlcnI7XG4tXHRyZXR1cm4gYnVmIC0gb2xkX2J1ZjtcbitcdHJldHVybiBieXRlcztcbiB9XG4gXG4gLyoqXG5kaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jXG5pbmRleCAxYzc3ZDVkYzA2ZTlmYS4uYjM2ZjJlMjE5YjhmNDkgMTAwNjQ0XG4tLS0gYS9tbS9ybWFwLmNcbisrKyBiL21tL3JtYXAuY1xuQEAgLTI4MzgsNyArMjgzOCw3IEBAIHN0cnVjdCBwYWdlICptYWtlX2RldmljZV9leGNsdXNpdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdCAqIChub24tZGV2aWNlLWV4Y2x1c2l2ZSkgUFRFIGFuZCBpc3N1ZSBhIE1NVV9OT1RJRllfRVhDTFVTSVZFLlxuIFx0ICovXG4gcmV0cnk6XG4tXHRwYWdlID0gZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKG1tLCBhZGRyLFxuK1x0cGFnZSA9IGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShtbSwgYWRkcixcbiBcdFx0XHRcdFx0Rk9MTF9HRVQgfCBGT0xMX1dSSVRFIHwgRk9MTF9TUExJVF9QTUQsXG4gXHRcdFx0XHRcdFx1MDAyNnZtYSk7XG4gXHRpZiAoSVNfRVJSKHBhZ2UpKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IGU2ZGY5NjhmMDk3MWM4Li42YjkxN2E0ZjczZTAwZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTgzLDYgKzgzLDcgQEAgVEVTVF9HRU5fRklMRVMgKz0gbXJlbGVhc2VfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1yZW1hcF9kb250dW5tYXBcbiBURVNUX0dFTl9GSUxFUyArPSBtcmVtYXBfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1zZWFsX3Rlc3RcbitURVNUX0dFTl9GSUxFUyArPSBtdGhwX2d1cF9jb3dfdGVzdFxuIFRFU1RfR0VOX0ZJTEVTICs9IG9uLWZhdWx0LWxpbWl0XG4gVEVTVF9HRU5fRklMRVMgKz0gcGFnZW1hcF9pb2N0bFxuIFRFU1RfR0VOX0ZJTEVTICs9IHBmbm1hcFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL210aHBfZ3VwX2Nvd190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUyZWUzMjlkODY0MWMwXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9tdGhwX2d1cF9jb3dfdGVzdC5jXG5AQCAtMCwwICsxLDIxMyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisvKlxuKyAqIFZlcmlmeSB0aGF0IHRoZSBzbG93IEdVUCBwYXRoIChwaW5fdXNlcl9wYWdlcyAtXHUwMDNlIGZvbGxvd19wYWdlX21hc2sgLVx1MDAzZVxuKyAqIGZvbGxvd19wdGVfYmF0Y2gpIHJldHVybnMgdGhlIGNvcnJlY3QgcGFnZXMgZm9yIGEgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb1xuKyAqIChtVEhQKSwgaW5jbHVkaW5nIHRoYXQgQ09XIGNvcGllcyBwcm9kdWNlIHRoZSByaWdodCBjb250ZW50LlxuKyAqXG4rICogVXNlcyB0aGUgQ09ORklHX0dVUF9URVNUIFBJTl9MT05HVEVSTSBpbnRlcmZhY2U6IFNUQVJUIHBpbnMgYSByYW5nZSBvbiB0aGVcbisgKiBzbG93IHBhdGgsIFJFQUQgY29waWVzIHRoZSBwaW5uZWQgcGFnZXMnIGJ5dGVzIGJhY2sgc28gd2UgY2FuIGNvbXBhcmUgdGhlbVxuKyAqIGFnYWluc3QgdGhlIHBhdHRlcm4gd2Ugd3JvdGUuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbitcbisjZGVmaW5lIEFSUkFZX1NJWkUoYSlcdChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSlcbitcbisjZGVmaW5lIEdVUF9ERVYgXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwiXG4rXG4rI2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVFx0X0lPVygnZycsIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcbisjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUT1BcdF9JTygnZycsIDgpXG4rI2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEXHRfSU9XKCdnJywgOSwgX191NjQpXG4rI2RlZmluZSBVU0VfV1JJVEVcdDFcbisjZGVmaW5lIFVTRV9GQVNUXHQyXG4rXG4rc3RydWN0IHBpbl9sb25ndGVybV90ZXN0IHtcbitcdF9fdTY0IGFkZHI7XG4rXHRfX3U2NCBzaXplO1xuK1x0X191MzIgZmxhZ3M7XG4rfTtcbitcbisjZGVmaW5lIE9SREVSX0tCXHQ2NFxuKyNkZWZpbmUgTlJfRk9MSU9TXHQxNlxuKyNkZWZpbmUgUkVHSU9OXHRcdCgoc2l6ZV90KU9SREVSX0tCICogMTAyNCAqIE5SX0ZPTElPUylcbitcbitzdGF0aWMgbG9uZyBQUztcbitzdGF0aWMgaW50IGZhaWxzO1xuK3N0YXRpYyBpbnQgdGFwO1xuK1xuK3N0YXRpYyB2b2lkIG9rKGludCBjb25kLCBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdHByaW50ZihcIiVzICVkICVzXFxuXCIsIGNvbmQgPyBcIm9rXCIgOiBcIm5vdCBva1wiLCArK3RhcCwgZGVzYyk7XG4rXHRpZiAoIWNvbmQpXG4rXHRcdGZhaWxzKys7XG4rfVxuK1xuKy8qIERldGVybWluaXN0aWMsIHBlci1wYWdlLWRpc3RpbmN0IHBhdHRlcm4gc28gYW55IG1pcy1vcmRlciBvciBsZWFrIHNob3dzLiAqL1xuK3N0YXRpYyB2b2lkIGZpbGwoY2hhciAqYmFzZSwgc2l6ZV90IHN6LCB1aW50MzJfdCBzYWx0KVxuK3tcbitcdGZvciAoc2l6ZV90IG9mZiA9IDA7IG9mZiBcdTAwM2Mgc3o7IG9mZiArPSBQUykge1xuK1x0XHR1aW50MzJfdCBrID0gb2ZmIC8gUFM7XG4rXHRcdHVpbnQ2NF90IHYgPSAoKHVpbnQ2NF90KXNhbHQgXHUwMDNjXHUwMDNjIDMyKSBeIChrICogMHg5RTM3NzlCMXUgKyAweDEyMzQpO1xuK1xuK1x0XHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgUFM7IGkgKz0gc2l6ZW9mKHYpKVxuK1x0XHRcdG1lbWNweShiYXNlICsgb2ZmICsgaSwgXHUwMDI2diwgc2l6ZW9mKHYpKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCB3c3lzZnMoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqdmFsKVxuK3tcbitcdGludCBmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpbnQgciA9IHdyaXRlKGZkLCB2YWwsIHN0cmxlbih2YWwpKTtcbitcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByIFx1MDAzYyAwID8gLTEgOiAwO1xuK31cbitcbisvKiBGb3JjZSBzdWItUE1EIDY0a0IgbVRIUCBvbmx5LCBzbyBmYXVsdHMgcHJvZHVjZSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcy4gKi9cbitzdGF0aWMgdm9pZCBzZXR1cF9tdGhwKHZvaWQpXG4re1xuK1x0Y29uc3QgY2hhciAqdGhwID0gXCIvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZVwiO1xuK1x0Y2hhciBwWzI1Nl07XG4rXHRzdGF0aWMgY29uc3QgaW50IGtiW10gPSB7IDE2LCAzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDggfTtcbitcbitcdHdzeXNmcyhcIi9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcIiwgXCJuZXZlclwiKTtcbitcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGtiKTsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHAsIHNpemVvZihwKSwgXCIlcy9odWdlcGFnZXMtJWRrQi9lbmFibGVkXCIsIHRocCwga2JbaV0pO1xuK1x0XHR3c3lzZnMocCwga2JbaV0gPT0gT1JERVJfS0IgPyBcImFsd2F5c1wiIDogXCJuZXZlclwiKTtcbitcdH1cbit9XG4rXG4rLyogQ291bnQgaG93IG1hbnkgcGFnZXMgc2l0IGluIGEgY29udGlndW91cyBcdTAwM2U9T1JERVJfS0IgUEZOIHJ1biAodmlhIHBhZ2VtYXApLiAqL1xuK3N0YXRpYyBpbnQgY291bnRfbGFyZ2VfcGFnZXMoY2hhciAqYmFzZSwgc2l6ZV90IHN6KVxuK3tcbitcdGludCBwbSA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0c2l6ZV90IG4gPSBzeiAvIFBTLCBsYXJnZSA9IDA7XG4rXHR1aW50NjRfdCAqcGZuID0gY2FsbG9jKG4sIHNpemVvZigqcGZuKSk7XG4rXG4rXHRpZiAocG0gXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGZvciAoc2l6ZV90IGsgPSAwOyBrIFx1MDAzYyBuOyBrKyspIHtcbitcdFx0dWludDY0X3QgZW50O1xuK1x0XHRvZmZfdCBpZHggPSAoKHVpbnRwdHJfdCliYXNlICsgayAqIFBTKSAvIFBTICogc2l6ZW9mKGVudCk7XG4rXG4rXHRcdGlmIChwcmVhZChwbSwgXHUwMDI2ZW50LCBzaXplb2YoZW50KSwgaWR4KSAhPSBzaXplb2YoZW50KSB8fFxuK1x0XHQgICAgIShlbnQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyA2MykpKVxuK1x0XHRcdHBmbltrXSA9IDA7XG4rXHRcdGVsc2VcbitcdFx0XHRwZm5ba10gPSBlbnQgXHUwMDI2ICgoMVVMTCBcdTAwM2NcdTAwM2MgNTUpIC0gMSk7XG4rXHR9XG4rXHRjbG9zZShwbSk7XG4rXHRmb3IgKHNpemVfdCBrID0gMDsgayBcdTAwM2MgbjsgaysrKVxuK1x0XHRpZiAoayArIDEgXHUwMDNjIG4gXHUwMDI2XHUwMDI2IHBmbltrXSBcdTAwMjZcdTAwMjYgcGZuW2sgKyAxXSA9PSBwZm5ba10gKyAxKVxuK1x0XHRcdGxhcmdlKys7XG4rXHRmcmVlKHBmbik7XG4rXHRyZXR1cm4gbGFyZ2U7XG4rfVxuK1xuKy8qIFBpbiBAYmFzZS4uQHN6IG9uIHRoZSBzbG93IHBhdGgsIHJlYWQgdGhlIHBpbm5lZCBieXRlcyBiYWNrLCBjb21wYXJlIHRvIGV4cC4gKi9cbitzdGF0aWMgaW50IHBpbl92ZXJpZnkoaW50IGZkLCBjaGFyICpiYXNlLCBzaXplX3Qgc3osIHVpbnQzMl90IHdyLCBjaGFyICpleHApXG4re1xuK1x0c3RydWN0IHBpbl9sb25ndGVybV90ZXN0IGEgPSB7XG4rXHRcdC5hZGRyID0gKHVpbnRwdHJfdCliYXNlLCAuc2l6ZSA9IHN6LFxuK1x0XHQuZmxhZ3MgPSB3ciA/IFVTRV9XUklURSA6IDAsXHRcdC8qIFVTRV9GQVNUIHVuc2V0ID1cdTAwM2Ugc2xvdyAqL1xuK1x0fTtcbitcdGNoYXIgKmdvdCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdFx0IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApO1xuK1x0X191NjQgZ2EgPSAodWludHB0cl90KWdvdDtcbitcdGludCByYyA9IC0xO1xuK1xuK1x0aWYgKGdvdCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAoaW9jdGwoZmQsIFBJTl9MT05HVEVSTV9URVNUX1NUQVJULCBcdTAwMjZhKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJTVEFSVCglcykgZmFpbGVkOiAlc1xcblwiLFxuK1x0XHRcdHdyID8gXCJ3cml0ZVwiIDogXCJyZWFkXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0aWYgKGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9SRUFELCBcdTAwMjZnYSkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiUkVBRCBmYWlsZWQ6ICVzXFxuXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdGlvY3RsKGZkLCBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpb2N0bChmZCwgUElOX0xPTkdURVJNX1RFU1RfU1RPUCk7XG4rXHRyYyA9IG1lbWNtcChnb3QsIGV4cCwgc3opID8gMSA6IDA7XG4rb3V0OlxuK1x0bXVubWFwKGdvdCwgc3opO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdFBTID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0c2V0dXBfbXRocCgpO1xuK1xuK1x0aW50IGZkID0gb3BlbihHVVBfREVWLCBPX1JEV1IpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIm9wZW4gJXM6ICVzIChDT05GSUdfR1VQX1RFU1Q/KVxcblwiLFxuK1x0XHRcdEdVUF9ERVYsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdHJldHVybiAyO1xuK1x0fVxuK1xuK1x0Y2hhciAqciA9IG1tYXAoTlVMTCwgUkVHSU9OLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7XG4rXHRpZiAociA9PSBNQVBfRkFJTEVEKSB7XG4rXHRcdHBlcnJvcihcIm1tYXBcIik7XG4rXHRcdHJldHVybiAyO1xuK1x0fVxuK1x0ZmlsbChyLCBSRUdJT04sIDB4QTEpO1x0XHRcdFx0LyogcGF0dGVybiBQICovXG4rXHRjaGFyICpleHBQID0gbWFsbG9jKFJFR0lPTik7XG4rXG4rXHRtZW1jcHkoZXhwUCwgciwgUkVHSU9OKTtcbitcbitcdGludCBsYXJnZSA9IGNvdW50X2xhcmdlX3BhZ2VzKHIsIFJFR0lPTik7XG4rXG4rXHRwcmludGYoXCIjICVkLyV6dSBwYWdlcyBpbiBjb250aWd1b3VzIGxhcmdlLWZvbGlvIHJ1bnNcXG5cIixcbitcdCAgICAgICBsYXJnZSwgUkVHSU9OIC8gUFMpO1xuK1x0aWYgKGxhcmdlIFx1MDAzYyAoaW50KShSRUdJT04gLyBQUykgLyA0KVxuK1x0XHRwcmludGYoXCIjIFdBUk46IGxpdHRsZSBtVEhQIGJhY2tpbmc7IGJhdGNoIHBhdGggbGlnaHRseSBjb3ZlcmVkXFxuXCIpO1xuK1xuK1x0LyogQTogcmVhZCBwaW4gb3ZlciB3cml0YWJsZSBtVEhQIC1cdTAwM2UgYmF0Y2hlcyAtXHUwMDNlIGNvbnRlbnQgbXVzdCBlcXVhbCBQLiAqL1xuK1x0b2socGluX3ZlcmlmeShmZCwgciwgUkVHSU9OLCAwLCBleHBQKSA9PSAwLFxuK1x0ICAgXCJzbG93IHJlYWQtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzXCIpO1xuK1xuK1x0LyogQjogd3JpdGUgcGluIC1cdTAwM2UgRk9MTF9XUklURSBiYXRjaCBwYXRoIC1cdTAwM2UgY29udGVudCBtdXN0IGVxdWFsIFAuICovXG4rXHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDEsIGV4cFApID09IDAsXG4rXHQgICBcInNsb3cgd3JpdGUtcGluIG9mIG1USFAgcmV0dXJucyBjb3JyZWN0IGNvbnRlbnRzXCIpO1xuK1xuK1x0LyogQzogQ09XIGlzb2xhdGlvbi4gQ2hpbGQgd3JpdGUtcGlucyAodW5zaGFyZXMpIHRoZW4gcmV3cml0ZXM7IHBhcmVudCBQLiAqL1xuK1x0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0aWYgKHBpZCA9PSAwKSB7XG4rXHRcdGludCBjZmQgPSBvcGVuKEdVUF9ERVYsIE9fUkRXUik7XG4rXHRcdGludCBhID0gcGluX3ZlcmlmeShjZmQsIHIsIFJFR0lPTiwgMSwgZXhwUCk7XHQvKiBDT1cgY29weSA9PSBQICovXG4rXG4rXHRcdGZpbGwociwgUkVHSU9OLCAweEIyKTtcdFx0XHQvKiBjaGlsZCB3cml0ZXMgUSAqL1xuK1x0XHRfZXhpdChhID09IDAgPyAwIDogMSk7XG4rXHR9XG4rXHRpbnQgc3QgPSAwO1xuK1xuK1x0d2FpdHBpZChwaWQsIFx1MDAyNnN0LCAwKTtcbitcdG9rKFdJRkVYSVRFRChzdCkgXHUwMDI2XHUwMDI2IFdFWElUU1RBVFVTKHN0KSA9PSAwLFxuK1x0ICAgXCJjaGlsZCB3cml0ZS1waW4gYWZ0ZXIgQ09XIHJldHVybnMgY29ycmVjdCAoY29waWVkKSBjb250ZW50c1wiKTtcbitcdG9rKG1lbWNtcChyLCBleHBQLCBSRUdJT04pID09IDAsXG4rXHQgICBcInBhcmVudCBjb250ZW50cyBpbnRhY3QgYWZ0ZXIgY2hpbGQgQ09XIHdyaXRlc1wiKTtcbitcdC8qIEQ6IHBhcmVudCByZWFkLXBpbiBhZ2FpbiBhZnRlciB0aGUgQ09XIHNwbGl0IHN0aWxsIGNvcnJlY3QuICovXG4rXHRvayhwaW5fdmVyaWZ5KGZkLCByLCBSRUdJT04sIDAsIGV4cFApID09IDAsXG4rXHQgICBcInBhcmVudCBzbG93IHJlYWQtcGluIGFmdGVyIENPVyBzdGlsbCBjb3JyZWN0XCIpO1xuK1xuK1x0cHJpbnRmKFwiIyB0b3RhbHM6IHBhc3M6JWQgZmFpbDolZFxcblwiLCB0YXAgLSBmYWlscywgZmFpbHMpO1xuK1x0cmV0dXJuIGZhaWxzID8gMSA6IDA7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcGZubWFwLmNcbmluZGV4IDRmNTUwODIyMzg1YTIwLi42ZmY1ZDEwMjk1MTdlMyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3Bmbm1hcC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9wZm5tYXAuY1xuQEAgLTMxLDYgKzMxLDcgQEAgc3RhdGljIHNpZ2ptcF9idWYgc2lnam1wX2J1Zl9lbnY7XG4gc3RhdGljIGNoYXIgKmZpbGUgPSBcIi9kZXYvbWVtXCI7XG4gc3RhdGljIG9mZl90IGZpbGVfb2Zmc2V0O1xuIHN0YXRpYyBpbnQgZmQ7XG4rc3RhdGljIGludCB0YXJnZXRfaXNfcmFtO1xuIFxuIHN0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpXG4ge1xuQEAgLTExMyw2ICsxMTQsNyBAQCBzdGF0aWMgdm9pZCBwZm5tYXBfaW5pdCh2b2lkKVxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGtzZnRfZXhpdF9za2lwKFwiQ2Fubm90IGZpbmQgcmFtIHRhcmdldCBpbiAnL3Byb2MvaW9tZW0nOiAlc1xcblwiLFxuIFx0XHRcdFx0ICAgICAgIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0dGFyZ2V0X2lzX3JhbSA9IDE7XG4gXHR9IGVsc2Uge1xuIFx0XHRmaWxlX29mZnNldCA9IDA7XG4gXHR9XG5AQCAtMjcxLDYgKzI3Myw3MCBAQCBURVNUX0YocGZubWFwLCBmb3JrKVxuIFx0QVNTRVJUX0VRKHJldCwgMCk7XG4gfVxuIFxuK1RFU1RfRihwZm5tYXAsIHByb2NtZW1fY293X3JlYWQpXG4re1xuK1x0Y2hhciAqcHJpdiwgKmJ1ZjtcbitcdHNzaXplX3QgcmM7XG4rXHRpbnQgbWVtX2ZkO1xuK1xuK1x0LypcbitcdCAqIEEgQ09XZWQgcGFnZSBpbiBhIFZNX1BGTk1BUCBtYXBwaW5nIGhhcyBhIHN0cnVjdCBwYWdlLCBzbyByZWFkaW5nIGl0XG4rXHQgKiB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtIC0tIF9fYWNjZXNzX3JlbW90ZV92bSgpIC1cdTAwM2UgZ2V0X3VzZXJfcGFnZV92bWEoKVxuK1x0ICogLS0gcmV0dXJucyBpdCBkaXJlY3RseSwgaW5zdGVhZCBvZiByb3V0aW5nIHRvIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKCksXG4rXHQgKiB3aGljaCBpb3JlbWFwcyB0aGUgUEZOIGFuZCBjYW5ub3QgcmVhY2ggYSBDT1dlZCBSQU0gcGFnZS5cbitcdCAqXG4rXHQgKiBNYXAgdGhlIGZpbGUgTUFQX1BSSVZBVEUgYW5kIHdyaXRhYmxlLCB3cml0ZSB0byBDT1cgYSBwYWdlIGludG8gYW5vblxuK1x0ICogbWVtb3J5LCB0aGVuIHJlYWQgdGhlIHBhZ2UgYmFjayB0aHJvdWdoIC9wcm9jL3NlbGYvbWVtLlxuK1x0ICovXG4rXHRzZWxmLVx1MDAzZXNpemUyID0gc2VsZi1cdTAwM2VwYWdlc2l6ZTtcbitcdHNlbGYtXHUwMDNlYWRkcjIgPSBtbWFwKE5VTEwsIHNlbGYtXHUwMDNlc2l6ZTIsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdFx0ICAgTUFQX1BSSVZBVEUsIGZkLCBmaWxlX29mZnNldCk7XG4rXHRpZiAoc2VsZi1cdTAwM2VhZGRyMiA9PSBNQVBfRkFJTEVEKVxuK1x0XHRTS0lQKHJldHVybiwgXCJDYW5ub3QgY3JlYXRlIGEgd3JpdGFibGUgcHJpdmF0ZSBwZm5tYXAgbWFwcGluZ1wiKTtcbitcdHByaXYgPSBzZWxmLVx1MDAzZWFkZHIyO1xuK1xuK1x0LyogQ09XIHRoZSBwYWdlIGFuZCBzdGFtcCBrbm93biBieXRlcyBpbnRvIHRoZSBhbm9uIGNvcHkuICovXG4rXHRwcml2WzBdID0gMHg0MjtcbitcdHByaXZbc2VsZi1cdTAwM2VwYWdlc2l6ZSAtIDFdID0gMHgyNDtcbitcbitcdGJ1ZiA9IG1hbGxvYyhzZWxmLVx1MDAzZXBhZ2VzaXplKTtcbitcdEFTU0VSVF9ORShidWYsIE5VTEwpO1xuK1xuK1x0bWVtX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvbWVtXCIsIE9fUkRPTkxZKTtcbitcdEFTU0VSVF9HRShtZW1fZmQsIDApO1xuK1x0cmMgPSBwcmVhZChtZW1fZmQsIGJ1Ziwgc2VsZi1cdTAwM2VwYWdlc2l6ZSwgKG9mZl90KSh1aW50cHRyX3QpcHJpdik7XG4rXHRjbG9zZShtZW1fZmQpO1xuK1xuK1x0QVNTRVJUX0VRKHJjLCAoc3NpemVfdClzZWxmLVx1MDAzZXBhZ2VzaXplKTtcbitcdEVYUEVDVF9FUShidWZbMF0sIDB4NDIpO1xuK1x0RVhQRUNUX0VRKGJ1ZltzZWxmLVx1MDAzZXBhZ2VzaXplIC0gMV0sIDB4MjQpO1xuK1xuK1x0ZnJlZShidWYpO1xuK31cbitcbitURVNUX0YocGZubWFwLCBwcm9jbWVtX3Bmbl9yZWFkKVxuK3tcbitcdGNoYXIgYnVmWzY0XTtcbitcdHNzaXplX3QgcmM7XG4rXHRpbnQgbWVtX2ZkO1xuK1xuK1x0LypcbitcdCAqIEEgcmF3IFBGTiBvZiBhIFZNX0lPL1ZNX1BGTk1BUCBtYXBwaW5nIGhhcyBubyBzdHJ1Y3QgcGFnZSwgc29cbitcdCAqIF9fYWNjZXNzX3JlbW90ZV92bSgpIHJlYWNoZXMgaXQgdGhyb3VnaCB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWFjY2VzcygpXG4rXHQgKiAoZ2VuZXJpY19hY2Nlc3NfcGh5cygpKS4gVGhhdCBpb3JlbWFwcyB0aGUgUEZOLCB3aGljaCBpcyByZWplY3RlZCBmb3JcbitcdCAqIFJBTSwgc28gdGhpcyBvbmx5IGFwcGxpZXMgdG8gZ2VudWluZSBkZXZpY2UgbWVtb3J5LlxuK1x0ICovXG4rXHRpZiAodGFyZ2V0X2lzX3JhbSlcbitcdFx0U0tJUChyZXR1cm4sIFwiVGFyZ2V0IGlzIFN5c3RlbSBSQU07IC1cdTAwM2VhY2Nlc3MoKSBjYW5ub3QgaW9yZW1hcCBSQU1cIik7XG4rXG4rXHRtZW1fZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9tZW1cIiwgT19SRE9OTFkpO1xuK1x0QVNTRVJUX0dFKG1lbV9mZCwgMCk7XG4rXHRyYyA9IHByZWFkKG1lbV9mZCwgYnVmLCBzaXplb2YoYnVmKSwgKG9mZl90KSh1aW50cHRyX3Qpc2VsZi1cdTAwM2VhZGRyMSk7XG4rXHRjbG9zZShtZW1fZmQpO1xuK1xuK1x0QVNTRVJUX0VRKHJjLCAoc3NpemVfdClzaXplb2YoYnVmKSk7XG4rfVxuK1xuIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRmb3IgKGludCBpID0gMTsgaSBcdTAwM2MgYXJnYzsgaSsrKSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggOGMyOTZkZWRmMDQ3NGQuLmI0OWEzZWIwYzIwNTA4IDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG5AQCAtMjg5LDYgKzI4OSw3IEBAIGZpXG4gIyBEdW1wIHBhZ2VzIDAsIDE5LCBhbmQgNDA5NiwgdXNpbmcgcGluX3VzZXJfcGFnZXM6XG4gQ0FURUdPUlk9XCJndXBfdGVzdFwiIHJ1bl90ZXN0IC4vZ3VwX3Rlc3QgLWN0IC1GIDB4MSAwIDE5IDB4MTAwMFxuIENBVEVHT1JZPVwiZ3VwX3Rlc3RcIiBydW5fdGVzdCAuL2d1cF9sb25ndGVybVxuK0NBVEVHT1JZPVwiZ3VwX3Rlc3RcIiBydW5fdGVzdCAuL210aHBfZ3VwX2Nvd190ZXN0XG4gXG4gQ0FURUdPUlk9XCJ1c2VyZmF1bHRmZFwiIHJ1bl90ZXN0IC4vdWZmZC11bml0LXRlc3RzXG4gdWZmZF9zdHJlc3NfYmluPS4vdWZmZC1zdHJlc3NcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjExLjY5NDc3NzY0N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExNjAyNjIwNDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEdVUCBhbmQgUmVtb3RlIFZNIEFjY2VzcyBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHNlcmllcyB0aGF0J3Mgb3ZlcmhhdWxpbmcgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCBoaXR0aW5nIGBtbS9ndXAuY2AsIGBtbS9tZW1vcnkuY2AsIGFuZCBzb21lIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIGxpa2UgYXJtNjQsIHJpc2N2LCBhbmQgeDg2LiBUaGUgY29yZSBvZiBpdCBzZWVtcyB0byBiZSBhYm91dCByZWZpbmluZyB0aGUgbWVjaGFuaXNtcyBmb3IgR1VQIChHZXQgVXNlciBQYWdlKSBhbmQgcmVtb3RlIFZNIGFjY2Vzcy5cblxuVGhlIG1haW4gZ2lzdCBpcyB0aGUgaW50cm9kdWN0aW9uIG9mIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgIGFuZCBgZ2V0X3VzZXJfcGFnZV92bWFgLCBhbmQgYSBuZXcgYHJlbW90ZV92bV93YWxrYCBtZWNoYW5pc20sIHdoaWNoIHdpbGwgbGlrZWx5IGFmZmVjdCB0aGUgZWZmaWNpZW5jeSBvZiB0aGVzZSBvcGVyYXRpb25zLiBXZSBzZWUgYHJlbW90ZV92bV93YWxrYCBiZWluZyB1c2VkIGJ5IGBfX2FjY2Vzc19yZW1vdGVfdm1gIGFuZCBgX19jb3B5X3JlbW90ZV92bV9zdHJgIHRvIG1ha2UgYSBtb3JlIHN0cnVjdHVyZWQgd2F5IHRvIGFjY2VzcyBhbmQgY29weSBkYXRhIGJldHdlZW4gVk1zLiAgVGhleSd2ZSBhbHNvIGJlZWZlZCB1cCB0aGUgYmF0Y2hpbmcgZm9yIGNvbnRpZ3VvdXMgcGFnZXMgaW4gYGZvbGxvd19wYWdlX21hc2tgIGFuZCBgZm9sbG93X3BhZ2VfcHRlYCwgaW1wb3J0YW50IGZvciB0aG9zZSBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkuXG5cbkRpdmluZyBpbnRvIGBtbS9ndXAuY2AsIHRoZSBuZXcgYGZvbGxvd19wdGVfYmF0Y2hgIGlzIGEgd2VsY29tZSBhZGRpdGlvbiwgYW5kIHRoZSB1cGRhdGVzIHRvIHRoZSBgZm9sbG93X2h1Z2VfKmAgZnVuY3Rpb25zIHN1Z2dlc3QgYSBmb2N1cyBvbiBtVEhQIHN1cHBvcnQsIG1ha2luZyB0aGVtIHJldHVybiBgbnJfcGFnZXNgLiBJIHNlZSB0aGF0IGBmYXVsdGluX3BhZ2VgIGlzIGdldHRpbmcgYSBiaXQgb2YgbG92ZSB0b28sIGhhbmRsaW5nIGBGT0xMX1ZNQV9MT0NLYC4gIGBnZXRfdXNlcl9wYWdlX3ZtYWAgc291bmRzIGxpa2UgYSBuaWNlIGFic3RyYWN0aW9uIGZvciBnZXR0aW5nIGEgcGFnZSBmcm9tIGEgVk1BLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbnQgbG9ja2luZyBzY2hlbWVzLiBBbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgaXMgdGhlIHJlcGxhY2VtZW50IGZvciBgZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlYCwgd2hpY2ggaXMgYSBrZXkgY2hhbmdlIHRvIHRyYWNrLlxuXG5Ob3csIG92ZXIgaW4gYG1tL21lbW9yeS5jYCwgdGhlIGFkZGl0aW9uIG9mIGBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHNgLCBgcmVtb3RlX2FjY2Vzc19sb2NrYCBhbmQgYHJlbW90ZV9hY2Nlc3NfdW5sb2NrYCBsb29rIGxpa2UgdGhleSdyZSBzb2xpZGlmeWluZyB0aGUgcmVtb3RlIFZNIGFjY2VzcyBpbmZyYXN0cnVjdHVyZS4gVGhlIHJlYWwgd29ya2hvcnNlIGhlcmUgaXMgYHJlbW90ZV92bV93YWxrYCwgd2hpY2ggaXMgbm93IHRoZSBjb3JlIG1lY2hhbmlzbSB1c2VkIGJ5IGBfX2FjY2Vzc19yZW1vdGVfdm1gIChhbG9uZyB3aXRoIGBhY2Nlc3Nfdm1fcGFnZWApIGFuZCBgX19jb3B5X3JlbW90ZV92bV9zdHJgICh3aXRoIGBjb3B5X3ZtX3N0cmApIHRvIG1ha2UgdGhlIG9wZXJhdGlvbnMgbXVjaCBtb3JlIHN0cnVjdHVyZWQuXG5cblRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgc2hpZnQgaW4gaG93IHdlIGhhbmRsZSBHVVAgYW5kIHJlbW90ZSBhY2Nlc3MuIFRoaXMgbmVlZHMgc29tZSBzZXJpb3VzIGZ1enppbmcgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcm9jayBzb2xpZC4gSSdtIGdvaW5nIHRvIGtlZXAgYW4gZXllIG9uIHRoZXNlIHN5bWJvbHM6IGBnZXRfdXNlcl9wYWdlX3ZtYWAsIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgLCBgcmVtb3RlX3ZtX3dhbGtgLCBgYWNjZXNzX3ZtX3BhZ2VgLCBgY29weV92bV9zdHJgLCBgZm9sbG93X3B0ZV9iYXRjaGAsIGBmYXVsdGluX3BhZ2VgLCBgX19hY2Nlc3NfcmVtb3RlX3ZtYCwgYW5kIGBfX2NvcHlfcmVtb3RlX3ZtX3N0cmAuXG5cbkxldCdzIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbmZpZ3Mgd2UgbmVlZCB0byBrZWVwIGluIG1pbmQuIFNpbmNlIGl0J3MgdG91Y2hpbmcgYG1tL2d1cC5jYCBhbmQgYG1tL21lbW9yeS5jYCwgdGhhdCBtZWFucyB3ZSdyZSBpbiBjb3JlIE1NIHRlcnJpdG9yeS4gSSBzZWUgYENPTkZJR19QRVJfVk1BX0xPQ0tgIGlzIG1lbnRpb25lZCBpbiBgcmVtb3RlX2FjY2Vzc19sb2NrYCwgYW5kIGBDT05GSUdfTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgaXMgYW5vdGhlciBvbmUgdG8gY29uc2lkZXIuIEFuZCBvZiBjb3Vyc2UsIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGRlZmluaXRlbHkgcmVsZXZhbnQgZ2l2ZW4gdGhlIGNoYW5nZXMgdG8gbVRIUCBhbmQgdGhlIGBmb2xsb3dfaHVnZV8qYCBmdW5jdGlvbnMuXG5cbkkgdGhpbmsgSSdsbCBlbmFibGUgYENPTkZJR19QRVJfVk1BX0xPQ0tgIGFuZCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBkdXJpbmcgdGVzdGluZywganVzdCB0byBjb3ZlciBhbGwgYmFzZXMuIEknbGwgc2VhcmNoIGZvciBgcmVtb3RlX3ZtX3dhbGtgIGluIGBtbS9tZW1vcnkuY2AgdG8gc2VlIGlmIGl0J3MgdW5kZXIgYW55IHNwZWNpZmljIGNvbmZpZywgYnV0IGl0IGxvb2tzIGxpa2UgaXQncyBpbiB0aGUgbWFpbiBib2R5LlxuXG5UaW1lIHRvIHBlZWsgaW50byB0aGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN0dWZmLiBMb29rcyBsaWtlIGBDT05GSUdfUklTQ1ZfSVNBX1NVUE1gIGlzIHJlbGV2YW50IGZvciBSSVNDLVYgYW5kIGBDT05GSUdfQUREUkVTU19NQVNLSU5HYCBmb3IgeDg2LlxuXG5BbHJpZ2h0LCBJJ2xsIG5lZWQgdG8gcnVuIHRoaXMgdGhyb3VnaCBzb21lIHZlcmlmaWNhdGlvbiB0b29scyB0byBiZSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzc3NywiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg2MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjIzLjI5NzQwNDU4NVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTQ1MzQ0MDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJlbW90ZV92bV93YWxrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTcxMDE9dHlwZWRlZiBpbnQgKCpyZW1vdGVfdm1fYWN0aW9uKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5tbS9tZW1vcnkuYy03MTE0LSAqL1xcbm1tL21lbW9yeS5jOjcxMTU6c3RhdGljIGludCByZW1vdGVfdm1fd2FsayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsXFxubW0vbWVtb3J5LmMtNzExNi1cXHRcXHRcXHQgIGludCBsZW4sIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIGJvb2wgY2FuX2V4cGFuZF9zdGFjayxcXG4tLVxcbm1tL21lbW9yeS5jPTcyNDc9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcyNTEtXFxubW0vbWVtb3J5LmM6NzI1MjpcXHRyZXR1cm4gcmVtb3RlX3ZtX3dhbGsobW0sIGFkZHIsIGJ1ZiwgbGVuLCBndXBfZmxhZ3MsIHRydWUsXFxubW0vbWVtb3J5LmMtNzI1My1cXHRcXHRcXHQgICAgICBhY2Nlc3Nfdm1fcGFnZSwgXFx1MDAyNmVycik7XFxuLS1cXG5tbS9tZW1vcnkuYz03MzQ0PXN0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTczNTAtXFxubW0vbWVtb3J5LmM6NzM1MTpcXHRieXRlcyA9IHJlbW90ZV92bV93YWxrKG1tLCBhZGRyLCBidWYsIGxlbiwgZ3VwX2ZsYWdzLCBmYWxzZSxcXG5tbS9tZW1vcnkuYy03MzUyLVxcdFxcdFxcdCAgICAgICBjb3B5X3ZtX3N0ciwgXFx1MDAyNmVycik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjI1LjQ0Mjc1NzAwMloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4NDY5NDUwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIGNvbnNpZGVyYXRpb25zLCBmcm9tIG15IHBlcnNwZWN0aXZlIGFzIHNvbWVvbmUgZGVlcGx5IGZhbWlsaWFyIHdpdGgga2VybmVsIGludGVybmFsczpcblxuKipQcmlvcml0aXppbmcgRnV6emluZyBUYXJnZXRzIGluIHRoZSBWTSBTdWJzeXN0ZW0qKlxuXG5BbHJpZ2h0LCBsb29raW5nIGF0IHRoZSBsYW5kc2NhcGUsIGl0J3MgY2xlYXIgdGhhdCBgcmVtb3RlX3ZtX3dhbGtgLCBgZ2V0X3VzZXJfcGFnZV92bWFgLCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCwgYW5kIGBmb2xsb3dfcHRlX2JhdGNoYCBhcmUgdGhlIHJlYWwgcHJlc3N1cmUgcG9pbnRzIGluIHRoZSB2aXJ0dWFsIG1lbW9yeSBzdWJzeXN0ZW0uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYWJzb2x1dGVseSBjcml0aWNhbCwgc2VydmluZyBhcyB0aGUgZ2F0ZXdheXMgZm9yIHVzZXItc3BhY2UgaW50ZXJhY3Rpb25zIGFuZCBwYWdlIHRhYmxlIHRyYXZlcnNhbC4gVGhleSdyZSB0aGUga2luZCBvZiBmdW5jdGlvbnMgdGhhdCwgaWYgdGhleSBoYXZlIHZ1bG5lcmFiaWxpdGllcywgY291bGQgbGVhZCB0byB3aWRlc3ByZWFkIGFuZCBkZXZhc3RhdGluZyBjb25zZXF1ZW5jZXMuIFRoZXJlZm9yZSwgdGhlc2UgYXJlICphYnNvbHV0ZWx5KiB0aGUgZnVuY3Rpb25zIHRoYXQgSSB3YW50IHRvIHN1YmplY3QgdG8gaW50ZW5zZSBmdXp6aW5nIGVmZm9ydHMuIFRoZXkncmUgdGhlIGxvdy1oYW5naW5nIGZydWl0IHdoZXJlIHRoZSByZXdhcmQgaXMgaGlnaCwgYW5kIGJ1Z3MgaGF2ZSB0aGUgcG90ZW50aWFsIGZvciBkcmFtYXRpYyBpbXBhY3QuXG5cbkFuZCBzaW5jZSB3ZSBhcmUgdGFsa2luZyBhYm91dCBWTSBhbmQgbWVtb3J5LW1hbmFnZW1lbnQsIEkgc2hvdWxkIGFsc28gY2hlY2sgdGhvc2Ugb2JzY3VyZSBjb25maWd1cmF0aW9uczogYENPTkZJR19QRVJfVk1BX0xPQ0tgIGFuZCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSBhbSBzdXJlIHRoZXknbGwgYWRkIGNvbXBsZXhpdHkgdG8gdGhlIGZ1bmN0aW9ucyBJIG1lbnRpb25lZCBhYm92ZSBhbmQgYXJlIGNyaXRpY2FsIHBvaW50cyBmb3Igc2VjdXJpdHkuIFdlIG1heSBuZWVkIHRvIGFkZCBhZGRpdGlvbmFsIGZ1enppbmcgdmVjdG9ycyB0byB0YXJnZXQgdGhlc2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgYW5kIGZpbmQgbW9yZSBidWdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTkyNCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjI5LjI4OTcwNjc3N1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NjgzMjcyOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiUEVSX1ZNQV9MT0NLXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz0xNDMzPWNvbmZpZyBMUlVfR0VOX1dBTEtTX01NVVxcbi0tXFxubW0vS2NvbmZpZy0xNDM3LVxcbm1tL0tjb25maWc6MTQzODpjb25maWcgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0MzktICAgICAgIGRlZl9ib29sIG5cXG5tbS9LY29uZmlnLTE0NDAtXFxubW0vS2NvbmZpZzoxNDQxOmNvbmZpZyBQRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0NDItXFx0ZGVmX2Jvb2wgeVxcbm1tL0tjb25maWc6MTQ0MzpcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUEVSX1ZNQV9MT0NLIFxcdTAwMjZcXHUwMDI2IE1NVSBcXHUwMDI2XFx1MDAyNiBTTVBcXG5tbS9LY29uZmlnLTE0NDQtXFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzoyOS45NTgwNTE4OTdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzk2MTU5OTg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqQ2hlY2tpbmcgdGhlIFZNQSBMb2NraW5nIENvbmZpZ3VyYXRpb24qKlxuXG5BbHJpZ2h0LCBzbyB0aGUgc3lzdGVtIEknbSB3b3JraW5nIHdpdGggaXMgbGlrZWx5IGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBsZXZlcmFnZSBgUEVSX1ZNQV9MT0NLYCwgYnV0IG9ubHkgaWYgdGhlIGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBpdCwgd2hpY2ggbWFrZXMgcGVyZmVjdCBzZW5zZS4gVGhlIGNvZGUncyBhbHJlYWR5IGhhbmRsaW5nIHRoZSBjb25kaXRpb25hbCBlbmFibGluZyBiYXNlZCBvbiBgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tgLCBzbyB0aGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBOb3csIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaW50ZXJhY3RzIHdpdGggdGhlIG92ZXJhbGwgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3ksIEkgbmVlZCB0byBjb25zaWRlciB0cmFuc3BhcmVudCBodWdlcGFnZXMuIExldCBtZSBqdXN0IHF1aWNrbHkgY2hlY2sgaG93IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHNldC4gVGhhdCdsbCBnaXZlIG1lIGEgY2xlYXJlciBwaWN0dXJlIG9mIHBvdGVudGlhbCBsb2NrIGNvbnRlbnRpb24gYW5kIGhvdyB0aGVzZSBWTUEgbG9ja3MgYXJlIGludGVyYWN0aW5nIHdpdGggdGhlIGh1Z2VwYWdlIGFsbG9jYXRpb25zLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhlc2UgdHdvIGNvbmZpZ3MgYWZmZWN0IGVhY2ggb3RoZXIgc28gSSBjYW4gb3B0aW1pemUgdGhlIG1lbW9yeSBzZXR1cCBmb3IgdGhpcyB3b3JrbG9hZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY0NzQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzozMy4zNTQyMTYyMzRaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ1Mjg4MTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04Mjc9Y29uZmlnIFBFUlNJU1RFTlRfSFVHRV9aRVJPX0ZPTElPXFxubW0vS2NvbmZpZy04MjgtXFx0Ym9vbCBcXFwiQWxsb2NhdGUgYSBQTUQgc2l6ZWQgZm9saW8gZm9yIHplcm9pbmdcXFwiXFxubW0vS2NvbmZpZzo4Mjk6XFx0ZGVwZW5kcyBvbiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODMwLVxcdGhlbHBcXG4tLVxcbm1tL0tjb25maWc9ODQzPWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04NDUtXFxubW0vS2NvbmZpZzo4NDY6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODQ3LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxubW0vS2NvbmZpZzo4NDg6XFx0ZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UgXFx1MDAyNlxcdTAwMjYgIVBSRUVNUFRfUlRcXG5tbS9LY29uZmlnLTg0OS1cXHRzZWxlY3QgQ09NUEFDVElPTlxcbi0tXFxubW0vS2NvbmZpZy04NjEtXFxubW0vS2NvbmZpZzo4NjI6aWYgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTg2My1cXG5tbS9LY29uZmlnPTg2ND1jaG9pY2VcXG5tbS9LY29uZmlnLTg2NS1cXHRwcm9tcHQgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQgc3lzZnMgZGVmYXVsdHNcXFwiXFxubW0vS2NvbmZpZzo4NjY6XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2Ny1cXHRoZWxwXFxuLS1cXG5tbS9LY29uZmlnLTg2OS1cXG5tbS9LY29uZmlnOjg3MDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NzEtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzYtXFxubW0vS2NvbmZpZzo4Nzc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg3OC1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04ODUtXFxubW0vS2NvbmZpZzo4ODY6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04ODctXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg5Mz1jaG9pY2VcXG5tbS9LY29uZmlnLTg5NC1cXHRwcm9tcHQgXFxcIlNobWVtIGh1Z2VwYWdlIGFsbG9jYXRpb24gZGVmYXVsdHNcXFwiXFxubW0vS2NvbmZpZzo4OTU6XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTYtXFx0aGVscFxcbi0tXFxubW0vS2NvbmZpZy05MDItXFxubW0vS2NvbmZpZzo5MDM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTkwNC1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTEyLVxcbm1tL0tjb25maWc6OTEzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTE0LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTIwLVxcbm1tL0tjb25maWc6OTIxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MjItXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkyOC1cXG5tbS9LY29uZmlnOjkyOTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkzMC1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkzOD1jaG9pY2VcXG5tbS9LY29uZmlnLTkzOS1cXHRwcm9tcHQgXFxcIlRtcGZzIGh1Z2VwYWdlIGFsbG9jYXRpb24gZGVmYXVsdHNcXFwiXFxubW0vS2NvbmZpZzo5NDA6XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05NDEtXFx0aGVscFxcbi0tXFxubW0vS2NvbmZpZy05NDctXFxubW0vS2NvbmZpZzo5NDg6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTk0OS1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTU2LVxcbm1tL0tjb25maWc6OTU3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTU4LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTY0LVxcbm1tL0tjb25maWc6OTY1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NjYtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk3Mi1cXG5tbS9LY29uZmlnOjk3MzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk3NC1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTk5Mj1jb25maWcgTk9fUEFHRV9NQVBDT1VOVFxcbi0tXFxubW0vS2NvbmZpZy0xMDA0LVxcbm1tL0tjb25maWc6MTAwNTplbmRpZiAjIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy0xMDA2LVxcbi0tXFxubW0vS2NvbmZpZz0xMDE0PWNvbmZpZyBQR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xcbm1tL0tjb25maWc6MTAxNTpcXHRkZWZfYm9vbCBUUkFOU1BBUkVOVF9IVUdFUEFHRSB8fCBIVUdFVExCX1BBR0VcXG5tbS9LY29uZmlnLTEwMTYtXFxuLS1cXG5tbS9LY29uZmlnPTEwMjA9Y29uZmlnIEhBVkVfR0lHQU5USUNfRk9MSU9TXFxubW0vS2NvbmZpZy0xMDIxLVxcdGRlZl9ib29sIChIVUdFVExCX1BBR0UgXFx1MDAyNlxcdTAwMjYgQVJDSF9IQVNfR0lHQU5USUNfUEFHRSkgfHwgXFxcXFxcbm1tL0tjb25maWc6MTAyMjpcXHRcXHQgKFpPTkVfREVWSUNFIFxcdTAwMjZcXHUwMDI2IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRV9QVUQpXFxubW0vS2NvbmZpZy0xMDIzLVxcbi0tXFxubW0vS2NvbmZpZz0xMDI4PWNvbmZpZyBBUkNIX1NVUFBPUlRTX0hVR0VfUEZOTUFQXFxubW0vS2NvbmZpZy0xMDI5LVxcdGRlZl9ib29sIG5cXG5tbS9LY29uZmlnOjEwMzA6XFx0ZGVwZW5kcyBvbiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctMTAzMS1cXG5tbS9LY29uZmlnPTEwMzI9Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUE1EX1BGTk1BUFxcbm1tL0tjb25maWctMTAzMy1cXHRkZWZfYm9vbCB5XFxubW0vS2NvbmZpZzoxMDM0OlxcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19IVUdFX1BGTk1BUCBcXHUwMDI2XFx1MDAyNiBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTEwMzUtXFxubW0vS2NvbmZpZz0xMDM2PWNvbmZpZyBBUkNIX1NVUFBPUlRTX1BVRF9QRk5NQVBcXG5tbS9LY29uZmlnLTEwMzctXFx0ZGVmX2Jvb2wgeVxcbm1tL0tjb25maWc6MTAzODpcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfSFVHRV9QRk5NQVAgXFx1MDAyNlxcdTAwMjYgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BVRFxcbm1tL0tjb25maWctMTAzOS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDc6MzMuNTk5NTEzODUxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUxMzk5MTcxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgS2VybmVsIENvbmZpZ3VyYXRpb25zIGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgY29uZmlnOyB0aGF0IHNlZW1zIGxpa2UgYSBzb2xpZCBhZGRpdGlvbiwgZ2VuZXJhbGx5IHNwZWFraW5nLiBJJ20gYWxzbyBzZWVpbmcgcmVmZXJlbmNlcyB0byBgR1VQX1RFU1RgIGluIHRoZSBzZWxmdGVzdCBwcm9jZWR1cmUsIGJ1dCB0aGUgYWN0dWFsLCBjb3JlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWxhdGVkIGxvZ2ljIHNlZW1zIHRvIGJlIHJlc2lkaW5nIHdpdGhpbiBgbW0vZ3VwLmNgIGFuZCBgbW0vbWVtb3J5LmNgLiBJJ2xsIHdhbnQgdG8gcXVpY2tseSB2ZXJpZnkgaWYgdGhlIGBHVVBfVEVTVGAgZGVmaW5lIGlzIGFjdHVhbGx5ICpyZXF1aXJlZCogZm9yIHRoZSBmdW5jdGlvbmFsaXR5IGluIHRob3NlIGNvcmUgZmlsZXMsIG9yIGlmIGl0J3Mgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIHNlbGYtdGVzdCBwcm9jZWR1cmVzLiBIbW0sIGl0IGxvb2tzIGxpa2UgaXQgaXMganVzdCBmb3IgdGhlIHNlbGZ0ZXN0LlxuXG5Ob3csIGxldCdzIHR1cm4gbXkgYXR0ZW50aW9uIHRvIGBDT05GSUdfUklTQ1ZfSVNBX1NVUE1gLi4uIEknbGwgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGF0IG5leHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MjcxLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjM3LjExMzUxMTI4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2ODM1Mjc4MTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiUklTQ1ZfSVNBX1NVUE1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYXJjaC9yaXNjdi9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvcmlzY3YvS2NvbmZpZz01NTM9Y29uZmlnIFJJU0NWX0lTQV9DXFxuLS1cXG5hcmNoL3Jpc2N2L0tjb25maWctNTYzLVxcbmFyY2gvcmlzY3YvS2NvbmZpZzo1NjQ6Y29uZmlnIFJJU0NWX0lTQV9TVVBNXFxuYXJjaC9yaXNjdi9LY29uZmlnLTU2NS1cXHRib29sIFxcXCJTdXBtIGV4dGVuc2lvbiBmb3IgdXNlcnNwYWNlIHBvaW50ZXIgbWFza2luZ1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDc6MzcuNzk3MDUzNjcxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM3ODIzMTI1NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqTmF2aWdhdGluZyBQcm9jZXNzb3IgQXJjaGl0ZWN0dXJlcyoqXG5cblJpZ2h0LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIFJJU0MtViBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIChJU0EpIGhlcmUuIFNwZWNpZmljYWxseSwgYFJJU0NWX0lTQV9TVVBNYOKAlHRoYXQncyBhIHByZXR0eSBjbGVhciBpbmRpY2F0b3Igd2UncmUgZGVhbGluZyB3aXRoIFJJU0MtViwgYW5kIHByb2JhYmx5IHNvbWV0aGluZyB0byBkbyB3aXRoIHN1cGVydmlzb3IgbW9kZSBvciBzb21lIHJlbGF0ZWQgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiBzZXQgZXh0ZW5zaW9uLiBJJ2xsIG5lZWQgdG8gZGlnIGRlZXBlciBvbiB0aGF0IGlmIGl0IGNvbWVzIHVwLlxuXG5CdXQgbm93LCBJJ20gc3dpdGNoaW5nIGdlYXJzIGFuZCBteSBtaW5kIGlzIGF1dG9tYXRpY2FsbHkgZ29pbmcgdG8gdGhlIHg4NiBhcmNoaXRlY3R1cmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBOb3csIGEgY3JpdGljYWwgcG9pbnQgZm9yIHg4NiBpcyBgQ09ORklHX0FERFJFU1NfTUFTS0lOR2AuIFRoaXMgc3VnZ2VzdHMgc29tZXRoaW5nIGFib3V0IGhvdyBtZW1vcnkgYWRkcmVzc2VzIGFyZSBoYW5kbGVkLCBwb3RlbnRpYWxseSByZWxhdGVkIHRvIFBBRSAoUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24pLCBvciBwZXJoYXBzIGEgbW9yZSBmaW5lLWdyYWluZWQgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50IHNjaGVtZS4gSSdsbCBjaGVjayB0aGF0IHZhcmlhYmxlLCBhbmQgc2VlIGV4YWN0bHkgd2hpY2ggY29uZmlndXJhdGlvbiBmbGFncyBhcmUgaW4gdXNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODY3NSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjQxLjU3OTM3MjAwM1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk5NzEwNjQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkFERFJFU1NfTUFTS0lOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL3g4Ni9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gveDg2L0tjb25maWc9MjEzNT1jb25maWcgUkFORE9NSVpFX01FTU9SWV9QSFlTSUNBTF9QQURESU5HXFxuLS1cXG5hcmNoL3g4Ni9LY29uZmlnLTIxNDktXFxuYXJjaC94ODYvS2NvbmZpZzoyMTUwOmNvbmZpZyBBRERSRVNTX01BU0tJTkdcXG5hcmNoL3g4Ni9LY29uZmlnLTIxNTEtXFx0Ym9vbCBcXFwiTGluZWFyIEFkZHJlc3MgTWFza2luZyBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzo0MS43NzkwOTA1OTdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Njk3NDEyMTUyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBpbXBsZW1lbnRpbmcgYEFERFJFU1NfTUFTS0lOR2AgZm9yIHg4NiDigJMgZ290IGl0LiBJdCdzIHRvdWNoaW5nIGBtbS9ndXAuY2AgYW5kIGBtbS9tZW1vcnkuY2AsIHdoaWNoIGFyZSBjcml0aWNhbCBrZXJuZWwgZmlsZXMsIHNvIHRoYXQgaW1tZWRpYXRlbHkgZmxhZ3MgaXQgYXMgaW50ZXJlc3RpbmcuIEkgc2VlIGEgd2hvbGUgc2xldyBvZiBuZXcgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gdGhpcyBwYXRjaDogYGdldF91c2VyX3BhZ2Vfdm1hYCwgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAsIGByZW1vdGVfdm1fd2Fsa2AsIGBhY2Nlc3Nfdm1fcGFnZWAsIGBjb3B5X3ZtX3N0cmAsIGFuZCBgZm9sbG93X3B0ZV9iYXRjaGAuIFRoZXNlIGFyZSBzY3JlYW1pbmcgZm9yIGZ1enppbmcsIG5vIGRvdWJ0LlxuXG5MZXQncyBtYWtlIGEgbGlzdCBvZiB0aGUga2V5IHN5bWJvbHMgdG8gZm9jdXMgb24uIE9rYXksIHNvIHdlJ3ZlIGdvdCB0aGUgb3JpZ2luYWwgbGlzdCwgYnV0IG5vdyB3ZSBzaG91bGQgYWxzbyBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9uczpcbi0gYGZhdWx0aW5fcGFnZWBcbi0gYF9fYWNjZXNzX3JlbW90ZV92bWBcbi0gYF9fY29weV9yZW1vdGVfdm1fc3RyYFxuXG5Ob3csIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGNsZWFyOiBwcmlvcml0aXplIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIGVudHJ5IHBvaW50cy4gU28sIGxldCdzIHNlZSBpZiB0aG9zZSBuZXcgZnVuY3Rpb25zIGFyZSBzdGF0aWMgYmVjYXVzZSBzdGF0aWMgaGVscGVycyBhcmUgb2Z0ZW4gaW5saW5lZCBhbmQgZG9uJ3Qgb2ZmZXIgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBmb3IgZnV6emluZy4gRGFtbiwgbG9va3MgbGlrZSB0aGV5IGFyZSBhbGwgc3RhdGljIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBmb3IgZnV6emluZyFcblxuT2theSwgbGV0J3MgZGlnIGludG8gdGhlIG5vbi1zdGF0aWMgZW50cnkgcG9pbnRzIGluIGBtbS9tZW1vcnkuY2AuIEkgc2VlIGBhY2Nlc3NfcmVtb3RlX3ZtYCBhbmQgYGFjY2Vzc19wcm9jZXNzX3ZtYCAoYm90aCBgRVhQT1JUX1NZTUJPTF9HUExgKS4gIEFuZCB0aGVuIGBjb3B5X2Zyb21fdXNlcl9wYWdlYCBhbmQgYGNvcHlfdG9fdXNlcl9wYWdlYCB0aGF0IHdlcmVuJ3QgY2hhbmdlZC4gR29vZC4gV2FpdCwgaXQgbG9va3MgbGlrZSBgX19hY2Nlc3NfcmVtb3RlX3ZtYCBpcyBjYWxsZWQgYnkgYGFjY2Vzc19yZW1vdGVfdm1gIGFuZCBgYWNjZXNzX3Byb2Nlc3Nfdm1gLiBMb29rcyBsaWtlIGBfX2NvcHlfcmVtb3RlX3ZtX3N0cmAgaXMgY2FsbGVkIGJ5IGBjb3B5X3JlbW90ZV92bV9zdHJgLiBJcyB0aGlzIGV4cG9ydGVkPyBJIHNob3VsZCBjaGVjayB0aGlzLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDQ4LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjQ4Ljc1MzIxODM1NloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwNjg0OTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcHlfcmVtb3RlX3ZtX3N0clwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnkuYz03MzA0PXN0YXRpYyBpbnQgY29weV92bV9zdHIoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLFxcbi0tXFxubW0vbWVtb3J5LmMtNzM0My0gKi9cXG5tbS9tZW1vcnkuYzo3MzQ0OnN0YXRpYyBpbnQgX19jb3B5X3JlbW90ZV92bV9zdHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5tbS9tZW1vcnkuYy03MzQ1LVxcdFxcdFxcdFxcdHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL21lbW9yeS5jLTczNjItLyoqXFxubW0vbWVtb3J5LmM6NzM2MzogKiBjb3B5X3JlbW90ZV92bV9zdHIgLSBjb3B5IGEgc3RyaW5nIGZyb20gYW5vdGhlciBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZS5cXG5tbS9tZW1vcnkuYy03MzY0LSAqIEB0c2s6XFx0dGhlIHRhc2sgb2YgdGhlIHRhcmdldCBhZGRyZXNzIHNwYWNlXFxuLS1cXG5tbS9tZW1vcnkuYy03Mzc1LSAqL1xcbm1tL21lbW9yeS5jOjczNzY6aW50IGNvcHlfcmVtb3RlX3ZtX3N0cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTczNzctXFx0XFx0ICAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL21lbW9yeS5jLTczOTAtXFxubW0vbWVtb3J5LmM6NzM5MTpcXHRyZXQgPSBfX2NvcHlfcmVtb3RlX3ZtX3N0cihtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XFxubW0vbWVtb3J5LmMtNzM5Mi1cXG4tLVxcbm1tL21lbW9yeS5jLTczOTYtfVxcbm1tL21lbW9yeS5jOjczOTc6RVhQT1JUX1NZTUJPTF9HUEwoY29weV9yZW1vdGVfdm1fc3RyKTtcXG5tbS9tZW1vcnkuYy03Mzk4LSNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDc6NDguOTgzOTE4ODAxWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzODM0NjY2MzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1lbW9yeSBBY2Nlc3MgRnVuY3Rpb25zIGluIHRoZSBLZXJuZWwqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBvZiBgbW0vbWVtb3J5LmNgIGhhcyBmbGFnZ2VkIGBhY2Nlc3NfcmVtb3RlX3ZtYCwgYGFjY2Vzc19wcm9jZXNzX3ZtYCwgYW5kIGBjb3B5X3JlbW90ZV92bV9zdHJgIGFzIHRoZSBrZXkgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zLCBiYXNlZCBvbiB0aGVpciBuYW1lcywgdGhhdCBsaWtlbHkgaGFuZGxlIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgYWNjZXNzIGFuZCBtZW1vcnkgY29weWluZyBvcGVyYXRpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgYW5kIGJlaGF2aW9yLlxuXG5Ob3csIHNoaWZ0aW5nIGZvY3VzIHRvIGBtbS9ndXAuY2AsIEkndmUgaWRlbnRpZmllZCBzZXZlcmFsIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdC4gYGdldF91c2VyX3BhZ2Vfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYXJlIG5vbi1zdGF0aWMgYW5kIGFwcGVhciBjcml0aWNhbCB0byB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIGEgdXNlciBwYWdlIGFuZCBsb29rdXBzLiBgX19nZXRfdXNlcl9wYWdlc2AgaXMgc3RhdGljIHdoaWNoIG1ha2VzIGl0IGEgaGVscGVyIGZ1bmN0aW9uIHdpdGhpbiB0aGUgYGd1cC5jYCBmaWxlLiBJJ2xsIG5lZWQgdG8gc2VlIGhvdyBgZ2V0X3VzZXJfcGFnZXNgLCBgcGluX3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIGFyZSB0aWVkIHRvIHRob3NlIGZ1bmN0aW9ucywgZXNwZWNpYWxseSB0aGUgb25lcyB0aGF0IGFyZSBhbHNvIG5vbi1zdGF0aWMuIFRoZSAncmVtb3RlJyBmdW5jdGlvbnMgYXJlIHByb2JhYmx5IGNydWNpYWwgdG8gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgYXJjaGl0ZWN0dXJlLCBhcyB0aGV5IGRlYWwgd2l0aCBjcm9zcy1WTSBhY2Nlc3MuXG5cblRoZSBjb3JlIHF1ZXN0aW9uIG5vdyBpcywgd2hhdCdzIGhhcHBlbmluZyB3aXRoaW4gYGdldF91c2VyX3BhZ2Vfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWA/IEknbGwgbmVlZCB0byBkaWcgaW50byB0aG9zZSBmdW5jdGlvbnMgdG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmlzbXMgYW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggdGhlIG92ZXJhbGwgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3kuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNDEwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA3OjUzLjM2NzM5MDI2MloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjYxNDAxNTU0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImdldF91c2VyX3BhZ2Vfdm1hXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTExNTA9c3RhdGljIGludCBmYXVsdGluX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy0xMjM4LS8qXFxubW0vZ3VwLmM6MTIzOTogKiBnZXRfdXNlcl9wYWdlX3ZtYSAtIGdldCBvbmUgcGFnZSBmcm9tIEB2bWEsIHdob3NlIGxvY2sgdGhlIGNhbGxlciBhbHJlYWR5XFxubW0vZ3VwLmMtMTI0MC0gKiBob2xkczogdGhlIG1tYXAgbG9jaywgb3IgKHdpdGggRk9MTF9WTUFfTE9DSykgdGhlIHBlci1WTUEgbG9jay4gV2Fsa3MgdGhlXFxuLS1cXG5tbS9ndXAuYy0xMjUyLSAqL1xcbm1tL2d1cC5jOjEyNTM6c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0vZ3VwLmMtMTI1NC1cXHRcXHRcXHQgICAgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL2d1cC5jLTEzNTItICogTG9va3MgdXAgdGhlIFZNQSwgYW5kIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgdGhyb3VnaFxcbm1tL2d1cC5jOjEzNTM6ICogZ2V0X3VzZXJfcGFnZV92bWEoKSwgZmF1bHRpbmcgaW4gdGhlIHBhZ2UgaWYgbmVlZGVkLlxcbm1tL2d1cC5jLTEzNTQtICpcXG4tLVxcbm1tL2d1cC5jPTEzNTg9c3RydWN0IHBhZ2UgKmdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vZ3VwLmMtMTM3My1cXG5tbS9ndXAuYzoxMzc0OlxcdHBhZ2UgPSBnZXRfdXNlcl9wYWdlX3ZtYSh2bWEsIGFkZHIsIGd1cF9mbGFncyB8IEZPTExfUkVNT1RFIHwgRk9MTF9UT1VDSCk7XFxubW0vZ3VwLmMtMTM3NS1cXHRpZiAoSVNfRVJSKHBhZ2UpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowNzo1NC4wMjg4MzA2MDZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODE1ODIyMTA3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipSZWZpbmluZyB0aGUgRm9jdXMgZm9yIFN5c3RlbSBDYWxsIEFuYWx5c2lzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgYW5hbHlzaXMuIEZpcnN0LCBJIGNvbmZpcm1lZCB0aGF0IGBnZXRfdXNlcl9wYWdlX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgIGFyZSBpbmRlZWQgbm9uLXN0YXRpYyDigJMgdGhhdCdzIGdvb2QgZm9yIG91ciBwdXJwb3Nlcy4gTm93LCBsZXQncyBsb29rIGF0IGBmb2xsb3dfcGFnZV9tYXNrYCAtIGl0J3Mgc3RhdGljLCBzbyBpdCdzIG5vdCBhIGRpcmVjdCBlbnRyeSBwb2ludC4gSG93ZXZlciwgYF9fZ2V0X3VzZXJfcGFnZXNgICppcyogc3RhdGljIGFuZCBjYWxscyBpdC4gYF9fZ2V0X3VzZXJfcGFnZXNgIGlzIGNhbGxlZCBieSBhIGhvc3Qgb2YgZnVuY3Rpb25zIGluY2x1ZGluZyBgZ2V0X3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYHBpbl91c2VyX3BhZ2VzYCBhbmQgYSBmZXcgb3RoZXJzLlxuXG5NeSBpbml0aWFsIHRob3VnaHQgd2FzIHRvIGluY2x1ZGUgdGhvc2UsIGJ1dCB0aGUgaW5zdHJ1Y3Rpb25zIHdhcm4gYWdhaW5zdCBpbmNsdWRpbmcgZ2VuZXJpYyBcImhvdCBwYXRoXCIgZnVuY3Rpb25zIHRvIGF2b2lkIHNrZXdpbmcgdGhlIHRlc3QgZGlzdHJpYnV0aW9ucy4gSSBuZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gYGdldF91c2VyX3BhZ2VzYCBhbmQgYHBpbl91c2VyX3BhZ2VzYCBhcmUgZGVmaW5pdGVseSBpbiB0aGF0IGhvdCBwYXRoIGNhdGVnb3J5LlxuXG5TbyBJJ3ZlIHJlZmluZWQgdGhlIGNvcmUgZm9jdXMgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMsIGF2b2lkaW5nIHRoZSBob3QgcGF0aHM6XG5cbiogICBgZ2V0X3VzZXJfcGFnZV92bWFgXG4qICAgYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWBcbiogICBgYWNjZXNzX3JlbW90ZV92bWBcbiogICBgYWNjZXNzX3Byb2Nlc3Nfdm1gXG4qICAgYGNvcHlfcmVtb3RlX3ZtX3N0cmBcblxuVGhvc2Ugc2hvdWxkIHByb3ZpZGUgYSBtb3JlIHRhcmdldGVkIHZpZXcuXG5cbk5vdywgbGV0J3MgbW92ZSBvbiB0byB0aGUgY29uZmlndXJhdGlvbnMuIEkgbmVlZCB0byBub3RlIGFueSByZWxldmFudCBvbmVzLiBJJ20gc2VlaW5nOlxuXG4qICAgYFBFUl9WTUFfTE9DS2AgKGRlcGVuZGVudCBvbiBgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tgLCBgTU1VYCwgYW5kIGBTTVBgKVxuKiAgIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWBcbiogICBgUklTQ1ZfSVNBX1NVUE1gXG4qICAgYEFERFJFU1NfTUFTS0lOR2BcblxuSSBoYXZlIHRvIG1ha2Ugc3VyZSBgUEVSX1ZNQV9MT0NLYCBpcyBlbmFibGVkIHByb3Blcmx5Li4uIEFoLCBpdCdzIGEgYGRlZl9ib29sIHlgIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgY29uZmlncy4gVGhhdCdzIGZpbmUsIEkgY2FuIGxpc3QgaXQuIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgYSBtZW51Y29uZmlnLCB3aGljaCBtZWFucyBpdCB3aWxsIG5lZWQgdG8gYmUgZXhwbGljaXRseSBzZXQuIGBSSVNDVl9JU0FfU1VQTWAgYW5kIGBBRERSRVNTX01BU0tJTkdgIGFyZSBqdXN0IGJvb2xzLlxuXG5JIHdpbGwgYWxzbyBxdWlja2x5IGNoZWNrIGBCUEZfU1lTQ0FMTGAgd2l0aCByZWxhdGlvbiB0byBgY29weV9yZW1vdGVfdm1fc3RyYCBiZWNhdXNlIEkgcmVjYWxsIGEgcG90ZW50aWFsIGxpbmsgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMxMzY2LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTk0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjAyLjE4NzA1NjUxNFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ5MTI0MjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJQRl9TWVNDQUxMXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTcyOTU9RVhQT1JUX1NZTUJPTF9HUEwoYWNjZXNzX3Byb2Nlc3Nfdm0pO1xcbm1tL21lbW9yeS5jLTcyOTYtXFxubW0vbWVtb3J5LmM6NzI5NzojaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vbWVtb3J5LmMtNzI5OC0vKlxcbi0tXFxubW0vbWVtb3J5LmM9NzM5Nz1FWFBPUlRfU1lNQk9MX0dQTChjb3B5X3JlbW90ZV92bV9zdHIpO1xcbm1tL21lbW9yeS5jOjczOTg6I2VuZGlmIC8qIENPTkZJR19CUEZfU1lTQ0FMTCAqL1xcbm1tL21lbW9yeS5jLTczOTktXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjAyLjQzNjE5MTM4OVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDEwMDc3MDA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipLZXJuZWwgSW50ZXJuYWxzOiBSZW1vdGUgVk0gU3RyaW5nIENvcHkgYW5kIEkvTyBSZW1hcHBpbmcqKlxuXG5SaWdodCwgc28sIGFzIEkgc2VlIGl0LCB0aGUgaW5jbHVzaW9uIG9mIGBCUEZfU1lTQ0FMTGAgaXMgZGVmaW5pdGVseSBuZWNlc3NhcnkgZm9yIHRoZSBgY29weV9yZW1vdGVfdm1fc3RyYCBmdW5jdGlvbi4gSXTigJlzIHByZXR0eSBjbGVhciBmcm9tIHRoZSBjb250ZXh0LiBXZeKAmXJlIGRlYWxpbmcgd2l0aCBhIHN5c3RlbSBjYWxsIGludm9sdmVkIGluIGNvcHlpbmcgc3RyaW5ncyBmcm9tIGEgcmVtb3RlIHZpcnR1YWwgbWFjaGluZSwgc28gdGhlIEJQRiBob29rcyBhbmQgY2FwYWJpbGl0aWVzIGFyZSBmdW5kYW1lbnRhbGx5IHJlcXVpcmVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIGFuZCBzZWN1cml0eSBpbiB0aGF0IHNjZW5hcmlvLiBNYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG5Ob3csIG9uIHRoZSBvdGhlciBoYW5kLCBmb3IgaGFuZGxpbmcgdGhvc2UgYGFjY2Vzc19yZW1vdGVfdm1hX29wc2Agb3BlcmF0aW9ucywgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IGBIQVZFX0lPUkVNQVBfUFJPVGAgaXMgZGVmaW5lZC4gVGhpcyBpcyBhIGNyaXRpY2FsIGNoZWNrIHRvIGVuc3VyZSB3ZSBoYXZlIHRoZSBuZWNlc3NhcnkgaGFyZHdhcmUgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIEkvTyByZW1hcHBpbmcuIFdlIGhhdmUgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyBleGlzdCBiZWZvcmUgd2UgZXZlbiB0aGluayBhYm91dCB0b3VjaGluZyB0aGUgcmVtb3RlIFZNJ3MgbWVtb3J5IGFuZCB0cnlpbmcgdG8gcmVhZCBvciB3cml0ZSBpdC4gSSdsbCBuZWVkIHRvIGdvIG92ZXIgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zIGFuZCBlbnN1cmUgdGhhdCB0aGUgcmlnaHQgY2hlY2tzIGFyZSBpbiBwbGFjZS4gVGhpcyBpcyB3aGVyZSB0aGUgaW50cmljYWNpZXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBhbmQgaGFyZHdhcmUgYmVjb21lIGNyaXRpY2FsLCBhbmQgSSB3YW50IHRvIGJlIDEwMCUgY2VydGFpbiB3ZSdyZSBoYW5kbGluZyB0aGF0IHJlbWFwcGluZyBzYWZlbHkgYW5kIHJlbGlhYmx5LiBHb3R0YSBjb3ZlciBhbGwgdGhlIGJhc2VzIVxuXG5cbiIsIklucHV0VG9rZW5zIjozMjY2MiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjA2LjQ0NjI3MjYxOFoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg0NzUxNTIyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkhBVkVfSU9SRU1BUF9QUk9UXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTY5NTE9RVhQT1JUX1NZTUJPTF9HUEwoZm9sbG93X3Bmbm1hcF9lbmQpO1xcbm1tL21lbW9yeS5jLTY5NTItXFxubW0vbWVtb3J5LmM6Njk1MzojaWZkZWYgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UXFxubW0vbWVtb3J5LmMtNjk1NC0vKipcXG4tLVxcbm1tL21lbW9yeS5jPTcwMjY9c3RhdGljIGludCBhY2Nlc3NfcmVtb3RlX3ZtYV9vcHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcwMjgte1xcbm1tL21lbW9yeS5jOjcwMjk6I2lmZGVmIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVFxcbm1tL21lbW9yeS5jLTcwMzAtXFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjA2LjYzMTAzNjAxWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MzE5MjUwNjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzLCBnaXZlbiBteSBleHBlcnRpc2U6XG5cbioqQ2hlY2tpbmcgS2VybmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqXG5cblJpZ2h0LCBgSEFWRV9JT1JFTUFQX1BST1RgIGlzIGRlZmluaXRlbHkgd29ydGggYWRkaW5nIHRvIG15IG1lbnRhbCBjaGVja2xpc3Qgd2hlbiByZXZpZXdpbmcgdGhpcyBrZXJuZWwgY29uZmlndXJhdGlvbi4gSXQncyBhIHNpZ25pZmljYW50IGluZGljYXRvciBvZiBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIG1lbW9yeS1tYXBwZWQgSS9PLCBhbmQgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgdGhhdCBmZWF0dXJlIGNhbiBoYXZlIGEgcHJvZm91bmQgaW1wYWN0IG9uIGRldmljZSBkcml2ZXIgZGV2ZWxvcG1lbnQgYW5kIHBlcmZvcm1hbmNlLiBLbm93aW5nIHdoZXRoZXIgd2UgaGF2ZSBwcm90ZWN0aW9uIGVuYWJsZWQgZHVyaW5nIHJlbWFwcGluZyBpcyBjcnVjaWFsIGZvciBzZWN1cml0eSBhbmQgc3RhYmlsaXR5LlxuXG5Ob3csIGxldCdzIHBpdm90IHRvIHRoZSBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgb3B0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoYXQgb25lLiBJJ20gcmVjYWxsaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgUkNVIHdpdGggcmVzcGVjdCB0byBmcmVlaW5nIE1NVSB0YWJsZXMuIFdlIG5lZWQgdG8gZXZhbHVhdGUgd2hldGhlciBlbmFibGluZyB0aGF0IG9wdGlvbiBtYWtlcyBzZW5zZSBmb3IgdGhlIGN1cnJlbnQgdXNlIGNhc2UsIG9yIGlmIGl0IG1pZ2h0IHByZXNlbnQgcHJvYmxlbXMgd2l0aCB0aGUgYXJjaGl0ZWN0dXJlLiBUaW1lIHRvIGRlbHZlIGludG8gdGhlIGRldGFpbHMgYW5kIGNvbnNpZGVyIHRoZSBtZW1vcnkgbWFuYWdlbWVudCB0cmFkZW9mZnMgdGhpcyBlbnRhaWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMzIxOSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjEwLjE2Mjk2NjI5OFoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ2MTY1NzY2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIk1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LmM9NzA1MD1zdGF0aWMgYm9vbCByZW1vdGVfYWNjZXNzX2xvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcwNTUtXFxubW0vbWVtb3J5LmM6NzA1NjojaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZNQV9MT0NLKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19NTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFKVxcbm1tL21lbW9yeS5jLTcwNTctXFx0dm1hID0gbG9ja192bWFfdW5kZXJfcmN1KG1tLCBhZGRyKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MTAuNDA5MTQ1NDc1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4NjYwNjE0NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQ29uZmlndXJhdGlvbiBBdWRpdCoqXG5cbk9rYXksIGxldCdzIHJlZmluZSB0aGlzIGxpc3Qgb2YgaW50ZXJlc3Rpbmcga2VybmVsIGNvbmZpZ3VyYXRpb25zLiBXZSd2ZSBnb3QgYSBzb2xpZCBzdGFydGluZyBwb2ludDogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEJQRl9TWVNDQUxMYCwgYEhBVkVfSU9SRU1BUF9QUk9UYCwgYFJJU0NWX0lTQV9TVVBNYCwgYW5kIGBBRERSRVNTX01BU0tJTkdgLiBHb29kLCBnb29kLi4uIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCBkZWZpbml0ZWx5IGFkZCBgTU1VX0dBVEhFUl9SQ1VfVEFCTEVfRlJFRWAgdG8gdGhhdCBsaXN0OyBpdCdzIGdvdCByZWFsIHBvdGVudGlhbCBmb3IgYW5hbHlzaXMuXG5cbk5vdywgbGV0J3MgZGlnIGludG8gYEhBVkVfSU9SRU1BUF9QUk9UYCBhbmQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgIHNwZWNpZmljYWxseS4gTmVlZCB0byBkZXRlcm1pbmUgaWYgdGhleSdyZSBldmVuICpzZWxlY3RhYmxlKiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBHb3R0YSBjaGVjayB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25zdHJhaW50cy4gV2UnbGwgYmUgYWJsZSB0byB0ZWxsIG11Y2ggbW9yZSBvbmNlIHdlIGtub3cgd2hldGhlciB0aGVzZSBhcmUgaW4gc2NvcGUgb3Igbm90LlxuXG5cbiIsIklucHV0VG9rZW5zIjozMzYzMSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODoxNC4yNzUyMTIwNDhaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4NjE5NzAwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJIQVZFX0lPUkVNQVBfUFJPVFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9LY29uZmlnPTI1OD1jb25maWcgVVNFUl9SRVRVUk5fTk9USUZJRVJcXG4tLVxcbmFyY2gvS2NvbmZpZy0yNjQtXFxuYXJjaC9LY29uZmlnOjI2NTpjb25maWcgSEFWRV9JT1JFTUFQX1BST1RcXG5hcmNoL0tjb25maWctMjY2LVxcdGJvb2xcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MTQuNDYxNDE5OVoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjgxNjAzOTgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkNvbnNpZGVyaW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIE9wdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBhbmQgdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIGBIQVZFX0lPUkVNQVBfUFJPVGAuIFRoaXMgb25lJ3MgYSBiaXQgb2YgYSBzcGVjaWFsIGNhc2UuIEl0J3MgYSBoaWRkZW4gYm9vbCwgcmlnaHQ/IEFyY2hpdGVjdHVyZS1zcGVjaWZpYy4gVGhlIHdob2xlIHBvaW50IGlzLCBpdCdzIG5vdCBzb21ldGhpbmcgd2UgZXhwb3NlIGZvciB1c2VycyB0byB0d2VhayBkaXJlY3RseS4gV2Ugc2hvdWxkbid0IGV2ZW4gbGlzdCBpdDsgaXQncyBpbXBsaWNpdC4gTm8gcG9pbnQgaW4gY2x1dHRlcmluZyB0aGUgYXZhaWxhYmxlIGNob2ljZXMgd2l0aCBzb21ldGhpbmcgdGhhdCBjYW4ndCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuIFRoYXQgd291bGQganVzdCBiZSBjb25mdXNpbmcuXG5cbk5leHQgdXAsIHdoYXQgYWJvdXQgYE1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVgPyBJIG5lZWQgdG8gdGhpbmsgdGhpcyBvbmUgdGhyb3VnaCBjYXJlZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0MDYwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MTguMTQzMDI4OFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjI0NTg5MTA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIk1NVV9HQVRIRVJfUkNVX1RBQkxFX0ZSRUVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYXJjaC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvS2NvbmZpZz01MTI9Y29uZmlnIE1NVV9HQVRIRVJfVEFCTEVfRlJFRVxcbi0tXFxuYXJjaC9LY29uZmlnLTUxNC1cXG5hcmNoL0tjb25maWc6NTE1OmNvbmZpZyBNTVVfR0FUSEVSX1JDVV9UQUJMRV9GUkVFXFxuYXJjaC9LY29uZmlnLTUxNi1cXHRib29sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjE4Ljc2NzYyNjY2NloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjc3MDE2MDM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aG9zZSB0aG91Z2h0cyBmcm9tIGEgZmlyc3QtcGVyc29uLCBleHBlcnQgcGVyc3BlY3RpdmUsIGtlZXBpbmcgaXQgY29uY2lzZSBhbmQgZm9jdXNpbmcgb24gdGhlIHVuZGVybHlpbmcgcmVhc29uaW5nOlxuXG4qKkhpZGRlbiBCb29sZWFuIGFuZCBWTUEgTG9jayBDb25zaWRlcmF0aW9ucyoqXG5cbkFscmlnaHQsIHNvIEknbSB0aGlua2luZyBhYm91dCB0aGlzIGRhdGEgc3RydWN0dXJlIGFuZCBJIHNlZSB0aGlzIFwiaGlkZGVuIGJvb2wuXCIgSXQncyBpbnRlbnRpb25hbGx5IGhpZGRlbiwgYW5kIHdlIHNob3VsZG4ndCByZXZlYWwgaXQgb3IgaW5jbHVkZSBpdCBpbiBvdXIgbGlzdGluZ3MuIFRoZSBkZXNpZ24gY2hvaWNlIGlzIGNsZWFyIOKAkyBpdCdzIGFuIGludGVybmFsIGRldGFpbCwgbWF5YmUgYW4gb3B0aW1pemF0aW9uLCBhbmQgZXhwb3NpbmcgaXQgd291bGQganVzdCBjbHV0dGVyIHRoaW5ncyBmb3IgdGhlIHVzZXIgYW5kIHBvdGVudGlhbGx5IGxlYWQgdG8gbWlzdXNlLiBXZSBzaG91bGQgbWFpbnRhaW4gdGhlIGFic3RyYWN0aW9uIGxldmVsLlxuXG5UaGVuIG15IG1pbmQganVtcHMgdG8gdGhlIGBQRVJfVk1BX0xPQ0tgLiAgSSdtIHdvbmRlcmluZyBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IGNob2ljZSBvciBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IHBsYWNlIGZvciBpdC4gVGhpbmtpbmcgYWJvdXQgdGhlIHBvdGVudGlhbCBjb250ZW50aW9uLCB0aGUgc2NvcGUgb2YgcHJvdGVjdGlvbiwgYW5kIHRoZSBzcGVjaWZpYyBvcGVyYXRpb25zIGl0J3MgZ3VhcmRpbmcuIElzIGl0IHJlYWxseSB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIHRoZSBjb25jdXJyZW5jeSBjaGFsbGVuZ2VzPyBXaGF0IGFyZSB0aGUgYWx0ZXJuYXRpdmVzPyBBcmUgdGhlcmUgb3RoZXIgbG9ja3MgdGhhdCBwcm92aWRlIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSwgYnV0IG1heSBiZSBtb3JlIHBlcmZvcm1hbnQgaW4gdGhlIGNpcmN1bXN0YW5jZXM/IE9yIHNob3VsZCB3ZSBleHBsb3JlIGEgbG9jay1mcmVlIHNvbHV0aW9uPyBXZSBuZWVkIHRvIHdlaWdoIHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0Mzc3LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MjIuMDQ0NjQ4MjgzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDMyOTI2NjgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiUEVSX1ZNQV9MT0NLXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz0xNDMzPWNvbmZpZyBMUlVfR0VOX1dBTEtTX01NVVxcbi0tXFxubW0vS2NvbmZpZy0xNDM3LVxcbm1tL0tjb25maWc6MTQzODpjb25maWcgQVJDSF9TVVBQT1JUU19QRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0MzktICAgICAgIGRlZl9ib29sIG5cXG5tbS9LY29uZmlnLTE0NDAtXFxubW0vS2NvbmZpZzoxNDQxOmNvbmZpZyBQRVJfVk1BX0xPQ0tcXG5tbS9LY29uZmlnLTE0NDItXFx0ZGVmX2Jvb2wgeVxcbm1tL0tjb25maWc6MTQ0MzpcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUEVSX1ZNQV9MT0NLIFxcdTAwMjZcXHUwMDI2IE1NVSBcXHUwMDI2XFx1MDAyNiBTTVBcXG5tbS9LY29uZmlnLTE0NDQtXFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODoyMi4yODc5NTE2ODFaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjYzNDM4NjU2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLZXJuZWwgUGF0Y2gncyBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBzbyBsb29raW5nIGF0IHRoaXMgcGF0Y2gsIEkgc2VlIHRoYXQgYFBFUl9WTUFfTE9DS2AgaXMgZGVmaW5lZCBhcyBhIGBkZWZfYm9vbCB5YCwgd2hpY2ggbWVhbnMgaXQncyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgaWYgaXRzIGRlcGVuZGVuY2llcyBhcmUgbWV0LiBJIGRvbid0IG5lZWQgdG8gZXhwbGljaXRseSBsaXN0IGl0IGZvciBjb25maWd1cmF0aW9uIHB1cnBvc2VzLlxuXG5UaGVyZWZvcmUsIHRoZSBrZXkgY29uZmlndXJhdGlvbnMgdG8gd2F0Y2ggb3V0IGZvciBhcmU6IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBCUEZfU1lTQ0FMTGAsIGBSSVNDVl9JU0FfU1VQTWAsIGFuZCBgQUREUkVTU19NQVNLSU5HYC4gVGhvc2UgYXJlIHRoZSByZWxldmFudCBrbm9icyB0byBjb25zaWRlciB3aGVuIHRlc3RpbmcuXG5cbk5vdywgbGV0J3MgcmV2aWV3IHRoZSBjcml0aWNhbCBzeW1ib2xzIHRoaXMgcGF0Y2ggdG91Y2hlcy4gVGhlIG9uZXMgdGhhdCBpbW1lZGlhdGVseSBzdGFuZCBvdXQgYXJlIGBnZXRfdXNlcl9wYWdlX3ZtYWAsIGBnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFgLCBgYWNjZXNzX3JlbW90ZV92bWAsIGBhY2Nlc3NfcHJvY2Vzc192bWAsIGFuZCBgY29weV9yZW1vdGVfdm1fc3RyYC4gWXVwLCB0aG9zZSBhbGwgbG9vayBsaWtlIHRoZSByaWdodCBzZXQgb2YgcHJpbWl0aXZlcyB0byBmb2N1cyBvbi5cblxuTXkgcmVhc29uaW5nPyBUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBicmFuZCBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIHZpYSBgcmVtb3RlX3ZtX3dhbGtgIGFuZCBpcyByZXBsYWNpbmcgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBicmluZ3MgYmF0Y2hpbmcgc3VwcG9ydCBmb3IgUFRFLW1hcHBlZCBsYXJnZSBmb2xpb3MgKG1USFApIGluIHRoZSBzbG93ZXIgR1VQIHBhdGguIFRoaXMgaW5kaWNhdGVzIHNvbWUgKnNpZ25pZmljYW50KiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMuIFRoZXNlIGNoYW5nZXMgYXJlIGdvaW5nIHRvIGltcGFjdCBwYWdlIGZhdWx0IGhhbmRsaW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyBvcGVyYXRpb25zICh0aGluZ3MgbGlrZSBwdHJhY2UsIGFjY2Vzc2luZyBgL3Byb2MvcGlkL21lbWApLCBhbmQgZXZlbiBCUEYgc3RyaW5nIGNvcHlpbmcuIFRoaXMgbWVhbnMgZnV6emluZyBlZmZvcnRzIHNob3VsZCBhYnNvbHV0ZWx5IGNvbmNlbnRyYXRlIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCB0aGUgcmVtb3RlIGFjY2VzcyBBUElzLlxuXG5KdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0IG1lIHF1aWNrbHkgZG91YmxlLWNoZWNrIGlmIGBhY2Nlc3NfcmVtb3RlX3ZtYCBpcyBleHBvcnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQ4MzQsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MjguOTIyMzQ0MDU4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTU5MzE3NTYsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0xfR1BMXFxcXChhY2Nlc3NfcmVtb3RlX3ZtXFxcXClcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjI5LjExODI4ODcxNFoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzY0NTAxMzEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6XG5cbioqRGl2aW5nIGludG8gdGhlIGBtbS9tZW1vcnkuY2AgUmFiYml0IEhvbGUqKlxuXG5Pa2F5LCBiZWZvcmUgSSBnbyBhbnkgZnVydGhlciwgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGFjY2Vzc19yZW1vdGVfdm1gLiBJdCdzIGNydWNpYWwsIGFuZCB0aGUgY29udGV4dCBvZiBtZW1vcnkgYWNjZXNzIGlzIGNyaXRpY2FsLiBMZXQncyBzZWUgaG93IHRoYXQgZnVuY3Rpb24gaXMgZGVmaW5lZCB3aXRoaW4gdGhlIGBtbS9tZW1vcnkuY2AgbW9kdWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBoYW5kbGVzIHJlbW90ZSB2aXJ0dWFsIG1hY2hpbmUgbWVtb3J5IGFjY2VzcyBzcGVjaWZpY2FsbHkg4oCTIGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIG9yIHJhY2UgY29uZGl0aW9ucyB0aGVyZSBjb3VsZCBiZSBuYXN0eS4gSSdsbCBuZWVkIHRvIGxvb2sgdmVyeSBjbG9zZWx5IGF0IHRoZSBjb2RlIGFuZCBzZWUgZXhhY3RseSB3aGF0J3MgaGFwcGVuaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNTU3NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjMyLjg4Mjc5NDU2N1oiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE3NDY5NzI0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFjY2Vzc19yZW1vdGVfdm1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LmM9NzAxND1FWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX2FjY2Vzc19waHlzKTtcXG4tLVxcbm1tL21lbW9yeS5jLTcwMjUtICovXFxubW0vbWVtb3J5LmM6NzAyNjpzdGF0aWMgaW50IGFjY2Vzc19yZW1vdGVfdm1hX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTcwMjctXFx0XFx0XFx0XFx0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKVxcbi0tXFxubW0vbWVtb3J5LmM9NzIxMT1zdGF0aWMgaW50IGFjY2Vzc192bV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL21lbW9yeS5jLTcyMTgtXFx0aWYgKCFwYWdlKSB7XFxubW0vbWVtb3J5LmM6NzIxOTpcXHRcXHRieXRlcyA9IGFjY2Vzc19yZW1vdGVfdm1hX29wcyh2bWEsIGFkZHIsICpidWYsIGxlbiwgd3JpdGUpO1xcbm1tL21lbW9yeS5jLTcyMjAtXFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2UgMClcXG4tLVxcbm1tL21lbW9yeS5jLTcyNDYtICovXFxubW0vbWVtb3J5LmM6NzI0NzpzdGF0aWMgaW50IF9fYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTcyNDgtXFx0XFx0XFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxcbi0tXFxubW0vbWVtb3J5LmMtNzI1Ni0vKipcXG5tbS9tZW1vcnkuYzo3MjU3OiAqIGFjY2Vzc19yZW1vdGVfdm0gLSBhY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlXFxubW0vbWVtb3J5LmMtNzI1OC0gKiBAbW06XFx0XFx0dGhlIG1tX3N0cnVjdCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3Mgc3BhY2VcXG4tLVxcbm1tL21lbW9yeS5jLTcyNjctICovXFxubW0vbWVtb3J5LmM6NzI2ODppbnQgYWNjZXNzX3JlbW90ZV92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTcyNjktXFx0XFx0dm9pZCAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKVxcbm1tL21lbW9yeS5jLTcyNzAte1xcbm1tL21lbW9yeS5jOjcyNzE6XFx0cmV0dXJuIF9fYWNjZXNzX3JlbW90ZV92bShtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XFxubW0vbWVtb3J5LmMtNzI3Mi19XFxuLS1cXG5tbS9tZW1vcnkuYz03Mjc5PWludCBhY2Nlc3NfcHJvY2Vzc192bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtNzI4OC1cXG5tbS9tZW1vcnkuYzo3Mjg5OlxcdHJldCA9IF9fYWNjZXNzX3JlbW90ZV92bShtbSwgYWRkciwgYnVmLCBsZW4sIGd1cF9mbGFncyk7XFxubW0vbWVtb3J5LmMtNzI5MC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MzMuMTAwMjgwODg5WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU5OTI3MTM1NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUmVtb3RlIFZNIEFjY2VzcyBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBsb29raW5nIGludG8gdGhpcyBgYWNjZXNzX3JlbW90ZV92bWAgc2l0dWF0aW9uLiBJIHNlZSBub3c7IGl0J3MgKm5vdCogZXhwb3J0ZWQsIGJ1dCBpdCdzIGFsc28gbm90IHN0YXRpYy4gVGhhdCBtYWtlcyBpdCBhIHBlcmZlY3Qgc3ltYm9sIHRvIHplcm8gaW4gb24sIGVzcGVjaWFsbHkgc2luY2UgYGFjY2Vzc19wcm9jZXNzX3ZtYCAqaXMqIGV4cG9ydGVkLiBGb2N1c2luZyBvbiBgYWNjZXNzX3JlbW90ZV92bWAgc2VlbXMgbGlrZSBhIHNvbGlkIGFwcHJvYWNoLlxuXG5JIGFsc28gY29uc2lkZXJlZCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCBhbmQgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAuIFRoZXkncmUgZGVmaW5pdGVseSByZWxldmFudCwgYnV0IEkgaGF2ZSBhIGh1bmNoIHRoZXkncmUgbGlrZWx5IHRvIGJlIHBlcmZvcm1hbmNlLWNyaXRpY2FsIHBhdGhzLCBhbmQgSSdkIHByZWZlciB0byBzdGFydCB3aXRoIHNvbWV0aGluZyBhIGJpdCBtb3JlIGZ1bmRhbWVudGFsLiBUaGUgcGF0Y2ggdG91Y2hlcyBgbW0vZ3VwLmNgIGFuZCBgbW0vbWVtb3J5LmNgLCB3aGljaCBjb25maXJtcyBteSBpbml0aWFsIGludHVpdGlvbi4gU28sIEknbSBzdGlja2luZyB3aXRoIG15IG9yaWdpbmFsIHNlbGVjdGlvbiBvZiBmb2N1cyBzeW1ib2xzIGZvciBub3cg4oCTIGBhY2Nlc3NfcmVtb3RlX3ZtYCBzZWVtcyBsaWtlIHRoZSBtb3N0IHN0cmF0ZWdpYyBzdGFydGluZyBwb2ludC5cblxuQmVmb3JlIEkgY29tbWl0IHRvIHRoaXMgYXBwcm9hY2gsIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgaW4gcGxheS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJ20gbm90IG92ZXJsb29raW5nIGFueXRoaW5nIGNyaXRpY2FsLiBMZXQncyBzZWUuLi4gYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEJQRl9TWVNDQUxMYCwgYFJJU0NWX0lTQV9TVVBNYCwgYW5kIGBBRERSRVNTX01BU0tJTkdgLiBBbHJpZ2h0LCBJJ3ZlIGdvdCB0aGVtLiBMb29rcyBsaWtlIEkndmUgY29uc2lkZXJlZCB0aGUgcmVsZXZhbnQgZmFjdG9ycy5cblxuTm93LCBJIHRoaW5rIEknbSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIEknbGwgZ28gYWhlYWQgYW5kIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzYzNTIsIk91dHB1dFRva2VucyI6MjQ5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI2VDEwOjA4OjM5LjA5Mjk5OTY4MloiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2OTEzMjc3MywiRXJyb3IiOiJ0aGUgZm9sbG93aW5nIGNvbmZpZ3MgZG8gbm90IGV4aXN0IGluIHRoZSBrZXJuZWwgdHJlZTogUklTQ1ZfSVNBX1NVUE0iLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJSSVNDVl9JU0FfU1VQTVwiLFxuICAgIFwiQUREUkVTU19NQVNLSU5HXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZV92bWFcIixcbiAgICBcImdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYVwiLFxuICAgIFwiYWNjZXNzX3JlbW90ZV92bVwiLFxuICAgIFwiYWNjZXNzX3Byb2Nlc3Nfdm1cIixcbiAgICBcImNvcHlfcmVtb3RlX3ZtX3N0clwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJ0aGUgZm9sbG93aW5nIGNvbmZpZ3MgZG8gbm90IGV4aXN0IGluIHRoZSBrZXJuZWwgdHJlZTogUklTQ1ZfSVNBX1NVUE1cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjZUMTA6MDg6MzkuMzYyMTc0NzM1WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MDgwMTU5MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGVidWdnaW5nIGEgUklTQy1WIENvbmZpZ3VyYXRpb24gSXNzdWUqKlxuXG5Pa2F5LCBob2xkIG9uIGEgbWludXRlLiBgUklTQ1ZfSVNBX1NVUE1gIGlzbid0IHNob3dpbmcgdXAgd2hlcmUgSSBleHBlY3QgaXQgdG8uIFRoYXQncyBhIHJlZCBmbGFnLiBCZWZvcmUgSSBzdGFydCBnb2luZyBkb3duIGEgcmFiYml0IGhvbGUgb2YgaW5jbHVkZSBwYXRocyBvciBidWlsZCBzeXN0ZW0gb2RkaXRpZXMsIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGV2ZW4gYSAqZGVmaW5lZCogc3ltYm9sLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gY2hlY2sgdGhlIGNvcmUgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSwgc3BlY2lmaWNhbGx5IGBhcmNoL3Jpc2N2L0tjb25maWdgLiBUaGF0J3MgdGhlIGRlZmluaXRpdmUgc291cmNlIG9mIHRydXRoIGZvciBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzIGFuZCBvcHRpb25zLiBHb3R0YSBzZWUgaWYgaXQncyBkZWNsYXJlZCB0aGVyZSwgY29ycmVjdGx5LCBvciBpZiB0aGVyZSdzIGEgdHlwbywgY29uZGl0aW9uLCBvciBkZXBlbmRlbmN5IEknbSBtaXNzaW5nLiBMZXQncyBnZXQgdGhhdCBLY29uZmlnIGZpbGUgb3BlbiBhbmQgZG8gYSBxdWljayBzZWFyY2guIEhvcGVmdWxseSwgdGhpcyBpcyBhIHNpbXBsZSBjb25maWd1cmF0aW9uIG1pc3N0ZXAuIElmIG5vdCwgSSdsbCBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYnVpbGQgc3lzdGVtIGFuZCBwb3RlbnRpYWxseSB0aGUgaGVhZGVycyB0aGVtc2VsdmVzIHRvIGZpZ3VyZSBvdXQgd2hhdCdzIGdvaW5nIG9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzEyOCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsic2V0LXJlc3VsdHMiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODo0Mi43NzAxOTYyNTVaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1Nzk0NDI5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJSSVNDVl9JU0FfU1VQTVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL3Jpc2N2L0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9yaXNjdi9LY29uZmlnPTU1Mz1jb25maWcgUklTQ1ZfSVNBX0NcXG4tLVxcbmFyY2gvcmlzY3YvS2NvbmZpZy01NjMtXFxuYXJjaC9yaXNjdi9LY29uZmlnOjU2NDpjb25maWcgUklTQ1ZfSVNBX1NVUE1cXG5hcmNoL3Jpc2N2L0tjb25maWctNTY1LVxcdGJvb2wgXFxcIlN1cG0gZXh0ZW5zaW9uIGZvciB1c2Vyc3BhY2UgcG9pbnRlciBtYXNraW5nXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODo0Mi45MjgxNDgzODNaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTAzMTkxOTcyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipUcm91Ymxlc2hvb3RpbmcgYSBDb25maWd1cmF0aW9uIEVycm9yKipcblxuT2theSwgc28gdGhlIHRvb2wgaXMgdGVsbGluZyBtZSB0aGlzIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lc24ndCBleGlzdC4gVGhhdCdzIGEgY2xhc3NpYy4gTXkgaW5pdGlhbCBodW5jaCBpcyB0aGF0IGl0J3MgZWl0aGVyIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIHRyZWUsIG9yIHRoZSB0b29sIGlzIHVzaW5nIGEgbW9yZSByZXN0cmljdGl2ZSBsb29rdXAgdGhhbiBJIGV4cGVjdC4gTGV0J3Mgc3RhcnQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGlzc3VlLiBJJ2xsIHJlbW92ZSBgUklTQ1ZfSVNBX1NVUE1gIGFuZCBgQUREUkVTU19NQVNLSU5HYCBmcm9tIG15IGFjdGl2ZSBjb25maWd1cmF0aW9uIHRvIHRyeSBhbmQgaXNvbGF0ZSB0aGUgcHJvYmxlbS4gVGhvc2Ugc2VlbSBsaWtlIHBvdGVudGlhbCBjdWxwcml0cywgYmVpbmcgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBhbmQgbWlnaHQgbm90IGJlIHByZXNlbnQgaW4gdGhlIHRvb2wncyBkZWZhdWx0IGNoZWNrLiBXYWl0IGEgc2Vjb25kLCBkaWRuJ3QgSSBqdXN0IHNlZSBgQUREUkVTU19NQVNLSU5HYCBpbiB0aGUgeDg2IEtjb25maWcgZmlsZXM/IEknbGwgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCwganVzdCB0byBiZSBzdXJlLiBJdCdzIGltcG9ydGFudCB0byB2ZXJpZnkgdGhvc2UgZGV0YWlscywgbm8gcG9pbnQgYXNzdW1pbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM3NTAxLCJPdXRwdXRUb2tlbnMiOjIzOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yNlQxMDowODo0Ny45NjAwNzE5MjZaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTU1MzE4NDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQUREUkVTU19NQVNLSU5HXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZV92bWFcIixcbiAgICBcImdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYVwiLFxuICAgIFwiYWNjZXNzX3JlbW90ZV92bVwiLFxuICAgIFwiYWNjZXNzX3Byb2Nlc3Nfdm1cIixcbiAgICBcImNvcHlfcmVtb3RlX3ZtX3N0clwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgcmVtb3RlIFZNIHdhbGsgbWVjaGFuaXNtIChgcmVtb3RlX3ZtX3dhbGtgKSBhbmQgcmVwbGFjZXMgYGdldF91c2VyX3BhZ2Vfdm1hX3JlbW90ZWAgd2l0aCBgZ2V0X3VzZXJfcGFnZV9sb29rdXBfdm1hYCBhbmQgYGdldF91c2VyX3BhZ2Vfdm1hYC4gSXQgYWxzbyBhZGRzIHN1cHBvcnQgZm9yIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXMgZm9yIFBURS1tYXBwZWQgbGFyZ2UgZm9saW9zIChtVEhQKSBpbiB0aGUgc2xvdyBHVVAgcGF0aC4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyB0aGF0IGFmZmVjdCBwYWdlIGZhdWx0aW5nLCByZW1vdGUgbWVtb3J5IGFjY2VzcyAoZS5nLiwgcHRyYWNlLCAvcHJvYy9waWQvbWVtKSwgYW5kIEJQRiBzdHJpbmcgY29weWluZy4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBlbnRyeSBwb2ludHMgYW5kIHJlbW90ZSBhY2Nlc3MgQVBJcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkFERFJFU1NfTUFTS0lOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF91c2VyX3BhZ2Vfdm1hXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlX2xvb2t1cF92bWFcIixcbiAgICBcImFjY2Vzc19yZW1vdGVfdm1cIixcbiAgICBcImFjY2Vzc19wcm9jZXNzX3ZtXCIsXG4gICAgXCJjb3B5X3JlbW90ZV92bV9zdHJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHJlbW90ZSBWTSB3YWxrIG1lY2hhbmlzbSAoYHJlbW90ZV92bV93YWxrYCkgYW5kIHJlcGxhY2VzIGBnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGVgIHdpdGggYGdldF91c2VyX3BhZ2VfbG9va3VwX3ZtYWAgYW5kIGBnZXRfdXNlcl9wYWdlX3ZtYWAuIEl0IGFsc28gYWRkcyBzdXBwb3J0IGZvciBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzIGZvciBQVEUtbWFwcGVkIGxhcmdlIGZvbGlvcyAobVRIUCkgaW4gdGhlIHNsb3cgR1VQIHBhdGguIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgdGhhdCBhZmZlY3QgcGFnZSBmYXVsdGluZywgcmVtb3RlIG1lbW9yeSBhY2Nlc3MgKGUuZy4sIHB0cmFjZSwgL3Byb2MvcGlkL21lbSksIGFuZCBCUEYgc3RyaW5nIGNvcHlpbmcuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZW50cnkgcG9pbnRzIGFuZCByZW1vdGUgYWNjZXNzIEFQSXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow98vll[1] Phase: Succeeded StartedAt: 2026-07-26 10:08:59 +0000 UTC FinishedAt: 2026-07-26 10:08:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-26 10:08:59 +0000 UTC FinishedAt: 2026-07-26 10:08:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2] Phase: Running StartedAt: 2026-07-26 10:08:59 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN) Phase: Running StartedAt: 2026-07-26 10:08:59 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-26 10:08:59 +0000 UTC FinishedAt: 2026-07-26 10:09:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-26 10:08:59 +0000 UTC FinishedAt: 2026-07-26 10:09:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.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-workflow98vll/series-workflow98vll-convert-artifact-1182657800/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-26 10:09:09 +0000 UTC FinishedAt: 2026-07-26 10:37:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-26 10:09:09 +0000 UTC FinishedAt: 2026-07-26 10:37:15 +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:*bd291263-7f54-4e67-9c2e-39436ddebcfc,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-workflow98vll/series-workflow98vll-convert-artifact-1182657800/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": "40033ceb-c305-48a6-8acb-728e5359a1f1", "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-workflow98vll/series-workflow98vll-build-action-3941058430/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-26 10:09:09 +0000 UTC FinishedAt: 2026-07-26 10:37:05 +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:*bd291263-7f54-4e67-9c2e-39436ddebcfc,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-workflow98vll/series-workflow98vll-convert-artifact-1182657800/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": "40033ceb-c305-48a6-8acb-728e5359a1f1", "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-workflow98vll/series-workflow98vll-build-action-3941058430/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-26 10:37:15 +0000 UTC FinishedAt: 2026-07-26 10:37:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-26 10:37:15 +0000 UTC FinishedAt: 2026-07-26 10:37:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-26 10:37:15 +0000 UTC FinishedAt: 2026-07-26 10:37:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-26 10:37:15 +0000 UTC FinishedAt: 2026-07-26 10:37:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.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-workflow98vll/series-workflow98vll-convert-artifact-2098111471/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-26 10:37:26 +0000 UTC FinishedAt: 2026-07-26 10:39:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-26 10:37:26 +0000 UTC FinishedAt: 2026-07-26 10:39:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*40033ceb-c305-48a6-8acb-728e5359a1f1,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-workflow98vll/series-workflow98vll-build-action-3941058430/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-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-26 10:39:26 +0000 UTC FinishedAt: 2026-07-26 10:39:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-26 10:39:26 +0000 UTC FinishedAt: 2026-07-26 10:39:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6] Phase: Running StartedAt: 2026-07-26 10:39:26 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Running StartedAt: 2026-07-26 10:39:26 +0000 UTC FinishedAt: 0001-01-01 00:00: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:*bd291263-7f54-4e67-9c2e-39436ddebcfc,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-workflow98vll/series-workflow98vll-convert-artifact-2098111471/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow98vll[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["bpf"],"focus_symbols":["get_user_page_vma","get_user_page_lookup_vma","access_remote_vm","access_process_vm","copy_remote_vm_str"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"248951ddc14de84de3910f9b13f51491a8cd91df","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","BPF_SYSCALL","ADDRESS_MASKING"],"series_id":"dcd2e194-d976-41b3-9678-ea27e80f2379","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Running StartedAt: 2026-07-26 10:39:26 +0000 UTC FinishedAt: 0001-01-01 00:00: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:*bd291263-7f54-4e67-9c2e-39436ddebcfc,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-workflow98vll/series-workflow98vll-convert-artifact-2098111471/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,}