Name: series-workflowcpdg4 Phase: Succeeded StartedAt: 2026-08-18 11:29:47 +0000 UTC FinishedAt: 2026-08-18 15:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[0] Phase: Succeeded StartedAt: 2026-08-18 11:29:47 +0000 UTC FinishedAt: 2026-08-18 11:33:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[0].run-triage Phase: Succeeded StartedAt: 2026-08-18 11:29:47 +0000 UTC FinishedAt: 2026-08-18 11:33:19 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "drm-next", "tree_url": "https://gitlab.freedesktop.org/drm/kernel.git", "commit_hash": "8d3ae59288f1e7d58d76558a6ee96d533bc5019f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP", "CIFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "drm-next", "tree_url": "https://gitlab.freedesktop.org/drm/kernel.git", "commit_hash": "8d3ae59288f1e7d58d76558a6ee96d533bc5019f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP", "CIFS" ], "series_id": "b84b1a73-2c94-48c2-a75a-e79de6770866" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "vfs_coredump", "smb_send_kvec" ], "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", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDssCiAgICAmIzM0O0NJRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OywKICAgICYjMzQ7c21iX3NlbmRfa3ZlYyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG1lY2hhbmlzbSB0byBwcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHNwZWNpZmljIHRhc2tzLCBzcGVjaWZpY2FsbHkgZHVyaW5nIGNvcmVkdW1wIGdlbmVyYXRpb24gYW5kIFNNQiBuZXR3b3JrIHRyYW5zbWlzc2lvbi4gSXQgYWRkcyBQRl9OT19OT1RJRllfU0lHTkFMIHRvIHRhc2sgZmxhZ3MgYW5kIG1vZGlmaWVzIHNpZ25hbF9wZW5kaW5nKCkgdG8gcmVzcGVjdCBpdC4gVGhlIGNvcmUgY2hhbmdlcyBhcmUgaW4gdmZzX2NvcmVkdW1wKCkgYW5kIHNtYl9zZW5kX2t2ZWMoKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCB0aGUgU01CIGNsaWVudCBkcml2ZXIsIHdoaWNoIGFyZSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2OGU0MWEzYzljZTIyMGZlMTM1NzJmZDQ5NDViNmRhZWU1NWJlMGNlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMTE6MzE6MjEgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcbmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0XG4tLS0gYS9mcy9jb3JlZHVtcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9jb3JlZHVtcC5jXG5AQCAtMTE2NSw2ICYjNDM7MTE2NSw3IEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRzdHJ1Y3QgY29yZV9uYW1lIGNuO1xuIFx0Y29uc3Qgc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LVx1MDAzZW1tO1xuIFx0Y29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10ID0gbW0tXHUwMDNlYmluZm10O1xuJiM0MztcdHVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7XG4gXHRpbnQgYXJnYyA9IDA7XG4gXHRzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zIGNwcm0gPSB7XG4gXHRcdC5zaWdpbmZvID0gc2lnaW5mbyxcbkBAIC0xMTk2LDkgJiM0MzsxMTk3LDEyIEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRpZiAoY29yZWR1bXBfd2FpdChzaWdpbmZvLVx1MDAzZXNpX3NpZ25vLCBcdTAwMjZjb3JlX3N0YXRlKSBcdTAwM2MgMClcbiBcdFx0cmV0dXJuO1xuIFxuJiM0MztcdC8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqL1xuJiM0MztcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0c2NvcGVkX3dpdGhfY3JlZHMoY3JlZClcbiBcdFx0ZG9fY29yZWR1bXAoXHUwMDI2Y24sIFx1MDAyNmNwcm0sIFx1MDAyNmFyZ3YsIFx1MDAyNmFyZ2MsIGJpbmZtdCk7XG4gXHRjb3JlZHVtcF9jbGVhbnVwKFx1MDAyNmNuLCBcdTAwMjZjcHJtKTtcbiYjNDM7XHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbiBcdHJldHVybjtcbiB9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XG4tLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG5AQCAtMjIsNyAmIzQzOzIyLDYgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1wb29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gI2luY2x1ZGUgXCYjMzQ7Y2lmc2dsb2IuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O2NpZnNwcm90by5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7Y2lmc19kZWJ1Zy5oXCYjMzQ7XG5AQCAtMTQyLDYgJiM0MzsxNDEsNyBAQCBpbnRcbiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZyxcbiBcdCAgICAgIHNpemVfdCAqc2VudClcbiB7XG4mIzQzO1x0dW5zaWduZWQgaW50IG5vdGlmeV9mbGFncztcbiBcdGludCByYyA9IDA7XG4gXHRpbnQgcmV0cmllcyA9IDA7XG4gXHRzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0ID0gc2VydmVyLVx1MDAzZXNzb2NrZXQ7XG5AQCAtMTcyLDE1ICYjNDM7MTcyLDEyIEBAIHNtYl9zZW5kX2t2ZWMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3QgbXNnaGRyICpzbWJfbXNnLFxuIFx0XHQgKiBhZnRlciB0aGUgcmV0cmllcyB3ZSB3aWxsIGtpbGwgdGhlIHNvY2tldCBhbmRcbiBcdFx0ICogcmVjb25uZWN0IHdoaWNoIG1heSBjbGVhciB0aGUgbmV0d29yayBwcm9ibGVtLlxuIFx0XHQgKlxuLVx0XHQgKiBFdmVuIGlmIHJlZ3VsYXIgc2lnbmFscyBhcmUgbWFza2VkLCBFSU5UUiBtaWdodCBiZVxuLVx0XHQgKiBwcm9wYWdhdGVkIGZyb20gc2tfc3RyZWFtX3dhaXRfbWVtb3J5KCkgdG8gaGVyZSB3aGVuXG4tXHRcdCAqIFRJRl9OT1RJRllfU0lHTkFMIGlzIHVzZWQgZm9yIHRhc2sgd29yay4gRm9yIGV4YW1wbGUsXG4tXHRcdCAqIGNlcnRhaW4gaW9fdXJpbmcgY29tcGxldGlvbnMgd2lsbCB1c2UgdGhhdC4gVHJlYXRcbi1cdFx0ICogaGF2aW5nIEVJTlRSIHdpdGggcGVuZGluZyB0YXNrIHdvcmsgdGhlIHNhbWUgYXMgRUFHQUlOXG4tXHRcdCAqIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlY29ubmVjdHMuXG4mIzQzO1x0XHQgKiBUYXNrIHdvcmsgbXVzdCBub3QgYWJvcnQgdGhlIHNlbmQsIHNlZSBzaWduYWxfcGVuZGluZygpLlxuIFx0XHQgKi9cbiYjNDM7XHRcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0XHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcbi1cdFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFx1MDAyNlx1MDAyNiB0YXNrX3dvcmtfcGVuZGluZyhjdXJyZW50KSkpIHtcbiYjNDM7XHRcdG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZShub3RpZnlfZmxhZ3MpO1xuJiM0MztcdFx0aWYgKHJjID09IC1FQUdBSU4pIHtcbiBcdFx0XHRyZXRyaWVzJiM0MzsmIzQzOztcbiBcdFx0XHRpZiAocmV0cmllcyBcdTAwM2U9IDE0IHx8XG4gXHRcdFx0ICAgICghc2VydmVyLVx1MDAzZW5vYmxvY2tzbmQgXHUwMDI2XHUwMDI2IChyZXRyaWVzIFx1MDAzZSAyKSkpIHtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcbmluZGV4IDM3M2JjYzA1OThkMTAuLmZkNzJjYTRlZTkyZjIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuQEAgLTE3OTYsNyAmIzQzOzE3OTYsNyBAQCBleHRlcm4gc3RydWN0IHBpZCAqY2FkX3BpZDtcbiBcdFx0XHRcdFx0XHQgKiBJIGFtIGNsZWFuaW5nIGRpcnR5IHBhZ2VzIGZyb20gc29tZSBvdGhlciBiZGkuICovXG4gI2RlZmluZSBQRl9LVEhSRUFEXHRcdDB4MDAyMDAwMDBcdC8qIEkgYW0gYSBrZXJuZWwgdGhyZWFkICovXG4gI2RlZmluZSBQRl9SQU5ET01JWkVcdFx0MHgwMDQwMDAwMFx0LyogUmFuZG9taXplIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqL1xuLSNkZWZpbmUgUEZfX0hPTEVfXzAwODAwMDAwXHQweDAwODAwMDAwXG4mIzQzOyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFx0MHgwMDgwMDAwMFx0Lyogc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpICovXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcdDB4MDEwMDAwMDBcbiAjZGVmaW5lIFBGX19IT0xFX18wMjAwMDAwMFx0MHgwMjAwMDAwMFxuICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFlcdDB4MDQwMDAwMDBcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li4zMTgyZGU0ZmY5NDgyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTM4NCwxNCAmIzQzOzM4NCwzMSBAQCBzdGF0aWMgaW5saW5lIGludCB0YXNrX3NpZ3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKVxuIFx0cmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTtcbiB9XG4gXG4mIzQzOy8qIFByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhpcyB0YXNrLiAqL1xuJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub19ub3RpZnlfc2lnbmFsX3NhdmUodm9pZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX05PX05PVElGWV9TSUdOQUw7XG4mIzQzO1xuJiM0MztcdGN1cnJlbnQtXHUwMDNlZmxhZ3MgfD0gUEZfTk9fTk9USUZZX1NJR05BTDtcbiYjNDM7XHRyZXR1cm4gZmxhZ3M7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlc3RvcmUgVElGX05PVElGWV9TSUdOQUwuICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0Y3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIGludCBzaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXG4ge1xuIFx0LypcbiBcdCAqIFRJRl9OT1RJRllfU0lHTkFMIGlzbiYjMzk7dCByZWFsbHkgYSBzaWduYWwsIGJ1dCBpdCByZXF1aXJlcyB0aGUgc2FtZVxuIFx0ICogYmVoYXZpb3IgaW4gdGVybXMgb2YgZW5zdXJpbmcgdGhhdCB3ZSBicmVhayBvdXQgb2Ygd2FpdCBsb29wc1xuLVx0ICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLlxuJiM0MztcdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC4gTm90IGZvciBhIHRhc2tcbiYjNDM7XHQgKiB0aGF0IGFza2VkIG5vdCB0byBiZSBpbnRlcnJ1cHRlZCBieSBpdCwgc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpLlxuIFx0ICovXG4tXHRpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05PVElGWV9TSUdOQUwpKSlcbiYjNDM7XHRpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05PVElGWV9TSUdOQUwpKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgbGlrZWx5KCEoUkVBRF9PTkNFKHAtXHUwMDNlZmxhZ3MpIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXG4gXHRcdHJldHVybiAxO1xuIFx0cmV0dXJuIHRhc2tfc2lncGVuZGluZyhwKTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uNzI4ZjNjMzQyZWI5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyAmIzQzOzMsMTAgQEAgQ0ZMQUdTICYjNDM7PSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxuIFxuIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFxcXG4gXHRcdCAgY29yZWR1bXBfc29ja2V0X3Rlc3QgXFxcbi1cdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxuJiM0MztcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuJiM0MztcdFx0ICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RcbiYjNDM7IyBTcGF3bmVkIGJ5IHRoZSBrZXJuZWwgYXMgdGhlIHxoZWxwZXIsIG5vdCBhIHRlc3Qgb2YgaXRzIG93bi5cbiYjNDM7VEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcbiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcFxuIFxuIGluY2x1ZGUgLi4vbGliLm1rXG5AQCAtMTEsMyAmIzQzOzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWtcbiAkKE9VVFBVVCkvc3RhY2tkdW1wX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiYjNDM7JChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiYjNDM7JChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxuQEAgLTAsMCAmIzQzOzEsMjkgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0hcbiYjNDM7I2RlZmluZSBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBEZWZpbmUgYSBidW5jaCBvZiBjb25zdGFudHMgd2UgbmVlZC4gV2UgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZVxuJiM0MzsgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0JiMzOTtzIHdheSBiZXlvbmQgdGhlIGRlZmF1bHQgNjRLXG4mIzQzOyAqIHBpcGUgcmluZyBhbmQgcGFzdCB0aGUgfjM2SyBhbiBhZl91bml4IHNrYiBob2xkcy4gU28gd2UgZm9yY2UgYSB3cml0ZVxuJiM0MzsgKiB0byBjb21lIGJhY2sgc2hvcnQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfTUFQX0NPVU5UXHRcdDQwMDBcbiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX0FOT05fQllURVNcdCg0VUwgXHUwMDNjXHUwMDNjIDIwKVxuJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfU1RBTExfVVNcdFx0MjAwMDAwXG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBGSUxFXHRcdFwmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9UUklHR0VSXHRcdFwmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEVcdFx0XCYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmVcJiMzNDtcbiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRVx0XCYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9TT0NLRVRcdFx0XCYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFwmIzM0O1xuJiM0MztcbiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpO1xuJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKTtcbiYjNDM7c3NpemVfdCByZWN2X2NvcmVkdW1wX25vdGlmeV9zaWduYWwoaW50IGZkLCBpbnQgZmRfb3V0LCBib29sIGFybSk7XG4mIzQzO2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCk7XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0ggKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjg0OWY1YzFlYTczNjVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcbkBAIC0wLDAgJiM0MzsxLDQ2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgfGhlbHBlciBoYWxmIG9mIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC4gVGhlIGtlcm5lbCBzcGF3bnMgdGhpc1xuJiM0MzsgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LlxuJiM0MzsgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXG4mIzQzOyAqIGNyYXNoaW5nIHRhc2sgaXMgcG9sbGluZyBzbyBUSUZfTk9USUZZX1NJR05BTCBpcyByYWlzZWQgd2hpbGUgdGhlIG5vdGVcbiYjNDM7ICogd3JpdGUgaXMgaW4gZmxpZ2h0LlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkX2NvcmVfZmlsZTtcbiYjNDM7XHRzc2l6ZV90IHJldDtcbiYjNDM7XG4mIzQzO1x0ZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSxcbiYjNDM7XHRcdFx0ICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApO1xuJiM0MztcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBhcmd2WzBdKTtcbiYjNDM7XHRcdHJldHVybiBFWElUX0ZBSUxVUkU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSByZWN2X2NvcmVkdW1wX25vdGlmeV9zaWduYWwoU1RESU5fRklMRU5PLCBmZF9jb3JlX2ZpbGUsIHRydWUpO1xuJiM0MztcdGNsb3NlKGZkX2NvcmVfZmlsZSk7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUgdGVzdCBwb2xscyBmb3IgdGhpcyBuYW1lLCBzbyBvbmx5IGNyZWF0ZSBpdCBvbmNlIGl0IGlzIHdob2xlLiAqL1xuJiM0MztcdGlmIChyZW5hbWUoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZW5hbWUgZmFpbGVkOiAlbVxcblwmIzM0OywgYXJndlswXSk7XG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBFWElUX1NVQ0NFU1M7XG4mIzQzO1xuJiM0MztlcnI6XG4mIzQzO1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbiYjNDM7XHRyZXR1cm4gRVhJVF9GQUlMVVJFO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2M2MwNmE4MTU2MmZcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jXG5AQCAtMCwwICYjNDM7MSwyNDUgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEEgY29yZWR1bXAgaXMgbWVhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgU0lHS0lMTCBhbmQgYnkgdGhlIGZyZWV6ZXIgYW5kXG4mIzQzOyAqIGJ5IG5vdGhpbmcgZWxzZS4gZHVtcF9pbnRlcnJ1cHRlZCgpIHNheXMgc28sIGJ1dCB0aGUgYmxvY2tpbmcgd2FpdHNcbiYjNDM7ICogdW5kZXJuZWF0aCBpdCB0ZXN0IHNpZ25hbF9wZW5kaW5nKCksIHdoaWNoIGlzIGFsc28gdHJ1ZSBmb3JcbiYjNDM7ICogVElGX05PVElGWV9TSUdOQUwuIEEgY3Jhc2hpbmcgdGFzayB0aGF0IGhhcyBhbiBpb191cmluZyBjb21wbGV0aW9uIGxhbmRcbiYjNDM7ICogb24gaXQgbWlkLWR1bXAgdGhlcmVmb3JlIGtlZXBzIGR1bXBpbmcgd2hpbGUgZXZlcnkgd2FpdCBpdCBlbnRlcnMgYmFpbHNcbiYjNDM7ICogb3V0IGF0IG9uY2UsIGFuZCB0aGUgZHVtcCBpcyBzaWxlbnRseSBjdXQgc2hvcnQuIE5vdGhpbmcgcmVwb3J0cyBpdDpcbiYjNDM7ICogYmluZm10X2VsZiBzZXRzIGhhc19kdW1wZWQgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gV0NPUkVEVU1QKClcbiYjNDM7ICogc2F5cyB0aGUgZHVtcCB3b3JrZWQuXG4mIzQzOyAqXG4mIzQzOyAqIEEgY29yZWR1bXAgbm90ZSBpcyB0aGUgb25seSBkdW1wX2VtaXQoKSB0aGF0IGV4Y2VlZHMgd2hhdCB0aGUgdHJhbnNwb3J0XG4mIzQzOyAqIHRha2VzIGluIG9uZSBnbywgc28gaXQgaXMgdGhlIG9uZSB3cml0ZSB0aGF0IGlzIGNlcnRhaW4gdG8gYmxvY2suIEJvdGhcbiYjNDM7ICogdGVzdHMgY3Jhc2ggYSBjaGlsZCBob2xkaW5nIGVub3VnaCBmaWxlIGJhY2tlZCBtYXBwaW5ncyBmb3IgaXRzIE5UX0ZJTEVcbiYjNDM7ICogbm90ZSB0byBydW4gcGFzdCB0aGF0LCBhcm0gYW4gaW9fdXJpbmcgcG9sbCBvbiBpdCwgYW5kIHRyaXAgdGhlIHBvbGxcbiYjNDM7ICogd2hpbGUgdGhlIG5vdGUgaXMgYmVpbmcgd3JpdHRlbi4gV2hhdCBjb21lcyBvdXQgaGFzIHRvIGJlIHRoZSB3aG9sZVxuJiM0MzsgKiBkdW1wLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y29yZWR1bXBfdGVzdC5oXCYjMzQ7XG4mIzQzO1xuJiM0MztGSVhUVVJFX1NFVFVQKGNvcmVkdW1wKVxuJiM0Mzt7XG4mIzQzO1x0RklMRSAqZmlsZTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSAtRVNSQ0g7XG4mIzQzO1x0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuJiM0MztcdGZpbGUgPSBmb3BlbihcJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX05FKE5VTEwsIGZpbGUpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBmcmVhZChzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybiwgMSxcbiYjNDM7XHRcdCAgICBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcbiYjNDM7XHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4mIzQzO1x0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XG4mIzQzO1xuJiM0MztcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbiYjNDM7XHRBU1NFUlRfR0Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZjbG9zZShmaWxlKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgcmV0KTtcbiYjNDM7XG4mIzQzO1x0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XG4mIzQzO1x0QVNTRVJUX0VRKG1rZmlmbyhOT1RJRllfU0lHTkFMX1RSSUdHRVIsIDA2MDApLCAwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbiYjNDM7XHRGSUxFICpmaWxlO1xuJiM0MztcdGludCByZXQsIHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciBcdTAwM2UgMCkge1xuJiM0MztcdFx0a2lsbChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFNJR1RFUk0pO1xuJiM0MztcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0fVxuJiM0MztcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfRklMRSk7XG4mIzQzO1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbiYjNDM7XHR1bmxpbmsoTk9USUZZX1NJR05BTF9TT0NLRVQpO1xuJiM0MztcdHVubGluayhOT1RJRllfU0lHTkFMX1RSSUdHRVIpO1xuJiM0MztcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xuJiM0MztcbiYjNDM7XHRmaWxlID0gZm9wZW4oXCYjMzQ7L3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cJiMzNDssIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZmlsZSkge1xuJiM0MztcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXCYjMzQ7O1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gZnByaW50ZihmaWxlLCBcJiMzNDslc1wmIzM0Oywgc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHJlYXNvbiA9IFwmIzM0O1VuYWJsZSB0byB3cml0ZSB0byBjb3JlX3BhdHRlcm5cJiMzNDs7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIGNsb3NlIGNvcmVfcGF0dGVyblwmIzM0OztcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0cmV0ID0gY2xvc2Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdHJlYXNvbiA9IFwmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1wmIzM0OztcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuO1xuJiM0MztmYWlsOlxuJiM0MztcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xuJiM0MztcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xcblwmIzM0OywgcmVhc29uKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ2hlY2sgdGhhdCB3aGF0IHRoZSBoZWxwZXIgb3IgdGhlIHNlcnZlciBzYXZlZCBpcyB0aGUgd2hvbGUgZHVtcC4gT25seVxuJiM0MzsgKiBhIGhvbGUgYXQgdGhlIHZlcnkgZW5kIGNhbiBiZSBtaXNzaW5nLCBzZWUgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZSgpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfd2hvbGVfY29yZWR1bXAoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xuJiM0MztcdHN0cnVjdCBzdGF0IHN0O1xuJiM0MztcbiYjNDM7XHRleHBlY3RlZCA9IGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnRhaWwpO1xuJiM0MztcdEFTU0VSVF9HVChleHBlY3RlZCwgMCk7XG4mIzQzO1x0QVNTRVJUX0VRKHN0YXQoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnN0KSwgMCk7XG4mIzQzO1x0QVNTRVJUX0xFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQpO1xuJiM0MztcdEFTU0VSVF9HRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkIC0gdGFpbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBkdW1wIGdvZXMgdG8gYSB8aGVscGVyLCBzbyB0aGUgcmVhZGVyIGlzIGEgc2VwYXJhdGUgcHJvZ3JhbSB0aGVcbiYjNDM7ICoga2VybmVsIHNwYXducy4gSXQgc2F2ZXMgd2hhdCBpdCByZWNlaXZlZCB0byBOT1RJRllfU0lHTkFMX0NPUkVfRklMRS5cbiYjNDM7ICovXG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgbm90aWZ5X3NpZ25hbF9waXBlKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBwYXR0ZXJuW1BBVEhfTUFYXSwgaGVscGVyW1BBVEhfTUFYXSwgKnA7XG4mIzQzO1x0c3RydWN0IHN0YXQgc3Q7XG4mIzQzO1x0aW50IHN0YXR1cywgaTtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1x0c3NpemVfdCBuO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0U0tJUChyZXR1cm4sIFwmIzM0O2lvX3VyaW5nIG5vdCBhdmFpbGFibGVcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRuID0gcmVhZGxpbmsoXCYjMzQ7L3Byb2Mvc2VsZi9leGVcJiMzNDssIGhlbHBlciwgc2l6ZW9mKGhlbHBlcikgLSAxKTtcbiYjNDM7XHRBU1NFUlRfR1QobiwgMCk7XG4mIzQzO1x0aGVscGVyW25dID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRwID0gc3Ryc3RyKGhlbHBlciwgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTkUocCwgTlVMTCk7XG4mIzQzO1x0QVNTRVJUX0xFKChzaXplX3QpKHAgLSBoZWxwZXIpICYjNDM7IHNpemVvZihcJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlclwmIzM0OyksXG4mIzQzO1x0XHQgIHNpemVvZihoZWxwZXIpKTtcbiYjNDM7XHRzdHJjcHkocCwgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcJiMzNDspO1xuJiM0MztcdGlmIChhY2Nlc3MoaGVscGVyLCBYX09LKSlcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciBub3QgYnVpbHRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcJiMzNDt8JXNcJiMzNDssIGhlbHBlciksXG4mIzQzO1x0XHQgIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbiYjNDM7XHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTtcbiYjNDM7XG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShwaWQsIDApO1xuJiM0MztcdGlmIChwaWQgPT0gMClcbiYjNDM7XHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuJiM0MztcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUga2VybmVsIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBoZWxwZXIsIHNvIHBvbGwgZm9yIGl0LiAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNiBzdC5zdF9zaXplKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcCgxMDAwMDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Y2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi9cbiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcbiYjNDM7e1xuJiM0MztcdHBpZF90IHBpZCwgcGlkX2NvcmVkdW1wX3NlcnZlcjtcbiYjNDM7XHRpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1cztcbiYjNDM7XHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdO1xuJiM0MztcdGNoYXIgYztcbiYjNDM7XG4mIzQzO1x0aWYgKCFjb3JlZHVtcF9pb191cmluZ19hdmFpbGFibGUoKSlcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtpb191cmluZyBub3QgYXZhaWxhYmxlXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsXG4mIzQzO1x0XHRcdCAgICAgaXBjX3NvY2tldHMpLCAwKTtcbiYjNDM7XHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcJiMzNDtAJXNcJiMzNDssXG4mIzQzO1x0XHRcdCAgIE5PVElGWV9TSUdOQUxfU09DS0VUKSwgKGludClzaXplb2YocGF0dGVybikpO1xuJiM0MztcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuJiM0MztcbiYjNDM7XHRwaWRfY29yZWR1bXBfc2VydmVyID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTtcbiYjNDM7XHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XG4mIzQzO1x0XHRpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xO1xuJiM0MztcdFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbiYjNDM7XG4mIzQzO1x0XHRjbG9zZShpcGNfc29ja2V0c1swXSk7XG4mIzQzO1xuJiM0MztcdFx0ZmRfc2VydmVyID0gY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoTk9USUZZX1NJR05BTF9TT0NLRVQpO1xuJiM0MztcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpZiAod3JpdGVfbm9pbnRyKGlwY19zb2NrZXRzWzFdLCBcJiMzNDsxXCYjMzQ7LCAxKSBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRjbG9zZShpcGNfc29ja2V0c1sxXSk7XG4mIzQzO1xuJiM0MztcdFx0ZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTtcbiYjNDM7XHRcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdFx0ZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSxcbiYjNDM7XHRcdFx0XHQgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyxcbiYjNDM7XHRcdFx0XHQgICAgMDYwMCk7XG4mIzQzO1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGZkX2NvcmVkdW1wLCBmZF9jb3JlX2ZpbGUsXG4mIzQzO1x0XHRcdFx0XHRcdHRydWUpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4mIzQzO291dDpcbiYjNDM7XHRcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuJiM0MztcdFx0aWYgKGZkX2NvcmVkdW1wIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuJiM0MztcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkX3NlcnZlcik7XG4mIzQzO1x0XHRfZXhpdChleGl0X2NvZGUpO1xuJiM0MztcdH1cbiYjNDM7XHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xuJiM0MztcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcbiYjNDM7XHRBU1NFUlRfRVEocmVhZF9ub2ludHIoaXBjX3NvY2tldHNbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcbiYjNDM7XG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShwaWQsIDApO1xuJiM0MztcdGlmIChwaWQgPT0gMClcbiYjNDM7XHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuJiM0MztcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbiYjNDM7XG4mIzQzO1x0Y2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbmluZGV4IGVkNDdmMDFmYTUzYzUuLjA2Zjk5N2JhNDdmZDkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxuQEAgLTksNiAmIzQzOzksNyBAQFxuIFxuICNpbmNsdWRlIFwmIzM0Oy4uL2tzZWxmdGVzdF9oYXJuZXNzLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDsuLi9waWRmZC9waWRmZC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwmIzM0O1xuIFxuICNpZm5kZWYgUEFHRV9TSVpFXG4gI2RlZmluZSBQQUdFX1NJWkUgNDA5NlxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbmluZGV4IDJhMjBmYWY5Y2IwYWQuLjIwZmNjNWI2NDRjMzIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbkBAIC0xLDExICYjNDM7MSwxOCBAQFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gXG4gI2luY2x1ZGUgXHUwMDNjYXNzZXJ0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZWxmLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZW5kaWFuLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbmsuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pb191cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YWIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvcmVkdW1wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0xMyw3ICYjNDM7MjAsOSBAQFxuICNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL2Vwb2xsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuQEAgLTIxLDYgJiM0MzszMCw3IEBAXG4gXG4gI2luY2x1ZGUgXCYjMzQ7Li4vZmlsZXN5c3RlbXMvd3JhcHBlcnMuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0Oy4uL3BpZGZkL3BpZGZkLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXCYjMzQ7XG4gXG4gLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgdG8gYXZvaWQgaW5jbHVkaW5nIGhhcm5lc3MgaGVhZGVyICovXG4gc3RydWN0IF9fdGVzdF9tZXRhZGF0YTtcbkBAIC0zODEsMyAmIzQzOzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcbiBcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuIFx0X2V4aXQoZXhpdF9jb2RlKTtcbiB9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxuJiM0MzsgKlxuJiM0MzsgKiBfX2R1bXBfZW1pdCgpIHRha2VzIGFueXRoaW5nIHNob3J0IG9mIGEgZnVsbCB3cml0ZSBhcyB0aGUgZW5kIG9mIHRoZVxuJiM0MzsgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcbiYjNDM7ICogb2YgaXQuIFRoZSBOVF9GSUxFIG5vdGUgaXMgdGhlIG9uZSBlbWl0IHRoYXQgaXMgY2VydGFpbiB0byBibG9jayxcbiYjNDM7ICogYmVjYXVzZSBpdCBpcyB0aGUgb25seSBvbmUgbGFyZ2VyIHRoYW4gdGhlIHRyYW5zcG9ydCwgc28gdGhlc2UgaGVscGVyc1xuJiM0MzsgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXG4mIzQzOyAqIHRoZSBkdW1waW5nIHRhc2sgd2hpbGUgdGhhdCB3cml0ZSBpcyBpbiBmbGlnaHQuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBpb191cmluZ19zZXR1cF9yYXcodW5zaWduZWQgaW50IGVudHJpZXMsIHN0cnVjdCBpb191cmluZ19wYXJhbXMgKnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gc3lzY2FsbChfX05SX2lvX3VyaW5nX3NldHVwLCBlbnRyaWVzLCBwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogaW9fdXJpbmcgcmVhZHMgcG9sbDMyX2V2ZW50cyBiYWNrIHRocm91Z2ggc3dhaHczMigpIG9uIGJpZyBlbmRpYW4uICovXG4mIzQzO3N0YXRpYyBfX3UzMiBub3RpZnlfcG9sbF9tYXNrKF9fdTMyIGV2ZW50cylcbiYjNDM7e1xuJiM0MzsjaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpIFx1MDAyNlx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXG4mIzQzO1x0cmV0dXJuIF9fc3dhaHczMihldmVudHMpO1xuJiM0MzsjZWxzZVxuJiM0MztcdHJldHVybiBldmVudHM7XG4mIzQzOyNlbmRpZlxuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRmZCA9IGlvX3VyaW5nX3NldHVwX3JhdygxLCBcdTAwMjZwKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC1cdTAwM2Vub3RpZnlfbWV0aG9kIGF0IFRXQV9TSUdOQUxcbiYjNDM7ICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnNcbiYjNDM7ICogc2V0X25vdGlmeV9zaWduYWwoKSBhZ2FpbnN0IHRoZSB0YXNrIHRoYXQgc3VibWl0dGVkIGl0LiBUaGF0IGlzIHVzLCBhbmRcbiYjNDM7ICogd2UgYXJlIGFib3V0IHRvIGJlY29tZSB0aGUgY29yZWR1bXBpbmcgdGFzay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYXJtX3BvbGxfbm90aWZ5KGludCB0cmlnZ2VyX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4mIzQzO1x0dW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlcztcbiYjNDM7XHRzaXplX3Qgc3FyaW5nX3N6O1xuJiM0MztcdHZvaWQgKnNxO1xuJiM0MztcdGludCByaW5nO1xuJiM0MztcbiYjNDM7XHRyaW5nID0gaW9fdXJpbmdfc2V0dXBfcmF3KDgsIFx1MDAyNnApO1xuJiM0MztcdGlmIChyaW5nIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRzcXJpbmdfc3ogPSBwLnNxX29mZi5hcnJheSAmIzQzOyBwLnNxX2VudHJpZXMgKiBzaXplb2YodW5zaWduZWQgaW50KTtcbiYjNDM7XHRzcSA9IG1tYXAoTlVMTCwgc3FyaW5nX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0ICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRX1JJTkcpO1xuJiM0MztcdGlmIChzcSA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRzcWVzID0gbW1hcChOVUxMLCBwLnNxX2VudHJpZXMgKiBzaXplb2YoKnNxZXMpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0ICAgIE1BUF9TSEFSRUQgfCBNQVBfUE9QVUxBVEUsIHJpbmcsIElPUklOR19PRkZfU1FFUyk7XG4mIzQzO1x0aWYgKHNxZXMgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0c3FfdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi50YWlsKTtcbiYjNDM7XHRzcV9hcnJheSA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi5hcnJheSk7XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZzcWVzWzBdLCAwLCBzaXplb2Yoc3Flc1swXSkpO1xuJiM0MztcdHNxZXNbMF0ub3Bjb2RlID0gSU9SSU5HX09QX1BPTExfQUREO1xuJiM0MztcdHNxZXNbMF0uZmQgPSB0cmlnZ2VyX2ZkO1xuJiM0MztcdHNxZXNbMF0ucG9sbDMyX2V2ZW50cyA9IG5vdGlmeV9wb2xsX21hc2soUE9MTElOKTtcbiYjNDM7XG4mIzQzO1x0c3FfYXJyYXlbMF0gPSAwO1xuJiM0MztcdF9fYXRvbWljX3N0b3JlX24oc3FfdGFpbCwgMSwgX19BVE9NSUNfUkVMRUFTRSk7XG4mIzQzO1xuJiM0MztcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHQvKiBEZWxpYmVyYXRlbHkgbGVha2VkLCB3ZSBhcmUgYWJvdXQgdG8gY3Jhc2guICovXG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEFkamFjZW50IG1hcHBpbmdzIHdpdGggaWRlbnRpY2FsIGZsYWdzIGFuZCBjb250aWd1b3VzIGZpbGUgb2Zmc2V0cyBhcmVcbiYjNDM7ICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvXG4mIzQzOyAqIGFsdGVybmF0ZSB0aGUgcHJvdGVjdGlvbiB0byBrZWVwIGV2ZXJ5IG1hcHBpbmcgYW4gZW50cnkgb2YgaXRzIG93bi5cbiYjNDM7ICogTm90IFBST1RfRVhFQywgL3RtcCBpcyBvZnRlbiBtb3VudGVkIG5vZXhlYy4gTm90aGluZyBpcyBldmVyIHdyaXR0ZW5cbiYjNDM7ICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBtYWtlX2ZpbGVfbWFwcGluZ3Modm9pZClcbiYjNDM7e1xuJiM0MztcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRpbnQgZmQsIGk7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbihOT1RJRllfU0lHTkFMX01BUEZJTEUsXG4mIzQzO1x0XHQgIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoZnRydW5jYXRlKGZkLCAob2ZmX3QpTk9USUZZX1NJR05BTF9NQVBfQ09VTlQgKiBwZ3N6KSkge1xuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOT1RJRllfU0lHTkFMX01BUF9DT1VOVDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCBwcm90ID0gKGkgXHUwMDI2IDEpID8gUFJPVF9SRUFEIDogKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChtbWFwKE5VTEwsIHBnc3osIHByb3QsIE1BUF9QUklWQVRFLCBmZCxcbiYjNDM7XHRcdFx0IChvZmZfdClpICogcGdzeikgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gaTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0dW5zaWduZWQgY2hhciAqcDtcbiYjNDM7XHRpbnQgdHJpZ2dlcl9mZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9mZjtcbiYjNDM7XG4mIzQzO1x0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXImIzM5O3Mgb3BlbigpIGNhbm5vdCBibG9jay4gKi9cbiYjNDM7XHR0cmlnZ2VyX2ZkID0gb3BlbihOT1RJRllfU0lHTkFMX1RSSUdHRVIsIE9fUkRPTkxZIHwgT19OT05CTE9DSyB8IE9fQ0xPRVhFQyk7XG4mIzQzO1xuJiM0MztcdC8qIEV4aXQgcmF0aGVyIHRoYW4gY3Jhc2g6IGEgZHVtcCB3aXRob3V0IHRoZSBwb2xsIGFybWVkIHByb3ZlcyBub3RoaW5nLiAqL1xuJiM0MztcdGlmICh0cmlnZ2VyX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpIFx1MDAzYyBOT1RJRllfU0lHTkFMX01BUF9DT1VOVClcbiYjNDM7XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKE5VTEwsIE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XHRmb3IgKG9mZiA9IDA7IG9mZiBcdTAwM2MgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTOyBvZmYgJiM0Mzs9IHBnc3opXG4mIzQzO1x0XHRwW29mZl0gPSAxO1xuJiM0MztcbiYjNDM7XHRpZiAoYXJtX3BvbGxfbm90aWZ5KHRyaWdnZXJfZmQpKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XG4mIzQzO1x0LyogY3Jhc2ggb24gcHVycG9zZSAqL1xuJiM0MztcdCoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7XG4mIzQzO1x0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgT19XUk9OTFkgfCBPX05PTkJMT0NLIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlmICh3cml0ZShmZCwgXCYjMzQ7eFwmIzM0OywgMSkgIT0gMSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiB3cml0ZSBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcGhkclswXSBpcyB0aGUgUFRfTk9URSBlbnRyeTogZWxmX2NvcmVfZHVtcCgpIGVtaXRzIGl0IHJpZ2h0IGFmdGVyIHRoZVxuJiM0MzsgKiBFTEYgaGVhZGVyLiBJdHMgcF9vZmZzZXQgaXMgd2hlcmUgdGhlIG5vdGVzIGJlZ2luLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGxvbmcgbG9uZyBub3RlX29mZnNldChjb25zdCB1bnNpZ25lZCBjaGFyICpoZHIpXG4mIzQzO3tcbiYjNDM7XHRFbGZXKFBoZHIpIHBoO1xuJiM0MztcdEVsZlcoRWhkcikgZWg7XG4mIzQzO1xuJiM0MztcdG1lbWNweShcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcbiYjNDM7XHRpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNnBoLCBoZHIgJiM0Mzsgc2l6ZW9mKGVoKSwgc2l6ZW9mKHBoKSk7XG4mIzQzO1x0aWYgKHBoLnBfdHlwZSAhPSBQVF9OT1RFKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdHJldHVybiAobG9uZyBsb25nKXBoLnBfb2Zmc2V0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBEcmFpbiBhIGNvcmVkdW1wIG9mZiBAZmQsIGNvdW50aW5nIHdoYXQgYXJyaXZlcy4gT25jZSB0aGUgbm90ZXMgaGF2ZVxuJiM0MzsgKiBzdGFydGVkIHRoZSBrZXJuZWwgaXMgaW5zaWRlIHRoZSBvbmUgYmlnIG5vdGUgd3JpdGUsIHNvIHBva2UgdGhlIGZpZm9cbiYjNDM7ICogdGhlIGNyYXNoaW5nIHRhc2sgaXMgcG9sbGluZyBhbmQgc3RvcCByZWFkaW5nLCB3aGljaCBrZWVwcyB0aGVcbiYjNDM7ICogdHJhbnNwb3J0IGZ1bGwgYW5kIHRoZSB3cml0ZSBibG9ja2VkIHdpdGggYSBwYXJ0aWFsIGNvdW50IHdoZW4gdGhlXG4mIzQzOyAqIHdha2V1cCBsYW5kcy4gVGhlbiBjYXJyeSBvbiB0byBlbmQgb2YgZmlsZS5cbiYjNDM7ICpcbiYjNDM7ICogV2hhdCBhcnJpdmVzIGlzIHdyaXR0ZW4gdG8gQGZkX291dCB3aGVuIHRoYXQgaXMgbm90IG5lZ2F0aXZlLlxuJiM0MzsgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xLiBGYWlsaW5nIHRvIHRyaXAgdGhlIGZpZm9cbiYjNDM7ICogaXMgYW4gZXJyb3IgdG9vOiBhIGR1bXAgdGhhdCB3YXMgbmV2ZXIgaW50ZXJydXB0ZWQgcHJvdmVzIG5vdGhpbmcuXG4mIzQzOyAqL1xuJiM0Mztzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgY2hhciBoZHJbc2l6ZW9mKEVsZlcoRWhkcikpICYjNDM7IHNpemVvZihFbGZXKFBoZHIpKV07XG4mIzQzO1x0c3RhdGljIGNoYXIgYnVmWzY0IFx1MDAzY1x1MDAzYyAxMF07XG4mIzQzO1x0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuJiM0MztcdGxvbmcgbG9uZyBub3RlX29mZiA9IDA7XG4mIzQzO1x0c2l6ZV90IGhkcmxlbiA9IDA7XG4mIzQzO1x0c3NpemVfdCB0b3RhbCA9IDA7XG4mIzQzO1x0Ym9vbCBhcm1lZCA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobiBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRpZiAoZXJybm8gPT0gRUlOVFIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdHJldHVybiAtMTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChuID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGZkX291dCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2IHdyaXRlKGZkX291dCwgYnVmLCBuKSAhPSBuKVxuJiM0MztcdFx0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGhkcmxlbiBcdTAwM2Mgc2l6ZW9mKGhkcikpIHtcbiYjNDM7XHRcdFx0c2l6ZV90IHdhbnQgPSBzaXplb2YoaGRyKSAtIGhkcmxlbjtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh3YW50IFx1MDAzZSAoc2l6ZV90KW4pXG4mIzQzO1x0XHRcdFx0d2FudCA9IChzaXplX3QpbjtcbiYjNDM7XHRcdFx0bWVtY3B5KGhkciAmIzQzOyBoZHJsZW4sIGJ1Ziwgd2FudCk7XG4mIzQzO1x0XHRcdGhkcmxlbiAmIzQzOz0gd2FudDtcbiYjNDM7XHRcdFx0aWYgKGhkcmxlbiA9PSBzaXplb2YoaGRyKSlcbiYjNDM7XHRcdFx0XHRub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0dG90YWwgJiM0Mzs9IG47XG4mIzQzO1xuJiM0MztcdFx0aWYgKGFybSBcdTAwMjZcdTAwMjYgIWFybWVkIFx1MDAyNlx1MDAyNiBub3RlX29mZiBcdTAwM2UgMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICB0b3RhbCBcdTAwM2Ugbm90ZV9vZmYgJiM0MzsgKGxvbmcgbG9uZylwZ3N6KSB7XG4mIzQzO1x0XHRcdGlmIChwdWxsX3RyaWdnZXIoKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gLTE7XG4mIzQzO1x0XHRcdGFybWVkID0gdHJ1ZTtcbiYjNDM7XHRcdFx0dXNsZWVwKE5PVElGWV9TSUdOQUxfU1RBTExfVVMpO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChhcm0gXHUwMDI2XHUwMDI2ICFhcm1lZClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRvdGFsO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBIb3cgbGFyZ2UgdGhlIGR1bXAgd2FzIG1lYW50IHRvIGJlLiBUaGUgRUxGIGhlYWRlciBhbmQgdGhlIHByb2dyYW1cbiYjNDM7ICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvd1xuJiM0MzsgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCAmIzQzOyBwX2ZpbGVzeikuXG4mIzQzOyAqXG4mIzQzOyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyXG4mIzQzOyAqIGFycml2ZXMuIGR1bXBfc2tpcCgpIG9ubHkgYWNjdW11bGF0ZXMgY3BybS1cdTAwM2V0b19za2lwLCBlbGZfY29yZV9kdW1wKClcbiYjNDM7ICogaGFzIG5vIGZsdXNoIGFmdGVyIHRoZSBsYXN0IGR1bXBfdXNlcl9yYW5nZSgpIGFuZCBhIHBpcGUgY2Fubm90IHNlZWssXG4mIzQzOyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcbiYjNDM7ICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZVxuJiM0MzsgKiBwYWdlIHNob3J0IG9mIHdoYXQgdGhlIGhlYWRlcnMgcHJvbWlzZS4gQHRhaWwgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGF0XG4mIzQzOyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXG4mIzQzOyAqL1xuJiM0Mztsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpXG4mIzQzO3tcbiYjNDM7XHRFbGZXKFBoZHIpICpwaGRyID0gTlVMTDtcbiYjNDM7XHRsb25nIGxvbmcgZXhwZWN0ZWQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGludCBucGhkciwgaTtcbiYjNDM7XHRFbGZXKEVoZHIpIGVoO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0KnRhaWwgPSAwO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocmVhZChmZCwgXHUwMDI2ZWgsIHNpemVvZihlaCkpICE9IHNpemVvZihlaCkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHRpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHRpZiAoIWVoLmVfcGhudW0gfHwgZWguZV9waGVudHNpemUgIT0gc2l6ZW9mKCpwaGRyKSlcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRucGhkciA9IGVoLmVfcGhudW07XG4mIzQzO1x0cGhkciA9IGNhbGxvYyhucGhkciwgc2l6ZW9mKCpwaGRyKSk7XG4mIzQzO1x0aWYgKCFwaGRyKVxuJiM0MztcdFx0Z290byBlcnI7XG4mIzQzO1x0aWYgKHByZWFkKGZkLCBwaGRyLCAoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSwgKG9mZl90KWVoLmVfcGhvZmYpICE9XG4mIzQzO1x0ICAgIChzc2l6ZV90KSgoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnBoZHI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICYjNDM7XG4mIzQzO1x0XHRcdFx0KGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6O1xuJiM0MztcdFx0aWYgKGVuZCBcdTAwM2UgZXhwZWN0ZWQpIHtcbiYjNDM7XHRcdFx0ZXhwZWN0ZWQgPSBlbmQ7XG4mIzQzO1x0XHRcdCp0YWlsID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnJlZShwaGRyKTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIGV4cGVjdGVkO1xuJiM0MztlcnI6XG4mIzQzO1x0ZnJlZShwaGRyKTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDssCiAgICAmIzM0O0NJRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OywKICAgICYjMzQ7c21iX3NlbmRfa3ZlYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY4ZTQxYTNjOWNlMjIwZmUxMzU3MmZkNDk0NWI2ZGFlZTU1YmUwY2UKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAxOCAxMTozMToyMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtMTE2NSw2ICYjNDM7MTE2NSw3IEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pCiAJc3RydWN0IGNvcmVfbmFtZSBjbjsKIAljb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtJmd0O21tOwogCWNvbnN0IHN0cnVjdCBsaW51eF9iaW5mbXQgKmJpbmZtdCA9IG1tLSZndDtiaW5mbXQ7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IGFyZ2MgPSAwOwogCXN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHsKIAkJLnNpZ2luZm8gPSBzaWdpbmZvLApAQCAtMTE5Niw5ICYjNDM7MTE5NywxMiBAQCB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKQogCWlmIChjb3JlZHVtcF93YWl0KHNpZ2luZm8tJmd0O3NpX3NpZ25vLCAmYW1wO2NvcmVfc3RhdGUpICZsdDsgMCkKIAkJcmV0dXJuOwogCiYjNDM7CS8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqLwomIzQzOwlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAlzY29wZWRfd2l0aF9jcmVkcyhjcmVkKQogCQlkb19jb3JlZHVtcCgmYW1wO2NuLCAmYW1wO2Nwcm0sICZhbXA7YXJndiwgJmFtcDthcmdjLCBiaW5mbXQpOwogCWNvcmVkdW1wX2NsZWFudXAoJmFtcDtjbiwgJmFtcDtjcHJtKTsKJiM0MzsJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jIGIvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYwppbmRleCBmZGY0ZTUwYzI3Y2ViLi4wNWRjMjA5MTZjMjc2IDEwMDY0NAotLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMKQEAgLTIyLDcgJiM0MzsyMiw2IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtcG9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKICNpbmNsdWRlICYjMzQ7Y2lmc2dsb2IuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O2NpZnNwcm90by5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Y2lmc19kZWJ1Zy5oJiMzNDsKQEAgLTE0Miw2ICYjNDM7MTQxLDcgQEAgaW50CiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkgICAgICBzaXplX3QgKnNlbnQpCiB7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IHJjID0gMDsKIAlpbnQgcmV0cmllcyA9IDA7CiAJc3RydWN0IHNvY2tldCAqc3NvY2tldCA9IHNlcnZlci0mZ3Q7c3NvY2tldDsKQEAgLTE3MiwxNSAmIzQzOzE3MiwxMiBAQCBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkJICogYWZ0ZXIgdGhlIHJldHJpZXMgd2Ugd2lsbCBraWxsIHRoZSBzb2NrZXQgYW5kCiAJCSAqIHJlY29ubmVjdCB3aGljaCBtYXkgY2xlYXIgdGhlIG5ldHdvcmsgcHJvYmxlbS4KIAkJICoKLQkJICogRXZlbiBpZiByZWd1bGFyIHNpZ25hbHMgYXJlIG1hc2tlZCwgRUlOVFIgbWlnaHQgYmUKLQkJICogcHJvcGFnYXRlZCBmcm9tIHNrX3N0cmVhbV93YWl0X21lbW9yeSgpIHRvIGhlcmUgd2hlbgotCQkgKiBUSUZfTk9USUZZX1NJR05BTCBpcyB1c2VkIGZvciB0YXNrIHdvcmsuIEZvciBleGFtcGxlLAotCQkgKiBjZXJ0YWluIGlvX3VyaW5nIGNvbXBsZXRpb25zIHdpbGwgdXNlIHRoYXQuIFRyZWF0Ci0JCSAqIGhhdmluZyBFSU5UUiB3aXRoIHBlbmRpbmcgdGFzayB3b3JrIHRoZSBzYW1lIGFzIEVBR0FJTgotCQkgKiB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNvbm5lY3RzLgomIzQzOwkJICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS4KIAkJICovCiYjNDM7CQlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAkJcmMgPSBzb2NrX3NlbmRtc2coc3NvY2tldCwgc21iX21zZyk7Ci0JCWlmIChyYyA9PSAtRUFHQUlOIHx8IHVubGlrZWx5KHJjID09IC1FSU5UUiAmYW1wOyZhbXA7IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkgewomIzQzOwkJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiYjNDM7CQlpZiAocmMgPT0gLUVBR0FJTikgewogCQkJcmV0cmllcyYjNDM7JiM0Mzs7CiAJCQlpZiAocmV0cmllcyAmZ3Q7PSAxNCB8fAogCQkJICAgICghc2VydmVyLSZndDtub2Jsb2Nrc25kICZhbXA7JmFtcDsgKHJldHJpZXMgJmd0OyAyKSkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCAzNzNiY2MwNTk4ZDEwLi5mZDcyY2E0ZWU5MmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xNzk2LDcgJiM0MzsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7CiAJCQkJCQkgKiBJIGFtIGNsZWFuaW5nIGRpcnR5IHBhZ2VzIGZyb20gc29tZSBvdGhlciBiZGkuICovCiAjZGVmaW5lIFBGX0tUSFJFQUQJCTB4MDAyMDAwMDAJLyogSSBhbSBhIGtlcm5lbCB0aHJlYWQgKi8KICNkZWZpbmUgUEZfUkFORE9NSVpFCQkweDAwNDAwMDAwCS8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgUEZfX0hPTEVfXzAwODAwMDAwCTB4MDA4MDAwMDAKJiM0MzsjZGVmaW5lIFBGX05PX05PVElGWV9TSUdOQUwJMHgwMDgwMDAwMAkvKiBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkgKi8KICNkZWZpbmUgUEZfX0hPTEVfXzAxMDAwMDAwCTB4MDEwMDAwMDAKICNkZWZpbmUgUEZfX0hPTEVfXzAyMDAwMDAwCTB4MDIwMDAwMDAKICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFkJMHgwNDAwMDAwMAkvKiBVc2VybGFuZCBpcyBub3QgYWxsb3dlZCB0byBtZWRkbGUgd2l0aCBjcHVzX21hc2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCmluZGV4IDU4NGFlODhiNDM1ZTkuLjMxODJkZTRmZjk0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaApAQCAtMzg0LDE0ICYjNDM7Mzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiAJcmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTsKIH0KIAomIzQzOy8qIFByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhpcyB0YXNrLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vX25vdGlmeV9zaWduYWxfc2F2ZSh2b2lkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IGZsYWdzID0gY3VycmVudC0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsKJiM0MzsJY3VycmVudC0mZ3Q7ZmxhZ3MgfD0gUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsJcmV0dXJuIGZsYWdzOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJY3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW5saW5lIGludCBzaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJLyoKIAkgKiBUSUZfTk9USUZZX1NJR05BTCBpc24mIzM5O3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWUKIAkgKiBiZWhhdmlvciBpbiB0ZXJtcyBvZiBlbnN1cmluZyB0aGF0IHdlIGJyZWFrIG91dCBvZiB3YWl0IGxvb3BzCi0JICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLgomIzQzOwkgKiBzbyB0aGF0IG5vdGlmeSBzaWduYWwgY2FsbGJhY2tzIGNhbiBiZSBwcm9jZXNzZWQuIE5vdCBmb3IgYSB0YXNrCiYjNDM7CSAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuCiAJICovCi0JaWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkpCiYjNDM7CWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpICZhbXA7JmFtcDsKJiM0MzsJICAgIGxpa2VseSghKFJFQURfT05DRShwLSZndDtmbGFncykgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTCkpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gdGFza19zaWdwZW5kaW5nKHApOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQppbmRleCBkZWNlMWEzMWQ1NjFiLi43MjhmM2MzNDJlYjkyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQpAQCAtMyw3ICYjNDM7MywxMCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QKJiM0MzsjIFNwYXduZWQgYnkgdGhlIGtlcm5lbCBhcyB0aGUgfGhlbHBlciwgbm90IGEgdGVzdCBvZiBpdHMgb3duLgomIzQzO1RFU1RfR0VOX0ZJTEVTIDo9IGNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyCiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwomIzQzOyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlcjogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi45YTI4OTJkZTgxOTJiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oCkBAIC0wLDAgJiM0MzsxLDI5IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9ICiYjNDM7I2RlZmluZSBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90eXBlcy5oJmd0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUKJiM0MzsgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0JiMzOTtzIHdheSBiZXlvbmQgdGhlIGRlZmF1bHQgNjRLCiYjNDM7ICogcGlwZSByaW5nIGFuZCBwYXN0IHRoZSB+MzZLIGFuIGFmX3VuaXggc2tiIGhvbGRzLiBTbyB3ZSBmb3JjZSBhIHdyaXRlCiYjNDM7ICogdG8gY29tZSBiYWNrIHNob3J0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQJCTQwMDAKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUwkoNFVMICZsdDsmbHQ7IDIwKQomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VUwkJMjAwMDAwCiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX01BUEZJTEUJCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLm1hcGZpbGUmIzM0OwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9UUklHR0VSCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5jb3JlJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5zb2NrZXQmIzM0OwomIzQzOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKTsKJiM0Mztzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKTsKJiM0Mztsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpOwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODQ5ZjVjMWVhNzM2NQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKQEAgLTAsMCAmIzQzOzEsNDYgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHxoZWxwZXIgaGFsZiBvZiBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuIFRoZSBrZXJuZWwgc3Bhd25zIHRoaXMKJiM0MzsgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LgomIzQzOyAqIEl0IHNhdmVzIHRoZSBkdW1wIGFuZCwgb25jZSB0aGUgbm90ZXMgaGF2ZSBzdGFydGVkLCB0cmlwcyB0aGUgZmlmbyB0aGUKJiM0MzsgKiBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgc28gVElGX05PVElGWV9TSUdOQUwgaXMgcmFpc2VkIHdoaWxlIHRoZSBub3RlCiYjNDM7ICogd3JpdGUgaXMgaW4gZmxpZ2h0LgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwomIzQzOwomIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiYjNDM7ewomIzQzOwlpbnQgZmRfY29yZV9maWxlOwomIzQzOwlzc2l6ZV90IHJldDsKJiM0MzsKJiM0MzsJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwKJiM0MzsJCQkgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7CiYjNDM7CWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlyZXR1cm4gRVhJVF9GQUlMVVJFOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7CiYjNDM7CWNsb3NlKGZkX2NvcmVfZmlsZSk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CS8qIFRoZSB0ZXN0IHBvbGxzIGZvciB0aGlzIG5hbWUsIHNvIG9ubHkgY3JlYXRlIGl0IG9uY2UgaXQgaXMgd2hvbGUuICovCiYjNDM7CWlmIChyZW5hbWUoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlbmFtZSBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gRVhJVF9TVUNDRVNTOwomIzQzOwomIzQzO2VycjoKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTsKJiM0MzsJcmV0dXJuIEVYSVRfRkFJTFVSRTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2M2MwNmE4MTU2MmYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYwpAQCAtMCwwICYjNDM7MSwyNDUgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjb3JlZHVtcCBpcyBtZWFudCB0byBiZSBpbnRlcnJ1cHRlZCBieSBTSUdLSUxMIGFuZCBieSB0aGUgZnJlZXplciBhbmQKJiM0MzsgKiBieSBub3RoaW5nIGVsc2UuIGR1bXBfaW50ZXJydXB0ZWQoKSBzYXlzIHNvLCBidXQgdGhlIGJsb2NraW5nIHdhaXRzCiYjNDM7ICogdW5kZXJuZWF0aCBpdCB0ZXN0IHNpZ25hbF9wZW5kaW5nKCksIHdoaWNoIGlzIGFsc28gdHJ1ZSBmb3IKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTC4gQSBjcmFzaGluZyB0YXNrIHRoYXQgaGFzIGFuIGlvX3VyaW5nIGNvbXBsZXRpb24gbGFuZAomIzQzOyAqIG9uIGl0IG1pZC1kdW1wIHRoZXJlZm9yZSBrZWVwcyBkdW1waW5nIHdoaWxlIGV2ZXJ5IHdhaXQgaXQgZW50ZXJzIGJhaWxzCiYjNDM7ICogb3V0IGF0IG9uY2UsIGFuZCB0aGUgZHVtcCBpcyBzaWxlbnRseSBjdXQgc2hvcnQuIE5vdGhpbmcgcmVwb3J0cyBpdDoKJiM0MzsgKiBiaW5mbXRfZWxmIHNldHMgaGFzX2R1bXBlZCBiZWZvcmUgaXQgd3JpdGVzIGFueXRoaW5nLCBzbyBXQ09SRURVTVAoKQomIzQzOyAqIHNheXMgdGhlIGR1bXAgd29ya2VkLgomIzQzOyAqCiYjNDM7ICogQSBjb3JlZHVtcCBub3RlIGlzIHRoZSBvbmx5IGR1bXBfZW1pdCgpIHRoYXQgZXhjZWVkcyB3aGF0IHRoZSB0cmFuc3BvcnQKJiM0MzsgKiB0YWtlcyBpbiBvbmUgZ28sIHNvIGl0IGlzIHRoZSBvbmUgd3JpdGUgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLiBCb3RoCiYjNDM7ICogdGVzdHMgY3Jhc2ggYSBjaGlsZCBob2xkaW5nIGVub3VnaCBmaWxlIGJhY2tlZCBtYXBwaW5ncyBmb3IgaXRzIE5UX0ZJTEUKJiM0MzsgKiBub3RlIHRvIHJ1biBwYXN0IHRoYXQsIGFybSBhbiBpb191cmluZyBwb2xsIG9uIGl0LCBhbmQgdHJpcCB0aGUgcG9sbAomIzQzOyAqIHdoaWxlIHRoZSBub3RlIGlzIGJlaW5nIHdyaXR0ZW4uIFdoYXQgY29tZXMgb3V0IGhhcyB0byBiZSB0aGUgd2hvbGUKJiM0MzsgKiBkdW1wLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3NvY2tldC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLAomIzQzOwkJICAgIHNpemVvZihzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTsKJiM0MzsJQVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpOwomIzQzOwlBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7CiYjNDM7CiYjNDM7CXNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybltyZXRdID0gJiMzOTtcMCYjMzk7OwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpOwomIzQzOwlBU1NFUlRfR0Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQsIDApOwomIzQzOwomIzQzOwlyZXQgPSBmY2xvc2UoZmlsZSk7CiYjNDM7CUFTU0VSVF9FUSgwLCByZXQpOwomIzQzOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJQVNTRVJUX0VRKG1rZmlmbyhOT1RJRllfU0lHTkFMX1RSSUdHRVIsIDA2MDApLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9TT0NLRVQpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfTUFQRklMRSk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2hlY2sgdGhhdCB3aGF0IHRoZSBoZWxwZXIgb3IgdGhlIHNlcnZlciBzYXZlZCBpcyB0aGUgd2hvbGUgZHVtcC4gT25seQomIzQzOyAqIGEgaG9sZSBhdCB0aGUgdmVyeSBlbmQgY2FuIGJlIG1pc3NpbmcsIHNlZSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfd2hvbGVfY29yZWR1bXAoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhKQomIzQzO3sKJiM0MzsJbG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJZXhwZWN0ZWQgPSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCAmYW1wO3RhaWwpOwomIzQzOwlBU1NFUlRfR1QoZXhwZWN0ZWQsIDApOwomIzQzOwlBU1NFUlRfRVEoc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCksIDApOwomIzQzOwlBU1NFUlRfTEUoKGxvbmcgbG9uZylzdC5zdF9zaXplLCBleHBlY3RlZCk7CiYjNDM7CUFTU0VSVF9HRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkIC0gdGFpbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGR1bXAgZ29lcyB0byBhIHxoZWxwZXIsIHNvIHRoZSByZWFkZXIgaXMgYSBzZXBhcmF0ZSBwcm9ncmFtIHRoZQomIzQzOyAqIGtlcm5lbCBzcGF3bnMuIEl0IHNhdmVzIHdoYXQgaXQgcmVjZWl2ZWQgdG8gTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUuCiYjNDM7ICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3BpcGUpCiYjNDM7ewomIzQzOwljaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzdGF0dXMsIGk7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJbiA9IHJlYWRsaW5rKCYjMzQ7L3Byb2Mvc2VsZi9leGUmIzM0OywgaGVscGVyLCBzaXplb2YoaGVscGVyKSAtIDEpOwomIzQzOwlBU1NFUlRfR1QobiwgMCk7CiYjNDM7CWhlbHBlcltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJcCA9IHN0cnN0cihoZWxwZXIsICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0JiMzNDspOwomIzQzOwlBU1NFUlRfTkUocCwgTlVMTCk7CiYjNDM7CUFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSAmIzQzOyBzaXplb2YoJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KSwKJiM0MzsJCSAgc2l6ZW9mKGhlbHBlcikpOwomIzQzOwlzdHJjcHkocCwgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KTsKJiM0MzsJaWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIgbm90IGJ1aWx0JiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O3wlcyYjMzQ7LCBoZWxwZXIpLAomIzQzOwkJICAoaW50KXNpemVvZihwYXR0ZXJuKSk7CiYjNDM7CUFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJLyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCkgJmFtcDsmYW1wOyBzdC5zdF9zaXplKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi8KJiM0MztURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfc29ja2V0KQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyOwomIzQzOwlpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1czsKJiM0MzsJY2hhciBwYXR0ZXJuW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsCiYjNDM7CQkJICAgICBpcGNfc29ja2V0cyksIDApOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O0AlcyYjMzQ7LAomIzQzOwkJCSAgIE5PVElGWV9TSUdOQUxfU09DS0VUKSwgKGludClzaXplb2YocGF0dGVybikpOwomIzQzOwlBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQlpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xOwomIzQzOwkJaW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKJiM0MzsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzBdKTsKJiM0MzsKJiM0MzsJCWZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KE5PVElGWV9TSUdOQUxfU09DS0VUKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKHdyaXRlX25vaW50cihpcGNfc29ja2V0c1sxXSwgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzFdKTsKJiM0MzsKJiM0MzsJCWZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7CiYjNDM7CQlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwKJiM0MzsJCQkJICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsCiYjNDM7CQkJCSAgICAwNjAwKTsKJiM0MzsJCWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJaWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLAomIzQzOwkJCQkJCXRydWUpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJCWV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUzsKJiM0MztvdXQ6CiYjNDM7CQlpZiAoZmRfY29yZV9maWxlICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRfY29yZV9maWxlKTsKJiM0MzsJCWlmIChmZF9jb3JlZHVtcCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX2NvcmVkdW1wKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZF9zZXJ2ZXIpOwomIzQzOwkJX2V4aXQoZXhpdF9jb2RlKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJd2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7CiYjNDM7CiYjNDM7CWNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmgKaW5kZXggZWQ0N2YwMWZhNTNjNS4uMDZmOTk3YmE0N2ZkOSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaApAQCAtOSw2ICYjNDM7OSw3IEBACiAKICNpbmNsdWRlICYjMzQ7Li4va3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0Oy4uL3BpZGZkL3BpZGZkLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oJiMzNDsKIAogI2lmbmRlZiBQQUdFX1NJWkUKICNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKQEAgLTEsMTEgJiM0MzsxLDE4IEBACiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAogCiAjaW5jbHVkZSAmbHQ7YXNzZXJ0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2VsZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtlbmRpYW4uaCZndDsKICNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwogI2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbmsuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RkZGVmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2lvX3VyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jb3JlZHVtcC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKICNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkYm9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CkBAIC0xMyw3ICYjNDM7MjAsOSBAQAogI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9lcG9sbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c2NhbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKICNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwpAQCAtMjEsNiAmIzQzOzMwLDcgQEAKIAogI2luY2x1ZGUgJiMzNDsuLi9maWxlc3lzdGVtcy93cmFwcGVycy5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Li4vcGlkZmQvcGlkZmQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyB0byBhdm9pZCBpbmNsdWRpbmcgaGFybmVzcyBoZWFkZXIgKi8KIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7CkBAIC0zODEsMyAmIzQzOzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWwKIAkJY2xvc2UoZmRfY29yZWR1bXApOwogCV9leGl0KGV4aXRfY29kZSk7CiB9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLgomIzQzOyAqCiYjNDM7ICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGUKJiM0MzsgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3QKJiM0MzsgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLAomIzQzOyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnMKJiM0MzsgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uCiYjNDM7ICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC4KJiM0MzsgKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzeXNjYWxsKF9fTlJfaW9fdXJpbmdfc2V0dXAsIGVudHJpZXMsIHApOwomIzQzO30KJiM0MzsKJiM0MzsvKiBpb191cmluZyByZWFkcyBwb2xsMzJfZXZlbnRzIGJhY2sgdGhyb3VnaCBzd2FodzMyKCkgb24gYmlnIGVuZGlhbi4gKi8KJiM0MztzdGF0aWMgX191MzIgbm90aWZ5X3BvbGxfbWFzayhfX3UzMiBldmVudHMpCiYjNDM7ewomIzQzOyNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJmFtcDsmYW1wOyBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCiYjNDM7CXJldHVybiBfX3N3YWh3MzIoZXZlbnRzKTsKJiM0MzsjZWxzZQomIzQzOwlyZXR1cm4gZXZlbnRzOwomIzQzOyNlbmRpZgomIzQzO30KJiM0MzsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBpb191cmluZ19zZXR1cF9yYXcoMSwgJmFtcDtwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC0mZ3Q7bm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMCiYjNDM7ICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnMKJiM0MzsgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZAomIzQzOyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHAgPSB7fTsKJiM0MzsJdW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7CiYjNDM7CXN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7CiYjNDM7CXNpemVfdCBzcXJpbmdfc3o7CiYjNDM7CXZvaWQgKnNxOwomIzQzOwlpbnQgcmluZzsKJiM0MzsKJiM0MzsJcmluZyA9IGlvX3VyaW5nX3NldHVwX3Jhdyg4LCAmYW1wO3ApOwomIzQzOwlpZiAocmluZyAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXNxcmluZ19zeiA9IHAuc3Ffb2ZmLmFycmF5ICYjNDM7IHAuc3FfZW50cmllcyAqIHNpemVvZih1bnNpZ25lZCBpbnQpOwomIzQzOwlzcSA9IG1tYXAoTlVMTCwgc3FyaW5nX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRX1JJTkcpOwomIzQzOwlpZiAoc3EgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJc3FlcyA9IG1tYXAoTlVMTCwgcC5zcV9lbnRyaWVzICogc2l6ZW9mKCpzcWVzKSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSAgICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRRVMpOwomIzQzOwlpZiAoc3FlcyA9PSBNQVBfRkFJTEVEKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlzcV90YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICYjNDM7IHAuc3Ffb2ZmLnRhaWwpOwomIzQzOwlzcV9hcnJheSA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi5hcnJheSk7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO3NxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7CiYjNDM7CXNxZXNbMF0ub3Bjb2RlID0gSU9SSU5HX09QX1BPTExfQUREOwomIzQzOwlzcWVzWzBdLmZkID0gdHJpZ2dlcl9mZDsKJiM0MzsJc3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pOwomIzQzOwomIzQzOwlzcV9hcnJheVswXSA9IDA7CiYjNDM7CV9fYXRvbWljX3N0b3JlX24oc3FfdGFpbCwgMSwgX19BVE9NSUNfUkVMRUFTRSk7CiYjNDM7CiYjNDM7CWlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJLyogRGVsaWJlcmF0ZWx5IGxlYWtlZCwgd2UgYXJlIGFib3V0IHRvIGNyYXNoLiAqLwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlCiYjNDM7ICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvCiYjNDM7ICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLgomIzQzOyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuCiYjNDM7ICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWludCBmZCwgaTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSwKJiM0MzsJCSAgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChmdHJ1bmNhdGUoZmQsIChvZmZfdClOT1RJRllfU0lHTkFMX01BUF9DT1VOVCAqIHBnc3opKSB7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcHJvdCA9IChpICZhbXA7IDEpID8gUFJPVF9SRUFEIDogKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwomIzQzOwomIzQzOwkJaWYgKG1tYXAoTlVMTCwgcGdzeiwgcHJvdCwgTUFQX1BSSVZBVEUsIGZkLAomIzQzOwkJCSAob2ZmX3QpaSAqIHBnc3opID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gaTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CXVuc2lnbmVkIGNoYXIgKnA7CiYjNDM7CWludCB0cmlnZ2VyX2ZkOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZjsKJiM0MzsKJiM0MzsJLyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXImIzM5O3Mgb3BlbigpIGNhbm5vdCBibG9jay4gKi8KJiM0MzsJdHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpOwomIzQzOwomIzQzOwkvKiBFeGl0IHJhdGhlciB0aGFuIGNyYXNoOiBhIGR1bXAgd2l0aG91dCB0aGUgcG9sbCBhcm1lZCBwcm92ZXMgbm90aGluZy4gKi8KJiM0MzsJaWYgKHRyaWdnZXJfZmQgJmx0OyAwKQomIzQzOwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsKJiM0MzsJaWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwlmb3IgKG9mZiA9IDA7IG9mZiAmbHQ7IE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUzsgb2ZmICYjNDM7PSBwZ3N6KQomIzQzOwkJcFtvZmZdID0gMTsKJiM0MzsKJiM0MzsJaWYgKGFybV9wb2xsX25vdGlmeSh0cmlnZ2VyX2ZkKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CS8qIGNyYXNoIG9uIHB1cnBvc2UgKi8KJiM0MzsJKih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDsKJiM0MzsJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgT19XUk9OTFkgfCBPX05PTkJMT0NLIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAod3JpdGUoZmQsICYjMzQ7eCYjMzQ7LCAxKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogd3JpdGUgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHBoZHJbMF0gaXMgdGhlIFBUX05PVEUgZW50cnk6IGVsZl9jb3JlX2R1bXAoKSBlbWl0cyBpdCByaWdodCBhZnRlciB0aGUKJiM0MzsgKiBFTEYgaGVhZGVyLiBJdHMgcF9vZmZzZXQgaXMgd2hlcmUgdGhlIG5vdGVzIGJlZ2luLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGxvbmcgbm90ZV9vZmZzZXQoY29uc3QgdW5zaWduZWQgY2hhciAqaGRyKQomIzQzO3sKJiM0MzsJRWxmVyhQaGRyKSBwaDsKJiM0MzsJRWxmVyhFaGRyKSBlaDsKJiM0MzsKJiM0MzsJbWVtY3B5KCZhbXA7ZWgsIGhkciwgc2l6ZW9mKGVoKSk7CiYjNDM7CWlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbWVtY3B5KCZhbXA7cGgsIGhkciAmIzQzOyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTsKJiM0MzsJaWYgKHBoLnBfdHlwZSAhPSBQVF9OT1RFKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gKGxvbmcgbG9uZylwaC5wX29mZnNldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBEcmFpbiBhIGNvcmVkdW1wIG9mZiBAZmQsIGNvdW50aW5nIHdoYXQgYXJyaXZlcy4gT25jZSB0aGUgbm90ZXMgaGF2ZQomIzQzOyAqIHN0YXJ0ZWQgdGhlIGtlcm5lbCBpcyBpbnNpZGUgdGhlIG9uZSBiaWcgbm90ZSB3cml0ZSwgc28gcG9rZSB0aGUgZmlmbwomIzQzOyAqIHRoZSBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgYW5kIHN0b3AgcmVhZGluZywgd2hpY2gga2VlcHMgdGhlCiYjNDM7ICogdHJhbnNwb3J0IGZ1bGwgYW5kIHRoZSB3cml0ZSBibG9ja2VkIHdpdGggYSBwYXJ0aWFsIGNvdW50IHdoZW4gdGhlCiYjNDM7ICogd2FrZXVwIGxhbmRzLiBUaGVuIGNhcnJ5IG9uIHRvIGVuZCBvZiBmaWxlLgomIzQzOyAqCiYjNDM7ICogV2hhdCBhcnJpdmVzIGlzIHdyaXR0ZW4gdG8gQGZkX291dCB3aGVuIHRoYXQgaXMgbm90IG5lZ2F0aXZlLgomIzQzOyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEuIEZhaWxpbmcgdG8gdHJpcCB0aGUgZmlmbwomIzQzOyAqIGlzIGFuIGVycm9yIHRvbzogYSBkdW1wIHRoYXQgd2FzIG5ldmVyIGludGVycnVwdGVkIHByb3ZlcyBub3RoaW5nLgomIzQzOyAqLwomIzQzO3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGhkcltzaXplb2YoRWxmVyhFaGRyKSkgJiM0Mzsgc2l6ZW9mKEVsZlcoUGhkcikpXTsKJiM0MzsJc3RhdGljIGNoYXIgYnVmWzY0ICZsdDsmbHQ7IDEwXTsKJiM0MzsJbG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwlsb25nIGxvbmcgbm90ZV9vZmYgPSAwOwomIzQzOwlzaXplX3QgaGRybGVuID0gMDsKJiM0MzsJc3NpemVfdCB0b3RhbCA9IDA7CiYjNDM7CWJvb2wgYXJtZWQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJc3NpemVfdCBuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CiYjNDM7CiYjNDM7CQlpZiAobiAmbHQ7IDApIHsKJiM0MzsJCQlpZiAoZXJybm8gPT0gRUlOVFIpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCXJldHVybiAtMTsKJiM0MzsJCX0KJiM0MzsJCWlmIChuID09IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAoZmRfb3V0ICZndDs9IDAgJmFtcDsmYW1wOyB3cml0ZShmZF9vdXQsIGJ1ZiwgbikgIT0gbikKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CQlpZiAoaGRybGVuICZsdDsgc2l6ZW9mKGhkcikpIHsKJiM0MzsJCQlzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuOwomIzQzOwomIzQzOwkJCWlmICh3YW50ICZndDsgKHNpemVfdCluKQomIzQzOwkJCQl3YW50ID0gKHNpemVfdCluOwomIzQzOwkJCW1lbWNweShoZHIgJiM0MzsgaGRybGVuLCBidWYsIHdhbnQpOwomIzQzOwkJCWhkcmxlbiAmIzQzOz0gd2FudDsKJiM0MzsJCQlpZiAoaGRybGVuID09IHNpemVvZihoZHIpKQomIzQzOwkJCQlub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQl0b3RhbCAmIzQzOz0gbjsKJiM0MzsKJiM0MzsJCWlmIChhcm0gJmFtcDsmYW1wOyAhYXJtZWQgJmFtcDsmYW1wOyBub3RlX29mZiAmZ3Q7IDAgJmFtcDsmYW1wOwomIzQzOwkJICAgIHRvdGFsICZndDsgbm90ZV9vZmYgJiM0MzsgKGxvbmcgbG9uZylwZ3N6KSB7CiYjNDM7CQkJaWYgKHB1bGxfdHJpZ2dlcigpKQomIzQzOwkJCQlyZXR1cm4gLTE7CiYjNDM7CQkJYXJtZWQgPSB0cnVlOwomIzQzOwkJCXVzbGVlcChOT1RJRllfU0lHTkFMX1NUQUxMX1VTKTsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYXJtICZhbXA7JmFtcDsgIWFybWVkKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlyZXR1cm4gdG90YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogSG93IGxhcmdlIHRoZSBkdW1wIHdhcyBtZWFudCB0byBiZS4gVGhlIEVMRiBoZWFkZXIgYW5kIHRoZSBwcm9ncmFtCiYjNDM7ICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvdwomIzQzOyAqIGZhciBpdCBzaG91bGQgaGF2ZSBydW46IHRoZSBlbmQgaXMgbWF4KHBfb2Zmc2V0ICYjNDM7IHBfZmlsZXN6KS4KJiM0MzsgKgomIzQzOyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyCiYjNDM7ICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLSZndDt0b19za2lwLCBlbGZfY29yZV9kdW1wKCkKJiM0MzsgKiBoYXMgbm8gZmx1c2ggYWZ0ZXIgdGhlIGxhc3QgZHVtcF91c2VyX3JhbmdlKCkgYW5kIGEgcGlwZSBjYW5ub3Qgc2VlaywKJiM0MzsgKiBzbyB0aG9zZSBieXRlcyBhcmUgZHJvcHBlZC4gT24geDg2XzY0IHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIGdhdGUgdm1hCiYjNDM7ICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZQomIzQzOyAqIHBhZ2Ugc2hvcnQgb2Ygd2hhdCB0aGUgaGVhZGVycyBwcm9taXNlLiBAdGFpbCByZXR1cm5zIHRoZSBzaXplIG9mIHRoYXQKJiM0MzsgKiBsYXN0IHNlZ21lbnQsIHdoaWNoIGJvdW5kcyB3aGF0IG1heSBnbyBtaXNzaW5nIHRoaXMgd2F5LgomIzQzOyAqLwomIzQzO2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCkKJiM0Mzt7CiYjNDM7CUVsZlcoUGhkcikgKnBoZHIgPSBOVUxMOwomIzQzOwlsb25nIGxvbmcgZXhwZWN0ZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbnBoZHIsIGk7CiYjNDM7CUVsZlcoRWhkcikgZWg7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJKnRhaWwgPSAwOwomIzQzOwomIzQzOwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtlaCwgc2l6ZW9mKGVoKSkgIT0gc2l6ZW9mKGVoKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKCFlaC5lX3BobnVtIHx8IGVoLmVfcGhlbnRzaXplICE9IHNpemVvZigqcGhkcikpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJbnBoZHIgPSBlaC5lX3BobnVtOwomIzQzOwlwaGRyID0gY2FsbG9jKG5waGRyLCBzaXplb2YoKnBoZHIpKTsKJiM0MzsJaWYgKCFwaGRyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CWlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPQomIzQzOwkgICAgKHNzaXplX3QpKChzaXplX3QpbnBoZHIgKiBzaXplb2YoKnBoZHIpKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnBoZHI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICYjNDM7CiYjNDM7CQkJCShsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejsKJiM0MzsJCWlmIChlbmQgJmd0OyBleHBlY3RlZCkgewomIzQzOwkJCWV4cGVjdGVkID0gZW5kOwomIzQzOwkJCSp0YWlsID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWUocGhkcik7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIGV4cGVjdGVkOwomIzQzO2VycjoKJiM0MzsJZnJlZShwaGRyKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjA2MQoJCQkJCQkJb3V0cHV0OiAyNQoJCQkJCQkJdGhvdWdodHM6IDQwMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQcm9wb3NlZCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaC4gSXQmIzM5O3MgdG91Y2hpbmcgYGZzL2NvcmVkdW1wLmNgIGFuZCBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2AsIHdoaWNoIGlzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nLiBUaGV5JiMzOTtyZSBpbnRyb2R1Y2luZyB0aGVzZSBgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKClgIGFuZCBgbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKClgIGZ1bmN0aW9ucywgYW5kIHRoYXQmIzM5O3MgdXN1YWxseSB0byBwcmV2ZW50IHNvbWUgc2lnbmFsIGZyb20gaW50ZXJydXB0aW5nIGNyaXRpY2FsIHNlY3Rpb25zLiBBbmQsIGp1ZGdpbmcgYnkgdGhlIG5hbWUgYW5kIGxvY2F0aW9uLCBpdCYjMzk7cyBgVElGX05PVElGWV9TSUdOQUxgIHRoYXQgdGhleSBhcmUgdHJ5aW5nIHRvIHByb3RlY3QgYWdhaW5zdC4gSSBzZWUgYSBuZXcgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcgYmVpbmcgYWRkZWQgdG8gYHNjaGVkLmhgIGFuZCBhIG1vZGlmaWNhdGlvbiB0byBgc2lnbmFsX3BlbmRpbmcoKWAsIHNvIHdlJiMzOTtyZSBkZWZpbml0ZWx5IHRhbGtpbmcgYWJvdXQgYSBjaGFuZ2UgdG8gaG93IHNpZ25hbHMgYXJlIGhhbmRsZWQuIEEgc2VsZnRlc3QsIGBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RgLCBpcyBhbHNvIGluY2x1ZGVkLgoKVGhlIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIGEgc2lnbmlmaWNhbnQgY2hhbmdlIGFuZCBpcyBpdCByZWFjaGFibGU/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBhY3QuIEkgc2VlIHRoYXQgdGhlIGNoYW5nZXMgYXJlIHdpdGhpbiBgdmZzX2NvcmVkdW1wKClgIGFuZCBgc21iX3NlbmRfa3ZlYygpYCwgc28gdGhvc2UgYXJlIHRoZSBmdW5jdGlvbnMgdG8gZXhhbWluZSBjbG9zZWx5LgoKYHZmc19jb3JlZHVtcCgpYCBpcyBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGFuZCBoaWdobHkgcmVhY2hhYmxlLiBObyBpc3N1ZSB0aGVyZS4gQW5kIGBzbWJfc2VuZF9rdmVjKClgIGlzIGluIHRoZSBTTUIgY2xpZW50IGRyaXZlci4gVGhhdCYjMzk7cyB1c2VkIHF1aXRlIGEgYml0LCBzbyB0aGF0JiMzOTtzIGFsc28gcmVhY2hhYmxlLiBTbywgZnVuY3Rpb25hbGx5LCB3ZSYjMzk7cmUgbW9kaWZ5aW5nIHNpZ25hbCBoYW5kbGluZyBhbG9uZyB0aGVzZSBjcnVjaWFsIHBhdGhzLiBZZXMsIHRoYXQmIzM5O3MgYSBmdW5jdGlvbmFsIGNoYW5nZSwgYW5kIHdlIG5lZWQgdG8gaW52ZXN0aWdhdGUuCgpGb2N1c2luZyBvdXIgZnV6emluZyBlZmZvcnRzLCBpdCBsb29rcyBsaWtlIGB2ZnNfY29yZWR1bXAoKWAgYW5kIGBzbWJfc2VuZF9rdmVjKClgIGFyZSB0aGUgcHJpbWFyeSB0YXJnZXRzIGZvciBub3cuIEkgc2hvdWxkIGNoZWNrIHRoZSByZWxldmFudCBjb25maWdzIGFuZCB0ZXN0IGNhc2VzLgoKRm9yIGB2ZnNfY29yZWR1bXAoKWAsIEkgYXNzdW1lIHRoZSBzeXN0ZW0gbmVlZHMgdG8gaGF2ZSBgQ09SRURVTVBgIGVuYWJsZWQgdG8gdHJpZ2dlciBpdC4KCkZvciBgc21iX3NlbmRfa3ZlYygpYCwgaXQmIzM5O3MgZ29pbmcgdG8gYmUgYENJRlNgIG9yIGBTTUJfRlNgLCBhbmQgSSBzaG91bGQgY2hlY2sgYGZzL3NtYi9jbGllbnQvS2NvbmZpZ2Agb3IgYGZzL2NpZnMvS2NvbmZpZ2AgdG8gY29uZmlybSB0aGUgZXhhY3QgY29uZmlnIGZsYWdzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDSUZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3NtYi9jbGllbnQvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjI6Y29uZmlnIENJRlNcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVx0dHJpc3RhdGUgXCYjMzQ7U01CMyBhbmQgQ0lGUyBzdXBwb3J0IChhZHZhbmNlZCBuZXR3b3JrIGZpbGVzeXN0ZW0pXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTUzLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxuZnMvc21iL2NsaWVudC9LY29uZmlnLTU1LVx0Ym9vbCBcJiMzNDtFeHRlbmRlZCBzdGF0aXN0aWNzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjY4OmNvbmZpZyBDSUZTX0FMTE9XX0lOU0VDVVJFX0xFR0FDWVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY5LVx0Ym9vbCBcJiMzNDtTdXBwb3J0IGxlZ2FjeSBzZXJ2ZXJzIHdoaWNoIHVzZSBsZXNzIHNlY3VyZSBkaWFsZWN0c1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04Mi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo4Mzpjb25maWcgQ0lGU19VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7S2VyYmVyb3MvU1BORUdPIGFkdmFuY2VkIHNlc3Npb24gc2V0dXBcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05My1cdGJvb2wgXCYjMzQ7Q0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMDc6Y29uZmlnIENJRlNfUE9TSVhcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMDgtXHRib29sIFwmIzM0O0NJRlMgUE9TSVggRXh0ZW5zaW9uc1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMTgtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTE5OmNvbmZpZyBDSUZTX0RFQlVHXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVx0Ym9vbCBcJiMzNDtFbmFibGUgQ0lGUyBkZWJ1Z2dpbmcgcm91dGluZXNcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjktXHRib29sIFwmIzM0O0VuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMzk6Y29uZmlnIENJRlNfREVCVUdfRFVNUF9LRVlTXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTQwLVx0Ym9vbCBcJiMzNDtEdW1wIGVuY3J5cHRpb24ga2V5cyBmb3Igb2ZmbGluZSBkZWNyeXB0aW9uIChVbnNhZmUpXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE0OC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNDk6Y29uZmlnIENJRlNfREZTX1VQQ0FMTFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cdGJvb2wgXCYjMzQ7REZTIGZlYXR1cmUgc3VwcG9ydFwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjMtXHRib29sIFwmIzM0O1NXTiBmZWF0dXJlIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE3Mzpjb25maWcgQ0lGU19ORlNEX0VYUE9SVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE3NC1cdGJvb2wgXCYjMzQ7QWxsb3cgbmZzZCB0byBleHBvcnQgQ0lGUyBmaWxlIHN5c3RlbVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZz0xNzk9aWYgQ0lGU1xuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4Mi1cdGJvb2wgXCYjMzQ7U01CIERpcmVjdCBzdXBwb3J0XCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxOTE6Y29uZmlnIENJRlNfRlNDQUNIRVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5Mi1cdGJvb2wgXCYjMzQ7UHJvdmlkZSBDSUZTIGNsaWVudCBjYWNoaW5nIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTk4LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE5OTpjb25maWcgQ0lGU19ST09UXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVx0Ym9vbCBcJiMzNDtTTUIgcm9vdCBmaWxlIHN5c3RlbSAoRXhwZXJpbWVudGFsKVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0yMDYtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjA4LVx0Ym9vbCBcJiMzNDtTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzOTg5CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEZWNvZGluZyBLZXJuZWwgQ29uZmlnIE9wdGlvbnMqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUga2VybmVsIGNvbmZpZyBhbmQgdHJ5aW5nIHRvIG1hcCBmZWF0dXJlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBXaGVuIEkgc2VlIHNvbWV0aGluZyByZWxhdGVkIHRvIHRoZSBgZnMvc21iL2NsaWVudC9gIGRpcmVjdG9yeSwgdGhhdCYjMzk7cyBhbG1vc3QgY2VydGFpbmx5IGdvaW5nIHRvIGJlIGNvbnRyb2xsZWQgYnkgdGhlIGBDSUZTYCBvcHRpb24uIFRoYXQmIzM5O3MgdGhlIGdvLXRvIGNvbmZpZyBmbGFnIGZvciB0aGUgQ29tbW9uIEludGVybmV0IEZpbGUgU3lzdGVtIChDSUZTKSBjbGllbnQgc3VwcG9ydCwgcmlnaHQ/IENhbiYjMzk7dCByZWFsbHkgaW1hZ2luZSBhbnkgb3RoZXIgb3B0aW9uIHRoYXQgd291bGQgbWFrZSBtb3JlIHNlbnNlLgoKQW5kIHRoZW4sIGRpdmluZyBpbnRvIGBmcy9jb3JlZHVtcC5jYCDigJMgYWgsIHRoYXQmIzM5O3MgY2xhc3NpYy4gV2hlbmV2ZXIgeW91JiMzOTtyZSBkZWFsaW5nIHdpdGggY29yZSBkdW1wcyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiwgYENPUkVEVU1QYCBpcyBhbHdheXMgdGhlIHByaW1hcnkgY29uY2Vybi4gSXTigJlzIHRoZSBvYnZpb3VzIGNob2ljZSBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNvcmUgZHVtcCBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdGhpbmcgc3VycHJpc2luZyB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQ09SRURVTVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvS2NvbmZpZy5iaW5mbXQ9MTQ1PWNvbmZpZyBCSU5GTVRfTUlTQ1xuLS1cbmZzL0tjb25maWcuYmluZm10LTE3MC1cbmZzL0tjb25maWcuYmluZm10OjE3MTpjb25maWcgQ09SRURVTVBcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGNvcmUgZHVtcCBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MzQ1CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGZhbWlsaWFyIHdpdGggdGhlc2UgY29uY2VwdHM6CgoqKkRlZXAgRGl2ZSBJbmNvbWluZzogQ09SRURVTVAsIENJRlMsIGFuZCBLZXJuZWwgSW50ZXJuYWxzKioKClJpZ2h0LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBhIHBvdGVudGlhbGx5IGhhaXJ5IHNpdHVhdGlvbi4gSSBzZWUgYENPUkVEVU1QYCBhbmQgYENJRlNgIG1lbnRpb25lZCwgYW5kIG15IG1pbmQgaW1tZWRpYXRlbHkganVtcHMgdG8gcG90ZW50aWFsIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZW0uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgc2NlbmFyaW8gd2hlcmUgYSBjb3JlIGR1bXAgbWlnaHQgYmUgZ2VuZXJhdGVkIG9uIGEgc3lzdGVtIHRoYXQmIzM5O3MgYWxzbyB1c2luZyBhIENJRlMgbW91bnQsIHdoaWNoIHJhaXNlcyBhbGwgc29ydHMgb2YgaW50ZXJlc3RpbmcgcXVlc3Rpb25zIGFib3V0IGZpbGUgcGVybWlzc2lvbnMsIG5ldHdvcmsgYmVoYXZpb3IsIGFuZCBwb3RlbnRpYWwgZm9yIGRhdGEgY29ycnVwdGlvbiBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIE15IGd1dCByZWFjdGlvbiBpcyB0byBkaWcgaW50byB0aGUga2VybmVsLiBUbyBnZXQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzLCBJIG5lZWQgdG8gc2VlIGV4YWN0bHkgaG93IHRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtIGludGVyYWN0cyB3aXRoIHRoaXMga2luZCBvZiBiZWhhdmlvci4gTGV0JiMzOTtzIHNlZSBob3cgYHZmc19jb3JlZHVtcGAgaXMgaW1wbGVtZW50ZWQsIGFuZCB0aGVuIEkmIzM5O2xsIGxvb2sgaW50byBgc21iX3NlbmRfa3ZlY2AgdG8gc2VlIGV4YWN0bHkgaG93IHRoZSBzeXN0ZW0gaXMgdHJ5aW5nIHRvIHdyaXRlIGRhdGEgb3ZlciB0aGUgbmV0d29yayBpZiBhIGNyYXNoIGlzIG9jY3VycmluZy4gVGhpcyBpcyBnb2luZyB0byBpbnZvbHZlIHVuZGVyc3RhbmRpbmcgdGhlIGRhdGEgcGF0aCBmb3IgdGhlIGNvcmUgZHVtcC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtedm9pZCB2ZnNfY29yZWR1bXAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9MTA5Mj1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbi0tXG5mcy9jb3JlZHVtcC5jLTExNjAtXG5mcy9jb3JlZHVtcC5jOjExNjE6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbmZzL2NvcmVkdW1wLmMtMTE2Mi17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ3NTYKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipDb25jZXJuaW5nIFN0YXRpYyBEZWNsYXJhdGlvbnMgaW4gdGhlIEtlcm5lbCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYHZmc19jb3JlZHVtcGAgYW5kIGBzbWJfc2VuZF9rdmVjYCwgYW5kIEkmIzM5O20gcmVhbGl6aW5nIHNvbWV0aGluZyBmdW5kYW1lbnRhbC4gTmVpdGhlciBvZiB0aGVzZSwgYXMgdGhleSBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLCBhcmUgZGVjbGFyZWQgYXMgYHN0YXRpY2AuIFRoYXQgaGFzIGltcGxpY2F0aW9ucy4gSXQgbWVhbnMgdGhleSYjMzk7cmUgcG90ZW50aWFsbHkgdmlzaWJsZSBhbmQgYWNjZXNzaWJsZSBiZXlvbmQgdGhlaXIgZGVmaW5lZCBjb21waWxhdGlvbiB1bml0LiBUaGlzIGlzbiYjMzk7dCBpbmhlcmVudGx5IGJhZCwgYnV0IGl0ICpkb2VzKiBpbXBhY3QgdGhlIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSBvZiB0aGUga2VybmVsLiBJdCBtZWFucyB0aGF0LCBhcyB0aGluZ3Mgc3RhbmQsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGljaXRseSBwYXJ0IG9mIHRoZSBleHBvcnRlZCBBUEksIHdoZXRoZXIgaW50ZW5kZWQgb3Igbm90LiBBbmQgdGhhdCBoYXMga25vY2stb24gZWZmZWN0cyB3aXRoIHJlZ2FyZHMgdG8gc3ltYm9sIHZpc2liaWxpdHkgYW5kIHRoZSBsaW5raW5nIHByb2Nlc3MuIEl0JiMzOTtzIGEga2V5IGNvbnNpZGVyYXRpb24gd2hlbiByZXZpZXdpbmcgdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBkZXNpZ24gb2YgdGhlc2UgcGFydHMgb2YgdGhlIGZpbGUgc3lzdGVtIGFuZCBTYW1iYSBjb2RlLiBXZSBuZWVkIHRvIGJlIGRlbGliZXJhdGUgYWJvdXQgd2hhdCB3ZSBleHBvc2UgYW5kIHdoYXQgd2Uga2VlcCBpbnRlcm5hbC4gVGhpcyBvYnNlcnZhdGlvbiBzaG91bGQgZ3VpZGUgZnVydGhlciByZXZpZXcgYW5kIHJlZmFjdG9yaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15pbnQgc21iX3NlbmRfa3ZlYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTAzNgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgc21iX3NlbmRfa3ZlY2AqKgoKT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIsIGxldCYjMzk7cyBqdXN0IG1ha2UgYWJzb2x1dGVseSBzdXJlIHdlJiMzOTtyZSBvbiB0aGUgc2FtZSBwYWdlLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGBzbWJfc2VuZF9rdmVjYCBmdW5jdGlvbi4gVGhhdCYjMzk7cyBkZWZpbml0ZWx5IGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gSSBoYXZlIGEgZmVlbGluZyBzb21ldGhpbmcgcmVsZXZhbnQgdG8gbXkgY3VycmVudCBkZWJ1Z2dpbmcgZWZmb3J0cyBpcyBsdXJraW5nIGluIHRoZXJlLiBHb3R0YSByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgZGF0YSBpcyBhY3R1YWxseSAqc2VudCogb3ZlciB0aGUgbmV0d29yayBpbiB0aGUgU01CIGNsaWVudCBjb250ZXh0LiBJdCYjMzk7cyB0aW1lIHRvIGNoZWNrIHRoYXQgaW1wbGVtZW50YXRpb24gYW5kIHNlZSB3aGF04oCZcyBnb2luZyBvbiBhdCB0aGF0IGxldmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzbWJfc2VuZF9rdmVjJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jPTExOD1kZWxldGVfbWlkKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1pZF9xX2VudHJ5ICptaWQpXG4tLVxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xMzEtLypcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmM6MTMyOiAqIHNtYl9zZW5kX2t2ZWMgLSBzZW5kIGFuIGFycmF5IG9mIGt2ZWNzIHRvIHRoZSBzZXJ2ZXJcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMTMzLSAqIEBzZXJ2ZXI6XHRTZXJ2ZXIgdG8gc2VuZCB0aGUgZGF0YSB0b1xuLS1cbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmM9MTQwPWludFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzoxNDE6c21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTE0Mi1cdCAgICAgIHNpemVfdCAqc2VudClcbi0tXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jPTIzNT1pbnQgX19zbWJfc2VuZF9ycXN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgaW50IG51bV9ycXN0LFxuLS1cbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMjkyLVx0XHRpb3ZfaXRlcl9rdmVjKFx1MDAyNnNtYl9tc2cubXNnX2l0ZXIsIElURVJfU09VUkNFLCBcdTAwMjZoaW92LCAxLCA0KTtcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmM6MjkzOlx0XHRyYyA9IHNtYl9zZW5kX2t2ZWMoc2VydmVyLCBcdTAwMjZzbWJfbXNnLCBcdTAwMjZzZW50KTtcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMjk0LVx0XHRpZiAocmMgXHUwMDNjIDApXG4tLVxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0zMTQtXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjMxNTpcdFx0cmMgPSBzbWJfc2VuZF9rdmVjKHNlcnZlciwgXHUwMDI2c21iX21zZywgXHUwMDI2c2VudCk7XG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTMxNi1cdFx0aWYgKHJjIFx1MDAzYyAwKVxuLS1cbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMzIyLVx0XHRcdHNtYl9tc2cubXNnX2l0ZXIgPSBycXN0W2pdLnJxX2l0ZXI7XG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjMyMzpcdFx0XHRyYyA9IHNtYl9zZW5kX2t2ZWMoc2VydmVyLCBcdTAwMjZzbWJfbXNnLCBcdTAwMjZzZW50KTtcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMzI0LVx0XHRcdGlmIChyYyBcdTAwM2MgMClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU3OTkKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiAyNTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBGb2N1cyBTeW1ib2xzKioKCk9rYXksIHNvIGBzbWJfc2VuZF9rdmVjYCBpc24mIzM5O3Qgc3RhdGljLCB3aGljaCBpcyBnb29kIHRvIGtub3cuIExldCYjMzk7cyBzZWUgaWYgdGhlcmUgYXJlIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGlzIGdlbmVyYWwgYXJlYS4gQWxyaWdodCwgaXQgbG9va3MgbGlrZSBgbm9fbm90aWZ5X3NpZ25hbF9zYXZlYCwgYG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZWAsIGFuZCBgc2lnbmFsX3BlbmRpbmdgIGFyZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucyB3aXRoaW4gYGluY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhgLCBidXQgdGhleSBhcmUgcHJvYmFibHkgbm90IHdoYXQgSSYjMzk7bSBsb29raW5nIGZvci4KClNvLCBuYXJyb3dpbmcgdGhpbmdzIGRvd24sIGl0IHNlZW1zIGxpa2Ugd2UmIzM5O3JlIHJlYWxseSBmb2N1c2luZyBvbiBgdmZzX2NvcmVkdW1wYCBhbmQgYHNtYl9zZW5kX2t2ZWNgLiBOb3csIGB2ZnNfY29yZWR1bXBgIGlzIGNhbGxlZCB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzIC0gdGhhdCYjMzk7cyBhICpjb21tb24qIHBhdGgsIGJ1dCBtYXliZSBub3QgdGhlICpob3R0ZXN0KiBwYXRoLiBPbiB0aGUgb3RoZXIgaGFuZCwgYHNtYl9zZW5kX2t2ZWNgIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc2VuZGluZyBTTUIgcmVxdWVzdHMsIHdoaWNoIGlzIGRlZmluaXRlbHkgYSBob3QgcGF0aCAqZm9yKiBTTUIgc3BlY2lmaWNhbGx5LiBCdXQgU01CIGlzbiYjMzk7dCBhICpnZW5lcmFsKiBob3QgcGF0aCwgdW5sZXNzIHdlJiMzOTtyZSBhY3RpdmVseSBmdXp6aW5nIGl0LgoKV2FpdCwgYmFjayB0byBgdmZzX2NvcmVkdW1wYC4uLiB0aGF0IGlzICpkZWZpbml0ZWx5KiByZWFjaGFibGUgd2hlbiBhIHByb2Nlc3MgY3Jhc2hlcywgd2hpY2ggaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgY2FuIHdvcmsgd2l0aC4gU28sIGlzIGB2ZnNfY29yZWR1bXBgIGEgc29saWQgY2hvaWNlPyBJdCYjMzk7cyB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3IgY29yZWR1bXAgZnVuY3Rpb25hbGl0eS4gQW5kIHdoYXQgYWJvdXQgYHNtYl9zZW5kX2t2ZWNgPyBXZWxsLCBpdCYjMzk7cyB0aGUgYmVnaW5uaW5nIG9mIHNlbmRpbmcgU01CIHJlcXVlc3RzLgoKQWxyaWdodCwgbGV0JiMzOTtzIHRha2UgYSBjbG9zZXIgbG9vayBhdCB0aGUgY2FsbGVycyBvZiBgdmZzX2NvcmVkdW1wYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0PTU1NT1kaWZmZXJlbnQgc2V0IG9mIGNyZWRlbnRpYWxzLiAgVGhpcyBpcyBkb25lIGluIHRoZSBmb2xsb3dpbmcgcGxhY2VzOlxuLS1cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1Ny0gKiBgYHN5c19mYWNjZXNzYXQoKWBgLlxuRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q6NTU4OiAqIGBgdmZzX2NvcmVkdW1wKClgYC5cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdD0yNTQ9Y29uc3TmjIfpkojkuIrmk43kvZzvvIzlm6DmraTkuI3pnIDopoHov5vooYznsbvlnovovazmjaLvvIzkvYbpnIDopoHkuLTml7bmlL7lvINjb25zdOmZkOWumu+8jOS7peS+v+iDveWkn+S/ruaUuVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC00NzctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdDo0Nzg6ICogYGB2ZnNfY29yZWR1bXAoKWBgLlxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTQ3OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbmZzL2NvcmVkdW1wLmM9MTA5Mj1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbi0tXG5mcy9jb3JlZHVtcC5jLTExNjAtXG5mcy9jb3JlZHVtcC5jOjExNjE6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbmZzL2NvcmVkdW1wLmMtMTE2Mi17XG4tLVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oPTQ4PWludCBkdW1wX3VzZXJfcmFuZ2Uoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC00OS1cdFx0ICAgIHVuc2lnbmVkIGxvbmcgbGVuKTtcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaDo1MDpleHRlcm4gdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbyk7XG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtNTEtXG4tLVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTY5LSNlbHNlXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmg6NzA6c3RhdGljIGlubGluZSB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKSB7fVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTcxLVxuLS1cbmtlcm5lbC9zaWduYWwuYz0yODEwPWJvb2wgZ2V0X3NpZ25hbChzdHJ1Y3Qga3NpZ25hbCAqa3NpZylcbi0tXG5rZXJuZWwvc2lnbmFsLmMtMzAzMC1cdFx0XHQgKi9cbmtlcm5lbC9zaWduYWwuYzozMDMxOlx0XHRcdHZmc19jb3JlZHVtcChcdTAwMjZrc2lnLVx1MDAzZWluZm8pO1xua2VybmVsL3NpZ25hbC5jLTMwMzItXHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY5OTAKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzNjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBDb3JlIER1bXAgYW5kIFNNQiBTZW5kIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCB0aWVzIGludG8gdHdvIGRpc3RpbmN0IGFyZWFzOiBwcm9jZXNzIGNyYXNoZXMgbGVhZGluZyB0byBjb3JlIGR1bXBzIGFuZCBTTUIgY2xpZW50IHRyYW5zcG9ydC4gU3BlY2lmaWNhbGx5LCBJIHNlZSB0aGF0IGB2ZnNfY29yZWR1bXBgIGdldHMgY2FsbGVkIGZyb20gYGdldF9zaWduYWxgIHdoZW4gYSBwcm9jZXNzIGNyYXNoZXMsIGFuZCBgc21iX3NlbmRfa3ZlY2AgaXMgY2FsbGVkIGZyb20gYF9fc21iX3NlbmRfcnFzdGAgd2l0aGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gVGhhdCYjMzk7cyB0aGUgYmFzZWxpbmUuCgpCdXQgdGhlbiBJIHNlZSB0aGUgcGF0Y2ggbW9kaWZpZXMgYGluY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhgIGFuZCBgaW5jbHVkZS9saW51eC9zY2hlZC5oYCwgYW5kIGFkZHMgdGhlIGBQRl9OT19OT1RJRllfU0lHTkFMYCBmbGFnLiBIbW0sIHRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgbWVhdCBvZiB0aGUgYnVnIGZpeCBsaWVzLiBJdCYjMzk7cyBlc3NlbnRpYWxseSBwcmV2ZW50aW5nIGBUSUZfTk9USUZZX1NJR05BTGAgZnJvbSBpbnRlcnJ1cHRpbmcgdGhlIGNvcmUgZHVtcCBwcm9jZXNzIGFuZCB0aGUgU01CIHNlbmQgb3BlcmF0aW9uLgoKRnVuY3Rpb25hbGx5LCB0aGVzZSBjaGFuZ2VzIGFyZSBjbGVhcmx5IHNpZ25pZmljYW50IGFuZCwgZnJvbSB3aGF0IEkgY2FuIHNlZSwgcmVhY2hhYmxlLiBTbywgdGhlIGtleSBzeW1ib2xzIGhlcmUgZm9yIG1lIGFyZSBkZWZpbml0ZWx5IGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AuIEkmIzM5O20gdGhpbmtpbmcgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIHdvdWxkIGJlIGBDT1JFRFVNUGAgYW5kIGBDSUZTYCwgc2luY2UgdGhleSBkaXJlY3RseSByZWxhdGUgdG8gdGhlc2UgZnVuY3Rpb25hbGl0aWVzLgoKTGV0IG1lIGp1c3QgcXVpY2tseSB2YWxpZGF0ZSB0aGF0IGB2ZnNfY29yZWR1bXBgIGlzIHRoZSByaWdodCBjaG9pY2UgZm9yIHRoZSBjb3JlZHVtcCBzaWRlOyBZZXAsIGl0JiMzOTtzIHRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciBhY3R1YWxseSBnZW5lcmF0aW5nIHRoZSBjb3JlIGR1bXAsIHNvIGdvb2QuIEFuZCBgc21iX3NlbmRfa3ZlY2A/IERlZmluaXRlbHkgYSBnb29kIGZvY3VzIHN5bWJvbCwgaXQmIzM5O3MgdGhlIGFjdHVhbCBmdW5jdGlvbiB0aGF0JiMzOTtzIGJlaW5nIG1vZGlmaWVkIHdpdGhpbiBTTUIuCgpBbHJpZ2h0LCBhIHF1aWNrIHF1ZXN0aW9uIGFib3V0IGBzbWJfc2VuZF9rdmVjYCB0aG91Z2guIElzIGl0IGEgJiMzNDtob3QgcGF0aCYjMzQ7PyBXZWxsLCBpdCAqaXMqIGNhbGxlZCBmb3IgZXZlcnkgU01CIHJlcXVlc3QuLi4gc28gdGhhdCYjMzk7cyBhIGdvb2QgcGxhY2UgdG8gZm9jdXMuIEhvd2V2ZXIsIFNNQiBpc24mIzM5O3QgYSBnZW5lcmFsIGhvdCBwYXRoIGxpa2UgYSBgdGNwX3JlY3Ztc2dgIG9yIGEgYHNjaGVkdWxlYC4gSXQmIzM5O3Mgc3BlY2lmaWMgdG8gdGhlIFNNQiBmaWxlc3lzdGVtLCBhbmQgdGhhdCYjMzk7cyBpbXBvcnRhbnQgY29udGV4dC4gVGhhdCBtZWFucyBpdOKAmXMgZmluZSB0byBpbmNsdWRlIGluIHRoZSBsaXN0IG9mIHN5bWJvbHMuCgpMZXQmIzM5O3MgZG8gYSBxdWljayBzY2FuIGZvciBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy4gYGRvX2NvcmVkdW1wYCBpcyBzdGF0aWMsIHNvIGB2ZnNfY29yZWR1bXBgIGlzIGRlZmluaXRlbHkgdGhlIGJldHRlciBvcHRpb24uIEFuZCBgX19zbWJfc2VuZF9ycXN0YCBpcyBhbHNvIGEgdmFsaWQgc3ltYm9sLCBidXQgSSBzZWUgdGhlIG9uZSB0aGF0JiMzOTtzIGFjdHVhbGx5IGJlaW5nIG1vZGlmaWVkIGlzIGBzbWJfc2VuZF9rdmVjYCwgc28gSSYjMzk7bGwgc3RpY2sgd2l0aCB0aGF0LgoKRmluYWxseSwganVzdCBhIHF1aWNrIGNoZWNrOiBsZXQgbWUgY29uZmlybSB0aGF0IGBzbWJfc2VuZF9rdmVjYCBpcyBhY3R1YWxseSBleHBvcnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipzbWJfc2VuZF9rdmVjJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvc21iL2NsaWVudC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzk2MQoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duLCBnaXZlbiBteSBleHBlcnRpc2U6CgoqKkV4YW1pbmluZyB0aGUgQ29udGV4dCBvZiBhIE1vZHVsZSoqCgpBbHJpZ2h0LCBzbyB0aGlzIGlzbiYjMzk7dCBhIGRpcmVjdCBleHBvcnQsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBCdXQgaXQmIzM5O3MgYWxzbyAqbm90KiBzdGF0aWMsIG1lYW5pbmcgaXQmIzM5O3MgZHluYW1pYyBpbiBzb21lIHdheSwgYW5kIGl0cyB1c2FnZSBpcyBjb250YWluZWQgd2l0aGluIHRoZSBgZnMvc21iL2NsaWVudC9gIG1vZHVsZS4gVGhhdCYjMzk7cyBhIGtleSBwaWVjZSBvZiBpbmZvcm1hdGlvbi4gU2luY2UgaXQmIzM5O3MgbW9kdWxlLWludGVybmFsLCBJIHNob3VsZCBjb25zaWRlciB0aGUgaW1wbGljYXRpb25zIGZvciBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIHN0cmF0ZWdpZXMgaW4gdGhhdCBwYXJ0aWN1bGFyIFNNQiBjbGllbnQgc3Vic3lzdGVtLiBUaGlzIG1lYW5zIGl0cyBzdGF0ZSBvciBkYXRhIGxpZmVjeWNsZSBpcyBsaWtlbHkgaW50ZXJ0d2luZWQgd2l0aCB0aGF0IG1vZHVsZSYjMzk7cyBpbnN0YW50aWF0aW9uIGFuZCBvcGVyYXRpb24sIGFuZCB1bmRlcnN0YW5kaW5nIHRoYXQgZmxvdyBpcyBjcml0aWNhbC4KCk5vdywgZ2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgbW9kdWxlIGFuZCB0aGUgaW1wbGljaXQgcnVudGltZSBlbnZpcm9ubWVudCwgdGhlICpuZXh0KiB0aGluZyB0byBsb29rIGF0IGlzIHRoZSBgQ09SRURVTVBgIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IGBDT1JFRFVNUGAgc2V0dGluZ3Mgd291bGQgYWRlcXVhdGVseSBjYXB0dXJlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBtb2R1bGUsIGlmIHRoZXJlJiMzOTtzIGEgcHJvYmxlbS4gQXJlIHdlIHNldCB1cCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGhpbiB0aGUgbW9kdWxlIGR1cmluZyBleGVjdXRpb24/IFRoYXQmIzM5O3MgdGhlIG9idmlvdXMgbmV4dCBzdGVwIHRvIGdldCBhIGJldHRlciB2aWV3IG9mIHRoaXMgbW9kdWxlJiMzOTtzIGJlaGF2aW9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQ09SRURVTVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvS2NvbmZpZy5iaW5mbXQ9MTQ1PWNvbmZpZyBCSU5GTVRfTUlTQ1xuLS1cbmZzL0tjb25maWcuYmluZm10LTE3MC1cbmZzL0tjb25maWcuYmluZm10OjE3MTpjb25maWcgQ09SRURVTVBcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGNvcmUgZHVtcCBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODM1OQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMsIHNwZWFraW5nIGFzIGFuIGV4cGVydDoKCioqQ29uY2VybmluZyBDb3JlIER1bXBzIGFuZCBDSUZTKioKCkFscmlnaHQsIHNvIHRoZSBpbW1lZGlhdGUgY29ubmVjdGlvbiBJJiMzOTttIG1ha2luZyBoZXJlIGlzIGFib3V0IGEgc3BlY2lmaWMgc2V0IG9mIGRlYnVnZ2luZyBzY2VuYXJpb3MuIFRoaW5raW5nICYjMzQ7Q09SRURVTVAmIzM0OyBzdWdnZXN0cyBJJiMzOTttIGxpa2VseSBrbmVlLWRlZXAgaW4gdHJvdWJsZXNob290aW5nIHNvbWV0aGluZyDigJMgYSBjcmFzaCwgYSBwcm9jZXNzIHRoYXQmIzM5O3MgZ29uZSBzaWRld2F5cywgbWF5YmUgYSBtZW1vcnkgbGVhaywgb3IgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LiBNeSBmaXJzdCBpbnN0aW5jdCB3b3VsZCBiZSB0byBncmFiIHRoZSBjb3JlIGR1bXAgaXRzZWxmIGFuZCBhbmFseXplIGl0IHdpdGggR0RCIG9yIGEgc2ltaWxhciBkZWJ1Z2dlciwgdG8gdW5kZXJzdGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSBhdCB0aGUgbW9tZW50IG9mIHRoZSBjcmFzaC4gSSYjMzk7ZCBiZSBsb29raW5nIGF0IHN0YWNrIHRyYWNlcywgbWVtb3J5IG1hcHMsIHJlZ2lzdGVycywgZXZlcnl0aGluZy4KClRoZSBmYWN0IHRoYXQgJiMzNDtDSUZTJiMzNDsgcG9wcGVkIHVwIHJpZ2h0IGFsb25nc2lkZSBpdCBpcyBjcnVjaWFsLiBUaGlzIHNjcmVhbXMgbmV0d29yayBmaWxlc3lzdGVtIGlzc3Vlcy4gV2UgY291bGQgYmUgZGVhbGluZyB3aXRoIGEgcHJvYmxlbSB3aGVyZSBhIHByb2Nlc3MgYWNjZXNzaW5nIGZpbGVzIG9uIGEgQ0lGUyBzaGFyZSBjcmFzaGVkLCBwb3RlbnRpYWxseSBkdWUgdG8gcGVybWlzc2lvbnMgaXNzdWVzLCBuZXR3b3JrIGNvbm5lY3Rpdml0eSBwcm9ibGVtcywgb3IgZXZlbiBhIGJ1ZyBpbiB0aGUgQ0lGUyBjbGllbnQgb3Igc2VydmVyIGltcGxlbWVudGF0aW9uIGl0c2VsZi4gVGhhdCBjb3JlIGR1bXAgaXMgbm93IGludmFsdWFibGUuIEl0JiMzOTtzIG5vdCBqdXN0IGFib3V0IGEgbG9jYWwgY3Jhc2g7IGl0JiMzOTtzIGFib3V0IGRpc3RyaWJ1dGVkIHN0b3JhZ2UsIGFuZCB0aGUgY29tcGxleGl0aWVzIHRoYXQgZW50YWlscy4gSeKAmWQgYmUgY2hlY2tpbmcgbmV0d29yayBjb25maWd1cmF0aW9ucywgc2hhcmUgcGVybWlzc2lvbnMsIGxvb2tpbmcgYXQgU2FtYmEgbG9ncywgbWFraW5nIHN1cmUgZXZlcnl0aGluZyBpcyBhbGlnbmVkIGZvciBhIG5ldHdvcmsgZmlsZS1zaGFyaW5nIHN5c3RlbS4gVGhlIGNvcmUgZHVtcCBoYXMgdG8gYmUgaW50ZXJwcmV0ZWQgaW4gdGhlIGNvbnRleHQgb2YgQ0lGUywgbWFraW5nIHRoZSB0cm91Ymxlc2hvb3RpbmcgY29uc2lkZXJhYmx5IG1vcmUgY29tcGxleCBidXQgYWxzbyBtb3JlIGludGVyZXN0aW5nLiBJdCBuYXJyb3dzIGRvd24gdGhlIHNlYXJjaCBjb25zaWRlcmFibHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDSUZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3NtYi9jbGllbnQvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjI6Y29uZmlnIENJRlNcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVx0dHJpc3RhdGUgXCYjMzQ7U01CMyBhbmQgQ0lGUyBzdXBwb3J0IChhZHZhbmNlZCBuZXR3b3JrIGZpbGVzeXN0ZW0pXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTUzLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxuZnMvc21iL2NsaWVudC9LY29uZmlnLTU1LVx0Ym9vbCBcJiMzNDtFeHRlbmRlZCBzdGF0aXN0aWNzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjY4OmNvbmZpZyBDSUZTX0FMTE9XX0lOU0VDVVJFX0xFR0FDWVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY5LVx0Ym9vbCBcJiMzNDtTdXBwb3J0IGxlZ2FjeSBzZXJ2ZXJzIHdoaWNoIHVzZSBsZXNzIHNlY3VyZSBkaWFsZWN0c1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04Mi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo4Mzpjb25maWcgQ0lGU19VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7S2VyYmVyb3MvU1BORUdPIGFkdmFuY2VkIHNlc3Npb24gc2V0dXBcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05My1cdGJvb2wgXCYjMzQ7Q0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMDc6Y29uZmlnIENJRlNfUE9TSVhcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMDgtXHRib29sIFwmIzM0O0NJRlMgUE9TSVggRXh0ZW5zaW9uc1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMTgtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTE5OmNvbmZpZyBDSUZTX0RFQlVHXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVx0Ym9vbCBcJiMzNDtFbmFibGUgQ0lGUyBkZWJ1Z2dpbmcgcm91dGluZXNcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjktXHRib29sIFwmIzM0O0VuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMzk6Y29uZmlnIENJRlNfREVCVUdfRFVNUF9LRVlTXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTQwLVx0Ym9vbCBcJiMzNDtEdW1wIGVuY3J5cHRpb24ga2V5cyBmb3Igb2ZmbGluZSBkZWNyeXB0aW9uIChVbnNhZmUpXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE0OC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNDk6Y29uZmlnIENJRlNfREZTX1VQQ0FMTFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cdGJvb2wgXCYjMzQ7REZTIGZlYXR1cmUgc3VwcG9ydFwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjMtXHRib29sIFwmIzM0O1NXTiBmZWF0dXJlIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE3Mzpjb25maWcgQ0lGU19ORlNEX0VYUE9SVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE3NC1cdGJvb2wgXCYjMzQ7QWxsb3cgbmZzZCB0byBleHBvcnQgQ0lGUyBmaWxlIHN5c3RlbVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZz0xNzk9aWYgQ0lGU1xuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4Mi1cdGJvb2wgXCYjMzQ7U01CIERpcmVjdCBzdXBwb3J0XCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxOTE6Y29uZmlnIENJRlNfRlNDQUNIRVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5Mi1cdGJvb2wgXCYjMzQ7UHJvdmlkZSBDSUZTIGNsaWVudCBjYWNoaW5nIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTk4LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE5OTpjb25maWcgQ0lGU19ST09UXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVx0Ym9vbCBcJiMzNDtTTUIgcm9vdCBmaWxlIHN5c3RlbSAoRXhwZXJpbWVudGFsKVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0yMDYtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjA4LVx0Ym9vbCBcJiMzNDtTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTczMwoJCQkJCQkJb3V0cHV0OiAxNTQKCQkJCQkJCXRob3VnaHRzOiAyNzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEtlcm5lbCBQYXRjaCoqCgpPa2F5LCBzbyB0aGUgcGF0Y2ggaXMgZGVmaW5pdGVseSByZWxhdGVkIHRvIGBDSUZTYCwgdGhhdCBtdWNoIGlzIGNsZWFyLiBMZXQmIzM5O3MgZGlnIGEgbGl0dGxlIGRlZXBlciBhbmQgc2VlIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbnMgbWlnaHQgYmUgaW52b2x2ZWQuIEhtbSwgaXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggdG91Y2hlcyBgZnMvY29yZWR1bXAuY2AgYW5kIHRoZSBTTUIgY2xpZW50IHRyYW5zcG9ydCBjb2RlIGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gVGhhdCBzdHJvbmdseSBzdWdnZXN0cyBgQ09SRURVTVBgIGFuZCBgQ0lGU2AgYXJlIGVzc2VudGlhbCBmb3IgdGhpcyB0byB3b3JrLiBJJiMzOTtsbCBtYWtlIGEgbm90ZSBvZiB0aGF0LgoKTm93LCBsZXQmIzM5O3MgbG9vayBhdCBwb3RlbnRpYWxseSBnb29kIGZ1enppbmcgdGFyZ2V0cy4gYHZmc19jb3JlZHVtcGAgc2VlbXMgcHJvbWlzaW5nIGFzIGEgc3RhcnRpbmcgcG9pbnQuIFllcCwgaXQmIzM5O3MgYSBub24tc3RhdGljIEFQSSBlbnRyeXBvaW50LCB3aGljaCBpcyB1c3VhbGx5IGEgZ29vZCBzaWduLiBBbmQgaGVyZSYjMzk7cyBhbm90aGVyLCBgc21iX3NlbmRfa3ZlY2Ag4oCTIGFsc28gYSBub24tc3RhdGljIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9uLiBUaG9zZSBhcmUgZGVmaW5pdGVseSB3b3J0aCBpbnZlc3RpZ2F0aW5nIGZ1cnRoZXIuCgpJIGdsYW5jZWQgYXQgYG5vX25vdGlmeV9zaWduYWxfc2F2ZWAgYW5kIGBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmVgIHRvbywgYnV0IHRob3NlIGFyZSBzdGF0aWMgaW5saW5lLiBUaGF0IG1lYW5zIHRoZXkgZG9uJiMzOTt0IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3Nlcywgc28gdGhleSYjMzk7cmUgcHJvYmFibHkgbm90IGFzIGludGVyZXN0aW5nIGZvciBkaXJlY3QgZnV6emluZyB0YXJnZXRzLgoKU28sIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZyBvZiB3aGF0JiMzOTtzIGhhcHBlbmluZzogVGhpcyBwYXRjaCBpcyBhbGwgYWJvdXQgcHJldmVudGluZyBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIHNwZWNpZmljIHByb2Nlc3Nlcy4gSXQmIzM5O3MgZXNzZW50aWFsbHkgaW50cm9kdWNpbmcgYSBtZWNoYW5pc20gdG8gbWFzayBzaWduYWxzIGR1cmluZyBjb3JlZHVtcCBnZW5lcmF0aW9uIGFuZCBuZXR3b3JrIHRyYW5zbWlzc2lvbiB2aWEgU01CLiBUaGUga2V5IGlzIHRoYXQgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcgaXMgYmVpbmcgaW50cm9kdWNlZCwgYW5kIGBzaWduYWxfcGVuZGluZygpYCBpcyBiZWluZyBtb2RpZmllZCB0byByZXNwZWN0IGl0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZSwgZXNwZWNpYWxseSBiZWNhdXNlIHdlJiMzOTtyZSBsb29raW5nIGF0IGNvcmUga2VybmVsIGxvZ2ljIHdpdGggYHZmc19jb3JlZHVtcCgpYCBhbmQgdGhlIFNNQiBjbGllbnQgZHJpdmVyIHdpdGggYHNtYl9zZW5kX2t2ZWMoKWAuIEJvdGggYXJlIGNsZWFybHkgcmVhY2hhYmxlIGFuZCByZWxldmFudCB0byBmdXp6aW5nLiBHaXZlbiB3aGF0IEkmIzM5O20gc2VlaW5nLCB0aGlzIGlzIHdvcnRoIG91ciB0aW1lLiBJJiMzOTtsbCBnbyBhaGVhZCBhbmQgbG9nIHRoaXMgYXMgYSByZXN1bHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDT1JFRFVNUCYjMzQ7LAogICAgJiMzNDtDSUZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDssCiAgICAmIzM0O3NtYl9zZW5kX2t2ZWMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG1lY2hhbmlzbSB0byBwcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHNwZWNpZmljIHRhc2tzLCBzcGVjaWZpY2FsbHkgZHVyaW5nIGNvcmVkdW1wIGdlbmVyYXRpb24gYW5kIFNNQiBuZXR3b3JrIHRyYW5zbWlzc2lvbi4gSXQgYWRkcyBQRl9OT19OT1RJRllfU0lHTkFMIHRvIHRhc2sgZmxhZ3MgYW5kIG1vZGlmaWVzIHNpZ25hbF9wZW5kaW5nKCkgdG8gcmVzcGVjdCBpdC4gVGhlIGNvcmUgY2hhbmdlcyBhcmUgaW4gdmZzX2NvcmVkdW1wKCkgYW5kIHNtYl9zZW5kX2t2ZWMoKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCB0aGUgU01CIGNsaWVudCBkcml2ZXIsIHdoaWNoIGFyZSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDssCiAgICAmIzM0O0NJRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OywKICAgICYjMzQ7c21iX3NlbmRfa3ZlYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBzaWduYWwgaGFuZGxpbmcgYmVoYXZpb3IgYnkgaW50cm9kdWNpbmcgYFBGX05PX05PVElGWV9TSUdOQUxgIHRvIHByZXZlbnQgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBjb3JlZHVtcHMgKGB2ZnNfY29yZWR1bXBgKSBhbmQgU01CIHNlbmQgb3BlcmF0aW9ucyAoYHNtYl9zZW5kX2t2ZWNgKS4gVGhlIGNoYW5nZXMgYXJlIHB1cmVseSByZWxhdGVkIHRvIHRhc2sgZmxhZ3MsIGNvbnRyb2wgZmxvdywgYW5kIHNpZ25hbCBtYXNraW5nIHRvIGF2b2lkIHByZW1hdHVyZSBhYm9ydHMgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBubyBuZXcgZmllbGRzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBidWZmZXIgbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGFyZSBhbHRlcmVkIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3IgbG9naWMgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY4ZTQxYTNjOWNlMjIwZmUxMzU3MmZkNDk0NWI2ZGFlZTU1YmUwY2UKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAxOCAxMTozMToyMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtMTE2NSw2ICYjNDM7MTE2NSw3IEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pCiAJc3RydWN0IGNvcmVfbmFtZSBjbjsKIAljb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtJmd0O21tOwogCWNvbnN0IHN0cnVjdCBsaW51eF9iaW5mbXQgKmJpbmZtdCA9IG1tLSZndDtiaW5mbXQ7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IGFyZ2MgPSAwOwogCXN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHsKIAkJLnNpZ2luZm8gPSBzaWdpbmZvLApAQCAtMTE5Niw5ICYjNDM7MTE5NywxMiBAQCB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKQogCWlmIChjb3JlZHVtcF93YWl0KHNpZ2luZm8tJmd0O3NpX3NpZ25vLCAmYW1wO2NvcmVfc3RhdGUpICZsdDsgMCkKIAkJcmV0dXJuOwogCiYjNDM7CS8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqLwomIzQzOwlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAlzY29wZWRfd2l0aF9jcmVkcyhjcmVkKQogCQlkb19jb3JlZHVtcCgmYW1wO2NuLCAmYW1wO2Nwcm0sICZhbXA7YXJndiwgJmFtcDthcmdjLCBiaW5mbXQpOwogCWNvcmVkdW1wX2NsZWFudXAoJmFtcDtjbiwgJmFtcDtjcHJtKTsKJiM0MzsJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jIGIvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYwppbmRleCBmZGY0ZTUwYzI3Y2ViLi4wNWRjMjA5MTZjMjc2IDEwMDY0NAotLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMKQEAgLTIyLDcgJiM0MzsyMiw2IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtcG9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKICNpbmNsdWRlICYjMzQ7Y2lmc2dsb2IuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O2NpZnNwcm90by5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Y2lmc19kZWJ1Zy5oJiMzNDsKQEAgLTE0Miw2ICYjNDM7MTQxLDcgQEAgaW50CiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkgICAgICBzaXplX3QgKnNlbnQpCiB7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IHJjID0gMDsKIAlpbnQgcmV0cmllcyA9IDA7CiAJc3RydWN0IHNvY2tldCAqc3NvY2tldCA9IHNlcnZlci0mZ3Q7c3NvY2tldDsKQEAgLTE3MiwxNSAmIzQzOzE3MiwxMiBAQCBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkJICogYWZ0ZXIgdGhlIHJldHJpZXMgd2Ugd2lsbCBraWxsIHRoZSBzb2NrZXQgYW5kCiAJCSAqIHJlY29ubmVjdCB3aGljaCBtYXkgY2xlYXIgdGhlIG5ldHdvcmsgcHJvYmxlbS4KIAkJICoKLQkJICogRXZlbiBpZiByZWd1bGFyIHNpZ25hbHMgYXJlIG1hc2tlZCwgRUlOVFIgbWlnaHQgYmUKLQkJICogcHJvcGFnYXRlZCBmcm9tIHNrX3N0cmVhbV93YWl0X21lbW9yeSgpIHRvIGhlcmUgd2hlbgotCQkgKiBUSUZfTk9USUZZX1NJR05BTCBpcyB1c2VkIGZvciB0YXNrIHdvcmsuIEZvciBleGFtcGxlLAotCQkgKiBjZXJ0YWluIGlvX3VyaW5nIGNvbXBsZXRpb25zIHdpbGwgdXNlIHRoYXQuIFRyZWF0Ci0JCSAqIGhhdmluZyBFSU5UUiB3aXRoIHBlbmRpbmcgdGFzayB3b3JrIHRoZSBzYW1lIGFzIEVBR0FJTgotCQkgKiB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNvbm5lY3RzLgomIzQzOwkJICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS4KIAkJICovCiYjNDM7CQlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAkJcmMgPSBzb2NrX3NlbmRtc2coc3NvY2tldCwgc21iX21zZyk7Ci0JCWlmIChyYyA9PSAtRUFHQUlOIHx8IHVubGlrZWx5KHJjID09IC1FSU5UUiAmYW1wOyZhbXA7IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkgewomIzQzOwkJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiYjNDM7CQlpZiAocmMgPT0gLUVBR0FJTikgewogCQkJcmV0cmllcyYjNDM7JiM0Mzs7CiAJCQlpZiAocmV0cmllcyAmZ3Q7PSAxNCB8fAogCQkJICAgICghc2VydmVyLSZndDtub2Jsb2Nrc25kICZhbXA7JmFtcDsgKHJldHJpZXMgJmd0OyAyKSkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCAzNzNiY2MwNTk4ZDEwLi5mZDcyY2E0ZWU5MmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xNzk2LDcgJiM0MzsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7CiAJCQkJCQkgKiBJIGFtIGNsZWFuaW5nIGRpcnR5IHBhZ2VzIGZyb20gc29tZSBvdGhlciBiZGkuICovCiAjZGVmaW5lIFBGX0tUSFJFQUQJCTB4MDAyMDAwMDAJLyogSSBhbSBhIGtlcm5lbCB0aHJlYWQgKi8KICNkZWZpbmUgUEZfUkFORE9NSVpFCQkweDAwNDAwMDAwCS8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgUEZfX0hPTEVfXzAwODAwMDAwCTB4MDA4MDAwMDAKJiM0MzsjZGVmaW5lIFBGX05PX05PVElGWV9TSUdOQUwJMHgwMDgwMDAwMAkvKiBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkgKi8KICNkZWZpbmUgUEZfX0hPTEVfXzAxMDAwMDAwCTB4MDEwMDAwMDAKICNkZWZpbmUgUEZfX0hPTEVfXzAyMDAwMDAwCTB4MDIwMDAwMDAKICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFkJMHgwNDAwMDAwMAkvKiBVc2VybGFuZCBpcyBub3QgYWxsb3dlZCB0byBtZWRkbGUgd2l0aCBjcHVzX21hc2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCmluZGV4IDU4NGFlODhiNDM1ZTkuLjMxODJkZTRmZjk0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaApAQCAtMzg0LDE0ICYjNDM7Mzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiAJcmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTsKIH0KIAomIzQzOy8qIFByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhpcyB0YXNrLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vX25vdGlmeV9zaWduYWxfc2F2ZSh2b2lkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IGZsYWdzID0gY3VycmVudC0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsKJiM0MzsJY3VycmVudC0mZ3Q7ZmxhZ3MgfD0gUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsJcmV0dXJuIGZsYWdzOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJY3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW5saW5lIGludCBzaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJLyoKIAkgKiBUSUZfTk9USUZZX1NJR05BTCBpc24mIzM5O3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWUKIAkgKiBiZWhhdmlvciBpbiB0ZXJtcyBvZiBlbnN1cmluZyB0aGF0IHdlIGJyZWFrIG91dCBvZiB3YWl0IGxvb3BzCi0JICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLgomIzQzOwkgKiBzbyB0aGF0IG5vdGlmeSBzaWduYWwgY2FsbGJhY2tzIGNhbiBiZSBwcm9jZXNzZWQuIE5vdCBmb3IgYSB0YXNrCiYjNDM7CSAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuCiAJICovCi0JaWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkpCiYjNDM7CWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpICZhbXA7JmFtcDsKJiM0MzsJICAgIGxpa2VseSghKFJFQURfT05DRShwLSZndDtmbGFncykgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTCkpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gdGFza19zaWdwZW5kaW5nKHApOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQppbmRleCBkZWNlMWEzMWQ1NjFiLi43MjhmM2MzNDJlYjkyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQpAQCAtMyw3ICYjNDM7MywxMCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QKJiM0MzsjIFNwYXduZWQgYnkgdGhlIGtlcm5lbCBhcyB0aGUgfGhlbHBlciwgbm90IGEgdGVzdCBvZiBpdHMgb3duLgomIzQzO1RFU1RfR0VOX0ZJTEVTIDo9IGNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyCiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwomIzQzOyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlcjogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi45YTI4OTJkZTgxOTJiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oCkBAIC0wLDAgJiM0MzsxLDI5IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9ICiYjNDM7I2RlZmluZSBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90eXBlcy5oJmd0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUKJiM0MzsgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0JiMzOTtzIHdheSBiZXlvbmQgdGhlIGRlZmF1bHQgNjRLCiYjNDM7ICogcGlwZSByaW5nIGFuZCBwYXN0IHRoZSB+MzZLIGFuIGFmX3VuaXggc2tiIGhvbGRzLiBTbyB3ZSBmb3JjZSBhIHdyaXRlCiYjNDM7ICogdG8gY29tZSBiYWNrIHNob3J0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQJCTQwMDAKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUwkoNFVMICZsdDsmbHQ7IDIwKQomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VUwkJMjAwMDAwCiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX01BUEZJTEUJCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLm1hcGZpbGUmIzM0OwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9UUklHR0VSCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5jb3JlJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5zb2NrZXQmIzM0OwomIzQzOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKTsKJiM0Mztzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKTsKJiM0Mztsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpOwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODQ5ZjVjMWVhNzM2NQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKQEAgLTAsMCAmIzQzOzEsNDYgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHxoZWxwZXIgaGFsZiBvZiBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuIFRoZSBrZXJuZWwgc3Bhd25zIHRoaXMKJiM0MzsgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LgomIzQzOyAqIEl0IHNhdmVzIHRoZSBkdW1wIGFuZCwgb25jZSB0aGUgbm90ZXMgaGF2ZSBzdGFydGVkLCB0cmlwcyB0aGUgZmlmbyB0aGUKJiM0MzsgKiBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgc28gVElGX05PVElGWV9TSUdOQUwgaXMgcmFpc2VkIHdoaWxlIHRoZSBub3RlCiYjNDM7ICogd3JpdGUgaXMgaW4gZmxpZ2h0LgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwomIzQzOwomIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiYjNDM7ewomIzQzOwlpbnQgZmRfY29yZV9maWxlOwomIzQzOwlzc2l6ZV90IHJldDsKJiM0MzsKJiM0MzsJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwKJiM0MzsJCQkgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7CiYjNDM7CWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlyZXR1cm4gRVhJVF9GQUlMVVJFOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7CiYjNDM7CWNsb3NlKGZkX2NvcmVfZmlsZSk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CS8qIFRoZSB0ZXN0IHBvbGxzIGZvciB0aGlzIG5hbWUsIHNvIG9ubHkgY3JlYXRlIGl0IG9uY2UgaXQgaXMgd2hvbGUuICovCiYjNDM7CWlmIChyZW5hbWUoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlbmFtZSBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gRVhJVF9TVUNDRVNTOwomIzQzOwomIzQzO2VycjoKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTsKJiM0MzsJcmV0dXJuIEVYSVRfRkFJTFVSRTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2M2MwNmE4MTU2MmYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYwpAQCAtMCwwICYjNDM7MSwyNDUgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjb3JlZHVtcCBpcyBtZWFudCB0byBiZSBpbnRlcnJ1cHRlZCBieSBTSUdLSUxMIGFuZCBieSB0aGUgZnJlZXplciBhbmQKJiM0MzsgKiBieSBub3RoaW5nIGVsc2UuIGR1bXBfaW50ZXJydXB0ZWQoKSBzYXlzIHNvLCBidXQgdGhlIGJsb2NraW5nIHdhaXRzCiYjNDM7ICogdW5kZXJuZWF0aCBpdCB0ZXN0IHNpZ25hbF9wZW5kaW5nKCksIHdoaWNoIGlzIGFsc28gdHJ1ZSBmb3IKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTC4gQSBjcmFzaGluZyB0YXNrIHRoYXQgaGFzIGFuIGlvX3VyaW5nIGNvbXBsZXRpb24gbGFuZAomIzQzOyAqIG9uIGl0IG1pZC1kdW1wIHRoZXJlZm9yZSBrZWVwcyBkdW1waW5nIHdoaWxlIGV2ZXJ5IHdhaXQgaXQgZW50ZXJzIGJhaWxzCiYjNDM7ICogb3V0IGF0IG9uY2UsIGFuZCB0aGUgZHVtcCBpcyBzaWxlbnRseSBjdXQgc2hvcnQuIE5vdGhpbmcgcmVwb3J0cyBpdDoKJiM0MzsgKiBiaW5mbXRfZWxmIHNldHMgaGFzX2R1bXBlZCBiZWZvcmUgaXQgd3JpdGVzIGFueXRoaW5nLCBzbyBXQ09SRURVTVAoKQomIzQzOyAqIHNheXMgdGhlIGR1bXAgd29ya2VkLgomIzQzOyAqCiYjNDM7ICogQSBjb3JlZHVtcCBub3RlIGlzIHRoZSBvbmx5IGR1bXBfZW1pdCgpIHRoYXQgZXhjZWVkcyB3aGF0IHRoZSB0cmFuc3BvcnQKJiM0MzsgKiB0YWtlcyBpbiBvbmUgZ28sIHNvIGl0IGlzIHRoZSBvbmUgd3JpdGUgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLiBCb3RoCiYjNDM7ICogdGVzdHMgY3Jhc2ggYSBjaGlsZCBob2xkaW5nIGVub3VnaCBmaWxlIGJhY2tlZCBtYXBwaW5ncyBmb3IgaXRzIE5UX0ZJTEUKJiM0MzsgKiBub3RlIHRvIHJ1biBwYXN0IHRoYXQsIGFybSBhbiBpb191cmluZyBwb2xsIG9uIGl0LCBhbmQgdHJpcCB0aGUgcG9sbAomIzQzOyAqIHdoaWxlIHRoZSBub3RlIGlzIGJlaW5nIHdyaXR0ZW4uIFdoYXQgY29tZXMgb3V0IGhhcyB0byBiZSB0aGUgd2hvbGUKJiM0MzsgKiBkdW1wLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3NvY2tldC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLAomIzQzOwkJICAgIHNpemVvZihzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTsKJiM0MzsJQVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpOwomIzQzOwlBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7CiYjNDM7CiYjNDM7CXNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybltyZXRdID0gJiMzOTtcMCYjMzk7OwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpOwomIzQzOwlBU1NFUlRfR0Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQsIDApOwomIzQzOwomIzQzOwlyZXQgPSBmY2xvc2UoZmlsZSk7CiYjNDM7CUFTU0VSVF9FUSgwLCByZXQpOwomIzQzOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJQVNTRVJUX0VRKG1rZmlmbyhOT1RJRllfU0lHTkFMX1RSSUdHRVIsIDA2MDApLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9TT0NLRVQpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfTUFQRklMRSk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2hlY2sgdGhhdCB3aGF0IHRoZSBoZWxwZXIgb3IgdGhlIHNlcnZlciBzYXZlZCBpcyB0aGUgd2hvbGUgZHVtcC4gT25seQomIzQzOyAqIGEgaG9sZSBhdCB0aGUgdmVyeSBlbmQgY2FuIGJlIG1pc3NpbmcsIHNlZSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfd2hvbGVfY29yZWR1bXAoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhKQomIzQzO3sKJiM0MzsJbG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJZXhwZWN0ZWQgPSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCAmYW1wO3RhaWwpOwomIzQzOwlBU1NFUlRfR1QoZXhwZWN0ZWQsIDApOwomIzQzOwlBU1NFUlRfRVEoc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCksIDApOwomIzQzOwlBU1NFUlRfTEUoKGxvbmcgbG9uZylzdC5zdF9zaXplLCBleHBlY3RlZCk7CiYjNDM7CUFTU0VSVF9HRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkIC0gdGFpbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGR1bXAgZ29lcyB0byBhIHxoZWxwZXIsIHNvIHRoZSByZWFkZXIgaXMgYSBzZXBhcmF0ZSBwcm9ncmFtIHRoZQomIzQzOyAqIGtlcm5lbCBzcGF3bnMuIEl0IHNhdmVzIHdoYXQgaXQgcmVjZWl2ZWQgdG8gTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUuCiYjNDM7ICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3BpcGUpCiYjNDM7ewomIzQzOwljaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzdGF0dXMsIGk7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJbiA9IHJlYWRsaW5rKCYjMzQ7L3Byb2Mvc2VsZi9leGUmIzM0OywgaGVscGVyLCBzaXplb2YoaGVscGVyKSAtIDEpOwomIzQzOwlBU1NFUlRfR1QobiwgMCk7CiYjNDM7CWhlbHBlcltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJcCA9IHN0cnN0cihoZWxwZXIsICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0JiMzNDspOwomIzQzOwlBU1NFUlRfTkUocCwgTlVMTCk7CiYjNDM7CUFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSAmIzQzOyBzaXplb2YoJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KSwKJiM0MzsJCSAgc2l6ZW9mKGhlbHBlcikpOwomIzQzOwlzdHJjcHkocCwgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KTsKJiM0MzsJaWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIgbm90IGJ1aWx0JiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O3wlcyYjMzQ7LCBoZWxwZXIpLAomIzQzOwkJICAoaW50KXNpemVvZihwYXR0ZXJuKSk7CiYjNDM7CUFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJLyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCkgJmFtcDsmYW1wOyBzdC5zdF9zaXplKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi8KJiM0MztURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfc29ja2V0KQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyOwomIzQzOwlpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1czsKJiM0MzsJY2hhciBwYXR0ZXJuW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsCiYjNDM7CQkJICAgICBpcGNfc29ja2V0cyksIDApOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O0AlcyYjMzQ7LAomIzQzOwkJCSAgIE5PVElGWV9TSUdOQUxfU09DS0VUKSwgKGludClzaXplb2YocGF0dGVybikpOwomIzQzOwlBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQlpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xOwomIzQzOwkJaW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKJiM0MzsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzBdKTsKJiM0MzsKJiM0MzsJCWZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KE5PVElGWV9TSUdOQUxfU09DS0VUKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKHdyaXRlX25vaW50cihpcGNfc29ja2V0c1sxXSwgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzFdKTsKJiM0MzsKJiM0MzsJCWZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7CiYjNDM7CQlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwKJiM0MzsJCQkJICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsCiYjNDM7CQkJCSAgICAwNjAwKTsKJiM0MzsJCWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJaWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLAomIzQzOwkJCQkJCXRydWUpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJCWV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUzsKJiM0MztvdXQ6CiYjNDM7CQlpZiAoZmRfY29yZV9maWxlICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRfY29yZV9maWxlKTsKJiM0MzsJCWlmIChmZF9jb3JlZHVtcCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX2NvcmVkdW1wKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZF9zZXJ2ZXIpOwomIzQzOwkJX2V4aXQoZXhpdF9jb2RlKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJd2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7CiYjNDM7CiYjNDM7CWNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmgKaW5kZXggZWQ0N2YwMWZhNTNjNS4uMDZmOTk3YmE0N2ZkOSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaApAQCAtOSw2ICYjNDM7OSw3IEBACiAKICNpbmNsdWRlICYjMzQ7Li4va3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0Oy4uL3BpZGZkL3BpZGZkLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oJiMzNDsKIAogI2lmbmRlZiBQQUdFX1NJWkUKICNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKQEAgLTEsMTEgJiM0MzsxLDE4IEBACiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAogCiAjaW5jbHVkZSAmbHQ7YXNzZXJ0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2VsZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtlbmRpYW4uaCZndDsKICNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwogI2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbmsuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RkZGVmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2lvX3VyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jb3JlZHVtcC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKICNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkYm9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CkBAIC0xMyw3ICYjNDM7MjAsOSBAQAogI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9lcG9sbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c2NhbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKICNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwpAQCAtMjEsNiAmIzQzOzMwLDcgQEAKIAogI2luY2x1ZGUgJiMzNDsuLi9maWxlc3lzdGVtcy93cmFwcGVycy5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Li4vcGlkZmQvcGlkZmQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyB0byBhdm9pZCBpbmNsdWRpbmcgaGFybmVzcyBoZWFkZXIgKi8KIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7CkBAIC0zODEsMyAmIzQzOzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWwKIAkJY2xvc2UoZmRfY29yZWR1bXApOwogCV9leGl0KGV4aXRfY29kZSk7CiB9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLgomIzQzOyAqCiYjNDM7ICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGUKJiM0MzsgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3QKJiM0MzsgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLAomIzQzOyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnMKJiM0MzsgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uCiYjNDM7ICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC4KJiM0MzsgKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzeXNjYWxsKF9fTlJfaW9fdXJpbmdfc2V0dXAsIGVudHJpZXMsIHApOwomIzQzO30KJiM0MzsKJiM0MzsvKiBpb191cmluZyByZWFkcyBwb2xsMzJfZXZlbnRzIGJhY2sgdGhyb3VnaCBzd2FodzMyKCkgb24gYmlnIGVuZGlhbi4gKi8KJiM0MztzdGF0aWMgX191MzIgbm90aWZ5X3BvbGxfbWFzayhfX3UzMiBldmVudHMpCiYjNDM7ewomIzQzOyNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJmFtcDsmYW1wOyBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCiYjNDM7CXJldHVybiBfX3N3YWh3MzIoZXZlbnRzKTsKJiM0MzsjZWxzZQomIzQzOwlyZXR1cm4gZXZlbnRzOwomIzQzOyNlbmRpZgomIzQzO30KJiM0MzsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBpb191cmluZ19zZXR1cF9yYXcoMSwgJmFtcDtwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC0mZ3Q7bm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMCiYjNDM7ICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnMKJiM0MzsgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZAomIzQzOyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHAgPSB7fTsKJiM0MzsJdW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7CiYjNDM7CXN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7CiYjNDM7CXNpemVfdCBzcXJpbmdfc3o7CiYjNDM7CXZvaWQgKnNxOwomIzQzOwlpbnQgcmluZzsKJiM0MzsKJiM0MzsJcmluZyA9IGlvX3VyaW5nX3NldHVwX3Jhdyg4LCAmYW1wO3ApOwomIzQzOwlpZiAocmluZyAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXNxcmluZ19zeiA9IHAuc3Ffb2ZmLmFycmF5ICYjNDM7IHAuc3FfZW50cmllcyAqIHNpemVvZih1bnNpZ25lZCBpbnQpOwomIzQzOwlzcSA9IG1tYXAoTlVMTCwgc3FyaW5nX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRX1JJTkcpOwomIzQzOwlpZiAoc3EgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJc3FlcyA9IG1tYXAoTlVMTCwgcC5zcV9lbnRyaWVzICogc2l6ZW9mKCpzcWVzKSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSAgICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRRVMpOwomIzQzOwlpZiAoc3FlcyA9PSBNQVBfRkFJTEVEKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlzcV90YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICYjNDM7IHAuc3Ffb2ZmLnRhaWwpOwomIzQzOwlzcV9hcnJheSA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi5hcnJheSk7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO3NxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7CiYjNDM7CXNxZXNbMF0ub3Bjb2RlID0gSU9SSU5HX09QX1BPTExfQUREOwomIzQzOwlzcWVzWzBdLmZkID0gdHJpZ2dlcl9mZDsKJiM0MzsJc3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pOwomIzQzOwomIzQzOwlzcV9hcnJheVswXSA9IDA7CiYjNDM7CV9fYXRvbWljX3N0b3JlX24oc3FfdGFpbCwgMSwgX19BVE9NSUNfUkVMRUFTRSk7CiYjNDM7CiYjNDM7CWlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJLyogRGVsaWJlcmF0ZWx5IGxlYWtlZCwgd2UgYXJlIGFib3V0IHRvIGNyYXNoLiAqLwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlCiYjNDM7ICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvCiYjNDM7ICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLgomIzQzOyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuCiYjNDM7ICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWludCBmZCwgaTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSwKJiM0MzsJCSAgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChmdHJ1bmNhdGUoZmQsIChvZmZfdClOT1RJRllfU0lHTkFMX01BUF9DT1VOVCAqIHBnc3opKSB7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcHJvdCA9IChpICZhbXA7IDEpID8gUFJPVF9SRUFEIDogKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwomIzQzOwomIzQzOwkJaWYgKG1tYXAoTlVMTCwgcGdzeiwgcHJvdCwgTUFQX1BSSVZBVEUsIGZkLAomIzQzOwkJCSAob2ZmX3QpaSAqIHBnc3opID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gaTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CXVuc2lnbmVkIGNoYXIgKnA7CiYjNDM7CWludCB0cmlnZ2VyX2ZkOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZjsKJiM0MzsKJiM0MzsJLyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXImIzM5O3Mgb3BlbigpIGNhbm5vdCBibG9jay4gKi8KJiM0MzsJdHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpOwomIzQzOwomIzQzOwkvKiBFeGl0IHJhdGhlciB0aGFuIGNyYXNoOiBhIGR1bXAgd2l0aG91dCB0aGUgcG9sbCBhcm1lZCBwcm92ZXMgbm90aGluZy4gKi8KJiM0MzsJaWYgKHRyaWdnZXJfZmQgJmx0OyAwKQomIzQzOwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsKJiM0MzsJaWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwlmb3IgKG9mZiA9IDA7IG9mZiAmbHQ7IE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUzsgb2ZmICYjNDM7PSBwZ3N6KQomIzQzOwkJcFtvZmZdID0gMTsKJiM0MzsKJiM0MzsJaWYgKGFybV9wb2xsX25vdGlmeSh0cmlnZ2VyX2ZkKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CS8qIGNyYXNoIG9uIHB1cnBvc2UgKi8KJiM0MzsJKih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDsKJiM0MzsJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgT19XUk9OTFkgfCBPX05PTkJMT0NLIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAod3JpdGUoZmQsICYjMzQ7eCYjMzQ7LCAxKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogd3JpdGUgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHBoZHJbMF0gaXMgdGhlIFBUX05PVEUgZW50cnk6IGVsZl9jb3JlX2R1bXAoKSBlbWl0cyBpdCByaWdodCBhZnRlciB0aGUKJiM0MzsgKiBFTEYgaGVhZGVyLiBJdHMgcF9vZmZzZXQgaXMgd2hlcmUgdGhlIG5vdGVzIGJlZ2luLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGxvbmcgbm90ZV9vZmZzZXQoY29uc3QgdW5zaWduZWQgY2hhciAqaGRyKQomIzQzO3sKJiM0MzsJRWxmVyhQaGRyKSBwaDsKJiM0MzsJRWxmVyhFaGRyKSBlaDsKJiM0MzsKJiM0MzsJbWVtY3B5KCZhbXA7ZWgsIGhkciwgc2l6ZW9mKGVoKSk7CiYjNDM7CWlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbWVtY3B5KCZhbXA7cGgsIGhkciAmIzQzOyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTsKJiM0MzsJaWYgKHBoLnBfdHlwZSAhPSBQVF9OT1RFKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gKGxvbmcgbG9uZylwaC5wX29mZnNldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBEcmFpbiBhIGNvcmVkdW1wIG9mZiBAZmQsIGNvdW50aW5nIHdoYXQgYXJyaXZlcy4gT25jZSB0aGUgbm90ZXMgaGF2ZQomIzQzOyAqIHN0YXJ0ZWQgdGhlIGtlcm5lbCBpcyBpbnNpZGUgdGhlIG9uZSBiaWcgbm90ZSB3cml0ZSwgc28gcG9rZSB0aGUgZmlmbwomIzQzOyAqIHRoZSBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgYW5kIHN0b3AgcmVhZGluZywgd2hpY2gga2VlcHMgdGhlCiYjNDM7ICogdHJhbnNwb3J0IGZ1bGwgYW5kIHRoZSB3cml0ZSBibG9ja2VkIHdpdGggYSBwYXJ0aWFsIGNvdW50IHdoZW4gdGhlCiYjNDM7ICogd2FrZXVwIGxhbmRzLiBUaGVuIGNhcnJ5IG9uIHRvIGVuZCBvZiBmaWxlLgomIzQzOyAqCiYjNDM7ICogV2hhdCBhcnJpdmVzIGlzIHdyaXR0ZW4gdG8gQGZkX291dCB3aGVuIHRoYXQgaXMgbm90IG5lZ2F0aXZlLgomIzQzOyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEuIEZhaWxpbmcgdG8gdHJpcCB0aGUgZmlmbwomIzQzOyAqIGlzIGFuIGVycm9yIHRvbzogYSBkdW1wIHRoYXQgd2FzIG5ldmVyIGludGVycnVwdGVkIHByb3ZlcyBub3RoaW5nLgomIzQzOyAqLwomIzQzO3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGhkcltzaXplb2YoRWxmVyhFaGRyKSkgJiM0Mzsgc2l6ZW9mKEVsZlcoUGhkcikpXTsKJiM0MzsJc3RhdGljIGNoYXIgYnVmWzY0ICZsdDsmbHQ7IDEwXTsKJiM0MzsJbG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwlsb25nIGxvbmcgbm90ZV9vZmYgPSAwOwomIzQzOwlzaXplX3QgaGRybGVuID0gMDsKJiM0MzsJc3NpemVfdCB0b3RhbCA9IDA7CiYjNDM7CWJvb2wgYXJtZWQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJc3NpemVfdCBuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CiYjNDM7CiYjNDM7CQlpZiAobiAmbHQ7IDApIHsKJiM0MzsJCQlpZiAoZXJybm8gPT0gRUlOVFIpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCXJldHVybiAtMTsKJiM0MzsJCX0KJiM0MzsJCWlmIChuID09IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAoZmRfb3V0ICZndDs9IDAgJmFtcDsmYW1wOyB3cml0ZShmZF9vdXQsIGJ1ZiwgbikgIT0gbikKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CQlpZiAoaGRybGVuICZsdDsgc2l6ZW9mKGhkcikpIHsKJiM0MzsJCQlzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuOwomIzQzOwomIzQzOwkJCWlmICh3YW50ICZndDsgKHNpemVfdCluKQomIzQzOwkJCQl3YW50ID0gKHNpemVfdCluOwomIzQzOwkJCW1lbWNweShoZHIgJiM0MzsgaGRybGVuLCBidWYsIHdhbnQpOwomIzQzOwkJCWhkcmxlbiAmIzQzOz0gd2FudDsKJiM0MzsJCQlpZiAoaGRybGVuID09IHNpemVvZihoZHIpKQomIzQzOwkJCQlub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQl0b3RhbCAmIzQzOz0gbjsKJiM0MzsKJiM0MzsJCWlmIChhcm0gJmFtcDsmYW1wOyAhYXJtZWQgJmFtcDsmYW1wOyBub3RlX29mZiAmZ3Q7IDAgJmFtcDsmYW1wOwomIzQzOwkJICAgIHRvdGFsICZndDsgbm90ZV9vZmYgJiM0MzsgKGxvbmcgbG9uZylwZ3N6KSB7CiYjNDM7CQkJaWYgKHB1bGxfdHJpZ2dlcigpKQomIzQzOwkJCQlyZXR1cm4gLTE7CiYjNDM7CQkJYXJtZWQgPSB0cnVlOwomIzQzOwkJCXVzbGVlcChOT1RJRllfU0lHTkFMX1NUQUxMX1VTKTsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYXJtICZhbXA7JmFtcDsgIWFybWVkKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlyZXR1cm4gdG90YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogSG93IGxhcmdlIHRoZSBkdW1wIHdhcyBtZWFudCB0byBiZS4gVGhlIEVMRiBoZWFkZXIgYW5kIHRoZSBwcm9ncmFtCiYjNDM7ICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvdwomIzQzOyAqIGZhciBpdCBzaG91bGQgaGF2ZSBydW46IHRoZSBlbmQgaXMgbWF4KHBfb2Zmc2V0ICYjNDM7IHBfZmlsZXN6KS4KJiM0MzsgKgomIzQzOyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyCiYjNDM7ICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLSZndDt0b19za2lwLCBlbGZfY29yZV9kdW1wKCkKJiM0MzsgKiBoYXMgbm8gZmx1c2ggYWZ0ZXIgdGhlIGxhc3QgZHVtcF91c2VyX3JhbmdlKCkgYW5kIGEgcGlwZSBjYW5ub3Qgc2VlaywKJiM0MzsgKiBzbyB0aG9zZSBieXRlcyBhcmUgZHJvcHBlZC4gT24geDg2XzY0IHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIGdhdGUgdm1hCiYjNDM7ICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZQomIzQzOyAqIHBhZ2Ugc2hvcnQgb2Ygd2hhdCB0aGUgaGVhZGVycyBwcm9taXNlLiBAdGFpbCByZXR1cm5zIHRoZSBzaXplIG9mIHRoYXQKJiM0MzsgKiBsYXN0IHNlZ21lbnQsIHdoaWNoIGJvdW5kcyB3aGF0IG1heSBnbyBtaXNzaW5nIHRoaXMgd2F5LgomIzQzOyAqLwomIzQzO2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCkKJiM0Mzt7CiYjNDM7CUVsZlcoUGhkcikgKnBoZHIgPSBOVUxMOwomIzQzOwlsb25nIGxvbmcgZXhwZWN0ZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbnBoZHIsIGk7CiYjNDM7CUVsZlcoRWhkcikgZWg7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJKnRhaWwgPSAwOwomIzQzOwomIzQzOwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtlaCwgc2l6ZW9mKGVoKSkgIT0gc2l6ZW9mKGVoKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKCFlaC5lX3BobnVtIHx8IGVoLmVfcGhlbnRzaXplICE9IHNpemVvZigqcGhkcikpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJbnBoZHIgPSBlaC5lX3BobnVtOwomIzQzOwlwaGRyID0gY2FsbG9jKG5waGRyLCBzaXplb2YoKnBoZHIpKTsKJiM0MzsJaWYgKCFwaGRyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CWlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPQomIzQzOwkgICAgKHNzaXplX3QpKChzaXplX3QpbnBoZHIgKiBzaXplb2YoKnBoZHIpKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnBoZHI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICYjNDM7CiYjNDM7CQkJCShsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejsKJiM0MzsJCWlmIChlbmQgJmd0OyBleHBlY3RlZCkgewomIzQzOwkJCWV4cGVjdGVkID0gZW5kOwomIzQzOwkJCSp0YWlsID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWUocGhkcik7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIGV4cGVjdGVkOwomIzQzO2VycjoKJiM0MzsJZnJlZShwaGRyKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIwNTgKCQkJCQkJCW91dHB1dDogMTkyCgkJCQkJCQl0aG91Z2h0czogNzgwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIHNlcmllcyBpbiBmcm9udCBvZiBtZSB0aGF0IGFpbXMgdG8gZml4IGEgbmFzdHkgYnVnLiBBcHBhcmVudGx5LCBgVElGX05PVElGWV9TSUdOQUxgIHdhcyBhYmxlIHRvIGludGVycnVwdCBjb3JlZHVtcHMgYW5kIFNNQiBzZW5kcywgd2hpY2ggaXMgb2J2aW91c2x5IG5vdCBpZGVhbC4gVGhlIGZpeCBpbnRyb2R1Y2VzIGBub19ub3RpZnlfc2lnbmFsX3NhdmUoKWAgYW5kIGBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUoKWAgdG8gbWFzayB0aGF0IHNpZ25hbCBieSBzZXR0aW5nIGEgZmxhZywgYFBGX05PX05PVElGWV9TSUdOQUxgLCBpbiB0aGUgYGN1cnJlbnQtJmd0O2ZsYWdzYC4gVGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgaW4gYGZzL2NvcmVkdW1wLmNgIGFuZCBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2AsIHNwZWNpZmljYWxseSBgdmZzX2NvcmVkdW1wKClgIGFuZCBgc21iX3NlbmRfa3ZlYygpYCByZXNwZWN0aXZlbHkuIEl0IGFsc28gY29tZXMgd2l0aCBhIHNlbGZ0ZXN0IGZvciBjb3JlZHVtcCwgd2hpY2ggaXMgZ29vZC4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQmIzM5O3MgbmFpbCBkb3duIGFueSBwb3RlbnRpYWwgVU5JTklUSUFMSVpFRCBNRU1PUlkgaXNzdWVzLiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIHRhc2sgZmxhZ3MgYW5kIHNpZ25hbCBoYW5kbGluZyBoZXJlLCBzcGVjaWZpY2FsbHkgcHJldmVudGluZyBhIHNpZ25hbCBmcm9tIHByZW1hdHVyZWx5IGFib3J0aW5nIHRoaW5ncy4gTm8gbmV3IHN0cnVjdHVyZXMsIG5vIG5ldyBkYXRhIHNlbnQgdG8gdXNlciBzcGFjZSwgbm8gbmV3IGJvdW5kcyBjaGVja3Mgb3IgbGVuZ3RoIG1vZGlmaWNhdGlvbnMuIFRoaXMgaXMgKnB1cmVseSogY29udHJvbCBmbG93IGFyb3VuZCBzaWduYWwgaW50ZXJydXB0aW9uLgoKU28sIGRvZXMgdGhpcyBpbnRyb2R1Y2UgKmFueSogdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IEkmIzM5O20gbm90IHNlZWluZyBpdC4gSSBtZWFuLCB3ZSYjMzk7cmUgbm90IHRvdWNoaW5nIGRhdGEgaW4gYSB3YXkgdGhhdCBjb3VsZCBsZWFkIHRvIHJlYWRzIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkuIFdlJiMzOTtyZSBqdXN0IG1vZGlmeWluZyAqd2hlbiogY2VydGFpbiBvcGVyYXRpb25zIGdldCBpbnRlcnJ1cHRlZC4KCkxldCYjMzk7cyBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGUgY29kZSBzbmlwcGV0cywganVzdCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUuCgpJbiBgZnMvY29yZWR1bXAuY2AsIHdlIGhhdmU6CgpgYGBjCiYjNDM7CS8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqLwomIzQzOwlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAlzY29wZWRfd2l0aF9jcmVkcyhjcmVkKQogCQlkb19jb3JlZHVtcCgmYW1wO2NuLCAmYW1wO2Nwcm0sICZhbXA7YXJndiwgJmFtcDthcmdjLCBiaW5mbXQpOwogCWNvcmVkdW1wX2NsZWFudXAoJmFtcDtjbiwgJmFtcDtjcHJtKTsKJiM0MzsJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CmBgYAoKQmFzaWNhbGx5LCB3ZSYjMzk7cmUgbWFraW5nIHN1cmUgYGRvX2NvcmVkdW1wYCBpcyAqbm90KiBwcmVtYXR1cmVseSBpbnRlcnJ1cHRlZCBieSBgVElGX05PVElGWV9TSUdOQUxgLiBQZXJmZWN0bHkgcmVhc29uYWJsZS4KCkluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYDoKCmBgYGMKJiM0MzsJCW5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpOwogCQlyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTsKLQkJaWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSICZhbXA7JmFtcDsgdGFza193b3JrX3BlbmRpbmcoY3VycmVudCkpKSB7CiYjNDM7CQlub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTsKJiM0MzsJCWlmIChyYyA9PSAtRUFHQUlOKSB7CmBgYAoKQWdhaW4sIHNhbWUgcHJpbmNpcGxlLiBQcmV2ZW50aW5nIHRoZSBzaWduYWwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhlIGBzb2NrX3NlbmRtc2dgIGNhbGwuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIGhlcmUgZWl0aGVyLgoKU28sIGJvdHRvbSBsaW5lOiBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrLiBUaGlzIHBhdGNoIGlzIGZ1bmRhbWVudGFsbHkgYWJvdXQgdGFzayBmbGFncyBhbmQgc2lnbmFsIGhhbmRsaW5nLiBUaGVyZSYjMzk7cyB6ZXJvIGNoYW5jZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBiZWNhdXNlIG9mIHRoZXNlIGNoYW5nZXMuIFRodXMsIHRoaXMgZG9lc24mIzM5O3QgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBjYW1wYWlnbi4gS0FTQU4gYW5kIG90aGVyIHRvb2xzIHdpbGwgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzLgoKT2theSwgbGV0JiMzOTtzIGZvcm11bGF0ZSB0aGlzIHN1Y2NpbmN0bHkgYW5kIGNhbGwgaXQgYSBkYXkuCgoqKlJlYXNvbmluZzoqKgoKVGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4KCkFscmlnaHQsIGBzZXQtcmVzdWx0c2AuIERvbmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MjIuMDAzNDg0NzYyWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTIwNTU0NTY5OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIixcbiAgICBcIkNJRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2ZnNfY29yZWR1bXBcIixcbiAgICBcInNtYl9zZW5kX2t2ZWNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MjIuMDAzNDk0OTQyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NzA5MDc1MjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2OGU0MWEzYzljZTIyMGZlMTM1NzJmZDQ5NDViNmRhZWU1NWJlMGNlXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgQXVnIDE4IDExOjMxOjIxIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXFxuaW5kZXggZTY4YTc2ZmY5MmEzOC4uZWRiNWExYTYxZDg0ZiAxMDA2NDRcXG4tLS0gYS9mcy9jb3JlZHVtcC5jXFxuKysrIGIvZnMvY29yZWR1bXAuY1xcbkBAIC0xMTY1LDYgKzExNjUsNyBAQCB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKVxcbiBcXHRzdHJ1Y3QgY29yZV9uYW1lIGNuO1xcbiBcXHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXFx1MDAzZW1tO1xcbiBcXHRjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQgPSBtbS1cXHUwMDNlYmluZm10O1xcbitcXHR1bnNpZ25lZCBpbnQgbm90aWZ5X2ZsYWdzO1xcbiBcXHRpbnQgYXJnYyA9IDA7XFxuIFxcdHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHtcXG4gXFx0XFx0LnNpZ2luZm8gPSBzaWdpbmZvLFxcbkBAIC0xMTk2LDkgKzExOTcsMTIgQEAgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcXG4gXFx0aWYgKGNvcmVkdW1wX3dhaXQoc2lnaW5mby1cXHUwMDNlc2lfc2lnbm8sIFxcdTAwMjZjb3JlX3N0YXRlKSBcXHUwMDNjIDApXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuK1xcdC8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqL1xcbitcXHRub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTtcXG4gXFx0c2NvcGVkX3dpdGhfY3JlZHMoY3JlZClcXG4gXFx0XFx0ZG9fY29yZWR1bXAoXFx1MDAyNmNuLCBcXHUwMDI2Y3BybSwgXFx1MDAyNmFyZ3YsIFxcdTAwMjZhcmdjLCBiaW5mbXQpO1xcbiBcXHRjb3JlZHVtcF9jbGVhbnVwKFxcdTAwMjZjbiwgXFx1MDAyNmNwcm0pO1xcbitcXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcXG4gXFx0cmV0dXJuO1xcbiB9XFxuIFxcbmRpZmYgLS1naXQgYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jIGIvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY1xcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XFxuLS0tIGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY1xcbisrKyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcXG5AQCAtMjIsNyArMjIsNiBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtcG9vbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC90YXNrX3dvcmsuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFxcImNpZnNnbG9iLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJjaWZzcHJvdG8uaFxcXCJcXG4gI2luY2x1ZGUgXFxcImNpZnNfZGVidWcuaFxcXCJcXG5AQCAtMTQyLDYgKzE0MSw3IEBAIGludFxcbiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZyxcXG4gXFx0ICAgICAgc2l6ZV90ICpzZW50KVxcbiB7XFxuK1xcdHVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7XFxuIFxcdGludCByYyA9IDA7XFxuIFxcdGludCByZXRyaWVzID0gMDtcXG4gXFx0c3RydWN0IHNvY2tldCAqc3NvY2tldCA9IHNlcnZlci1cXHUwMDNlc3NvY2tldDtcXG5AQCAtMTcyLDE1ICsxNzIsMTIgQEAgc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXFxuIFxcdFxcdCAqIGFmdGVyIHRoZSByZXRyaWVzIHdlIHdpbGwga2lsbCB0aGUgc29ja2V0IGFuZFxcbiBcXHRcXHQgKiByZWNvbm5lY3Qgd2hpY2ggbWF5IGNsZWFyIHRoZSBuZXR3b3JrIHByb2JsZW0uXFxuIFxcdFxcdCAqXFxuLVxcdFxcdCAqIEV2ZW4gaWYgcmVndWxhciBzaWduYWxzIGFyZSBtYXNrZWQsIEVJTlRSIG1pZ2h0IGJlXFxuLVxcdFxcdCAqIHByb3BhZ2F0ZWQgZnJvbSBza19zdHJlYW1fd2FpdF9tZW1vcnkoKSB0byBoZXJlIHdoZW5cXG4tXFx0XFx0ICogVElGX05PVElGWV9TSUdOQUwgaXMgdXNlZCBmb3IgdGFzayB3b3JrLiBGb3IgZXhhbXBsZSxcXG4tXFx0XFx0ICogY2VydGFpbiBpb191cmluZyBjb21wbGV0aW9ucyB3aWxsIHVzZSB0aGF0LiBUcmVhdFxcbi1cXHRcXHQgKiBoYXZpbmcgRUlOVFIgd2l0aCBwZW5kaW5nIHRhc2sgd29yayB0aGUgc2FtZSBhcyBFQUdBSU5cXG4tXFx0XFx0ICogdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVjb25uZWN0cy5cXG4rXFx0XFx0ICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS5cXG4gXFx0XFx0ICovXFxuK1xcdFxcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xcbiBcXHRcXHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcXG4tXFx0XFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFxcdTAwMjZcXHUwMDI2IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkge1xcbitcXHRcXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcXG4rXFx0XFx0aWYgKHJjID09IC1FQUdBSU4pIHtcXG4gXFx0XFx0XFx0cmV0cmllcysrO1xcbiBcXHRcXHRcXHRpZiAocmV0cmllcyBcXHUwMDNlPSAxNCB8fFxcbiBcXHRcXHRcXHQgICAgKCFzZXJ2ZXItXFx1MDAzZW5vYmxvY2tzbmQgXFx1MDAyNlxcdTAwMjYgKHJldHJpZXMgXFx1MDAzZSAyKSkpIHtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oXFxuaW5kZXggMzczYmNjMDU5OGQxMC4uZmQ3MmNhNGVlOTJmMiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcXG5AQCAtMTc5Niw3ICsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7XFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAqIEkgYW0gY2xlYW5pbmcgZGlydHkgcGFnZXMgZnJvbSBzb21lIG90aGVyIGJkaS4gKi9cXG4gI2RlZmluZSBQRl9LVEhSRUFEXFx0XFx0MHgwMDIwMDAwMFxcdC8qIEkgYW0gYSBrZXJuZWwgdGhyZWFkICovXFxuICNkZWZpbmUgUEZfUkFORE9NSVpFXFx0XFx0MHgwMDQwMDAwMFxcdC8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi9cXG4tI2RlZmluZSBQRl9fSE9MRV9fMDA4MDAwMDBcXHQweDAwODAwMDAwXFxuKyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFxcdDB4MDA4MDAwMDBcXHQvKiBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkgKi9cXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcXHQweDAxMDAwMDAwXFxuICNkZWZpbmUgUEZfX0hPTEVfXzAyMDAwMDAwXFx0MHgwMjAwMDAwMFxcbiAjZGVmaW5lIFBGX05PX1NFVEFGRklOSVRZXFx0MHgwNDAwMDAwMFxcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxcbmluZGV4IDU4NGFlODhiNDM1ZTkuLjMxODJkZTRmZjk0ODIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcXG5AQCAtMzg0LDE0ICszODQsMzEgQEAgc3RhdGljIGlubGluZSBpbnQgdGFza19zaWdwZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcXG4gXFx0cmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTtcXG4gfVxcbiBcXG4rLyogUHJldmVudCBUSUZfTk9USUZZX1NJR05BTCBmcm9tIGludGVycnVwdGluZyB0aGlzIHRhc2suICovXFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vX25vdGlmeV9zaWduYWxfc2F2ZSh2b2lkKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfTk9fTk9USUZZX1NJR05BTDtcXG4rXFxuK1xcdGN1cnJlbnQtXFx1MDAzZWZsYWdzIHw9IFBGX05PX05PVElGWV9TSUdOQUw7XFxuK1xcdHJldHVybiBmbGFncztcXG4rfVxcbitcXG4rLyogUmVzdG9yZSBUSUZfTk9USUZZX1NJR05BTC4gKi9cXG4rc3RhdGljIGlubGluZSB2b2lkIG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZSh1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0Y3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTtcXG4rfVxcbitcXG4gc3RhdGljIGlubGluZSBpbnQgc2lnbmFsX3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKVxcbiB7XFxuIFxcdC8qXFxuIFxcdCAqIFRJRl9OT1RJRllfU0lHTkFMIGlzbid0IHJlYWxseSBhIHNpZ25hbCwgYnV0IGl0IHJlcXVpcmVzIHRoZSBzYW1lXFxuIFxcdCAqIGJlaGF2aW9yIGluIHRlcm1zIG9mIGVuc3VyaW5nIHRoYXQgd2UgYnJlYWsgb3V0IG9mIHdhaXQgbG9vcHNcXG4tXFx0ICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLlxcbitcXHQgKiBzbyB0aGF0IG5vdGlmeSBzaWduYWwgY2FsbGJhY2tzIGNhbiBiZSBwcm9jZXNzZWQuIE5vdCBmb3IgYSB0YXNrXFxuK1xcdCAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuXFxuIFxcdCAqL1xcbi1cXHRpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05PVElGWV9TSUdOQUwpKSlcXG4rXFx0aWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGxpa2VseSghKFJFQURfT05DRShwLVxcdTAwM2VmbGFncykgXFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXFxuIFxcdFxcdHJldHVybiAxO1xcbiBcXHRyZXR1cm4gdGFza19zaWdwZW5kaW5nKHApO1xcbiB9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcXG5pbmRleCBkZWNlMWEzMWQ1NjFiLi43MjhmM2MzNDJlYjkyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcXG5AQCAtMyw3ICszLDEwIEBAIENGTEFHUyArPSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxcbiBcXG4gVEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcXFxcbiBcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXFxcXG4tXFx0XFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxcbitcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXFxcXG4rXFx0XFx0ICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RcXG4rIyBTcGF3bmVkIGJ5IHRoZSBrZXJuZWwgYXMgdGhlIHxoZWxwZXIsIG5vdCBhIHRlc3Qgb2YgaXRzIG93bi5cXG4rVEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcXG4gVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcXG4gXFxuIGluY2x1ZGUgLi4vbGliLm1rXFxuQEAgLTExLDMgKzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWtcXG4gJChPVVRQVVQpL3N0YWNrZHVtcF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXFxuQEAgLTAsMCArMSwyOSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbitcXG4rI2lmbmRlZiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxcbisjZGVmaW5lIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjc3RkYm9vbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3R5cGVzLmhcXHUwMDNlXFxuK1xcbisvKlxcbisgKiBEZWZpbmUgYSBidW5jaCBvZiBjb25zdGFudHMgd2UgbmVlZC4gV2UgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZVxcbisgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0J3Mgd2F5IGJleW9uZCB0aGUgZGVmYXVsdCA2NEtcXG4rICogcGlwZSByaW5nIGFuZCBwYXN0IHRoZSB+MzZLIGFuIGFmX3VuaXggc2tiIGhvbGRzLiBTbyB3ZSBmb3JjZSBhIHdyaXRlXFxuKyAqIHRvIGNvbWUgYmFjayBzaG9ydC5cXG4rICovXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBfQ09VTlRcXHRcXHQ0MDAwXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTXFx0KDRVTCBcXHUwMDNjXFx1MDAzYyAyMClcXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX1NUQUxMX1VTXFx0XFx0MjAwMDAwXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBGSUxFXFx0XFx0XFxcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXFxcIlxcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfVFJJR0dFUlxcdFxcdFxcXCIvdG1wL2NvcmVkdW1wLm5vdGlmeV9zaWduYWwudHJpZ2dlclxcXCJcXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0NPUkVfRklMRVxcdFxcdFxcXCIvdG1wL2NvcmVkdW1wLm5vdGlmeV9zaWduYWwuY29yZVxcXCJcXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRVxcdFxcXCIvdG1wL2NvcmVkdW1wLm5vdGlmeV9zaWduYWwuY29yZS50bXBcXFwiXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9TT0NLRVRcXHRcXHRcXFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFxcXCJcXG4rXFxuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKTtcXG4rYm9vbCBjb3JlZHVtcF9pb191cmluZ19hdmFpbGFibGUodm9pZCk7XFxuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pO1xcbitsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpO1xcbitcXG4rI2VuZGlmIC8qIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IICovXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi44NDlmNWMxZWE3MzY1XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcXG5AQCAtMCwwICsxLDQ2IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK1xcbisvKlxcbisgKiBUaGUgfGhlbHBlciBoYWxmIG9mIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC4gVGhlIGtlcm5lbCBzcGF3bnMgdGhpc1xcbisgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LlxcbisgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXFxuKyAqIGNyYXNoaW5nIHRhc2sgaXMgcG9sbGluZyBzbyBUSUZfTk9USUZZX1NJR05BTCBpcyByYWlzZWQgd2hpbGUgdGhlIG5vdGVcXG4rICogd3JpdGUgaXMgaW4gZmxpZ2h0LlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXFxcIlxcbitcXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcXG4re1xcbitcXHRpbnQgZmRfY29yZV9maWxlO1xcbitcXHRzc2l6ZV90IHJldDtcXG4rXFxuK1xcdGZkX2NvcmVfZmlsZSA9IG9wZW4oTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsXFxuK1xcdFxcdFxcdCAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcXG4rXFx0aWYgKGZkX2NvcmVfZmlsZSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogb3BlbiBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBhcmd2WzBdKTtcXG4rXFx0XFx0cmV0dXJuIEVYSVRfRkFJTFVSRTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKFNURElOX0ZJTEVOTywgZmRfY29yZV9maWxlLCB0cnVlKTtcXG4rXFx0Y2xvc2UoZmRfY29yZV9maWxlKTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0LyogVGhlIHRlc3QgcG9sbHMgZm9yIHRoaXMgbmFtZSwgc28gb25seSBjcmVhdGUgaXQgb25jZSBpdCBpcyB3aG9sZS4gKi9cXG4rXFx0aWYgKHJlbmFtZShOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHJlbmFtZSBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBhcmd2WzBdKTtcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBFWElUX1NVQ0NFU1M7XFxuK1xcbitlcnI6XFxuK1xcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSk7XFxuK1xcdHJldHVybiBFWElUX0ZBSUxVUkU7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTYzYzA2YTgxNTYyZlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuY1xcbkBAIC0wLDAgKzEsMjQ1IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK1xcbisvKlxcbisgKiBBIGNvcmVkdW1wIGlzIG1lYW50IHRvIGJlIGludGVycnVwdGVkIGJ5IFNJR0tJTEwgYW5kIGJ5IHRoZSBmcmVlemVyIGFuZFxcbisgKiBieSBub3RoaW5nIGVsc2UuIGR1bXBfaW50ZXJydXB0ZWQoKSBzYXlzIHNvLCBidXQgdGhlIGJsb2NraW5nIHdhaXRzXFxuKyAqIHVuZGVybmVhdGggaXQgdGVzdCBzaWduYWxfcGVuZGluZygpLCB3aGljaCBpcyBhbHNvIHRydWUgZm9yXFxuKyAqIFRJRl9OT1RJRllfU0lHTkFMLiBBIGNyYXNoaW5nIHRhc2sgdGhhdCBoYXMgYW4gaW9fdXJpbmcgY29tcGxldGlvbiBsYW5kXFxuKyAqIG9uIGl0IG1pZC1kdW1wIHRoZXJlZm9yZSBrZWVwcyBkdW1waW5nIHdoaWxlIGV2ZXJ5IHdhaXQgaXQgZW50ZXJzIGJhaWxzXFxuKyAqIG91dCBhdCBvbmNlLCBhbmQgdGhlIGR1bXAgaXMgc2lsZW50bHkgY3V0IHNob3J0LiBOb3RoaW5nIHJlcG9ydHMgaXQ6XFxuKyAqIGJpbmZtdF9lbGYgc2V0cyBoYXNfZHVtcGVkIGJlZm9yZSBpdCB3cml0ZXMgYW55dGhpbmcsIHNvIFdDT1JFRFVNUCgpXFxuKyAqIHNheXMgdGhlIGR1bXAgd29ya2VkLlxcbisgKlxcbisgKiBBIGNvcmVkdW1wIG5vdGUgaXMgdGhlIG9ubHkgZHVtcF9lbWl0KCkgdGhhdCBleGNlZWRzIHdoYXQgdGhlIHRyYW5zcG9ydFxcbisgKiB0YWtlcyBpbiBvbmUgZ28sIHNvIGl0IGlzIHRoZSBvbmUgd3JpdGUgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLiBCb3RoXFxuKyAqIHRlc3RzIGNyYXNoIGEgY2hpbGQgaG9sZGluZyBlbm91Z2ggZmlsZSBiYWNrZWQgbWFwcGluZ3MgZm9yIGl0cyBOVF9GSUxFXFxuKyAqIG5vdGUgdG8gcnVuIHBhc3QgdGhhdCwgYXJtIGFuIGlvX3VyaW5nIHBvbGwgb24gaXQsIGFuZCB0cmlwIHRoZSBwb2xsXFxuKyAqIHdoaWxlIHRoZSBub3RlIGlzIGJlaW5nIHdyaXR0ZW4uIFdoYXQgY29tZXMgb3V0IGhhcyB0byBiZSB0aGUgd2hvbGVcXG4rICogZHVtcC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3NvY2tldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy91bi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNvcmVkdW1wX3Rlc3QuaFxcXCJcXG4rXFxuK0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApXFxuK3tcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSAtRVNSQ0g7XFxuK1xcdHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XFxuK1xcdGZpbGUgPSBmb3BlbihcXFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cXFwiLCBcXFwiclxcXCIpO1xcbitcXHRBU1NFUlRfTkUoTlVMTCwgZmlsZSk7XFxuK1xcbitcXHRyZXQgPSBmcmVhZChzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4sIDEsXFxuK1xcdFxcdCAgICBzaXplb2Yoc2VsZi1cXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7XFxuK1xcdEFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTtcXG4rXFx0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXFx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybikpO1xcbitcXG4rXFx0c2VsZi1cXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAnXFxcXDAnO1xcbitcXHRzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpO1xcbitcXHRBU1NFUlRfR0Uoc2VsZi1cXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQsIDApO1xcbitcXG4rXFx0cmV0ID0gZmNsb3NlKGZpbGUpO1xcbitcXHRBU1NFUlRfRVEoMCwgcmV0KTtcXG4rXFxuK1xcdHVubGluayhOT1RJRllfU0lHTkFMX1RSSUdHRVIpO1xcbitcXHRBU1NFUlRfRVEobWtmaWZvKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgMDYwMCksIDApO1xcbit9XFxuK1xcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnJlYXNvbjtcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldCwgc3RhdHVzO1xcbitcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7XFxuK1xcdFxcdHdhaXRwaWQoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdH1cXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKTtcXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfU09DS0VUKTtcXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XFxuK1xcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xcbitcXG4rXFx0ZmlsZSA9IGZvcGVuKFxcXCIvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblxcXCIsIFxcXCJ3XFxcIik7XFxuK1xcdGlmICghZmlsZSkge1xcbitcXHRcXHRyZWFzb24gPSBcXFwiVW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXFxcIjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBmcHJpbnRmKGZpbGUsIFxcXCIlc1xcXCIsIHNlbGYtXFx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdHJlYXNvbiA9IFxcXCJVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuXFxcIjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBmY2xvc2UoZmlsZSk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cmVhc29uID0gXFxcIlVuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm5cXFwiO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdHJldCA9IGNsb3NlKHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0cmVhc29uID0gXFxcIlVuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1xcXCI7XFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0fVxcbitcXHRcXHRzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm47XFxuK2ZhaWw6XFxuK1xcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xcbitcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZhaWxlZCB0byBjbGVhbnVwIGNvcmVkdW1wIHRlc3Q6ICVzXFxcXG5cXFwiLCByZWFzb24pO1xcbit9XFxuK1xcbisvKlxcbisgKiBDaGVjayB0aGF0IHdoYXQgdGhlIGhlbHBlciBvciB0aGUgc2VydmVyIHNhdmVkIGlzIHRoZSB3aG9sZSBkdW1wLiBPbmx5XFxuKyAqIGEgaG9sZSBhdCB0aGUgdmVyeSBlbmQgY2FuIGJlIG1pc3NpbmcsIHNlZSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKCkuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjaGVja193aG9sZV9jb3JlZHVtcChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEpXFxuK3tcXG4rXFx0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xcbitcXHRzdHJ1Y3Qgc3RhdCBzdDtcXG4rXFxuK1xcdGV4cGVjdGVkID0gY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXFx1MDAyNnRhaWwpO1xcbitcXHRBU1NFUlRfR1QoZXhwZWN0ZWQsIDApO1xcbitcXHRBU1NFUlRfRVEoc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXFx1MDAyNnN0KSwgMCk7XFxuK1xcdEFTU0VSVF9MRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkKTtcXG4rXFx0QVNTRVJUX0dFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQgLSB0YWlsKTtcXG4rfVxcbitcXG4rLypcXG4rICogVGhlIGR1bXAgZ29lcyB0byBhIHxoZWxwZXIsIHNvIHRoZSByZWFkZXIgaXMgYSBzZXBhcmF0ZSBwcm9ncmFtIHRoZVxcbisgKiBrZXJuZWwgc3Bhd25zLiBJdCBzYXZlcyB3aGF0IGl0IHJlY2VpdmVkIHRvIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLlxcbisgKi9cXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3BpcGUpXFxuK3tcXG4rXFx0Y2hhciBwYXR0ZXJuW1BBVEhfTUFYXSwgaGVscGVyW1BBVEhfTUFYXSwgKnA7XFxuK1xcdHN0cnVjdCBzdGF0IHN0O1xcbitcXHRpbnQgc3RhdHVzLCBpO1xcbitcXHRwaWRfdCBwaWQ7XFxuK1xcdHNzaXplX3QgbjtcXG4rXFxuK1xcdGlmICghY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiaW9fdXJpbmcgbm90IGF2YWlsYWJsZVxcXCIpO1xcbitcXG4rXFx0biA9IHJlYWRsaW5rKFxcXCIvcHJvYy9zZWxmL2V4ZVxcXCIsIGhlbHBlciwgc2l6ZW9mKGhlbHBlcikgLSAxKTtcXG4rXFx0QVNTRVJUX0dUKG4sIDApO1xcbitcXHRoZWxwZXJbbl0gPSAnXFxcXDAnO1xcbitcXHRwID0gc3Ryc3RyKGhlbHBlciwgXFxcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFxcXCIpO1xcbitcXHRBU1NFUlRfTkUocCwgTlVMTCk7XFxuK1xcdEFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSArIHNpemVvZihcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcXFwiKSxcXG4rXFx0XFx0ICBzaXplb2YoaGVscGVyKSk7XFxuK1xcdHN0cmNweShwLCBcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcXFwiKTtcXG4rXFx0aWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKVxcbitcXHRcXHRTS0lQKHJldHVybiwgXFxcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyIG5vdCBidWlsdFxcXCIpO1xcbitcXG4rXFx0QVNTRVJUX0xUKHNucHJpbnRmKHBhdHRlcm4sIHNpemVvZihwYXR0ZXJuKSwgXFxcInwlc1xcXCIsIGhlbHBlciksXFxuK1xcdFxcdCAgKGludClzaXplb2YocGF0dGVybikpO1xcbitcXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTtcXG4rXFxuK1xcdHBpZCA9IGZvcmsoKTtcXG4rXFx0QVNTRVJUX0dFKHBpZCwgMCk7XFxuK1xcdGlmIChwaWQgPT0gMClcXG4rXFx0XFx0Y3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCgpO1xcbitcXG4rXFx0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcXHUwMDI2c3RhdHVzLCAwKSwgcGlkKTtcXG4rXFx0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XFxuK1xcbitcXHQvKiBUaGUga2VybmVsIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBoZWxwZXIsIHNvIHBvbGwgZm9yIGl0LiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgMTAwOyBpKyspIHtcXG4rXFx0XFx0aWYgKCFzdGF0KE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2IHN0LnN0X3NpemUpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR1c2xlZXAoMTAwMDAwKTtcXG4rXFx0fVxcbitcXG4rXFx0Y2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTtcXG4rfVxcbitcXG4rLyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi9cXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcXG4re1xcbitcXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XFxuK1xcdGludCBpcGNfc29ja2V0c1syXSwgc3RhdHVzO1xcbitcXHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdO1xcbitcXHRjaGFyIGM7XFxuK1xcbitcXHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRTS0lQKHJldHVybiwgXFxcImlvX3VyaW5nIG5vdCBhdmFpbGFibGVcXFwiKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLFxcbitcXHRcXHRcXHQgICAgIGlwY19zb2NrZXRzKSwgMCk7XFxuK1xcdEFTU0VSVF9MVChzbnByaW50ZihwYXR0ZXJuLCBzaXplb2YocGF0dGVybiksIFxcXCJAJXNcXFwiLFxcbitcXHRcXHRcXHQgICBOT1RJRllfU0lHTkFMX1NPQ0tFVCksIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcXG4rXFx0QVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybihwYXR0ZXJuKSk7XFxuK1xcbitcXHRwaWRfY29yZWR1bXBfc2VydmVyID0gZm9yaygpO1xcbitcXHRBU1NFUlRfR0UocGlkX2NvcmVkdW1wX3NlcnZlciwgMCk7XFxuK1xcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcXG4rXFx0XFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9jb3JlX2ZpbGUgPSAtMTtcXG4rXFx0XFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcXG4rXFxuK1xcdFxcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcXG4rXFxuK1xcdFxcdGZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KE5PVElGWV9TSUdOQUxfU09DS0VUKTtcXG4rXFx0XFx0aWYgKGZkX3NlcnZlciBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRpZiAod3JpdGVfbm9pbnRyKGlwY19zb2NrZXRzWzFdLCBcXFwiMVxcXCIsIDEpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGNsb3NlKGlwY19zb2NrZXRzWzFdKTtcXG4rXFxuK1xcdFxcdGZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7XFxuK1xcdFxcdGlmIChmZF9jb3JlZHVtcCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0ZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSxcXG4rXFx0XFx0XFx0XFx0ICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsXFxuK1xcdFxcdFxcdFxcdCAgICAwNjAwKTtcXG4rXFx0XFx0aWYgKGZkX2NvcmVfZmlsZSBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0aWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR0cnVlKSBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0ZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTO1xcbitvdXQ6XFxuK1xcdFxcdGlmIChmZF9jb3JlX2ZpbGUgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0Y2xvc2UoZmRfY29yZV9maWxlKTtcXG4rXFx0XFx0aWYgKGZkX2NvcmVkdW1wIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKGZkX2NvcmVkdW1wKTtcXG4rXFx0XFx0aWYgKGZkX3NlcnZlciBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZF9zZXJ2ZXIpO1xcbitcXHRcXHRfZXhpdChleGl0X2NvZGUpO1xcbitcXHR9XFxuK1xcdHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xcbitcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7XFxuK1xcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXFx1MDAyNmMsIDEpLCAxKTtcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7XFxuK1xcbitcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdEFTU0VSVF9HRShwaWQsIDApO1xcbitcXHRpZiAocGlkID09IDApXFxuK1xcdFxcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCksIHBpZCk7XFxuK1xcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xcbitcXG4rXFx0d2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7XFxuK1xcbitcXHRjaGVja193aG9sZV9jb3JlZHVtcChfbWV0YWRhdGEpO1xcbit9XFxuK1xcbitURVNUX0hBUk5FU1NfTUFJTlxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcXG5pbmRleCBlZDQ3ZjAxZmE1M2M1Li4wNmY5OTdiYTQ3ZmQ5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxcbkBAIC05LDYgKzksNyBAQFxcbiBcXG4gI2luY2x1ZGUgXFxcIi4uL2tzZWxmdGVzdF9oYXJuZXNzLmhcXFwiXFxuICNpbmNsdWRlIFxcXCIuLi9waWRmZC9waWRmZC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXFxcIlxcbiBcXG4gI2lmbmRlZiBQQUdFX1NJWkVcXG4gI2RlZmluZSBQQUdFX1NJWkUgNDA5NlxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuQEAgLTEsMTEgKzEsMTggQEBcXG4gLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gXFxuICNpbmNsdWRlIFxcdTAwM2Nhc3NlcnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2VsZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZW5kaWFuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGluay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RkZGVmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pb191cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhYi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29yZWR1bXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2Nwb2xsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRib29sLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbkBAIC0xMyw3ICsyMCw5IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy9lcG9sbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL3NvY2tldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N5c2NhbGwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy90eXBlcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL3VuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbkBAIC0yMSw2ICszMCw3IEBAXFxuIFxcbiAjaW5jbHVkZSBcXFwiLi4vZmlsZXN5c3RlbXMvd3JhcHBlcnMuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIi4uL3BpZGZkL3BpZGZkLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcXFwiXFxuIFxcbiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyB0byBhdm9pZCBpbmNsdWRpbmcgaGFybmVzcyBoZWFkZXIgKi9cXG4gc3RydWN0IF9fdGVzdF9tZXRhZGF0YTtcXG5AQCAtMzgxLDMgKzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcXG4gXFx0XFx0Y2xvc2UoZmRfY29yZWR1bXApO1xcbiBcXHRfZXhpdChleGl0X2NvZGUpO1xcbiB9XFxuK1xcbisvKlxcbisgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxcbisgKlxcbisgKiBfX2R1bXBfZW1pdCgpIHRha2VzIGFueXRoaW5nIHNob3J0IG9mIGEgZnVsbCB3cml0ZSBhcyB0aGUgZW5kIG9mIHRoZVxcbisgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcXG4rICogb2YgaXQuIFRoZSBOVF9GSUxFIG5vdGUgaXMgdGhlIG9uZSBlbWl0IHRoYXQgaXMgY2VydGFpbiB0byBibG9jayxcXG4rICogYmVjYXVzZSBpdCBpcyB0aGUgb25seSBvbmUgbGFyZ2VyIHRoYW4gdGhlIHRyYW5zcG9ydCwgc28gdGhlc2UgaGVscGVyc1xcbisgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXFxuKyAqIHRoZSBkdW1waW5nIHRhc2sgd2hpbGUgdGhhdCB3cml0ZSBpcyBpbiBmbGlnaHQuXFxuKyAqL1xcbitcXG4rc3RhdGljIGludCBpb191cmluZ19zZXR1cF9yYXcodW5zaWduZWQgaW50IGVudHJpZXMsIHN0cnVjdCBpb191cmluZ19wYXJhbXMgKnApXFxuK3tcXG4rXFx0cmV0dXJuIHN5c2NhbGwoX19OUl9pb191cmluZ19zZXR1cCwgZW50cmllcywgcCk7XFxuK31cXG4rXFxuKy8qIGlvX3VyaW5nIHJlYWRzIHBvbGwzMl9ldmVudHMgYmFjayB0aHJvdWdoIHN3YWh3MzIoKSBvbiBiaWcgZW5kaWFuLiAqL1xcbitzdGF0aWMgX191MzIgbm90aWZ5X3BvbGxfbWFzayhfX3UzMiBldmVudHMpXFxuK3tcXG4rI2lmIGRlZmluZWQoX19CWVRFX09SREVSKSBcXHUwMDI2XFx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXFxuK1xcdHJldHVybiBfX3N3YWh3MzIoZXZlbnRzKTtcXG4rI2Vsc2VcXG4rXFx0cmV0dXJuIGV2ZW50cztcXG4rI2VuZGlmXFxuK31cXG4rXFxuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdGZkID0gaW9fdXJpbmdfc2V0dXBfcmF3KDEsIFxcdTAwMjZwKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisvKlxcbisgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC1cXHUwMDNlbm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMXFxuKyAqIHVubGVzcyB0aGUgcmluZyBhc2tzIGZvciBTUVBPTEwgb3IgQ09PUF9UQVNLUlVOLCBzbyB0aGUgY29tcGxldGlvbiBydW5zXFxuKyAqIHNldF9ub3RpZnlfc2lnbmFsKCkgYWdhaW5zdCB0aGUgdGFzayB0aGF0IHN1Ym1pdHRlZCBpdC4gVGhhdCBpcyB1cywgYW5kXFxuKyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suXFxuKyAqL1xcbitzdGF0aWMgaW50IGFybV9wb2xsX25vdGlmeShpbnQgdHJpZ2dlcl9mZClcXG4re1xcbitcXHRzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHAgPSB7fTtcXG4rXFx0dW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7XFxuK1xcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7XFxuK1xcdHNpemVfdCBzcXJpbmdfc3o7XFxuK1xcdHZvaWQgKnNxO1xcbitcXHRpbnQgcmluZztcXG4rXFxuK1xcdHJpbmcgPSBpb191cmluZ19zZXR1cF9yYXcoOCwgXFx1MDAyNnApO1xcbitcXHRpZiAocmluZyBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHNxcmluZ19zeiA9IHAuc3Ffb2ZmLmFycmF5ICsgcC5zcV9lbnRyaWVzICogc2l6ZW9mKHVuc2lnbmVkIGludCk7XFxuK1xcdHNxID0gbW1hcChOVUxMLCBzcXJpbmdfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUV9SSU5HKTtcXG4rXFx0aWYgKHNxID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHNxZXMgPSBtbWFwKE5VTEwsIHAuc3FfZW50cmllcyAqIHNpemVvZigqc3FlcyksIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCAgICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRRVMpO1xcbitcXHRpZiAoc3FlcyA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRzcV90YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYudGFpbCk7XFxuK1xcdHNxX2FycmF5ID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYuYXJyYXkpO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZzcWVzWzBdLCAwLCBzaXplb2Yoc3Flc1swXSkpO1xcbitcXHRzcWVzWzBdLm9wY29kZSA9IElPUklOR19PUF9QT0xMX0FERDtcXG4rXFx0c3Flc1swXS5mZCA9IHRyaWdnZXJfZmQ7XFxuK1xcdHNxZXNbMF0ucG9sbDMyX2V2ZW50cyA9IG5vdGlmeV9wb2xsX21hc2soUE9MTElOKTtcXG4rXFxuK1xcdHNxX2FycmF5WzBdID0gMDtcXG4rXFx0X19hdG9taWNfc3RvcmVfbihzcV90YWlsLCAxLCBfX0FUT01JQ19SRUxFQVNFKTtcXG4rXFxuK1xcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0LyogRGVsaWJlcmF0ZWx5IGxlYWtlZCwgd2UgYXJlIGFib3V0IHRvIGNyYXNoLiAqL1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogQWRqYWNlbnQgbWFwcGluZ3Mgd2l0aCBpZGVudGljYWwgZmxhZ3MgYW5kIGNvbnRpZ3VvdXMgZmlsZSBvZmZzZXRzIGFyZVxcbisgKiBtZXJnZWQgaW50byBvbmUgVk1BLCB3aGljaCB3b3VsZCBjb2xsYXBzZSBOVF9GSUxFIGJhY2sgdG8gbm90aGluZywgc29cXG4rICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLlxcbisgKiBOb3QgUFJPVF9FWEVDLCAvdG1wIGlzIG9mdGVuIG1vdW50ZWQgbm9leGVjLiBOb3RoaW5nIGlzIGV2ZXIgd3JpdHRlblxcbisgKiB0aHJvdWdoIHRoZXNlIHNvIHRoZXkgZ2V0IG5vIGFub25fdm1hIGFuZCBzdGF5IG91dCBvZiB0aGUgZHVtcCBpdHNlbGYuXFxuKyAqL1xcbitzdGF0aWMgaW50IG1ha2VfZmlsZV9tYXBwaW5ncyh2b2lkKVxcbit7XFxuK1xcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0aW50IGZkLCBpO1xcbitcXG4rXFx0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSxcXG4rXFx0XFx0ICBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7XFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRpZiAoZnRydW5jYXRlKGZkLCAob2ZmX3QpTk9USUZZX1NJR05BTF9NQVBfQ09VTlQgKiBwZ3N6KSkge1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQ7IGkrKykge1xcbitcXHRcXHRpbnQgcHJvdCA9IChpIFxcdTAwMjYgMSkgPyBQUk9UX1JFQUQgOiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7XFxuK1xcbitcXHRcXHRpZiAobW1hcChOVUxMLCBwZ3N6LCBwcm90LCBNQVBfUFJJVkFURSwgZmQsXFxuK1xcdFxcdFxcdCAob2ZmX3QpaSAqIHBnc3opID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIGk7XFxuK31cXG4rXFxuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKVxcbit7XFxuK1xcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0dW5zaWduZWQgY2hhciAqcDtcXG4rXFx0aW50IHRyaWdnZXJfZmQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb2ZmO1xcbitcXG4rXFx0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXIncyBvcGVuKCkgY2Fubm90IGJsb2NrLiAqL1xcbitcXHR0cmlnZ2VyX2ZkID0gb3BlbihOT1RJRllfU0lHTkFMX1RSSUdHRVIsIE9fUkRPTkxZIHwgT19OT05CTE9DSyB8IE9fQ0xPRVhFQyk7XFxuK1xcbitcXHQvKiBFeGl0IHJhdGhlciB0aGFuIGNyYXNoOiBhIGR1bXAgd2l0aG91dCB0aGUgcG9sbCBhcm1lZCBwcm92ZXMgbm90aGluZy4gKi9cXG4rXFx0aWYgKHRyaWdnZXJfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRfZXhpdChFWElUX0ZBSUxVUkUpO1xcbitcXG4rXFx0aWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpIFxcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpXFxuK1xcdFxcdF9leGl0KEVYSVRfRkFJTFVSRSk7XFxuK1xcbitcXHRwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcXG4rXFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFx0Zm9yIChvZmYgPSAwOyBvZmYgXFx1MDAzYyBOT1RJRllfU0lHTkFMX0FOT05fQllURVM7IG9mZiArPSBwZ3N6KVxcbitcXHRcXHRwW29mZl0gPSAxO1xcbitcXG4rXFx0aWYgKGFybV9wb2xsX25vdGlmeSh0cmlnZ2VyX2ZkKSlcXG4rXFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFxuK1xcdC8qIGNyYXNoIG9uIHB1cnBvc2UgKi9cXG4rXFx0Kih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDtcXG4rXFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcXG4re1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRmZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IG9wZW4gZmFpbGVkOiAlbVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0aWYgKHdyaXRlKGZkLCBcXFwieFxcXCIsIDEpICE9IDEpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogd3JpdGUgZmFpbGVkOiAlbVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBwaGRyWzBdIGlzIHRoZSBQVF9OT1RFIGVudHJ5OiBlbGZfY29yZV9kdW1wKCkgZW1pdHMgaXQgcmlnaHQgYWZ0ZXIgdGhlXFxuKyAqIEVMRiBoZWFkZXIuIEl0cyBwX29mZnNldCBpcyB3aGVyZSB0aGUgbm90ZXMgYmVnaW4uXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBsb25nIG5vdGVfb2Zmc2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkcilcXG4re1xcbitcXHRFbGZXKFBoZHIpIHBoO1xcbitcXHRFbGZXKEVoZHIpIGVoO1xcbitcXG4rXFx0bWVtY3B5KFxcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcXG4rXFx0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdG1lbWNweShcXHUwMDI2cGgsIGhkciArIHNpemVvZihlaCksIHNpemVvZihwaCkpO1xcbitcXHRpZiAocGgucF90eXBlICE9IFBUX05PVEUpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIChsb25nIGxvbmcpcGgucF9vZmZzZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIERyYWluIGEgY29yZWR1bXAgb2ZmIEBmZCwgY291bnRpbmcgd2hhdCBhcnJpdmVzLiBPbmNlIHRoZSBub3RlcyBoYXZlXFxuKyAqIHN0YXJ0ZWQgdGhlIGtlcm5lbCBpcyBpbnNpZGUgdGhlIG9uZSBiaWcgbm90ZSB3cml0ZSwgc28gcG9rZSB0aGUgZmlmb1xcbisgKiB0aGUgY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIGFuZCBzdG9wIHJlYWRpbmcsIHdoaWNoIGtlZXBzIHRoZVxcbisgKiB0cmFuc3BvcnQgZnVsbCBhbmQgdGhlIHdyaXRlIGJsb2NrZWQgd2l0aCBhIHBhcnRpYWwgY291bnQgd2hlbiB0aGVcXG4rICogd2FrZXVwIGxhbmRzLiBUaGVuIGNhcnJ5IG9uIHRvIGVuZCBvZiBmaWxlLlxcbisgKlxcbisgKiBXaGF0IGFycml2ZXMgaXMgd3JpdHRlbiB0byBAZmRfb3V0IHdoZW4gdGhhdCBpcyBub3QgbmVnYXRpdmUuXFxuKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEuIEZhaWxpbmcgdG8gdHJpcCB0aGUgZmlmb1xcbisgKiBpcyBhbiBlcnJvciB0b286IGEgZHVtcCB0aGF0IHdhcyBuZXZlciBpbnRlcnJ1cHRlZCBwcm92ZXMgbm90aGluZy5cXG4rICovXFxuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pXFxuK3tcXG4rXFx0dW5zaWduZWQgY2hhciBoZHJbc2l6ZW9mKEVsZlcoRWhkcikpICsgc2l6ZW9mKEVsZlcoUGhkcikpXTtcXG4rXFx0c3RhdGljIGNoYXIgYnVmWzY0IFxcdTAwM2NcXHUwMDNjIDEwXTtcXG4rXFx0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRsb25nIGxvbmcgbm90ZV9vZmYgPSAwO1xcbitcXHRzaXplX3QgaGRybGVuID0gMDtcXG4rXFx0c3NpemVfdCB0b3RhbCA9IDA7XFxuK1xcdGJvb2wgYXJtZWQgPSBmYWxzZTtcXG4rXFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0c3NpemVfdCBuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7XFxuK1xcbitcXHRcXHRpZiAobiBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0aWYgKGVycm5vID09IEVJTlRSKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0cmV0dXJuIC0xO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChuID09IDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRpZiAoZmRfb3V0IFxcdTAwM2U9IDAgXFx1MDAyNlxcdTAwMjYgd3JpdGUoZmRfb3V0LCBidWYsIG4pICE9IG4pXFxuK1xcdFxcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdFxcdGlmIChoZHJsZW4gXFx1MDAzYyBzaXplb2YoaGRyKSkge1xcbitcXHRcXHRcXHRzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuO1xcbitcXG4rXFx0XFx0XFx0aWYgKHdhbnQgXFx1MDAzZSAoc2l6ZV90KW4pXFxuK1xcdFxcdFxcdFxcdHdhbnQgPSAoc2l6ZV90KW47XFxuK1xcdFxcdFxcdG1lbWNweShoZHIgKyBoZHJsZW4sIGJ1Ziwgd2FudCk7XFxuK1xcdFxcdFxcdGhkcmxlbiArPSB3YW50O1xcbitcXHRcXHRcXHRpZiAoaGRybGVuID09IHNpemVvZihoZHIpKVxcbitcXHRcXHRcXHRcXHRub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHRvdGFsICs9IG47XFxuK1xcbitcXHRcXHRpZiAoYXJtIFxcdTAwMjZcXHUwMDI2ICFhcm1lZCBcXHUwMDI2XFx1MDAyNiBub3RlX29mZiBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIHRvdGFsIFxcdTAwM2Ugbm90ZV9vZmYgKyAobG9uZyBsb25nKXBnc3opIHtcXG4rXFx0XFx0XFx0aWYgKHB1bGxfdHJpZ2dlcigpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdFxcdFxcdGFybWVkID0gdHJ1ZTtcXG4rXFx0XFx0XFx0dXNsZWVwKE5PVElGWV9TSUdOQUxfU1RBTExfVVMpO1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAoYXJtIFxcdTAwMjZcXHUwMDI2ICFhcm1lZClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cmV0dXJuIHRvdGFsO1xcbit9XFxuK1xcbisvKlxcbisgKiBIb3cgbGFyZ2UgdGhlIGR1bXAgd2FzIG1lYW50IHRvIGJlLiBUaGUgRUxGIGhlYWRlciBhbmQgdGhlIHByb2dyYW1cXG4rICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvd1xcbisgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCArIHBfZmlsZXN6KS5cXG4rICpcXG4rICogQSBob2xlIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgb25lIHRoaW5nIHRoYXQgbmV2ZXJcXG4rICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLVxcdTAwM2V0b19za2lwLCBlbGZfY29yZV9kdW1wKClcXG4rICogaGFzIG5vIGZsdXNoIGFmdGVyIHRoZSBsYXN0IGR1bXBfdXNlcl9yYW5nZSgpIGFuZCBhIHBpcGUgY2Fubm90IHNlZWssXFxuKyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcXG4rICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZVxcbisgKiBwYWdlIHNob3J0IG9mIHdoYXQgdGhlIGhlYWRlcnMgcHJvbWlzZS4gQHRhaWwgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGF0XFxuKyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXFxuKyAqL1xcbitsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpXFxuK3tcXG4rXFx0RWxmVyhQaGRyKSAqcGhkciA9IE5VTEw7XFxuK1xcdGxvbmcgbG9uZyBleHBlY3RlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBucGhkciwgaTtcXG4rXFx0RWxmVyhFaGRyKSBlaDtcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0KnRhaWwgPSAwO1xcbitcXG4rXFx0ZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAocmVhZChmZCwgXFx1MDAyNmVoLCBzaXplb2YoZWgpKSAhPSBzaXplb2YoZWgpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKCFlaC5lX3BobnVtIHx8IGVoLmVfcGhlbnRzaXplICE9IHNpemVvZigqcGhkcikpXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0bnBoZHIgPSBlaC5lX3BobnVtO1xcbitcXHRwaGRyID0gY2FsbG9jKG5waGRyLCBzaXplb2YoKnBoZHIpKTtcXG4rXFx0aWYgKCFwaGRyKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKHByZWFkKGZkLCBwaGRyLCAoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSwgKG9mZl90KWVoLmVfcGhvZmYpICE9XFxuK1xcdCAgICAoc3NpemVfdCkoKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkcikpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucGhkcjsgaSsrKSB7XFxuK1xcdFxcdGxvbmcgbG9uZyBlbmQgPSAobG9uZyBsb25nKXBoZHJbaV0ucF9vZmZzZXQgK1xcbitcXHRcXHRcXHRcXHQobG9uZyBsb25nKXBoZHJbaV0ucF9maWxlc3o7XFxuK1xcdFxcdGlmIChlbmQgXFx1MDAzZSBleHBlY3RlZCkge1xcbitcXHRcXHRcXHRleHBlY3RlZCA9IGVuZDtcXG4rXFx0XFx0XFx0KnRhaWwgPSAobG9uZyBsb25nKXBoZHJbaV0ucF9maWxlc3o7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0ZnJlZShwaGRyKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gZXhwZWN0ZWQ7XFxuK2VycjpcXG4rXFx0ZnJlZShwaGRyKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MjIuNTc1MDUzNTg2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6Nzk0MzY4MDQ4NjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIixcbiAgICBcIkNJRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2ZnNfY29yZWR1bXBcIixcbiAgICBcInNtYl9zZW5kX2t2ZWNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjhlNDFhM2M5Y2UyMjBmZTEzNTcyZmQ0OTQ1YjZkYWVlNTViZTBjZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDExOjMxOjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcbmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0XG4tLS0gYS9mcy9jb3JlZHVtcC5jXG4rKysgYi9mcy9jb3JlZHVtcC5jXG5AQCAtMTE2NSw2ICsxMTY1LDcgQEAgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbiBcdHN0cnVjdCBjb3JlX25hbWUgY247XG4gXHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQgPSBtbS1cdTAwM2ViaW5mbXQ7XG4rXHR1bnNpZ25lZCBpbnQgbm90aWZ5X2ZsYWdzO1xuIFx0aW50IGFyZ2MgPSAwO1xuIFx0c3RydWN0IGNvcmVkdW1wX3BhcmFtcyBjcHJtID0ge1xuIFx0XHQuc2lnaW5mbyA9IHNpZ2luZm8sXG5AQCAtMTE5Niw5ICsxMTk3LDEyIEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRpZiAoY29yZWR1bXBfd2FpdChzaWdpbmZvLVx1MDAzZXNpX3NpZ25vLCBcdTAwMjZjb3JlX3N0YXRlKSBcdTAwM2MgMClcbiBcdFx0cmV0dXJuO1xuIFxuK1x0LyogVGFzayB3b3JrIG11c3Qgbm90IGN1dCB0aGUgZHVtcCBzaG9ydCwgc2VlIHNpZ25hbF9wZW5kaW5nKCkuICovXG4rXHRub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTtcbiBcdHNjb3BlZF93aXRoX2NyZWRzKGNyZWQpXG4gXHRcdGRvX2NvcmVkdW1wKFx1MDAyNmNuLCBcdTAwMjZjcHJtLCBcdTAwMjZhcmd2LCBcdTAwMjZhcmdjLCBiaW5mbXQpO1xuIFx0Y29yZWR1bXBfY2xlYW51cChcdTAwMjZjbiwgXHUwMDI2Y3BybSk7XG4rXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbiBcdHJldHVybjtcbiB9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XG4tLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG4rKysgYi9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG5AQCAtMjIsNyArMjIsNiBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbXBvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza193b3JrLmhcdTAwM2VcbiAjaW5jbHVkZSBcImNpZnNnbG9iLmhcIlxuICNpbmNsdWRlIFwiY2lmc3Byb3RvLmhcIlxuICNpbmNsdWRlIFwiY2lmc19kZWJ1Zy5oXCJcbkBAIC0xNDIsNiArMTQxLDcgQEAgaW50XG4gc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHQgICAgICBzaXplX3QgKnNlbnQpXG4ge1xuK1x0dW5zaWduZWQgaW50IG5vdGlmeV9mbGFncztcbiBcdGludCByYyA9IDA7XG4gXHRpbnQgcmV0cmllcyA9IDA7XG4gXHRzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0ID0gc2VydmVyLVx1MDAzZXNzb2NrZXQ7XG5AQCAtMTcyLDE1ICsxNzIsMTIgQEAgc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHRcdCAqIGFmdGVyIHRoZSByZXRyaWVzIHdlIHdpbGwga2lsbCB0aGUgc29ja2V0IGFuZFxuIFx0XHQgKiByZWNvbm5lY3Qgd2hpY2ggbWF5IGNsZWFyIHRoZSBuZXR3b3JrIHByb2JsZW0uXG4gXHRcdCAqXG4tXHRcdCAqIEV2ZW4gaWYgcmVndWxhciBzaWduYWxzIGFyZSBtYXNrZWQsIEVJTlRSIG1pZ2h0IGJlXG4tXHRcdCAqIHByb3BhZ2F0ZWQgZnJvbSBza19zdHJlYW1fd2FpdF9tZW1vcnkoKSB0byBoZXJlIHdoZW5cbi1cdFx0ICogVElGX05PVElGWV9TSUdOQUwgaXMgdXNlZCBmb3IgdGFzayB3b3JrLiBGb3IgZXhhbXBsZSxcbi1cdFx0ICogY2VydGFpbiBpb191cmluZyBjb21wbGV0aW9ucyB3aWxsIHVzZSB0aGF0LiBUcmVhdFxuLVx0XHQgKiBoYXZpbmcgRUlOVFIgd2l0aCBwZW5kaW5nIHRhc2sgd29yayB0aGUgc2FtZSBhcyBFQUdBSU5cbi1cdFx0ICogdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVjb25uZWN0cy5cbitcdFx0ICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS5cbiBcdFx0ICovXG4rXHRcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0XHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcbi1cdFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFx1MDAyNlx1MDAyNiB0YXNrX3dvcmtfcGVuZGluZyhjdXJyZW50KSkpIHtcbitcdFx0bm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7XG4rXHRcdGlmIChyYyA9PSAtRUFHQUlOKSB7XG4gXHRcdFx0cmV0cmllcysrO1xuIFx0XHRcdGlmIChyZXRyaWVzIFx1MDAzZT0gMTQgfHxcbiBcdFx0XHQgICAgKCFzZXJ2ZXItXHUwMDNlbm9ibG9ja3NuZCBcdTAwMjZcdTAwMjYgKHJldHJpZXMgXHUwMDNlIDIpKSkge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuaW5kZXggMzczYmNjMDU5OGQxMC4uZmQ3MmNhNGVlOTJmMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oXG5AQCAtMTc5Niw3ICsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7XG4gXHRcdFx0XHRcdFx0ICogSSBhbSBjbGVhbmluZyBkaXJ0eSBwYWdlcyBmcm9tIHNvbWUgb3RoZXIgYmRpLiAqL1xuICNkZWZpbmUgUEZfS1RIUkVBRFx0XHQweDAwMjAwMDAwXHQvKiBJIGFtIGEga2VybmVsIHRocmVhZCAqL1xuICNkZWZpbmUgUEZfUkFORE9NSVpFXHRcdDB4MDA0MDAwMDBcdC8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi9cbi0jZGVmaW5lIFBGX19IT0xFX18wMDgwMDAwMFx0MHgwMDgwMDAwMFxuKyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFx0MHgwMDgwMDAwMFx0Lyogc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpICovXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcdDB4MDEwMDAwMDBcbiAjZGVmaW5lIFBGX19IT0xFX18wMjAwMDAwMFx0MHgwMjAwMDAwMFxuICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFlcdDB4MDQwMDAwMDBcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li4zMTgyZGU0ZmY5NDgyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTM4NCwxNCArMzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXG4gXHRyZXR1cm4gdW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCxUSUZfU0lHUEVORElORykpO1xuIH1cbiBcbisvKiBQcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHRoaXMgdGFzay4gKi9cbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub19ub3RpZnlfc2lnbmFsX3NhdmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1xuK1x0Y3VycmVudC1cdTAwM2VmbGFncyB8PSBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1x0cmV0dXJuIGZsYWdzO1xuK31cbitcbisvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqL1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKVxuK3tcbitcdGN1cnJlbnRfcmVzdG9yZV9mbGFncyhmbGFncywgUEZfTk9fTk9USUZZX1NJR05BTCk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgaW50IHNpZ25hbF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHQvKlxuIFx0ICogVElGX05PVElGWV9TSUdOQUwgaXNuJ3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWVcbiBcdCAqIGJlaGF2aW9yIGluIHRlcm1zIG9mIGVuc3VyaW5nIHRoYXQgd2UgYnJlYWsgb3V0IG9mIHdhaXQgbG9vcHNcbi1cdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC5cbitcdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC4gTm90IGZvciBhIHRhc2tcbitcdCAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuXG4gXHQgKi9cbi1cdGlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpKVxuK1x0aWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgbGlrZWx5KCEoUkVBRF9PTkNFKHAtXHUwMDNlZmxhZ3MpIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXG4gXHRcdHJldHVybiAxO1xuIFx0cmV0dXJuIHRhc2tfc2lncGVuZGluZyhwKTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uNzI4ZjNjMzQyZWI5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyArMywxMCBAQCBDRkxBR1MgKz0gLVdhbGwgLU8wIC1nICQoS0hEUl9JTkNMVURFUykgJChUT09MU19JTkNMVURFUylcbiBcbiBURVNUX0dFTl9QUk9HUyA6PSBzdGFja2R1bXBfdGVzdCBcXFxuIFx0XHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXG4tXHRcdCAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3RcbitcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuK1x0XHQgIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFxuKyMgU3Bhd25lZCBieSB0aGUga2VybmVsIGFzIHRoZSB8aGVscGVyLCBub3QgYSB0ZXN0IG9mIGl0cyBvd24uXG4rVEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcbiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcFxuIFxuIGluY2x1ZGUgLi4vbGliLm1rXG5AQCAtMTEsMyArMTQsNSBAQCBpbmNsdWRlIC4uL2xpYi5ta1xuICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuKyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxuQEAgLTAsMCArMSwyOSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rXG4rI2lmbmRlZiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxuKyNkZWZpbmUgX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0hcbitcbisjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuK1xuKy8qXG4rICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGVcbisgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0J3Mgd2F5IGJleW9uZCB0aGUgZGVmYXVsdCA2NEtcbisgKiBwaXBlIHJpbmcgYW5kIHBhc3QgdGhlIH4zNksgYW4gYWZfdW5peCBza2IgaG9sZHMuIFNvIHdlIGZvcmNlIGEgd3JpdGVcbisgKiB0byBjb21lIGJhY2sgc2hvcnQuXG4rICovXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX01BUF9DT1VOVFx0XHQ0MDAwXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0FOT05fQllURVNcdCg0VUwgXHUwMDNjXHUwMDNjIDIwKVxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VU1x0XHQyMDAwMDBcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfTUFQRklMRVx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfVFJJR0dFUlx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmVcIlxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEVcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFwiXG4rXG4rdm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpO1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpO1xuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pO1xuK2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCk7XG4rXG4rI2VuZGlmIC8qIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi44NDlmNWMxZWE3MzY1XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jXG5AQCAtMCwwICsxLDQ2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIFRoZSB8aGVscGVyIGhhbGYgb2YgY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LiBUaGUga2VybmVsIHNwYXducyB0aGlzXG4rICogd2l0aCB0aGUgY29yZWR1bXAgb24gc3RkaW4sIHNvIGl0IGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSB0ZXN0IGJpbmFyeS5cbisgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXG4rICogY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIHNvIFRJRl9OT1RJRllfU0lHTkFMIGlzIHJhaXNlZCB3aGlsZSB0aGUgbm90ZVxuKyAqIHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcbit7XG4rXHRpbnQgZmRfY29yZV9maWxlO1xuK1x0c3NpemVfdCByZXQ7XG4rXG4rXHRmZF9jb3JlX2ZpbGUgPSBvcGVuKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFLFxuK1x0XHRcdCAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcbitcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG9wZW4gZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0cmV0dXJuIEVYSVRfRkFJTFVSRTtcbitcdH1cbitcbitcdHJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7XG4rXHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byBlcnI7XG4rXG4rXHQvKiBUaGUgdGVzdCBwb2xscyBmb3IgdGhpcyBuYW1lLCBzbyBvbmx5IGNyZWF0ZSBpdCBvbmNlIGl0IGlzIHdob2xlLiAqL1xuK1x0aWYgKHJlbmFtZShOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZW5hbWUgZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0Z290byBlcnI7XG4rXHR9XG4rXG4rXHRyZXR1cm4gRVhJVF9TVUNDRVNTO1xuK1xuK2VycjpcbitcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSk7XG4rXHRyZXR1cm4gRVhJVF9GQUlMVVJFO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTYzYzA2YTgxNTYyZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmNcbkBAIC0wLDAgKzEsMjQ1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIEEgY29yZWR1bXAgaXMgbWVhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgU0lHS0lMTCBhbmQgYnkgdGhlIGZyZWV6ZXIgYW5kXG4rICogYnkgbm90aGluZyBlbHNlLiBkdW1wX2ludGVycnVwdGVkKCkgc2F5cyBzbywgYnV0IHRoZSBibG9ja2luZyB3YWl0c1xuKyAqIHVuZGVybmVhdGggaXQgdGVzdCBzaWduYWxfcGVuZGluZygpLCB3aGljaCBpcyBhbHNvIHRydWUgZm9yXG4rICogVElGX05PVElGWV9TSUdOQUwuIEEgY3Jhc2hpbmcgdGFzayB0aGF0IGhhcyBhbiBpb191cmluZyBjb21wbGV0aW9uIGxhbmRcbisgKiBvbiBpdCBtaWQtZHVtcCB0aGVyZWZvcmUga2VlcHMgZHVtcGluZyB3aGlsZSBldmVyeSB3YWl0IGl0IGVudGVycyBiYWlsc1xuKyAqIG91dCBhdCBvbmNlLCBhbmQgdGhlIGR1bXAgaXMgc2lsZW50bHkgY3V0IHNob3J0LiBOb3RoaW5nIHJlcG9ydHMgaXQ6XG4rICogYmluZm10X2VsZiBzZXRzIGhhc19kdW1wZWQgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gV0NPUkVEVU1QKClcbisgKiBzYXlzIHRoZSBkdW1wIHdvcmtlZC5cbisgKlxuKyAqIEEgY29yZWR1bXAgbm90ZSBpcyB0aGUgb25seSBkdW1wX2VtaXQoKSB0aGF0IGV4Y2VlZHMgd2hhdCB0aGUgdHJhbnNwb3J0XG4rICogdGFrZXMgaW4gb25lIGdvLCBzbyBpdCBpcyB0aGUgb25lIHdyaXRlIHRoYXQgaXMgY2VydGFpbiB0byBibG9jay4gQm90aFxuKyAqIHRlc3RzIGNyYXNoIGEgY2hpbGQgaG9sZGluZyBlbm91Z2ggZmlsZSBiYWNrZWQgbWFwcGluZ3MgZm9yIGl0cyBOVF9GSUxFXG4rICogbm90ZSB0byBydW4gcGFzdCB0aGF0LCBhcm0gYW4gaW9fdXJpbmcgcG9sbCBvbiBpdCwgYW5kIHRyaXAgdGhlIHBvbGxcbisgKiB3aGlsZSB0aGUgbm90ZSBpcyBiZWluZyB3cml0dGVuLiBXaGF0IGNvbWVzIG91dCBoYXMgdG8gYmUgdGhlIHdob2xlXG4rICogZHVtcC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX3Rlc3QuaFwiXG4rXG4rRklYVFVSRV9TRVRVUChjb3JlZHVtcClcbit7XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldDtcbitcbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwiclwiKTtcbitcdEFTU0VSVF9ORShOVUxMLCBmaWxlKTtcbitcbitcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLFxuK1x0XHQgICAgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7XG4rXHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4rXHRBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pKTtcbitcbitcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAnXFwwJztcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbitcdEFTU0VSVF9HRShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkLCAwKTtcbitcbitcdHJldCA9IGZjbG9zZShmaWxlKTtcbitcdEFTU0VSVF9FUSgwLCByZXQpO1xuK1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XG4rXHRBU1NFUlRfRVEobWtmaWZvKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgMDYwMCksIDApO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxuK3tcbitcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbitcdEZJTEUgKmZpbGU7XG4rXHRpbnQgcmV0LCBzdGF0dXM7XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyLCBTSUdURVJNKTtcbitcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHR9XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpO1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xuK1xuK1x0ZmlsZSA9IGZvcGVuKFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cIiwgXCJ3XCIpO1xuK1x0aWYgKCFmaWxlKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdHJldCA9IGZwcmludGYoZmlsZSwgXCIlc1wiLCBzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIGNsb3NlIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCBcdTAwM2U9IDApIHtcbitcdFx0cmV0ID0gY2xvc2Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1wiO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm47XG4rZmFpbDpcbitcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xuK1x0ZnByaW50ZihzdGRlcnIsIFwiRmFpbGVkIHRvIGNsZWFudXAgY29yZWR1bXAgdGVzdDogJXNcXG5cIiwgcmVhc29uKTtcbit9XG4rXG4rLypcbisgKiBDaGVjayB0aGF0IHdoYXQgdGhlIGhlbHBlciBvciB0aGUgc2VydmVyIHNhdmVkIGlzIHRoZSB3aG9sZSBkdW1wLiBPbmx5XG4rICogYSBob2xlIGF0IHRoZSB2ZXJ5IGVuZCBjYW4gYmUgbWlzc2luZywgc2VlIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoKS5cbisgKi9cbitzdGF0aWMgdm9pZCBjaGVja193aG9sZV9jb3JlZHVtcChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEpXG4re1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXG4rXHRleHBlY3RlZCA9IGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnRhaWwpO1xuK1x0QVNTRVJUX0dUKGV4cGVjdGVkLCAwKTtcbitcdEFTU0VSVF9FUShzdGF0KE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCBcdTAwMjZzdCksIDApO1xuK1x0QVNTRVJUX0xFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQpO1xuK1x0QVNTRVJUX0dFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQgLSB0YWlsKTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHVtcCBnb2VzIHRvIGEgfGhlbHBlciwgc28gdGhlIHJlYWRlciBpcyBhIHNlcGFyYXRlIHByb2dyYW0gdGhlXG4rICoga2VybmVsIHNwYXducy4gSXQgc2F2ZXMgd2hhdCBpdCByZWNlaXZlZCB0byBOT1RJRllfU0lHTkFMX0NPUkVfRklMRS5cbisgKi9cbitURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfcGlwZSlcbit7XG4rXHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDtcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1x0aW50IHN0YXR1cywgaTtcbitcdHBpZF90IHBpZDtcbitcdHNzaXplX3QgbjtcbitcbitcdGlmICghY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKCkpXG4rXHRcdFNLSVAocmV0dXJuLCBcImlvX3VyaW5nIG5vdCBhdmFpbGFibGVcIik7XG4rXG4rXHRuID0gcmVhZGxpbmsoXCIvcHJvYy9zZWxmL2V4ZVwiLCBoZWxwZXIsIHNpemVvZihoZWxwZXIpIC0gMSk7XG4rXHRBU1NFUlRfR1QobiwgMCk7XG4rXHRoZWxwZXJbbl0gPSAnXFwwJztcbitcdHAgPSBzdHJzdHIoaGVscGVyLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFwiKTtcbitcdEFTU0VSVF9ORShwLCBOVUxMKTtcbitcdEFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSArIHNpemVvZihcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpLFxuK1x0XHQgIHNpemVvZihoZWxwZXIpKTtcbitcdHN0cmNweShwLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpO1xuK1x0aWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKVxuK1x0XHRTS0lQKHJldHVybiwgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciBub3QgYnVpbHRcIik7XG4rXG4rXHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcInwlc1wiLCBoZWxwZXIpLFxuK1x0XHQgIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkID0gZm9yaygpO1xuK1x0QVNTRVJUX0dFKHBpZCwgMCk7XG4rXHRpZiAocGlkID09IDApXG4rXHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbitcbitcdEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKSwgcGlkKTtcbitcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuK1xuK1x0LyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMDsgaSsrKSB7XG4rXHRcdGlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNiBzdC5zdF9zaXplKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoMTAwMDAwKTtcbitcdH1cbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuKy8qIFRoZSBzYW1lIHRoaW5nIHdpdGggdGhlIGR1bXAgZ29pbmcgdG8gYSBjb3JlZHVtcCBzb2NrZXQuICovXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcbit7XG4rXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXHRpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1cztcbitcdGNoYXIgcGF0dGVybltQQVRIX01BWF07XG4rXHRjaGFyIGM7XG4rXG4rXHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJpb191cmluZyBub3QgYXZhaWxhYmxlXCIpO1xuK1xuK1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsXG4rXHRcdFx0ICAgICBpcGNfc29ja2V0cyksIDApO1xuK1x0QVNTRVJUX0xUKHNucHJpbnRmKHBhdHRlcm4sIHNpemVvZihwYXR0ZXJuKSwgXCJAJXNcIixcbitcdFx0XHQgICBOT1RJRllfU0lHTkFMX1NPQ0tFVCksIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTtcbitcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcbitcdFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9jb3JlX2ZpbGUgPSAtMTtcbitcdFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbitcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMF0pO1xuK1xuK1x0XHRmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHRcdGlmIChmZF9zZXJ2ZXIgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlmICh3cml0ZV9ub2ludHIoaXBjX3NvY2tldHNbMV0sIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMV0pO1xuK1xuK1x0XHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXG4rXHRcdGZkX2NvcmVfZmlsZSA9IG9wZW4oTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsXG4rXHRcdFx0XHQgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyxcbitcdFx0XHRcdCAgICAwNjAwKTtcbitcdFx0aWYgKGZkX2NvcmVfZmlsZSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0aWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLFxuK1x0XHRcdFx0XHRcdHRydWUpIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1xuK1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4rb3V0OlxuK1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkX2NvcmVkdW1wKTtcbitcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRfc2VydmVyKTtcbitcdFx0X2V4aXQoZXhpdF9jb2RlKTtcbitcdH1cbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXG4rXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcbitcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXHUwMDI2YywgMSksIDEpO1xuK1x0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7XG4rXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkLCAwKTtcbitcdGlmIChwaWQgPT0gMClcbitcdFx0Y3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCgpO1xuK1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuK1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4rXG4rXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG5pbmRleCBlZDQ3ZjAxZmE1M2M1Li4wNmY5OTdiYTQ3ZmQ5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbkBAIC05LDYgKzksNyBAQFxuIFxuICNpbmNsdWRlIFwiLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4gI2luY2x1ZGUgXCIuLi9waWRmZC9waWRmZC5oXCJcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4gXG4gI2lmbmRlZiBQQUdFX1NJWkVcbiAjZGVmaW5lIFBBR0VfU0laRSA0MDk2XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTEsMTEgKzEsMTggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIFxuICNpbmNsdWRlIFx1MDAzY2Fzc2VydC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZWxmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NlbmRpYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW5rLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lvX3VyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb3JlZHVtcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0xMyw3ICsyMCw5IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvZXBvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuQEAgLTIxLDYgKzMwLDcgQEBcbiBcbiAjaW5jbHVkZSBcIi4uL2ZpbGVzeXN0ZW1zL3dyYXBwZXJzLmhcIlxuICNpbmNsdWRlIFwiLi4vcGlkZmQvcGlkZmQuaFwiXG4rI2luY2x1ZGUgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcIlxuIFxuIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIHRvIGF2b2lkIGluY2x1ZGluZyBoYXJuZXNzIGhlYWRlciAqL1xuIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7XG5AQCAtMzgxLDMgKzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcbiBcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuIFx0X2V4aXQoZXhpdF9jb2RlKTtcbiB9XG4rXG4rLypcbisgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxuKyAqXG4rICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGVcbisgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcbisgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLFxuKyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnNcbisgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXG4rICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbitzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcClcbit7XG4rXHRyZXR1cm4gc3lzY2FsbChfX05SX2lvX3VyaW5nX3NldHVwLCBlbnRyaWVzLCBwKTtcbit9XG4rXG4rLyogaW9fdXJpbmcgcmVhZHMgcG9sbDMyX2V2ZW50cyBiYWNrIHRocm91Z2ggc3dhaHczMigpIG9uIGJpZyBlbmRpYW4uICovXG4rc3RhdGljIF9fdTMyIG5vdGlmeV9wb2xsX21hc2soX191MzIgZXZlbnRzKVxuK3tcbisjaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpIFx1MDAyNlx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXG4rXHRyZXR1cm4gX19zd2FodzMyKGV2ZW50cyk7XG4rI2Vsc2VcbitcdHJldHVybiBldmVudHM7XG4rI2VuZGlmXG4rfVxuK1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGlvX3VyaW5nX3NldHVwX3JhdygxLCBcdTAwMjZwKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qXG4rICogQXJtIGEgcG9sbCBvbiBAZmQuIGlvX3VyaW5nIGxlYXZlcyBjdHgtXHUwMDNlbm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMXG4rICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnNcbisgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZFxuKyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suXG4rICovXG4rc3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHR1bnNpZ25lZCBpbnQgKnNxX3RhaWwsICpzcV9hcnJheTtcbitcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7XG4rXHRzaXplX3Qgc3FyaW5nX3N6O1xuK1x0dm9pZCAqc3E7XG4rXHRpbnQgcmluZztcbitcbitcdHJpbmcgPSBpb191cmluZ19zZXR1cF9yYXcoOCwgXHUwMDI2cCk7XG4rXHRpZiAocmluZyBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0c3FyaW5nX3N6ID0gcC5zcV9vZmYuYXJyYXkgKyBwLnNxX2VudHJpZXMgKiBzaXplb2YodW5zaWduZWQgaW50KTtcbitcdHNxID0gbW1hcChOVUxMLCBzcXJpbmdfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUV9SSU5HKTtcbitcdGlmIChzcSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRzcWVzID0gbW1hcChOVUxMLCBwLnNxX2VudHJpZXMgKiBzaXplb2YoKnNxZXMpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgICAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUUVTKTtcbitcdGlmIChzcWVzID09IE1BUF9GQUlMRUQpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHNxX3RhaWwgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopc3EgKyBwLnNxX29mZi50YWlsKTtcbitcdHNxX2FycmF5ID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYuYXJyYXkpO1xuK1xuK1x0bWVtc2V0KFx1MDAyNnNxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7XG4rXHRzcWVzWzBdLm9wY29kZSA9IElPUklOR19PUF9QT0xMX0FERDtcbitcdHNxZXNbMF0uZmQgPSB0cmlnZ2VyX2ZkO1xuK1x0c3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pO1xuK1xuK1x0c3FfYXJyYXlbMF0gPSAwO1xuK1x0X19hdG9taWNfc3RvcmVfbihzcV90YWlsLCAxLCBfX0FUT01JQ19SRUxFQVNFKTtcbitcbitcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHQvKiBEZWxpYmVyYXRlbHkgbGVha2VkLCB3ZSBhcmUgYWJvdXQgdG8gY3Jhc2guICovXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlXG4rICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvXG4rICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLlxuKyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuXG4rICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLlxuKyAqL1xuK3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpXG4re1xuK1x0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0aW50IGZkLCBpO1xuK1xuK1x0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSxcbitcdFx0ICBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKGZ0cnVuY2F0ZShmZCwgKG9mZl90KU5PVElGWV9TSUdOQUxfTUFQX0NPVU5UICogcGdzeikpIHtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5PVElGWV9TSUdOQUxfTUFQX0NPVU5UOyBpKyspIHtcbitcdFx0aW50IHByb3QgPSAoaSBcdTAwMjYgMSkgPyBQUk9UX1JFQUQgOiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7XG4rXG4rXHRcdGlmIChtbWFwKE5VTEwsIHBnc3osIHByb3QsIE1BUF9QUklWQVRFLCBmZCxcbitcdFx0XHQgKG9mZl90KWkgKiBwZ3N6KSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGJyZWFrO1xuK1x0fVxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIGk7XG4rfVxuK1xuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKVxuK3tcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdHVuc2lnbmVkIGNoYXIgKnA7XG4rXHRpbnQgdHJpZ2dlcl9mZDtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmO1xuK1xuK1x0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXIncyBvcGVuKCkgY2Fubm90IGJsb2NrLiAqL1xuK1x0dHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1xuK1x0LyogRXhpdCByYXRoZXIgdGhhbiBjcmFzaDogYSBkdW1wIHdpdGhvdXQgdGhlIHBvbGwgYXJtZWQgcHJvdmVzIG5vdGhpbmcuICovXG4rXHRpZiAodHJpZ2dlcl9mZCBcdTAwM2MgMClcbitcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcbitcdGlmIChtYWtlX2ZpbGVfbWFwcGluZ3MoKSBcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbitcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRmb3IgKG9mZiA9IDA7IG9mZiBcdTAwM2MgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTOyBvZmYgKz0gcGdzeilcbitcdFx0cFtvZmZdID0gMTtcbitcbitcdGlmIChhcm1fcG9sbF9ub3RpZnkodHJpZ2dlcl9mZCkpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4rXHQqKHZvbGF0aWxlIGludCAqKU5VTEwgPSAwO1xuK1x0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbit9XG4rXG4rc3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBvcGVuIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRpZiAod3JpdGUoZmQsIFwieFwiLCAxKSAhPSAxKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiB3cml0ZSBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBwaGRyWzBdIGlzIHRoZSBQVF9OT1RFIGVudHJ5OiBlbGZfY29yZV9kdW1wKCkgZW1pdHMgaXQgcmlnaHQgYWZ0ZXIgdGhlXG4rICogRUxGIGhlYWRlci4gSXRzIHBfb2Zmc2V0IGlzIHdoZXJlIHRoZSBub3RlcyBiZWdpbi5cbisgKi9cbitzdGF0aWMgbG9uZyBsb25nIG5vdGVfb2Zmc2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkcilcbit7XG4rXHRFbGZXKFBoZHIpIHBoO1xuK1x0RWxmVyhFaGRyKSBlaDtcbitcbitcdG1lbWNweShcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcbitcdGlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0bWVtY3B5KFx1MDAyNnBoLCBoZHIgKyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTtcbitcdGlmIChwaC5wX3R5cGUgIT0gUFRfTk9URSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIChsb25nIGxvbmcpcGgucF9vZmZzZXQ7XG4rfVxuK1xuKy8qXG4rICogRHJhaW4gYSBjb3JlZHVtcCBvZmYgQGZkLCBjb3VudGluZyB3aGF0IGFycml2ZXMuIE9uY2UgdGhlIG5vdGVzIGhhdmVcbisgKiBzdGFydGVkIHRoZSBrZXJuZWwgaXMgaW5zaWRlIHRoZSBvbmUgYmlnIG5vdGUgd3JpdGUsIHNvIHBva2UgdGhlIGZpZm9cbisgKiB0aGUgY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIGFuZCBzdG9wIHJlYWRpbmcsIHdoaWNoIGtlZXBzIHRoZVxuKyAqIHRyYW5zcG9ydCBmdWxsIGFuZCB0aGUgd3JpdGUgYmxvY2tlZCB3aXRoIGEgcGFydGlhbCBjb3VudCB3aGVuIHRoZVxuKyAqIHdha2V1cCBsYW5kcy4gVGhlbiBjYXJyeSBvbiB0byBlbmQgb2YgZmlsZS5cbisgKlxuKyAqIFdoYXQgYXJyaXZlcyBpcyB3cml0dGVuIHRvIEBmZF9vdXQgd2hlbiB0aGF0IGlzIG5vdCBuZWdhdGl2ZS5cbisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xLiBGYWlsaW5nIHRvIHRyaXAgdGhlIGZpZm9cbisgKiBpcyBhbiBlcnJvciB0b286IGEgZHVtcCB0aGF0IHdhcyBuZXZlciBpbnRlcnJ1cHRlZCBwcm92ZXMgbm90aGluZy5cbisgKi9cbitzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgaGRyW3NpemVvZihFbGZXKEVoZHIpKSArIHNpemVvZihFbGZXKFBoZHIpKV07XG4rXHRzdGF0aWMgY2hhciBidWZbNjQgXHUwMDNjXHUwMDNjIDEwXTtcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGxvbmcgbG9uZyBub3RlX29mZiA9IDA7XG4rXHRzaXplX3QgaGRybGVuID0gMDtcbitcdHNzaXplX3QgdG90YWwgPSAwO1xuK1x0Ym9vbCBhcm1lZCA9IGZhbHNlO1xuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTtcbitcbitcdFx0aWYgKG4gXHUwMDNjIDApIHtcbitcdFx0XHRpZiAoZXJybm8gPT0gRUlOVFIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRyZXR1cm4gLTE7XG4rXHRcdH1cbitcdFx0aWYgKG4gPT0gMClcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKGZkX291dCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2IHdyaXRlKGZkX291dCwgYnVmLCBuKSAhPSBuKVxuK1x0XHRcdHJldHVybiAtMTtcbitcbitcdFx0aWYgKGhkcmxlbiBcdTAwM2Mgc2l6ZW9mKGhkcikpIHtcbitcdFx0XHRzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuO1xuK1xuK1x0XHRcdGlmICh3YW50IFx1MDAzZSAoc2l6ZV90KW4pXG4rXHRcdFx0XHR3YW50ID0gKHNpemVfdCluO1xuK1x0XHRcdG1lbWNweShoZHIgKyBoZHJsZW4sIGJ1Ziwgd2FudCk7XG4rXHRcdFx0aGRybGVuICs9IHdhbnQ7XG4rXHRcdFx0aWYgKGhkcmxlbiA9PSBzaXplb2YoaGRyKSlcbitcdFx0XHRcdG5vdGVfb2ZmID0gbm90ZV9vZmZzZXQoaGRyKTtcbitcdFx0fVxuK1xuK1x0XHR0b3RhbCArPSBuO1xuK1xuK1x0XHRpZiAoYXJtIFx1MDAyNlx1MDAyNiAhYXJtZWQgXHUwMDI2XHUwMDI2IG5vdGVfb2ZmIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgdG90YWwgXHUwMDNlIG5vdGVfb2ZmICsgKGxvbmcgbG9uZylwZ3N6KSB7XG4rXHRcdFx0aWYgKHB1bGxfdHJpZ2dlcigpKVxuK1x0XHRcdFx0cmV0dXJuIC0xO1xuK1x0XHRcdGFybWVkID0gdHJ1ZTtcbitcdFx0XHR1c2xlZXAoTk9USUZZX1NJR05BTF9TVEFMTF9VUyk7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChhcm0gXHUwMDI2XHUwMDI2ICFhcm1lZClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0dXJuIHRvdGFsO1xuK31cbitcbisvKlxuKyAqIEhvdyBsYXJnZSB0aGUgZHVtcCB3YXMgbWVhbnQgdG8gYmUuIFRoZSBFTEYgaGVhZGVyIGFuZCB0aGUgcHJvZ3JhbVxuKyAqIGhlYWRlcnMgYXJlIHRoZSBmaXJzdCB0aGluZyBlbWl0dGVkLCBzbyBldmVuIGEgdHJ1bmNhdGVkIGR1bXAgc2F5cyBob3dcbisgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCArIHBfZmlsZXN6KS5cbisgKlxuKyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyXG4rICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLVx1MDAzZXRvX3NraXAsIGVsZl9jb3JlX2R1bXAoKVxuKyAqIGhhcyBubyBmbHVzaCBhZnRlciB0aGUgbGFzdCBkdW1wX3VzZXJfcmFuZ2UoKSBhbmQgYSBwaXBlIGNhbm5vdCBzZWVrLFxuKyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcbisgKiBhbmQgdnN5c2NhbGw9eG9ubHkgbGVhdmVzIG5vIHBhZ2UgYmVoaW5kIGl0LCBzbyBhIHdob2xlIGR1bXAgaXMgb25lXG4rICogcGFnZSBzaG9ydCBvZiB3aGF0IHRoZSBoZWFkZXJzIHByb21pc2UuIEB0YWlsIHJldHVybnMgdGhlIHNpemUgb2YgdGhhdFxuKyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXG4rICovXG4rbG9uZyBsb25nIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoY29uc3QgY2hhciAqcGF0aCwgbG9uZyBsb25nICp0YWlsKVxuK3tcbitcdEVsZlcoUGhkcikgKnBoZHIgPSBOVUxMO1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkID0gMDtcbitcdHVuc2lnbmVkIGludCBucGhkciwgaTtcbitcdEVsZlcoRWhkcikgZWg7XG4rXHRpbnQgZmQ7XG4rXG4rXHQqdGFpbCA9IDA7XG4rXG4rXHRmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocmVhZChmZCwgXHUwMDI2ZWgsIHNpemVvZihlaCkpICE9IHNpemVvZihlaCkpXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmICghZWguZV9waG51bSB8fCBlaC5lX3BoZW50c2l6ZSAhPSBzaXplb2YoKnBoZHIpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdG5waGRyID0gZWguZV9waG51bTtcbitcdHBoZHIgPSBjYWxsb2MobnBoZHIsIHNpemVvZigqcGhkcikpO1xuK1x0aWYgKCFwaGRyKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPVxuK1x0ICAgIChzc2l6ZV90KSgoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSkpXG4rXHRcdGdvdG8gZXJyO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnBoZHI7IGkrKykge1xuK1x0XHRsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICtcbitcdFx0XHRcdChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0aWYgKGVuZCBcdTAwM2UgZXhwZWN0ZWQpIHtcbitcdFx0XHRleHBlY3RlZCA9IGVuZDtcbitcdFx0XHQqdGFpbCA9IChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0fVxuK1x0fVxuK1xuK1x0ZnJlZShwaGRyKTtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBleHBlY3RlZDtcbitlcnI6XG4rXHRmcmVlKHBoZHIpO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIC0xO1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjIyLjU3NTA1NTE0NloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgyNTYzMDAxMTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUHJvcG9zZWQgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoLiBJdCdzIHRvdWNoaW5nIGBmcy9jb3JlZHVtcC5jYCBhbmQgYGZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNgLCB3aGljaCBpcyBpbW1lZGlhdGVseSBpbnRlcmVzdGluZy4gVGhleSdyZSBpbnRyb2R1Y2luZyB0aGVzZSBgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKClgIGFuZCBgbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKClgIGZ1bmN0aW9ucywgYW5kIHRoYXQncyB1c3VhbGx5IHRvIHByZXZlbnQgc29tZSBzaWduYWwgZnJvbSBpbnRlcnJ1cHRpbmcgY3JpdGljYWwgc2VjdGlvbnMuIEFuZCwganVkZ2luZyBieSB0aGUgbmFtZSBhbmQgbG9jYXRpb24sIGl0J3MgYFRJRl9OT1RJRllfU0lHTkFMYCB0aGF0IHRoZXkgYXJlIHRyeWluZyB0byBwcm90ZWN0IGFnYWluc3QuIEkgc2VlIGEgbmV3IGBQRl9OT19OT1RJRllfU0lHTkFMYCBmbGFnIGJlaW5nIGFkZGVkIHRvIGBzY2hlZC5oYCBhbmQgYSBtb2RpZmljYXRpb24gdG8gYHNpZ25hbF9wZW5kaW5nKClgLCBzbyB3ZSdyZSBkZWZpbml0ZWx5IHRhbGtpbmcgYWJvdXQgYSBjaGFuZ2UgdG8gaG93IHNpZ25hbHMgYXJlIGhhbmRsZWQuIEEgc2VsZnRlc3QsIGBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RgLCBpcyBhbHNvIGluY2x1ZGVkLlxuXG5UaGUgcXVlc3Rpb24gaXMsIGlzIHRoaXMgYSBzaWduaWZpY2FudCBjaGFuZ2UgYW5kIGlzIGl0IHJlYWNoYWJsZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGFjdC4gSSBzZWUgdGhhdCB0aGUgY2hhbmdlcyBhcmUgd2l0aGluIGB2ZnNfY29yZWR1bXAoKWAgYW5kIGBzbWJfc2VuZF9rdmVjKClgLCBzbyB0aG9zZSBhcmUgdGhlIGZ1bmN0aW9ucyB0byBleGFtaW5lIGNsb3NlbHkuXG5cbmB2ZnNfY29yZWR1bXAoKWAgaXMgZGVmaW5pdGVseSBjb3JlIGtlcm5lbCBhbmQgaGlnaGx5IHJlYWNoYWJsZS4gTm8gaXNzdWUgdGhlcmUuIEFuZCBgc21iX3NlbmRfa3ZlYygpYCBpcyBpbiB0aGUgU01CIGNsaWVudCBkcml2ZXIuIFRoYXQncyB1c2VkIHF1aXRlIGEgYml0LCBzbyB0aGF0J3MgYWxzbyByZWFjaGFibGUuIFNvLCBmdW5jdGlvbmFsbHksIHdlJ3JlIG1vZGlmeWluZyBzaWduYWwgaGFuZGxpbmcgYWxvbmcgdGhlc2UgY3J1Y2lhbCBwYXRocy4gWWVzLCB0aGF0J3MgYSBmdW5jdGlvbmFsIGNoYW5nZSwgYW5kIHdlIG5lZWQgdG8gaW52ZXN0aWdhdGUuXG5cbkZvY3VzaW5nIG91ciBmdXp6aW5nIGVmZm9ydHMsIGl0IGxvb2tzIGxpa2UgYHZmc19jb3JlZHVtcCgpYCBhbmQgYHNtYl9zZW5kX2t2ZWMoKWAgYXJlIHRoZSBwcmltYXJ5IHRhcmdldHMgZm9yIG5vdy4gSSBzaG91bGQgY2hlY2sgdGhlIHJlbGV2YW50IGNvbmZpZ3MgYW5kIHRlc3QgY2FzZXMuXG5cbkZvciBgdmZzX2NvcmVkdW1wKClgLCBJIGFzc3VtZSB0aGUgc3lzdGVtIG5lZWRzIHRvIGhhdmUgYENPUkVEVU1QYCBlbmFibGVkIHRvIHRyaWdnZXIgaXQuXG5cbkZvciBgc21iX3NlbmRfa3ZlYygpYCwgaXQncyBnb2luZyB0byBiZSBgQ0lGU2Agb3IgYFNNQl9GU2AsIGFuZCBJIHNob3VsZCBjaGVjayBgZnMvc21iL2NsaWVudC9LY29uZmlnYCBvciBgZnMvY2lmcy9LY29uZmlnYCB0byBjb25maXJtIHRoZSBleGFjdCBjb25maWcgZmxhZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDYxLCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAzLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MzAuODMxMzU5NTQ4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxODA4MTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDSUZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9zbWIvY2xpZW50L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9zbWIvY2xpZW50L0tjb25maWc6Mjpjb25maWcgQ0lGU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJTTUIzIGFuZCBDSUZTIHN1cHBvcnQgKGFkdmFuY2VkIG5ldHdvcmsgZmlsZXN5c3RlbSlcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctNTMtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy01NS1cXHRib29sIFxcXCJFeHRlbmRlZCBzdGF0aXN0aWNzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo2ODpjb25maWcgQ0lGU19BTExPV19JTlNFQ1VSRV9MRUdBQ1lcXG5mcy9zbWIvY2xpZW50L0tjb25maWctNjktXFx0Ym9vbCBcXFwiU3VwcG9ydCBsZWdhY3kgc2VydmVycyB3aGljaCB1c2UgbGVzcyBzZWN1cmUgZGlhbGVjdHNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctODItXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjgzOmNvbmZpZyBDSUZTX1VQQ0FMTFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cXHRib29sIFxcXCJLZXJiZXJvcy9TUE5FR08gYWR2YW5jZWQgc2Vzc2lvbiBzZXR1cFxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTMtXFx0Ym9vbCBcXFwiQ0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTA3OmNvbmZpZyBDSUZTX1BPU0lYXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwOC1cXHRib29sIFxcXCJDSUZTIFBPU0lYIEV4dGVuc2lvbnNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTE4LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMTk6Y29uZmlnIENJRlNfREVCVUdcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVxcdGJvb2wgXFxcIkVuYWJsZSBDSUZTIGRlYnVnZ2luZyByb3V0aW5lc1xcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjctXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI5LVxcdGJvb2wgXFxcIkVuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTM5OmNvbmZpZyBDSUZTX0RFQlVHX0RVTVBfS0VZU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDAtXFx0Ym9vbCBcXFwiRHVtcCBlbmNyeXB0aW9uIGtleXMgZm9yIG9mZmxpbmUgZGVjcnlwdGlvbiAoVW5zYWZlKVxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDgtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE0OTpjb25maWcgQ0lGU19ERlNfVVBDQUxMXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cXHRib29sIFxcXCJERlMgZmVhdHVyZSBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE2MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTYzLVxcdGJvb2wgXFxcIlNXTiBmZWF0dXJlIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNzM6Y29uZmlnIENJRlNfTkZTRF9FWFBPUlRcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTc0LVxcdGJvb2wgXFxcIkFsbG93IG5mc2QgdG8gZXhwb3J0IENJRlMgZmlsZSBzeXN0ZW1cXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc9MTc5PWlmIENJRlNcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTgwLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xODItXFx0Ym9vbCBcXFwiU01CIERpcmVjdCBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTkxOmNvbmZpZyBDSUZTX0ZTQ0FDSEVcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTkyLVxcdGJvb2wgXFxcIlByb3ZpZGUgQ0lGUyBjbGllbnQgY2FjaGluZyBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5OC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTk5OmNvbmZpZyBDSUZTX1JPT1RcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVxcdGJvb2wgXFxcIlNNQiByb290IGZpbGUgc3lzdGVtIChFeHBlcmltZW50YWwpXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwOC1cXHRib29sIFxcXCJTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MzAuOTIzMTczOTc2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDM1NzIzMjEyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEZWNvZGluZyBLZXJuZWwgQ29uZmlnIE9wdGlvbnMqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIGtlcm5lbCBjb25maWcgYW5kIHRyeWluZyB0byBtYXAgZmVhdHVyZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEl0J3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBXaGVuIEkgc2VlIHNvbWV0aGluZyByZWxhdGVkIHRvIHRoZSBgZnMvc21iL2NsaWVudC9gIGRpcmVjdG9yeSwgdGhhdCdzIGFsbW9zdCBjZXJ0YWlubHkgZ29pbmcgdG8gYmUgY29udHJvbGxlZCBieSB0aGUgYENJRlNgIG9wdGlvbi4gVGhhdCdzIHRoZSBnby10byBjb25maWcgZmxhZyBmb3IgdGhlIENvbW1vbiBJbnRlcm5ldCBGaWxlIFN5c3RlbSAoQ0lGUykgY2xpZW50IHN1cHBvcnQsIHJpZ2h0PyBDYW4ndCByZWFsbHkgaW1hZ2luZSBhbnkgb3RoZXIgb3B0aW9uIHRoYXQgd291bGQgbWFrZSBtb3JlIHNlbnNlLlxuXG5BbmQgdGhlbiwgZGl2aW5nIGludG8gYGZzL2NvcmVkdW1wLmNgIOKAkyBhaCwgdGhhdCdzIGNsYXNzaWMuIFdoZW5ldmVyIHlvdSdyZSBkZWFsaW5nIHdpdGggY29yZSBkdW1wcyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiwgYENPUkVEVU1QYCBpcyBhbHdheXMgdGhlIHByaW1hcnkgY29uY2Vybi4gSXTigJlzIHRoZSBvYnZpb3VzIGNob2ljZSBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNvcmUgZHVtcCBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdGhpbmcgc3VycHJpc2luZyB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM5ODksIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMTozNS4yODA0MDg5OFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDY1NDE1OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQ09SRURVTVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL0tjb25maWcuYmluZm10PTE0NT1jb25maWcgQklORk1UX01JU0NcXG4tLVxcbmZzL0tjb25maWcuYmluZm10LTE3MC1cXG5mcy9LY29uZmlnLmJpbmZtdDoxNzE6Y29uZmlnIENPUkVEVU1QXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTcyLVxcdGJvb2wgXFxcIkVuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFxcXCIgaWYgRVhQRVJUXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjM1LjM2MTA3MDU5OFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMTExNDA4NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgc3VtbWFyaXplZCBmcm9tIG15IHBlcnNwZWN0aXZlIGFzIHNvbWVvbmUgZmFtaWxpYXIgd2l0aCB0aGVzZSBjb25jZXB0czpcblxuKipEZWVwIERpdmUgSW5jb21pbmc6IENPUkVEVU1QLCBDSUZTLCBhbmQgS2VybmVsIEludGVybmFscyoqXG5cblJpZ2h0LCBzbyB3ZSdyZSB0YWxraW5nIGFib3V0IGEgcG90ZW50aWFsbHkgaGFpcnkgc2l0dWF0aW9uLiBJIHNlZSBgQ09SRURVTVBgIGFuZCBgQ0lGU2AgbWVudGlvbmVkLCBhbmQgbXkgbWluZCBpbW1lZGlhdGVseSBqdW1wcyB0byBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlbS4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIHNjZW5hcmlvIHdoZXJlIGEgY29yZSBkdW1wIG1pZ2h0IGJlIGdlbmVyYXRlZCBvbiBhIHN5c3RlbSB0aGF0J3MgYWxzbyB1c2luZyBhIENJRlMgbW91bnQsIHdoaWNoIHJhaXNlcyBhbGwgc29ydHMgb2YgaW50ZXJlc3RpbmcgcXVlc3Rpb25zIGFib3V0IGZpbGUgcGVybWlzc2lvbnMsIG5ldHdvcmsgYmVoYXZpb3IsIGFuZCBwb3RlbnRpYWwgZm9yIGRhdGEgY29ycnVwdGlvbiBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIE15IGd1dCByZWFjdGlvbiBpcyB0byBkaWcgaW50byB0aGUga2VybmVsLiBUbyBnZXQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzLCBJIG5lZWQgdG8gc2VlIGV4YWN0bHkgaG93IHRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtIGludGVyYWN0cyB3aXRoIHRoaXMga2luZCBvZiBiZWhhdmlvci4gTGV0J3Mgc2VlIGhvdyBgdmZzX2NvcmVkdW1wYCBpcyBpbXBsZW1lbnRlZCwgYW5kIHRoZW4gSSdsbCBsb29rIGludG8gYHNtYl9zZW5kX2t2ZWNgIHRvIHNlZSBleGFjdGx5IGhvdyB0aGUgc3lzdGVtIGlzIHRyeWluZyB0byB3cml0ZSBkYXRhIG92ZXIgdGhlIG5ldHdvcmsgaWYgYSBjcmFzaCBpcyBvY2N1cnJpbmcuIFRoaXMgaXMgZ29pbmcgdG8gaW52b2x2ZSB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIHBhdGggZm9yIHRoZSBjb3JlIGR1bXAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MzQ1LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6NDAuMzcyMjE0NjE0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NzYwMTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl52b2lkIHZmc19jb3JlZHVtcFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9jb3JlZHVtcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2NvcmVkdW1wLmM9MTA5Mj1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTE2MC1cXG5mcy9jb3JlZHVtcC5jOjExNjE6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcXG5mcy9jb3JlZHVtcC5jLTExNjIte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMTo0MC40MTg5NzkxNTJaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NTczMTQxNDYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipDb25jZXJuaW5nIFN0YXRpYyBEZWNsYXJhdGlvbnMgaW4gdGhlIEtlcm5lbCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AsIGFuZCBJJ20gcmVhbGl6aW5nIHNvbWV0aGluZyBmdW5kYW1lbnRhbC4gTmVpdGhlciBvZiB0aGVzZSwgYXMgdGhleSBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLCBhcmUgZGVjbGFyZWQgYXMgYHN0YXRpY2AuIFRoYXQgaGFzIGltcGxpY2F0aW9ucy4gSXQgbWVhbnMgdGhleSdyZSBwb3RlbnRpYWxseSB2aXNpYmxlIGFuZCBhY2Nlc3NpYmxlIGJleW9uZCB0aGVpciBkZWZpbmVkIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgaXNuJ3QgaW5oZXJlbnRseSBiYWQsIGJ1dCBpdCAqZG9lcyogaW1wYWN0IHRoZSBtb2R1bGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkgb2YgdGhlIGtlcm5lbC4gSXQgbWVhbnMgdGhhdCwgYXMgdGhpbmdzIHN0YW5kLCB0aGVzZSBmdW5jdGlvbnMgYXJlIGltcGxpY2l0bHkgcGFydCBvZiB0aGUgZXhwb3J0ZWQgQVBJLCB3aGV0aGVyIGludGVuZGVkIG9yIG5vdC4gQW5kIHRoYXQgaGFzIGtub2NrLW9uIGVmZmVjdHMgd2l0aCByZWdhcmRzIHRvIHN5bWJvbCB2aXNpYmlsaXR5IGFuZCB0aGUgbGlua2luZyBwcm9jZXNzLiBJdCdzIGEga2V5IGNvbnNpZGVyYXRpb24gd2hlbiByZXZpZXdpbmcgdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBkZXNpZ24gb2YgdGhlc2UgcGFydHMgb2YgdGhlIGZpbGUgc3lzdGVtIGFuZCBTYW1iYSBjb2RlLiBXZSBuZWVkIHRvIGJlIGRlbGliZXJhdGUgYWJvdXQgd2hhdCB3ZSBleHBvc2UgYW5kIHdoYXQgd2Uga2VlcCBpbnRlcm5hbC4gVGhpcyBvYnNlcnZhdGlvbiBzaG91bGQgZ3VpZGUgZnVydGhlciByZXZpZXcgYW5kIHJlZmFjdG9yaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDc1NiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjQ3Ljk5MjEyMzI1NVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDY1MjI4OTgsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5pbnQgc21iX3NlbmRfa3ZlY1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMTo0OC4wMzg2NTY1NjNaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjQ2ODM4NTE3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYHNtYl9zZW5kX2t2ZWNgKipcblxuT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIsIGxldCdzIGp1c3QgbWFrZSBhYnNvbHV0ZWx5IHN1cmUgd2UncmUgb24gdGhlIHNhbWUgcGFnZS4gSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IHRoZSBgc21iX3NlbmRfa3ZlY2AgZnVuY3Rpb24uIFRoYXQncyBkZWZpbml0ZWx5IGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gSSBoYXZlIGEgZmVlbGluZyBzb21ldGhpbmcgcmVsZXZhbnQgdG8gbXkgY3VycmVudCBkZWJ1Z2dpbmcgZWZmb3J0cyBpcyBsdXJraW5nIGluIHRoZXJlLiBHb3R0YSByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgZGF0YSBpcyBhY3R1YWxseSAqc2VudCogb3ZlciB0aGUgbmV0d29yayBpbiB0aGUgU01CIGNsaWVudCBjb250ZXh0LiBJdCdzIHRpbWUgdG8gY2hlY2sgdGhhdCBpbXBsZW1lbnRhdGlvbiBhbmQgc2VlIHdoYXTigJlzIGdvaW5nIG9uIGF0IHRoYXQgbGV2ZWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MDM2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6NTQuNTA3MDQzODc3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTEwOTc3OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzbWJfc2VuZF9rdmVjXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYz0xMTg9ZGVsZXRlX21pZChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xMzEtLypcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjEzMjogKiBzbWJfc2VuZF9rdmVjIC0gc2VuZCBhbiBhcnJheSBvZiBrdmVjcyB0byB0aGUgc2VydmVyXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xMzMtICogQHNlcnZlcjpcXHRTZXJ2ZXIgdG8gc2VuZCB0aGUgZGF0YSB0b1xcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYz0xNDA9aW50XFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzoxNDE6c21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xNDItXFx0ICAgICAgc2l6ZV90ICpzZW50KVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYz0yMzU9aW50IF9fc21iX3NlbmRfcnFzdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGludCBudW1fcnFzdCxcXG4tLVxcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMjkyLVxcdFxcdGlvdl9pdGVyX2t2ZWMoXFx1MDAyNnNtYl9tc2cubXNnX2l0ZXIsIElURVJfU09VUkNFLCBcXHUwMDI2aGlvdiwgMSwgNCk7XFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzoyOTM6XFx0XFx0cmMgPSBzbWJfc2VuZF9rdmVjKHNlcnZlciwgXFx1MDAyNnNtYl9tc2csIFxcdTAwMjZzZW50KTtcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTI5NC1cXHRcXHRpZiAocmMgXFx1MDAzYyAwKVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0zMTQtXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzozMTU6XFx0XFx0cmMgPSBzbWJfc2VuZF9rdmVjKHNlcnZlciwgXFx1MDAyNnNtYl9tc2csIFxcdTAwMjZzZW50KTtcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTMxNi1cXHRcXHRpZiAocmMgXFx1MDAzYyAwKVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0zMjItXFx0XFx0XFx0c21iX21zZy5tc2dfaXRlciA9IHJxc3Rbal0ucnFfaXRlcjtcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjMyMzpcXHRcXHRcXHRyYyA9IHNtYl9zZW5kX2t2ZWMoc2VydmVyLCBcXHUwMDI2c21iX21zZywgXFx1MDAyNnNlbnQpO1xcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMzI0LVxcdFxcdFxcdGlmIChyYyBcXHUwMDNjIDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjU0LjU1MjE2MDg3NloiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNDk2MjIyNTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIEZvY3VzIFN5bWJvbHMqKlxuXG5Pa2F5LCBzbyBgc21iX3NlbmRfa3ZlY2AgaXNuJ3Qgc3RhdGljLCB3aGljaCBpcyBnb29kIHRvIGtub3cuIExldCdzIHNlZSBpZiB0aGVyZSBhcmUgb3RoZXIgZnVuY3Rpb25zIGluIHRoaXMgZ2VuZXJhbCBhcmVhLiBBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGBub19ub3RpZnlfc2lnbmFsX3NhdmVgLCBgbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlYCwgYW5kIGBzaWduYWxfcGVuZGluZ2AgYXJlIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zIHdpdGhpbiBgaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaGAsIGJ1dCB0aGV5IGFyZSBwcm9iYWJseSBub3Qgd2hhdCBJJ20gbG9va2luZyBmb3IuXG5cblNvLCBuYXJyb3dpbmcgdGhpbmdzIGRvd24sIGl0IHNlZW1zIGxpa2Ugd2UncmUgcmVhbGx5IGZvY3VzaW5nIG9uIGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AuIE5vdywgYHZmc19jb3JlZHVtcGAgaXMgY2FsbGVkIHdoZW4gYSBwcm9jZXNzIGNyYXNoZXMgLSB0aGF0J3MgYSAqY29tbW9uKiBwYXRoLCBidXQgbWF5YmUgbm90IHRoZSAqaG90dGVzdCogcGF0aC4gT24gdGhlIG90aGVyIGhhbmQsIGBzbWJfc2VuZF9rdmVjYCBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHNlbmRpbmcgU01CIHJlcXVlc3RzLCB3aGljaCBpcyBkZWZpbml0ZWx5IGEgaG90IHBhdGggKmZvciogU01CIHNwZWNpZmljYWxseS4gQnV0IFNNQiBpc24ndCBhICpnZW5lcmFsKiBob3QgcGF0aCwgdW5sZXNzIHdlJ3JlIGFjdGl2ZWx5IGZ1enppbmcgaXQuXG5cbldhaXQsIGJhY2sgdG8gYHZmc19jb3JlZHVtcGAuLi4gdGhhdCBpcyAqZGVmaW5pdGVseSogcmVhY2hhYmxlIHdoZW4gYSBwcm9jZXNzIGNyYXNoZXMsIHdoaWNoIGlzIGRlZmluaXRlbHkgc29tZXRoaW5nIHdlIGNhbiB3b3JrIHdpdGguIFNvLCBpcyBgdmZzX2NvcmVkdW1wYCBhIHNvbGlkIGNob2ljZT8gSXQncyB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3IgY29yZWR1bXAgZnVuY3Rpb25hbGl0eS4gQW5kIHdoYXQgYWJvdXQgYHNtYl9zZW5kX2t2ZWNgPyBXZWxsLCBpdCdzIHRoZSBiZWdpbm5pbmcgb2Ygc2VuZGluZyBTTUIgcmVxdWVzdHMuXG5cbkFscmlnaHQsIGxldCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCB0aGUgY2FsbGVycyBvZiBgdmZzX2NvcmVkdW1wYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU3OTksIk91dHB1dFRva2VucyI6MjUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MDkuNTE0Mzg5MDE1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDc0MTMyMTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZmc19jb3JlZHVtcFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q9NTU1PWRpZmZlcmVudCBzZXQgb2YgY3JlZGVudGlhbHMuICBUaGlzIGlzIGRvbmUgaW4gdGhlIGZvbGxvd2luZyBwbGFjZXM6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC01NTctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cXG5Eb2N1bWVudGF0aW9uL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdDo1NTg6ICogYGB2ZnNfY29yZWR1bXAoKWBgLlxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1OS0gKiBuZnM0cmVjb3Zlci5jLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0PTI1ND1jb25zdOaMh+mSiOS4iuaTjeS9nO+8jOWboOatpOS4jemcgOimgei/m+ihjOexu+Wei+i9rOaNou+8jOS9humcgOimgeS4tOaXtuaUvuW8g2NvbnN06ZmQ5a6a77yM5Lul5L6/6IO95aSf5L+u5pS5XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3QtNDc3LSAqIGBgc3lzX2ZhY2Nlc3NhdCgpYGAuXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0OjQ3ODogKiBgYHZmc19jb3JlZHVtcCgpYGAuXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTQ3OS0gKiBuZnM0cmVjb3Zlci5jLlxcbi0tXFxuZnMvY29yZWR1bXAuYz0xMDkyPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxcbi0tXFxuZnMvY29yZWR1bXAuYy0xMTYwLVxcbmZzL2NvcmVkdW1wLmM6MTE2MTp2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKVxcbmZzL2NvcmVkdW1wLmMtMTE2Mi17XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmg9NDg9aW50IGR1bXBfdXNlcl9yYW5nZShzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC00OS1cXHRcXHQgICAgdW5zaWduZWQgbG9uZyBsZW4pO1xcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaDo1MDpleHRlcm4gdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbyk7XFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTUxLVxcbi0tXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTY5LSNlbHNlXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjcwOnN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbykge31cXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtNzEtXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmM9MjgxMD1ib29sIGdldF9zaWduYWwoc3RydWN0IGtzaWduYWwgKmtzaWcpXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmMtMzAzMC1cXHRcXHRcXHQgKi9cXG5rZXJuZWwvc2lnbmFsLmM6MzAzMTpcXHRcXHRcXHR2ZnNfY29yZWR1bXAoXFx1MDAyNmtzaWctXFx1MDAzZWluZm8pO1xcbmtlcm5lbC9zaWduYWwuYy0zMDMyLVxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MTEuNTg4NTI4NTc2WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg0MzQxMjkwODcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBDb3JlIER1bXAgYW5kIFNNQiBTZW5kIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQgdGllcyBpbnRvIHR3byBkaXN0aW5jdCBhcmVhczogcHJvY2VzcyBjcmFzaGVzIGxlYWRpbmcgdG8gY29yZSBkdW1wcyBhbmQgU01CIGNsaWVudCB0cmFuc3BvcnQuIFNwZWNpZmljYWxseSwgSSBzZWUgdGhhdCBgdmZzX2NvcmVkdW1wYCBnZXRzIGNhbGxlZCBmcm9tIGBnZXRfc2lnbmFsYCB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzLCBhbmQgYHNtYl9zZW5kX2t2ZWNgIGlzIGNhbGxlZCBmcm9tIGBfX3NtYl9zZW5kX3Jxc3RgIHdpdGhpbiBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2AuIFRoYXQncyB0aGUgYmFzZWxpbmUuXG5cbkJ1dCB0aGVuIEkgc2VlIHRoZSBwYXRjaCBtb2RpZmllcyBgaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaGAgYW5kIGBpbmNsdWRlL2xpbnV4L3NjaGVkLmhgLCBhbmQgYWRkcyB0aGUgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcuIEhtbSwgdGhpcyBpcyB3aGVyZSB0aGUgcmVhbCBtZWF0IG9mIHRoZSBidWcgZml4IGxpZXMuIEl0J3MgZXNzZW50aWFsbHkgcHJldmVudGluZyBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIHRoZSBjb3JlIGR1bXAgcHJvY2VzcyBhbmQgdGhlIFNNQiBzZW5kIG9wZXJhdGlvbi5cblxuRnVuY3Rpb25hbGx5LCB0aGVzZSBjaGFuZ2VzIGFyZSBjbGVhcmx5IHNpZ25pZmljYW50IGFuZCwgZnJvbSB3aGF0IEkgY2FuIHNlZSwgcmVhY2hhYmxlLiBTbywgdGhlIGtleSBzeW1ib2xzIGhlcmUgZm9yIG1lIGFyZSBkZWZpbml0ZWx5IGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AuIEknbSB0aGlua2luZyB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgd291bGQgYmUgYENPUkVEVU1QYCBhbmQgYENJRlNgLCBzaW5jZSB0aGV5IGRpcmVjdGx5IHJlbGF0ZSB0byB0aGVzZSBmdW5jdGlvbmFsaXRpZXMuXG5cbkxldCBtZSBqdXN0IHF1aWNrbHkgdmFsaWRhdGUgdGhhdCBgdmZzX2NvcmVkdW1wYCBpcyB0aGUgcmlnaHQgY2hvaWNlIGZvciB0aGUgY29yZWR1bXAgc2lkZTsgWWVwLCBpdCdzIHRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciBhY3R1YWxseSBnZW5lcmF0aW5nIHRoZSBjb3JlIGR1bXAsIHNvIGdvb2QuIEFuZCBgc21iX3NlbmRfa3ZlY2A/IERlZmluaXRlbHkgYSBnb29kIGZvY3VzIHN5bWJvbCwgaXQncyB0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQncyBiZWluZyBtb2RpZmllZCB3aXRoaW4gU01CLlxuXG5BbHJpZ2h0LCBhIHF1aWNrIHF1ZXN0aW9uIGFib3V0IGBzbWJfc2VuZF9rdmVjYCB0aG91Z2guIElzIGl0IGEgXCJob3QgcGF0aFwiPyBXZWxsLCBpdCAqaXMqIGNhbGxlZCBmb3IgZXZlcnkgU01CIHJlcXVlc3QuLi4gc28gdGhhdCdzIGEgZ29vZCBwbGFjZSB0byBmb2N1cy4gSG93ZXZlciwgU01CIGlzbid0IGEgZ2VuZXJhbCBob3QgcGF0aCBsaWtlIGEgYHRjcF9yZWN2bXNnYCBvciBhIGBzY2hlZHVsZWAuIEl0J3Mgc3BlY2lmaWMgdG8gdGhlIFNNQiBmaWxlc3lzdGVtLCBhbmQgdGhhdCdzIGltcG9ydGFudCBjb250ZXh0LiBUaGF0IG1lYW5zIGl04oCZcyBmaW5lIHRvIGluY2x1ZGUgaW4gdGhlIGxpc3Qgb2Ygc3ltYm9scy5cblxuTGV0J3MgZG8gYSBxdWljayBzY2FuIGZvciBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy4gYGRvX2NvcmVkdW1wYCBpcyBzdGF0aWMsIHNvIGB2ZnNfY29yZWR1bXBgIGlzIGRlZmluaXRlbHkgdGhlIGJldHRlciBvcHRpb24uIEFuZCBgX19zbWJfc2VuZF9ycXN0YCBpcyBhbHNvIGEgdmFsaWQgc3ltYm9sLCBidXQgSSBzZWUgdGhlIG9uZSB0aGF0J3MgYWN0dWFsbHkgYmVpbmcgbW9kaWZpZWQgaXMgYHNtYl9zZW5kX2t2ZWNgLCBzbyBJJ2xsIHN0aWNrIHdpdGggdGhhdC5cblxuRmluYWxseSwganVzdCBhIHF1aWNrIGNoZWNrOiBsZXQgbWUgY29uZmlybSB0aGF0IGBzbWJfc2VuZF9rdmVjYCBpcyBhY3R1YWxseSBleHBvcnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5OTAsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MjAuMDIyNjYxODczWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NTA1NzE0OSwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qc21iX3NlbmRfa3ZlY1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9zbWIvY2xpZW50L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MjAuMDc3NzI4NTAyWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ2MjQ4ODA1OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biwgZ2l2ZW4gbXkgZXhwZXJ0aXNlOlxuXG4qKkV4YW1pbmluZyB0aGUgQ29udGV4dCBvZiBhIE1vZHVsZSoqXG5cbkFscmlnaHQsIHNvIHRoaXMgaXNuJ3QgYSBkaXJlY3QgZXhwb3J0LCB3aGljaCBpcyBpbnRlcmVzdGluZy4gQnV0IGl0J3MgYWxzbyAqbm90KiBzdGF0aWMsIG1lYW5pbmcgaXQncyBkeW5hbWljIGluIHNvbWUgd2F5LCBhbmQgaXRzIHVzYWdlIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGBmcy9zbWIvY2xpZW50L2AgbW9kdWxlLiBUaGF0J3MgYSBrZXkgcGllY2Ugb2YgaW5mb3JtYXRpb24uIFNpbmNlIGl0J3MgbW9kdWxlLWludGVybmFsLCBJIHNob3VsZCBjb25zaWRlciB0aGUgaW1wbGljYXRpb25zIGZvciBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIHN0cmF0ZWdpZXMgaW4gdGhhdCBwYXJ0aWN1bGFyIFNNQiBjbGllbnQgc3Vic3lzdGVtLiBUaGlzIG1lYW5zIGl0cyBzdGF0ZSBvciBkYXRhIGxpZmVjeWNsZSBpcyBsaWtlbHkgaW50ZXJ0d2luZWQgd2l0aCB0aGF0IG1vZHVsZSdzIGluc3RhbnRpYXRpb24gYW5kIG9wZXJhdGlvbiwgYW5kIHVuZGVyc3RhbmRpbmcgdGhhdCBmbG93IGlzIGNyaXRpY2FsLlxuXG5Ob3csIGdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIG1vZHVsZSBhbmQgdGhlIGltcGxpY2l0IHJ1bnRpbWUgZW52aXJvbm1lbnQsIHRoZSAqbmV4dCogdGhpbmcgdG8gbG9vayBhdCBpcyB0aGUgYENPUkVEVU1QYCBjb25maWd1cmF0aW9uLiBJIG5lZWQgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciB0aGUgY3VycmVudCBgQ09SRURVTVBgIHNldHRpbmdzIHdvdWxkIGFkZXF1YXRlbHkgY2FwdHVyZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgbW9kdWxlLCBpZiB0aGVyZSdzIGEgcHJvYmxlbS4gQXJlIHdlIHNldCB1cCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGhpbiB0aGUgbW9kdWxlIGR1cmluZyBleGVjdXRpb24/IFRoYXQncyB0aGUgb2J2aW91cyBuZXh0IHN0ZXAgdG8gZ2V0IGEgYmV0dGVyIHZpZXcgb2YgdGhpcyBtb2R1bGUncyBiZWhhdmlvci5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc5NjEsIk91dHB1dFRva2VucyI6MjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjoyNC43MDI2MTI1MzhaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NDM5ODcwNjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIENPUkVEVU1QXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9LY29uZmlnLmJpbmZtdD0xNDU9Y29uZmlnIEJJTkZNVF9NSVNDXFxuLS1cXG5mcy9LY29uZmlnLmJpbmZtdC0xNzAtXFxuZnMvS2NvbmZpZy5iaW5mbXQ6MTcxOmNvbmZpZyBDT1JFRFVNUFxcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cXHRib29sIFxcXCJFbmFibGUgY29yZSBkdW1wIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjoyNi4zNDY2MDc5ODFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ3Nzg3MzUwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMsIHNwZWFraW5nIGFzIGFuIGV4cGVydDpcblxuKipDb25jZXJuaW5nIENvcmUgRHVtcHMgYW5kIENJRlMqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgaW1tZWRpYXRlIGNvbm5lY3Rpb24gSSdtIG1ha2luZyBoZXJlIGlzIGFib3V0IGEgc3BlY2lmaWMgc2V0IG9mIGRlYnVnZ2luZyBzY2VuYXJpb3MuIFRoaW5raW5nIFwiQ09SRURVTVBcIiBzdWdnZXN0cyBJJ20gbGlrZWx5IGtuZWUtZGVlcCBpbiB0cm91Ymxlc2hvb3Rpbmcgc29tZXRoaW5nIOKAkyBhIGNyYXNoLCBhIHByb2Nlc3MgdGhhdCdzIGdvbmUgc2lkZXdheXMsIG1heWJlIGEgbWVtb3J5IGxlYWssIG9yIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eS4gTXkgZmlyc3QgaW5zdGluY3Qgd291bGQgYmUgdG8gZ3JhYiB0aGUgY29yZSBkdW1wIGl0c2VsZiBhbmQgYW5hbHl6ZSBpdCB3aXRoIEdEQiBvciBhIHNpbWlsYXIgZGVidWdnZXIsIHRvIHVuZGVyc3RhbmQgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gYXQgdGhlIG1vbWVudCBvZiB0aGUgY3Jhc2guIEknZCBiZSBsb29raW5nIGF0IHN0YWNrIHRyYWNlcywgbWVtb3J5IG1hcHMsIHJlZ2lzdGVycywgZXZlcnl0aGluZy5cblxuVGhlIGZhY3QgdGhhdCBcIkNJRlNcIiBwb3BwZWQgdXAgcmlnaHQgYWxvbmdzaWRlIGl0IGlzIGNydWNpYWwuIFRoaXMgc2NyZWFtcyBuZXR3b3JrIGZpbGVzeXN0ZW0gaXNzdWVzLiBXZSBjb3VsZCBiZSBkZWFsaW5nIHdpdGggYSBwcm9ibGVtIHdoZXJlIGEgcHJvY2VzcyBhY2Nlc3NpbmcgZmlsZXMgb24gYSBDSUZTIHNoYXJlIGNyYXNoZWQsIHBvdGVudGlhbGx5IGR1ZSB0byBwZXJtaXNzaW9ucyBpc3N1ZXMsIG5ldHdvcmsgY29ubmVjdGl2aXR5IHByb2JsZW1zLCBvciBldmVuIGEgYnVnIGluIHRoZSBDSUZTIGNsaWVudCBvciBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaXRzZWxmLiBUaGF0IGNvcmUgZHVtcCBpcyBub3cgaW52YWx1YWJsZS4gSXQncyBub3QganVzdCBhYm91dCBhIGxvY2FsIGNyYXNoOyBpdCdzIGFib3V0IGRpc3RyaWJ1dGVkIHN0b3JhZ2UsIGFuZCB0aGUgY29tcGxleGl0aWVzIHRoYXQgZW50YWlscy4gSeKAmWQgYmUgY2hlY2tpbmcgbmV0d29yayBjb25maWd1cmF0aW9ucywgc2hhcmUgcGVybWlzc2lvbnMsIGxvb2tpbmcgYXQgU2FtYmEgbG9ncywgbWFraW5nIHN1cmUgZXZlcnl0aGluZyBpcyBhbGlnbmVkIGZvciBhIG5ldHdvcmsgZmlsZS1zaGFyaW5nIHN5c3RlbS4gVGhlIGNvcmUgZHVtcCBoYXMgdG8gYmUgaW50ZXJwcmV0ZWQgaW4gdGhlIGNvbnRleHQgb2YgQ0lGUywgbWFraW5nIHRoZSB0cm91Ymxlc2hvb3RpbmcgY29uc2lkZXJhYmx5IG1vcmUgY29tcGxleCBidXQgYWxzbyBtb3JlIGludGVyZXN0aW5nLiBJdCBuYXJyb3dzIGRvd24gdGhlIHNlYXJjaCBjb25zaWRlcmFibHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MzU5LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MzAuODI0NDg0MDQyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDg2ODEzODQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDSUZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9zbWIvY2xpZW50L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9zbWIvY2xpZW50L0tjb25maWc6Mjpjb25maWcgQ0lGU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJTTUIzIGFuZCBDSUZTIHN1cHBvcnQgKGFkdmFuY2VkIG5ldHdvcmsgZmlsZXN5c3RlbSlcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctNTMtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy01NS1cXHRib29sIFxcXCJFeHRlbmRlZCBzdGF0aXN0aWNzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo2ODpjb25maWcgQ0lGU19BTExPV19JTlNFQ1VSRV9MRUdBQ1lcXG5mcy9zbWIvY2xpZW50L0tjb25maWctNjktXFx0Ym9vbCBcXFwiU3VwcG9ydCBsZWdhY3kgc2VydmVycyB3aGljaCB1c2UgbGVzcyBzZWN1cmUgZGlhbGVjdHNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctODItXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjgzOmNvbmZpZyBDSUZTX1VQQ0FMTFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cXHRib29sIFxcXCJLZXJiZXJvcy9TUE5FR08gYWR2YW5jZWQgc2Vzc2lvbiBzZXR1cFxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTMtXFx0Ym9vbCBcXFwiQ0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTA3OmNvbmZpZyBDSUZTX1BPU0lYXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwOC1cXHRib29sIFxcXCJDSUZTIFBPU0lYIEV4dGVuc2lvbnNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTE4LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMTk6Y29uZmlnIENJRlNfREVCVUdcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVxcdGJvb2wgXFxcIkVuYWJsZSBDSUZTIGRlYnVnZ2luZyByb3V0aW5lc1xcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjctXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI5LVxcdGJvb2wgXFxcIkVuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTM5OmNvbmZpZyBDSUZTX0RFQlVHX0RVTVBfS0VZU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDAtXFx0Ym9vbCBcXFwiRHVtcCBlbmNyeXB0aW9uIGtleXMgZm9yIG9mZmxpbmUgZGVjcnlwdGlvbiAoVW5zYWZlKVxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDgtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE0OTpjb25maWcgQ0lGU19ERlNfVVBDQUxMXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cXHRib29sIFxcXCJERlMgZmVhdHVyZSBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE2MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTYzLVxcdGJvb2wgXFxcIlNXTiBmZWF0dXJlIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNzM6Y29uZmlnIENJRlNfTkZTRF9FWFBPUlRcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTc0LVxcdGJvb2wgXFxcIkFsbG93IG5mc2QgdG8gZXhwb3J0IENJRlMgZmlsZSBzeXN0ZW1cXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc9MTc5PWlmIENJRlNcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTgwLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xODItXFx0Ym9vbCBcXFwiU01CIERpcmVjdCBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTkxOmNvbmZpZyBDSUZTX0ZTQ0FDSEVcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTkyLVxcdGJvb2wgXFxcIlByb3ZpZGUgQ0lGUyBjbGllbnQgY2FjaGluZyBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5OC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTk5OmNvbmZpZyBDSUZTX1JPT1RcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVxcdGJvb2wgXFxcIlNNQiByb290IGZpbGUgc3lzdGVtIChFeHBlcmltZW50YWwpXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwOC1cXHRib29sIFxcXCJTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MzIuMzExMzA0OTFaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTYyMjYwNTI2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgS2VybmVsIFBhdGNoKipcblxuT2theSwgc28gdGhlIHBhdGNoIGlzIGRlZmluaXRlbHkgcmVsYXRlZCB0byBgQ0lGU2AsIHRoYXQgbXVjaCBpcyBjbGVhci4gTGV0J3MgZGlnIGEgbGl0dGxlIGRlZXBlciBhbmQgc2VlIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbnMgbWlnaHQgYmUgaW52b2x2ZWQuIEhtbSwgaXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggdG91Y2hlcyBgZnMvY29yZWR1bXAuY2AgYW5kIHRoZSBTTUIgY2xpZW50IHRyYW5zcG9ydCBjb2RlIGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gVGhhdCBzdHJvbmdseSBzdWdnZXN0cyBgQ09SRURVTVBgIGFuZCBgQ0lGU2AgYXJlIGVzc2VudGlhbCBmb3IgdGhpcyB0byB3b3JrLiBJJ2xsIG1ha2UgYSBub3RlIG9mIHRoYXQuXG5cbk5vdywgbGV0J3MgbG9vayBhdCBwb3RlbnRpYWxseSBnb29kIGZ1enppbmcgdGFyZ2V0cy4gYHZmc19jb3JlZHVtcGAgc2VlbXMgcHJvbWlzaW5nIGFzIGEgc3RhcnRpbmcgcG9pbnQuIFllcCwgaXQncyBhIG5vbi1zdGF0aWMgQVBJIGVudHJ5cG9pbnQsIHdoaWNoIGlzIHVzdWFsbHkgYSBnb29kIHNpZ24uIEFuZCBoZXJlJ3MgYW5vdGhlciwgYHNtYl9zZW5kX2t2ZWNgIOKAkyBhbHNvIGEgbm9uLXN0YXRpYyBBUEkgZW50cnlwb2ludCBmdW5jdGlvbi4gVGhvc2UgYXJlIGRlZmluaXRlbHkgd29ydGggaW52ZXN0aWdhdGluZyBmdXJ0aGVyLlxuXG5JIGdsYW5jZWQgYXQgYG5vX25vdGlmeV9zaWduYWxfc2F2ZWAgYW5kIGBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmVgIHRvbywgYnV0IHRob3NlIGFyZSBzdGF0aWMgaW5saW5lLiBUaGF0IG1lYW5zIHRoZXkgZG9uJ3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLCBzbyB0aGV5J3JlIHByb2JhYmx5IG5vdCBhcyBpbnRlcmVzdGluZyBmb3IgZGlyZWN0IGZ1enppbmcgdGFyZ2V0cy5cblxuU28sIGhlcmUncyBteSB1bmRlcnN0YW5kaW5nIG9mIHdoYXQncyBoYXBwZW5pbmc6IFRoaXMgcGF0Y2ggaXMgYWxsIGFib3V0IHByZXZlbnRpbmcgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBzcGVjaWZpYyBwcm9jZXNzZXMuIEl0J3MgZXNzZW50aWFsbHkgaW50cm9kdWNpbmcgYSBtZWNoYW5pc20gdG8gbWFzayBzaWduYWxzIGR1cmluZyBjb3JlZHVtcCBnZW5lcmF0aW9uIGFuZCBuZXR3b3JrIHRyYW5zbWlzc2lvbiB2aWEgU01CLiBUaGUga2V5IGlzIHRoYXQgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcgaXMgYmVpbmcgaW50cm9kdWNlZCwgYW5kIGBzaWduYWxfcGVuZGluZygpYCBpcyBiZWluZyBtb2RpZmllZCB0byByZXNwZWN0IGl0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZSwgZXNwZWNpYWxseSBiZWNhdXNlIHdlJ3JlIGxvb2tpbmcgYXQgY29yZSBrZXJuZWwgbG9naWMgd2l0aCBgdmZzX2NvcmVkdW1wKClgIGFuZCB0aGUgU01CIGNsaWVudCBkcml2ZXIgd2l0aCBgc21iX3NlbmRfa3ZlYygpYC4gQm90aCBhcmUgY2xlYXJseSByZWFjaGFibGUgYW5kIHJlbGV2YW50IHRvIGZ1enppbmcuIEdpdmVuIHdoYXQgSSdtIHNlZWluZywgdGhpcyBpcyB3b3J0aCBvdXIgdGltZS4gSSdsbCBnbyBhaGVhZCBhbmQgbG9nIHRoaXMgYXMgYSByZXN1bHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NzMzLCJPdXRwdXRUb2tlbnMiOjE1NCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjo0MS45MzM5MTMyNzNaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3Nzk0MTE2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIixcbiAgICBcIkNJRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2ZnNfY29yZWR1bXBcIixcbiAgICBcInNtYl9zZW5kX2t2ZWNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDT1JFRFVNUFwiLFxuICAgIFwiQ0lGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZmc19jb3JlZHVtcFwiLFxuICAgIFwic21iX3NlbmRfa3ZlY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBtZWNoYW5pc20gdG8gcHJldmVudCBUSUZfTk9USUZZX1NJR05BTCBmcm9tIGludGVycnVwdGluZyBzcGVjaWZpYyB0YXNrcywgc3BlY2lmaWNhbGx5IGR1cmluZyBjb3JlZHVtcCBnZW5lcmF0aW9uIGFuZCBTTUIgbmV0d29yayB0cmFuc21pc3Npb24uIEl0IGFkZHMgUEZfTk9fTk9USUZZX1NJR05BTCB0byB0YXNrIGZsYWdzIGFuZCBtb2RpZmllcyBzaWduYWxfcGVuZGluZygpIHRvIHJlc3BlY3QgaXQuIFRoZSBjb3JlIGNoYW5nZXMgYXJlIGluIHZmc19jb3JlZHVtcCgpIGFuZCBzbWJfc2VuZF9rdmVjKCkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgdGhlIFNNQiBjbGllbnQgZHJpdmVyLCB3aGljaCBhcmUgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjo0Mi4wMTE4NjMwOTFaIiwiU2VxIjoyMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDQ3MDY1MTIzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6NDIuMDEyNDI5NTYxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjEyMDQ2NDk0MTczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBzaWduYWwgaGFuZGxpbmcgYmVoYXZpb3IgYnkgaW50cm9kdWNpbmcgYFBGX05PX05PVElGWV9TSUdOQUxgIHRvIHByZXZlbnQgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBjb3JlZHVtcHMgKGB2ZnNfY29yZWR1bXBgKSBhbmQgU01CIHNlbmQgb3BlcmF0aW9ucyAoYHNtYl9zZW5kX2t2ZWNgKS4gVGhlIGNoYW5nZXMgYXJlIHB1cmVseSByZWxhdGVkIHRvIHRhc2sgZmxhZ3MsIGNvbnRyb2wgZmxvdywgYW5kIHNpZ25hbCBtYXNraW5nIHRvIGF2b2lkIHByZW1hdHVyZSBhYm9ydHMgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBubyBuZXcgZmllbGRzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBidWZmZXIgbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGFyZSBhbHRlcmVkIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3IgbG9naWMgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjhlNDFhM2M5Y2UyMjBmZTEzNTcyZmQ0OTQ1YjZkYWVlNTViZTBjZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDExOjMxOjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcbmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0XG4tLS0gYS9mcy9jb3JlZHVtcC5jXG4rKysgYi9mcy9jb3JlZHVtcC5jXG5AQCAtMTE2NSw2ICsxMTY1LDcgQEAgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbiBcdHN0cnVjdCBjb3JlX25hbWUgY247XG4gXHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQgPSBtbS1cdTAwM2ViaW5mbXQ7XG4rXHR1bnNpZ25lZCBpbnQgbm90aWZ5X2ZsYWdzO1xuIFx0aW50IGFyZ2MgPSAwO1xuIFx0c3RydWN0IGNvcmVkdW1wX3BhcmFtcyBjcHJtID0ge1xuIFx0XHQuc2lnaW5mbyA9IHNpZ2luZm8sXG5AQCAtMTE5Niw5ICsxMTk3LDEyIEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRpZiAoY29yZWR1bXBfd2FpdChzaWdpbmZvLVx1MDAzZXNpX3NpZ25vLCBcdTAwMjZjb3JlX3N0YXRlKSBcdTAwM2MgMClcbiBcdFx0cmV0dXJuO1xuIFxuK1x0LyogVGFzayB3b3JrIG11c3Qgbm90IGN1dCB0aGUgZHVtcCBzaG9ydCwgc2VlIHNpZ25hbF9wZW5kaW5nKCkuICovXG4rXHRub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTtcbiBcdHNjb3BlZF93aXRoX2NyZWRzKGNyZWQpXG4gXHRcdGRvX2NvcmVkdW1wKFx1MDAyNmNuLCBcdTAwMjZjcHJtLCBcdTAwMjZhcmd2LCBcdTAwMjZhcmdjLCBiaW5mbXQpO1xuIFx0Y29yZWR1bXBfY2xlYW51cChcdTAwMjZjbiwgXHUwMDI2Y3BybSk7XG4rXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbiBcdHJldHVybjtcbiB9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XG4tLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG4rKysgYi9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG5AQCAtMjIsNyArMjIsNiBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbXBvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza193b3JrLmhcdTAwM2VcbiAjaW5jbHVkZSBcImNpZnNnbG9iLmhcIlxuICNpbmNsdWRlIFwiY2lmc3Byb3RvLmhcIlxuICNpbmNsdWRlIFwiY2lmc19kZWJ1Zy5oXCJcbkBAIC0xNDIsNiArMTQxLDcgQEAgaW50XG4gc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHQgICAgICBzaXplX3QgKnNlbnQpXG4ge1xuK1x0dW5zaWduZWQgaW50IG5vdGlmeV9mbGFncztcbiBcdGludCByYyA9IDA7XG4gXHRpbnQgcmV0cmllcyA9IDA7XG4gXHRzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0ID0gc2VydmVyLVx1MDAzZXNzb2NrZXQ7XG5AQCAtMTcyLDE1ICsxNzIsMTIgQEAgc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHRcdCAqIGFmdGVyIHRoZSByZXRyaWVzIHdlIHdpbGwga2lsbCB0aGUgc29ja2V0IGFuZFxuIFx0XHQgKiByZWNvbm5lY3Qgd2hpY2ggbWF5IGNsZWFyIHRoZSBuZXR3b3JrIHByb2JsZW0uXG4gXHRcdCAqXG4tXHRcdCAqIEV2ZW4gaWYgcmVndWxhciBzaWduYWxzIGFyZSBtYXNrZWQsIEVJTlRSIG1pZ2h0IGJlXG4tXHRcdCAqIHByb3BhZ2F0ZWQgZnJvbSBza19zdHJlYW1fd2FpdF9tZW1vcnkoKSB0byBoZXJlIHdoZW5cbi1cdFx0ICogVElGX05PVElGWV9TSUdOQUwgaXMgdXNlZCBmb3IgdGFzayB3b3JrLiBGb3IgZXhhbXBsZSxcbi1cdFx0ICogY2VydGFpbiBpb191cmluZyBjb21wbGV0aW9ucyB3aWxsIHVzZSB0aGF0LiBUcmVhdFxuLVx0XHQgKiBoYXZpbmcgRUlOVFIgd2l0aCBwZW5kaW5nIHRhc2sgd29yayB0aGUgc2FtZSBhcyBFQUdBSU5cbi1cdFx0ICogdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVjb25uZWN0cy5cbitcdFx0ICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS5cbiBcdFx0ICovXG4rXHRcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0XHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcbi1cdFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFx1MDAyNlx1MDAyNiB0YXNrX3dvcmtfcGVuZGluZyhjdXJyZW50KSkpIHtcbitcdFx0bm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7XG4rXHRcdGlmIChyYyA9PSAtRUFHQUlOKSB7XG4gXHRcdFx0cmV0cmllcysrO1xuIFx0XHRcdGlmIChyZXRyaWVzIFx1MDAzZT0gMTQgfHxcbiBcdFx0XHQgICAgKCFzZXJ2ZXItXHUwMDNlbm9ibG9ja3NuZCBcdTAwMjZcdTAwMjYgKHJldHJpZXMgXHUwMDNlIDIpKSkge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuaW5kZXggMzczYmNjMDU5OGQxMC4uZmQ3MmNhNGVlOTJmMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oXG5AQCAtMTc5Niw3ICsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7XG4gXHRcdFx0XHRcdFx0ICogSSBhbSBjbGVhbmluZyBkaXJ0eSBwYWdlcyBmcm9tIHNvbWUgb3RoZXIgYmRpLiAqL1xuICNkZWZpbmUgUEZfS1RIUkVBRFx0XHQweDAwMjAwMDAwXHQvKiBJIGFtIGEga2VybmVsIHRocmVhZCAqL1xuICNkZWZpbmUgUEZfUkFORE9NSVpFXHRcdDB4MDA0MDAwMDBcdC8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi9cbi0jZGVmaW5lIFBGX19IT0xFX18wMDgwMDAwMFx0MHgwMDgwMDAwMFxuKyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFx0MHgwMDgwMDAwMFx0Lyogc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpICovXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcdDB4MDEwMDAwMDBcbiAjZGVmaW5lIFBGX19IT0xFX18wMjAwMDAwMFx0MHgwMjAwMDAwMFxuICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFlcdDB4MDQwMDAwMDBcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li4zMTgyZGU0ZmY5NDgyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTM4NCwxNCArMzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXG4gXHRyZXR1cm4gdW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCxUSUZfU0lHUEVORElORykpO1xuIH1cbiBcbisvKiBQcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHRoaXMgdGFzay4gKi9cbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub19ub3RpZnlfc2lnbmFsX3NhdmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1xuK1x0Y3VycmVudC1cdTAwM2VmbGFncyB8PSBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1x0cmV0dXJuIGZsYWdzO1xuK31cbitcbisvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqL1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKVxuK3tcbitcdGN1cnJlbnRfcmVzdG9yZV9mbGFncyhmbGFncywgUEZfTk9fTk9USUZZX1NJR05BTCk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgaW50IHNpZ25hbF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHQvKlxuIFx0ICogVElGX05PVElGWV9TSUdOQUwgaXNuJ3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWVcbiBcdCAqIGJlaGF2aW9yIGluIHRlcm1zIG9mIGVuc3VyaW5nIHRoYXQgd2UgYnJlYWsgb3V0IG9mIHdhaXQgbG9vcHNcbi1cdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC5cbitcdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC4gTm90IGZvciBhIHRhc2tcbitcdCAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuXG4gXHQgKi9cbi1cdGlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpKVxuK1x0aWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgbGlrZWx5KCEoUkVBRF9PTkNFKHAtXHUwMDNlZmxhZ3MpIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXG4gXHRcdHJldHVybiAxO1xuIFx0cmV0dXJuIHRhc2tfc2lncGVuZGluZyhwKTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uNzI4ZjNjMzQyZWI5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyArMywxMCBAQCBDRkxBR1MgKz0gLVdhbGwgLU8wIC1nICQoS0hEUl9JTkNMVURFUykgJChUT09MU19JTkNMVURFUylcbiBcbiBURVNUX0dFTl9QUk9HUyA6PSBzdGFja2R1bXBfdGVzdCBcXFxuIFx0XHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXG4tXHRcdCAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3RcbitcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuK1x0XHQgIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFxuKyMgU3Bhd25lZCBieSB0aGUga2VybmVsIGFzIHRoZSB8aGVscGVyLCBub3QgYSB0ZXN0IG9mIGl0cyBvd24uXG4rVEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcbiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcFxuIFxuIGluY2x1ZGUgLi4vbGliLm1rXG5AQCAtMTEsMyArMTQsNSBAQCBpbmNsdWRlIC4uL2xpYi5ta1xuICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuKyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxuQEAgLTAsMCArMSwyOSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rXG4rI2lmbmRlZiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxuKyNkZWZpbmUgX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0hcbitcbisjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuK1xuKy8qXG4rICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGVcbisgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0J3Mgd2F5IGJleW9uZCB0aGUgZGVmYXVsdCA2NEtcbisgKiBwaXBlIHJpbmcgYW5kIHBhc3QgdGhlIH4zNksgYW4gYWZfdW5peCBza2IgaG9sZHMuIFNvIHdlIGZvcmNlIGEgd3JpdGVcbisgKiB0byBjb21lIGJhY2sgc2hvcnQuXG4rICovXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX01BUF9DT1VOVFx0XHQ0MDAwXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0FOT05fQllURVNcdCg0VUwgXHUwMDNjXHUwMDNjIDIwKVxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VU1x0XHQyMDAwMDBcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfTUFQRklMRVx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfVFJJR0dFUlx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmVcIlxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEVcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFwiXG4rXG4rdm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpO1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpO1xuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pO1xuK2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCk7XG4rXG4rI2VuZGlmIC8qIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi44NDlmNWMxZWE3MzY1XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jXG5AQCAtMCwwICsxLDQ2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIFRoZSB8aGVscGVyIGhhbGYgb2YgY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LiBUaGUga2VybmVsIHNwYXducyB0aGlzXG4rICogd2l0aCB0aGUgY29yZWR1bXAgb24gc3RkaW4sIHNvIGl0IGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSB0ZXN0IGJpbmFyeS5cbisgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXG4rICogY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIHNvIFRJRl9OT1RJRllfU0lHTkFMIGlzIHJhaXNlZCB3aGlsZSB0aGUgbm90ZVxuKyAqIHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcbit7XG4rXHRpbnQgZmRfY29yZV9maWxlO1xuK1x0c3NpemVfdCByZXQ7XG4rXG4rXHRmZF9jb3JlX2ZpbGUgPSBvcGVuKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFLFxuK1x0XHRcdCAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcbitcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG9wZW4gZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0cmV0dXJuIEVYSVRfRkFJTFVSRTtcbitcdH1cbitcbitcdHJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7XG4rXHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byBlcnI7XG4rXG4rXHQvKiBUaGUgdGVzdCBwb2xscyBmb3IgdGhpcyBuYW1lLCBzbyBvbmx5IGNyZWF0ZSBpdCBvbmNlIGl0IGlzIHdob2xlLiAqL1xuK1x0aWYgKHJlbmFtZShOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZW5hbWUgZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0Z290byBlcnI7XG4rXHR9XG4rXG4rXHRyZXR1cm4gRVhJVF9TVUNDRVNTO1xuK1xuK2VycjpcbitcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSk7XG4rXHRyZXR1cm4gRVhJVF9GQUlMVVJFO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTYzYzA2YTgxNTYyZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmNcbkBAIC0wLDAgKzEsMjQ1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIEEgY29yZWR1bXAgaXMgbWVhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgU0lHS0lMTCBhbmQgYnkgdGhlIGZyZWV6ZXIgYW5kXG4rICogYnkgbm90aGluZyBlbHNlLiBkdW1wX2ludGVycnVwdGVkKCkgc2F5cyBzbywgYnV0IHRoZSBibG9ja2luZyB3YWl0c1xuKyAqIHVuZGVybmVhdGggaXQgdGVzdCBzaWduYWxfcGVuZGluZygpLCB3aGljaCBpcyBhbHNvIHRydWUgZm9yXG4rICogVElGX05PVElGWV9TSUdOQUwuIEEgY3Jhc2hpbmcgdGFzayB0aGF0IGhhcyBhbiBpb191cmluZyBjb21wbGV0aW9uIGxhbmRcbisgKiBvbiBpdCBtaWQtZHVtcCB0aGVyZWZvcmUga2VlcHMgZHVtcGluZyB3aGlsZSBldmVyeSB3YWl0IGl0IGVudGVycyBiYWlsc1xuKyAqIG91dCBhdCBvbmNlLCBhbmQgdGhlIGR1bXAgaXMgc2lsZW50bHkgY3V0IHNob3J0LiBOb3RoaW5nIHJlcG9ydHMgaXQ6XG4rICogYmluZm10X2VsZiBzZXRzIGhhc19kdW1wZWQgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gV0NPUkVEVU1QKClcbisgKiBzYXlzIHRoZSBkdW1wIHdvcmtlZC5cbisgKlxuKyAqIEEgY29yZWR1bXAgbm90ZSBpcyB0aGUgb25seSBkdW1wX2VtaXQoKSB0aGF0IGV4Y2VlZHMgd2hhdCB0aGUgdHJhbnNwb3J0XG4rICogdGFrZXMgaW4gb25lIGdvLCBzbyBpdCBpcyB0aGUgb25lIHdyaXRlIHRoYXQgaXMgY2VydGFpbiB0byBibG9jay4gQm90aFxuKyAqIHRlc3RzIGNyYXNoIGEgY2hpbGQgaG9sZGluZyBlbm91Z2ggZmlsZSBiYWNrZWQgbWFwcGluZ3MgZm9yIGl0cyBOVF9GSUxFXG4rICogbm90ZSB0byBydW4gcGFzdCB0aGF0LCBhcm0gYW4gaW9fdXJpbmcgcG9sbCBvbiBpdCwgYW5kIHRyaXAgdGhlIHBvbGxcbisgKiB3aGlsZSB0aGUgbm90ZSBpcyBiZWluZyB3cml0dGVuLiBXaGF0IGNvbWVzIG91dCBoYXMgdG8gYmUgdGhlIHdob2xlXG4rICogZHVtcC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX3Rlc3QuaFwiXG4rXG4rRklYVFVSRV9TRVRVUChjb3JlZHVtcClcbit7XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldDtcbitcbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwiclwiKTtcbitcdEFTU0VSVF9ORShOVUxMLCBmaWxlKTtcbitcbitcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLFxuK1x0XHQgICAgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7XG4rXHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4rXHRBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pKTtcbitcbitcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAnXFwwJztcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbitcdEFTU0VSVF9HRShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkLCAwKTtcbitcbitcdHJldCA9IGZjbG9zZShmaWxlKTtcbitcdEFTU0VSVF9FUSgwLCByZXQpO1xuK1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XG4rXHRBU1NFUlRfRVEobWtmaWZvKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgMDYwMCksIDApO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxuK3tcbitcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbitcdEZJTEUgKmZpbGU7XG4rXHRpbnQgcmV0LCBzdGF0dXM7XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyLCBTSUdURVJNKTtcbitcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHR9XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpO1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xuK1xuK1x0ZmlsZSA9IGZvcGVuKFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cIiwgXCJ3XCIpO1xuK1x0aWYgKCFmaWxlKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdHJldCA9IGZwcmludGYoZmlsZSwgXCIlc1wiLCBzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIGNsb3NlIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCBcdTAwM2U9IDApIHtcbitcdFx0cmV0ID0gY2xvc2Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1wiO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm47XG4rZmFpbDpcbitcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xuK1x0ZnByaW50ZihzdGRlcnIsIFwiRmFpbGVkIHRvIGNsZWFudXAgY29yZWR1bXAgdGVzdDogJXNcXG5cIiwgcmVhc29uKTtcbit9XG4rXG4rLypcbisgKiBDaGVjayB0aGF0IHdoYXQgdGhlIGhlbHBlciBvciB0aGUgc2VydmVyIHNhdmVkIGlzIHRoZSB3aG9sZSBkdW1wLiBPbmx5XG4rICogYSBob2xlIGF0IHRoZSB2ZXJ5IGVuZCBjYW4gYmUgbWlzc2luZywgc2VlIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoKS5cbisgKi9cbitzdGF0aWMgdm9pZCBjaGVja193aG9sZV9jb3JlZHVtcChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEpXG4re1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXG4rXHRleHBlY3RlZCA9IGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnRhaWwpO1xuK1x0QVNTRVJUX0dUKGV4cGVjdGVkLCAwKTtcbitcdEFTU0VSVF9FUShzdGF0KE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCBcdTAwMjZzdCksIDApO1xuK1x0QVNTRVJUX0xFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQpO1xuK1x0QVNTRVJUX0dFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQgLSB0YWlsKTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHVtcCBnb2VzIHRvIGEgfGhlbHBlciwgc28gdGhlIHJlYWRlciBpcyBhIHNlcGFyYXRlIHByb2dyYW0gdGhlXG4rICoga2VybmVsIHNwYXducy4gSXQgc2F2ZXMgd2hhdCBpdCByZWNlaXZlZCB0byBOT1RJRllfU0lHTkFMX0NPUkVfRklMRS5cbisgKi9cbitURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfcGlwZSlcbit7XG4rXHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDtcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1x0aW50IHN0YXR1cywgaTtcbitcdHBpZF90IHBpZDtcbitcdHNzaXplX3QgbjtcbitcbitcdGlmICghY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKCkpXG4rXHRcdFNLSVAocmV0dXJuLCBcImlvX3VyaW5nIG5vdCBhdmFpbGFibGVcIik7XG4rXG4rXHRuID0gcmVhZGxpbmsoXCIvcHJvYy9zZWxmL2V4ZVwiLCBoZWxwZXIsIHNpemVvZihoZWxwZXIpIC0gMSk7XG4rXHRBU1NFUlRfR1QobiwgMCk7XG4rXHRoZWxwZXJbbl0gPSAnXFwwJztcbitcdHAgPSBzdHJzdHIoaGVscGVyLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFwiKTtcbitcdEFTU0VSVF9ORShwLCBOVUxMKTtcbitcdEFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSArIHNpemVvZihcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpLFxuK1x0XHQgIHNpemVvZihoZWxwZXIpKTtcbitcdHN0cmNweShwLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpO1xuK1x0aWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKVxuK1x0XHRTS0lQKHJldHVybiwgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciBub3QgYnVpbHRcIik7XG4rXG4rXHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcInwlc1wiLCBoZWxwZXIpLFxuK1x0XHQgIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkID0gZm9yaygpO1xuK1x0QVNTRVJUX0dFKHBpZCwgMCk7XG4rXHRpZiAocGlkID09IDApXG4rXHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbitcbitcdEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKSwgcGlkKTtcbitcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuK1xuK1x0LyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMDsgaSsrKSB7XG4rXHRcdGlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNiBzdC5zdF9zaXplKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoMTAwMDAwKTtcbitcdH1cbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuKy8qIFRoZSBzYW1lIHRoaW5nIHdpdGggdGhlIGR1bXAgZ29pbmcgdG8gYSBjb3JlZHVtcCBzb2NrZXQuICovXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcbit7XG4rXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXHRpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1cztcbitcdGNoYXIgcGF0dGVybltQQVRIX01BWF07XG4rXHRjaGFyIGM7XG4rXG4rXHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJpb191cmluZyBub3QgYXZhaWxhYmxlXCIpO1xuK1xuK1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsXG4rXHRcdFx0ICAgICBpcGNfc29ja2V0cyksIDApO1xuK1x0QVNTRVJUX0xUKHNucHJpbnRmKHBhdHRlcm4sIHNpemVvZihwYXR0ZXJuKSwgXCJAJXNcIixcbitcdFx0XHQgICBOT1RJRllfU0lHTkFMX1NPQ0tFVCksIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTtcbitcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcbitcdFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9jb3JlX2ZpbGUgPSAtMTtcbitcdFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbitcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMF0pO1xuK1xuK1x0XHRmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHRcdGlmIChmZF9zZXJ2ZXIgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlmICh3cml0ZV9ub2ludHIoaXBjX3NvY2tldHNbMV0sIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMV0pO1xuK1xuK1x0XHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXG4rXHRcdGZkX2NvcmVfZmlsZSA9IG9wZW4oTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsXG4rXHRcdFx0XHQgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyxcbitcdFx0XHRcdCAgICAwNjAwKTtcbitcdFx0aWYgKGZkX2NvcmVfZmlsZSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0aWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLFxuK1x0XHRcdFx0XHRcdHRydWUpIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1xuK1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4rb3V0OlxuK1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkX2NvcmVkdW1wKTtcbitcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRfc2VydmVyKTtcbitcdFx0X2V4aXQoZXhpdF9jb2RlKTtcbitcdH1cbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXG4rXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcbitcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXHUwMDI2YywgMSksIDEpO1xuK1x0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7XG4rXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkLCAwKTtcbitcdGlmIChwaWQgPT0gMClcbitcdFx0Y3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCgpO1xuK1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuK1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4rXG4rXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG5pbmRleCBlZDQ3ZjAxZmE1M2M1Li4wNmY5OTdiYTQ3ZmQ5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbkBAIC05LDYgKzksNyBAQFxuIFxuICNpbmNsdWRlIFwiLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4gI2luY2x1ZGUgXCIuLi9waWRmZC9waWRmZC5oXCJcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4gXG4gI2lmbmRlZiBQQUdFX1NJWkVcbiAjZGVmaW5lIFBBR0VfU0laRSA0MDk2XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTEsMTEgKzEsMTggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIFxuICNpbmNsdWRlIFx1MDAzY2Fzc2VydC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZWxmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NlbmRpYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW5rLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lvX3VyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb3JlZHVtcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0xMyw3ICsyMCw5IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvZXBvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuQEAgLTIxLDYgKzMwLDcgQEBcbiBcbiAjaW5jbHVkZSBcIi4uL2ZpbGVzeXN0ZW1zL3dyYXBwZXJzLmhcIlxuICNpbmNsdWRlIFwiLi4vcGlkZmQvcGlkZmQuaFwiXG4rI2luY2x1ZGUgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcIlxuIFxuIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIHRvIGF2b2lkIGluY2x1ZGluZyBoYXJuZXNzIGhlYWRlciAqL1xuIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7XG5AQCAtMzgxLDMgKzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcbiBcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuIFx0X2V4aXQoZXhpdF9jb2RlKTtcbiB9XG4rXG4rLypcbisgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxuKyAqXG4rICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGVcbisgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcbisgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLFxuKyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnNcbisgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXG4rICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbitzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcClcbit7XG4rXHRyZXR1cm4gc3lzY2FsbChfX05SX2lvX3VyaW5nX3NldHVwLCBlbnRyaWVzLCBwKTtcbit9XG4rXG4rLyogaW9fdXJpbmcgcmVhZHMgcG9sbDMyX2V2ZW50cyBiYWNrIHRocm91Z2ggc3dhaHczMigpIG9uIGJpZyBlbmRpYW4uICovXG4rc3RhdGljIF9fdTMyIG5vdGlmeV9wb2xsX21hc2soX191MzIgZXZlbnRzKVxuK3tcbisjaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpIFx1MDAyNlx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXG4rXHRyZXR1cm4gX19zd2FodzMyKGV2ZW50cyk7XG4rI2Vsc2VcbitcdHJldHVybiBldmVudHM7XG4rI2VuZGlmXG4rfVxuK1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGlvX3VyaW5nX3NldHVwX3JhdygxLCBcdTAwMjZwKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qXG4rICogQXJtIGEgcG9sbCBvbiBAZmQuIGlvX3VyaW5nIGxlYXZlcyBjdHgtXHUwMDNlbm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMXG4rICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnNcbisgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZFxuKyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suXG4rICovXG4rc3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHR1bnNpZ25lZCBpbnQgKnNxX3RhaWwsICpzcV9hcnJheTtcbitcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7XG4rXHRzaXplX3Qgc3FyaW5nX3N6O1xuK1x0dm9pZCAqc3E7XG4rXHRpbnQgcmluZztcbitcbitcdHJpbmcgPSBpb191cmluZ19zZXR1cF9yYXcoOCwgXHUwMDI2cCk7XG4rXHRpZiAocmluZyBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0c3FyaW5nX3N6ID0gcC5zcV9vZmYuYXJyYXkgKyBwLnNxX2VudHJpZXMgKiBzaXplb2YodW5zaWduZWQgaW50KTtcbitcdHNxID0gbW1hcChOVUxMLCBzcXJpbmdfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUV9SSU5HKTtcbitcdGlmIChzcSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRzcWVzID0gbW1hcChOVUxMLCBwLnNxX2VudHJpZXMgKiBzaXplb2YoKnNxZXMpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgICAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUUVTKTtcbitcdGlmIChzcWVzID09IE1BUF9GQUlMRUQpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHNxX3RhaWwgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopc3EgKyBwLnNxX29mZi50YWlsKTtcbitcdHNxX2FycmF5ID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYuYXJyYXkpO1xuK1xuK1x0bWVtc2V0KFx1MDAyNnNxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7XG4rXHRzcWVzWzBdLm9wY29kZSA9IElPUklOR19PUF9QT0xMX0FERDtcbitcdHNxZXNbMF0uZmQgPSB0cmlnZ2VyX2ZkO1xuK1x0c3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pO1xuK1xuK1x0c3FfYXJyYXlbMF0gPSAwO1xuK1x0X19hdG9taWNfc3RvcmVfbihzcV90YWlsLCAxLCBfX0FUT01JQ19SRUxFQVNFKTtcbitcbitcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHQvKiBEZWxpYmVyYXRlbHkgbGVha2VkLCB3ZSBhcmUgYWJvdXQgdG8gY3Jhc2guICovXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlXG4rICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvXG4rICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLlxuKyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuXG4rICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLlxuKyAqL1xuK3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpXG4re1xuK1x0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0aW50IGZkLCBpO1xuK1xuK1x0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSxcbitcdFx0ICBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKGZ0cnVuY2F0ZShmZCwgKG9mZl90KU5PVElGWV9TSUdOQUxfTUFQX0NPVU5UICogcGdzeikpIHtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5PVElGWV9TSUdOQUxfTUFQX0NPVU5UOyBpKyspIHtcbitcdFx0aW50IHByb3QgPSAoaSBcdTAwMjYgMSkgPyBQUk9UX1JFQUQgOiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7XG4rXG4rXHRcdGlmIChtbWFwKE5VTEwsIHBnc3osIHByb3QsIE1BUF9QUklWQVRFLCBmZCxcbitcdFx0XHQgKG9mZl90KWkgKiBwZ3N6KSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGJyZWFrO1xuK1x0fVxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIGk7XG4rfVxuK1xuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKVxuK3tcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdHVuc2lnbmVkIGNoYXIgKnA7XG4rXHRpbnQgdHJpZ2dlcl9mZDtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmO1xuK1xuK1x0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXIncyBvcGVuKCkgY2Fubm90IGJsb2NrLiAqL1xuK1x0dHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1xuK1x0LyogRXhpdCByYXRoZXIgdGhhbiBjcmFzaDogYSBkdW1wIHdpdGhvdXQgdGhlIHBvbGwgYXJtZWQgcHJvdmVzIG5vdGhpbmcuICovXG4rXHRpZiAodHJpZ2dlcl9mZCBcdTAwM2MgMClcbitcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcbitcdGlmIChtYWtlX2ZpbGVfbWFwcGluZ3MoKSBcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbitcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRmb3IgKG9mZiA9IDA7IG9mZiBcdTAwM2MgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTOyBvZmYgKz0gcGdzeilcbitcdFx0cFtvZmZdID0gMTtcbitcbitcdGlmIChhcm1fcG9sbF9ub3RpZnkodHJpZ2dlcl9mZCkpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4rXHQqKHZvbGF0aWxlIGludCAqKU5VTEwgPSAwO1xuK1x0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbit9XG4rXG4rc3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBvcGVuIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRpZiAod3JpdGUoZmQsIFwieFwiLCAxKSAhPSAxKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiB3cml0ZSBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBwaGRyWzBdIGlzIHRoZSBQVF9OT1RFIGVudHJ5OiBlbGZfY29yZV9kdW1wKCkgZW1pdHMgaXQgcmlnaHQgYWZ0ZXIgdGhlXG4rICogRUxGIGhlYWRlci4gSXRzIHBfb2Zmc2V0IGlzIHdoZXJlIHRoZSBub3RlcyBiZWdpbi5cbisgKi9cbitzdGF0aWMgbG9uZyBsb25nIG5vdGVfb2Zmc2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkcilcbit7XG4rXHRFbGZXKFBoZHIpIHBoO1xuK1x0RWxmVyhFaGRyKSBlaDtcbitcbitcdG1lbWNweShcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcbitcdGlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0bWVtY3B5KFx1MDAyNnBoLCBoZHIgKyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTtcbitcdGlmIChwaC5wX3R5cGUgIT0gUFRfTk9URSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIChsb25nIGxvbmcpcGgucF9vZmZzZXQ7XG4rfVxuK1xuKy8qXG4rICogRHJhaW4gYSBjb3JlZHVtcCBvZmYgQGZkLCBjb3VudGluZyB3aGF0IGFycml2ZXMuIE9uY2UgdGhlIG5vdGVzIGhhdmVcbisgKiBzdGFydGVkIHRoZSBrZXJuZWwgaXMgaW5zaWRlIHRoZSBvbmUgYmlnIG5vdGUgd3JpdGUsIHNvIHBva2UgdGhlIGZpZm9cbisgKiB0aGUgY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIGFuZCBzdG9wIHJlYWRpbmcsIHdoaWNoIGtlZXBzIHRoZVxuKyAqIHRyYW5zcG9ydCBmdWxsIGFuZCB0aGUgd3JpdGUgYmxvY2tlZCB3aXRoIGEgcGFydGlhbCBjb3VudCB3aGVuIHRoZVxuKyAqIHdha2V1cCBsYW5kcy4gVGhlbiBjYXJyeSBvbiB0byBlbmQgb2YgZmlsZS5cbisgKlxuKyAqIFdoYXQgYXJyaXZlcyBpcyB3cml0dGVuIHRvIEBmZF9vdXQgd2hlbiB0aGF0IGlzIG5vdCBuZWdhdGl2ZS5cbisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xLiBGYWlsaW5nIHRvIHRyaXAgdGhlIGZpZm9cbisgKiBpcyBhbiBlcnJvciB0b286IGEgZHVtcCB0aGF0IHdhcyBuZXZlciBpbnRlcnJ1cHRlZCBwcm92ZXMgbm90aGluZy5cbisgKi9cbitzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgaGRyW3NpemVvZihFbGZXKEVoZHIpKSArIHNpemVvZihFbGZXKFBoZHIpKV07XG4rXHRzdGF0aWMgY2hhciBidWZbNjQgXHUwMDNjXHUwMDNjIDEwXTtcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGxvbmcgbG9uZyBub3RlX29mZiA9IDA7XG4rXHRzaXplX3QgaGRybGVuID0gMDtcbitcdHNzaXplX3QgdG90YWwgPSAwO1xuK1x0Ym9vbCBhcm1lZCA9IGZhbHNlO1xuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTtcbitcbitcdFx0aWYgKG4gXHUwMDNjIDApIHtcbitcdFx0XHRpZiAoZXJybm8gPT0gRUlOVFIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRyZXR1cm4gLTE7XG4rXHRcdH1cbitcdFx0aWYgKG4gPT0gMClcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKGZkX291dCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2IHdyaXRlKGZkX291dCwgYnVmLCBuKSAhPSBuKVxuK1x0XHRcdHJldHVybiAtMTtcbitcbitcdFx0aWYgKGhkcmxlbiBcdTAwM2Mgc2l6ZW9mKGhkcikpIHtcbitcdFx0XHRzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuO1xuK1xuK1x0XHRcdGlmICh3YW50IFx1MDAzZSAoc2l6ZV90KW4pXG4rXHRcdFx0XHR3YW50ID0gKHNpemVfdCluO1xuK1x0XHRcdG1lbWNweShoZHIgKyBoZHJsZW4sIGJ1Ziwgd2FudCk7XG4rXHRcdFx0aGRybGVuICs9IHdhbnQ7XG4rXHRcdFx0aWYgKGhkcmxlbiA9PSBzaXplb2YoaGRyKSlcbitcdFx0XHRcdG5vdGVfb2ZmID0gbm90ZV9vZmZzZXQoaGRyKTtcbitcdFx0fVxuK1xuK1x0XHR0b3RhbCArPSBuO1xuK1xuK1x0XHRpZiAoYXJtIFx1MDAyNlx1MDAyNiAhYXJtZWQgXHUwMDI2XHUwMDI2IG5vdGVfb2ZmIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgdG90YWwgXHUwMDNlIG5vdGVfb2ZmICsgKGxvbmcgbG9uZylwZ3N6KSB7XG4rXHRcdFx0aWYgKHB1bGxfdHJpZ2dlcigpKVxuK1x0XHRcdFx0cmV0dXJuIC0xO1xuK1x0XHRcdGFybWVkID0gdHJ1ZTtcbitcdFx0XHR1c2xlZXAoTk9USUZZX1NJR05BTF9TVEFMTF9VUyk7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChhcm0gXHUwMDI2XHUwMDI2ICFhcm1lZClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0dXJuIHRvdGFsO1xuK31cbitcbisvKlxuKyAqIEhvdyBsYXJnZSB0aGUgZHVtcCB3YXMgbWVhbnQgdG8gYmUuIFRoZSBFTEYgaGVhZGVyIGFuZCB0aGUgcHJvZ3JhbVxuKyAqIGhlYWRlcnMgYXJlIHRoZSBmaXJzdCB0aGluZyBlbWl0dGVkLCBzbyBldmVuIGEgdHJ1bmNhdGVkIGR1bXAgc2F5cyBob3dcbisgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCArIHBfZmlsZXN6KS5cbisgKlxuKyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyXG4rICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLVx1MDAzZXRvX3NraXAsIGVsZl9jb3JlX2R1bXAoKVxuKyAqIGhhcyBubyBmbHVzaCBhZnRlciB0aGUgbGFzdCBkdW1wX3VzZXJfcmFuZ2UoKSBhbmQgYSBwaXBlIGNhbm5vdCBzZWVrLFxuKyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcbisgKiBhbmQgdnN5c2NhbGw9eG9ubHkgbGVhdmVzIG5vIHBhZ2UgYmVoaW5kIGl0LCBzbyBhIHdob2xlIGR1bXAgaXMgb25lXG4rICogcGFnZSBzaG9ydCBvZiB3aGF0IHRoZSBoZWFkZXJzIHByb21pc2UuIEB0YWlsIHJldHVybnMgdGhlIHNpemUgb2YgdGhhdFxuKyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXG4rICovXG4rbG9uZyBsb25nIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoY29uc3QgY2hhciAqcGF0aCwgbG9uZyBsb25nICp0YWlsKVxuK3tcbitcdEVsZlcoUGhkcikgKnBoZHIgPSBOVUxMO1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkID0gMDtcbitcdHVuc2lnbmVkIGludCBucGhkciwgaTtcbitcdEVsZlcoRWhkcikgZWg7XG4rXHRpbnQgZmQ7XG4rXG4rXHQqdGFpbCA9IDA7XG4rXG4rXHRmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocmVhZChmZCwgXHUwMDI2ZWgsIHNpemVvZihlaCkpICE9IHNpemVvZihlaCkpXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmICghZWguZV9waG51bSB8fCBlaC5lX3BoZW50c2l6ZSAhPSBzaXplb2YoKnBoZHIpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdG5waGRyID0gZWguZV9waG51bTtcbitcdHBoZHIgPSBjYWxsb2MobnBoZHIsIHNpemVvZigqcGhkcikpO1xuK1x0aWYgKCFwaGRyKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPVxuK1x0ICAgIChzc2l6ZV90KSgoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSkpXG4rXHRcdGdvdG8gZXJyO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnBoZHI7IGkrKykge1xuK1x0XHRsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICtcbitcdFx0XHRcdChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0aWYgKGVuZCBcdTAwM2UgZXhwZWN0ZWQpIHtcbitcdFx0XHRleHBlY3RlZCA9IGVuZDtcbitcdFx0XHQqdGFpbCA9IChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0fVxuK1x0fVxuK1xuK1x0ZnJlZShwaGRyKTtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBleHBlY3RlZDtcbitlcnI6XG4rXHRmcmVlKHBoZHIpO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIC0xO1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMyOjQyLjAxMjQzMDUwMVoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjA0NjQ3MTI4MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIGluIGZyb250IG9mIG1lIHRoYXQgYWltcyB0byBmaXggYSBuYXN0eSBidWcuIEFwcGFyZW50bHksIGBUSUZfTk9USUZZX1NJR05BTGAgd2FzIGFibGUgdG8gaW50ZXJydXB0IGNvcmVkdW1wcyBhbmQgU01CIHNlbmRzLCB3aGljaCBpcyBvYnZpb3VzbHkgbm90IGlkZWFsLiBUaGUgZml4IGludHJvZHVjZXMgYG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpYCBhbmQgYG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZSgpYCB0byBtYXNrIHRoYXQgc2lnbmFsIGJ5IHNldHRpbmcgYSBmbGFnLCBgUEZfTk9fTk9USUZZX1NJR05BTGAsIGluIHRoZSBgY3VycmVudC1cdTAwM2VmbGFnc2AuIFRoZSBjaGFuZ2VzIGFyZSBmb2N1c2VkIGluIGBmcy9jb3JlZHVtcC5jYCBhbmQgYGZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNgLCBzcGVjaWZpY2FsbHkgYHZmc19jb3JlZHVtcCgpYCBhbmQgYHNtYl9zZW5kX2t2ZWMoKWAgcmVzcGVjdGl2ZWx5LiBJdCBhbHNvIGNvbWVzIHdpdGggYSBzZWxmdGVzdCBmb3IgY29yZWR1bXAsIHdoaWNoIGlzIGdvb2QuXG5cbk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyBuYWlsIGRvd24gYW55IHBvdGVudGlhbCBVTklOSVRJQUxJWkVEIE1FTU9SWSBpc3N1ZXMuIFdlJ3JlIGRlYWxpbmcgd2l0aCB0YXNrIGZsYWdzIGFuZCBzaWduYWwgaGFuZGxpbmcgaGVyZSwgc3BlY2lmaWNhbGx5IHByZXZlbnRpbmcgYSBzaWduYWwgZnJvbSBwcmVtYXR1cmVseSBhYm9ydGluZyB0aGluZ3MuIE5vIG5ldyBzdHJ1Y3R1cmVzLCBubyBuZXcgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2UsIG5vIG5ldyBib3VuZHMgY2hlY2tzIG9yIGxlbmd0aCBtb2RpZmljYXRpb25zLiBUaGlzIGlzICpwdXJlbHkqIGNvbnRyb2wgZmxvdyBhcm91bmQgc2lnbmFsIGludGVycnVwdGlvbi5cblxuU28sIGRvZXMgdGhpcyBpbnRyb2R1Y2UgKmFueSogdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IEknbSBub3Qgc2VlaW5nIGl0LiBJIG1lYW4sIHdlJ3JlIG5vdCB0b3VjaGluZyBkYXRhIGluIGEgd2F5IHRoYXQgY291bGQgbGVhZCB0byByZWFkcyBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBXZSdyZSBqdXN0IG1vZGlmeWluZyAqd2hlbiogY2VydGFpbiBvcGVyYXRpb25zIGdldCBpbnRlcnJ1cHRlZC5cblxuTGV0J3MgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhlIGNvZGUgc25pcHBldHMsIGp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLlxuXG5JbiBgZnMvY29yZWR1bXAuY2AsIHdlIGhhdmU6XG5cbmBgYGNcbitcdC8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqL1xuK1x0bm90aWZ5X2ZsYWdzID0gbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCk7XG4gXHRzY29wZWRfd2l0aF9jcmVkcyhjcmVkKVxuIFx0XHRkb19jb3JlZHVtcChcdTAwMjZjbiwgXHUwMDI2Y3BybSwgXHUwMDI2YXJndiwgXHUwMDI2YXJnYywgYmluZm10KTtcbiBcdGNvcmVkdW1wX2NsZWFudXAoXHUwMDI2Y24sIFx1MDAyNmNwcm0pO1xuK1x0bm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7XG5gYGBcblxuQmFzaWNhbGx5LCB3ZSdyZSBtYWtpbmcgc3VyZSBgZG9fY29yZWR1bXBgIGlzICpub3QqIHByZW1hdHVyZWx5IGludGVycnVwdGVkIGJ5IGBUSUZfTk9USUZZX1NJR05BTGAuIFBlcmZlY3RseSByZWFzb25hYmxlLlxuXG5JbiBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2A6XG5cbmBgYGNcbitcdFx0bm90aWZ5X2ZsYWdzID0gbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCk7XG4gXHRcdHJjID0gc29ja19zZW5kbXNnKHNzb2NrZXQsIHNtYl9tc2cpO1xuLVx0XHRpZiAocmMgPT0gLUVBR0FJTiB8fCB1bmxpa2VseShyYyA9PSAtRUlOVFIgXHUwMDI2XHUwMDI2IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkge1xuK1x0XHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbitcdFx0aWYgKHJjID09IC1FQUdBSU4pIHtcbmBgYFxuXG5BZ2Fpbiwgc2FtZSBwcmluY2lwbGUuIFByZXZlbnRpbmcgdGhlIHNpZ25hbCBmcm9tIGludGVycnVwdGluZyB0aGUgYHNvY2tfc2VuZG1zZ2AgY2FsbC4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UgaGVyZSBlaXRoZXIuXG5cblNvLCBib3R0b20gbGluZTogbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlzay4gVGhpcyBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGFib3V0IHRhc2sgZmxhZ3MgYW5kIHNpZ25hbCBoYW5kbGluZy4gVGhlcmUncyB6ZXJvIGNoYW5jZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBiZWNhdXNlIG9mIHRoZXNlIGNoYW5nZXMuIFRodXMsIHRoaXMgZG9lc24ndCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGNhbXBhaWduLiBLQVNBTiBhbmQgb3RoZXIgdG9vbHMgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBpc3N1ZXMuXG5cbk9rYXksIGxldCdzIGZvcm11bGF0ZSB0aGlzIHN1Y2NpbmN0bHkgYW5kIGNhbGwgaXQgYSBkYXkuXG5cbioqUmVhc29uaW5nOioqXG5cblRoZSBwYXRjaCBtb2RpZmllcyBzaWduYWwgaGFuZGxpbmcgYmVoYXZpb3IgYnkgaW50cm9kdWNpbmcgYFBGX05PX05PVElGWV9TSUdOQUxgIHRvIHByZXZlbnQgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBjb3JlZHVtcHMgKGB2ZnNfY29yZWR1bXBgKSBhbmQgU01CIHNlbmQgb3BlcmF0aW9ucyAoYHNtYl9zZW5kX2t2ZWNgKS4gVGhlIGNoYW5nZXMgYXJlIHB1cmVseSByZWxhdGVkIHRvIHRhc2sgZmxhZ3MsIGNvbnRyb2wgZmxvdywgYW5kIHNpZ25hbCBtYXNraW5nIHRvIGF2b2lkIHByZW1hdHVyZSBhYm9ydHMgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBubyBuZXcgZmllbGRzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBidWZmZXIgbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGFyZSBhbHRlcmVkIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3IgbG9naWMgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMuXG5cbkFscmlnaHQsIGBzZXQtcmVzdWx0c2AuIERvbmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDU4LCJPdXRwdXRUb2tlbnMiOjE5MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMyOjU0LjA1ODkwNTE2NFoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgc2lnbmFsIGhhbmRsaW5nIGJlaGF2aW9yIGJ5IGludHJvZHVjaW5nIGBQRl9OT19OT1RJRllfU0lHTkFMYCB0byBwcmV2ZW50IGBUSUZfTk9USUZZX1NJR05BTGAgZnJvbSBpbnRlcnJ1cHRpbmcgY29yZWR1bXBzIChgdmZzX2NvcmVkdW1wYCkgYW5kIFNNQiBzZW5kIG9wZXJhdGlvbnMgKGBzbWJfc2VuZF9rdmVjYCkuIFRoZSBjaGFuZ2VzIGFyZSBwdXJlbHkgcmVsYXRlZCB0byB0YXNrIGZsYWdzLCBjb250cm9sIGZsb3csIGFuZCBzaWduYWwgbWFza2luZyB0byBhdm9pZCBwcmVtYXR1cmUgYWJvcnRzIG9mIHRoZXNlIG9wZXJhdGlvbnMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgbm8gbmV3IGZpZWxkcyBhcmUgc2VudCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gYnVmZmVyIGxlbmd0aHMgb3IgYm91bmRzIGNoZWNrcyBhcmUgYWx0ZXJlZCBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiBTdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uIG9yIGxvZ2ljIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-18 11:29:47 +0000 UTC FinishedAt: 2026-08-18 11:32:56 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "drm-next", "tree_url": "https://gitlab.freedesktop.org/drm/kernel.git", "commit_hash": "8d3ae59288f1e7d58d76558a6ee96d533bc5019f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP", "CIFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "drm-next", "tree_url": "https://gitlab.freedesktop.org/drm/kernel.git", "commit_hash": "8d3ae59288f1e7d58d76558a6ee96d533bc5019f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP", "CIFS" ], "series_id": "b84b1a73-2c94-48c2-a75a-e79de6770866" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "vfs_coredump", "smb_send_kvec" ], "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", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDssCiAgICAmIzM0O0NJRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OywKICAgICYjMzQ7c21iX3NlbmRfa3ZlYyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG1lY2hhbmlzbSB0byBwcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHNwZWNpZmljIHRhc2tzLCBzcGVjaWZpY2FsbHkgZHVyaW5nIGNvcmVkdW1wIGdlbmVyYXRpb24gYW5kIFNNQiBuZXR3b3JrIHRyYW5zbWlzc2lvbi4gSXQgYWRkcyBQRl9OT19OT1RJRllfU0lHTkFMIHRvIHRhc2sgZmxhZ3MgYW5kIG1vZGlmaWVzIHNpZ25hbF9wZW5kaW5nKCkgdG8gcmVzcGVjdCBpdC4gVGhlIGNvcmUgY2hhbmdlcyBhcmUgaW4gdmZzX2NvcmVkdW1wKCkgYW5kIHNtYl9zZW5kX2t2ZWMoKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCB0aGUgU01CIGNsaWVudCBkcml2ZXIsIHdoaWNoIGFyZSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2OGU0MWEzYzljZTIyMGZlMTM1NzJmZDQ5NDViNmRhZWU1NWJlMGNlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMTE6MzE6MjEgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcbmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0XG4tLS0gYS9mcy9jb3JlZHVtcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9jb3JlZHVtcC5jXG5AQCAtMTE2NSw2ICYjNDM7MTE2NSw3IEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRzdHJ1Y3QgY29yZV9uYW1lIGNuO1xuIFx0Y29uc3Qgc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LVx1MDAzZW1tO1xuIFx0Y29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10ID0gbW0tXHUwMDNlYmluZm10O1xuJiM0MztcdHVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7XG4gXHRpbnQgYXJnYyA9IDA7XG4gXHRzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zIGNwcm0gPSB7XG4gXHRcdC5zaWdpbmZvID0gc2lnaW5mbyxcbkBAIC0xMTk2LDkgJiM0MzsxMTk3LDEyIEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRpZiAoY29yZWR1bXBfd2FpdChzaWdpbmZvLVx1MDAzZXNpX3NpZ25vLCBcdTAwMjZjb3JlX3N0YXRlKSBcdTAwM2MgMClcbiBcdFx0cmV0dXJuO1xuIFxuJiM0MztcdC8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqL1xuJiM0MztcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0c2NvcGVkX3dpdGhfY3JlZHMoY3JlZClcbiBcdFx0ZG9fY29yZWR1bXAoXHUwMDI2Y24sIFx1MDAyNmNwcm0sIFx1MDAyNmFyZ3YsIFx1MDAyNmFyZ2MsIGJpbmZtdCk7XG4gXHRjb3JlZHVtcF9jbGVhbnVwKFx1MDAyNmNuLCBcdTAwMjZjcHJtKTtcbiYjNDM7XHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbiBcdHJldHVybjtcbiB9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XG4tLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG5AQCAtMjIsNyAmIzQzOzIyLDYgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1wb29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gI2luY2x1ZGUgXCYjMzQ7Y2lmc2dsb2IuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O2NpZnNwcm90by5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7Y2lmc19kZWJ1Zy5oXCYjMzQ7XG5AQCAtMTQyLDYgJiM0MzsxNDEsNyBAQCBpbnRcbiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZyxcbiBcdCAgICAgIHNpemVfdCAqc2VudClcbiB7XG4mIzQzO1x0dW5zaWduZWQgaW50IG5vdGlmeV9mbGFncztcbiBcdGludCByYyA9IDA7XG4gXHRpbnQgcmV0cmllcyA9IDA7XG4gXHRzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0ID0gc2VydmVyLVx1MDAzZXNzb2NrZXQ7XG5AQCAtMTcyLDE1ICYjNDM7MTcyLDEyIEBAIHNtYl9zZW5kX2t2ZWMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3QgbXNnaGRyICpzbWJfbXNnLFxuIFx0XHQgKiBhZnRlciB0aGUgcmV0cmllcyB3ZSB3aWxsIGtpbGwgdGhlIHNvY2tldCBhbmRcbiBcdFx0ICogcmVjb25uZWN0IHdoaWNoIG1heSBjbGVhciB0aGUgbmV0d29yayBwcm9ibGVtLlxuIFx0XHQgKlxuLVx0XHQgKiBFdmVuIGlmIHJlZ3VsYXIgc2lnbmFscyBhcmUgbWFza2VkLCBFSU5UUiBtaWdodCBiZVxuLVx0XHQgKiBwcm9wYWdhdGVkIGZyb20gc2tfc3RyZWFtX3dhaXRfbWVtb3J5KCkgdG8gaGVyZSB3aGVuXG4tXHRcdCAqIFRJRl9OT1RJRllfU0lHTkFMIGlzIHVzZWQgZm9yIHRhc2sgd29yay4gRm9yIGV4YW1wbGUsXG4tXHRcdCAqIGNlcnRhaW4gaW9fdXJpbmcgY29tcGxldGlvbnMgd2lsbCB1c2UgdGhhdC4gVHJlYXRcbi1cdFx0ICogaGF2aW5nIEVJTlRSIHdpdGggcGVuZGluZyB0YXNrIHdvcmsgdGhlIHNhbWUgYXMgRUFHQUlOXG4tXHRcdCAqIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlY29ubmVjdHMuXG4mIzQzO1x0XHQgKiBUYXNrIHdvcmsgbXVzdCBub3QgYWJvcnQgdGhlIHNlbmQsIHNlZSBzaWduYWxfcGVuZGluZygpLlxuIFx0XHQgKi9cbiYjNDM7XHRcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0XHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcbi1cdFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFx1MDAyNlx1MDAyNiB0YXNrX3dvcmtfcGVuZGluZyhjdXJyZW50KSkpIHtcbiYjNDM7XHRcdG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZShub3RpZnlfZmxhZ3MpO1xuJiM0MztcdFx0aWYgKHJjID09IC1FQUdBSU4pIHtcbiBcdFx0XHRyZXRyaWVzJiM0MzsmIzQzOztcbiBcdFx0XHRpZiAocmV0cmllcyBcdTAwM2U9IDE0IHx8XG4gXHRcdFx0ICAgICghc2VydmVyLVx1MDAzZW5vYmxvY2tzbmQgXHUwMDI2XHUwMDI2IChyZXRyaWVzIFx1MDAzZSAyKSkpIHtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcbmluZGV4IDM3M2JjYzA1OThkMTAuLmZkNzJjYTRlZTkyZjIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuQEAgLTE3OTYsNyAmIzQzOzE3OTYsNyBAQCBleHRlcm4gc3RydWN0IHBpZCAqY2FkX3BpZDtcbiBcdFx0XHRcdFx0XHQgKiBJIGFtIGNsZWFuaW5nIGRpcnR5IHBhZ2VzIGZyb20gc29tZSBvdGhlciBiZGkuICovXG4gI2RlZmluZSBQRl9LVEhSRUFEXHRcdDB4MDAyMDAwMDBcdC8qIEkgYW0gYSBrZXJuZWwgdGhyZWFkICovXG4gI2RlZmluZSBQRl9SQU5ET01JWkVcdFx0MHgwMDQwMDAwMFx0LyogUmFuZG9taXplIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqL1xuLSNkZWZpbmUgUEZfX0hPTEVfXzAwODAwMDAwXHQweDAwODAwMDAwXG4mIzQzOyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFx0MHgwMDgwMDAwMFx0Lyogc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpICovXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcdDB4MDEwMDAwMDBcbiAjZGVmaW5lIFBGX19IT0xFX18wMjAwMDAwMFx0MHgwMjAwMDAwMFxuICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFlcdDB4MDQwMDAwMDBcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li4zMTgyZGU0ZmY5NDgyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTM4NCwxNCAmIzQzOzM4NCwzMSBAQCBzdGF0aWMgaW5saW5lIGludCB0YXNrX3NpZ3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKVxuIFx0cmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTtcbiB9XG4gXG4mIzQzOy8qIFByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhpcyB0YXNrLiAqL1xuJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub19ub3RpZnlfc2lnbmFsX3NhdmUodm9pZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX05PX05PVElGWV9TSUdOQUw7XG4mIzQzO1xuJiM0MztcdGN1cnJlbnQtXHUwMDNlZmxhZ3MgfD0gUEZfTk9fTk9USUZZX1NJR05BTDtcbiYjNDM7XHRyZXR1cm4gZmxhZ3M7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlc3RvcmUgVElGX05PVElGWV9TSUdOQUwuICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0Y3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIGludCBzaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXG4ge1xuIFx0LypcbiBcdCAqIFRJRl9OT1RJRllfU0lHTkFMIGlzbiYjMzk7dCByZWFsbHkgYSBzaWduYWwsIGJ1dCBpdCByZXF1aXJlcyB0aGUgc2FtZVxuIFx0ICogYmVoYXZpb3IgaW4gdGVybXMgb2YgZW5zdXJpbmcgdGhhdCB3ZSBicmVhayBvdXQgb2Ygd2FpdCBsb29wc1xuLVx0ICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLlxuJiM0MztcdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC4gTm90IGZvciBhIHRhc2tcbiYjNDM7XHQgKiB0aGF0IGFza2VkIG5vdCB0byBiZSBpbnRlcnJ1cHRlZCBieSBpdCwgc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpLlxuIFx0ICovXG4tXHRpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05PVElGWV9TSUdOQUwpKSlcbiYjNDM7XHRpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05PVElGWV9TSUdOQUwpKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgbGlrZWx5KCEoUkVBRF9PTkNFKHAtXHUwMDNlZmxhZ3MpIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXG4gXHRcdHJldHVybiAxO1xuIFx0cmV0dXJuIHRhc2tfc2lncGVuZGluZyhwKTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uNzI4ZjNjMzQyZWI5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyAmIzQzOzMsMTAgQEAgQ0ZMQUdTICYjNDM7PSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxuIFxuIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFxcXG4gXHRcdCAgY29yZWR1bXBfc29ja2V0X3Rlc3QgXFxcbi1cdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxuJiM0MztcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuJiM0MztcdFx0ICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RcbiYjNDM7IyBTcGF3bmVkIGJ5IHRoZSBrZXJuZWwgYXMgdGhlIHxoZWxwZXIsIG5vdCBhIHRlc3Qgb2YgaXRzIG93bi5cbiYjNDM7VEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcbiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcFxuIFxuIGluY2x1ZGUgLi4vbGliLm1rXG5AQCAtMTEsMyAmIzQzOzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWtcbiAkKE9VVFBVVCkvc3RhY2tkdW1wX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiYjNDM7JChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiYjNDM7JChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxuQEAgLTAsMCAmIzQzOzEsMjkgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0hcbiYjNDM7I2RlZmluZSBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBEZWZpbmUgYSBidW5jaCBvZiBjb25zdGFudHMgd2UgbmVlZC4gV2UgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZVxuJiM0MzsgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0JiMzOTtzIHdheSBiZXlvbmQgdGhlIGRlZmF1bHQgNjRLXG4mIzQzOyAqIHBpcGUgcmluZyBhbmQgcGFzdCB0aGUgfjM2SyBhbiBhZl91bml4IHNrYiBob2xkcy4gU28gd2UgZm9yY2UgYSB3cml0ZVxuJiM0MzsgKiB0byBjb21lIGJhY2sgc2hvcnQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfTUFQX0NPVU5UXHRcdDQwMDBcbiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX0FOT05fQllURVNcdCg0VUwgXHUwMDNjXHUwMDNjIDIwKVxuJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfU1RBTExfVVNcdFx0MjAwMDAwXG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBGSUxFXHRcdFwmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9UUklHR0VSXHRcdFwmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEVcdFx0XCYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmVcJiMzNDtcbiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRVx0XCYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9TT0NLRVRcdFx0XCYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFwmIzM0O1xuJiM0MztcbiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpO1xuJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKTtcbiYjNDM7c3NpemVfdCByZWN2X2NvcmVkdW1wX25vdGlmeV9zaWduYWwoaW50IGZkLCBpbnQgZmRfb3V0LCBib29sIGFybSk7XG4mIzQzO2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCk7XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0ggKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjg0OWY1YzFlYTczNjVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcbkBAIC0wLDAgJiM0MzsxLDQ2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgfGhlbHBlciBoYWxmIG9mIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC4gVGhlIGtlcm5lbCBzcGF3bnMgdGhpc1xuJiM0MzsgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LlxuJiM0MzsgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXG4mIzQzOyAqIGNyYXNoaW5nIHRhc2sgaXMgcG9sbGluZyBzbyBUSUZfTk9USUZZX1NJR05BTCBpcyByYWlzZWQgd2hpbGUgdGhlIG5vdGVcbiYjNDM7ICogd3JpdGUgaXMgaW4gZmxpZ2h0LlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkX2NvcmVfZmlsZTtcbiYjNDM7XHRzc2l6ZV90IHJldDtcbiYjNDM7XG4mIzQzO1x0ZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSxcbiYjNDM7XHRcdFx0ICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApO1xuJiM0MztcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBhcmd2WzBdKTtcbiYjNDM7XHRcdHJldHVybiBFWElUX0ZBSUxVUkU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSByZWN2X2NvcmVkdW1wX25vdGlmeV9zaWduYWwoU1RESU5fRklMRU5PLCBmZF9jb3JlX2ZpbGUsIHRydWUpO1xuJiM0MztcdGNsb3NlKGZkX2NvcmVfZmlsZSk7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUgdGVzdCBwb2xscyBmb3IgdGhpcyBuYW1lLCBzbyBvbmx5IGNyZWF0ZSBpdCBvbmNlIGl0IGlzIHdob2xlLiAqL1xuJiM0MztcdGlmIChyZW5hbWUoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZW5hbWUgZmFpbGVkOiAlbVxcblwmIzM0OywgYXJndlswXSk7XG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBFWElUX1NVQ0NFU1M7XG4mIzQzO1xuJiM0MztlcnI6XG4mIzQzO1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbiYjNDM7XHRyZXR1cm4gRVhJVF9GQUlMVVJFO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2M2MwNmE4MTU2MmZcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jXG5AQCAtMCwwICYjNDM7MSwyNDUgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEEgY29yZWR1bXAgaXMgbWVhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgU0lHS0lMTCBhbmQgYnkgdGhlIGZyZWV6ZXIgYW5kXG4mIzQzOyAqIGJ5IG5vdGhpbmcgZWxzZS4gZHVtcF9pbnRlcnJ1cHRlZCgpIHNheXMgc28sIGJ1dCB0aGUgYmxvY2tpbmcgd2FpdHNcbiYjNDM7ICogdW5kZXJuZWF0aCBpdCB0ZXN0IHNpZ25hbF9wZW5kaW5nKCksIHdoaWNoIGlzIGFsc28gdHJ1ZSBmb3JcbiYjNDM7ICogVElGX05PVElGWV9TSUdOQUwuIEEgY3Jhc2hpbmcgdGFzayB0aGF0IGhhcyBhbiBpb191cmluZyBjb21wbGV0aW9uIGxhbmRcbiYjNDM7ICogb24gaXQgbWlkLWR1bXAgdGhlcmVmb3JlIGtlZXBzIGR1bXBpbmcgd2hpbGUgZXZlcnkgd2FpdCBpdCBlbnRlcnMgYmFpbHNcbiYjNDM7ICogb3V0IGF0IG9uY2UsIGFuZCB0aGUgZHVtcCBpcyBzaWxlbnRseSBjdXQgc2hvcnQuIE5vdGhpbmcgcmVwb3J0cyBpdDpcbiYjNDM7ICogYmluZm10X2VsZiBzZXRzIGhhc19kdW1wZWQgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gV0NPUkVEVU1QKClcbiYjNDM7ICogc2F5cyB0aGUgZHVtcCB3b3JrZWQuXG4mIzQzOyAqXG4mIzQzOyAqIEEgY29yZWR1bXAgbm90ZSBpcyB0aGUgb25seSBkdW1wX2VtaXQoKSB0aGF0IGV4Y2VlZHMgd2hhdCB0aGUgdHJhbnNwb3J0XG4mIzQzOyAqIHRha2VzIGluIG9uZSBnbywgc28gaXQgaXMgdGhlIG9uZSB3cml0ZSB0aGF0IGlzIGNlcnRhaW4gdG8gYmxvY2suIEJvdGhcbiYjNDM7ICogdGVzdHMgY3Jhc2ggYSBjaGlsZCBob2xkaW5nIGVub3VnaCBmaWxlIGJhY2tlZCBtYXBwaW5ncyBmb3IgaXRzIE5UX0ZJTEVcbiYjNDM7ICogbm90ZSB0byBydW4gcGFzdCB0aGF0LCBhcm0gYW4gaW9fdXJpbmcgcG9sbCBvbiBpdCwgYW5kIHRyaXAgdGhlIHBvbGxcbiYjNDM7ICogd2hpbGUgdGhlIG5vdGUgaXMgYmVpbmcgd3JpdHRlbi4gV2hhdCBjb21lcyBvdXQgaGFzIHRvIGJlIHRoZSB3aG9sZVxuJiM0MzsgKiBkdW1wLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y29yZWR1bXBfdGVzdC5oXCYjMzQ7XG4mIzQzO1xuJiM0MztGSVhUVVJFX1NFVFVQKGNvcmVkdW1wKVxuJiM0Mzt7XG4mIzQzO1x0RklMRSAqZmlsZTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSAtRVNSQ0g7XG4mIzQzO1x0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuJiM0MztcdGZpbGUgPSBmb3BlbihcJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX05FKE5VTEwsIGZpbGUpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBmcmVhZChzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybiwgMSxcbiYjNDM7XHRcdCAgICBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcbiYjNDM7XHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4mIzQzO1x0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XG4mIzQzO1xuJiM0MztcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbiYjNDM7XHRBU1NFUlRfR0Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZjbG9zZShmaWxlKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgcmV0KTtcbiYjNDM7XG4mIzQzO1x0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XG4mIzQzO1x0QVNTRVJUX0VRKG1rZmlmbyhOT1RJRllfU0lHTkFMX1RSSUdHRVIsIDA2MDApLCAwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbiYjNDM7XHRGSUxFICpmaWxlO1xuJiM0MztcdGludCByZXQsIHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciBcdTAwM2UgMCkge1xuJiM0MztcdFx0a2lsbChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFNJR1RFUk0pO1xuJiM0MztcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0fVxuJiM0MztcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfRklMRSk7XG4mIzQzO1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbiYjNDM7XHR1bmxpbmsoTk9USUZZX1NJR05BTF9TT0NLRVQpO1xuJiM0MztcdHVubGluayhOT1RJRllfU0lHTkFMX1RSSUdHRVIpO1xuJiM0MztcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xuJiM0MztcbiYjNDM7XHRmaWxlID0gZm9wZW4oXCYjMzQ7L3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cJiMzNDssIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZmlsZSkge1xuJiM0MztcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXCYjMzQ7O1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gZnByaW50ZihmaWxlLCBcJiMzNDslc1wmIzM0Oywgc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHJlYXNvbiA9IFwmIzM0O1VuYWJsZSB0byB3cml0ZSB0byBjb3JlX3BhdHRlcm5cJiMzNDs7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIGNsb3NlIGNvcmVfcGF0dGVyblwmIzM0OztcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0cmV0ID0gY2xvc2Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdHJlYXNvbiA9IFwmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1wmIzM0OztcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuO1xuJiM0MztmYWlsOlxuJiM0MztcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xuJiM0MztcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xcblwmIzM0OywgcmVhc29uKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ2hlY2sgdGhhdCB3aGF0IHRoZSBoZWxwZXIgb3IgdGhlIHNlcnZlciBzYXZlZCBpcyB0aGUgd2hvbGUgZHVtcC4gT25seVxuJiM0MzsgKiBhIGhvbGUgYXQgdGhlIHZlcnkgZW5kIGNhbiBiZSBtaXNzaW5nLCBzZWUgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZSgpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfd2hvbGVfY29yZWR1bXAoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xuJiM0MztcdHN0cnVjdCBzdGF0IHN0O1xuJiM0MztcbiYjNDM7XHRleHBlY3RlZCA9IGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnRhaWwpO1xuJiM0MztcdEFTU0VSVF9HVChleHBlY3RlZCwgMCk7XG4mIzQzO1x0QVNTRVJUX0VRKHN0YXQoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnN0KSwgMCk7XG4mIzQzO1x0QVNTRVJUX0xFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQpO1xuJiM0MztcdEFTU0VSVF9HRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkIC0gdGFpbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBkdW1wIGdvZXMgdG8gYSB8aGVscGVyLCBzbyB0aGUgcmVhZGVyIGlzIGEgc2VwYXJhdGUgcHJvZ3JhbSB0aGVcbiYjNDM7ICoga2VybmVsIHNwYXducy4gSXQgc2F2ZXMgd2hhdCBpdCByZWNlaXZlZCB0byBOT1RJRllfU0lHTkFMX0NPUkVfRklMRS5cbiYjNDM7ICovXG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgbm90aWZ5X3NpZ25hbF9waXBlKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBwYXR0ZXJuW1BBVEhfTUFYXSwgaGVscGVyW1BBVEhfTUFYXSwgKnA7XG4mIzQzO1x0c3RydWN0IHN0YXQgc3Q7XG4mIzQzO1x0aW50IHN0YXR1cywgaTtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1x0c3NpemVfdCBuO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0U0tJUChyZXR1cm4sIFwmIzM0O2lvX3VyaW5nIG5vdCBhdmFpbGFibGVcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRuID0gcmVhZGxpbmsoXCYjMzQ7L3Byb2Mvc2VsZi9leGVcJiMzNDssIGhlbHBlciwgc2l6ZW9mKGhlbHBlcikgLSAxKTtcbiYjNDM7XHRBU1NFUlRfR1QobiwgMCk7XG4mIzQzO1x0aGVscGVyW25dID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRwID0gc3Ryc3RyKGhlbHBlciwgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTkUocCwgTlVMTCk7XG4mIzQzO1x0QVNTRVJUX0xFKChzaXplX3QpKHAgLSBoZWxwZXIpICYjNDM7IHNpemVvZihcJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlclwmIzM0OyksXG4mIzQzO1x0XHQgIHNpemVvZihoZWxwZXIpKTtcbiYjNDM7XHRzdHJjcHkocCwgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcJiMzNDspO1xuJiM0MztcdGlmIChhY2Nlc3MoaGVscGVyLCBYX09LKSlcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciBub3QgYnVpbHRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcJiMzNDt8JXNcJiMzNDssIGhlbHBlciksXG4mIzQzO1x0XHQgIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbiYjNDM7XHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTtcbiYjNDM7XG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShwaWQsIDApO1xuJiM0MztcdGlmIChwaWQgPT0gMClcbiYjNDM7XHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuJiM0MztcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUga2VybmVsIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBoZWxwZXIsIHNvIHBvbGwgZm9yIGl0LiAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNiBzdC5zdF9zaXplKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcCgxMDAwMDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Y2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi9cbiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcbiYjNDM7e1xuJiM0MztcdHBpZF90IHBpZCwgcGlkX2NvcmVkdW1wX3NlcnZlcjtcbiYjNDM7XHRpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1cztcbiYjNDM7XHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdO1xuJiM0MztcdGNoYXIgYztcbiYjNDM7XG4mIzQzO1x0aWYgKCFjb3JlZHVtcF9pb191cmluZ19hdmFpbGFibGUoKSlcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtpb191cmluZyBub3QgYXZhaWxhYmxlXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsXG4mIzQzO1x0XHRcdCAgICAgaXBjX3NvY2tldHMpLCAwKTtcbiYjNDM7XHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcJiMzNDtAJXNcJiMzNDssXG4mIzQzO1x0XHRcdCAgIE5PVElGWV9TSUdOQUxfU09DS0VUKSwgKGludClzaXplb2YocGF0dGVybikpO1xuJiM0MztcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuJiM0MztcbiYjNDM7XHRwaWRfY29yZWR1bXBfc2VydmVyID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTtcbiYjNDM7XHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XG4mIzQzO1x0XHRpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xO1xuJiM0MztcdFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbiYjNDM7XG4mIzQzO1x0XHRjbG9zZShpcGNfc29ja2V0c1swXSk7XG4mIzQzO1xuJiM0MztcdFx0ZmRfc2VydmVyID0gY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoTk9USUZZX1NJR05BTF9TT0NLRVQpO1xuJiM0MztcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpZiAod3JpdGVfbm9pbnRyKGlwY19zb2NrZXRzWzFdLCBcJiMzNDsxXCYjMzQ7LCAxKSBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRjbG9zZShpcGNfc29ja2V0c1sxXSk7XG4mIzQzO1xuJiM0MztcdFx0ZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTtcbiYjNDM7XHRcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdFx0ZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSxcbiYjNDM7XHRcdFx0XHQgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyxcbiYjNDM7XHRcdFx0XHQgICAgMDYwMCk7XG4mIzQzO1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGZkX2NvcmVkdW1wLCBmZF9jb3JlX2ZpbGUsXG4mIzQzO1x0XHRcdFx0XHRcdHRydWUpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4mIzQzO291dDpcbiYjNDM7XHRcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuJiM0MztcdFx0aWYgKGZkX2NvcmVkdW1wIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuJiM0MztcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkX3NlcnZlcik7XG4mIzQzO1x0XHRfZXhpdChleGl0X2NvZGUpO1xuJiM0MztcdH1cbiYjNDM7XHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xuJiM0MztcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcbiYjNDM7XHRBU1NFUlRfRVEocmVhZF9ub2ludHIoaXBjX3NvY2tldHNbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcbiYjNDM7XG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShwaWQsIDApO1xuJiM0MztcdGlmIChwaWQgPT0gMClcbiYjNDM7XHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuJiM0MztcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbiYjNDM7XG4mIzQzO1x0Y2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbmluZGV4IGVkNDdmMDFmYTUzYzUuLjA2Zjk5N2JhNDdmZDkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxuQEAgLTksNiAmIzQzOzksNyBAQFxuIFxuICNpbmNsdWRlIFwmIzM0Oy4uL2tzZWxmdGVzdF9oYXJuZXNzLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDsuLi9waWRmZC9waWRmZC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwmIzM0O1xuIFxuICNpZm5kZWYgUEFHRV9TSVpFXG4gI2RlZmluZSBQQUdFX1NJWkUgNDA5NlxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbmluZGV4IDJhMjBmYWY5Y2IwYWQuLjIwZmNjNWI2NDRjMzIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbkBAIC0xLDExICYjNDM7MSwxOCBAQFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gXG4gI2luY2x1ZGUgXHUwMDNjYXNzZXJ0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZWxmLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZW5kaWFuLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbmsuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pb191cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YWIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvcmVkdW1wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0xMyw3ICYjNDM7MjAsOSBAQFxuICNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL2Vwb2xsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuQEAgLTIxLDYgJiM0MzszMCw3IEBAXG4gXG4gI2luY2x1ZGUgXCYjMzQ7Li4vZmlsZXN5c3RlbXMvd3JhcHBlcnMuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0Oy4uL3BpZGZkL3BpZGZkLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXCYjMzQ7XG4gXG4gLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgdG8gYXZvaWQgaW5jbHVkaW5nIGhhcm5lc3MgaGVhZGVyICovXG4gc3RydWN0IF9fdGVzdF9tZXRhZGF0YTtcbkBAIC0zODEsMyAmIzQzOzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcbiBcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuIFx0X2V4aXQoZXhpdF9jb2RlKTtcbiB9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxuJiM0MzsgKlxuJiM0MzsgKiBfX2R1bXBfZW1pdCgpIHRha2VzIGFueXRoaW5nIHNob3J0IG9mIGEgZnVsbCB3cml0ZSBhcyB0aGUgZW5kIG9mIHRoZVxuJiM0MzsgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcbiYjNDM7ICogb2YgaXQuIFRoZSBOVF9GSUxFIG5vdGUgaXMgdGhlIG9uZSBlbWl0IHRoYXQgaXMgY2VydGFpbiB0byBibG9jayxcbiYjNDM7ICogYmVjYXVzZSBpdCBpcyB0aGUgb25seSBvbmUgbGFyZ2VyIHRoYW4gdGhlIHRyYW5zcG9ydCwgc28gdGhlc2UgaGVscGVyc1xuJiM0MzsgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXG4mIzQzOyAqIHRoZSBkdW1waW5nIHRhc2sgd2hpbGUgdGhhdCB3cml0ZSBpcyBpbiBmbGlnaHQuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBpb191cmluZ19zZXR1cF9yYXcodW5zaWduZWQgaW50IGVudHJpZXMsIHN0cnVjdCBpb191cmluZ19wYXJhbXMgKnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gc3lzY2FsbChfX05SX2lvX3VyaW5nX3NldHVwLCBlbnRyaWVzLCBwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogaW9fdXJpbmcgcmVhZHMgcG9sbDMyX2V2ZW50cyBiYWNrIHRocm91Z2ggc3dhaHczMigpIG9uIGJpZyBlbmRpYW4uICovXG4mIzQzO3N0YXRpYyBfX3UzMiBub3RpZnlfcG9sbF9tYXNrKF9fdTMyIGV2ZW50cylcbiYjNDM7e1xuJiM0MzsjaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpIFx1MDAyNlx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXG4mIzQzO1x0cmV0dXJuIF9fc3dhaHczMihldmVudHMpO1xuJiM0MzsjZWxzZVxuJiM0MztcdHJldHVybiBldmVudHM7XG4mIzQzOyNlbmRpZlxuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRmZCA9IGlvX3VyaW5nX3NldHVwX3JhdygxLCBcdTAwMjZwKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC1cdTAwM2Vub3RpZnlfbWV0aG9kIGF0IFRXQV9TSUdOQUxcbiYjNDM7ICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnNcbiYjNDM7ICogc2V0X25vdGlmeV9zaWduYWwoKSBhZ2FpbnN0IHRoZSB0YXNrIHRoYXQgc3VibWl0dGVkIGl0LiBUaGF0IGlzIHVzLCBhbmRcbiYjNDM7ICogd2UgYXJlIGFib3V0IHRvIGJlY29tZSB0aGUgY29yZWR1bXBpbmcgdGFzay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYXJtX3BvbGxfbm90aWZ5KGludCB0cmlnZ2VyX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4mIzQzO1x0dW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlcztcbiYjNDM7XHRzaXplX3Qgc3FyaW5nX3N6O1xuJiM0MztcdHZvaWQgKnNxO1xuJiM0MztcdGludCByaW5nO1xuJiM0MztcbiYjNDM7XHRyaW5nID0gaW9fdXJpbmdfc2V0dXBfcmF3KDgsIFx1MDAyNnApO1xuJiM0MztcdGlmIChyaW5nIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRzcXJpbmdfc3ogPSBwLnNxX29mZi5hcnJheSAmIzQzOyBwLnNxX2VudHJpZXMgKiBzaXplb2YodW5zaWduZWQgaW50KTtcbiYjNDM7XHRzcSA9IG1tYXAoTlVMTCwgc3FyaW5nX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0ICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRX1JJTkcpO1xuJiM0MztcdGlmIChzcSA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRzcWVzID0gbW1hcChOVUxMLCBwLnNxX2VudHJpZXMgKiBzaXplb2YoKnNxZXMpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0ICAgIE1BUF9TSEFSRUQgfCBNQVBfUE9QVUxBVEUsIHJpbmcsIElPUklOR19PRkZfU1FFUyk7XG4mIzQzO1x0aWYgKHNxZXMgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0c3FfdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi50YWlsKTtcbiYjNDM7XHRzcV9hcnJheSA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi5hcnJheSk7XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZzcWVzWzBdLCAwLCBzaXplb2Yoc3Flc1swXSkpO1xuJiM0MztcdHNxZXNbMF0ub3Bjb2RlID0gSU9SSU5HX09QX1BPTExfQUREO1xuJiM0MztcdHNxZXNbMF0uZmQgPSB0cmlnZ2VyX2ZkO1xuJiM0MztcdHNxZXNbMF0ucG9sbDMyX2V2ZW50cyA9IG5vdGlmeV9wb2xsX21hc2soUE9MTElOKTtcbiYjNDM7XG4mIzQzO1x0c3FfYXJyYXlbMF0gPSAwO1xuJiM0MztcdF9fYXRvbWljX3N0b3JlX24oc3FfdGFpbCwgMSwgX19BVE9NSUNfUkVMRUFTRSk7XG4mIzQzO1xuJiM0MztcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHQvKiBEZWxpYmVyYXRlbHkgbGVha2VkLCB3ZSBhcmUgYWJvdXQgdG8gY3Jhc2guICovXG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEFkamFjZW50IG1hcHBpbmdzIHdpdGggaWRlbnRpY2FsIGZsYWdzIGFuZCBjb250aWd1b3VzIGZpbGUgb2Zmc2V0cyBhcmVcbiYjNDM7ICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvXG4mIzQzOyAqIGFsdGVybmF0ZSB0aGUgcHJvdGVjdGlvbiB0byBrZWVwIGV2ZXJ5IG1hcHBpbmcgYW4gZW50cnkgb2YgaXRzIG93bi5cbiYjNDM7ICogTm90IFBST1RfRVhFQywgL3RtcCBpcyBvZnRlbiBtb3VudGVkIG5vZXhlYy4gTm90aGluZyBpcyBldmVyIHdyaXR0ZW5cbiYjNDM7ICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBtYWtlX2ZpbGVfbWFwcGluZ3Modm9pZClcbiYjNDM7e1xuJiM0MztcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRpbnQgZmQsIGk7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbihOT1RJRllfU0lHTkFMX01BUEZJTEUsXG4mIzQzO1x0XHQgIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoZnRydW5jYXRlKGZkLCAob2ZmX3QpTk9USUZZX1NJR05BTF9NQVBfQ09VTlQgKiBwZ3N6KSkge1xuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOT1RJRllfU0lHTkFMX01BUF9DT1VOVDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCBwcm90ID0gKGkgXHUwMDI2IDEpID8gUFJPVF9SRUFEIDogKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChtbWFwKE5VTEwsIHBnc3osIHByb3QsIE1BUF9QUklWQVRFLCBmZCxcbiYjNDM7XHRcdFx0IChvZmZfdClpICogcGdzeikgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gaTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0dW5zaWduZWQgY2hhciAqcDtcbiYjNDM7XHRpbnQgdHJpZ2dlcl9mZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9mZjtcbiYjNDM7XG4mIzQzO1x0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXImIzM5O3Mgb3BlbigpIGNhbm5vdCBibG9jay4gKi9cbiYjNDM7XHR0cmlnZ2VyX2ZkID0gb3BlbihOT1RJRllfU0lHTkFMX1RSSUdHRVIsIE9fUkRPTkxZIHwgT19OT05CTE9DSyB8IE9fQ0xPRVhFQyk7XG4mIzQzO1xuJiM0MztcdC8qIEV4aXQgcmF0aGVyIHRoYW4gY3Jhc2g6IGEgZHVtcCB3aXRob3V0IHRoZSBwb2xsIGFybWVkIHByb3ZlcyBub3RoaW5nLiAqL1xuJiM0MztcdGlmICh0cmlnZ2VyX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpIFx1MDAzYyBOT1RJRllfU0lHTkFMX01BUF9DT1VOVClcbiYjNDM7XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKE5VTEwsIE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XHRmb3IgKG9mZiA9IDA7IG9mZiBcdTAwM2MgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTOyBvZmYgJiM0Mzs9IHBnc3opXG4mIzQzO1x0XHRwW29mZl0gPSAxO1xuJiM0MztcbiYjNDM7XHRpZiAoYXJtX3BvbGxfbm90aWZ5KHRyaWdnZXJfZmQpKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XG4mIzQzO1x0LyogY3Jhc2ggb24gcHVycG9zZSAqL1xuJiM0MztcdCoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7XG4mIzQzO1x0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgT19XUk9OTFkgfCBPX05PTkJMT0NLIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlmICh3cml0ZShmZCwgXCYjMzQ7eFwmIzM0OywgMSkgIT0gMSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiB3cml0ZSBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcGhkclswXSBpcyB0aGUgUFRfTk9URSBlbnRyeTogZWxmX2NvcmVfZHVtcCgpIGVtaXRzIGl0IHJpZ2h0IGFmdGVyIHRoZVxuJiM0MzsgKiBFTEYgaGVhZGVyLiBJdHMgcF9vZmZzZXQgaXMgd2hlcmUgdGhlIG5vdGVzIGJlZ2luLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGxvbmcgbG9uZyBub3RlX29mZnNldChjb25zdCB1bnNpZ25lZCBjaGFyICpoZHIpXG4mIzQzO3tcbiYjNDM7XHRFbGZXKFBoZHIpIHBoO1xuJiM0MztcdEVsZlcoRWhkcikgZWg7XG4mIzQzO1xuJiM0MztcdG1lbWNweShcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcbiYjNDM7XHRpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNnBoLCBoZHIgJiM0Mzsgc2l6ZW9mKGVoKSwgc2l6ZW9mKHBoKSk7XG4mIzQzO1x0aWYgKHBoLnBfdHlwZSAhPSBQVF9OT1RFKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdHJldHVybiAobG9uZyBsb25nKXBoLnBfb2Zmc2V0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBEcmFpbiBhIGNvcmVkdW1wIG9mZiBAZmQsIGNvdW50aW5nIHdoYXQgYXJyaXZlcy4gT25jZSB0aGUgbm90ZXMgaGF2ZVxuJiM0MzsgKiBzdGFydGVkIHRoZSBrZXJuZWwgaXMgaW5zaWRlIHRoZSBvbmUgYmlnIG5vdGUgd3JpdGUsIHNvIHBva2UgdGhlIGZpZm9cbiYjNDM7ICogdGhlIGNyYXNoaW5nIHRhc2sgaXMgcG9sbGluZyBhbmQgc3RvcCByZWFkaW5nLCB3aGljaCBrZWVwcyB0aGVcbiYjNDM7ICogdHJhbnNwb3J0IGZ1bGwgYW5kIHRoZSB3cml0ZSBibG9ja2VkIHdpdGggYSBwYXJ0aWFsIGNvdW50IHdoZW4gdGhlXG4mIzQzOyAqIHdha2V1cCBsYW5kcy4gVGhlbiBjYXJyeSBvbiB0byBlbmQgb2YgZmlsZS5cbiYjNDM7ICpcbiYjNDM7ICogV2hhdCBhcnJpdmVzIGlzIHdyaXR0ZW4gdG8gQGZkX291dCB3aGVuIHRoYXQgaXMgbm90IG5lZ2F0aXZlLlxuJiM0MzsgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xLiBGYWlsaW5nIHRvIHRyaXAgdGhlIGZpZm9cbiYjNDM7ICogaXMgYW4gZXJyb3IgdG9vOiBhIGR1bXAgdGhhdCB3YXMgbmV2ZXIgaW50ZXJydXB0ZWQgcHJvdmVzIG5vdGhpbmcuXG4mIzQzOyAqL1xuJiM0Mztzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgY2hhciBoZHJbc2l6ZW9mKEVsZlcoRWhkcikpICYjNDM7IHNpemVvZihFbGZXKFBoZHIpKV07XG4mIzQzO1x0c3RhdGljIGNoYXIgYnVmWzY0IFx1MDAzY1x1MDAzYyAxMF07XG4mIzQzO1x0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuJiM0MztcdGxvbmcgbG9uZyBub3RlX29mZiA9IDA7XG4mIzQzO1x0c2l6ZV90IGhkcmxlbiA9IDA7XG4mIzQzO1x0c3NpemVfdCB0b3RhbCA9IDA7XG4mIzQzO1x0Ym9vbCBhcm1lZCA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobiBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRpZiAoZXJybm8gPT0gRUlOVFIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdHJldHVybiAtMTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChuID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGZkX291dCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2IHdyaXRlKGZkX291dCwgYnVmLCBuKSAhPSBuKVxuJiM0MztcdFx0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGhkcmxlbiBcdTAwM2Mgc2l6ZW9mKGhkcikpIHtcbiYjNDM7XHRcdFx0c2l6ZV90IHdhbnQgPSBzaXplb2YoaGRyKSAtIGhkcmxlbjtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh3YW50IFx1MDAzZSAoc2l6ZV90KW4pXG4mIzQzO1x0XHRcdFx0d2FudCA9IChzaXplX3QpbjtcbiYjNDM7XHRcdFx0bWVtY3B5KGhkciAmIzQzOyBoZHJsZW4sIGJ1Ziwgd2FudCk7XG4mIzQzO1x0XHRcdGhkcmxlbiAmIzQzOz0gd2FudDtcbiYjNDM7XHRcdFx0aWYgKGhkcmxlbiA9PSBzaXplb2YoaGRyKSlcbiYjNDM7XHRcdFx0XHRub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0dG90YWwgJiM0Mzs9IG47XG4mIzQzO1xuJiM0MztcdFx0aWYgKGFybSBcdTAwMjZcdTAwMjYgIWFybWVkIFx1MDAyNlx1MDAyNiBub3RlX29mZiBcdTAwM2UgMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICB0b3RhbCBcdTAwM2Ugbm90ZV9vZmYgJiM0MzsgKGxvbmcgbG9uZylwZ3N6KSB7XG4mIzQzO1x0XHRcdGlmIChwdWxsX3RyaWdnZXIoKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gLTE7XG4mIzQzO1x0XHRcdGFybWVkID0gdHJ1ZTtcbiYjNDM7XHRcdFx0dXNsZWVwKE5PVElGWV9TSUdOQUxfU1RBTExfVVMpO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChhcm0gXHUwMDI2XHUwMDI2ICFhcm1lZClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRvdGFsO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBIb3cgbGFyZ2UgdGhlIGR1bXAgd2FzIG1lYW50IHRvIGJlLiBUaGUgRUxGIGhlYWRlciBhbmQgdGhlIHByb2dyYW1cbiYjNDM7ICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvd1xuJiM0MzsgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCAmIzQzOyBwX2ZpbGVzeikuXG4mIzQzOyAqXG4mIzQzOyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyXG4mIzQzOyAqIGFycml2ZXMuIGR1bXBfc2tpcCgpIG9ubHkgYWNjdW11bGF0ZXMgY3BybS1cdTAwM2V0b19za2lwLCBlbGZfY29yZV9kdW1wKClcbiYjNDM7ICogaGFzIG5vIGZsdXNoIGFmdGVyIHRoZSBsYXN0IGR1bXBfdXNlcl9yYW5nZSgpIGFuZCBhIHBpcGUgY2Fubm90IHNlZWssXG4mIzQzOyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcbiYjNDM7ICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZVxuJiM0MzsgKiBwYWdlIHNob3J0IG9mIHdoYXQgdGhlIGhlYWRlcnMgcHJvbWlzZS4gQHRhaWwgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGF0XG4mIzQzOyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXG4mIzQzOyAqL1xuJiM0Mztsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpXG4mIzQzO3tcbiYjNDM7XHRFbGZXKFBoZHIpICpwaGRyID0gTlVMTDtcbiYjNDM7XHRsb25nIGxvbmcgZXhwZWN0ZWQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGludCBucGhkciwgaTtcbiYjNDM7XHRFbGZXKEVoZHIpIGVoO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0KnRhaWwgPSAwO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocmVhZChmZCwgXHUwMDI2ZWgsIHNpemVvZihlaCkpICE9IHNpemVvZihlaCkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHRpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHRpZiAoIWVoLmVfcGhudW0gfHwgZWguZV9waGVudHNpemUgIT0gc2l6ZW9mKCpwaGRyKSlcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRucGhkciA9IGVoLmVfcGhudW07XG4mIzQzO1x0cGhkciA9IGNhbGxvYyhucGhkciwgc2l6ZW9mKCpwaGRyKSk7XG4mIzQzO1x0aWYgKCFwaGRyKVxuJiM0MztcdFx0Z290byBlcnI7XG4mIzQzO1x0aWYgKHByZWFkKGZkLCBwaGRyLCAoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSwgKG9mZl90KWVoLmVfcGhvZmYpICE9XG4mIzQzO1x0ICAgIChzc2l6ZV90KSgoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnBoZHI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICYjNDM7XG4mIzQzO1x0XHRcdFx0KGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6O1xuJiM0MztcdFx0aWYgKGVuZCBcdTAwM2UgZXhwZWN0ZWQpIHtcbiYjNDM7XHRcdFx0ZXhwZWN0ZWQgPSBlbmQ7XG4mIzQzO1x0XHRcdCp0YWlsID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnJlZShwaGRyKTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIGV4cGVjdGVkO1xuJiM0MztlcnI6XG4mIzQzO1x0ZnJlZShwaGRyKTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDssCiAgICAmIzM0O0NJRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OywKICAgICYjMzQ7c21iX3NlbmRfa3ZlYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY4ZTQxYTNjOWNlMjIwZmUxMzU3MmZkNDk0NWI2ZGFlZTU1YmUwY2UKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAxOCAxMTozMToyMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtMTE2NSw2ICYjNDM7MTE2NSw3IEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pCiAJc3RydWN0IGNvcmVfbmFtZSBjbjsKIAljb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtJmd0O21tOwogCWNvbnN0IHN0cnVjdCBsaW51eF9iaW5mbXQgKmJpbmZtdCA9IG1tLSZndDtiaW5mbXQ7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IGFyZ2MgPSAwOwogCXN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHsKIAkJLnNpZ2luZm8gPSBzaWdpbmZvLApAQCAtMTE5Niw5ICYjNDM7MTE5NywxMiBAQCB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKQogCWlmIChjb3JlZHVtcF93YWl0KHNpZ2luZm8tJmd0O3NpX3NpZ25vLCAmYW1wO2NvcmVfc3RhdGUpICZsdDsgMCkKIAkJcmV0dXJuOwogCiYjNDM7CS8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqLwomIzQzOwlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAlzY29wZWRfd2l0aF9jcmVkcyhjcmVkKQogCQlkb19jb3JlZHVtcCgmYW1wO2NuLCAmYW1wO2Nwcm0sICZhbXA7YXJndiwgJmFtcDthcmdjLCBiaW5mbXQpOwogCWNvcmVkdW1wX2NsZWFudXAoJmFtcDtjbiwgJmFtcDtjcHJtKTsKJiM0MzsJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jIGIvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYwppbmRleCBmZGY0ZTUwYzI3Y2ViLi4wNWRjMjA5MTZjMjc2IDEwMDY0NAotLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMKQEAgLTIyLDcgJiM0MzsyMiw2IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtcG9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKICNpbmNsdWRlICYjMzQ7Y2lmc2dsb2IuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O2NpZnNwcm90by5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Y2lmc19kZWJ1Zy5oJiMzNDsKQEAgLTE0Miw2ICYjNDM7MTQxLDcgQEAgaW50CiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkgICAgICBzaXplX3QgKnNlbnQpCiB7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IHJjID0gMDsKIAlpbnQgcmV0cmllcyA9IDA7CiAJc3RydWN0IHNvY2tldCAqc3NvY2tldCA9IHNlcnZlci0mZ3Q7c3NvY2tldDsKQEAgLTE3MiwxNSAmIzQzOzE3MiwxMiBAQCBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkJICogYWZ0ZXIgdGhlIHJldHJpZXMgd2Ugd2lsbCBraWxsIHRoZSBzb2NrZXQgYW5kCiAJCSAqIHJlY29ubmVjdCB3aGljaCBtYXkgY2xlYXIgdGhlIG5ldHdvcmsgcHJvYmxlbS4KIAkJICoKLQkJICogRXZlbiBpZiByZWd1bGFyIHNpZ25hbHMgYXJlIG1hc2tlZCwgRUlOVFIgbWlnaHQgYmUKLQkJICogcHJvcGFnYXRlZCBmcm9tIHNrX3N0cmVhbV93YWl0X21lbW9yeSgpIHRvIGhlcmUgd2hlbgotCQkgKiBUSUZfTk9USUZZX1NJR05BTCBpcyB1c2VkIGZvciB0YXNrIHdvcmsuIEZvciBleGFtcGxlLAotCQkgKiBjZXJ0YWluIGlvX3VyaW5nIGNvbXBsZXRpb25zIHdpbGwgdXNlIHRoYXQuIFRyZWF0Ci0JCSAqIGhhdmluZyBFSU5UUiB3aXRoIHBlbmRpbmcgdGFzayB3b3JrIHRoZSBzYW1lIGFzIEVBR0FJTgotCQkgKiB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNvbm5lY3RzLgomIzQzOwkJICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS4KIAkJICovCiYjNDM7CQlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAkJcmMgPSBzb2NrX3NlbmRtc2coc3NvY2tldCwgc21iX21zZyk7Ci0JCWlmIChyYyA9PSAtRUFHQUlOIHx8IHVubGlrZWx5KHJjID09IC1FSU5UUiAmYW1wOyZhbXA7IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkgewomIzQzOwkJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiYjNDM7CQlpZiAocmMgPT0gLUVBR0FJTikgewogCQkJcmV0cmllcyYjNDM7JiM0Mzs7CiAJCQlpZiAocmV0cmllcyAmZ3Q7PSAxNCB8fAogCQkJICAgICghc2VydmVyLSZndDtub2Jsb2Nrc25kICZhbXA7JmFtcDsgKHJldHJpZXMgJmd0OyAyKSkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCAzNzNiY2MwNTk4ZDEwLi5mZDcyY2E0ZWU5MmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xNzk2LDcgJiM0MzsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7CiAJCQkJCQkgKiBJIGFtIGNsZWFuaW5nIGRpcnR5IHBhZ2VzIGZyb20gc29tZSBvdGhlciBiZGkuICovCiAjZGVmaW5lIFBGX0tUSFJFQUQJCTB4MDAyMDAwMDAJLyogSSBhbSBhIGtlcm5lbCB0aHJlYWQgKi8KICNkZWZpbmUgUEZfUkFORE9NSVpFCQkweDAwNDAwMDAwCS8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgUEZfX0hPTEVfXzAwODAwMDAwCTB4MDA4MDAwMDAKJiM0MzsjZGVmaW5lIFBGX05PX05PVElGWV9TSUdOQUwJMHgwMDgwMDAwMAkvKiBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkgKi8KICNkZWZpbmUgUEZfX0hPTEVfXzAxMDAwMDAwCTB4MDEwMDAwMDAKICNkZWZpbmUgUEZfX0hPTEVfXzAyMDAwMDAwCTB4MDIwMDAwMDAKICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFkJMHgwNDAwMDAwMAkvKiBVc2VybGFuZCBpcyBub3QgYWxsb3dlZCB0byBtZWRkbGUgd2l0aCBjcHVzX21hc2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCmluZGV4IDU4NGFlODhiNDM1ZTkuLjMxODJkZTRmZjk0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaApAQCAtMzg0LDE0ICYjNDM7Mzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiAJcmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTsKIH0KIAomIzQzOy8qIFByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhpcyB0YXNrLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vX25vdGlmeV9zaWduYWxfc2F2ZSh2b2lkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IGZsYWdzID0gY3VycmVudC0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsKJiM0MzsJY3VycmVudC0mZ3Q7ZmxhZ3MgfD0gUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsJcmV0dXJuIGZsYWdzOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJY3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW5saW5lIGludCBzaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJLyoKIAkgKiBUSUZfTk9USUZZX1NJR05BTCBpc24mIzM5O3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWUKIAkgKiBiZWhhdmlvciBpbiB0ZXJtcyBvZiBlbnN1cmluZyB0aGF0IHdlIGJyZWFrIG91dCBvZiB3YWl0IGxvb3BzCi0JICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLgomIzQzOwkgKiBzbyB0aGF0IG5vdGlmeSBzaWduYWwgY2FsbGJhY2tzIGNhbiBiZSBwcm9jZXNzZWQuIE5vdCBmb3IgYSB0YXNrCiYjNDM7CSAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuCiAJICovCi0JaWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkpCiYjNDM7CWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpICZhbXA7JmFtcDsKJiM0MzsJICAgIGxpa2VseSghKFJFQURfT05DRShwLSZndDtmbGFncykgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTCkpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gdGFza19zaWdwZW5kaW5nKHApOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQppbmRleCBkZWNlMWEzMWQ1NjFiLi43MjhmM2MzNDJlYjkyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQpAQCAtMyw3ICYjNDM7MywxMCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QKJiM0MzsjIFNwYXduZWQgYnkgdGhlIGtlcm5lbCBhcyB0aGUgfGhlbHBlciwgbm90IGEgdGVzdCBvZiBpdHMgb3duLgomIzQzO1RFU1RfR0VOX0ZJTEVTIDo9IGNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyCiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwomIzQzOyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlcjogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi45YTI4OTJkZTgxOTJiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oCkBAIC0wLDAgJiM0MzsxLDI5IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9ICiYjNDM7I2RlZmluZSBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90eXBlcy5oJmd0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUKJiM0MzsgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0JiMzOTtzIHdheSBiZXlvbmQgdGhlIGRlZmF1bHQgNjRLCiYjNDM7ICogcGlwZSByaW5nIGFuZCBwYXN0IHRoZSB+MzZLIGFuIGFmX3VuaXggc2tiIGhvbGRzLiBTbyB3ZSBmb3JjZSBhIHdyaXRlCiYjNDM7ICogdG8gY29tZSBiYWNrIHNob3J0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQJCTQwMDAKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUwkoNFVMICZsdDsmbHQ7IDIwKQomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VUwkJMjAwMDAwCiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX01BUEZJTEUJCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLm1hcGZpbGUmIzM0OwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9UUklHR0VSCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5jb3JlJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5zb2NrZXQmIzM0OwomIzQzOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKTsKJiM0Mztzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKTsKJiM0Mztsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpOwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODQ5ZjVjMWVhNzM2NQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKQEAgLTAsMCAmIzQzOzEsNDYgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHxoZWxwZXIgaGFsZiBvZiBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuIFRoZSBrZXJuZWwgc3Bhd25zIHRoaXMKJiM0MzsgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LgomIzQzOyAqIEl0IHNhdmVzIHRoZSBkdW1wIGFuZCwgb25jZSB0aGUgbm90ZXMgaGF2ZSBzdGFydGVkLCB0cmlwcyB0aGUgZmlmbyB0aGUKJiM0MzsgKiBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgc28gVElGX05PVElGWV9TSUdOQUwgaXMgcmFpc2VkIHdoaWxlIHRoZSBub3RlCiYjNDM7ICogd3JpdGUgaXMgaW4gZmxpZ2h0LgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwomIzQzOwomIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiYjNDM7ewomIzQzOwlpbnQgZmRfY29yZV9maWxlOwomIzQzOwlzc2l6ZV90IHJldDsKJiM0MzsKJiM0MzsJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwKJiM0MzsJCQkgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7CiYjNDM7CWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlyZXR1cm4gRVhJVF9GQUlMVVJFOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7CiYjNDM7CWNsb3NlKGZkX2NvcmVfZmlsZSk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CS8qIFRoZSB0ZXN0IHBvbGxzIGZvciB0aGlzIG5hbWUsIHNvIG9ubHkgY3JlYXRlIGl0IG9uY2UgaXQgaXMgd2hvbGUuICovCiYjNDM7CWlmIChyZW5hbWUoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlbmFtZSBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gRVhJVF9TVUNDRVNTOwomIzQzOwomIzQzO2VycjoKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTsKJiM0MzsJcmV0dXJuIEVYSVRfRkFJTFVSRTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2M2MwNmE4MTU2MmYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYwpAQCAtMCwwICYjNDM7MSwyNDUgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjb3JlZHVtcCBpcyBtZWFudCB0byBiZSBpbnRlcnJ1cHRlZCBieSBTSUdLSUxMIGFuZCBieSB0aGUgZnJlZXplciBhbmQKJiM0MzsgKiBieSBub3RoaW5nIGVsc2UuIGR1bXBfaW50ZXJydXB0ZWQoKSBzYXlzIHNvLCBidXQgdGhlIGJsb2NraW5nIHdhaXRzCiYjNDM7ICogdW5kZXJuZWF0aCBpdCB0ZXN0IHNpZ25hbF9wZW5kaW5nKCksIHdoaWNoIGlzIGFsc28gdHJ1ZSBmb3IKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTC4gQSBjcmFzaGluZyB0YXNrIHRoYXQgaGFzIGFuIGlvX3VyaW5nIGNvbXBsZXRpb24gbGFuZAomIzQzOyAqIG9uIGl0IG1pZC1kdW1wIHRoZXJlZm9yZSBrZWVwcyBkdW1waW5nIHdoaWxlIGV2ZXJ5IHdhaXQgaXQgZW50ZXJzIGJhaWxzCiYjNDM7ICogb3V0IGF0IG9uY2UsIGFuZCB0aGUgZHVtcCBpcyBzaWxlbnRseSBjdXQgc2hvcnQuIE5vdGhpbmcgcmVwb3J0cyBpdDoKJiM0MzsgKiBiaW5mbXRfZWxmIHNldHMgaGFzX2R1bXBlZCBiZWZvcmUgaXQgd3JpdGVzIGFueXRoaW5nLCBzbyBXQ09SRURVTVAoKQomIzQzOyAqIHNheXMgdGhlIGR1bXAgd29ya2VkLgomIzQzOyAqCiYjNDM7ICogQSBjb3JlZHVtcCBub3RlIGlzIHRoZSBvbmx5IGR1bXBfZW1pdCgpIHRoYXQgZXhjZWVkcyB3aGF0IHRoZSB0cmFuc3BvcnQKJiM0MzsgKiB0YWtlcyBpbiBvbmUgZ28sIHNvIGl0IGlzIHRoZSBvbmUgd3JpdGUgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLiBCb3RoCiYjNDM7ICogdGVzdHMgY3Jhc2ggYSBjaGlsZCBob2xkaW5nIGVub3VnaCBmaWxlIGJhY2tlZCBtYXBwaW5ncyBmb3IgaXRzIE5UX0ZJTEUKJiM0MzsgKiBub3RlIHRvIHJ1biBwYXN0IHRoYXQsIGFybSBhbiBpb191cmluZyBwb2xsIG9uIGl0LCBhbmQgdHJpcCB0aGUgcG9sbAomIzQzOyAqIHdoaWxlIHRoZSBub3RlIGlzIGJlaW5nIHdyaXR0ZW4uIFdoYXQgY29tZXMgb3V0IGhhcyB0byBiZSB0aGUgd2hvbGUKJiM0MzsgKiBkdW1wLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3NvY2tldC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLAomIzQzOwkJICAgIHNpemVvZihzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTsKJiM0MzsJQVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpOwomIzQzOwlBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7CiYjNDM7CiYjNDM7CXNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybltyZXRdID0gJiMzOTtcMCYjMzk7OwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpOwomIzQzOwlBU1NFUlRfR0Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQsIDApOwomIzQzOwomIzQzOwlyZXQgPSBmY2xvc2UoZmlsZSk7CiYjNDM7CUFTU0VSVF9FUSgwLCByZXQpOwomIzQzOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJQVNTRVJUX0VRKG1rZmlmbyhOT1RJRllfU0lHTkFMX1RSSUdHRVIsIDA2MDApLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9TT0NLRVQpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfTUFQRklMRSk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2hlY2sgdGhhdCB3aGF0IHRoZSBoZWxwZXIgb3IgdGhlIHNlcnZlciBzYXZlZCBpcyB0aGUgd2hvbGUgZHVtcC4gT25seQomIzQzOyAqIGEgaG9sZSBhdCB0aGUgdmVyeSBlbmQgY2FuIGJlIG1pc3NpbmcsIHNlZSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfd2hvbGVfY29yZWR1bXAoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhKQomIzQzO3sKJiM0MzsJbG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJZXhwZWN0ZWQgPSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCAmYW1wO3RhaWwpOwomIzQzOwlBU1NFUlRfR1QoZXhwZWN0ZWQsIDApOwomIzQzOwlBU1NFUlRfRVEoc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCksIDApOwomIzQzOwlBU1NFUlRfTEUoKGxvbmcgbG9uZylzdC5zdF9zaXplLCBleHBlY3RlZCk7CiYjNDM7CUFTU0VSVF9HRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkIC0gdGFpbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGR1bXAgZ29lcyB0byBhIHxoZWxwZXIsIHNvIHRoZSByZWFkZXIgaXMgYSBzZXBhcmF0ZSBwcm9ncmFtIHRoZQomIzQzOyAqIGtlcm5lbCBzcGF3bnMuIEl0IHNhdmVzIHdoYXQgaXQgcmVjZWl2ZWQgdG8gTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUuCiYjNDM7ICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3BpcGUpCiYjNDM7ewomIzQzOwljaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzdGF0dXMsIGk7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJbiA9IHJlYWRsaW5rKCYjMzQ7L3Byb2Mvc2VsZi9leGUmIzM0OywgaGVscGVyLCBzaXplb2YoaGVscGVyKSAtIDEpOwomIzQzOwlBU1NFUlRfR1QobiwgMCk7CiYjNDM7CWhlbHBlcltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJcCA9IHN0cnN0cihoZWxwZXIsICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0JiMzNDspOwomIzQzOwlBU1NFUlRfTkUocCwgTlVMTCk7CiYjNDM7CUFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSAmIzQzOyBzaXplb2YoJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KSwKJiM0MzsJCSAgc2l6ZW9mKGhlbHBlcikpOwomIzQzOwlzdHJjcHkocCwgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KTsKJiM0MzsJaWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIgbm90IGJ1aWx0JiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O3wlcyYjMzQ7LCBoZWxwZXIpLAomIzQzOwkJICAoaW50KXNpemVvZihwYXR0ZXJuKSk7CiYjNDM7CUFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJLyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCkgJmFtcDsmYW1wOyBzdC5zdF9zaXplKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi8KJiM0MztURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfc29ja2V0KQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyOwomIzQzOwlpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1czsKJiM0MzsJY2hhciBwYXR0ZXJuW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsCiYjNDM7CQkJICAgICBpcGNfc29ja2V0cyksIDApOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O0AlcyYjMzQ7LAomIzQzOwkJCSAgIE5PVElGWV9TSUdOQUxfU09DS0VUKSwgKGludClzaXplb2YocGF0dGVybikpOwomIzQzOwlBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQlpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xOwomIzQzOwkJaW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKJiM0MzsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzBdKTsKJiM0MzsKJiM0MzsJCWZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KE5PVElGWV9TSUdOQUxfU09DS0VUKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKHdyaXRlX25vaW50cihpcGNfc29ja2V0c1sxXSwgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzFdKTsKJiM0MzsKJiM0MzsJCWZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7CiYjNDM7CQlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwKJiM0MzsJCQkJICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsCiYjNDM7CQkJCSAgICAwNjAwKTsKJiM0MzsJCWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJaWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLAomIzQzOwkJCQkJCXRydWUpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJCWV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUzsKJiM0MztvdXQ6CiYjNDM7CQlpZiAoZmRfY29yZV9maWxlICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRfY29yZV9maWxlKTsKJiM0MzsJCWlmIChmZF9jb3JlZHVtcCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX2NvcmVkdW1wKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZF9zZXJ2ZXIpOwomIzQzOwkJX2V4aXQoZXhpdF9jb2RlKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJd2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7CiYjNDM7CiYjNDM7CWNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmgKaW5kZXggZWQ0N2YwMWZhNTNjNS4uMDZmOTk3YmE0N2ZkOSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaApAQCAtOSw2ICYjNDM7OSw3IEBACiAKICNpbmNsdWRlICYjMzQ7Li4va3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0Oy4uL3BpZGZkL3BpZGZkLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oJiMzNDsKIAogI2lmbmRlZiBQQUdFX1NJWkUKICNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKQEAgLTEsMTEgJiM0MzsxLDE4IEBACiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAogCiAjaW5jbHVkZSAmbHQ7YXNzZXJ0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2VsZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtlbmRpYW4uaCZndDsKICNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwogI2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbmsuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RkZGVmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2lvX3VyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jb3JlZHVtcC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKICNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkYm9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CkBAIC0xMyw3ICYjNDM7MjAsOSBAQAogI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9lcG9sbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c2NhbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKICNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwpAQCAtMjEsNiAmIzQzOzMwLDcgQEAKIAogI2luY2x1ZGUgJiMzNDsuLi9maWxlc3lzdGVtcy93cmFwcGVycy5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Li4vcGlkZmQvcGlkZmQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyB0byBhdm9pZCBpbmNsdWRpbmcgaGFybmVzcyBoZWFkZXIgKi8KIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7CkBAIC0zODEsMyAmIzQzOzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWwKIAkJY2xvc2UoZmRfY29yZWR1bXApOwogCV9leGl0KGV4aXRfY29kZSk7CiB9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLgomIzQzOyAqCiYjNDM7ICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGUKJiM0MzsgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3QKJiM0MzsgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLAomIzQzOyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnMKJiM0MzsgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uCiYjNDM7ICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC4KJiM0MzsgKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzeXNjYWxsKF9fTlJfaW9fdXJpbmdfc2V0dXAsIGVudHJpZXMsIHApOwomIzQzO30KJiM0MzsKJiM0MzsvKiBpb191cmluZyByZWFkcyBwb2xsMzJfZXZlbnRzIGJhY2sgdGhyb3VnaCBzd2FodzMyKCkgb24gYmlnIGVuZGlhbi4gKi8KJiM0MztzdGF0aWMgX191MzIgbm90aWZ5X3BvbGxfbWFzayhfX3UzMiBldmVudHMpCiYjNDM7ewomIzQzOyNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJmFtcDsmYW1wOyBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCiYjNDM7CXJldHVybiBfX3N3YWh3MzIoZXZlbnRzKTsKJiM0MzsjZWxzZQomIzQzOwlyZXR1cm4gZXZlbnRzOwomIzQzOyNlbmRpZgomIzQzO30KJiM0MzsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBpb191cmluZ19zZXR1cF9yYXcoMSwgJmFtcDtwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC0mZ3Q7bm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMCiYjNDM7ICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnMKJiM0MzsgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZAomIzQzOyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHAgPSB7fTsKJiM0MzsJdW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7CiYjNDM7CXN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7CiYjNDM7CXNpemVfdCBzcXJpbmdfc3o7CiYjNDM7CXZvaWQgKnNxOwomIzQzOwlpbnQgcmluZzsKJiM0MzsKJiM0MzsJcmluZyA9IGlvX3VyaW5nX3NldHVwX3Jhdyg4LCAmYW1wO3ApOwomIzQzOwlpZiAocmluZyAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXNxcmluZ19zeiA9IHAuc3Ffb2ZmLmFycmF5ICYjNDM7IHAuc3FfZW50cmllcyAqIHNpemVvZih1bnNpZ25lZCBpbnQpOwomIzQzOwlzcSA9IG1tYXAoTlVMTCwgc3FyaW5nX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRX1JJTkcpOwomIzQzOwlpZiAoc3EgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJc3FlcyA9IG1tYXAoTlVMTCwgcC5zcV9lbnRyaWVzICogc2l6ZW9mKCpzcWVzKSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSAgICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRRVMpOwomIzQzOwlpZiAoc3FlcyA9PSBNQVBfRkFJTEVEKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlzcV90YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICYjNDM7IHAuc3Ffb2ZmLnRhaWwpOwomIzQzOwlzcV9hcnJheSA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi5hcnJheSk7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO3NxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7CiYjNDM7CXNxZXNbMF0ub3Bjb2RlID0gSU9SSU5HX09QX1BPTExfQUREOwomIzQzOwlzcWVzWzBdLmZkID0gdHJpZ2dlcl9mZDsKJiM0MzsJc3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pOwomIzQzOwomIzQzOwlzcV9hcnJheVswXSA9IDA7CiYjNDM7CV9fYXRvbWljX3N0b3JlX24oc3FfdGFpbCwgMSwgX19BVE9NSUNfUkVMRUFTRSk7CiYjNDM7CiYjNDM7CWlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJLyogRGVsaWJlcmF0ZWx5IGxlYWtlZCwgd2UgYXJlIGFib3V0IHRvIGNyYXNoLiAqLwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlCiYjNDM7ICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvCiYjNDM7ICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLgomIzQzOyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuCiYjNDM7ICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWludCBmZCwgaTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSwKJiM0MzsJCSAgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChmdHJ1bmNhdGUoZmQsIChvZmZfdClOT1RJRllfU0lHTkFMX01BUF9DT1VOVCAqIHBnc3opKSB7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcHJvdCA9IChpICZhbXA7IDEpID8gUFJPVF9SRUFEIDogKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwomIzQzOwomIzQzOwkJaWYgKG1tYXAoTlVMTCwgcGdzeiwgcHJvdCwgTUFQX1BSSVZBVEUsIGZkLAomIzQzOwkJCSAob2ZmX3QpaSAqIHBnc3opID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gaTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CXVuc2lnbmVkIGNoYXIgKnA7CiYjNDM7CWludCB0cmlnZ2VyX2ZkOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZjsKJiM0MzsKJiM0MzsJLyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXImIzM5O3Mgb3BlbigpIGNhbm5vdCBibG9jay4gKi8KJiM0MzsJdHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpOwomIzQzOwomIzQzOwkvKiBFeGl0IHJhdGhlciB0aGFuIGNyYXNoOiBhIGR1bXAgd2l0aG91dCB0aGUgcG9sbCBhcm1lZCBwcm92ZXMgbm90aGluZy4gKi8KJiM0MzsJaWYgKHRyaWdnZXJfZmQgJmx0OyAwKQomIzQzOwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsKJiM0MzsJaWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwlmb3IgKG9mZiA9IDA7IG9mZiAmbHQ7IE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUzsgb2ZmICYjNDM7PSBwZ3N6KQomIzQzOwkJcFtvZmZdID0gMTsKJiM0MzsKJiM0MzsJaWYgKGFybV9wb2xsX25vdGlmeSh0cmlnZ2VyX2ZkKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CS8qIGNyYXNoIG9uIHB1cnBvc2UgKi8KJiM0MzsJKih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDsKJiM0MzsJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgT19XUk9OTFkgfCBPX05PTkJMT0NLIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAod3JpdGUoZmQsICYjMzQ7eCYjMzQ7LCAxKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogd3JpdGUgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHBoZHJbMF0gaXMgdGhlIFBUX05PVEUgZW50cnk6IGVsZl9jb3JlX2R1bXAoKSBlbWl0cyBpdCByaWdodCBhZnRlciB0aGUKJiM0MzsgKiBFTEYgaGVhZGVyLiBJdHMgcF9vZmZzZXQgaXMgd2hlcmUgdGhlIG5vdGVzIGJlZ2luLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGxvbmcgbm90ZV9vZmZzZXQoY29uc3QgdW5zaWduZWQgY2hhciAqaGRyKQomIzQzO3sKJiM0MzsJRWxmVyhQaGRyKSBwaDsKJiM0MzsJRWxmVyhFaGRyKSBlaDsKJiM0MzsKJiM0MzsJbWVtY3B5KCZhbXA7ZWgsIGhkciwgc2l6ZW9mKGVoKSk7CiYjNDM7CWlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbWVtY3B5KCZhbXA7cGgsIGhkciAmIzQzOyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTsKJiM0MzsJaWYgKHBoLnBfdHlwZSAhPSBQVF9OT1RFKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gKGxvbmcgbG9uZylwaC5wX29mZnNldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBEcmFpbiBhIGNvcmVkdW1wIG9mZiBAZmQsIGNvdW50aW5nIHdoYXQgYXJyaXZlcy4gT25jZSB0aGUgbm90ZXMgaGF2ZQomIzQzOyAqIHN0YXJ0ZWQgdGhlIGtlcm5lbCBpcyBpbnNpZGUgdGhlIG9uZSBiaWcgbm90ZSB3cml0ZSwgc28gcG9rZSB0aGUgZmlmbwomIzQzOyAqIHRoZSBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgYW5kIHN0b3AgcmVhZGluZywgd2hpY2gga2VlcHMgdGhlCiYjNDM7ICogdHJhbnNwb3J0IGZ1bGwgYW5kIHRoZSB3cml0ZSBibG9ja2VkIHdpdGggYSBwYXJ0aWFsIGNvdW50IHdoZW4gdGhlCiYjNDM7ICogd2FrZXVwIGxhbmRzLiBUaGVuIGNhcnJ5IG9uIHRvIGVuZCBvZiBmaWxlLgomIzQzOyAqCiYjNDM7ICogV2hhdCBhcnJpdmVzIGlzIHdyaXR0ZW4gdG8gQGZkX291dCB3aGVuIHRoYXQgaXMgbm90IG5lZ2F0aXZlLgomIzQzOyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEuIEZhaWxpbmcgdG8gdHJpcCB0aGUgZmlmbwomIzQzOyAqIGlzIGFuIGVycm9yIHRvbzogYSBkdW1wIHRoYXQgd2FzIG5ldmVyIGludGVycnVwdGVkIHByb3ZlcyBub3RoaW5nLgomIzQzOyAqLwomIzQzO3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGhkcltzaXplb2YoRWxmVyhFaGRyKSkgJiM0Mzsgc2l6ZW9mKEVsZlcoUGhkcikpXTsKJiM0MzsJc3RhdGljIGNoYXIgYnVmWzY0ICZsdDsmbHQ7IDEwXTsKJiM0MzsJbG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwlsb25nIGxvbmcgbm90ZV9vZmYgPSAwOwomIzQzOwlzaXplX3QgaGRybGVuID0gMDsKJiM0MzsJc3NpemVfdCB0b3RhbCA9IDA7CiYjNDM7CWJvb2wgYXJtZWQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJc3NpemVfdCBuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CiYjNDM7CiYjNDM7CQlpZiAobiAmbHQ7IDApIHsKJiM0MzsJCQlpZiAoZXJybm8gPT0gRUlOVFIpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCXJldHVybiAtMTsKJiM0MzsJCX0KJiM0MzsJCWlmIChuID09IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAoZmRfb3V0ICZndDs9IDAgJmFtcDsmYW1wOyB3cml0ZShmZF9vdXQsIGJ1ZiwgbikgIT0gbikKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CQlpZiAoaGRybGVuICZsdDsgc2l6ZW9mKGhkcikpIHsKJiM0MzsJCQlzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuOwomIzQzOwomIzQzOwkJCWlmICh3YW50ICZndDsgKHNpemVfdCluKQomIzQzOwkJCQl3YW50ID0gKHNpemVfdCluOwomIzQzOwkJCW1lbWNweShoZHIgJiM0MzsgaGRybGVuLCBidWYsIHdhbnQpOwomIzQzOwkJCWhkcmxlbiAmIzQzOz0gd2FudDsKJiM0MzsJCQlpZiAoaGRybGVuID09IHNpemVvZihoZHIpKQomIzQzOwkJCQlub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQl0b3RhbCAmIzQzOz0gbjsKJiM0MzsKJiM0MzsJCWlmIChhcm0gJmFtcDsmYW1wOyAhYXJtZWQgJmFtcDsmYW1wOyBub3RlX29mZiAmZ3Q7IDAgJmFtcDsmYW1wOwomIzQzOwkJICAgIHRvdGFsICZndDsgbm90ZV9vZmYgJiM0MzsgKGxvbmcgbG9uZylwZ3N6KSB7CiYjNDM7CQkJaWYgKHB1bGxfdHJpZ2dlcigpKQomIzQzOwkJCQlyZXR1cm4gLTE7CiYjNDM7CQkJYXJtZWQgPSB0cnVlOwomIzQzOwkJCXVzbGVlcChOT1RJRllfU0lHTkFMX1NUQUxMX1VTKTsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYXJtICZhbXA7JmFtcDsgIWFybWVkKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlyZXR1cm4gdG90YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogSG93IGxhcmdlIHRoZSBkdW1wIHdhcyBtZWFudCB0byBiZS4gVGhlIEVMRiBoZWFkZXIgYW5kIHRoZSBwcm9ncmFtCiYjNDM7ICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvdwomIzQzOyAqIGZhciBpdCBzaG91bGQgaGF2ZSBydW46IHRoZSBlbmQgaXMgbWF4KHBfb2Zmc2V0ICYjNDM7IHBfZmlsZXN6KS4KJiM0MzsgKgomIzQzOyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyCiYjNDM7ICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLSZndDt0b19za2lwLCBlbGZfY29yZV9kdW1wKCkKJiM0MzsgKiBoYXMgbm8gZmx1c2ggYWZ0ZXIgdGhlIGxhc3QgZHVtcF91c2VyX3JhbmdlKCkgYW5kIGEgcGlwZSBjYW5ub3Qgc2VlaywKJiM0MzsgKiBzbyB0aG9zZSBieXRlcyBhcmUgZHJvcHBlZC4gT24geDg2XzY0IHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIGdhdGUgdm1hCiYjNDM7ICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZQomIzQzOyAqIHBhZ2Ugc2hvcnQgb2Ygd2hhdCB0aGUgaGVhZGVycyBwcm9taXNlLiBAdGFpbCByZXR1cm5zIHRoZSBzaXplIG9mIHRoYXQKJiM0MzsgKiBsYXN0IHNlZ21lbnQsIHdoaWNoIGJvdW5kcyB3aGF0IG1heSBnbyBtaXNzaW5nIHRoaXMgd2F5LgomIzQzOyAqLwomIzQzO2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCkKJiM0Mzt7CiYjNDM7CUVsZlcoUGhkcikgKnBoZHIgPSBOVUxMOwomIzQzOwlsb25nIGxvbmcgZXhwZWN0ZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbnBoZHIsIGk7CiYjNDM7CUVsZlcoRWhkcikgZWg7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJKnRhaWwgPSAwOwomIzQzOwomIzQzOwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtlaCwgc2l6ZW9mKGVoKSkgIT0gc2l6ZW9mKGVoKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKCFlaC5lX3BobnVtIHx8IGVoLmVfcGhlbnRzaXplICE9IHNpemVvZigqcGhkcikpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJbnBoZHIgPSBlaC5lX3BobnVtOwomIzQzOwlwaGRyID0gY2FsbG9jKG5waGRyLCBzaXplb2YoKnBoZHIpKTsKJiM0MzsJaWYgKCFwaGRyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CWlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPQomIzQzOwkgICAgKHNzaXplX3QpKChzaXplX3QpbnBoZHIgKiBzaXplb2YoKnBoZHIpKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnBoZHI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICYjNDM7CiYjNDM7CQkJCShsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejsKJiM0MzsJCWlmIChlbmQgJmd0OyBleHBlY3RlZCkgewomIzQzOwkJCWV4cGVjdGVkID0gZW5kOwomIzQzOwkJCSp0YWlsID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWUocGhkcik7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIGV4cGVjdGVkOwomIzQzO2VycjoKJiM0MzsJZnJlZShwaGRyKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjA2MQoJCQkJCQkJb3V0cHV0OiAyNQoJCQkJCQkJdGhvdWdodHM6IDQwMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQcm9wb3NlZCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaC4gSXQmIzM5O3MgdG91Y2hpbmcgYGZzL2NvcmVkdW1wLmNgIGFuZCBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2AsIHdoaWNoIGlzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nLiBUaGV5JiMzOTtyZSBpbnRyb2R1Y2luZyB0aGVzZSBgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKClgIGFuZCBgbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKClgIGZ1bmN0aW9ucywgYW5kIHRoYXQmIzM5O3MgdXN1YWxseSB0byBwcmV2ZW50IHNvbWUgc2lnbmFsIGZyb20gaW50ZXJydXB0aW5nIGNyaXRpY2FsIHNlY3Rpb25zLiBBbmQsIGp1ZGdpbmcgYnkgdGhlIG5hbWUgYW5kIGxvY2F0aW9uLCBpdCYjMzk7cyBgVElGX05PVElGWV9TSUdOQUxgIHRoYXQgdGhleSBhcmUgdHJ5aW5nIHRvIHByb3RlY3QgYWdhaW5zdC4gSSBzZWUgYSBuZXcgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcgYmVpbmcgYWRkZWQgdG8gYHNjaGVkLmhgIGFuZCBhIG1vZGlmaWNhdGlvbiB0byBgc2lnbmFsX3BlbmRpbmcoKWAsIHNvIHdlJiMzOTtyZSBkZWZpbml0ZWx5IHRhbGtpbmcgYWJvdXQgYSBjaGFuZ2UgdG8gaG93IHNpZ25hbHMgYXJlIGhhbmRsZWQuIEEgc2VsZnRlc3QsIGBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RgLCBpcyBhbHNvIGluY2x1ZGVkLgoKVGhlIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIGEgc2lnbmlmaWNhbnQgY2hhbmdlIGFuZCBpcyBpdCByZWFjaGFibGU/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBhY3QuIEkgc2VlIHRoYXQgdGhlIGNoYW5nZXMgYXJlIHdpdGhpbiBgdmZzX2NvcmVkdW1wKClgIGFuZCBgc21iX3NlbmRfa3ZlYygpYCwgc28gdGhvc2UgYXJlIHRoZSBmdW5jdGlvbnMgdG8gZXhhbWluZSBjbG9zZWx5LgoKYHZmc19jb3JlZHVtcCgpYCBpcyBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGFuZCBoaWdobHkgcmVhY2hhYmxlLiBObyBpc3N1ZSB0aGVyZS4gQW5kIGBzbWJfc2VuZF9rdmVjKClgIGlzIGluIHRoZSBTTUIgY2xpZW50IGRyaXZlci4gVGhhdCYjMzk7cyB1c2VkIHF1aXRlIGEgYml0LCBzbyB0aGF0JiMzOTtzIGFsc28gcmVhY2hhYmxlLiBTbywgZnVuY3Rpb25hbGx5LCB3ZSYjMzk7cmUgbW9kaWZ5aW5nIHNpZ25hbCBoYW5kbGluZyBhbG9uZyB0aGVzZSBjcnVjaWFsIHBhdGhzLiBZZXMsIHRoYXQmIzM5O3MgYSBmdW5jdGlvbmFsIGNoYW5nZSwgYW5kIHdlIG5lZWQgdG8gaW52ZXN0aWdhdGUuCgpGb2N1c2luZyBvdXIgZnV6emluZyBlZmZvcnRzLCBpdCBsb29rcyBsaWtlIGB2ZnNfY29yZWR1bXAoKWAgYW5kIGBzbWJfc2VuZF9rdmVjKClgIGFyZSB0aGUgcHJpbWFyeSB0YXJnZXRzIGZvciBub3cuIEkgc2hvdWxkIGNoZWNrIHRoZSByZWxldmFudCBjb25maWdzIGFuZCB0ZXN0IGNhc2VzLgoKRm9yIGB2ZnNfY29yZWR1bXAoKWAsIEkgYXNzdW1lIHRoZSBzeXN0ZW0gbmVlZHMgdG8gaGF2ZSBgQ09SRURVTVBgIGVuYWJsZWQgdG8gdHJpZ2dlciBpdC4KCkZvciBgc21iX3NlbmRfa3ZlYygpYCwgaXQmIzM5O3MgZ29pbmcgdG8gYmUgYENJRlNgIG9yIGBTTUJfRlNgLCBhbmQgSSBzaG91bGQgY2hlY2sgYGZzL3NtYi9jbGllbnQvS2NvbmZpZ2Agb3IgYGZzL2NpZnMvS2NvbmZpZ2AgdG8gY29uZmlybSB0aGUgZXhhY3QgY29uZmlnIGZsYWdzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDSUZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3NtYi9jbGllbnQvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjI6Y29uZmlnIENJRlNcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVx0dHJpc3RhdGUgXCYjMzQ7U01CMyBhbmQgQ0lGUyBzdXBwb3J0IChhZHZhbmNlZCBuZXR3b3JrIGZpbGVzeXN0ZW0pXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTUzLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxuZnMvc21iL2NsaWVudC9LY29uZmlnLTU1LVx0Ym9vbCBcJiMzNDtFeHRlbmRlZCBzdGF0aXN0aWNzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjY4OmNvbmZpZyBDSUZTX0FMTE9XX0lOU0VDVVJFX0xFR0FDWVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY5LVx0Ym9vbCBcJiMzNDtTdXBwb3J0IGxlZ2FjeSBzZXJ2ZXJzIHdoaWNoIHVzZSBsZXNzIHNlY3VyZSBkaWFsZWN0c1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04Mi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo4Mzpjb25maWcgQ0lGU19VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7S2VyYmVyb3MvU1BORUdPIGFkdmFuY2VkIHNlc3Npb24gc2V0dXBcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05My1cdGJvb2wgXCYjMzQ7Q0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMDc6Y29uZmlnIENJRlNfUE9TSVhcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMDgtXHRib29sIFwmIzM0O0NJRlMgUE9TSVggRXh0ZW5zaW9uc1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMTgtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTE5OmNvbmZpZyBDSUZTX0RFQlVHXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVx0Ym9vbCBcJiMzNDtFbmFibGUgQ0lGUyBkZWJ1Z2dpbmcgcm91dGluZXNcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjktXHRib29sIFwmIzM0O0VuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMzk6Y29uZmlnIENJRlNfREVCVUdfRFVNUF9LRVlTXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTQwLVx0Ym9vbCBcJiMzNDtEdW1wIGVuY3J5cHRpb24ga2V5cyBmb3Igb2ZmbGluZSBkZWNyeXB0aW9uIChVbnNhZmUpXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE0OC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNDk6Y29uZmlnIENJRlNfREZTX1VQQ0FMTFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cdGJvb2wgXCYjMzQ7REZTIGZlYXR1cmUgc3VwcG9ydFwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjMtXHRib29sIFwmIzM0O1NXTiBmZWF0dXJlIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE3Mzpjb25maWcgQ0lGU19ORlNEX0VYUE9SVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE3NC1cdGJvb2wgXCYjMzQ7QWxsb3cgbmZzZCB0byBleHBvcnQgQ0lGUyBmaWxlIHN5c3RlbVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZz0xNzk9aWYgQ0lGU1xuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4Mi1cdGJvb2wgXCYjMzQ7U01CIERpcmVjdCBzdXBwb3J0XCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxOTE6Y29uZmlnIENJRlNfRlNDQUNIRVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5Mi1cdGJvb2wgXCYjMzQ7UHJvdmlkZSBDSUZTIGNsaWVudCBjYWNoaW5nIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTk4LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE5OTpjb25maWcgQ0lGU19ST09UXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVx0Ym9vbCBcJiMzNDtTTUIgcm9vdCBmaWxlIHN5c3RlbSAoRXhwZXJpbWVudGFsKVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0yMDYtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjA4LVx0Ym9vbCBcJiMzNDtTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzOTg5CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEZWNvZGluZyBLZXJuZWwgQ29uZmlnIE9wdGlvbnMqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUga2VybmVsIGNvbmZpZyBhbmQgdHJ5aW5nIHRvIG1hcCBmZWF0dXJlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBXaGVuIEkgc2VlIHNvbWV0aGluZyByZWxhdGVkIHRvIHRoZSBgZnMvc21iL2NsaWVudC9gIGRpcmVjdG9yeSwgdGhhdCYjMzk7cyBhbG1vc3QgY2VydGFpbmx5IGdvaW5nIHRvIGJlIGNvbnRyb2xsZWQgYnkgdGhlIGBDSUZTYCBvcHRpb24uIFRoYXQmIzM5O3MgdGhlIGdvLXRvIGNvbmZpZyBmbGFnIGZvciB0aGUgQ29tbW9uIEludGVybmV0IEZpbGUgU3lzdGVtIChDSUZTKSBjbGllbnQgc3VwcG9ydCwgcmlnaHQ/IENhbiYjMzk7dCByZWFsbHkgaW1hZ2luZSBhbnkgb3RoZXIgb3B0aW9uIHRoYXQgd291bGQgbWFrZSBtb3JlIHNlbnNlLgoKQW5kIHRoZW4sIGRpdmluZyBpbnRvIGBmcy9jb3JlZHVtcC5jYCDigJMgYWgsIHRoYXQmIzM5O3MgY2xhc3NpYy4gV2hlbmV2ZXIgeW91JiMzOTtyZSBkZWFsaW5nIHdpdGggY29yZSBkdW1wcyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiwgYENPUkVEVU1QYCBpcyBhbHdheXMgdGhlIHByaW1hcnkgY29uY2Vybi4gSXTigJlzIHRoZSBvYnZpb3VzIGNob2ljZSBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNvcmUgZHVtcCBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdGhpbmcgc3VycHJpc2luZyB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQ09SRURVTVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvS2NvbmZpZy5iaW5mbXQ9MTQ1PWNvbmZpZyBCSU5GTVRfTUlTQ1xuLS1cbmZzL0tjb25maWcuYmluZm10LTE3MC1cbmZzL0tjb25maWcuYmluZm10OjE3MTpjb25maWcgQ09SRURVTVBcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGNvcmUgZHVtcCBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MzQ1CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGZhbWlsaWFyIHdpdGggdGhlc2UgY29uY2VwdHM6CgoqKkRlZXAgRGl2ZSBJbmNvbWluZzogQ09SRURVTVAsIENJRlMsIGFuZCBLZXJuZWwgSW50ZXJuYWxzKioKClJpZ2h0LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBhIHBvdGVudGlhbGx5IGhhaXJ5IHNpdHVhdGlvbi4gSSBzZWUgYENPUkVEVU1QYCBhbmQgYENJRlNgIG1lbnRpb25lZCwgYW5kIG15IG1pbmQgaW1tZWRpYXRlbHkganVtcHMgdG8gcG90ZW50aWFsIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZW0uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgc2NlbmFyaW8gd2hlcmUgYSBjb3JlIGR1bXAgbWlnaHQgYmUgZ2VuZXJhdGVkIG9uIGEgc3lzdGVtIHRoYXQmIzM5O3MgYWxzbyB1c2luZyBhIENJRlMgbW91bnQsIHdoaWNoIHJhaXNlcyBhbGwgc29ydHMgb2YgaW50ZXJlc3RpbmcgcXVlc3Rpb25zIGFib3V0IGZpbGUgcGVybWlzc2lvbnMsIG5ldHdvcmsgYmVoYXZpb3IsIGFuZCBwb3RlbnRpYWwgZm9yIGRhdGEgY29ycnVwdGlvbiBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIE15IGd1dCByZWFjdGlvbiBpcyB0byBkaWcgaW50byB0aGUga2VybmVsLiBUbyBnZXQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzLCBJIG5lZWQgdG8gc2VlIGV4YWN0bHkgaG93IHRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtIGludGVyYWN0cyB3aXRoIHRoaXMga2luZCBvZiBiZWhhdmlvci4gTGV0JiMzOTtzIHNlZSBob3cgYHZmc19jb3JlZHVtcGAgaXMgaW1wbGVtZW50ZWQsIGFuZCB0aGVuIEkmIzM5O2xsIGxvb2sgaW50byBgc21iX3NlbmRfa3ZlY2AgdG8gc2VlIGV4YWN0bHkgaG93IHRoZSBzeXN0ZW0gaXMgdHJ5aW5nIHRvIHdyaXRlIGRhdGEgb3ZlciB0aGUgbmV0d29yayBpZiBhIGNyYXNoIGlzIG9jY3VycmluZy4gVGhpcyBpcyBnb2luZyB0byBpbnZvbHZlIHVuZGVyc3RhbmRpbmcgdGhlIGRhdGEgcGF0aCBmb3IgdGhlIGNvcmUgZHVtcC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtedm9pZCB2ZnNfY29yZWR1bXAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9MTA5Mj1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbi0tXG5mcy9jb3JlZHVtcC5jLTExNjAtXG5mcy9jb3JlZHVtcC5jOjExNjE6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbmZzL2NvcmVkdW1wLmMtMTE2Mi17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ3NTYKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipDb25jZXJuaW5nIFN0YXRpYyBEZWNsYXJhdGlvbnMgaW4gdGhlIEtlcm5lbCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYHZmc19jb3JlZHVtcGAgYW5kIGBzbWJfc2VuZF9rdmVjYCwgYW5kIEkmIzM5O20gcmVhbGl6aW5nIHNvbWV0aGluZyBmdW5kYW1lbnRhbC4gTmVpdGhlciBvZiB0aGVzZSwgYXMgdGhleSBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLCBhcmUgZGVjbGFyZWQgYXMgYHN0YXRpY2AuIFRoYXQgaGFzIGltcGxpY2F0aW9ucy4gSXQgbWVhbnMgdGhleSYjMzk7cmUgcG90ZW50aWFsbHkgdmlzaWJsZSBhbmQgYWNjZXNzaWJsZSBiZXlvbmQgdGhlaXIgZGVmaW5lZCBjb21waWxhdGlvbiB1bml0LiBUaGlzIGlzbiYjMzk7dCBpbmhlcmVudGx5IGJhZCwgYnV0IGl0ICpkb2VzKiBpbXBhY3QgdGhlIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSBvZiB0aGUga2VybmVsLiBJdCBtZWFucyB0aGF0LCBhcyB0aGluZ3Mgc3RhbmQsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGljaXRseSBwYXJ0IG9mIHRoZSBleHBvcnRlZCBBUEksIHdoZXRoZXIgaW50ZW5kZWQgb3Igbm90LiBBbmQgdGhhdCBoYXMga25vY2stb24gZWZmZWN0cyB3aXRoIHJlZ2FyZHMgdG8gc3ltYm9sIHZpc2liaWxpdHkgYW5kIHRoZSBsaW5raW5nIHByb2Nlc3MuIEl0JiMzOTtzIGEga2V5IGNvbnNpZGVyYXRpb24gd2hlbiByZXZpZXdpbmcgdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBkZXNpZ24gb2YgdGhlc2UgcGFydHMgb2YgdGhlIGZpbGUgc3lzdGVtIGFuZCBTYW1iYSBjb2RlLiBXZSBuZWVkIHRvIGJlIGRlbGliZXJhdGUgYWJvdXQgd2hhdCB3ZSBleHBvc2UgYW5kIHdoYXQgd2Uga2VlcCBpbnRlcm5hbC4gVGhpcyBvYnNlcnZhdGlvbiBzaG91bGQgZ3VpZGUgZnVydGhlciByZXZpZXcgYW5kIHJlZmFjdG9yaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15pbnQgc21iX3NlbmRfa3ZlYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTAzNgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgc21iX3NlbmRfa3ZlY2AqKgoKT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIsIGxldCYjMzk7cyBqdXN0IG1ha2UgYWJzb2x1dGVseSBzdXJlIHdlJiMzOTtyZSBvbiB0aGUgc2FtZSBwYWdlLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGBzbWJfc2VuZF9rdmVjYCBmdW5jdGlvbi4gVGhhdCYjMzk7cyBkZWZpbml0ZWx5IGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gSSBoYXZlIGEgZmVlbGluZyBzb21ldGhpbmcgcmVsZXZhbnQgdG8gbXkgY3VycmVudCBkZWJ1Z2dpbmcgZWZmb3J0cyBpcyBsdXJraW5nIGluIHRoZXJlLiBHb3R0YSByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgZGF0YSBpcyBhY3R1YWxseSAqc2VudCogb3ZlciB0aGUgbmV0d29yayBpbiB0aGUgU01CIGNsaWVudCBjb250ZXh0LiBJdCYjMzk7cyB0aW1lIHRvIGNoZWNrIHRoYXQgaW1wbGVtZW50YXRpb24gYW5kIHNlZSB3aGF04oCZcyBnb2luZyBvbiBhdCB0aGF0IGxldmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzbWJfc2VuZF9rdmVjJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jPTExOD1kZWxldGVfbWlkKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1pZF9xX2VudHJ5ICptaWQpXG4tLVxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xMzEtLypcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmM6MTMyOiAqIHNtYl9zZW5kX2t2ZWMgLSBzZW5kIGFuIGFycmF5IG9mIGt2ZWNzIHRvIHRoZSBzZXJ2ZXJcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMTMzLSAqIEBzZXJ2ZXI6XHRTZXJ2ZXIgdG8gc2VuZCB0aGUgZGF0YSB0b1xuLS1cbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmM9MTQwPWludFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzoxNDE6c21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTE0Mi1cdCAgICAgIHNpemVfdCAqc2VudClcbi0tXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jPTIzNT1pbnQgX19zbWJfc2VuZF9ycXN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgaW50IG51bV9ycXN0LFxuLS1cbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMjkyLVx0XHRpb3ZfaXRlcl9rdmVjKFx1MDAyNnNtYl9tc2cubXNnX2l0ZXIsIElURVJfU09VUkNFLCBcdTAwMjZoaW92LCAxLCA0KTtcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmM6MjkzOlx0XHRyYyA9IHNtYl9zZW5kX2t2ZWMoc2VydmVyLCBcdTAwMjZzbWJfbXNnLCBcdTAwMjZzZW50KTtcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMjk0LVx0XHRpZiAocmMgXHUwMDNjIDApXG4tLVxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0zMTQtXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjMxNTpcdFx0cmMgPSBzbWJfc2VuZF9rdmVjKHNlcnZlciwgXHUwMDI2c21iX21zZywgXHUwMDI2c2VudCk7XG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTMxNi1cdFx0aWYgKHJjIFx1MDAzYyAwKVxuLS1cbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMzIyLVx0XHRcdHNtYl9tc2cubXNnX2l0ZXIgPSBycXN0W2pdLnJxX2l0ZXI7XG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjMyMzpcdFx0XHRyYyA9IHNtYl9zZW5kX2t2ZWMoc2VydmVyLCBcdTAwMjZzbWJfbXNnLCBcdTAwMjZzZW50KTtcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMzI0LVx0XHRcdGlmIChyYyBcdTAwM2MgMClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU3OTkKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiAyNTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBGb2N1cyBTeW1ib2xzKioKCk9rYXksIHNvIGBzbWJfc2VuZF9rdmVjYCBpc24mIzM5O3Qgc3RhdGljLCB3aGljaCBpcyBnb29kIHRvIGtub3cuIExldCYjMzk7cyBzZWUgaWYgdGhlcmUgYXJlIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGlzIGdlbmVyYWwgYXJlYS4gQWxyaWdodCwgaXQgbG9va3MgbGlrZSBgbm9fbm90aWZ5X3NpZ25hbF9zYXZlYCwgYG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZWAsIGFuZCBgc2lnbmFsX3BlbmRpbmdgIGFyZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucyB3aXRoaW4gYGluY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhgLCBidXQgdGhleSBhcmUgcHJvYmFibHkgbm90IHdoYXQgSSYjMzk7bSBsb29raW5nIGZvci4KClNvLCBuYXJyb3dpbmcgdGhpbmdzIGRvd24sIGl0IHNlZW1zIGxpa2Ugd2UmIzM5O3JlIHJlYWxseSBmb2N1c2luZyBvbiBgdmZzX2NvcmVkdW1wYCBhbmQgYHNtYl9zZW5kX2t2ZWNgLiBOb3csIGB2ZnNfY29yZWR1bXBgIGlzIGNhbGxlZCB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzIC0gdGhhdCYjMzk7cyBhICpjb21tb24qIHBhdGgsIGJ1dCBtYXliZSBub3QgdGhlICpob3R0ZXN0KiBwYXRoLiBPbiB0aGUgb3RoZXIgaGFuZCwgYHNtYl9zZW5kX2t2ZWNgIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc2VuZGluZyBTTUIgcmVxdWVzdHMsIHdoaWNoIGlzIGRlZmluaXRlbHkgYSBob3QgcGF0aCAqZm9yKiBTTUIgc3BlY2lmaWNhbGx5LiBCdXQgU01CIGlzbiYjMzk7dCBhICpnZW5lcmFsKiBob3QgcGF0aCwgdW5sZXNzIHdlJiMzOTtyZSBhY3RpdmVseSBmdXp6aW5nIGl0LgoKV2FpdCwgYmFjayB0byBgdmZzX2NvcmVkdW1wYC4uLiB0aGF0IGlzICpkZWZpbml0ZWx5KiByZWFjaGFibGUgd2hlbiBhIHByb2Nlc3MgY3Jhc2hlcywgd2hpY2ggaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgY2FuIHdvcmsgd2l0aC4gU28sIGlzIGB2ZnNfY29yZWR1bXBgIGEgc29saWQgY2hvaWNlPyBJdCYjMzk7cyB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3IgY29yZWR1bXAgZnVuY3Rpb25hbGl0eS4gQW5kIHdoYXQgYWJvdXQgYHNtYl9zZW5kX2t2ZWNgPyBXZWxsLCBpdCYjMzk7cyB0aGUgYmVnaW5uaW5nIG9mIHNlbmRpbmcgU01CIHJlcXVlc3RzLgoKQWxyaWdodCwgbGV0JiMzOTtzIHRha2UgYSBjbG9zZXIgbG9vayBhdCB0aGUgY2FsbGVycyBvZiBgdmZzX2NvcmVkdW1wYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0PTU1NT1kaWZmZXJlbnQgc2V0IG9mIGNyZWRlbnRpYWxzLiAgVGhpcyBpcyBkb25lIGluIHRoZSBmb2xsb3dpbmcgcGxhY2VzOlxuLS1cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1Ny0gKiBgYHN5c19mYWNjZXNzYXQoKWBgLlxuRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q6NTU4OiAqIGBgdmZzX2NvcmVkdW1wKClgYC5cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdD0yNTQ9Y29uc3TmjIfpkojkuIrmk43kvZzvvIzlm6DmraTkuI3pnIDopoHov5vooYznsbvlnovovazmjaLvvIzkvYbpnIDopoHkuLTml7bmlL7lvINjb25zdOmZkOWumu+8jOS7peS+v+iDveWkn+S/ruaUuVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC00NzctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdDo0Nzg6ICogYGB2ZnNfY29yZWR1bXAoKWBgLlxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTQ3OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbmZzL2NvcmVkdW1wLmM9MTA5Mj1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbi0tXG5mcy9jb3JlZHVtcC5jLTExNjAtXG5mcy9jb3JlZHVtcC5jOjExNjE6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbmZzL2NvcmVkdW1wLmMtMTE2Mi17XG4tLVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oPTQ4PWludCBkdW1wX3VzZXJfcmFuZ2Uoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC00OS1cdFx0ICAgIHVuc2lnbmVkIGxvbmcgbGVuKTtcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaDo1MDpleHRlcm4gdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbyk7XG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtNTEtXG4tLVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTY5LSNlbHNlXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmg6NzA6c3RhdGljIGlubGluZSB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKSB7fVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTcxLVxuLS1cbmtlcm5lbC9zaWduYWwuYz0yODEwPWJvb2wgZ2V0X3NpZ25hbChzdHJ1Y3Qga3NpZ25hbCAqa3NpZylcbi0tXG5rZXJuZWwvc2lnbmFsLmMtMzAzMC1cdFx0XHQgKi9cbmtlcm5lbC9zaWduYWwuYzozMDMxOlx0XHRcdHZmc19jb3JlZHVtcChcdTAwMjZrc2lnLVx1MDAzZWluZm8pO1xua2VybmVsL3NpZ25hbC5jLTMwMzItXHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY5OTAKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzNjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBDb3JlIER1bXAgYW5kIFNNQiBTZW5kIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCB0aWVzIGludG8gdHdvIGRpc3RpbmN0IGFyZWFzOiBwcm9jZXNzIGNyYXNoZXMgbGVhZGluZyB0byBjb3JlIGR1bXBzIGFuZCBTTUIgY2xpZW50IHRyYW5zcG9ydC4gU3BlY2lmaWNhbGx5LCBJIHNlZSB0aGF0IGB2ZnNfY29yZWR1bXBgIGdldHMgY2FsbGVkIGZyb20gYGdldF9zaWduYWxgIHdoZW4gYSBwcm9jZXNzIGNyYXNoZXMsIGFuZCBgc21iX3NlbmRfa3ZlY2AgaXMgY2FsbGVkIGZyb20gYF9fc21iX3NlbmRfcnFzdGAgd2l0aGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gVGhhdCYjMzk7cyB0aGUgYmFzZWxpbmUuCgpCdXQgdGhlbiBJIHNlZSB0aGUgcGF0Y2ggbW9kaWZpZXMgYGluY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhgIGFuZCBgaW5jbHVkZS9saW51eC9zY2hlZC5oYCwgYW5kIGFkZHMgdGhlIGBQRl9OT19OT1RJRllfU0lHTkFMYCBmbGFnLiBIbW0sIHRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgbWVhdCBvZiB0aGUgYnVnIGZpeCBsaWVzLiBJdCYjMzk7cyBlc3NlbnRpYWxseSBwcmV2ZW50aW5nIGBUSUZfTk9USUZZX1NJR05BTGAgZnJvbSBpbnRlcnJ1cHRpbmcgdGhlIGNvcmUgZHVtcCBwcm9jZXNzIGFuZCB0aGUgU01CIHNlbmQgb3BlcmF0aW9uLgoKRnVuY3Rpb25hbGx5LCB0aGVzZSBjaGFuZ2VzIGFyZSBjbGVhcmx5IHNpZ25pZmljYW50IGFuZCwgZnJvbSB3aGF0IEkgY2FuIHNlZSwgcmVhY2hhYmxlLiBTbywgdGhlIGtleSBzeW1ib2xzIGhlcmUgZm9yIG1lIGFyZSBkZWZpbml0ZWx5IGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AuIEkmIzM5O20gdGhpbmtpbmcgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIHdvdWxkIGJlIGBDT1JFRFVNUGAgYW5kIGBDSUZTYCwgc2luY2UgdGhleSBkaXJlY3RseSByZWxhdGUgdG8gdGhlc2UgZnVuY3Rpb25hbGl0aWVzLgoKTGV0IG1lIGp1c3QgcXVpY2tseSB2YWxpZGF0ZSB0aGF0IGB2ZnNfY29yZWR1bXBgIGlzIHRoZSByaWdodCBjaG9pY2UgZm9yIHRoZSBjb3JlZHVtcCBzaWRlOyBZZXAsIGl0JiMzOTtzIHRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciBhY3R1YWxseSBnZW5lcmF0aW5nIHRoZSBjb3JlIGR1bXAsIHNvIGdvb2QuIEFuZCBgc21iX3NlbmRfa3ZlY2A/IERlZmluaXRlbHkgYSBnb29kIGZvY3VzIHN5bWJvbCwgaXQmIzM5O3MgdGhlIGFjdHVhbCBmdW5jdGlvbiB0aGF0JiMzOTtzIGJlaW5nIG1vZGlmaWVkIHdpdGhpbiBTTUIuCgpBbHJpZ2h0LCBhIHF1aWNrIHF1ZXN0aW9uIGFib3V0IGBzbWJfc2VuZF9rdmVjYCB0aG91Z2guIElzIGl0IGEgJiMzNDtob3QgcGF0aCYjMzQ7PyBXZWxsLCBpdCAqaXMqIGNhbGxlZCBmb3IgZXZlcnkgU01CIHJlcXVlc3QuLi4gc28gdGhhdCYjMzk7cyBhIGdvb2QgcGxhY2UgdG8gZm9jdXMuIEhvd2V2ZXIsIFNNQiBpc24mIzM5O3QgYSBnZW5lcmFsIGhvdCBwYXRoIGxpa2UgYSBgdGNwX3JlY3Ztc2dgIG9yIGEgYHNjaGVkdWxlYC4gSXQmIzM5O3Mgc3BlY2lmaWMgdG8gdGhlIFNNQiBmaWxlc3lzdGVtLCBhbmQgdGhhdCYjMzk7cyBpbXBvcnRhbnQgY29udGV4dC4gVGhhdCBtZWFucyBpdOKAmXMgZmluZSB0byBpbmNsdWRlIGluIHRoZSBsaXN0IG9mIHN5bWJvbHMuCgpMZXQmIzM5O3MgZG8gYSBxdWljayBzY2FuIGZvciBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy4gYGRvX2NvcmVkdW1wYCBpcyBzdGF0aWMsIHNvIGB2ZnNfY29yZWR1bXBgIGlzIGRlZmluaXRlbHkgdGhlIGJldHRlciBvcHRpb24uIEFuZCBgX19zbWJfc2VuZF9ycXN0YCBpcyBhbHNvIGEgdmFsaWQgc3ltYm9sLCBidXQgSSBzZWUgdGhlIG9uZSB0aGF0JiMzOTtzIGFjdHVhbGx5IGJlaW5nIG1vZGlmaWVkIGlzIGBzbWJfc2VuZF9rdmVjYCwgc28gSSYjMzk7bGwgc3RpY2sgd2l0aCB0aGF0LgoKRmluYWxseSwganVzdCBhIHF1aWNrIGNoZWNrOiBsZXQgbWUgY29uZmlybSB0aGF0IGBzbWJfc2VuZF9rdmVjYCBpcyBhY3R1YWxseSBleHBvcnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipzbWJfc2VuZF9rdmVjJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvc21iL2NsaWVudC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzk2MQoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duLCBnaXZlbiBteSBleHBlcnRpc2U6CgoqKkV4YW1pbmluZyB0aGUgQ29udGV4dCBvZiBhIE1vZHVsZSoqCgpBbHJpZ2h0LCBzbyB0aGlzIGlzbiYjMzk7dCBhIGRpcmVjdCBleHBvcnQsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBCdXQgaXQmIzM5O3MgYWxzbyAqbm90KiBzdGF0aWMsIG1lYW5pbmcgaXQmIzM5O3MgZHluYW1pYyBpbiBzb21lIHdheSwgYW5kIGl0cyB1c2FnZSBpcyBjb250YWluZWQgd2l0aGluIHRoZSBgZnMvc21iL2NsaWVudC9gIG1vZHVsZS4gVGhhdCYjMzk7cyBhIGtleSBwaWVjZSBvZiBpbmZvcm1hdGlvbi4gU2luY2UgaXQmIzM5O3MgbW9kdWxlLWludGVybmFsLCBJIHNob3VsZCBjb25zaWRlciB0aGUgaW1wbGljYXRpb25zIGZvciBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIHN0cmF0ZWdpZXMgaW4gdGhhdCBwYXJ0aWN1bGFyIFNNQiBjbGllbnQgc3Vic3lzdGVtLiBUaGlzIG1lYW5zIGl0cyBzdGF0ZSBvciBkYXRhIGxpZmVjeWNsZSBpcyBsaWtlbHkgaW50ZXJ0d2luZWQgd2l0aCB0aGF0IG1vZHVsZSYjMzk7cyBpbnN0YW50aWF0aW9uIGFuZCBvcGVyYXRpb24sIGFuZCB1bmRlcnN0YW5kaW5nIHRoYXQgZmxvdyBpcyBjcml0aWNhbC4KCk5vdywgZ2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgbW9kdWxlIGFuZCB0aGUgaW1wbGljaXQgcnVudGltZSBlbnZpcm9ubWVudCwgdGhlICpuZXh0KiB0aGluZyB0byBsb29rIGF0IGlzIHRoZSBgQ09SRURVTVBgIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IGBDT1JFRFVNUGAgc2V0dGluZ3Mgd291bGQgYWRlcXVhdGVseSBjYXB0dXJlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBtb2R1bGUsIGlmIHRoZXJlJiMzOTtzIGEgcHJvYmxlbS4gQXJlIHdlIHNldCB1cCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGhpbiB0aGUgbW9kdWxlIGR1cmluZyBleGVjdXRpb24/IFRoYXQmIzM5O3MgdGhlIG9idmlvdXMgbmV4dCBzdGVwIHRvIGdldCBhIGJldHRlciB2aWV3IG9mIHRoaXMgbW9kdWxlJiMzOTtzIGJlaGF2aW9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQ09SRURVTVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvS2NvbmZpZy5iaW5mbXQ9MTQ1PWNvbmZpZyBCSU5GTVRfTUlTQ1xuLS1cbmZzL0tjb25maWcuYmluZm10LTE3MC1cbmZzL0tjb25maWcuYmluZm10OjE3MTpjb25maWcgQ09SRURVTVBcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGNvcmUgZHVtcCBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODM1OQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMsIHNwZWFraW5nIGFzIGFuIGV4cGVydDoKCioqQ29uY2VybmluZyBDb3JlIER1bXBzIGFuZCBDSUZTKioKCkFscmlnaHQsIHNvIHRoZSBpbW1lZGlhdGUgY29ubmVjdGlvbiBJJiMzOTttIG1ha2luZyBoZXJlIGlzIGFib3V0IGEgc3BlY2lmaWMgc2V0IG9mIGRlYnVnZ2luZyBzY2VuYXJpb3MuIFRoaW5raW5nICYjMzQ7Q09SRURVTVAmIzM0OyBzdWdnZXN0cyBJJiMzOTttIGxpa2VseSBrbmVlLWRlZXAgaW4gdHJvdWJsZXNob290aW5nIHNvbWV0aGluZyDigJMgYSBjcmFzaCwgYSBwcm9jZXNzIHRoYXQmIzM5O3MgZ29uZSBzaWRld2F5cywgbWF5YmUgYSBtZW1vcnkgbGVhaywgb3IgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LiBNeSBmaXJzdCBpbnN0aW5jdCB3b3VsZCBiZSB0byBncmFiIHRoZSBjb3JlIGR1bXAgaXRzZWxmIGFuZCBhbmFseXplIGl0IHdpdGggR0RCIG9yIGEgc2ltaWxhciBkZWJ1Z2dlciwgdG8gdW5kZXJzdGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSBhdCB0aGUgbW9tZW50IG9mIHRoZSBjcmFzaC4gSSYjMzk7ZCBiZSBsb29raW5nIGF0IHN0YWNrIHRyYWNlcywgbWVtb3J5IG1hcHMsIHJlZ2lzdGVycywgZXZlcnl0aGluZy4KClRoZSBmYWN0IHRoYXQgJiMzNDtDSUZTJiMzNDsgcG9wcGVkIHVwIHJpZ2h0IGFsb25nc2lkZSBpdCBpcyBjcnVjaWFsLiBUaGlzIHNjcmVhbXMgbmV0d29yayBmaWxlc3lzdGVtIGlzc3Vlcy4gV2UgY291bGQgYmUgZGVhbGluZyB3aXRoIGEgcHJvYmxlbSB3aGVyZSBhIHByb2Nlc3MgYWNjZXNzaW5nIGZpbGVzIG9uIGEgQ0lGUyBzaGFyZSBjcmFzaGVkLCBwb3RlbnRpYWxseSBkdWUgdG8gcGVybWlzc2lvbnMgaXNzdWVzLCBuZXR3b3JrIGNvbm5lY3Rpdml0eSBwcm9ibGVtcywgb3IgZXZlbiBhIGJ1ZyBpbiB0aGUgQ0lGUyBjbGllbnQgb3Igc2VydmVyIGltcGxlbWVudGF0aW9uIGl0c2VsZi4gVGhhdCBjb3JlIGR1bXAgaXMgbm93IGludmFsdWFibGUuIEl0JiMzOTtzIG5vdCBqdXN0IGFib3V0IGEgbG9jYWwgY3Jhc2g7IGl0JiMzOTtzIGFib3V0IGRpc3RyaWJ1dGVkIHN0b3JhZ2UsIGFuZCB0aGUgY29tcGxleGl0aWVzIHRoYXQgZW50YWlscy4gSeKAmWQgYmUgY2hlY2tpbmcgbmV0d29yayBjb25maWd1cmF0aW9ucywgc2hhcmUgcGVybWlzc2lvbnMsIGxvb2tpbmcgYXQgU2FtYmEgbG9ncywgbWFraW5nIHN1cmUgZXZlcnl0aGluZyBpcyBhbGlnbmVkIGZvciBhIG5ldHdvcmsgZmlsZS1zaGFyaW5nIHN5c3RlbS4gVGhlIGNvcmUgZHVtcCBoYXMgdG8gYmUgaW50ZXJwcmV0ZWQgaW4gdGhlIGNvbnRleHQgb2YgQ0lGUywgbWFraW5nIHRoZSB0cm91Ymxlc2hvb3RpbmcgY29uc2lkZXJhYmx5IG1vcmUgY29tcGxleCBidXQgYWxzbyBtb3JlIGludGVyZXN0aW5nLiBJdCBuYXJyb3dzIGRvd24gdGhlIHNlYXJjaCBjb25zaWRlcmFibHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDSUZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3NtYi9jbGllbnQvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjI6Y29uZmlnIENJRlNcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVx0dHJpc3RhdGUgXCYjMzQ7U01CMyBhbmQgQ0lGUyBzdXBwb3J0IChhZHZhbmNlZCBuZXR3b3JrIGZpbGVzeXN0ZW0pXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTUzLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxuZnMvc21iL2NsaWVudC9LY29uZmlnLTU1LVx0Ym9vbCBcJiMzNDtFeHRlbmRlZCBzdGF0aXN0aWNzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjY4OmNvbmZpZyBDSUZTX0FMTE9XX0lOU0VDVVJFX0xFR0FDWVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY5LVx0Ym9vbCBcJiMzNDtTdXBwb3J0IGxlZ2FjeSBzZXJ2ZXJzIHdoaWNoIHVzZSBsZXNzIHNlY3VyZSBkaWFsZWN0c1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04Mi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo4Mzpjb25maWcgQ0lGU19VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7S2VyYmVyb3MvU1BORUdPIGFkdmFuY2VkIHNlc3Npb24gc2V0dXBcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05My1cdGJvb2wgXCYjMzQ7Q0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMDc6Y29uZmlnIENJRlNfUE9TSVhcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMDgtXHRib29sIFwmIzM0O0NJRlMgUE9TSVggRXh0ZW5zaW9uc1wmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMTgtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTE5OmNvbmZpZyBDSUZTX0RFQlVHXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVx0Ym9vbCBcJiMzNDtFbmFibGUgQ0lGUyBkZWJ1Z2dpbmcgcm91dGluZXNcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI3LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjktXHRib29sIFwmIzM0O0VuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMzk6Y29uZmlnIENJRlNfREVCVUdfRFVNUF9LRVlTXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTQwLVx0Ym9vbCBcJiMzNDtEdW1wIGVuY3J5cHRpb24ga2V5cyBmb3Igb2ZmbGluZSBkZWNyeXB0aW9uIChVbnNhZmUpXCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE0OC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNDk6Y29uZmlnIENJRlNfREZTX1VQQ0FMTFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cdGJvb2wgXCYjMzQ7REZTIGZlYXR1cmUgc3VwcG9ydFwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjEtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNjMtXHRib29sIFwmIzM0O1NXTiBmZWF0dXJlIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE3Mzpjb25maWcgQ0lGU19ORlNEX0VYUE9SVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE3NC1cdGJvb2wgXCYjMzQ7QWxsb3cgbmZzZCB0byBleHBvcnQgQ0lGUyBmaWxlIHN5c3RlbVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZz0xNzk9aWYgQ0lGU1xuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE4Mi1cdGJvb2wgXCYjMzQ7U01CIERpcmVjdCBzdXBwb3J0XCYjMzQ7XG4tLVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxOTE6Y29uZmlnIENJRlNfRlNDQUNIRVxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5Mi1cdGJvb2wgXCYjMzQ7UHJvdmlkZSBDSUZTIGNsaWVudCBjYWNoaW5nIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTk4LVxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE5OTpjb25maWcgQ0lGU19ST09UXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVx0Ym9vbCBcJiMzNDtTTUIgcm9vdCBmaWxlIHN5c3RlbSAoRXhwZXJpbWVudGFsKVwmIzM0O1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0yMDYtXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjA4LVx0Ym9vbCBcJiMzNDtTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTczMwoJCQkJCQkJb3V0cHV0OiAxNTQKCQkJCQkJCXRob3VnaHRzOiAyNzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEtlcm5lbCBQYXRjaCoqCgpPa2F5LCBzbyB0aGUgcGF0Y2ggaXMgZGVmaW5pdGVseSByZWxhdGVkIHRvIGBDSUZTYCwgdGhhdCBtdWNoIGlzIGNsZWFyLiBMZXQmIzM5O3MgZGlnIGEgbGl0dGxlIGRlZXBlciBhbmQgc2VlIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbnMgbWlnaHQgYmUgaW52b2x2ZWQuIEhtbSwgaXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggdG91Y2hlcyBgZnMvY29yZWR1bXAuY2AgYW5kIHRoZSBTTUIgY2xpZW50IHRyYW5zcG9ydCBjb2RlIGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gVGhhdCBzdHJvbmdseSBzdWdnZXN0cyBgQ09SRURVTVBgIGFuZCBgQ0lGU2AgYXJlIGVzc2VudGlhbCBmb3IgdGhpcyB0byB3b3JrLiBJJiMzOTtsbCBtYWtlIGEgbm90ZSBvZiB0aGF0LgoKTm93LCBsZXQmIzM5O3MgbG9vayBhdCBwb3RlbnRpYWxseSBnb29kIGZ1enppbmcgdGFyZ2V0cy4gYHZmc19jb3JlZHVtcGAgc2VlbXMgcHJvbWlzaW5nIGFzIGEgc3RhcnRpbmcgcG9pbnQuIFllcCwgaXQmIzM5O3MgYSBub24tc3RhdGljIEFQSSBlbnRyeXBvaW50LCB3aGljaCBpcyB1c3VhbGx5IGEgZ29vZCBzaWduLiBBbmQgaGVyZSYjMzk7cyBhbm90aGVyLCBgc21iX3NlbmRfa3ZlY2Ag4oCTIGFsc28gYSBub24tc3RhdGljIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9uLiBUaG9zZSBhcmUgZGVmaW5pdGVseSB3b3J0aCBpbnZlc3RpZ2F0aW5nIGZ1cnRoZXIuCgpJIGdsYW5jZWQgYXQgYG5vX25vdGlmeV9zaWduYWxfc2F2ZWAgYW5kIGBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmVgIHRvbywgYnV0IHRob3NlIGFyZSBzdGF0aWMgaW5saW5lLiBUaGF0IG1lYW5zIHRoZXkgZG9uJiMzOTt0IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3Nlcywgc28gdGhleSYjMzk7cmUgcHJvYmFibHkgbm90IGFzIGludGVyZXN0aW5nIGZvciBkaXJlY3QgZnV6emluZyB0YXJnZXRzLgoKU28sIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZyBvZiB3aGF0JiMzOTtzIGhhcHBlbmluZzogVGhpcyBwYXRjaCBpcyBhbGwgYWJvdXQgcHJldmVudGluZyBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIHNwZWNpZmljIHByb2Nlc3Nlcy4gSXQmIzM5O3MgZXNzZW50aWFsbHkgaW50cm9kdWNpbmcgYSBtZWNoYW5pc20gdG8gbWFzayBzaWduYWxzIGR1cmluZyBjb3JlZHVtcCBnZW5lcmF0aW9uIGFuZCBuZXR3b3JrIHRyYW5zbWlzc2lvbiB2aWEgU01CLiBUaGUga2V5IGlzIHRoYXQgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcgaXMgYmVpbmcgaW50cm9kdWNlZCwgYW5kIGBzaWduYWxfcGVuZGluZygpYCBpcyBiZWluZyBtb2RpZmllZCB0byByZXNwZWN0IGl0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZSwgZXNwZWNpYWxseSBiZWNhdXNlIHdlJiMzOTtyZSBsb29raW5nIGF0IGNvcmUga2VybmVsIGxvZ2ljIHdpdGggYHZmc19jb3JlZHVtcCgpYCBhbmQgdGhlIFNNQiBjbGllbnQgZHJpdmVyIHdpdGggYHNtYl9zZW5kX2t2ZWMoKWAuIEJvdGggYXJlIGNsZWFybHkgcmVhY2hhYmxlIGFuZCByZWxldmFudCB0byBmdXp6aW5nLiBHaXZlbiB3aGF0IEkmIzM5O20gc2VlaW5nLCB0aGlzIGlzIHdvcnRoIG91ciB0aW1lLiBJJiMzOTtsbCBnbyBhaGVhZCBhbmQgbG9nIHRoaXMgYXMgYSByZXN1bHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDT1JFRFVNUCYjMzQ7LAogICAgJiMzNDtDSUZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDssCiAgICAmIzM0O3NtYl9zZW5kX2t2ZWMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG1lY2hhbmlzbSB0byBwcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHNwZWNpZmljIHRhc2tzLCBzcGVjaWZpY2FsbHkgZHVyaW5nIGNvcmVkdW1wIGdlbmVyYXRpb24gYW5kIFNNQiBuZXR3b3JrIHRyYW5zbWlzc2lvbi4gSXQgYWRkcyBQRl9OT19OT1RJRllfU0lHTkFMIHRvIHRhc2sgZmxhZ3MgYW5kIG1vZGlmaWVzIHNpZ25hbF9wZW5kaW5nKCkgdG8gcmVzcGVjdCBpdC4gVGhlIGNvcmUgY2hhbmdlcyBhcmUgaW4gdmZzX2NvcmVkdW1wKCkgYW5kIHNtYl9zZW5kX2t2ZWMoKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCB0aGUgU01CIGNsaWVudCBkcml2ZXIsIHdoaWNoIGFyZSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDssCiAgICAmIzM0O0NJRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OywKICAgICYjMzQ7c21iX3NlbmRfa3ZlYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxMTozMjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBzaWduYWwgaGFuZGxpbmcgYmVoYXZpb3IgYnkgaW50cm9kdWNpbmcgYFBGX05PX05PVElGWV9TSUdOQUxgIHRvIHByZXZlbnQgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBjb3JlZHVtcHMgKGB2ZnNfY29yZWR1bXBgKSBhbmQgU01CIHNlbmQgb3BlcmF0aW9ucyAoYHNtYl9zZW5kX2t2ZWNgKS4gVGhlIGNoYW5nZXMgYXJlIHB1cmVseSByZWxhdGVkIHRvIHRhc2sgZmxhZ3MsIGNvbnRyb2wgZmxvdywgYW5kIHNpZ25hbCBtYXNraW5nIHRvIGF2b2lkIHByZW1hdHVyZSBhYm9ydHMgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBubyBuZXcgZmllbGRzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBidWZmZXIgbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGFyZSBhbHRlcmVkIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3IgbG9naWMgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY4ZTQxYTNjOWNlMjIwZmUxMzU3MmZkNDk0NWI2ZGFlZTU1YmUwY2UKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAxOCAxMTozMToyMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtMTE2NSw2ICYjNDM7MTE2NSw3IEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pCiAJc3RydWN0IGNvcmVfbmFtZSBjbjsKIAljb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtJmd0O21tOwogCWNvbnN0IHN0cnVjdCBsaW51eF9iaW5mbXQgKmJpbmZtdCA9IG1tLSZndDtiaW5mbXQ7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IGFyZ2MgPSAwOwogCXN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHsKIAkJLnNpZ2luZm8gPSBzaWdpbmZvLApAQCAtMTE5Niw5ICYjNDM7MTE5NywxMiBAQCB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKQogCWlmIChjb3JlZHVtcF93YWl0KHNpZ2luZm8tJmd0O3NpX3NpZ25vLCAmYW1wO2NvcmVfc3RhdGUpICZsdDsgMCkKIAkJcmV0dXJuOwogCiYjNDM7CS8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqLwomIzQzOwlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAlzY29wZWRfd2l0aF9jcmVkcyhjcmVkKQogCQlkb19jb3JlZHVtcCgmYW1wO2NuLCAmYW1wO2Nwcm0sICZhbXA7YXJndiwgJmFtcDthcmdjLCBiaW5mbXQpOwogCWNvcmVkdW1wX2NsZWFudXAoJmFtcDtjbiwgJmFtcDtjcHJtKTsKJiM0MzsJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jIGIvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYwppbmRleCBmZGY0ZTUwYzI3Y2ViLi4wNWRjMjA5MTZjMjc2IDEwMDY0NAotLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMKQEAgLTIyLDcgJiM0MzsyMiw2IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtcG9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKICNpbmNsdWRlICYjMzQ7Y2lmc2dsb2IuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O2NpZnNwcm90by5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Y2lmc19kZWJ1Zy5oJiMzNDsKQEAgLTE0Miw2ICYjNDM7MTQxLDcgQEAgaW50CiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkgICAgICBzaXplX3QgKnNlbnQpCiB7CiYjNDM7CXVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7CiAJaW50IHJjID0gMDsKIAlpbnQgcmV0cmllcyA9IDA7CiAJc3RydWN0IHNvY2tldCAqc3NvY2tldCA9IHNlcnZlci0mZ3Q7c3NvY2tldDsKQEAgLTE3MiwxNSAmIzQzOzE3MiwxMiBAQCBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKIAkJICogYWZ0ZXIgdGhlIHJldHJpZXMgd2Ugd2lsbCBraWxsIHRoZSBzb2NrZXQgYW5kCiAJCSAqIHJlY29ubmVjdCB3aGljaCBtYXkgY2xlYXIgdGhlIG5ldHdvcmsgcHJvYmxlbS4KIAkJICoKLQkJICogRXZlbiBpZiByZWd1bGFyIHNpZ25hbHMgYXJlIG1hc2tlZCwgRUlOVFIgbWlnaHQgYmUKLQkJICogcHJvcGFnYXRlZCBmcm9tIHNrX3N0cmVhbV93YWl0X21lbW9yeSgpIHRvIGhlcmUgd2hlbgotCQkgKiBUSUZfTk9USUZZX1NJR05BTCBpcyB1c2VkIGZvciB0YXNrIHdvcmsuIEZvciBleGFtcGxlLAotCQkgKiBjZXJ0YWluIGlvX3VyaW5nIGNvbXBsZXRpb25zIHdpbGwgdXNlIHRoYXQuIFRyZWF0Ci0JCSAqIGhhdmluZyBFSU5UUiB3aXRoIHBlbmRpbmcgdGFzayB3b3JrIHRoZSBzYW1lIGFzIEVBR0FJTgotCQkgKiB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNvbm5lY3RzLgomIzQzOwkJICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS4KIAkJICovCiYjNDM7CQlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAkJcmMgPSBzb2NrX3NlbmRtc2coc3NvY2tldCwgc21iX21zZyk7Ci0JCWlmIChyYyA9PSAtRUFHQUlOIHx8IHVubGlrZWx5KHJjID09IC1FSU5UUiAmYW1wOyZhbXA7IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkgewomIzQzOwkJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CiYjNDM7CQlpZiAocmMgPT0gLUVBR0FJTikgewogCQkJcmV0cmllcyYjNDM7JiM0Mzs7CiAJCQlpZiAocmV0cmllcyAmZ3Q7PSAxNCB8fAogCQkJICAgICghc2VydmVyLSZndDtub2Jsb2Nrc25kICZhbXA7JmFtcDsgKHJldHJpZXMgJmd0OyAyKSkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCAzNzNiY2MwNTk4ZDEwLi5mZDcyY2E0ZWU5MmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xNzk2LDcgJiM0MzsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7CiAJCQkJCQkgKiBJIGFtIGNsZWFuaW5nIGRpcnR5IHBhZ2VzIGZyb20gc29tZSBvdGhlciBiZGkuICovCiAjZGVmaW5lIFBGX0tUSFJFQUQJCTB4MDAyMDAwMDAJLyogSSBhbSBhIGtlcm5lbCB0aHJlYWQgKi8KICNkZWZpbmUgUEZfUkFORE9NSVpFCQkweDAwNDAwMDAwCS8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgUEZfX0hPTEVfXzAwODAwMDAwCTB4MDA4MDAwMDAKJiM0MzsjZGVmaW5lIFBGX05PX05PVElGWV9TSUdOQUwJMHgwMDgwMDAwMAkvKiBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkgKi8KICNkZWZpbmUgUEZfX0hPTEVfXzAxMDAwMDAwCTB4MDEwMDAwMDAKICNkZWZpbmUgUEZfX0hPTEVfXzAyMDAwMDAwCTB4MDIwMDAwMDAKICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFkJMHgwNDAwMDAwMAkvKiBVc2VybGFuZCBpcyBub3QgYWxsb3dlZCB0byBtZWRkbGUgd2l0aCBjcHVzX21hc2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCmluZGV4IDU4NGFlODhiNDM1ZTkuLjMxODJkZTRmZjk0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaApAQCAtMzg0LDE0ICYjNDM7Mzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiAJcmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTsKIH0KIAomIzQzOy8qIFByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhpcyB0YXNrLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vX25vdGlmeV9zaWduYWxfc2F2ZSh2b2lkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IGZsYWdzID0gY3VycmVudC0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsKJiM0MzsJY3VycmVudC0mZ3Q7ZmxhZ3MgfD0gUEZfTk9fTk9USUZZX1NJR05BTDsKJiM0MzsJcmV0dXJuIGZsYWdzOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJY3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW5saW5lIGludCBzaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJLyoKIAkgKiBUSUZfTk9USUZZX1NJR05BTCBpc24mIzM5O3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWUKIAkgKiBiZWhhdmlvciBpbiB0ZXJtcyBvZiBlbnN1cmluZyB0aGF0IHdlIGJyZWFrIG91dCBvZiB3YWl0IGxvb3BzCi0JICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLgomIzQzOwkgKiBzbyB0aGF0IG5vdGlmeSBzaWduYWwgY2FsbGJhY2tzIGNhbiBiZSBwcm9jZXNzZWQuIE5vdCBmb3IgYSB0YXNrCiYjNDM7CSAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuCiAJICovCi0JaWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkpCiYjNDM7CWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpICZhbXA7JmFtcDsKJiM0MzsJICAgIGxpa2VseSghKFJFQURfT05DRShwLSZndDtmbGFncykgJmFtcDsgUEZfTk9fTk9USUZZX1NJR05BTCkpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gdGFza19zaWdwZW5kaW5nKHApOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQppbmRleCBkZWNlMWEzMWQ1NjFiLi43MjhmM2MzNDJlYjkyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZQpAQCAtMyw3ICYjNDM7MywxMCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QKJiM0MzsjIFNwYXduZWQgYnkgdGhlIGtlcm5lbCBhcyB0aGUgfGhlbHBlciwgbm90IGEgdGVzdCBvZiBpdHMgb3duLgomIzQzO1RFU1RfR0VOX0ZJTEVTIDo9IGNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyCiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwomIzQzOyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlcjogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi45YTI4OTJkZTgxOTJiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oCkBAIC0wLDAgJiM0MzsxLDI5IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9ICiYjNDM7I2RlZmluZSBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90eXBlcy5oJmd0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUKJiM0MzsgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0JiMzOTtzIHdheSBiZXlvbmQgdGhlIGRlZmF1bHQgNjRLCiYjNDM7ICogcGlwZSByaW5nIGFuZCBwYXN0IHRoZSB+MzZLIGFuIGFmX3VuaXggc2tiIGhvbGRzLiBTbyB3ZSBmb3JjZSBhIHdyaXRlCiYjNDM7ICogdG8gY29tZSBiYWNrIHNob3J0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQJCTQwMDAKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUwkoNFVMICZsdDsmbHQ7IDIwKQomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VUwkJMjAwMDAwCiYjNDM7I2RlZmluZSBOT1RJRllfU0lHTkFMX01BUEZJTEUJCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLm1hcGZpbGUmIzM0OwomIzQzOyNkZWZpbmUgTk9USUZZX1NJR05BTF9UUklHR0VSCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5jb3JlJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFCSYjMzQ7L3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wJiMzNDsKJiM0MzsjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUCQkmIzM0Oy90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5zb2NrZXQmIzM0OwomIzQzOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKTsKJiM0Mztzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKTsKJiM0Mztsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpOwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODQ5ZjVjMWVhNzM2NQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMKQEAgLTAsMCAmIzQzOzEsNDYgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHxoZWxwZXIgaGFsZiBvZiBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuIFRoZSBrZXJuZWwgc3Bhd25zIHRoaXMKJiM0MzsgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LgomIzQzOyAqIEl0IHNhdmVzIHRoZSBkdW1wIGFuZCwgb25jZSB0aGUgbm90ZXMgaGF2ZSBzdGFydGVkLCB0cmlwcyB0aGUgZmlmbyB0aGUKJiM0MzsgKiBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgc28gVElGX05PVElGWV9TSUdOQUwgaXMgcmFpc2VkIHdoaWxlIHRoZSBub3RlCiYjNDM7ICogd3JpdGUgaXMgaW4gZmxpZ2h0LgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwomIzQzOwomIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiYjNDM7ewomIzQzOwlpbnQgZmRfY29yZV9maWxlOwomIzQzOwlzc2l6ZV90IHJldDsKJiM0MzsKJiM0MzsJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwKJiM0MzsJCQkgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7CiYjNDM7CWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogb3BlbiBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlyZXR1cm4gRVhJVF9GQUlMVVJFOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7CiYjNDM7CWNsb3NlKGZkX2NvcmVfZmlsZSk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CS8qIFRoZSB0ZXN0IHBvbGxzIGZvciB0aGlzIG5hbWUsIHNvIG9ubHkgY3JlYXRlIGl0IG9uY2UgaXQgaXMgd2hvbGUuICovCiYjNDM7CWlmIChyZW5hbWUoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlbmFtZSBmYWlsZWQ6ICVtXG4mIzM0OywgYXJndlswXSk7CiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gRVhJVF9TVUNDRVNTOwomIzQzOwomIzQzO2VycjoKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTsKJiM0MzsJcmV0dXJuIEVYSVRfRkFJTFVSRTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2M2MwNmE4MTU2MmYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYwpAQCAtMCwwICYjNDM7MSwyNDUgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjb3JlZHVtcCBpcyBtZWFudCB0byBiZSBpbnRlcnJ1cHRlZCBieSBTSUdLSUxMIGFuZCBieSB0aGUgZnJlZXplciBhbmQKJiM0MzsgKiBieSBub3RoaW5nIGVsc2UuIGR1bXBfaW50ZXJydXB0ZWQoKSBzYXlzIHNvLCBidXQgdGhlIGJsb2NraW5nIHdhaXRzCiYjNDM7ICogdW5kZXJuZWF0aCBpdCB0ZXN0IHNpZ25hbF9wZW5kaW5nKCksIHdoaWNoIGlzIGFsc28gdHJ1ZSBmb3IKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTC4gQSBjcmFzaGluZyB0YXNrIHRoYXQgaGFzIGFuIGlvX3VyaW5nIGNvbXBsZXRpb24gbGFuZAomIzQzOyAqIG9uIGl0IG1pZC1kdW1wIHRoZXJlZm9yZSBrZWVwcyBkdW1waW5nIHdoaWxlIGV2ZXJ5IHdhaXQgaXQgZW50ZXJzIGJhaWxzCiYjNDM7ICogb3V0IGF0IG9uY2UsIGFuZCB0aGUgZHVtcCBpcyBzaWxlbnRseSBjdXQgc2hvcnQuIE5vdGhpbmcgcmVwb3J0cyBpdDoKJiM0MzsgKiBiaW5mbXRfZWxmIHNldHMgaGFzX2R1bXBlZCBiZWZvcmUgaXQgd3JpdGVzIGFueXRoaW5nLCBzbyBXQ09SRURVTVAoKQomIzQzOyAqIHNheXMgdGhlIGR1bXAgd29ya2VkLgomIzQzOyAqCiYjNDM7ICogQSBjb3JlZHVtcCBub3RlIGlzIHRoZSBvbmx5IGR1bXBfZW1pdCgpIHRoYXQgZXhjZWVkcyB3aGF0IHRoZSB0cmFuc3BvcnQKJiM0MzsgKiB0YWtlcyBpbiBvbmUgZ28sIHNvIGl0IGlzIHRoZSBvbmUgd3JpdGUgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLiBCb3RoCiYjNDM7ICogdGVzdHMgY3Jhc2ggYSBjaGlsZCBob2xkaW5nIGVub3VnaCBmaWxlIGJhY2tlZCBtYXBwaW5ncyBmb3IgaXRzIE5UX0ZJTEUKJiM0MzsgKiBub3RlIHRvIHJ1biBwYXN0IHRoYXQsIGFybSBhbiBpb191cmluZyBwb2xsIG9uIGl0LCBhbmQgdHJpcCB0aGUgcG9sbAomIzQzOyAqIHdoaWxlIHRoZSBub3RlIGlzIGJlaW5nIHdyaXR0ZW4uIFdoYXQgY29tZXMgb3V0IGhhcyB0byBiZSB0aGUgd2hvbGUKJiM0MzsgKiBkdW1wLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3NvY2tldC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLAomIzQzOwkJICAgIHNpemVvZihzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTsKJiM0MzsJQVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpOwomIzQzOwlBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7CiYjNDM7CiYjNDM7CXNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybltyZXRdID0gJiMzOTtcMCYjMzk7OwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpOwomIzQzOwlBU1NFUlRfR0Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQsIDApOwomIzQzOwomIzQzOwlyZXQgPSBmY2xvc2UoZmlsZSk7CiYjNDM7CUFTU0VSVF9FUSgwLCByZXQpOwomIzQzOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJQVNTRVJUX0VRKG1rZmlmbyhOT1RJRllfU0lHTkFMX1RSSUdHRVIsIDA2MDApLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9TT0NLRVQpOwomIzQzOwl1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTsKJiM0MzsJdW5saW5rKE5PVElGWV9TSUdOQUxfTUFQRklMRSk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2hlY2sgdGhhdCB3aGF0IHRoZSBoZWxwZXIgb3IgdGhlIHNlcnZlciBzYXZlZCBpcyB0aGUgd2hvbGUgZHVtcC4gT25seQomIzQzOyAqIGEgaG9sZSBhdCB0aGUgdmVyeSBlbmQgY2FuIGJlIG1pc3NpbmcsIHNlZSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfd2hvbGVfY29yZWR1bXAoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhKQomIzQzO3sKJiM0MzsJbG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJZXhwZWN0ZWQgPSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCAmYW1wO3RhaWwpOwomIzQzOwlBU1NFUlRfR1QoZXhwZWN0ZWQsIDApOwomIzQzOwlBU1NFUlRfRVEoc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCksIDApOwomIzQzOwlBU1NFUlRfTEUoKGxvbmcgbG9uZylzdC5zdF9zaXplLCBleHBlY3RlZCk7CiYjNDM7CUFTU0VSVF9HRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkIC0gdGFpbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGR1bXAgZ29lcyB0byBhIHxoZWxwZXIsIHNvIHRoZSByZWFkZXIgaXMgYSBzZXBhcmF0ZSBwcm9ncmFtIHRoZQomIzQzOyAqIGtlcm5lbCBzcGF3bnMuIEl0IHNhdmVzIHdoYXQgaXQgcmVjZWl2ZWQgdG8gTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUuCiYjNDM7ICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3BpcGUpCiYjNDM7ewomIzQzOwljaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzdGF0dXMsIGk7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJbiA9IHJlYWRsaW5rKCYjMzQ7L3Byb2Mvc2VsZi9leGUmIzM0OywgaGVscGVyLCBzaXplb2YoaGVscGVyKSAtIDEpOwomIzQzOwlBU1NFUlRfR1QobiwgMCk7CiYjNDM7CWhlbHBlcltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJcCA9IHN0cnN0cihoZWxwZXIsICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0JiMzNDspOwomIzQzOwlBU1NFUlRfTkUocCwgTlVMTCk7CiYjNDM7CUFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSAmIzQzOyBzaXplb2YoJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KSwKJiM0MzsJCSAgc2l6ZW9mKGhlbHBlcikpOwomIzQzOwlzdHJjcHkocCwgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciYjMzQ7KTsKJiM0MzsJaWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIgbm90IGJ1aWx0JiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O3wlcyYjMzQ7LCBoZWxwZXIpLAomIzQzOwkJICAoaW50KXNpemVvZihwYXR0ZXJuKSk7CiYjNDM7CUFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJLyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgJmFtcDtzdCkgJmFtcDsmYW1wOyBzdC5zdF9zaXplKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi8KJiM0MztURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfc29ja2V0KQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyOwomIzQzOwlpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1czsKJiM0MzsJY2hhciBwYXR0ZXJuW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7aW9fdXJpbmcgbm90IGF2YWlsYWJsZSYjMzQ7KTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsCiYjNDM7CQkJICAgICBpcGNfc29ja2V0cyksIDApOwomIzQzOwlBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCAmIzM0O0AlcyYjMzQ7LAomIzQzOwkJCSAgIE5PVElGWV9TSUdOQUxfU09DS0VUKSwgKGludClzaXplb2YocGF0dGVybikpOwomIzQzOwlBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQlpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xOwomIzQzOwkJaW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKJiM0MzsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzBdKTsKJiM0MzsKJiM0MzsJCWZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KE5PVElGWV9TSUdOQUxfU09DS0VUKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKHdyaXRlX25vaW50cihpcGNfc29ja2V0c1sxXSwgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWNsb3NlKGlwY19zb2NrZXRzWzFdKTsKJiM0MzsKJiM0MzsJCWZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7CiYjNDM7CQlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwKJiM0MzsJCQkJICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsCiYjNDM7CQkJCSAgICAwNjAwKTsKJiM0MzsJCWlmIChmZF9jb3JlX2ZpbGUgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJaWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLAomIzQzOwkJCQkJCXRydWUpICZsdDsgMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJCWV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUzsKJiM0MztvdXQ6CiYjNDM7CQlpZiAoZmRfY29yZV9maWxlICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRfY29yZV9maWxlKTsKJiM0MzsJCWlmIChmZF9jb3JlZHVtcCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX2NvcmVkdW1wKTsKJiM0MzsJCWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZF9zZXJ2ZXIpOwomIzQzOwkJX2V4aXQoZXhpdF9jb2RlKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwlwaWQgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWQsIDApOwomIzQzOwlpZiAocGlkID09IDApCiYjNDM7CQljcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJd2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7CiYjNDM7CiYjNDM7CWNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmgKaW5kZXggZWQ0N2YwMWZhNTNjNS4uMDZmOTk3YmE0N2ZkOSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaApAQCAtOSw2ICYjNDM7OSw3IEBACiAKICNpbmNsdWRlICYjMzQ7Li4va3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0Oy4uL3BpZGZkL3BpZGZkLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oJiMzNDsKIAogI2lmbmRlZiBQQUdFX1NJWkUKICNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKQEAgLTEsMTEgJiM0MzsxLDE4IEBACiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAogCiAjaW5jbHVkZSAmbHQ7YXNzZXJ0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2VsZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtlbmRpYW4uaCZndDsKICNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwogI2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbmsuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RkZGVmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2lvX3VyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jb3JlZHVtcC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKICNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkYm9vbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CkBAIC0xMyw3ICYjNDM7MjAsOSBAQAogI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9lcG9sbC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c2NhbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKICNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwpAQCAtMjEsNiAmIzQzOzMwLDcgQEAKIAogI2luY2x1ZGUgJiMzNDsuLi9maWxlc3lzdGVtcy93cmFwcGVycy5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Li4vcGlkZmQvcGlkZmQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmgmIzM0OwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyB0byBhdm9pZCBpbmNsdWRpbmcgaGFybmVzcyBoZWFkZXIgKi8KIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7CkBAIC0zODEsMyAmIzQzOzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWwKIAkJY2xvc2UoZmRfY29yZWR1bXApOwogCV9leGl0KGV4aXRfY29kZSk7CiB9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLgomIzQzOyAqCiYjNDM7ICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGUKJiM0MzsgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3QKJiM0MzsgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLAomIzQzOyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnMKJiM0MzsgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uCiYjNDM7ICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC4KJiM0MzsgKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzeXNjYWxsKF9fTlJfaW9fdXJpbmdfc2V0dXAsIGVudHJpZXMsIHApOwomIzQzO30KJiM0MzsKJiM0MzsvKiBpb191cmluZyByZWFkcyBwb2xsMzJfZXZlbnRzIGJhY2sgdGhyb3VnaCBzd2FodzMyKCkgb24gYmlnIGVuZGlhbi4gKi8KJiM0MztzdGF0aWMgX191MzIgbm90aWZ5X3BvbGxfbWFzayhfX3UzMiBldmVudHMpCiYjNDM7ewomIzQzOyNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJmFtcDsmYW1wOyBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCiYjNDM7CXJldHVybiBfX3N3YWh3MzIoZXZlbnRzKTsKJiM0MzsjZWxzZQomIzQzOwlyZXR1cm4gZXZlbnRzOwomIzQzOyNlbmRpZgomIzQzO30KJiM0MzsKJiM0Mztib29sIGNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBpb191cmluZ19zZXR1cF9yYXcoMSwgJmFtcDtwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC0mZ3Q7bm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMCiYjNDM7ICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnMKJiM0MzsgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZAomIzQzOyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHAgPSB7fTsKJiM0MzsJdW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7CiYjNDM7CXN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7CiYjNDM7CXNpemVfdCBzcXJpbmdfc3o7CiYjNDM7CXZvaWQgKnNxOwomIzQzOwlpbnQgcmluZzsKJiM0MzsKJiM0MzsJcmluZyA9IGlvX3VyaW5nX3NldHVwX3Jhdyg4LCAmYW1wO3ApOwomIzQzOwlpZiAocmluZyAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXNxcmluZ19zeiA9IHAuc3Ffb2ZmLmFycmF5ICYjNDM7IHAuc3FfZW50cmllcyAqIHNpemVvZih1bnNpZ25lZCBpbnQpOwomIzQzOwlzcSA9IG1tYXAoTlVMTCwgc3FyaW5nX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRX1JJTkcpOwomIzQzOwlpZiAoc3EgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJc3FlcyA9IG1tYXAoTlVMTCwgcC5zcV9lbnRyaWVzICogc2l6ZW9mKCpzcWVzKSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSAgICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRRVMpOwomIzQzOwlpZiAoc3FlcyA9PSBNQVBfRkFJTEVEKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlzcV90YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICYjNDM7IHAuc3Ffb2ZmLnRhaWwpOwomIzQzOwlzcV9hcnJheSA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilzcSAmIzQzOyBwLnNxX29mZi5hcnJheSk7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO3NxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7CiYjNDM7CXNxZXNbMF0ub3Bjb2RlID0gSU9SSU5HX09QX1BPTExfQUREOwomIzQzOwlzcWVzWzBdLmZkID0gdHJpZ2dlcl9mZDsKJiM0MzsJc3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pOwomIzQzOwomIzQzOwlzcV9hcnJheVswXSA9IDA7CiYjNDM7CV9fYXRvbWljX3N0b3JlX24oc3FfdGFpbCwgMSwgX19BVE9NSUNfUkVMRUFTRSk7CiYjNDM7CiYjNDM7CWlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJLyogRGVsaWJlcmF0ZWx5IGxlYWtlZCwgd2UgYXJlIGFib3V0IHRvIGNyYXNoLiAqLwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlCiYjNDM7ICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvCiYjNDM7ICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLgomIzQzOyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuCiYjNDM7ICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWludCBmZCwgaTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSwKJiM0MzsJCSAgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChmdHJ1bmNhdGUoZmQsIChvZmZfdClOT1RJRllfU0lHTkFMX01BUF9DT1VOVCAqIHBnc3opKSB7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcHJvdCA9IChpICZhbXA7IDEpID8gUFJPVF9SRUFEIDogKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwomIzQzOwomIzQzOwkJaWYgKG1tYXAoTlVMTCwgcGdzeiwgcHJvdCwgTUFQX1BSSVZBVEUsIGZkLAomIzQzOwkJCSAob2ZmX3QpaSAqIHBnc3opID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gaTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpCiYjNDM7ewomIzQzOwlsb25nIHBnc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CXVuc2lnbmVkIGNoYXIgKnA7CiYjNDM7CWludCB0cmlnZ2VyX2ZkOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZjsKJiM0MzsKJiM0MzsJLyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXImIzM5O3Mgb3BlbigpIGNhbm5vdCBibG9jay4gKi8KJiM0MzsJdHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpOwomIzQzOwomIzQzOwkvKiBFeGl0IHJhdGhlciB0aGFuIGNyYXNoOiBhIGR1bXAgd2l0aG91dCB0aGUgcG9sbCBhcm1lZCBwcm92ZXMgbm90aGluZy4gKi8KJiM0MzsJaWYgKHRyaWdnZXJfZmQgJmx0OyAwKQomIzQzOwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsKJiM0MzsJaWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpICZsdDsgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwlmb3IgKG9mZiA9IDA7IG9mZiAmbHQ7IE5PVElGWV9TSUdOQUxfQU5PTl9CWVRFUzsgb2ZmICYjNDM7PSBwZ3N6KQomIzQzOwkJcFtvZmZdID0gMTsKJiM0MzsKJiM0MzsJaWYgKGFybV9wb2xsX25vdGlmeSh0cmlnZ2VyX2ZkKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CS8qIGNyYXNoIG9uIHB1cnBvc2UgKi8KJiM0MzsJKih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDsKJiM0MzsJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgT19XUk9OTFkgfCBPX05PTkJMT0NLIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAod3JpdGUoZmQsICYjMzQ7eCYjMzQ7LCAxKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogd3JpdGUgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHBoZHJbMF0gaXMgdGhlIFBUX05PVEUgZW50cnk6IGVsZl9jb3JlX2R1bXAoKSBlbWl0cyBpdCByaWdodCBhZnRlciB0aGUKJiM0MzsgKiBFTEYgaGVhZGVyLiBJdHMgcF9vZmZzZXQgaXMgd2hlcmUgdGhlIG5vdGVzIGJlZ2luLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGxvbmcgbm90ZV9vZmZzZXQoY29uc3QgdW5zaWduZWQgY2hhciAqaGRyKQomIzQzO3sKJiM0MzsJRWxmVyhQaGRyKSBwaDsKJiM0MzsJRWxmVyhFaGRyKSBlaDsKJiM0MzsKJiM0MzsJbWVtY3B5KCZhbXA7ZWgsIGhkciwgc2l6ZW9mKGVoKSk7CiYjNDM7CWlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbWVtY3B5KCZhbXA7cGgsIGhkciAmIzQzOyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTsKJiM0MzsJaWYgKHBoLnBfdHlwZSAhPSBQVF9OT1RFKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gKGxvbmcgbG9uZylwaC5wX29mZnNldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBEcmFpbiBhIGNvcmVkdW1wIG9mZiBAZmQsIGNvdW50aW5nIHdoYXQgYXJyaXZlcy4gT25jZSB0aGUgbm90ZXMgaGF2ZQomIzQzOyAqIHN0YXJ0ZWQgdGhlIGtlcm5lbCBpcyBpbnNpZGUgdGhlIG9uZSBiaWcgbm90ZSB3cml0ZSwgc28gcG9rZSB0aGUgZmlmbwomIzQzOyAqIHRoZSBjcmFzaGluZyB0YXNrIGlzIHBvbGxpbmcgYW5kIHN0b3AgcmVhZGluZywgd2hpY2gga2VlcHMgdGhlCiYjNDM7ICogdHJhbnNwb3J0IGZ1bGwgYW5kIHRoZSB3cml0ZSBibG9ja2VkIHdpdGggYSBwYXJ0aWFsIGNvdW50IHdoZW4gdGhlCiYjNDM7ICogd2FrZXVwIGxhbmRzLiBUaGVuIGNhcnJ5IG9uIHRvIGVuZCBvZiBmaWxlLgomIzQzOyAqCiYjNDM7ICogV2hhdCBhcnJpdmVzIGlzIHdyaXR0ZW4gdG8gQGZkX291dCB3aGVuIHRoYXQgaXMgbm90IG5lZ2F0aXZlLgomIzQzOyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEuIEZhaWxpbmcgdG8gdHJpcCB0aGUgZmlmbwomIzQzOyAqIGlzIGFuIGVycm9yIHRvbzogYSBkdW1wIHRoYXQgd2FzIG5ldmVyIGludGVycnVwdGVkIHByb3ZlcyBub3RoaW5nLgomIzQzOyAqLwomIzQzO3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGhkcltzaXplb2YoRWxmVyhFaGRyKSkgJiM0Mzsgc2l6ZW9mKEVsZlcoUGhkcikpXTsKJiM0MzsJc3RhdGljIGNoYXIgYnVmWzY0ICZsdDsmbHQ7IDEwXTsKJiM0MzsJbG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwlsb25nIGxvbmcgbm90ZV9vZmYgPSAwOwomIzQzOwlzaXplX3QgaGRybGVuID0gMDsKJiM0MzsJc3NpemVfdCB0b3RhbCA9IDA7CiYjNDM7CWJvb2wgYXJtZWQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJc3NpemVfdCBuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CiYjNDM7CiYjNDM7CQlpZiAobiAmbHQ7IDApIHsKJiM0MzsJCQlpZiAoZXJybm8gPT0gRUlOVFIpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCXJldHVybiAtMTsKJiM0MzsJCX0KJiM0MzsJCWlmIChuID09IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAoZmRfb3V0ICZndDs9IDAgJmFtcDsmYW1wOyB3cml0ZShmZF9vdXQsIGJ1ZiwgbikgIT0gbikKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CQlpZiAoaGRybGVuICZsdDsgc2l6ZW9mKGhkcikpIHsKJiM0MzsJCQlzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuOwomIzQzOwomIzQzOwkJCWlmICh3YW50ICZndDsgKHNpemVfdCluKQomIzQzOwkJCQl3YW50ID0gKHNpemVfdCluOwomIzQzOwkJCW1lbWNweShoZHIgJiM0MzsgaGRybGVuLCBidWYsIHdhbnQpOwomIzQzOwkJCWhkcmxlbiAmIzQzOz0gd2FudDsKJiM0MzsJCQlpZiAoaGRybGVuID09IHNpemVvZihoZHIpKQomIzQzOwkJCQlub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQl0b3RhbCAmIzQzOz0gbjsKJiM0MzsKJiM0MzsJCWlmIChhcm0gJmFtcDsmYW1wOyAhYXJtZWQgJmFtcDsmYW1wOyBub3RlX29mZiAmZ3Q7IDAgJmFtcDsmYW1wOwomIzQzOwkJICAgIHRvdGFsICZndDsgbm90ZV9vZmYgJiM0MzsgKGxvbmcgbG9uZylwZ3N6KSB7CiYjNDM7CQkJaWYgKHB1bGxfdHJpZ2dlcigpKQomIzQzOwkJCQlyZXR1cm4gLTE7CiYjNDM7CQkJYXJtZWQgPSB0cnVlOwomIzQzOwkJCXVzbGVlcChOT1RJRllfU0lHTkFMX1NUQUxMX1VTKTsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYXJtICZhbXA7JmFtcDsgIWFybWVkKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlyZXR1cm4gdG90YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogSG93IGxhcmdlIHRoZSBkdW1wIHdhcyBtZWFudCB0byBiZS4gVGhlIEVMRiBoZWFkZXIgYW5kIHRoZSBwcm9ncmFtCiYjNDM7ICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvdwomIzQzOyAqIGZhciBpdCBzaG91bGQgaGF2ZSBydW46IHRoZSBlbmQgaXMgbWF4KHBfb2Zmc2V0ICYjNDM7IHBfZmlsZXN6KS4KJiM0MzsgKgomIzQzOyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyCiYjNDM7ICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLSZndDt0b19za2lwLCBlbGZfY29yZV9kdW1wKCkKJiM0MzsgKiBoYXMgbm8gZmx1c2ggYWZ0ZXIgdGhlIGxhc3QgZHVtcF91c2VyX3JhbmdlKCkgYW5kIGEgcGlwZSBjYW5ub3Qgc2VlaywKJiM0MzsgKiBzbyB0aG9zZSBieXRlcyBhcmUgZHJvcHBlZC4gT24geDg2XzY0IHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIGdhdGUgdm1hCiYjNDM7ICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZQomIzQzOyAqIHBhZ2Ugc2hvcnQgb2Ygd2hhdCB0aGUgaGVhZGVycyBwcm9taXNlLiBAdGFpbCByZXR1cm5zIHRoZSBzaXplIG9mIHRoYXQKJiM0MzsgKiBsYXN0IHNlZ21lbnQsIHdoaWNoIGJvdW5kcyB3aGF0IG1heSBnbyBtaXNzaW5nIHRoaXMgd2F5LgomIzQzOyAqLwomIzQzO2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCkKJiM0Mzt7CiYjNDM7CUVsZlcoUGhkcikgKnBoZHIgPSBOVUxMOwomIzQzOwlsb25nIGxvbmcgZXhwZWN0ZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbnBoZHIsIGk7CiYjNDM7CUVsZlcoRWhkcikgZWg7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJKnRhaWwgPSAwOwomIzQzOwomIzQzOwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtlaCwgc2l6ZW9mKGVoKSkgIT0gc2l6ZW9mKGVoKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAobWVtY21wKGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgfHwgZWguZV90eXBlICE9IEVUX0NPUkUpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKCFlaC5lX3BobnVtIHx8IGVoLmVfcGhlbnRzaXplICE9IHNpemVvZigqcGhkcikpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJbnBoZHIgPSBlaC5lX3BobnVtOwomIzQzOwlwaGRyID0gY2FsbG9jKG5waGRyLCBzaXplb2YoKnBoZHIpKTsKJiM0MzsJaWYgKCFwaGRyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CWlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPQomIzQzOwkgICAgKHNzaXplX3QpKChzaXplX3QpbnBoZHIgKiBzaXplb2YoKnBoZHIpKSkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnBoZHI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICYjNDM7CiYjNDM7CQkJCShsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejsKJiM0MzsJCWlmIChlbmQgJmd0OyBleHBlY3RlZCkgewomIzQzOwkJCWV4cGVjdGVkID0gZW5kOwomIzQzOwkJCSp0YWlsID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfZmlsZXN6OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWUocGhkcik7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIGV4cGVjdGVkOwomIzQzO2VycjoKJiM0MzsJZnJlZShwaGRyKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTE6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIwNTgKCQkJCQkJCW91dHB1dDogMTkyCgkJCQkJCQl0aG91Z2h0czogNzgwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIHNlcmllcyBpbiBmcm9udCBvZiBtZSB0aGF0IGFpbXMgdG8gZml4IGEgbmFzdHkgYnVnLiBBcHBhcmVudGx5LCBgVElGX05PVElGWV9TSUdOQUxgIHdhcyBhYmxlIHRvIGludGVycnVwdCBjb3JlZHVtcHMgYW5kIFNNQiBzZW5kcywgd2hpY2ggaXMgb2J2aW91c2x5IG5vdCBpZGVhbC4gVGhlIGZpeCBpbnRyb2R1Y2VzIGBub19ub3RpZnlfc2lnbmFsX3NhdmUoKWAgYW5kIGBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUoKWAgdG8gbWFzayB0aGF0IHNpZ25hbCBieSBzZXR0aW5nIGEgZmxhZywgYFBGX05PX05PVElGWV9TSUdOQUxgLCBpbiB0aGUgYGN1cnJlbnQtJmd0O2ZsYWdzYC4gVGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgaW4gYGZzL2NvcmVkdW1wLmNgIGFuZCBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2AsIHNwZWNpZmljYWxseSBgdmZzX2NvcmVkdW1wKClgIGFuZCBgc21iX3NlbmRfa3ZlYygpYCByZXNwZWN0aXZlbHkuIEl0IGFsc28gY29tZXMgd2l0aCBhIHNlbGZ0ZXN0IGZvciBjb3JlZHVtcCwgd2hpY2ggaXMgZ29vZC4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQmIzM5O3MgbmFpbCBkb3duIGFueSBwb3RlbnRpYWwgVU5JTklUSUFMSVpFRCBNRU1PUlkgaXNzdWVzLiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIHRhc2sgZmxhZ3MgYW5kIHNpZ25hbCBoYW5kbGluZyBoZXJlLCBzcGVjaWZpY2FsbHkgcHJldmVudGluZyBhIHNpZ25hbCBmcm9tIHByZW1hdHVyZWx5IGFib3J0aW5nIHRoaW5ncy4gTm8gbmV3IHN0cnVjdHVyZXMsIG5vIG5ldyBkYXRhIHNlbnQgdG8gdXNlciBzcGFjZSwgbm8gbmV3IGJvdW5kcyBjaGVja3Mgb3IgbGVuZ3RoIG1vZGlmaWNhdGlvbnMuIFRoaXMgaXMgKnB1cmVseSogY29udHJvbCBmbG93IGFyb3VuZCBzaWduYWwgaW50ZXJydXB0aW9uLgoKU28sIGRvZXMgdGhpcyBpbnRyb2R1Y2UgKmFueSogdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IEkmIzM5O20gbm90IHNlZWluZyBpdC4gSSBtZWFuLCB3ZSYjMzk7cmUgbm90IHRvdWNoaW5nIGRhdGEgaW4gYSB3YXkgdGhhdCBjb3VsZCBsZWFkIHRvIHJlYWRzIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkuIFdlJiMzOTtyZSBqdXN0IG1vZGlmeWluZyAqd2hlbiogY2VydGFpbiBvcGVyYXRpb25zIGdldCBpbnRlcnJ1cHRlZC4KCkxldCYjMzk7cyBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGUgY29kZSBzbmlwcGV0cywganVzdCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUuCgpJbiBgZnMvY29yZWR1bXAuY2AsIHdlIGhhdmU6CgpgYGBjCiYjNDM7CS8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqLwomIzQzOwlub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTsKIAlzY29wZWRfd2l0aF9jcmVkcyhjcmVkKQogCQlkb19jb3JlZHVtcCgmYW1wO2NuLCAmYW1wO2Nwcm0sICZhbXA7YXJndiwgJmFtcDthcmdjLCBiaW5mbXQpOwogCWNvcmVkdW1wX2NsZWFudXAoJmFtcDtjbiwgJmFtcDtjcHJtKTsKJiM0MzsJbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7CmBgYAoKQmFzaWNhbGx5LCB3ZSYjMzk7cmUgbWFraW5nIHN1cmUgYGRvX2NvcmVkdW1wYCBpcyAqbm90KiBwcmVtYXR1cmVseSBpbnRlcnJ1cHRlZCBieSBgVElGX05PVElGWV9TSUdOQUxgLiBQZXJmZWN0bHkgcmVhc29uYWJsZS4KCkluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYDoKCmBgYGMKJiM0MzsJCW5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpOwogCQlyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTsKLQkJaWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSICZhbXA7JmFtcDsgdGFza193b3JrX3BlbmRpbmcoY3VycmVudCkpKSB7CiYjNDM7CQlub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTsKJiM0MzsJCWlmIChyYyA9PSAtRUFHQUlOKSB7CmBgYAoKQWdhaW4sIHNhbWUgcHJpbmNpcGxlLiBQcmV2ZW50aW5nIHRoZSBzaWduYWwgZnJvbSBpbnRlcnJ1cHRpbmcgdGhlIGBzb2NrX3NlbmRtc2dgIGNhbGwuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIGhlcmUgZWl0aGVyLgoKU28sIGJvdHRvbSBsaW5lOiBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrLiBUaGlzIHBhdGNoIGlzIGZ1bmRhbWVudGFsbHkgYWJvdXQgdGFzayBmbGFncyBhbmQgc2lnbmFsIGhhbmRsaW5nLiBUaGVyZSYjMzk7cyB6ZXJvIGNoYW5jZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBiZWNhdXNlIG9mIHRoZXNlIGNoYW5nZXMuIFRodXMsIHRoaXMgZG9lc24mIzM5O3QgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBjYW1wYWlnbi4gS0FTQU4gYW5kIG90aGVyIHRvb2xzIHdpbGwgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzLgoKT2theSwgbGV0JiMzOTtzIGZvcm11bGF0ZSB0aGlzIHN1Y2NpbmN0bHkgYW5kIGNhbGwgaXQgYSBkYXkuCgoqKlJlYXNvbmluZzoqKgoKVGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4KCkFscmlnaHQsIGBzZXQtcmVzdWx0c2AuIERvbmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDExOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MjIuMDAzNDg0NzYyWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTIwNTU0NTY5OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIixcbiAgICBcIkNJRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2ZnNfY29yZWR1bXBcIixcbiAgICBcInNtYl9zZW5kX2t2ZWNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MjIuMDAzNDk0OTQyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NzA5MDc1MjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2OGU0MWEzYzljZTIyMGZlMTM1NzJmZDQ5NDViNmRhZWU1NWJlMGNlXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgQXVnIDE4IDExOjMxOjIxIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXFxuaW5kZXggZTY4YTc2ZmY5MmEzOC4uZWRiNWExYTYxZDg0ZiAxMDA2NDRcXG4tLS0gYS9mcy9jb3JlZHVtcC5jXFxuKysrIGIvZnMvY29yZWR1bXAuY1xcbkBAIC0xMTY1LDYgKzExNjUsNyBAQCB2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKVxcbiBcXHRzdHJ1Y3QgY29yZV9uYW1lIGNuO1xcbiBcXHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXFx1MDAzZW1tO1xcbiBcXHRjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQgPSBtbS1cXHUwMDNlYmluZm10O1xcbitcXHR1bnNpZ25lZCBpbnQgbm90aWZ5X2ZsYWdzO1xcbiBcXHRpbnQgYXJnYyA9IDA7XFxuIFxcdHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHtcXG4gXFx0XFx0LnNpZ2luZm8gPSBzaWdpbmZvLFxcbkBAIC0xMTk2LDkgKzExOTcsMTIgQEAgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcXG4gXFx0aWYgKGNvcmVkdW1wX3dhaXQoc2lnaW5mby1cXHUwMDNlc2lfc2lnbm8sIFxcdTAwMjZjb3JlX3N0YXRlKSBcXHUwMDNjIDApXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuK1xcdC8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqL1xcbitcXHRub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTtcXG4gXFx0c2NvcGVkX3dpdGhfY3JlZHMoY3JlZClcXG4gXFx0XFx0ZG9fY29yZWR1bXAoXFx1MDAyNmNuLCBcXHUwMDI2Y3BybSwgXFx1MDAyNmFyZ3YsIFxcdTAwMjZhcmdjLCBiaW5mbXQpO1xcbiBcXHRjb3JlZHVtcF9jbGVhbnVwKFxcdTAwMjZjbiwgXFx1MDAyNmNwcm0pO1xcbitcXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcXG4gXFx0cmV0dXJuO1xcbiB9XFxuIFxcbmRpZmYgLS1naXQgYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jIGIvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY1xcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XFxuLS0tIGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY1xcbisrKyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcXG5AQCAtMjIsNyArMjIsNiBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtcG9vbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC90YXNrX3dvcmsuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFxcImNpZnNnbG9iLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJjaWZzcHJvdG8uaFxcXCJcXG4gI2luY2x1ZGUgXFxcImNpZnNfZGVidWcuaFxcXCJcXG5AQCAtMTQyLDYgKzE0MSw3IEBAIGludFxcbiBzbWJfc2VuZF9rdmVjKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZyxcXG4gXFx0ICAgICAgc2l6ZV90ICpzZW50KVxcbiB7XFxuK1xcdHVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3M7XFxuIFxcdGludCByYyA9IDA7XFxuIFxcdGludCByZXRyaWVzID0gMDtcXG4gXFx0c3RydWN0IHNvY2tldCAqc3NvY2tldCA9IHNlcnZlci1cXHUwMDNlc3NvY2tldDtcXG5AQCAtMTcyLDE1ICsxNzIsMTIgQEAgc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXFxuIFxcdFxcdCAqIGFmdGVyIHRoZSByZXRyaWVzIHdlIHdpbGwga2lsbCB0aGUgc29ja2V0IGFuZFxcbiBcXHRcXHQgKiByZWNvbm5lY3Qgd2hpY2ggbWF5IGNsZWFyIHRoZSBuZXR3b3JrIHByb2JsZW0uXFxuIFxcdFxcdCAqXFxuLVxcdFxcdCAqIEV2ZW4gaWYgcmVndWxhciBzaWduYWxzIGFyZSBtYXNrZWQsIEVJTlRSIG1pZ2h0IGJlXFxuLVxcdFxcdCAqIHByb3BhZ2F0ZWQgZnJvbSBza19zdHJlYW1fd2FpdF9tZW1vcnkoKSB0byBoZXJlIHdoZW5cXG4tXFx0XFx0ICogVElGX05PVElGWV9TSUdOQUwgaXMgdXNlZCBmb3IgdGFzayB3b3JrLiBGb3IgZXhhbXBsZSxcXG4tXFx0XFx0ICogY2VydGFpbiBpb191cmluZyBjb21wbGV0aW9ucyB3aWxsIHVzZSB0aGF0LiBUcmVhdFxcbi1cXHRcXHQgKiBoYXZpbmcgRUlOVFIgd2l0aCBwZW5kaW5nIHRhc2sgd29yayB0aGUgc2FtZSBhcyBFQUdBSU5cXG4tXFx0XFx0ICogdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVjb25uZWN0cy5cXG4rXFx0XFx0ICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS5cXG4gXFx0XFx0ICovXFxuK1xcdFxcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xcbiBcXHRcXHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcXG4tXFx0XFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFxcdTAwMjZcXHUwMDI2IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkge1xcbitcXHRcXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcXG4rXFx0XFx0aWYgKHJjID09IC1FQUdBSU4pIHtcXG4gXFx0XFx0XFx0cmV0cmllcysrO1xcbiBcXHRcXHRcXHRpZiAocmV0cmllcyBcXHUwMDNlPSAxNCB8fFxcbiBcXHRcXHRcXHQgICAgKCFzZXJ2ZXItXFx1MDAzZW5vYmxvY2tzbmQgXFx1MDAyNlxcdTAwMjYgKHJldHJpZXMgXFx1MDAzZSAyKSkpIHtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oXFxuaW5kZXggMzczYmNjMDU5OGQxMC4uZmQ3MmNhNGVlOTJmMiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmhcXG5AQCAtMTc5Niw3ICsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7XFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAqIEkgYW0gY2xlYW5pbmcgZGlydHkgcGFnZXMgZnJvbSBzb21lIG90aGVyIGJkaS4gKi9cXG4gI2RlZmluZSBQRl9LVEhSRUFEXFx0XFx0MHgwMDIwMDAwMFxcdC8qIEkgYW0gYSBrZXJuZWwgdGhyZWFkICovXFxuICNkZWZpbmUgUEZfUkFORE9NSVpFXFx0XFx0MHgwMDQwMDAwMFxcdC8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi9cXG4tI2RlZmluZSBQRl9fSE9MRV9fMDA4MDAwMDBcXHQweDAwODAwMDAwXFxuKyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFxcdDB4MDA4MDAwMDBcXHQvKiBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkgKi9cXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcXHQweDAxMDAwMDAwXFxuICNkZWZpbmUgUEZfX0hPTEVfXzAyMDAwMDAwXFx0MHgwMjAwMDAwMFxcbiAjZGVmaW5lIFBGX05PX1NFVEFGRklOSVRZXFx0MHgwNDAwMDAwMFxcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxcbmluZGV4IDU4NGFlODhiNDM1ZTkuLjMxODJkZTRmZjk0ODIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcXG5AQCAtMzg0LDE0ICszODQsMzEgQEAgc3RhdGljIGlubGluZSBpbnQgdGFza19zaWdwZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcXG4gXFx0cmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTtcXG4gfVxcbiBcXG4rLyogUHJldmVudCBUSUZfTk9USUZZX1NJR05BTCBmcm9tIGludGVycnVwdGluZyB0aGlzIHRhc2suICovXFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vX25vdGlmeV9zaWduYWxfc2F2ZSh2b2lkKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfTk9fTk9USUZZX1NJR05BTDtcXG4rXFxuK1xcdGN1cnJlbnQtXFx1MDAzZWZsYWdzIHw9IFBGX05PX05PVElGWV9TSUdOQUw7XFxuK1xcdHJldHVybiBmbGFncztcXG4rfVxcbitcXG4rLyogUmVzdG9yZSBUSUZfTk9USUZZX1NJR05BTC4gKi9cXG4rc3RhdGljIGlubGluZSB2b2lkIG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZSh1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0Y3VycmVudF9yZXN0b3JlX2ZsYWdzKGZsYWdzLCBQRl9OT19OT1RJRllfU0lHTkFMKTtcXG4rfVxcbitcXG4gc3RhdGljIGlubGluZSBpbnQgc2lnbmFsX3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKVxcbiB7XFxuIFxcdC8qXFxuIFxcdCAqIFRJRl9OT1RJRllfU0lHTkFMIGlzbid0IHJlYWxseSBhIHNpZ25hbCwgYnV0IGl0IHJlcXVpcmVzIHRoZSBzYW1lXFxuIFxcdCAqIGJlaGF2aW9yIGluIHRlcm1zIG9mIGVuc3VyaW5nIHRoYXQgd2UgYnJlYWsgb3V0IG9mIHdhaXQgbG9vcHNcXG4tXFx0ICogc28gdGhhdCBub3RpZnkgc2lnbmFsIGNhbGxiYWNrcyBjYW4gYmUgcHJvY2Vzc2VkLlxcbitcXHQgKiBzbyB0aGF0IG5vdGlmeSBzaWduYWwgY2FsbGJhY2tzIGNhbiBiZSBwcm9jZXNzZWQuIE5vdCBmb3IgYSB0YXNrXFxuK1xcdCAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuXFxuIFxcdCAqL1xcbi1cXHRpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05PVElGWV9TSUdOQUwpKSlcXG4rXFx0aWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGxpa2VseSghKFJFQURfT05DRShwLVxcdTAwM2VmbGFncykgXFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXFxuIFxcdFxcdHJldHVybiAxO1xcbiBcXHRyZXR1cm4gdGFza19zaWdwZW5kaW5nKHApO1xcbiB9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcXG5pbmRleCBkZWNlMWEzMWQ1NjFiLi43MjhmM2MzNDJlYjkyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcXG5AQCAtMyw3ICszLDEwIEBAIENGTEFHUyArPSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxcbiBcXG4gVEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcXFxcbiBcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXFxcXG4tXFx0XFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxcbitcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXFxcXG4rXFx0XFx0ICBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RcXG4rIyBTcGF3bmVkIGJ5IHRoZSBrZXJuZWwgYXMgdGhlIHxoZWxwZXIsIG5vdCBhIHRlc3Qgb2YgaXRzIG93bi5cXG4rVEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcXG4gVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcXG4gXFxuIGluY2x1ZGUgLi4vbGliLm1rXFxuQEAgLTExLDMgKzE0LDUgQEAgaW5jbHVkZSAuLi9saWIubWtcXG4gJChPVVRQVVQpL3N0YWNrZHVtcF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXFxuQEAgLTAsMCArMSwyOSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbitcXG4rI2lmbmRlZiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxcbisjZGVmaW5lIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjc3RkYm9vbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3R5cGVzLmhcXHUwMDNlXFxuK1xcbisvKlxcbisgKiBEZWZpbmUgYSBidW5jaCBvZiBjb25zdGFudHMgd2UgbmVlZC4gV2UgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZVxcbisgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0J3Mgd2F5IGJleW9uZCB0aGUgZGVmYXVsdCA2NEtcXG4rICogcGlwZSByaW5nIGFuZCBwYXN0IHRoZSB+MzZLIGFuIGFmX3VuaXggc2tiIGhvbGRzLiBTbyB3ZSBmb3JjZSBhIHdyaXRlXFxuKyAqIHRvIGNvbWUgYmFjayBzaG9ydC5cXG4rICovXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBfQ09VTlRcXHRcXHQ0MDAwXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTXFx0KDRVTCBcXHUwMDNjXFx1MDAzYyAyMClcXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX1NUQUxMX1VTXFx0XFx0MjAwMDAwXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9NQVBGSUxFXFx0XFx0XFxcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXFxcIlxcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfVFJJR0dFUlxcdFxcdFxcXCIvdG1wL2NvcmVkdW1wLm5vdGlmeV9zaWduYWwudHJpZ2dlclxcXCJcXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0NPUkVfRklMRVxcdFxcdFxcXCIvdG1wL2NvcmVkdW1wLm5vdGlmeV9zaWduYWwuY29yZVxcXCJcXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRVxcdFxcXCIvdG1wL2NvcmVkdW1wLm5vdGlmeV9zaWduYWwuY29yZS50bXBcXFwiXFxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9TT0NLRVRcXHRcXHRcXFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFxcXCJcXG4rXFxuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKTtcXG4rYm9vbCBjb3JlZHVtcF9pb191cmluZ19hdmFpbGFibGUodm9pZCk7XFxuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pO1xcbitsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpO1xcbitcXG4rI2VuZGlmIC8qIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IICovXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi44NDlmNWMxZWE3MzY1XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcXG5AQCAtMCwwICsxLDQ2IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK1xcbisvKlxcbisgKiBUaGUgfGhlbHBlciBoYWxmIG9mIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC4gVGhlIGtlcm5lbCBzcGF3bnMgdGhpc1xcbisgKiB3aXRoIHRoZSBjb3JlZHVtcCBvbiBzdGRpbiwgc28gaXQgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHRlc3QgYmluYXJ5LlxcbisgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXFxuKyAqIGNyYXNoaW5nIHRhc2sgaXMgcG9sbGluZyBzbyBUSUZfTk9USUZZX1NJR05BTCBpcyByYWlzZWQgd2hpbGUgdGhlIG5vdGVcXG4rICogd3JpdGUgaXMgaW4gZmxpZ2h0LlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXFxcIlxcbitcXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcXG4re1xcbitcXHRpbnQgZmRfY29yZV9maWxlO1xcbitcXHRzc2l6ZV90IHJldDtcXG4rXFxuK1xcdGZkX2NvcmVfZmlsZSA9IG9wZW4oTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEUsXFxuK1xcdFxcdFxcdCAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcXG4rXFx0aWYgKGZkX2NvcmVfZmlsZSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogb3BlbiBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBhcmd2WzBdKTtcXG4rXFx0XFx0cmV0dXJuIEVYSVRfRkFJTFVSRTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKFNURElOX0ZJTEVOTywgZmRfY29yZV9maWxlLCB0cnVlKTtcXG4rXFx0Y2xvc2UoZmRfY29yZV9maWxlKTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0LyogVGhlIHRlc3QgcG9sbHMgZm9yIHRoaXMgbmFtZSwgc28gb25seSBjcmVhdGUgaXQgb25jZSBpdCBpcyB3aG9sZS4gKi9cXG4rXFx0aWYgKHJlbmFtZShOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHJlbmFtZSBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBhcmd2WzBdKTtcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBFWElUX1NVQ0NFU1M7XFxuK1xcbitlcnI6XFxuK1xcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSk7XFxuK1xcdHJldHVybiBFWElUX0ZBSUxVUkU7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTYzYzA2YTgxNTYyZlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuY1xcbkBAIC0wLDAgKzEsMjQ1IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK1xcbisvKlxcbisgKiBBIGNvcmVkdW1wIGlzIG1lYW50IHRvIGJlIGludGVycnVwdGVkIGJ5IFNJR0tJTEwgYW5kIGJ5IHRoZSBmcmVlemVyIGFuZFxcbisgKiBieSBub3RoaW5nIGVsc2UuIGR1bXBfaW50ZXJydXB0ZWQoKSBzYXlzIHNvLCBidXQgdGhlIGJsb2NraW5nIHdhaXRzXFxuKyAqIHVuZGVybmVhdGggaXQgdGVzdCBzaWduYWxfcGVuZGluZygpLCB3aGljaCBpcyBhbHNvIHRydWUgZm9yXFxuKyAqIFRJRl9OT1RJRllfU0lHTkFMLiBBIGNyYXNoaW5nIHRhc2sgdGhhdCBoYXMgYW4gaW9fdXJpbmcgY29tcGxldGlvbiBsYW5kXFxuKyAqIG9uIGl0IG1pZC1kdW1wIHRoZXJlZm9yZSBrZWVwcyBkdW1waW5nIHdoaWxlIGV2ZXJ5IHdhaXQgaXQgZW50ZXJzIGJhaWxzXFxuKyAqIG91dCBhdCBvbmNlLCBhbmQgdGhlIGR1bXAgaXMgc2lsZW50bHkgY3V0IHNob3J0LiBOb3RoaW5nIHJlcG9ydHMgaXQ6XFxuKyAqIGJpbmZtdF9lbGYgc2V0cyBoYXNfZHVtcGVkIGJlZm9yZSBpdCB3cml0ZXMgYW55dGhpbmcsIHNvIFdDT1JFRFVNUCgpXFxuKyAqIHNheXMgdGhlIGR1bXAgd29ya2VkLlxcbisgKlxcbisgKiBBIGNvcmVkdW1wIG5vdGUgaXMgdGhlIG9ubHkgZHVtcF9lbWl0KCkgdGhhdCBleGNlZWRzIHdoYXQgdGhlIHRyYW5zcG9ydFxcbisgKiB0YWtlcyBpbiBvbmUgZ28sIHNvIGl0IGlzIHRoZSBvbmUgd3JpdGUgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLiBCb3RoXFxuKyAqIHRlc3RzIGNyYXNoIGEgY2hpbGQgaG9sZGluZyBlbm91Z2ggZmlsZSBiYWNrZWQgbWFwcGluZ3MgZm9yIGl0cyBOVF9GSUxFXFxuKyAqIG5vdGUgdG8gcnVuIHBhc3QgdGhhdCwgYXJtIGFuIGlvX3VyaW5nIHBvbGwgb24gaXQsIGFuZCB0cmlwIHRoZSBwb2xsXFxuKyAqIHdoaWxlIHRoZSBub3RlIGlzIGJlaW5nIHdyaXR0ZW4uIFdoYXQgY29tZXMgb3V0IGhhcyB0byBiZSB0aGUgd2hvbGVcXG4rICogZHVtcC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3NvY2tldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy91bi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNvcmVkdW1wX3Rlc3QuaFxcXCJcXG4rXFxuK0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApXFxuK3tcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSAtRVNSQ0g7XFxuK1xcdHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XFxuK1xcdGZpbGUgPSBmb3BlbihcXFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cXFwiLCBcXFwiclxcXCIpO1xcbitcXHRBU1NFUlRfTkUoTlVMTCwgZmlsZSk7XFxuK1xcbitcXHRyZXQgPSBmcmVhZChzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4sIDEsXFxuK1xcdFxcdCAgICBzaXplb2Yoc2VsZi1cXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7XFxuK1xcdEFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTtcXG4rXFx0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXFx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybikpO1xcbitcXG4rXFx0c2VsZi1cXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAnXFxcXDAnO1xcbitcXHRzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpO1xcbitcXHRBU1NFUlRfR0Uoc2VsZi1cXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQsIDApO1xcbitcXG4rXFx0cmV0ID0gZmNsb3NlKGZpbGUpO1xcbitcXHRBU1NFUlRfRVEoMCwgcmV0KTtcXG4rXFxuK1xcdHVubGluayhOT1RJRllfU0lHTkFMX1RSSUdHRVIpO1xcbitcXHRBU1NFUlRfRVEobWtmaWZvKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgMDYwMCksIDApO1xcbit9XFxuK1xcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnJlYXNvbjtcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldCwgc3RhdHVzO1xcbitcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7XFxuK1xcdFxcdHdhaXRwaWQoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdH1cXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFKTtcXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfU09DS0VUKTtcXG4rXFx0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XFxuK1xcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xcbitcXG4rXFx0ZmlsZSA9IGZvcGVuKFxcXCIvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblxcXCIsIFxcXCJ3XFxcIik7XFxuK1xcdGlmICghZmlsZSkge1xcbitcXHRcXHRyZWFzb24gPSBcXFwiVW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXFxcIjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBmcHJpbnRmKGZpbGUsIFxcXCIlc1xcXCIsIHNlbGYtXFx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdHJlYXNvbiA9IFxcXCJVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuXFxcIjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBmY2xvc2UoZmlsZSk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cmVhc29uID0gXFxcIlVuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm5cXFwiO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdHJldCA9IGNsb3NlKHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0cmVhc29uID0gXFxcIlVuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1xcXCI7XFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0fVxcbitcXHRcXHRzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm47XFxuK2ZhaWw6XFxuK1xcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xcbitcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZhaWxlZCB0byBjbGVhbnVwIGNvcmVkdW1wIHRlc3Q6ICVzXFxcXG5cXFwiLCByZWFzb24pO1xcbit9XFxuK1xcbisvKlxcbisgKiBDaGVjayB0aGF0IHdoYXQgdGhlIGhlbHBlciBvciB0aGUgc2VydmVyIHNhdmVkIGlzIHRoZSB3aG9sZSBkdW1wLiBPbmx5XFxuKyAqIGEgaG9sZSBhdCB0aGUgdmVyeSBlbmQgY2FuIGJlIG1pc3NpbmcsIHNlZSBjb3JlZHVtcF9leHBlY3RlZF9zaXplKCkuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjaGVja193aG9sZV9jb3JlZHVtcChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEpXFxuK3tcXG4rXFx0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xcbitcXHRzdHJ1Y3Qgc3RhdCBzdDtcXG4rXFxuK1xcdGV4cGVjdGVkID0gY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXFx1MDAyNnRhaWwpO1xcbitcXHRBU1NFUlRfR1QoZXhwZWN0ZWQsIDApO1xcbitcXHRBU1NFUlRfRVEoc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXFx1MDAyNnN0KSwgMCk7XFxuK1xcdEFTU0VSVF9MRSgobG9uZyBsb25nKXN0LnN0X3NpemUsIGV4cGVjdGVkKTtcXG4rXFx0QVNTRVJUX0dFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQgLSB0YWlsKTtcXG4rfVxcbitcXG4rLypcXG4rICogVGhlIGR1bXAgZ29lcyB0byBhIHxoZWxwZXIsIHNvIHRoZSByZWFkZXIgaXMgYSBzZXBhcmF0ZSBwcm9ncmFtIHRoZVxcbisgKiBrZXJuZWwgc3Bhd25zLiBJdCBzYXZlcyB3aGF0IGl0IHJlY2VpdmVkIHRvIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLlxcbisgKi9cXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3BpcGUpXFxuK3tcXG4rXFx0Y2hhciBwYXR0ZXJuW1BBVEhfTUFYXSwgaGVscGVyW1BBVEhfTUFYXSwgKnA7XFxuK1xcdHN0cnVjdCBzdGF0IHN0O1xcbitcXHRpbnQgc3RhdHVzLCBpO1xcbitcXHRwaWRfdCBwaWQ7XFxuK1xcdHNzaXplX3QgbjtcXG4rXFxuK1xcdGlmICghY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiaW9fdXJpbmcgbm90IGF2YWlsYWJsZVxcXCIpO1xcbitcXG4rXFx0biA9IHJlYWRsaW5rKFxcXCIvcHJvYy9zZWxmL2V4ZVxcXCIsIGhlbHBlciwgc2l6ZW9mKGhlbHBlcikgLSAxKTtcXG4rXFx0QVNTRVJUX0dUKG4sIDApO1xcbitcXHRoZWxwZXJbbl0gPSAnXFxcXDAnO1xcbitcXHRwID0gc3Ryc3RyKGhlbHBlciwgXFxcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFxcXCIpO1xcbitcXHRBU1NFUlRfTkUocCwgTlVMTCk7XFxuK1xcdEFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSArIHNpemVvZihcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcXFwiKSxcXG4rXFx0XFx0ICBzaXplb2YoaGVscGVyKSk7XFxuK1xcdHN0cmNweShwLCBcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcXFwiKTtcXG4rXFx0aWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKVxcbitcXHRcXHRTS0lQKHJldHVybiwgXFxcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyIG5vdCBidWlsdFxcXCIpO1xcbitcXG4rXFx0QVNTRVJUX0xUKHNucHJpbnRmKHBhdHRlcm4sIHNpemVvZihwYXR0ZXJuKSwgXFxcInwlc1xcXCIsIGhlbHBlciksXFxuK1xcdFxcdCAgKGludClzaXplb2YocGF0dGVybikpO1xcbitcXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKHBhdHRlcm4pKTtcXG4rXFxuK1xcdHBpZCA9IGZvcmsoKTtcXG4rXFx0QVNTRVJUX0dFKHBpZCwgMCk7XFxuK1xcdGlmIChwaWQgPT0gMClcXG4rXFx0XFx0Y3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCgpO1xcbitcXG4rXFx0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcXHUwMDI2c3RhdHVzLCAwKSwgcGlkKTtcXG4rXFx0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XFxuK1xcbitcXHQvKiBUaGUga2VybmVsIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBoZWxwZXIsIHNvIHBvbGwgZm9yIGl0LiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgMTAwOyBpKyspIHtcXG4rXFx0XFx0aWYgKCFzdGF0KE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2IHN0LnN0X3NpemUpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR1c2xlZXAoMTAwMDAwKTtcXG4rXFx0fVxcbitcXG4rXFx0Y2hlY2tfd2hvbGVfY29yZWR1bXAoX21ldGFkYXRhKTtcXG4rfVxcbitcXG4rLyogVGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgZHVtcCBnb2luZyB0byBhIGNvcmVkdW1wIHNvY2tldC4gKi9cXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcXG4re1xcbitcXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XFxuK1xcdGludCBpcGNfc29ja2V0c1syXSwgc3RhdHVzO1xcbitcXHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdO1xcbitcXHRjaGFyIGM7XFxuK1xcbitcXHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRTS0lQKHJldHVybiwgXFxcImlvX3VyaW5nIG5vdCBhdmFpbGFibGVcXFwiKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLFxcbitcXHRcXHRcXHQgICAgIGlwY19zb2NrZXRzKSwgMCk7XFxuK1xcdEFTU0VSVF9MVChzbnByaW50ZihwYXR0ZXJuLCBzaXplb2YocGF0dGVybiksIFxcXCJAJXNcXFwiLFxcbitcXHRcXHRcXHQgICBOT1RJRllfU0lHTkFMX1NPQ0tFVCksIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcXG4rXFx0QVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybihwYXR0ZXJuKSk7XFxuK1xcbitcXHRwaWRfY29yZWR1bXBfc2VydmVyID0gZm9yaygpO1xcbitcXHRBU1NFUlRfR0UocGlkX2NvcmVkdW1wX3NlcnZlciwgMCk7XFxuK1xcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcXG4rXFx0XFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9jb3JlX2ZpbGUgPSAtMTtcXG4rXFx0XFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcXG4rXFxuK1xcdFxcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcXG4rXFxuK1xcdFxcdGZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KE5PVElGWV9TSUdOQUxfU09DS0VUKTtcXG4rXFx0XFx0aWYgKGZkX3NlcnZlciBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRpZiAod3JpdGVfbm9pbnRyKGlwY19zb2NrZXRzWzFdLCBcXFwiMVxcXCIsIDEpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGNsb3NlKGlwY19zb2NrZXRzWzFdKTtcXG4rXFxuK1xcdFxcdGZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7XFxuK1xcdFxcdGlmIChmZF9jb3JlZHVtcCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0ZmRfY29yZV9maWxlID0gb3BlbihOT1RJRllfU0lHTkFMX0NPUkVfRklMRSxcXG4rXFx0XFx0XFx0XFx0ICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsXFxuK1xcdFxcdFxcdFxcdCAgICAwNjAwKTtcXG4rXFx0XFx0aWYgKGZkX2NvcmVfZmlsZSBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0aWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR0cnVlKSBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0ZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTO1xcbitvdXQ6XFxuK1xcdFxcdGlmIChmZF9jb3JlX2ZpbGUgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0Y2xvc2UoZmRfY29yZV9maWxlKTtcXG4rXFx0XFx0aWYgKGZkX2NvcmVkdW1wIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKGZkX2NvcmVkdW1wKTtcXG4rXFx0XFx0aWYgKGZkX3NlcnZlciBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZF9zZXJ2ZXIpO1xcbitcXHRcXHRfZXhpdChleGl0X2NvZGUpO1xcbitcXHR9XFxuK1xcdHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xcbitcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7XFxuK1xcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXFx1MDAyNmMsIDEpLCAxKTtcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7XFxuK1xcbitcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdEFTU0VSVF9HRShwaWQsIDApO1xcbitcXHRpZiAocGlkID09IDApXFxuK1xcdFxcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCksIHBpZCk7XFxuK1xcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xcbitcXG4rXFx0d2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7XFxuK1xcbitcXHRjaGVja193aG9sZV9jb3JlZHVtcChfbWV0YWRhdGEpO1xcbit9XFxuK1xcbitURVNUX0hBUk5FU1NfTUFJTlxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcXG5pbmRleCBlZDQ3ZjAxZmE1M2M1Li4wNmY5OTdiYTQ3ZmQ5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxcbkBAIC05LDYgKzksNyBAQFxcbiBcXG4gI2luY2x1ZGUgXFxcIi4uL2tzZWxmdGVzdF9oYXJuZXNzLmhcXFwiXFxuICNpbmNsdWRlIFxcXCIuLi9waWRmZC9waWRmZC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiY29yZWR1bXBfbm90aWZ5X3NpZ25hbC5oXFxcIlxcbiBcXG4gI2lmbmRlZiBQQUdFX1NJWkVcXG4gI2RlZmluZSBQQUdFX1NJWkUgNDA5NlxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuQEAgLTEsMTEgKzEsMTggQEBcXG4gLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gXFxuICNpbmNsdWRlIFxcdTAwM2Nhc3NlcnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2VsZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZW5kaWFuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGluay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RkZGVmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pb191cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhYi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29yZWR1bXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2Nwb2xsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRib29sLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbkBAIC0xMyw3ICsyMCw5IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy9lcG9sbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL3NvY2tldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N5c2NhbGwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy90eXBlcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL3VuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbkBAIC0yMSw2ICszMCw3IEBAXFxuIFxcbiAjaW5jbHVkZSBcXFwiLi4vZmlsZXN5c3RlbXMvd3JhcHBlcnMuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIi4uL3BpZGZkL3BpZGZkLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcXFwiXFxuIFxcbiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyB0byBhdm9pZCBpbmNsdWRpbmcgaGFybmVzcyBoZWFkZXIgKi9cXG4gc3RydWN0IF9fdGVzdF9tZXRhZGF0YTtcXG5AQCAtMzgxLDMgKzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcXG4gXFx0XFx0Y2xvc2UoZmRfY29yZWR1bXApO1xcbiBcXHRfZXhpdChleGl0X2NvZGUpO1xcbiB9XFxuK1xcbisvKlxcbisgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxcbisgKlxcbisgKiBfX2R1bXBfZW1pdCgpIHRha2VzIGFueXRoaW5nIHNob3J0IG9mIGEgZnVsbCB3cml0ZSBhcyB0aGUgZW5kIG9mIHRoZVxcbisgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcXG4rICogb2YgaXQuIFRoZSBOVF9GSUxFIG5vdGUgaXMgdGhlIG9uZSBlbWl0IHRoYXQgaXMgY2VydGFpbiB0byBibG9jayxcXG4rICogYmVjYXVzZSBpdCBpcyB0aGUgb25seSBvbmUgbGFyZ2VyIHRoYW4gdGhlIHRyYW5zcG9ydCwgc28gdGhlc2UgaGVscGVyc1xcbisgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXFxuKyAqIHRoZSBkdW1waW5nIHRhc2sgd2hpbGUgdGhhdCB3cml0ZSBpcyBpbiBmbGlnaHQuXFxuKyAqL1xcbitcXG4rc3RhdGljIGludCBpb191cmluZ19zZXR1cF9yYXcodW5zaWduZWQgaW50IGVudHJpZXMsIHN0cnVjdCBpb191cmluZ19wYXJhbXMgKnApXFxuK3tcXG4rXFx0cmV0dXJuIHN5c2NhbGwoX19OUl9pb191cmluZ19zZXR1cCwgZW50cmllcywgcCk7XFxuK31cXG4rXFxuKy8qIGlvX3VyaW5nIHJlYWRzIHBvbGwzMl9ldmVudHMgYmFjayB0aHJvdWdoIHN3YWh3MzIoKSBvbiBiaWcgZW5kaWFuLiAqL1xcbitzdGF0aWMgX191MzIgbm90aWZ5X3BvbGxfbWFzayhfX3UzMiBldmVudHMpXFxuK3tcXG4rI2lmIGRlZmluZWQoX19CWVRFX09SREVSKSBcXHUwMDI2XFx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXFxuK1xcdHJldHVybiBfX3N3YWh3MzIoZXZlbnRzKTtcXG4rI2Vsc2VcXG4rXFx0cmV0dXJuIGV2ZW50cztcXG4rI2VuZGlmXFxuK31cXG4rXFxuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdGZkID0gaW9fdXJpbmdfc2V0dXBfcmF3KDEsIFxcdTAwMjZwKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisvKlxcbisgKiBBcm0gYSBwb2xsIG9uIEBmZC4gaW9fdXJpbmcgbGVhdmVzIGN0eC1cXHUwMDNlbm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMXFxuKyAqIHVubGVzcyB0aGUgcmluZyBhc2tzIGZvciBTUVBPTEwgb3IgQ09PUF9UQVNLUlVOLCBzbyB0aGUgY29tcGxldGlvbiBydW5zXFxuKyAqIHNldF9ub3RpZnlfc2lnbmFsKCkgYWdhaW5zdCB0aGUgdGFzayB0aGF0IHN1Ym1pdHRlZCBpdC4gVGhhdCBpcyB1cywgYW5kXFxuKyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suXFxuKyAqL1xcbitzdGF0aWMgaW50IGFybV9wb2xsX25vdGlmeShpbnQgdHJpZ2dlcl9mZClcXG4re1xcbitcXHRzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHAgPSB7fTtcXG4rXFx0dW5zaWduZWQgaW50ICpzcV90YWlsLCAqc3FfYXJyYXk7XFxuK1xcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7XFxuK1xcdHNpemVfdCBzcXJpbmdfc3o7XFxuK1xcdHZvaWQgKnNxO1xcbitcXHRpbnQgcmluZztcXG4rXFxuK1xcdHJpbmcgPSBpb191cmluZ19zZXR1cF9yYXcoOCwgXFx1MDAyNnApO1xcbitcXHRpZiAocmluZyBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHNxcmluZ19zeiA9IHAuc3Ffb2ZmLmFycmF5ICsgcC5zcV9lbnRyaWVzICogc2l6ZW9mKHVuc2lnbmVkIGludCk7XFxuK1xcdHNxID0gbW1hcChOVUxMLCBzcXJpbmdfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUV9SSU5HKTtcXG4rXFx0aWYgKHNxID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHNxZXMgPSBtbWFwKE5VTEwsIHAuc3FfZW50cmllcyAqIHNpemVvZigqc3FlcyksIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCAgICBNQVBfU0hBUkVEIHwgTUFQX1BPUFVMQVRFLCByaW5nLCBJT1JJTkdfT0ZGX1NRRVMpO1xcbitcXHRpZiAoc3FlcyA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRzcV90YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYudGFpbCk7XFxuK1xcdHNxX2FycmF5ID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYuYXJyYXkpO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZzcWVzWzBdLCAwLCBzaXplb2Yoc3Flc1swXSkpO1xcbitcXHRzcWVzWzBdLm9wY29kZSA9IElPUklOR19PUF9QT0xMX0FERDtcXG4rXFx0c3Flc1swXS5mZCA9IHRyaWdnZXJfZmQ7XFxuK1xcdHNxZXNbMF0ucG9sbDMyX2V2ZW50cyA9IG5vdGlmeV9wb2xsX21hc2soUE9MTElOKTtcXG4rXFxuK1xcdHNxX2FycmF5WzBdID0gMDtcXG4rXFx0X19hdG9taWNfc3RvcmVfbihzcV90YWlsLCAxLCBfX0FUT01JQ19SRUxFQVNFKTtcXG4rXFxuK1xcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0LyogRGVsaWJlcmF0ZWx5IGxlYWtlZCwgd2UgYXJlIGFib3V0IHRvIGNyYXNoLiAqL1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogQWRqYWNlbnQgbWFwcGluZ3Mgd2l0aCBpZGVudGljYWwgZmxhZ3MgYW5kIGNvbnRpZ3VvdXMgZmlsZSBvZmZzZXRzIGFyZVxcbisgKiBtZXJnZWQgaW50byBvbmUgVk1BLCB3aGljaCB3b3VsZCBjb2xsYXBzZSBOVF9GSUxFIGJhY2sgdG8gbm90aGluZywgc29cXG4rICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLlxcbisgKiBOb3QgUFJPVF9FWEVDLCAvdG1wIGlzIG9mdGVuIG1vdW50ZWQgbm9leGVjLiBOb3RoaW5nIGlzIGV2ZXIgd3JpdHRlblxcbisgKiB0aHJvdWdoIHRoZXNlIHNvIHRoZXkgZ2V0IG5vIGFub25fdm1hIGFuZCBzdGF5IG91dCBvZiB0aGUgZHVtcCBpdHNlbGYuXFxuKyAqL1xcbitzdGF0aWMgaW50IG1ha2VfZmlsZV9tYXBwaW5ncyh2b2lkKVxcbit7XFxuK1xcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0aW50IGZkLCBpO1xcbitcXG4rXFx0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSxcXG4rXFx0XFx0ICBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7XFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRpZiAoZnRydW5jYXRlKGZkLCAob2ZmX3QpTk9USUZZX1NJR05BTF9NQVBfQ09VTlQgKiBwZ3N6KSkge1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQ7IGkrKykge1xcbitcXHRcXHRpbnQgcHJvdCA9IChpIFxcdTAwMjYgMSkgPyBQUk9UX1JFQUQgOiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7XFxuK1xcbitcXHRcXHRpZiAobW1hcChOVUxMLCBwZ3N6LCBwcm90LCBNQVBfUFJJVkFURSwgZmQsXFxuK1xcdFxcdFxcdCAob2ZmX3QpaSAqIHBnc3opID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIGk7XFxuK31cXG4rXFxuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKVxcbit7XFxuK1xcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0dW5zaWduZWQgY2hhciAqcDtcXG4rXFx0aW50IHRyaWdnZXJfZmQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb2ZmO1xcbitcXG4rXFx0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXIncyBvcGVuKCkgY2Fubm90IGJsb2NrLiAqL1xcbitcXHR0cmlnZ2VyX2ZkID0gb3BlbihOT1RJRllfU0lHTkFMX1RSSUdHRVIsIE9fUkRPTkxZIHwgT19OT05CTE9DSyB8IE9fQ0xPRVhFQyk7XFxuK1xcbitcXHQvKiBFeGl0IHJhdGhlciB0aGFuIGNyYXNoOiBhIGR1bXAgd2l0aG91dCB0aGUgcG9sbCBhcm1lZCBwcm92ZXMgbm90aGluZy4gKi9cXG4rXFx0aWYgKHRyaWdnZXJfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRfZXhpdChFWElUX0ZBSUxVUkUpO1xcbitcXG4rXFx0aWYgKG1ha2VfZmlsZV9tYXBwaW5ncygpIFxcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpXFxuK1xcdFxcdF9leGl0KEVYSVRfRkFJTFVSRSk7XFxuK1xcbitcXHRwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcXG4rXFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFx0Zm9yIChvZmYgPSAwOyBvZmYgXFx1MDAzYyBOT1RJRllfU0lHTkFMX0FOT05fQllURVM7IG9mZiArPSBwZ3N6KVxcbitcXHRcXHRwW29mZl0gPSAxO1xcbitcXG4rXFx0aWYgKGFybV9wb2xsX25vdGlmeSh0cmlnZ2VyX2ZkKSlcXG4rXFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFxuK1xcdC8qIGNyYXNoIG9uIHB1cnBvc2UgKi9cXG4rXFx0Kih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDtcXG4rXFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcXG4re1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRmZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IG9wZW4gZmFpbGVkOiAlbVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0aWYgKHdyaXRlKGZkLCBcXFwieFxcXCIsIDEpICE9IDEpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogd3JpdGUgZmFpbGVkOiAlbVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBwaGRyWzBdIGlzIHRoZSBQVF9OT1RFIGVudHJ5OiBlbGZfY29yZV9kdW1wKCkgZW1pdHMgaXQgcmlnaHQgYWZ0ZXIgdGhlXFxuKyAqIEVMRiBoZWFkZXIuIEl0cyBwX29mZnNldCBpcyB3aGVyZSB0aGUgbm90ZXMgYmVnaW4uXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBsb25nIG5vdGVfb2Zmc2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkcilcXG4re1xcbitcXHRFbGZXKFBoZHIpIHBoO1xcbitcXHRFbGZXKEVoZHIpIGVoO1xcbitcXG4rXFx0bWVtY3B5KFxcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcXG4rXFx0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdG1lbWNweShcXHUwMDI2cGgsIGhkciArIHNpemVvZihlaCksIHNpemVvZihwaCkpO1xcbitcXHRpZiAocGgucF90eXBlICE9IFBUX05PVEUpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIChsb25nIGxvbmcpcGgucF9vZmZzZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIERyYWluIGEgY29yZWR1bXAgb2ZmIEBmZCwgY291bnRpbmcgd2hhdCBhcnJpdmVzLiBPbmNlIHRoZSBub3RlcyBoYXZlXFxuKyAqIHN0YXJ0ZWQgdGhlIGtlcm5lbCBpcyBpbnNpZGUgdGhlIG9uZSBiaWcgbm90ZSB3cml0ZSwgc28gcG9rZSB0aGUgZmlmb1xcbisgKiB0aGUgY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIGFuZCBzdG9wIHJlYWRpbmcsIHdoaWNoIGtlZXBzIHRoZVxcbisgKiB0cmFuc3BvcnQgZnVsbCBhbmQgdGhlIHdyaXRlIGJsb2NrZWQgd2l0aCBhIHBhcnRpYWwgY291bnQgd2hlbiB0aGVcXG4rICogd2FrZXVwIGxhbmRzLiBUaGVuIGNhcnJ5IG9uIHRvIGVuZCBvZiBmaWxlLlxcbisgKlxcbisgKiBXaGF0IGFycml2ZXMgaXMgd3JpdHRlbiB0byBAZmRfb3V0IHdoZW4gdGhhdCBpcyBub3QgbmVnYXRpdmUuXFxuKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEuIEZhaWxpbmcgdG8gdHJpcCB0aGUgZmlmb1xcbisgKiBpcyBhbiBlcnJvciB0b286IGEgZHVtcCB0aGF0IHdhcyBuZXZlciBpbnRlcnJ1cHRlZCBwcm92ZXMgbm90aGluZy5cXG4rICovXFxuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pXFxuK3tcXG4rXFx0dW5zaWduZWQgY2hhciBoZHJbc2l6ZW9mKEVsZlcoRWhkcikpICsgc2l6ZW9mKEVsZlcoUGhkcikpXTtcXG4rXFx0c3RhdGljIGNoYXIgYnVmWzY0IFxcdTAwM2NcXHUwMDNjIDEwXTtcXG4rXFx0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRsb25nIGxvbmcgbm90ZV9vZmYgPSAwO1xcbitcXHRzaXplX3QgaGRybGVuID0gMDtcXG4rXFx0c3NpemVfdCB0b3RhbCA9IDA7XFxuK1xcdGJvb2wgYXJtZWQgPSBmYWxzZTtcXG4rXFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0c3NpemVfdCBuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7XFxuK1xcbitcXHRcXHRpZiAobiBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0aWYgKGVycm5vID09IEVJTlRSKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0cmV0dXJuIC0xO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChuID09IDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRpZiAoZmRfb3V0IFxcdTAwM2U9IDAgXFx1MDAyNlxcdTAwMjYgd3JpdGUoZmRfb3V0LCBidWYsIG4pICE9IG4pXFxuK1xcdFxcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdFxcdGlmIChoZHJsZW4gXFx1MDAzYyBzaXplb2YoaGRyKSkge1xcbitcXHRcXHRcXHRzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuO1xcbitcXG4rXFx0XFx0XFx0aWYgKHdhbnQgXFx1MDAzZSAoc2l6ZV90KW4pXFxuK1xcdFxcdFxcdFxcdHdhbnQgPSAoc2l6ZV90KW47XFxuK1xcdFxcdFxcdG1lbWNweShoZHIgKyBoZHJsZW4sIGJ1Ziwgd2FudCk7XFxuK1xcdFxcdFxcdGhkcmxlbiArPSB3YW50O1xcbitcXHRcXHRcXHRpZiAoaGRybGVuID09IHNpemVvZihoZHIpKVxcbitcXHRcXHRcXHRcXHRub3RlX29mZiA9IG5vdGVfb2Zmc2V0KGhkcik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHRvdGFsICs9IG47XFxuK1xcbitcXHRcXHRpZiAoYXJtIFxcdTAwMjZcXHUwMDI2ICFhcm1lZCBcXHUwMDI2XFx1MDAyNiBub3RlX29mZiBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIHRvdGFsIFxcdTAwM2Ugbm90ZV9vZmYgKyAobG9uZyBsb25nKXBnc3opIHtcXG4rXFx0XFx0XFx0aWYgKHB1bGxfdHJpZ2dlcigpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdFxcdFxcdGFybWVkID0gdHJ1ZTtcXG4rXFx0XFx0XFx0dXNsZWVwKE5PVElGWV9TSUdOQUxfU1RBTExfVVMpO1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAoYXJtIFxcdTAwMjZcXHUwMDI2ICFhcm1lZClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cmV0dXJuIHRvdGFsO1xcbit9XFxuK1xcbisvKlxcbisgKiBIb3cgbGFyZ2UgdGhlIGR1bXAgd2FzIG1lYW50IHRvIGJlLiBUaGUgRUxGIGhlYWRlciBhbmQgdGhlIHByb2dyYW1cXG4rICogaGVhZGVycyBhcmUgdGhlIGZpcnN0IHRoaW5nIGVtaXR0ZWQsIHNvIGV2ZW4gYSB0cnVuY2F0ZWQgZHVtcCBzYXlzIGhvd1xcbisgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCArIHBfZmlsZXN6KS5cXG4rICpcXG4rICogQSBob2xlIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgb25lIHRoaW5nIHRoYXQgbmV2ZXJcXG4rICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLVxcdTAwM2V0b19za2lwLCBlbGZfY29yZV9kdW1wKClcXG4rICogaGFzIG5vIGZsdXNoIGFmdGVyIHRoZSBsYXN0IGR1bXBfdXNlcl9yYW5nZSgpIGFuZCBhIHBpcGUgY2Fubm90IHNlZWssXFxuKyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcXG4rICogYW5kIHZzeXNjYWxsPXhvbmx5IGxlYXZlcyBubyBwYWdlIGJlaGluZCBpdCwgc28gYSB3aG9sZSBkdW1wIGlzIG9uZVxcbisgKiBwYWdlIHNob3J0IG9mIHdoYXQgdGhlIGhlYWRlcnMgcHJvbWlzZS4gQHRhaWwgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGF0XFxuKyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXFxuKyAqL1xcbitsb25nIGxvbmcgY29yZWR1bXBfZXhwZWN0ZWRfc2l6ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIGxvbmcgKnRhaWwpXFxuK3tcXG4rXFx0RWxmVyhQaGRyKSAqcGhkciA9IE5VTEw7XFxuK1xcdGxvbmcgbG9uZyBleHBlY3RlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBucGhkciwgaTtcXG4rXFx0RWxmVyhFaGRyKSBlaDtcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0KnRhaWwgPSAwO1xcbitcXG4rXFx0ZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAocmVhZChmZCwgXFx1MDAyNmVoLCBzaXplb2YoZWgpKSAhPSBzaXplb2YoZWgpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKCFlaC5lX3BobnVtIHx8IGVoLmVfcGhlbnRzaXplICE9IHNpemVvZigqcGhkcikpXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0bnBoZHIgPSBlaC5lX3BobnVtO1xcbitcXHRwaGRyID0gY2FsbG9jKG5waGRyLCBzaXplb2YoKnBoZHIpKTtcXG4rXFx0aWYgKCFwaGRyKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKHByZWFkKGZkLCBwaGRyLCAoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSwgKG9mZl90KWVoLmVfcGhvZmYpICE9XFxuK1xcdCAgICAoc3NpemVfdCkoKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkcikpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucGhkcjsgaSsrKSB7XFxuK1xcdFxcdGxvbmcgbG9uZyBlbmQgPSAobG9uZyBsb25nKXBoZHJbaV0ucF9vZmZzZXQgK1xcbitcXHRcXHRcXHRcXHQobG9uZyBsb25nKXBoZHJbaV0ucF9maWxlc3o7XFxuK1xcdFxcdGlmIChlbmQgXFx1MDAzZSBleHBlY3RlZCkge1xcbitcXHRcXHRcXHRleHBlY3RlZCA9IGVuZDtcXG4rXFx0XFx0XFx0KnRhaWwgPSAobG9uZyBsb25nKXBoZHJbaV0ucF9maWxlc3o7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0ZnJlZShwaGRyKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gZXhwZWN0ZWQ7XFxuK2VycjpcXG4rXFx0ZnJlZShwaGRyKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MjIuNTc1MDUzNTg2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6Nzk0MzY4MDQ4NjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIixcbiAgICBcIkNJRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2ZnNfY29yZWR1bXBcIixcbiAgICBcInNtYl9zZW5kX2t2ZWNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjhlNDFhM2M5Y2UyMjBmZTEzNTcyZmQ0OTQ1YjZkYWVlNTViZTBjZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDExOjMxOjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcbmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0XG4tLS0gYS9mcy9jb3JlZHVtcC5jXG4rKysgYi9mcy9jb3JlZHVtcC5jXG5AQCAtMTE2NSw2ICsxMTY1LDcgQEAgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbiBcdHN0cnVjdCBjb3JlX25hbWUgY247XG4gXHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQgPSBtbS1cdTAwM2ViaW5mbXQ7XG4rXHR1bnNpZ25lZCBpbnQgbm90aWZ5X2ZsYWdzO1xuIFx0aW50IGFyZ2MgPSAwO1xuIFx0c3RydWN0IGNvcmVkdW1wX3BhcmFtcyBjcHJtID0ge1xuIFx0XHQuc2lnaW5mbyA9IHNpZ2luZm8sXG5AQCAtMTE5Niw5ICsxMTk3LDEyIEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRpZiAoY29yZWR1bXBfd2FpdChzaWdpbmZvLVx1MDAzZXNpX3NpZ25vLCBcdTAwMjZjb3JlX3N0YXRlKSBcdTAwM2MgMClcbiBcdFx0cmV0dXJuO1xuIFxuK1x0LyogVGFzayB3b3JrIG11c3Qgbm90IGN1dCB0aGUgZHVtcCBzaG9ydCwgc2VlIHNpZ25hbF9wZW5kaW5nKCkuICovXG4rXHRub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTtcbiBcdHNjb3BlZF93aXRoX2NyZWRzKGNyZWQpXG4gXHRcdGRvX2NvcmVkdW1wKFx1MDAyNmNuLCBcdTAwMjZjcHJtLCBcdTAwMjZhcmd2LCBcdTAwMjZhcmdjLCBiaW5mbXQpO1xuIFx0Y29yZWR1bXBfY2xlYW51cChcdTAwMjZjbiwgXHUwMDI2Y3BybSk7XG4rXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbiBcdHJldHVybjtcbiB9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XG4tLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG4rKysgYi9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG5AQCAtMjIsNyArMjIsNiBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbXBvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza193b3JrLmhcdTAwM2VcbiAjaW5jbHVkZSBcImNpZnNnbG9iLmhcIlxuICNpbmNsdWRlIFwiY2lmc3Byb3RvLmhcIlxuICNpbmNsdWRlIFwiY2lmc19kZWJ1Zy5oXCJcbkBAIC0xNDIsNiArMTQxLDcgQEAgaW50XG4gc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHQgICAgICBzaXplX3QgKnNlbnQpXG4ge1xuK1x0dW5zaWduZWQgaW50IG5vdGlmeV9mbGFncztcbiBcdGludCByYyA9IDA7XG4gXHRpbnQgcmV0cmllcyA9IDA7XG4gXHRzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0ID0gc2VydmVyLVx1MDAzZXNzb2NrZXQ7XG5AQCAtMTcyLDE1ICsxNzIsMTIgQEAgc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHRcdCAqIGFmdGVyIHRoZSByZXRyaWVzIHdlIHdpbGwga2lsbCB0aGUgc29ja2V0IGFuZFxuIFx0XHQgKiByZWNvbm5lY3Qgd2hpY2ggbWF5IGNsZWFyIHRoZSBuZXR3b3JrIHByb2JsZW0uXG4gXHRcdCAqXG4tXHRcdCAqIEV2ZW4gaWYgcmVndWxhciBzaWduYWxzIGFyZSBtYXNrZWQsIEVJTlRSIG1pZ2h0IGJlXG4tXHRcdCAqIHByb3BhZ2F0ZWQgZnJvbSBza19zdHJlYW1fd2FpdF9tZW1vcnkoKSB0byBoZXJlIHdoZW5cbi1cdFx0ICogVElGX05PVElGWV9TSUdOQUwgaXMgdXNlZCBmb3IgdGFzayB3b3JrLiBGb3IgZXhhbXBsZSxcbi1cdFx0ICogY2VydGFpbiBpb191cmluZyBjb21wbGV0aW9ucyB3aWxsIHVzZSB0aGF0LiBUcmVhdFxuLVx0XHQgKiBoYXZpbmcgRUlOVFIgd2l0aCBwZW5kaW5nIHRhc2sgd29yayB0aGUgc2FtZSBhcyBFQUdBSU5cbi1cdFx0ICogdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVjb25uZWN0cy5cbitcdFx0ICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS5cbiBcdFx0ICovXG4rXHRcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0XHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcbi1cdFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFx1MDAyNlx1MDAyNiB0YXNrX3dvcmtfcGVuZGluZyhjdXJyZW50KSkpIHtcbitcdFx0bm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7XG4rXHRcdGlmIChyYyA9PSAtRUFHQUlOKSB7XG4gXHRcdFx0cmV0cmllcysrO1xuIFx0XHRcdGlmIChyZXRyaWVzIFx1MDAzZT0gMTQgfHxcbiBcdFx0XHQgICAgKCFzZXJ2ZXItXHUwMDNlbm9ibG9ja3NuZCBcdTAwMjZcdTAwMjYgKHJldHJpZXMgXHUwMDNlIDIpKSkge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuaW5kZXggMzczYmNjMDU5OGQxMC4uZmQ3MmNhNGVlOTJmMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oXG5AQCAtMTc5Niw3ICsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7XG4gXHRcdFx0XHRcdFx0ICogSSBhbSBjbGVhbmluZyBkaXJ0eSBwYWdlcyBmcm9tIHNvbWUgb3RoZXIgYmRpLiAqL1xuICNkZWZpbmUgUEZfS1RIUkVBRFx0XHQweDAwMjAwMDAwXHQvKiBJIGFtIGEga2VybmVsIHRocmVhZCAqL1xuICNkZWZpbmUgUEZfUkFORE9NSVpFXHRcdDB4MDA0MDAwMDBcdC8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi9cbi0jZGVmaW5lIFBGX19IT0xFX18wMDgwMDAwMFx0MHgwMDgwMDAwMFxuKyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFx0MHgwMDgwMDAwMFx0Lyogc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpICovXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcdDB4MDEwMDAwMDBcbiAjZGVmaW5lIFBGX19IT0xFX18wMjAwMDAwMFx0MHgwMjAwMDAwMFxuICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFlcdDB4MDQwMDAwMDBcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li4zMTgyZGU0ZmY5NDgyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTM4NCwxNCArMzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXG4gXHRyZXR1cm4gdW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCxUSUZfU0lHUEVORElORykpO1xuIH1cbiBcbisvKiBQcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHRoaXMgdGFzay4gKi9cbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub19ub3RpZnlfc2lnbmFsX3NhdmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1xuK1x0Y3VycmVudC1cdTAwM2VmbGFncyB8PSBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1x0cmV0dXJuIGZsYWdzO1xuK31cbitcbisvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqL1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKVxuK3tcbitcdGN1cnJlbnRfcmVzdG9yZV9mbGFncyhmbGFncywgUEZfTk9fTk9USUZZX1NJR05BTCk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgaW50IHNpZ25hbF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHQvKlxuIFx0ICogVElGX05PVElGWV9TSUdOQUwgaXNuJ3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWVcbiBcdCAqIGJlaGF2aW9yIGluIHRlcm1zIG9mIGVuc3VyaW5nIHRoYXQgd2UgYnJlYWsgb3V0IG9mIHdhaXQgbG9vcHNcbi1cdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC5cbitcdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC4gTm90IGZvciBhIHRhc2tcbitcdCAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuXG4gXHQgKi9cbi1cdGlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpKVxuK1x0aWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgbGlrZWx5KCEoUkVBRF9PTkNFKHAtXHUwMDNlZmxhZ3MpIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXG4gXHRcdHJldHVybiAxO1xuIFx0cmV0dXJuIHRhc2tfc2lncGVuZGluZyhwKTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uNzI4ZjNjMzQyZWI5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyArMywxMCBAQCBDRkxBR1MgKz0gLVdhbGwgLU8wIC1nICQoS0hEUl9JTkNMVURFUykgJChUT09MU19JTkNMVURFUylcbiBcbiBURVNUX0dFTl9QUk9HUyA6PSBzdGFja2R1bXBfdGVzdCBcXFxuIFx0XHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXG4tXHRcdCAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3RcbitcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuK1x0XHQgIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFxuKyMgU3Bhd25lZCBieSB0aGUga2VybmVsIGFzIHRoZSB8aGVscGVyLCBub3QgYSB0ZXN0IG9mIGl0cyBvd24uXG4rVEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcbiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcFxuIFxuIGluY2x1ZGUgLi4vbGliLm1rXG5AQCAtMTEsMyArMTQsNSBAQCBpbmNsdWRlIC4uL2xpYi5ta1xuICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuKyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxuQEAgLTAsMCArMSwyOSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rXG4rI2lmbmRlZiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxuKyNkZWZpbmUgX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0hcbitcbisjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuK1xuKy8qXG4rICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGVcbisgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0J3Mgd2F5IGJleW9uZCB0aGUgZGVmYXVsdCA2NEtcbisgKiBwaXBlIHJpbmcgYW5kIHBhc3QgdGhlIH4zNksgYW4gYWZfdW5peCBza2IgaG9sZHMuIFNvIHdlIGZvcmNlIGEgd3JpdGVcbisgKiB0byBjb21lIGJhY2sgc2hvcnQuXG4rICovXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX01BUF9DT1VOVFx0XHQ0MDAwXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0FOT05fQllURVNcdCg0VUwgXHUwMDNjXHUwMDNjIDIwKVxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VU1x0XHQyMDAwMDBcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfTUFQRklMRVx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfVFJJR0dFUlx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmVcIlxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEVcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFwiXG4rXG4rdm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpO1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpO1xuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pO1xuK2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCk7XG4rXG4rI2VuZGlmIC8qIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi44NDlmNWMxZWE3MzY1XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jXG5AQCAtMCwwICsxLDQ2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIFRoZSB8aGVscGVyIGhhbGYgb2YgY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LiBUaGUga2VybmVsIHNwYXducyB0aGlzXG4rICogd2l0aCB0aGUgY29yZWR1bXAgb24gc3RkaW4sIHNvIGl0IGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSB0ZXN0IGJpbmFyeS5cbisgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXG4rICogY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIHNvIFRJRl9OT1RJRllfU0lHTkFMIGlzIHJhaXNlZCB3aGlsZSB0aGUgbm90ZVxuKyAqIHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcbit7XG4rXHRpbnQgZmRfY29yZV9maWxlO1xuK1x0c3NpemVfdCByZXQ7XG4rXG4rXHRmZF9jb3JlX2ZpbGUgPSBvcGVuKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFLFxuK1x0XHRcdCAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcbitcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG9wZW4gZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0cmV0dXJuIEVYSVRfRkFJTFVSRTtcbitcdH1cbitcbitcdHJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7XG4rXHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byBlcnI7XG4rXG4rXHQvKiBUaGUgdGVzdCBwb2xscyBmb3IgdGhpcyBuYW1lLCBzbyBvbmx5IGNyZWF0ZSBpdCBvbmNlIGl0IGlzIHdob2xlLiAqL1xuK1x0aWYgKHJlbmFtZShOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZW5hbWUgZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0Z290byBlcnI7XG4rXHR9XG4rXG4rXHRyZXR1cm4gRVhJVF9TVUNDRVNTO1xuK1xuK2VycjpcbitcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSk7XG4rXHRyZXR1cm4gRVhJVF9GQUlMVVJFO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTYzYzA2YTgxNTYyZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmNcbkBAIC0wLDAgKzEsMjQ1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIEEgY29yZWR1bXAgaXMgbWVhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgU0lHS0lMTCBhbmQgYnkgdGhlIGZyZWV6ZXIgYW5kXG4rICogYnkgbm90aGluZyBlbHNlLiBkdW1wX2ludGVycnVwdGVkKCkgc2F5cyBzbywgYnV0IHRoZSBibG9ja2luZyB3YWl0c1xuKyAqIHVuZGVybmVhdGggaXQgdGVzdCBzaWduYWxfcGVuZGluZygpLCB3aGljaCBpcyBhbHNvIHRydWUgZm9yXG4rICogVElGX05PVElGWV9TSUdOQUwuIEEgY3Jhc2hpbmcgdGFzayB0aGF0IGhhcyBhbiBpb191cmluZyBjb21wbGV0aW9uIGxhbmRcbisgKiBvbiBpdCBtaWQtZHVtcCB0aGVyZWZvcmUga2VlcHMgZHVtcGluZyB3aGlsZSBldmVyeSB3YWl0IGl0IGVudGVycyBiYWlsc1xuKyAqIG91dCBhdCBvbmNlLCBhbmQgdGhlIGR1bXAgaXMgc2lsZW50bHkgY3V0IHNob3J0LiBOb3RoaW5nIHJlcG9ydHMgaXQ6XG4rICogYmluZm10X2VsZiBzZXRzIGhhc19kdW1wZWQgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gV0NPUkVEVU1QKClcbisgKiBzYXlzIHRoZSBkdW1wIHdvcmtlZC5cbisgKlxuKyAqIEEgY29yZWR1bXAgbm90ZSBpcyB0aGUgb25seSBkdW1wX2VtaXQoKSB0aGF0IGV4Y2VlZHMgd2hhdCB0aGUgdHJhbnNwb3J0XG4rICogdGFrZXMgaW4gb25lIGdvLCBzbyBpdCBpcyB0aGUgb25lIHdyaXRlIHRoYXQgaXMgY2VydGFpbiB0byBibG9jay4gQm90aFxuKyAqIHRlc3RzIGNyYXNoIGEgY2hpbGQgaG9sZGluZyBlbm91Z2ggZmlsZSBiYWNrZWQgbWFwcGluZ3MgZm9yIGl0cyBOVF9GSUxFXG4rICogbm90ZSB0byBydW4gcGFzdCB0aGF0LCBhcm0gYW4gaW9fdXJpbmcgcG9sbCBvbiBpdCwgYW5kIHRyaXAgdGhlIHBvbGxcbisgKiB3aGlsZSB0aGUgbm90ZSBpcyBiZWluZyB3cml0dGVuLiBXaGF0IGNvbWVzIG91dCBoYXMgdG8gYmUgdGhlIHdob2xlXG4rICogZHVtcC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX3Rlc3QuaFwiXG4rXG4rRklYVFVSRV9TRVRVUChjb3JlZHVtcClcbit7XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldDtcbitcbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwiclwiKTtcbitcdEFTU0VSVF9ORShOVUxMLCBmaWxlKTtcbitcbitcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLFxuK1x0XHQgICAgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7XG4rXHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4rXHRBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pKTtcbitcbitcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAnXFwwJztcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbitcdEFTU0VSVF9HRShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkLCAwKTtcbitcbitcdHJldCA9IGZjbG9zZShmaWxlKTtcbitcdEFTU0VSVF9FUSgwLCByZXQpO1xuK1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XG4rXHRBU1NFUlRfRVEobWtmaWZvKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgMDYwMCksIDApO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxuK3tcbitcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbitcdEZJTEUgKmZpbGU7XG4rXHRpbnQgcmV0LCBzdGF0dXM7XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyLCBTSUdURVJNKTtcbitcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHR9XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpO1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xuK1xuK1x0ZmlsZSA9IGZvcGVuKFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cIiwgXCJ3XCIpO1xuK1x0aWYgKCFmaWxlKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdHJldCA9IGZwcmludGYoZmlsZSwgXCIlc1wiLCBzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIGNsb3NlIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCBcdTAwM2U9IDApIHtcbitcdFx0cmV0ID0gY2xvc2Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1wiO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm47XG4rZmFpbDpcbitcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xuK1x0ZnByaW50ZihzdGRlcnIsIFwiRmFpbGVkIHRvIGNsZWFudXAgY29yZWR1bXAgdGVzdDogJXNcXG5cIiwgcmVhc29uKTtcbit9XG4rXG4rLypcbisgKiBDaGVjayB0aGF0IHdoYXQgdGhlIGhlbHBlciBvciB0aGUgc2VydmVyIHNhdmVkIGlzIHRoZSB3aG9sZSBkdW1wLiBPbmx5XG4rICogYSBob2xlIGF0IHRoZSB2ZXJ5IGVuZCBjYW4gYmUgbWlzc2luZywgc2VlIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoKS5cbisgKi9cbitzdGF0aWMgdm9pZCBjaGVja193aG9sZV9jb3JlZHVtcChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEpXG4re1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXG4rXHRleHBlY3RlZCA9IGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnRhaWwpO1xuK1x0QVNTRVJUX0dUKGV4cGVjdGVkLCAwKTtcbitcdEFTU0VSVF9FUShzdGF0KE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCBcdTAwMjZzdCksIDApO1xuK1x0QVNTRVJUX0xFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQpO1xuK1x0QVNTRVJUX0dFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQgLSB0YWlsKTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHVtcCBnb2VzIHRvIGEgfGhlbHBlciwgc28gdGhlIHJlYWRlciBpcyBhIHNlcGFyYXRlIHByb2dyYW0gdGhlXG4rICoga2VybmVsIHNwYXducy4gSXQgc2F2ZXMgd2hhdCBpdCByZWNlaXZlZCB0byBOT1RJRllfU0lHTkFMX0NPUkVfRklMRS5cbisgKi9cbitURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfcGlwZSlcbit7XG4rXHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDtcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1x0aW50IHN0YXR1cywgaTtcbitcdHBpZF90IHBpZDtcbitcdHNzaXplX3QgbjtcbitcbitcdGlmICghY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKCkpXG4rXHRcdFNLSVAocmV0dXJuLCBcImlvX3VyaW5nIG5vdCBhdmFpbGFibGVcIik7XG4rXG4rXHRuID0gcmVhZGxpbmsoXCIvcHJvYy9zZWxmL2V4ZVwiLCBoZWxwZXIsIHNpemVvZihoZWxwZXIpIC0gMSk7XG4rXHRBU1NFUlRfR1QobiwgMCk7XG4rXHRoZWxwZXJbbl0gPSAnXFwwJztcbitcdHAgPSBzdHJzdHIoaGVscGVyLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFwiKTtcbitcdEFTU0VSVF9ORShwLCBOVUxMKTtcbitcdEFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSArIHNpemVvZihcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpLFxuK1x0XHQgIHNpemVvZihoZWxwZXIpKTtcbitcdHN0cmNweShwLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpO1xuK1x0aWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKVxuK1x0XHRTS0lQKHJldHVybiwgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciBub3QgYnVpbHRcIik7XG4rXG4rXHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcInwlc1wiLCBoZWxwZXIpLFxuK1x0XHQgIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkID0gZm9yaygpO1xuK1x0QVNTRVJUX0dFKHBpZCwgMCk7XG4rXHRpZiAocGlkID09IDApXG4rXHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbitcbitcdEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKSwgcGlkKTtcbitcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuK1xuK1x0LyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMDsgaSsrKSB7XG4rXHRcdGlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNiBzdC5zdF9zaXplKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoMTAwMDAwKTtcbitcdH1cbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuKy8qIFRoZSBzYW1lIHRoaW5nIHdpdGggdGhlIGR1bXAgZ29pbmcgdG8gYSBjb3JlZHVtcCBzb2NrZXQuICovXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcbit7XG4rXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXHRpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1cztcbitcdGNoYXIgcGF0dGVybltQQVRIX01BWF07XG4rXHRjaGFyIGM7XG4rXG4rXHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJpb191cmluZyBub3QgYXZhaWxhYmxlXCIpO1xuK1xuK1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsXG4rXHRcdFx0ICAgICBpcGNfc29ja2V0cyksIDApO1xuK1x0QVNTRVJUX0xUKHNucHJpbnRmKHBhdHRlcm4sIHNpemVvZihwYXR0ZXJuKSwgXCJAJXNcIixcbitcdFx0XHQgICBOT1RJRllfU0lHTkFMX1NPQ0tFVCksIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTtcbitcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcbitcdFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9jb3JlX2ZpbGUgPSAtMTtcbitcdFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbitcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMF0pO1xuK1xuK1x0XHRmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHRcdGlmIChmZF9zZXJ2ZXIgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlmICh3cml0ZV9ub2ludHIoaXBjX3NvY2tldHNbMV0sIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMV0pO1xuK1xuK1x0XHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXG4rXHRcdGZkX2NvcmVfZmlsZSA9IG9wZW4oTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsXG4rXHRcdFx0XHQgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyxcbitcdFx0XHRcdCAgICAwNjAwKTtcbitcdFx0aWYgKGZkX2NvcmVfZmlsZSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0aWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLFxuK1x0XHRcdFx0XHRcdHRydWUpIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1xuK1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4rb3V0OlxuK1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkX2NvcmVkdW1wKTtcbitcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRfc2VydmVyKTtcbitcdFx0X2V4aXQoZXhpdF9jb2RlKTtcbitcdH1cbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXG4rXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcbitcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXHUwMDI2YywgMSksIDEpO1xuK1x0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7XG4rXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkLCAwKTtcbitcdGlmIChwaWQgPT0gMClcbitcdFx0Y3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCgpO1xuK1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuK1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4rXG4rXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG5pbmRleCBlZDQ3ZjAxZmE1M2M1Li4wNmY5OTdiYTQ3ZmQ5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbkBAIC05LDYgKzksNyBAQFxuIFxuICNpbmNsdWRlIFwiLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4gI2luY2x1ZGUgXCIuLi9waWRmZC9waWRmZC5oXCJcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4gXG4gI2lmbmRlZiBQQUdFX1NJWkVcbiAjZGVmaW5lIFBBR0VfU0laRSA0MDk2XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTEsMTEgKzEsMTggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIFxuICNpbmNsdWRlIFx1MDAzY2Fzc2VydC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZWxmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NlbmRpYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW5rLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lvX3VyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb3JlZHVtcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0xMyw3ICsyMCw5IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvZXBvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuQEAgLTIxLDYgKzMwLDcgQEBcbiBcbiAjaW5jbHVkZSBcIi4uL2ZpbGVzeXN0ZW1zL3dyYXBwZXJzLmhcIlxuICNpbmNsdWRlIFwiLi4vcGlkZmQvcGlkZmQuaFwiXG4rI2luY2x1ZGUgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcIlxuIFxuIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIHRvIGF2b2lkIGluY2x1ZGluZyBoYXJuZXNzIGhlYWRlciAqL1xuIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7XG5AQCAtMzgxLDMgKzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcbiBcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuIFx0X2V4aXQoZXhpdF9jb2RlKTtcbiB9XG4rXG4rLypcbisgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxuKyAqXG4rICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGVcbisgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcbisgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLFxuKyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnNcbisgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXG4rICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbitzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcClcbit7XG4rXHRyZXR1cm4gc3lzY2FsbChfX05SX2lvX3VyaW5nX3NldHVwLCBlbnRyaWVzLCBwKTtcbit9XG4rXG4rLyogaW9fdXJpbmcgcmVhZHMgcG9sbDMyX2V2ZW50cyBiYWNrIHRocm91Z2ggc3dhaHczMigpIG9uIGJpZyBlbmRpYW4uICovXG4rc3RhdGljIF9fdTMyIG5vdGlmeV9wb2xsX21hc2soX191MzIgZXZlbnRzKVxuK3tcbisjaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpIFx1MDAyNlx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXG4rXHRyZXR1cm4gX19zd2FodzMyKGV2ZW50cyk7XG4rI2Vsc2VcbitcdHJldHVybiBldmVudHM7XG4rI2VuZGlmXG4rfVxuK1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGlvX3VyaW5nX3NldHVwX3JhdygxLCBcdTAwMjZwKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qXG4rICogQXJtIGEgcG9sbCBvbiBAZmQuIGlvX3VyaW5nIGxlYXZlcyBjdHgtXHUwMDNlbm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMXG4rICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnNcbisgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZFxuKyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suXG4rICovXG4rc3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHR1bnNpZ25lZCBpbnQgKnNxX3RhaWwsICpzcV9hcnJheTtcbitcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7XG4rXHRzaXplX3Qgc3FyaW5nX3N6O1xuK1x0dm9pZCAqc3E7XG4rXHRpbnQgcmluZztcbitcbitcdHJpbmcgPSBpb191cmluZ19zZXR1cF9yYXcoOCwgXHUwMDI2cCk7XG4rXHRpZiAocmluZyBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0c3FyaW5nX3N6ID0gcC5zcV9vZmYuYXJyYXkgKyBwLnNxX2VudHJpZXMgKiBzaXplb2YodW5zaWduZWQgaW50KTtcbitcdHNxID0gbW1hcChOVUxMLCBzcXJpbmdfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUV9SSU5HKTtcbitcdGlmIChzcSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRzcWVzID0gbW1hcChOVUxMLCBwLnNxX2VudHJpZXMgKiBzaXplb2YoKnNxZXMpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgICAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUUVTKTtcbitcdGlmIChzcWVzID09IE1BUF9GQUlMRUQpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHNxX3RhaWwgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopc3EgKyBwLnNxX29mZi50YWlsKTtcbitcdHNxX2FycmF5ID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYuYXJyYXkpO1xuK1xuK1x0bWVtc2V0KFx1MDAyNnNxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7XG4rXHRzcWVzWzBdLm9wY29kZSA9IElPUklOR19PUF9QT0xMX0FERDtcbitcdHNxZXNbMF0uZmQgPSB0cmlnZ2VyX2ZkO1xuK1x0c3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pO1xuK1xuK1x0c3FfYXJyYXlbMF0gPSAwO1xuK1x0X19hdG9taWNfc3RvcmVfbihzcV90YWlsLCAxLCBfX0FUT01JQ19SRUxFQVNFKTtcbitcbitcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHQvKiBEZWxpYmVyYXRlbHkgbGVha2VkLCB3ZSBhcmUgYWJvdXQgdG8gY3Jhc2guICovXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlXG4rICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvXG4rICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLlxuKyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuXG4rICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLlxuKyAqL1xuK3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpXG4re1xuK1x0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0aW50IGZkLCBpO1xuK1xuK1x0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSxcbitcdFx0ICBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKGZ0cnVuY2F0ZShmZCwgKG9mZl90KU5PVElGWV9TSUdOQUxfTUFQX0NPVU5UICogcGdzeikpIHtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5PVElGWV9TSUdOQUxfTUFQX0NPVU5UOyBpKyspIHtcbitcdFx0aW50IHByb3QgPSAoaSBcdTAwMjYgMSkgPyBQUk9UX1JFQUQgOiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7XG4rXG4rXHRcdGlmIChtbWFwKE5VTEwsIHBnc3osIHByb3QsIE1BUF9QUklWQVRFLCBmZCxcbitcdFx0XHQgKG9mZl90KWkgKiBwZ3N6KSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGJyZWFrO1xuK1x0fVxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIGk7XG4rfVxuK1xuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKVxuK3tcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdHVuc2lnbmVkIGNoYXIgKnA7XG4rXHRpbnQgdHJpZ2dlcl9mZDtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmO1xuK1xuK1x0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXIncyBvcGVuKCkgY2Fubm90IGJsb2NrLiAqL1xuK1x0dHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1xuK1x0LyogRXhpdCByYXRoZXIgdGhhbiBjcmFzaDogYSBkdW1wIHdpdGhvdXQgdGhlIHBvbGwgYXJtZWQgcHJvdmVzIG5vdGhpbmcuICovXG4rXHRpZiAodHJpZ2dlcl9mZCBcdTAwM2MgMClcbitcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcbitcdGlmIChtYWtlX2ZpbGVfbWFwcGluZ3MoKSBcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbitcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRmb3IgKG9mZiA9IDA7IG9mZiBcdTAwM2MgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTOyBvZmYgKz0gcGdzeilcbitcdFx0cFtvZmZdID0gMTtcbitcbitcdGlmIChhcm1fcG9sbF9ub3RpZnkodHJpZ2dlcl9mZCkpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4rXHQqKHZvbGF0aWxlIGludCAqKU5VTEwgPSAwO1xuK1x0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbit9XG4rXG4rc3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBvcGVuIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRpZiAod3JpdGUoZmQsIFwieFwiLCAxKSAhPSAxKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiB3cml0ZSBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBwaGRyWzBdIGlzIHRoZSBQVF9OT1RFIGVudHJ5OiBlbGZfY29yZV9kdW1wKCkgZW1pdHMgaXQgcmlnaHQgYWZ0ZXIgdGhlXG4rICogRUxGIGhlYWRlci4gSXRzIHBfb2Zmc2V0IGlzIHdoZXJlIHRoZSBub3RlcyBiZWdpbi5cbisgKi9cbitzdGF0aWMgbG9uZyBsb25nIG5vdGVfb2Zmc2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkcilcbit7XG4rXHRFbGZXKFBoZHIpIHBoO1xuK1x0RWxmVyhFaGRyKSBlaDtcbitcbitcdG1lbWNweShcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcbitcdGlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0bWVtY3B5KFx1MDAyNnBoLCBoZHIgKyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTtcbitcdGlmIChwaC5wX3R5cGUgIT0gUFRfTk9URSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIChsb25nIGxvbmcpcGgucF9vZmZzZXQ7XG4rfVxuK1xuKy8qXG4rICogRHJhaW4gYSBjb3JlZHVtcCBvZmYgQGZkLCBjb3VudGluZyB3aGF0IGFycml2ZXMuIE9uY2UgdGhlIG5vdGVzIGhhdmVcbisgKiBzdGFydGVkIHRoZSBrZXJuZWwgaXMgaW5zaWRlIHRoZSBvbmUgYmlnIG5vdGUgd3JpdGUsIHNvIHBva2UgdGhlIGZpZm9cbisgKiB0aGUgY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIGFuZCBzdG9wIHJlYWRpbmcsIHdoaWNoIGtlZXBzIHRoZVxuKyAqIHRyYW5zcG9ydCBmdWxsIGFuZCB0aGUgd3JpdGUgYmxvY2tlZCB3aXRoIGEgcGFydGlhbCBjb3VudCB3aGVuIHRoZVxuKyAqIHdha2V1cCBsYW5kcy4gVGhlbiBjYXJyeSBvbiB0byBlbmQgb2YgZmlsZS5cbisgKlxuKyAqIFdoYXQgYXJyaXZlcyBpcyB3cml0dGVuIHRvIEBmZF9vdXQgd2hlbiB0aGF0IGlzIG5vdCBuZWdhdGl2ZS5cbisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xLiBGYWlsaW5nIHRvIHRyaXAgdGhlIGZpZm9cbisgKiBpcyBhbiBlcnJvciB0b286IGEgZHVtcCB0aGF0IHdhcyBuZXZlciBpbnRlcnJ1cHRlZCBwcm92ZXMgbm90aGluZy5cbisgKi9cbitzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgaGRyW3NpemVvZihFbGZXKEVoZHIpKSArIHNpemVvZihFbGZXKFBoZHIpKV07XG4rXHRzdGF0aWMgY2hhciBidWZbNjQgXHUwMDNjXHUwMDNjIDEwXTtcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGxvbmcgbG9uZyBub3RlX29mZiA9IDA7XG4rXHRzaXplX3QgaGRybGVuID0gMDtcbitcdHNzaXplX3QgdG90YWwgPSAwO1xuK1x0Ym9vbCBhcm1lZCA9IGZhbHNlO1xuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTtcbitcbitcdFx0aWYgKG4gXHUwMDNjIDApIHtcbitcdFx0XHRpZiAoZXJybm8gPT0gRUlOVFIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRyZXR1cm4gLTE7XG4rXHRcdH1cbitcdFx0aWYgKG4gPT0gMClcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKGZkX291dCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2IHdyaXRlKGZkX291dCwgYnVmLCBuKSAhPSBuKVxuK1x0XHRcdHJldHVybiAtMTtcbitcbitcdFx0aWYgKGhkcmxlbiBcdTAwM2Mgc2l6ZW9mKGhkcikpIHtcbitcdFx0XHRzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuO1xuK1xuK1x0XHRcdGlmICh3YW50IFx1MDAzZSAoc2l6ZV90KW4pXG4rXHRcdFx0XHR3YW50ID0gKHNpemVfdCluO1xuK1x0XHRcdG1lbWNweShoZHIgKyBoZHJsZW4sIGJ1Ziwgd2FudCk7XG4rXHRcdFx0aGRybGVuICs9IHdhbnQ7XG4rXHRcdFx0aWYgKGhkcmxlbiA9PSBzaXplb2YoaGRyKSlcbitcdFx0XHRcdG5vdGVfb2ZmID0gbm90ZV9vZmZzZXQoaGRyKTtcbitcdFx0fVxuK1xuK1x0XHR0b3RhbCArPSBuO1xuK1xuK1x0XHRpZiAoYXJtIFx1MDAyNlx1MDAyNiAhYXJtZWQgXHUwMDI2XHUwMDI2IG5vdGVfb2ZmIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgdG90YWwgXHUwMDNlIG5vdGVfb2ZmICsgKGxvbmcgbG9uZylwZ3N6KSB7XG4rXHRcdFx0aWYgKHB1bGxfdHJpZ2dlcigpKVxuK1x0XHRcdFx0cmV0dXJuIC0xO1xuK1x0XHRcdGFybWVkID0gdHJ1ZTtcbitcdFx0XHR1c2xlZXAoTk9USUZZX1NJR05BTF9TVEFMTF9VUyk7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChhcm0gXHUwMDI2XHUwMDI2ICFhcm1lZClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0dXJuIHRvdGFsO1xuK31cbitcbisvKlxuKyAqIEhvdyBsYXJnZSB0aGUgZHVtcCB3YXMgbWVhbnQgdG8gYmUuIFRoZSBFTEYgaGVhZGVyIGFuZCB0aGUgcHJvZ3JhbVxuKyAqIGhlYWRlcnMgYXJlIHRoZSBmaXJzdCB0aGluZyBlbWl0dGVkLCBzbyBldmVuIGEgdHJ1bmNhdGVkIGR1bXAgc2F5cyBob3dcbisgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCArIHBfZmlsZXN6KS5cbisgKlxuKyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyXG4rICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLVx1MDAzZXRvX3NraXAsIGVsZl9jb3JlX2R1bXAoKVxuKyAqIGhhcyBubyBmbHVzaCBhZnRlciB0aGUgbGFzdCBkdW1wX3VzZXJfcmFuZ2UoKSBhbmQgYSBwaXBlIGNhbm5vdCBzZWVrLFxuKyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcbisgKiBhbmQgdnN5c2NhbGw9eG9ubHkgbGVhdmVzIG5vIHBhZ2UgYmVoaW5kIGl0LCBzbyBhIHdob2xlIGR1bXAgaXMgb25lXG4rICogcGFnZSBzaG9ydCBvZiB3aGF0IHRoZSBoZWFkZXJzIHByb21pc2UuIEB0YWlsIHJldHVybnMgdGhlIHNpemUgb2YgdGhhdFxuKyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXG4rICovXG4rbG9uZyBsb25nIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoY29uc3QgY2hhciAqcGF0aCwgbG9uZyBsb25nICp0YWlsKVxuK3tcbitcdEVsZlcoUGhkcikgKnBoZHIgPSBOVUxMO1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkID0gMDtcbitcdHVuc2lnbmVkIGludCBucGhkciwgaTtcbitcdEVsZlcoRWhkcikgZWg7XG4rXHRpbnQgZmQ7XG4rXG4rXHQqdGFpbCA9IDA7XG4rXG4rXHRmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocmVhZChmZCwgXHUwMDI2ZWgsIHNpemVvZihlaCkpICE9IHNpemVvZihlaCkpXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmICghZWguZV9waG51bSB8fCBlaC5lX3BoZW50c2l6ZSAhPSBzaXplb2YoKnBoZHIpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdG5waGRyID0gZWguZV9waG51bTtcbitcdHBoZHIgPSBjYWxsb2MobnBoZHIsIHNpemVvZigqcGhkcikpO1xuK1x0aWYgKCFwaGRyKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPVxuK1x0ICAgIChzc2l6ZV90KSgoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSkpXG4rXHRcdGdvdG8gZXJyO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnBoZHI7IGkrKykge1xuK1x0XHRsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICtcbitcdFx0XHRcdChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0aWYgKGVuZCBcdTAwM2UgZXhwZWN0ZWQpIHtcbitcdFx0XHRleHBlY3RlZCA9IGVuZDtcbitcdFx0XHQqdGFpbCA9IChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0fVxuK1x0fVxuK1xuK1x0ZnJlZShwaGRyKTtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBleHBlY3RlZDtcbitlcnI6XG4rXHRmcmVlKHBoZHIpO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIC0xO1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjIyLjU3NTA1NTE0NloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgyNTYzMDAxMTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUHJvcG9zZWQgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoLiBJdCdzIHRvdWNoaW5nIGBmcy9jb3JlZHVtcC5jYCBhbmQgYGZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNgLCB3aGljaCBpcyBpbW1lZGlhdGVseSBpbnRlcmVzdGluZy4gVGhleSdyZSBpbnRyb2R1Y2luZyB0aGVzZSBgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKClgIGFuZCBgbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKClgIGZ1bmN0aW9ucywgYW5kIHRoYXQncyB1c3VhbGx5IHRvIHByZXZlbnQgc29tZSBzaWduYWwgZnJvbSBpbnRlcnJ1cHRpbmcgY3JpdGljYWwgc2VjdGlvbnMuIEFuZCwganVkZ2luZyBieSB0aGUgbmFtZSBhbmQgbG9jYXRpb24sIGl0J3MgYFRJRl9OT1RJRllfU0lHTkFMYCB0aGF0IHRoZXkgYXJlIHRyeWluZyB0byBwcm90ZWN0IGFnYWluc3QuIEkgc2VlIGEgbmV3IGBQRl9OT19OT1RJRllfU0lHTkFMYCBmbGFnIGJlaW5nIGFkZGVkIHRvIGBzY2hlZC5oYCBhbmQgYSBtb2RpZmljYXRpb24gdG8gYHNpZ25hbF9wZW5kaW5nKClgLCBzbyB3ZSdyZSBkZWZpbml0ZWx5IHRhbGtpbmcgYWJvdXQgYSBjaGFuZ2UgdG8gaG93IHNpZ25hbHMgYXJlIGhhbmRsZWQuIEEgc2VsZnRlc3QsIGBjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3RgLCBpcyBhbHNvIGluY2x1ZGVkLlxuXG5UaGUgcXVlc3Rpb24gaXMsIGlzIHRoaXMgYSBzaWduaWZpY2FudCBjaGFuZ2UgYW5kIGlzIGl0IHJlYWNoYWJsZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGFjdC4gSSBzZWUgdGhhdCB0aGUgY2hhbmdlcyBhcmUgd2l0aGluIGB2ZnNfY29yZWR1bXAoKWAgYW5kIGBzbWJfc2VuZF9rdmVjKClgLCBzbyB0aG9zZSBhcmUgdGhlIGZ1bmN0aW9ucyB0byBleGFtaW5lIGNsb3NlbHkuXG5cbmB2ZnNfY29yZWR1bXAoKWAgaXMgZGVmaW5pdGVseSBjb3JlIGtlcm5lbCBhbmQgaGlnaGx5IHJlYWNoYWJsZS4gTm8gaXNzdWUgdGhlcmUuIEFuZCBgc21iX3NlbmRfa3ZlYygpYCBpcyBpbiB0aGUgU01CIGNsaWVudCBkcml2ZXIuIFRoYXQncyB1c2VkIHF1aXRlIGEgYml0LCBzbyB0aGF0J3MgYWxzbyByZWFjaGFibGUuIFNvLCBmdW5jdGlvbmFsbHksIHdlJ3JlIG1vZGlmeWluZyBzaWduYWwgaGFuZGxpbmcgYWxvbmcgdGhlc2UgY3J1Y2lhbCBwYXRocy4gWWVzLCB0aGF0J3MgYSBmdW5jdGlvbmFsIGNoYW5nZSwgYW5kIHdlIG5lZWQgdG8gaW52ZXN0aWdhdGUuXG5cbkZvY3VzaW5nIG91ciBmdXp6aW5nIGVmZm9ydHMsIGl0IGxvb2tzIGxpa2UgYHZmc19jb3JlZHVtcCgpYCBhbmQgYHNtYl9zZW5kX2t2ZWMoKWAgYXJlIHRoZSBwcmltYXJ5IHRhcmdldHMgZm9yIG5vdy4gSSBzaG91bGQgY2hlY2sgdGhlIHJlbGV2YW50IGNvbmZpZ3MgYW5kIHRlc3QgY2FzZXMuXG5cbkZvciBgdmZzX2NvcmVkdW1wKClgLCBJIGFzc3VtZSB0aGUgc3lzdGVtIG5lZWRzIHRvIGhhdmUgYENPUkVEVU1QYCBlbmFibGVkIHRvIHRyaWdnZXIgaXQuXG5cbkZvciBgc21iX3NlbmRfa3ZlYygpYCwgaXQncyBnb2luZyB0byBiZSBgQ0lGU2Agb3IgYFNNQl9GU2AsIGFuZCBJIHNob3VsZCBjaGVjayBgZnMvc21iL2NsaWVudC9LY29uZmlnYCBvciBgZnMvY2lmcy9LY29uZmlnYCB0byBjb25maXJtIHRoZSBleGFjdCBjb25maWcgZmxhZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDYxLCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAzLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MzAuODMxMzU5NTQ4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxODA4MTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDSUZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9zbWIvY2xpZW50L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9zbWIvY2xpZW50L0tjb25maWc6Mjpjb25maWcgQ0lGU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJTTUIzIGFuZCBDSUZTIHN1cHBvcnQgKGFkdmFuY2VkIG5ldHdvcmsgZmlsZXN5c3RlbSlcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctNTMtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy01NS1cXHRib29sIFxcXCJFeHRlbmRlZCBzdGF0aXN0aWNzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo2ODpjb25maWcgQ0lGU19BTExPV19JTlNFQ1VSRV9MRUdBQ1lcXG5mcy9zbWIvY2xpZW50L0tjb25maWctNjktXFx0Ym9vbCBcXFwiU3VwcG9ydCBsZWdhY3kgc2VydmVycyB3aGljaCB1c2UgbGVzcyBzZWN1cmUgZGlhbGVjdHNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctODItXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjgzOmNvbmZpZyBDSUZTX1VQQ0FMTFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cXHRib29sIFxcXCJLZXJiZXJvcy9TUE5FR08gYWR2YW5jZWQgc2Vzc2lvbiBzZXR1cFxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTMtXFx0Ym9vbCBcXFwiQ0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTA3OmNvbmZpZyBDSUZTX1BPU0lYXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwOC1cXHRib29sIFxcXCJDSUZTIFBPU0lYIEV4dGVuc2lvbnNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTE4LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMTk6Y29uZmlnIENJRlNfREVCVUdcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVxcdGJvb2wgXFxcIkVuYWJsZSBDSUZTIGRlYnVnZ2luZyByb3V0aW5lc1xcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjctXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI5LVxcdGJvb2wgXFxcIkVuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTM5OmNvbmZpZyBDSUZTX0RFQlVHX0RVTVBfS0VZU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDAtXFx0Ym9vbCBcXFwiRHVtcCBlbmNyeXB0aW9uIGtleXMgZm9yIG9mZmxpbmUgZGVjcnlwdGlvbiAoVW5zYWZlKVxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDgtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE0OTpjb25maWcgQ0lGU19ERlNfVVBDQUxMXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cXHRib29sIFxcXCJERlMgZmVhdHVyZSBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE2MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTYzLVxcdGJvb2wgXFxcIlNXTiBmZWF0dXJlIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNzM6Y29uZmlnIENJRlNfTkZTRF9FWFBPUlRcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTc0LVxcdGJvb2wgXFxcIkFsbG93IG5mc2QgdG8gZXhwb3J0IENJRlMgZmlsZSBzeXN0ZW1cXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc9MTc5PWlmIENJRlNcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTgwLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xODItXFx0Ym9vbCBcXFwiU01CIERpcmVjdCBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTkxOmNvbmZpZyBDSUZTX0ZTQ0FDSEVcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTkyLVxcdGJvb2wgXFxcIlByb3ZpZGUgQ0lGUyBjbGllbnQgY2FjaGluZyBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5OC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTk5OmNvbmZpZyBDSUZTX1JPT1RcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVxcdGJvb2wgXFxcIlNNQiByb290IGZpbGUgc3lzdGVtIChFeHBlcmltZW50YWwpXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwOC1cXHRib29sIFxcXCJTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6MzAuOTIzMTczOTc2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDM1NzIzMjEyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEZWNvZGluZyBLZXJuZWwgQ29uZmlnIE9wdGlvbnMqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIGtlcm5lbCBjb25maWcgYW5kIHRyeWluZyB0byBtYXAgZmVhdHVyZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEl0J3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBXaGVuIEkgc2VlIHNvbWV0aGluZyByZWxhdGVkIHRvIHRoZSBgZnMvc21iL2NsaWVudC9gIGRpcmVjdG9yeSwgdGhhdCdzIGFsbW9zdCBjZXJ0YWlubHkgZ29pbmcgdG8gYmUgY29udHJvbGxlZCBieSB0aGUgYENJRlNgIG9wdGlvbi4gVGhhdCdzIHRoZSBnby10byBjb25maWcgZmxhZyBmb3IgdGhlIENvbW1vbiBJbnRlcm5ldCBGaWxlIFN5c3RlbSAoQ0lGUykgY2xpZW50IHN1cHBvcnQsIHJpZ2h0PyBDYW4ndCByZWFsbHkgaW1hZ2luZSBhbnkgb3RoZXIgb3B0aW9uIHRoYXQgd291bGQgbWFrZSBtb3JlIHNlbnNlLlxuXG5BbmQgdGhlbiwgZGl2aW5nIGludG8gYGZzL2NvcmVkdW1wLmNgIOKAkyBhaCwgdGhhdCdzIGNsYXNzaWMuIFdoZW5ldmVyIHlvdSdyZSBkZWFsaW5nIHdpdGggY29yZSBkdW1wcyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiwgYENPUkVEVU1QYCBpcyBhbHdheXMgdGhlIHByaW1hcnkgY29uY2Vybi4gSXTigJlzIHRoZSBvYnZpb3VzIGNob2ljZSBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNvcmUgZHVtcCBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdGhpbmcgc3VycHJpc2luZyB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM5ODksIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMTozNS4yODA0MDg5OFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDY1NDE1OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQ09SRURVTVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL0tjb25maWcuYmluZm10PTE0NT1jb25maWcgQklORk1UX01JU0NcXG4tLVxcbmZzL0tjb25maWcuYmluZm10LTE3MC1cXG5mcy9LY29uZmlnLmJpbmZtdDoxNzE6Y29uZmlnIENPUkVEVU1QXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTcyLVxcdGJvb2wgXFxcIkVuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFxcXCIgaWYgRVhQRVJUXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjM1LjM2MTA3MDU5OFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMTExNDA4NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgc3VtbWFyaXplZCBmcm9tIG15IHBlcnNwZWN0aXZlIGFzIHNvbWVvbmUgZmFtaWxpYXIgd2l0aCB0aGVzZSBjb25jZXB0czpcblxuKipEZWVwIERpdmUgSW5jb21pbmc6IENPUkVEVU1QLCBDSUZTLCBhbmQgS2VybmVsIEludGVybmFscyoqXG5cblJpZ2h0LCBzbyB3ZSdyZSB0YWxraW5nIGFib3V0IGEgcG90ZW50aWFsbHkgaGFpcnkgc2l0dWF0aW9uLiBJIHNlZSBgQ09SRURVTVBgIGFuZCBgQ0lGU2AgbWVudGlvbmVkLCBhbmQgbXkgbWluZCBpbW1lZGlhdGVseSBqdW1wcyB0byBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlbS4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIHNjZW5hcmlvIHdoZXJlIGEgY29yZSBkdW1wIG1pZ2h0IGJlIGdlbmVyYXRlZCBvbiBhIHN5c3RlbSB0aGF0J3MgYWxzbyB1c2luZyBhIENJRlMgbW91bnQsIHdoaWNoIHJhaXNlcyBhbGwgc29ydHMgb2YgaW50ZXJlc3RpbmcgcXVlc3Rpb25zIGFib3V0IGZpbGUgcGVybWlzc2lvbnMsIG5ldHdvcmsgYmVoYXZpb3IsIGFuZCBwb3RlbnRpYWwgZm9yIGRhdGEgY29ycnVwdGlvbiBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIE15IGd1dCByZWFjdGlvbiBpcyB0byBkaWcgaW50byB0aGUga2VybmVsLiBUbyBnZXQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzLCBJIG5lZWQgdG8gc2VlIGV4YWN0bHkgaG93IHRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtIGludGVyYWN0cyB3aXRoIHRoaXMga2luZCBvZiBiZWhhdmlvci4gTGV0J3Mgc2VlIGhvdyBgdmZzX2NvcmVkdW1wYCBpcyBpbXBsZW1lbnRlZCwgYW5kIHRoZW4gSSdsbCBsb29rIGludG8gYHNtYl9zZW5kX2t2ZWNgIHRvIHNlZSBleGFjdGx5IGhvdyB0aGUgc3lzdGVtIGlzIHRyeWluZyB0byB3cml0ZSBkYXRhIG92ZXIgdGhlIG5ldHdvcmsgaWYgYSBjcmFzaCBpcyBvY2N1cnJpbmcuIFRoaXMgaXMgZ29pbmcgdG8gaW52b2x2ZSB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIHBhdGggZm9yIHRoZSBjb3JlIGR1bXAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MzQ1LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6NDAuMzcyMjE0NjE0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NzYwMTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl52b2lkIHZmc19jb3JlZHVtcFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9jb3JlZHVtcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2NvcmVkdW1wLmM9MTA5Mj1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTE2MC1cXG5mcy9jb3JlZHVtcC5jOjExNjE6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcXG5mcy9jb3JlZHVtcC5jLTExNjIte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMTo0MC40MTg5NzkxNTJaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NTczMTQxNDYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipDb25jZXJuaW5nIFN0YXRpYyBEZWNsYXJhdGlvbnMgaW4gdGhlIEtlcm5lbCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AsIGFuZCBJJ20gcmVhbGl6aW5nIHNvbWV0aGluZyBmdW5kYW1lbnRhbC4gTmVpdGhlciBvZiB0aGVzZSwgYXMgdGhleSBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLCBhcmUgZGVjbGFyZWQgYXMgYHN0YXRpY2AuIFRoYXQgaGFzIGltcGxpY2F0aW9ucy4gSXQgbWVhbnMgdGhleSdyZSBwb3RlbnRpYWxseSB2aXNpYmxlIGFuZCBhY2Nlc3NpYmxlIGJleW9uZCB0aGVpciBkZWZpbmVkIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgaXNuJ3QgaW5oZXJlbnRseSBiYWQsIGJ1dCBpdCAqZG9lcyogaW1wYWN0IHRoZSBtb2R1bGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkgb2YgdGhlIGtlcm5lbC4gSXQgbWVhbnMgdGhhdCwgYXMgdGhpbmdzIHN0YW5kLCB0aGVzZSBmdW5jdGlvbnMgYXJlIGltcGxpY2l0bHkgcGFydCBvZiB0aGUgZXhwb3J0ZWQgQVBJLCB3aGV0aGVyIGludGVuZGVkIG9yIG5vdC4gQW5kIHRoYXQgaGFzIGtub2NrLW9uIGVmZmVjdHMgd2l0aCByZWdhcmRzIHRvIHN5bWJvbCB2aXNpYmlsaXR5IGFuZCB0aGUgbGlua2luZyBwcm9jZXNzLiBJdCdzIGEga2V5IGNvbnNpZGVyYXRpb24gd2hlbiByZXZpZXdpbmcgdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBkZXNpZ24gb2YgdGhlc2UgcGFydHMgb2YgdGhlIGZpbGUgc3lzdGVtIGFuZCBTYW1iYSBjb2RlLiBXZSBuZWVkIHRvIGJlIGRlbGliZXJhdGUgYWJvdXQgd2hhdCB3ZSBleHBvc2UgYW5kIHdoYXQgd2Uga2VlcCBpbnRlcm5hbC4gVGhpcyBvYnNlcnZhdGlvbiBzaG91bGQgZ3VpZGUgZnVydGhlciByZXZpZXcgYW5kIHJlZmFjdG9yaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDc1NiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjQ3Ljk5MjEyMzI1NVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDY1MjI4OTgsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5pbnQgc21iX3NlbmRfa3ZlY1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMTo0OC4wMzg2NTY1NjNaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjQ2ODM4NTE3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYHNtYl9zZW5kX2t2ZWNgKipcblxuT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIsIGxldCdzIGp1c3QgbWFrZSBhYnNvbHV0ZWx5IHN1cmUgd2UncmUgb24gdGhlIHNhbWUgcGFnZS4gSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IHRoZSBgc21iX3NlbmRfa3ZlY2AgZnVuY3Rpb24uIFRoYXQncyBkZWZpbml0ZWx5IGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gSSBoYXZlIGEgZmVlbGluZyBzb21ldGhpbmcgcmVsZXZhbnQgdG8gbXkgY3VycmVudCBkZWJ1Z2dpbmcgZWZmb3J0cyBpcyBsdXJraW5nIGluIHRoZXJlLiBHb3R0YSByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgZGF0YSBpcyBhY3R1YWxseSAqc2VudCogb3ZlciB0aGUgbmV0d29yayBpbiB0aGUgU01CIGNsaWVudCBjb250ZXh0LiBJdCdzIHRpbWUgdG8gY2hlY2sgdGhhdCBpbXBsZW1lbnRhdGlvbiBhbmQgc2VlIHdoYXTigJlzIGdvaW5nIG9uIGF0IHRoYXQgbGV2ZWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MDM2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzE6NTQuNTA3MDQzODc3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTEwOTc3OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzbWJfc2VuZF9rdmVjXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYz0xMTg9ZGVsZXRlX21pZChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xMzEtLypcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjEzMjogKiBzbWJfc2VuZF9rdmVjIC0gc2VuZCBhbiBhcnJheSBvZiBrdmVjcyB0byB0aGUgc2VydmVyXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xMzMtICogQHNlcnZlcjpcXHRTZXJ2ZXIgdG8gc2VuZCB0aGUgZGF0YSB0b1xcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYz0xNDA9aW50XFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzoxNDE6c21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0xNDItXFx0ICAgICAgc2l6ZV90ICpzZW50KVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYz0yMzU9aW50IF9fc21iX3NlbmRfcnFzdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGludCBudW1fcnFzdCxcXG4tLVxcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMjkyLVxcdFxcdGlvdl9pdGVyX2t2ZWMoXFx1MDAyNnNtYl9tc2cubXNnX2l0ZXIsIElURVJfU09VUkNFLCBcXHUwMDI2aGlvdiwgMSwgNCk7XFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzoyOTM6XFx0XFx0cmMgPSBzbWJfc2VuZF9rdmVjKHNlcnZlciwgXFx1MDAyNnNtYl9tc2csIFxcdTAwMjZzZW50KTtcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTI5NC1cXHRcXHRpZiAocmMgXFx1MDAzYyAwKVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0zMTQtXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYzozMTU6XFx0XFx0cmMgPSBzbWJfc2VuZF9rdmVjKHNlcnZlciwgXFx1MDAyNnNtYl9tc2csIFxcdTAwMjZzZW50KTtcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jLTMxNi1cXHRcXHRpZiAocmMgXFx1MDAzYyAwKVxcbi0tXFxuZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYy0zMjItXFx0XFx0XFx0c21iX21zZy5tc2dfaXRlciA9IHJxc3Rbal0ucnFfaXRlcjtcXG5mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jOjMyMzpcXHRcXHRcXHRyYyA9IHNtYl9zZW5kX2t2ZWMoc2VydmVyLCBcXHUwMDI2c21iX21zZywgXFx1MDAyNnNlbnQpO1xcbmZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmMtMzI0LVxcdFxcdFxcdGlmIChyYyBcXHUwMDNjIDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMxOjU0LjU1MjE2MDg3NloiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNDk2MjIyNTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIEZvY3VzIFN5bWJvbHMqKlxuXG5Pa2F5LCBzbyBgc21iX3NlbmRfa3ZlY2AgaXNuJ3Qgc3RhdGljLCB3aGljaCBpcyBnb29kIHRvIGtub3cuIExldCdzIHNlZSBpZiB0aGVyZSBhcmUgb3RoZXIgZnVuY3Rpb25zIGluIHRoaXMgZ2VuZXJhbCBhcmVhLiBBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGBub19ub3RpZnlfc2lnbmFsX3NhdmVgLCBgbm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlYCwgYW5kIGBzaWduYWxfcGVuZGluZ2AgYXJlIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zIHdpdGhpbiBgaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaGAsIGJ1dCB0aGV5IGFyZSBwcm9iYWJseSBub3Qgd2hhdCBJJ20gbG9va2luZyBmb3IuXG5cblNvLCBuYXJyb3dpbmcgdGhpbmdzIGRvd24sIGl0IHNlZW1zIGxpa2Ugd2UncmUgcmVhbGx5IGZvY3VzaW5nIG9uIGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AuIE5vdywgYHZmc19jb3JlZHVtcGAgaXMgY2FsbGVkIHdoZW4gYSBwcm9jZXNzIGNyYXNoZXMgLSB0aGF0J3MgYSAqY29tbW9uKiBwYXRoLCBidXQgbWF5YmUgbm90IHRoZSAqaG90dGVzdCogcGF0aC4gT24gdGhlIG90aGVyIGhhbmQsIGBzbWJfc2VuZF9rdmVjYCBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHNlbmRpbmcgU01CIHJlcXVlc3RzLCB3aGljaCBpcyBkZWZpbml0ZWx5IGEgaG90IHBhdGggKmZvciogU01CIHNwZWNpZmljYWxseS4gQnV0IFNNQiBpc24ndCBhICpnZW5lcmFsKiBob3QgcGF0aCwgdW5sZXNzIHdlJ3JlIGFjdGl2ZWx5IGZ1enppbmcgaXQuXG5cbldhaXQsIGJhY2sgdG8gYHZmc19jb3JlZHVtcGAuLi4gdGhhdCBpcyAqZGVmaW5pdGVseSogcmVhY2hhYmxlIHdoZW4gYSBwcm9jZXNzIGNyYXNoZXMsIHdoaWNoIGlzIGRlZmluaXRlbHkgc29tZXRoaW5nIHdlIGNhbiB3b3JrIHdpdGguIFNvLCBpcyBgdmZzX2NvcmVkdW1wYCBhIHNvbGlkIGNob2ljZT8gSXQncyB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3IgY29yZWR1bXAgZnVuY3Rpb25hbGl0eS4gQW5kIHdoYXQgYWJvdXQgYHNtYl9zZW5kX2t2ZWNgPyBXZWxsLCBpdCdzIHRoZSBiZWdpbm5pbmcgb2Ygc2VuZGluZyBTTUIgcmVxdWVzdHMuXG5cbkFscmlnaHQsIGxldCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCB0aGUgY2FsbGVycyBvZiBgdmZzX2NvcmVkdW1wYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU3OTksIk91dHB1dFRva2VucyI6MjUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MDkuNTE0Mzg5MDE1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDc0MTMyMTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZmc19jb3JlZHVtcFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q9NTU1PWRpZmZlcmVudCBzZXQgb2YgY3JlZGVudGlhbHMuICBUaGlzIGlzIGRvbmUgaW4gdGhlIGZvbGxvd2luZyBwbGFjZXM6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC01NTctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cXG5Eb2N1bWVudGF0aW9uL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdDo1NTg6ICogYGB2ZnNfY29yZWR1bXAoKWBgLlxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1OS0gKiBuZnM0cmVjb3Zlci5jLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0PTI1ND1jb25zdOaMh+mSiOS4iuaTjeS9nO+8jOWboOatpOS4jemcgOimgei/m+ihjOexu+Wei+i9rOaNou+8jOS9humcgOimgeS4tOaXtuaUvuW8g2NvbnN06ZmQ5a6a77yM5Lul5L6/6IO95aSf5L+u5pS5XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3QtNDc3LSAqIGBgc3lzX2ZhY2Nlc3NhdCgpYGAuXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0OjQ3ODogKiBgYHZmc19jb3JlZHVtcCgpYGAuXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTQ3OS0gKiBuZnM0cmVjb3Zlci5jLlxcbi0tXFxuZnMvY29yZWR1bXAuYz0xMDkyPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxcbi0tXFxuZnMvY29yZWR1bXAuYy0xMTYwLVxcbmZzL2NvcmVkdW1wLmM6MTE2MTp2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKVxcbmZzL2NvcmVkdW1wLmMtMTE2Mi17XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmg9NDg9aW50IGR1bXBfdXNlcl9yYW5nZShzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC00OS1cXHRcXHQgICAgdW5zaWduZWQgbG9uZyBsZW4pO1xcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaDo1MDpleHRlcm4gdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbyk7XFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTUxLVxcbi0tXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTY5LSNlbHNlXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjcwOnN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbykge31cXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtNzEtXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmM9MjgxMD1ib29sIGdldF9zaWduYWwoc3RydWN0IGtzaWduYWwgKmtzaWcpXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmMtMzAzMC1cXHRcXHRcXHQgKi9cXG5rZXJuZWwvc2lnbmFsLmM6MzAzMTpcXHRcXHRcXHR2ZnNfY29yZWR1bXAoXFx1MDAyNmtzaWctXFx1MDAzZWluZm8pO1xcbmtlcm5lbC9zaWduYWwuYy0zMDMyLVxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MTEuNTg4NTI4NTc2WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg0MzQxMjkwODcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBDb3JlIER1bXAgYW5kIFNNQiBTZW5kIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQgdGllcyBpbnRvIHR3byBkaXN0aW5jdCBhcmVhczogcHJvY2VzcyBjcmFzaGVzIGxlYWRpbmcgdG8gY29yZSBkdW1wcyBhbmQgU01CIGNsaWVudCB0cmFuc3BvcnQuIFNwZWNpZmljYWxseSwgSSBzZWUgdGhhdCBgdmZzX2NvcmVkdW1wYCBnZXRzIGNhbGxlZCBmcm9tIGBnZXRfc2lnbmFsYCB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzLCBhbmQgYHNtYl9zZW5kX2t2ZWNgIGlzIGNhbGxlZCBmcm9tIGBfX3NtYl9zZW5kX3Jxc3RgIHdpdGhpbiBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2AuIFRoYXQncyB0aGUgYmFzZWxpbmUuXG5cbkJ1dCB0aGVuIEkgc2VlIHRoZSBwYXRjaCBtb2RpZmllcyBgaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaGAgYW5kIGBpbmNsdWRlL2xpbnV4L3NjaGVkLmhgLCBhbmQgYWRkcyB0aGUgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcuIEhtbSwgdGhpcyBpcyB3aGVyZSB0aGUgcmVhbCBtZWF0IG9mIHRoZSBidWcgZml4IGxpZXMuIEl0J3MgZXNzZW50aWFsbHkgcHJldmVudGluZyBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIHRoZSBjb3JlIGR1bXAgcHJvY2VzcyBhbmQgdGhlIFNNQiBzZW5kIG9wZXJhdGlvbi5cblxuRnVuY3Rpb25hbGx5LCB0aGVzZSBjaGFuZ2VzIGFyZSBjbGVhcmx5IHNpZ25pZmljYW50IGFuZCwgZnJvbSB3aGF0IEkgY2FuIHNlZSwgcmVhY2hhYmxlLiBTbywgdGhlIGtleSBzeW1ib2xzIGhlcmUgZm9yIG1lIGFyZSBkZWZpbml0ZWx5IGB2ZnNfY29yZWR1bXBgIGFuZCBgc21iX3NlbmRfa3ZlY2AuIEknbSB0aGlua2luZyB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgd291bGQgYmUgYENPUkVEVU1QYCBhbmQgYENJRlNgLCBzaW5jZSB0aGV5IGRpcmVjdGx5IHJlbGF0ZSB0byB0aGVzZSBmdW5jdGlvbmFsaXRpZXMuXG5cbkxldCBtZSBqdXN0IHF1aWNrbHkgdmFsaWRhdGUgdGhhdCBgdmZzX2NvcmVkdW1wYCBpcyB0aGUgcmlnaHQgY2hvaWNlIGZvciB0aGUgY29yZWR1bXAgc2lkZTsgWWVwLCBpdCdzIHRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciBhY3R1YWxseSBnZW5lcmF0aW5nIHRoZSBjb3JlIGR1bXAsIHNvIGdvb2QuIEFuZCBgc21iX3NlbmRfa3ZlY2A/IERlZmluaXRlbHkgYSBnb29kIGZvY3VzIHN5bWJvbCwgaXQncyB0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQncyBiZWluZyBtb2RpZmllZCB3aXRoaW4gU01CLlxuXG5BbHJpZ2h0LCBhIHF1aWNrIHF1ZXN0aW9uIGFib3V0IGBzbWJfc2VuZF9rdmVjYCB0aG91Z2guIElzIGl0IGEgXCJob3QgcGF0aFwiPyBXZWxsLCBpdCAqaXMqIGNhbGxlZCBmb3IgZXZlcnkgU01CIHJlcXVlc3QuLi4gc28gdGhhdCdzIGEgZ29vZCBwbGFjZSB0byBmb2N1cy4gSG93ZXZlciwgU01CIGlzbid0IGEgZ2VuZXJhbCBob3QgcGF0aCBsaWtlIGEgYHRjcF9yZWN2bXNnYCBvciBhIGBzY2hlZHVsZWAuIEl0J3Mgc3BlY2lmaWMgdG8gdGhlIFNNQiBmaWxlc3lzdGVtLCBhbmQgdGhhdCdzIGltcG9ydGFudCBjb250ZXh0LiBUaGF0IG1lYW5zIGl04oCZcyBmaW5lIHRvIGluY2x1ZGUgaW4gdGhlIGxpc3Qgb2Ygc3ltYm9scy5cblxuTGV0J3MgZG8gYSBxdWljayBzY2FuIGZvciBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy4gYGRvX2NvcmVkdW1wYCBpcyBzdGF0aWMsIHNvIGB2ZnNfY29yZWR1bXBgIGlzIGRlZmluaXRlbHkgdGhlIGJldHRlciBvcHRpb24uIEFuZCBgX19zbWJfc2VuZF9ycXN0YCBpcyBhbHNvIGEgdmFsaWQgc3ltYm9sLCBidXQgSSBzZWUgdGhlIG9uZSB0aGF0J3MgYWN0dWFsbHkgYmVpbmcgbW9kaWZpZWQgaXMgYHNtYl9zZW5kX2t2ZWNgLCBzbyBJJ2xsIHN0aWNrIHdpdGggdGhhdC5cblxuRmluYWxseSwganVzdCBhIHF1aWNrIGNoZWNrOiBsZXQgbWUgY29uZmlybSB0aGF0IGBzbWJfc2VuZF9rdmVjYCBpcyBhY3R1YWxseSBleHBvcnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5OTAsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MjAuMDIyNjYxODczWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NTA1NzE0OSwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qc21iX3NlbmRfa3ZlY1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9zbWIvY2xpZW50L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MjAuMDc3NzI4NTAyWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ2MjQ4ODA1OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biwgZ2l2ZW4gbXkgZXhwZXJ0aXNlOlxuXG4qKkV4YW1pbmluZyB0aGUgQ29udGV4dCBvZiBhIE1vZHVsZSoqXG5cbkFscmlnaHQsIHNvIHRoaXMgaXNuJ3QgYSBkaXJlY3QgZXhwb3J0LCB3aGljaCBpcyBpbnRlcmVzdGluZy4gQnV0IGl0J3MgYWxzbyAqbm90KiBzdGF0aWMsIG1lYW5pbmcgaXQncyBkeW5hbWljIGluIHNvbWUgd2F5LCBhbmQgaXRzIHVzYWdlIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGBmcy9zbWIvY2xpZW50L2AgbW9kdWxlLiBUaGF0J3MgYSBrZXkgcGllY2Ugb2YgaW5mb3JtYXRpb24uIFNpbmNlIGl0J3MgbW9kdWxlLWludGVybmFsLCBJIHNob3VsZCBjb25zaWRlciB0aGUgaW1wbGljYXRpb25zIGZvciBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIHN0cmF0ZWdpZXMgaW4gdGhhdCBwYXJ0aWN1bGFyIFNNQiBjbGllbnQgc3Vic3lzdGVtLiBUaGlzIG1lYW5zIGl0cyBzdGF0ZSBvciBkYXRhIGxpZmVjeWNsZSBpcyBsaWtlbHkgaW50ZXJ0d2luZWQgd2l0aCB0aGF0IG1vZHVsZSdzIGluc3RhbnRpYXRpb24gYW5kIG9wZXJhdGlvbiwgYW5kIHVuZGVyc3RhbmRpbmcgdGhhdCBmbG93IGlzIGNyaXRpY2FsLlxuXG5Ob3csIGdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIG1vZHVsZSBhbmQgdGhlIGltcGxpY2l0IHJ1bnRpbWUgZW52aXJvbm1lbnQsIHRoZSAqbmV4dCogdGhpbmcgdG8gbG9vayBhdCBpcyB0aGUgYENPUkVEVU1QYCBjb25maWd1cmF0aW9uLiBJIG5lZWQgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciB0aGUgY3VycmVudCBgQ09SRURVTVBgIHNldHRpbmdzIHdvdWxkIGFkZXF1YXRlbHkgY2FwdHVyZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgbW9kdWxlLCBpZiB0aGVyZSdzIGEgcHJvYmxlbS4gQXJlIHdlIHNldCB1cCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGhpbiB0aGUgbW9kdWxlIGR1cmluZyBleGVjdXRpb24/IFRoYXQncyB0aGUgb2J2aW91cyBuZXh0IHN0ZXAgdG8gZ2V0IGEgYmV0dGVyIHZpZXcgb2YgdGhpcyBtb2R1bGUncyBiZWhhdmlvci5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc5NjEsIk91dHB1dFRva2VucyI6MjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjoyNC43MDI2MTI1MzhaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NDM5ODcwNjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIENPUkVEVU1QXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9LY29uZmlnLmJpbmZtdD0xNDU9Y29uZmlnIEJJTkZNVF9NSVNDXFxuLS1cXG5mcy9LY29uZmlnLmJpbmZtdC0xNzAtXFxuZnMvS2NvbmZpZy5iaW5mbXQ6MTcxOmNvbmZpZyBDT1JFRFVNUFxcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cXHRib29sIFxcXCJFbmFibGUgY29yZSBkdW1wIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjoyNi4zNDY2MDc5ODFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ3Nzg3MzUwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMsIHNwZWFraW5nIGFzIGFuIGV4cGVydDpcblxuKipDb25jZXJuaW5nIENvcmUgRHVtcHMgYW5kIENJRlMqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgaW1tZWRpYXRlIGNvbm5lY3Rpb24gSSdtIG1ha2luZyBoZXJlIGlzIGFib3V0IGEgc3BlY2lmaWMgc2V0IG9mIGRlYnVnZ2luZyBzY2VuYXJpb3MuIFRoaW5raW5nIFwiQ09SRURVTVBcIiBzdWdnZXN0cyBJJ20gbGlrZWx5IGtuZWUtZGVlcCBpbiB0cm91Ymxlc2hvb3Rpbmcgc29tZXRoaW5nIOKAkyBhIGNyYXNoLCBhIHByb2Nlc3MgdGhhdCdzIGdvbmUgc2lkZXdheXMsIG1heWJlIGEgbWVtb3J5IGxlYWssIG9yIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eS4gTXkgZmlyc3QgaW5zdGluY3Qgd291bGQgYmUgdG8gZ3JhYiB0aGUgY29yZSBkdW1wIGl0c2VsZiBhbmQgYW5hbHl6ZSBpdCB3aXRoIEdEQiBvciBhIHNpbWlsYXIgZGVidWdnZXIsIHRvIHVuZGVyc3RhbmQgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gYXQgdGhlIG1vbWVudCBvZiB0aGUgY3Jhc2guIEknZCBiZSBsb29raW5nIGF0IHN0YWNrIHRyYWNlcywgbWVtb3J5IG1hcHMsIHJlZ2lzdGVycywgZXZlcnl0aGluZy5cblxuVGhlIGZhY3QgdGhhdCBcIkNJRlNcIiBwb3BwZWQgdXAgcmlnaHQgYWxvbmdzaWRlIGl0IGlzIGNydWNpYWwuIFRoaXMgc2NyZWFtcyBuZXR3b3JrIGZpbGVzeXN0ZW0gaXNzdWVzLiBXZSBjb3VsZCBiZSBkZWFsaW5nIHdpdGggYSBwcm9ibGVtIHdoZXJlIGEgcHJvY2VzcyBhY2Nlc3NpbmcgZmlsZXMgb24gYSBDSUZTIHNoYXJlIGNyYXNoZWQsIHBvdGVudGlhbGx5IGR1ZSB0byBwZXJtaXNzaW9ucyBpc3N1ZXMsIG5ldHdvcmsgY29ubmVjdGl2aXR5IHByb2JsZW1zLCBvciBldmVuIGEgYnVnIGluIHRoZSBDSUZTIGNsaWVudCBvciBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaXRzZWxmLiBUaGF0IGNvcmUgZHVtcCBpcyBub3cgaW52YWx1YWJsZS4gSXQncyBub3QganVzdCBhYm91dCBhIGxvY2FsIGNyYXNoOyBpdCdzIGFib3V0IGRpc3RyaWJ1dGVkIHN0b3JhZ2UsIGFuZCB0aGUgY29tcGxleGl0aWVzIHRoYXQgZW50YWlscy4gSeKAmWQgYmUgY2hlY2tpbmcgbmV0d29yayBjb25maWd1cmF0aW9ucywgc2hhcmUgcGVybWlzc2lvbnMsIGxvb2tpbmcgYXQgU2FtYmEgbG9ncywgbWFraW5nIHN1cmUgZXZlcnl0aGluZyBpcyBhbGlnbmVkIGZvciBhIG5ldHdvcmsgZmlsZS1zaGFyaW5nIHN5c3RlbS4gVGhlIGNvcmUgZHVtcCBoYXMgdG8gYmUgaW50ZXJwcmV0ZWQgaW4gdGhlIGNvbnRleHQgb2YgQ0lGUywgbWFraW5nIHRoZSB0cm91Ymxlc2hvb3RpbmcgY29uc2lkZXJhYmx5IG1vcmUgY29tcGxleCBidXQgYWxzbyBtb3JlIGludGVyZXN0aW5nLiBJdCBuYXJyb3dzIGRvd24gdGhlIHNlYXJjaCBjb25zaWRlcmFibHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MzU5LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MzAuODI0NDg0MDQyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDg2ODEzODQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDSUZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9zbWIvY2xpZW50L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9zbWIvY2xpZW50L0tjb25maWc6Mjpjb25maWcgQ0lGU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJTTUIzIGFuZCBDSUZTIHN1cHBvcnQgKGFkdmFuY2VkIG5ldHdvcmsgZmlsZXN5c3RlbSlcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctNTMtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjU0OmNvbmZpZyBDSUZTX1NUQVRTMlxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy01NS1cXHRib29sIFxcXCJFeHRlbmRlZCBzdGF0aXN0aWNzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTY3LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzo2ODpjb25maWcgQ0lGU19BTExPV19JTlNFQ1VSRV9MRUdBQ1lcXG5mcy9zbWIvY2xpZW50L0tjb25maWctNjktXFx0Ym9vbCBcXFwiU3VwcG9ydCBsZWdhY3kgc2VydmVycyB3aGljaCB1c2UgbGVzcyBzZWN1cmUgZGlhbGVjdHNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctODItXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjgzOmNvbmZpZyBDSUZTX1VQQ0FMTFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy04NC1cXHRib29sIFxcXCJLZXJiZXJvcy9TUE5FR08gYWR2YW5jZWQgc2Vzc2lvbiBzZXR1cFxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy05MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6OTI6Y29uZmlnIENJRlNfWEFUVFJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctOTMtXFx0Ym9vbCBcXFwiQ0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTA3OmNvbmZpZyBDSUZTX1BPU0lYXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEwOC1cXHRib29sIFxcXCJDSUZTIFBPU0lYIEV4dGVuc2lvbnNcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTE4LVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxMTk6Y29uZmlnIENJRlNfREVCVUdcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTIwLVxcdGJvb2wgXFxcIkVuYWJsZSBDSUZTIGRlYnVnZ2luZyByb3V0aW5lc1xcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xMjctXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjEyODpjb25maWcgQ0lGU19ERUJVRzJcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTI5LVxcdGJvb2wgXFxcIkVuYWJsZSBhZGRpdGlvbmFsIENJRlMgZGVidWdnaW5nIHJvdXRpbmVzXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTEzOC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTM5OmNvbmZpZyBDSUZTX0RFQlVHX0RVTVBfS0VZU1xcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDAtXFx0Ym9vbCBcXFwiRHVtcCBlbmNyeXB0aW9uIGtleXMgZm9yIG9mZmxpbmUgZGVjcnlwdGlvbiAoVW5zYWZlKVxcXCJcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNDgtXFxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE0OTpjb25maWcgQ0lGU19ERlNfVVBDQUxMXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE1MC1cXHRib29sIFxcXCJERlMgZmVhdHVyZSBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE2MS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTYyOmNvbmZpZyBDSUZTX1NXTl9VUENBTExcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTYzLVxcdGJvb2wgXFxcIlNXTiBmZWF0dXJlIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTcyLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxNzM6Y29uZmlnIENJRlNfTkZTRF9FWFBPUlRcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTc0LVxcdGJvb2wgXFxcIkFsbG93IG5mc2QgdG8gZXhwb3J0IENJRlMgZmlsZSBzeXN0ZW1cXFwiXFxuLS1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc9MTc5PWlmIENJRlNcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTgwLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZzoxODE6Y29uZmlnIENJRlNfU01CX0RJUkVDVFxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xODItXFx0Ym9vbCBcXFwiU01CIERpcmVjdCBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5MC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTkxOmNvbmZpZyBDSUZTX0ZTQ0FDSEVcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTkyLVxcdGJvb2wgXFxcIlByb3ZpZGUgQ0lGUyBjbGllbnQgY2FjaGluZyBzdXBwb3J0XFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTE5OC1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTk5OmNvbmZpZyBDSUZTX1JPT1RcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMjAwLVxcdGJvb2wgXFxcIlNNQiByb290IGZpbGUgc3lzdGVtIChFeHBlcmltZW50YWwpXFxcIlxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwNi1cXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MjA3OmNvbmZpZyBDSUZTX0NPTVBSRVNTSU9OXFxuZnMvc21iL2NsaWVudC9LY29uZmlnLTIwOC1cXHRib29sIFxcXCJTTUIgbWVzc2FnZSBjb21wcmVzc2lvbiAoRXhwZXJpbWVudGFsKVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6MzIuMzExMzA0OTFaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTYyMjYwNTI2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgS2VybmVsIFBhdGNoKipcblxuT2theSwgc28gdGhlIHBhdGNoIGlzIGRlZmluaXRlbHkgcmVsYXRlZCB0byBgQ0lGU2AsIHRoYXQgbXVjaCBpcyBjbGVhci4gTGV0J3MgZGlnIGEgbGl0dGxlIGRlZXBlciBhbmQgc2VlIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbnMgbWlnaHQgYmUgaW52b2x2ZWQuIEhtbSwgaXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggdG91Y2hlcyBgZnMvY29yZWR1bXAuY2AgYW5kIHRoZSBTTUIgY2xpZW50IHRyYW5zcG9ydCBjb2RlIGluIGBmcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jYC4gVGhhdCBzdHJvbmdseSBzdWdnZXN0cyBgQ09SRURVTVBgIGFuZCBgQ0lGU2AgYXJlIGVzc2VudGlhbCBmb3IgdGhpcyB0byB3b3JrLiBJJ2xsIG1ha2UgYSBub3RlIG9mIHRoYXQuXG5cbk5vdywgbGV0J3MgbG9vayBhdCBwb3RlbnRpYWxseSBnb29kIGZ1enppbmcgdGFyZ2V0cy4gYHZmc19jb3JlZHVtcGAgc2VlbXMgcHJvbWlzaW5nIGFzIGEgc3RhcnRpbmcgcG9pbnQuIFllcCwgaXQncyBhIG5vbi1zdGF0aWMgQVBJIGVudHJ5cG9pbnQsIHdoaWNoIGlzIHVzdWFsbHkgYSBnb29kIHNpZ24uIEFuZCBoZXJlJ3MgYW5vdGhlciwgYHNtYl9zZW5kX2t2ZWNgIOKAkyBhbHNvIGEgbm9uLXN0YXRpYyBBUEkgZW50cnlwb2ludCBmdW5jdGlvbi4gVGhvc2UgYXJlIGRlZmluaXRlbHkgd29ydGggaW52ZXN0aWdhdGluZyBmdXJ0aGVyLlxuXG5JIGdsYW5jZWQgYXQgYG5vX25vdGlmeV9zaWduYWxfc2F2ZWAgYW5kIGBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmVgIHRvbywgYnV0IHRob3NlIGFyZSBzdGF0aWMgaW5saW5lLiBUaGF0IG1lYW5zIHRoZXkgZG9uJ3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLCBzbyB0aGV5J3JlIHByb2JhYmx5IG5vdCBhcyBpbnRlcmVzdGluZyBmb3IgZGlyZWN0IGZ1enppbmcgdGFyZ2V0cy5cblxuU28sIGhlcmUncyBteSB1bmRlcnN0YW5kaW5nIG9mIHdoYXQncyBoYXBwZW5pbmc6IFRoaXMgcGF0Y2ggaXMgYWxsIGFib3V0IHByZXZlbnRpbmcgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBzcGVjaWZpYyBwcm9jZXNzZXMuIEl0J3MgZXNzZW50aWFsbHkgaW50cm9kdWNpbmcgYSBtZWNoYW5pc20gdG8gbWFzayBzaWduYWxzIGR1cmluZyBjb3JlZHVtcCBnZW5lcmF0aW9uIGFuZCBuZXR3b3JrIHRyYW5zbWlzc2lvbiB2aWEgU01CLiBUaGUga2V5IGlzIHRoYXQgYFBGX05PX05PVElGWV9TSUdOQUxgIGZsYWcgaXMgYmVpbmcgaW50cm9kdWNlZCwgYW5kIGBzaWduYWxfcGVuZGluZygpYCBpcyBiZWluZyBtb2RpZmllZCB0byByZXNwZWN0IGl0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZSwgZXNwZWNpYWxseSBiZWNhdXNlIHdlJ3JlIGxvb2tpbmcgYXQgY29yZSBrZXJuZWwgbG9naWMgd2l0aCBgdmZzX2NvcmVkdW1wKClgIGFuZCB0aGUgU01CIGNsaWVudCBkcml2ZXIgd2l0aCBgc21iX3NlbmRfa3ZlYygpYC4gQm90aCBhcmUgY2xlYXJseSByZWFjaGFibGUgYW5kIHJlbGV2YW50IHRvIGZ1enppbmcuIEdpdmVuIHdoYXQgSSdtIHNlZWluZywgdGhpcyBpcyB3b3J0aCBvdXIgdGltZS4gSSdsbCBnbyBhaGVhZCBhbmQgbG9nIHRoaXMgYXMgYSByZXN1bHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NzMzLCJPdXRwdXRUb2tlbnMiOjE1NCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjo0MS45MzM5MTMyNzNaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3Nzk0MTE2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIixcbiAgICBcIkNJRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2ZnNfY29yZWR1bXBcIixcbiAgICBcInNtYl9zZW5kX2t2ZWNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbWVjaGFuaXNtIHRvIHByZXZlbnQgVElGX05PVElGWV9TSUdOQUwgZnJvbSBpbnRlcnJ1cHRpbmcgc3BlY2lmaWMgdGFza3MsIHNwZWNpZmljYWxseSBkdXJpbmcgY29yZWR1bXAgZ2VuZXJhdGlvbiBhbmQgU01CIG5ldHdvcmsgdHJhbnNtaXNzaW9uLiBJdCBhZGRzIFBGX05PX05PVElGWV9TSUdOQUwgdG8gdGFzayBmbGFncyBhbmQgbW9kaWZpZXMgc2lnbmFsX3BlbmRpbmcoKSB0byByZXNwZWN0IGl0LiBUaGUgY29yZSBjaGFuZ2VzIGFyZSBpbiB2ZnNfY29yZWR1bXAoKSBhbmQgc21iX3NlbmRfa3ZlYygpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIHRoZSBTTUIgY2xpZW50IGRyaXZlciwgd2hpY2ggYXJlIHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDT1JFRFVNUFwiLFxuICAgIFwiQ0lGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZmc19jb3JlZHVtcFwiLFxuICAgIFwic21iX3NlbmRfa3ZlY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBtZWNoYW5pc20gdG8gcHJldmVudCBUSUZfTk9USUZZX1NJR05BTCBmcm9tIGludGVycnVwdGluZyBzcGVjaWZpYyB0YXNrcywgc3BlY2lmaWNhbGx5IGR1cmluZyBjb3JlZHVtcCBnZW5lcmF0aW9uIGFuZCBTTUIgbmV0d29yayB0cmFuc21pc3Npb24uIEl0IGFkZHMgUEZfTk9fTk9USUZZX1NJR05BTCB0byB0YXNrIGZsYWdzIGFuZCBtb2RpZmllcyBzaWduYWxfcGVuZGluZygpIHRvIHJlc3BlY3QgaXQuIFRoZSBjb3JlIGNoYW5nZXMgYXJlIGluIHZmc19jb3JlZHVtcCgpIGFuZCBzbWJfc2VuZF9rdmVjKCkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgdGhlIFNNQiBjbGllbnQgZHJpdmVyLCB3aGljaCBhcmUgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxMTozMjo0Mi4wMTE4NjMwOTFaIiwiU2VxIjoyMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDQ3MDY1MTIzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTE6MzI6NDIuMDEyNDI5NTYxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjEyMDQ2NDk0MTczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBzaWduYWwgaGFuZGxpbmcgYmVoYXZpb3IgYnkgaW50cm9kdWNpbmcgYFBGX05PX05PVElGWV9TSUdOQUxgIHRvIHByZXZlbnQgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBjb3JlZHVtcHMgKGB2ZnNfY29yZWR1bXBgKSBhbmQgU01CIHNlbmQgb3BlcmF0aW9ucyAoYHNtYl9zZW5kX2t2ZWNgKS4gVGhlIGNoYW5nZXMgYXJlIHB1cmVseSByZWxhdGVkIHRvIHRhc2sgZmxhZ3MsIGNvbnRyb2wgZmxvdywgYW5kIHNpZ25hbCBtYXNraW5nIHRvIGF2b2lkIHByZW1hdHVyZSBhYm9ydHMgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBubyBuZXcgZmllbGRzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBidWZmZXIgbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGFyZSBhbHRlcmVkIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3IgbG9naWMgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjhlNDFhM2M5Y2UyMjBmZTEzNTcyZmQ0OTQ1YjZkYWVlNTViZTBjZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDExOjMxOjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcbmluZGV4IGU2OGE3NmZmOTJhMzguLmVkYjVhMWE2MWQ4NGYgMTAwNjQ0XG4tLS0gYS9mcy9jb3JlZHVtcC5jXG4rKysgYi9mcy9jb3JlZHVtcC5jXG5AQCAtMTE2NSw2ICsxMTY1LDcgQEAgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbiBcdHN0cnVjdCBjb3JlX25hbWUgY247XG4gXHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQgPSBtbS1cdTAwM2ViaW5mbXQ7XG4rXHR1bnNpZ25lZCBpbnQgbm90aWZ5X2ZsYWdzO1xuIFx0aW50IGFyZ2MgPSAwO1xuIFx0c3RydWN0IGNvcmVkdW1wX3BhcmFtcyBjcHJtID0ge1xuIFx0XHQuc2lnaW5mbyA9IHNpZ2luZm8sXG5AQCAtMTE5Niw5ICsxMTk3LDEyIEBAIHZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXG4gXHRpZiAoY29yZWR1bXBfd2FpdChzaWdpbmZvLVx1MDAzZXNpX3NpZ25vLCBcdTAwMjZjb3JlX3N0YXRlKSBcdTAwM2MgMClcbiBcdFx0cmV0dXJuO1xuIFxuK1x0LyogVGFzayB3b3JrIG11c3Qgbm90IGN1dCB0aGUgZHVtcCBzaG9ydCwgc2VlIHNpZ25hbF9wZW5kaW5nKCkuICovXG4rXHRub3RpZnlfZmxhZ3MgPSBub19ub3RpZnlfc2lnbmFsX3NhdmUoKTtcbiBcdHNjb3BlZF93aXRoX2NyZWRzKGNyZWQpXG4gXHRcdGRvX2NvcmVkdW1wKFx1MDAyNmNuLCBcdTAwMjZjcHJtLCBcdTAwMjZhcmd2LCBcdTAwMjZhcmdjLCBiaW5mbXQpO1xuIFx0Y29yZWR1bXBfY2xlYW51cChcdTAwMjZjbiwgXHUwMDI2Y3BybSk7XG4rXHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbiBcdHJldHVybjtcbiB9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvc21iL2NsaWVudC90cmFuc3BvcnQuYyBiL2ZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNcbmluZGV4IGZkZjRlNTBjMjdjZWIuLjA1ZGMyMDkxNmMyNzYgMTAwNjQ0XG4tLS0gYS9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG4rKysgYi9mcy9zbWIvY2xpZW50L3RyYW5zcG9ydC5jXG5AQCAtMjIsNyArMjIsNiBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbXBvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdGFza193b3JrLmhcdTAwM2VcbiAjaW5jbHVkZSBcImNpZnNnbG9iLmhcIlxuICNpbmNsdWRlIFwiY2lmc3Byb3RvLmhcIlxuICNpbmNsdWRlIFwiY2lmc19kZWJ1Zy5oXCJcbkBAIC0xNDIsNiArMTQxLDcgQEAgaW50XG4gc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHQgICAgICBzaXplX3QgKnNlbnQpXG4ge1xuK1x0dW5zaWduZWQgaW50IG5vdGlmeV9mbGFncztcbiBcdGludCByYyA9IDA7XG4gXHRpbnQgcmV0cmllcyA9IDA7XG4gXHRzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0ID0gc2VydmVyLVx1MDAzZXNzb2NrZXQ7XG5AQCAtMTcyLDE1ICsxNzIsMTIgQEAgc21iX3NlbmRfa3ZlYyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csXG4gXHRcdCAqIGFmdGVyIHRoZSByZXRyaWVzIHdlIHdpbGwga2lsbCB0aGUgc29ja2V0IGFuZFxuIFx0XHQgKiByZWNvbm5lY3Qgd2hpY2ggbWF5IGNsZWFyIHRoZSBuZXR3b3JrIHByb2JsZW0uXG4gXHRcdCAqXG4tXHRcdCAqIEV2ZW4gaWYgcmVndWxhciBzaWduYWxzIGFyZSBtYXNrZWQsIEVJTlRSIG1pZ2h0IGJlXG4tXHRcdCAqIHByb3BhZ2F0ZWQgZnJvbSBza19zdHJlYW1fd2FpdF9tZW1vcnkoKSB0byBoZXJlIHdoZW5cbi1cdFx0ICogVElGX05PVElGWV9TSUdOQUwgaXMgdXNlZCBmb3IgdGFzayB3b3JrLiBGb3IgZXhhbXBsZSxcbi1cdFx0ICogY2VydGFpbiBpb191cmluZyBjb21wbGV0aW9ucyB3aWxsIHVzZSB0aGF0LiBUcmVhdFxuLVx0XHQgKiBoYXZpbmcgRUlOVFIgd2l0aCBwZW5kaW5nIHRhc2sgd29yayB0aGUgc2FtZSBhcyBFQUdBSU5cbi1cdFx0ICogdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVjb25uZWN0cy5cbitcdFx0ICogVGFzayB3b3JrIG11c3Qgbm90IGFib3J0IHRoZSBzZW5kLCBzZWUgc2lnbmFsX3BlbmRpbmcoKS5cbiBcdFx0ICovXG4rXHRcdG5vdGlmeV9mbGFncyA9IG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpO1xuIFx0XHRyYyA9IHNvY2tfc2VuZG1zZyhzc29ja2V0LCBzbWJfbXNnKTtcbi1cdFx0aWYgKHJjID09IC1FQUdBSU4gfHwgdW5saWtlbHkocmMgPT0gLUVJTlRSIFx1MDAyNlx1MDAyNiB0YXNrX3dvcmtfcGVuZGluZyhjdXJyZW50KSkpIHtcbitcdFx0bm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7XG4rXHRcdGlmIChyYyA9PSAtRUFHQUlOKSB7XG4gXHRcdFx0cmV0cmllcysrO1xuIFx0XHRcdGlmIChyZXRyaWVzIFx1MDAzZT0gMTQgfHxcbiBcdFx0XHQgICAgKCFzZXJ2ZXItXHUwMDNlbm9ibG9ja3NuZCBcdTAwMjZcdTAwMjYgKHJldHJpZXMgXHUwMDNlIDIpKSkge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuaW5kZXggMzczYmNjMDU5OGQxMC4uZmQ3MmNhNGVlOTJmMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oXG5AQCAtMTc5Niw3ICsxNzk2LDcgQEAgZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7XG4gXHRcdFx0XHRcdFx0ICogSSBhbSBjbGVhbmluZyBkaXJ0eSBwYWdlcyBmcm9tIHNvbWUgb3RoZXIgYmRpLiAqL1xuICNkZWZpbmUgUEZfS1RIUkVBRFx0XHQweDAwMjAwMDAwXHQvKiBJIGFtIGEga2VybmVsIHRocmVhZCAqL1xuICNkZWZpbmUgUEZfUkFORE9NSVpFXHRcdDB4MDA0MDAwMDBcdC8qIFJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi9cbi0jZGVmaW5lIFBGX19IT0xFX18wMDgwMDAwMFx0MHgwMDgwMDAwMFxuKyNkZWZpbmUgUEZfTk9fTk9USUZZX1NJR05BTFx0MHgwMDgwMDAwMFx0Lyogc2VlIG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpICovXG4gI2RlZmluZSBQRl9fSE9MRV9fMDEwMDAwMDBcdDB4MDEwMDAwMDBcbiAjZGVmaW5lIFBGX19IT0xFX18wMjAwMDAwMFx0MHgwMjAwMDAwMFxuICNkZWZpbmUgUEZfTk9fU0VUQUZGSU5JVFlcdDB4MDQwMDAwMDBcdC8qIFVzZXJsYW5kIGlzIG5vdCBhbGxvd2VkIHRvIG1lZGRsZSB3aXRoIGNwdXNfbWFzayAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li4zMTgyZGU0ZmY5NDgyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTM4NCwxNCArMzg0LDMxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfc2lncGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXG4gXHRyZXR1cm4gdW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCxUSUZfU0lHUEVORElORykpO1xuIH1cbiBcbisvKiBQcmV2ZW50IFRJRl9OT1RJRllfU0lHTkFMIGZyb20gaW50ZXJydXB0aW5nIHRoaXMgdGFzay4gKi9cbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub19ub3RpZnlfc2lnbmFsX3NhdmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1xuK1x0Y3VycmVudC1cdTAwM2VmbGFncyB8PSBQRl9OT19OT1RJRllfU0lHTkFMO1xuK1x0cmV0dXJuIGZsYWdzO1xuK31cbitcbisvKiBSZXN0b3JlIFRJRl9OT1RJRllfU0lHTkFMLiAqL1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUodW5zaWduZWQgaW50IGZsYWdzKVxuK3tcbitcdGN1cnJlbnRfcmVzdG9yZV9mbGFncyhmbGFncywgUEZfTk9fTk9USUZZX1NJR05BTCk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgaW50IHNpZ25hbF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHQvKlxuIFx0ICogVElGX05PVElGWV9TSUdOQUwgaXNuJ3QgcmVhbGx5IGEgc2lnbmFsLCBidXQgaXQgcmVxdWlyZXMgdGhlIHNhbWVcbiBcdCAqIGJlaGF2aW9yIGluIHRlcm1zIG9mIGVuc3VyaW5nIHRoYXQgd2UgYnJlYWsgb3V0IG9mIHdhaXQgbG9vcHNcbi1cdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC5cbitcdCAqIHNvIHRoYXQgbm90aWZ5IHNpZ25hbCBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZC4gTm90IGZvciBhIHRhc2tcbitcdCAqIHRoYXQgYXNrZWQgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IGl0LCBzZWUgbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCkuXG4gXHQgKi9cbi1cdGlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTk9USUZZX1NJR05BTCkpKVxuK1x0aWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9OT1RJRllfU0lHTkFMKSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgbGlrZWx5KCEoUkVBRF9PTkNFKHAtXHUwMDNlZmxhZ3MpIFx1MDAyNiBQRl9OT19OT1RJRllfU0lHTkFMKSkpXG4gXHRcdHJldHVybiAxO1xuIFx0cmV0dXJuIHRhc2tfc2lncGVuZGluZyhwKTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uNzI4ZjNjMzQyZWI5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyArMywxMCBAQCBDRkxBR1MgKz0gLVdhbGwgLU8wIC1nICQoS0hEUl9JTkNMVURFUykgJChUT09MU19JTkNMVURFUylcbiBcbiBURVNUX0dFTl9QUk9HUyA6PSBzdGFja2R1bXBfdGVzdCBcXFxuIFx0XHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXG4tXHRcdCAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3RcbitcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuK1x0XHQgIGNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFxuKyMgU3Bhd25lZCBieSB0aGUga2VybmVsIGFzIHRoZSB8aGVscGVyLCBub3QgYSB0ZXN0IG9mIGl0cyBvd24uXG4rVEVTVF9HRU5fRklMRVMgOj0gY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXJcbiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcFxuIFxuIGluY2x1ZGUgLi4vbGliLm1rXG5AQCAtMTEsMyArMTQsNSBAQCBpbmNsdWRlIC4uL2xpYi5ta1xuICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuKyQoT1VUUFVUKS9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rJChPVVRQVVQpL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyOiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjlhMjg5MmRlODE5MmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWwuaFxuQEAgLTAsMCArMSwyOSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rXG4rI2lmbmRlZiBfX0NPUkVEVU1QX05PVElGWV9TSUdOQUxfSFxuKyNkZWZpbmUgX19DT1JFRFVNUF9OT1RJRllfU0lHTkFMX0hcbitcbisjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuK1xuKy8qXG4rICogRGVmaW5lIGEgYnVuY2ggb2YgY29uc3RhbnRzIHdlIG5lZWQuIFdlIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGVcbisgKiBmaWxlIG5vdGUgbm90ZSBibG93cyBwYXN0cyAyMDBLLiBUaGF0J3Mgd2F5IGJleW9uZCB0aGUgZGVmYXVsdCA2NEtcbisgKiBwaXBlIHJpbmcgYW5kIHBhc3QgdGhlIH4zNksgYW4gYWZfdW5peCBza2IgaG9sZHMuIFNvIHdlIGZvcmNlIGEgd3JpdGVcbisgKiB0byBjb21lIGJhY2sgc2hvcnQuXG4rICovXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX01BUF9DT1VOVFx0XHQ0MDAwXG4rI2RlZmluZSBOT1RJRllfU0lHTkFMX0FOT05fQllURVNcdCg0VUwgXHUwMDNjXHUwMDNjIDIwKVxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9TVEFMTF9VU1x0XHQyMDAwMDBcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfTUFQRklMRVx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC5tYXBmaWxlXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfVFJJR0dFUlx0XHRcIi90bXAvY29yZWR1bXAubm90aWZ5X3NpZ25hbC50cmlnZ2VyXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmVcIlxuKyNkZWZpbmUgTk9USUZZX1NJR05BTF9DT1JFX1RNUEZJTEVcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLmNvcmUudG1wXCJcbisjZGVmaW5lIE5PVElGWV9TSUdOQUxfU09DS0VUXHRcdFwiL3RtcC9jb3JlZHVtcC5ub3RpZnlfc2lnbmFsLnNvY2tldFwiXG4rXG4rdm9pZCBjcmFzaGluZ19jaGlsZF9ub3RpZnlfc2lnbmFsKHZvaWQpO1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpO1xuK3NzaXplX3QgcmVjdl9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsKGludCBmZCwgaW50IGZkX291dCwgYm9vbCBhcm0pO1xuK2xvbmcgbG9uZyBjb3JlZHVtcF9leHBlY3RlZF9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgbG9uZyAqdGFpbCk7XG4rXG4rI2VuZGlmIC8qIF9fQ09SRURVTVBfTk9USUZZX1NJR05BTF9IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF9oZWxwZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi44NDlmNWMxZWE3MzY1XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlci5jXG5AQCAtMCwwICsxLDQ2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIFRoZSB8aGVscGVyIGhhbGYgb2YgY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LiBUaGUga2VybmVsIHNwYXducyB0aGlzXG4rICogd2l0aCB0aGUgY29yZWR1bXAgb24gc3RkaW4sIHNvIGl0IGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSB0ZXN0IGJpbmFyeS5cbisgKiBJdCBzYXZlcyB0aGUgZHVtcCBhbmQsIG9uY2UgdGhlIG5vdGVzIGhhdmUgc3RhcnRlZCwgdHJpcHMgdGhlIGZpZm8gdGhlXG4rICogY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIHNvIFRJRl9OT1RJRllfU0lHTkFMIGlzIHJhaXNlZCB3aGlsZSB0aGUgbm90ZVxuKyAqIHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcbit7XG4rXHRpbnQgZmRfY29yZV9maWxlO1xuK1x0c3NpemVfdCByZXQ7XG4rXG4rXHRmZF9jb3JlX2ZpbGUgPSBvcGVuKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFLFxuK1x0XHRcdCAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKTtcbitcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG9wZW4gZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0cmV0dXJuIEVYSVRfRkFJTFVSRTtcbitcdH1cbitcbitcdHJldCA9IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChTVERJTl9GSUxFTk8sIGZkX2NvcmVfZmlsZSwgdHJ1ZSk7XG4rXHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byBlcnI7XG4rXG4rXHQvKiBUaGUgdGVzdCBwb2xscyBmb3IgdGhpcyBuYW1lLCBzbyBvbmx5IGNyZWF0ZSBpdCBvbmNlIGl0IGlzIHdob2xlLiAqL1xuK1x0aWYgKHJlbmFtZShOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSwgTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZW5hbWUgZmFpbGVkOiAlbVxcblwiLCBhcmd2WzBdKTtcbitcdFx0Z290byBlcnI7XG4rXHR9XG4rXG4rXHRyZXR1cm4gRVhJVF9TVUNDRVNTO1xuK1xuK2VycjpcbitcdHVubGluayhOT1RJRllfU0lHTkFMX0NPUkVfVE1QRklMRSk7XG4rXHRyZXR1cm4gRVhJVF9GQUlMVVJFO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9ub3RpZnlfc2lnbmFsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTYzYzA2YTgxNTYyZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfbm90aWZ5X3NpZ25hbF90ZXN0LmNcbkBAIC0wLDAgKzEsMjQ1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisvKlxuKyAqIEEgY29yZWR1bXAgaXMgbWVhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgU0lHS0lMTCBhbmQgYnkgdGhlIGZyZWV6ZXIgYW5kXG4rICogYnkgbm90aGluZyBlbHNlLiBkdW1wX2ludGVycnVwdGVkKCkgc2F5cyBzbywgYnV0IHRoZSBibG9ja2luZyB3YWl0c1xuKyAqIHVuZGVybmVhdGggaXQgdGVzdCBzaWduYWxfcGVuZGluZygpLCB3aGljaCBpcyBhbHNvIHRydWUgZm9yXG4rICogVElGX05PVElGWV9TSUdOQUwuIEEgY3Jhc2hpbmcgdGFzayB0aGF0IGhhcyBhbiBpb191cmluZyBjb21wbGV0aW9uIGxhbmRcbisgKiBvbiBpdCBtaWQtZHVtcCB0aGVyZWZvcmUga2VlcHMgZHVtcGluZyB3aGlsZSBldmVyeSB3YWl0IGl0IGVudGVycyBiYWlsc1xuKyAqIG91dCBhdCBvbmNlLCBhbmQgdGhlIGR1bXAgaXMgc2lsZW50bHkgY3V0IHNob3J0LiBOb3RoaW5nIHJlcG9ydHMgaXQ6XG4rICogYmluZm10X2VsZiBzZXRzIGhhc19kdW1wZWQgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gV0NPUkVEVU1QKClcbisgKiBzYXlzIHRoZSBkdW1wIHdvcmtlZC5cbisgKlxuKyAqIEEgY29yZWR1bXAgbm90ZSBpcyB0aGUgb25seSBkdW1wX2VtaXQoKSB0aGF0IGV4Y2VlZHMgd2hhdCB0aGUgdHJhbnNwb3J0XG4rICogdGFrZXMgaW4gb25lIGdvLCBzbyBpdCBpcyB0aGUgb25lIHdyaXRlIHRoYXQgaXMgY2VydGFpbiB0byBibG9jay4gQm90aFxuKyAqIHRlc3RzIGNyYXNoIGEgY2hpbGQgaG9sZGluZyBlbm91Z2ggZmlsZSBiYWNrZWQgbWFwcGluZ3MgZm9yIGl0cyBOVF9GSUxFXG4rICogbm90ZSB0byBydW4gcGFzdCB0aGF0LCBhcm0gYW4gaW9fdXJpbmcgcG9sbCBvbiBpdCwgYW5kIHRyaXAgdGhlIHBvbGxcbisgKiB3aGlsZSB0aGUgbm90ZSBpcyBiZWluZyB3cml0dGVuLiBXaGF0IGNvbWVzIG91dCBoYXMgdG8gYmUgdGhlIHdob2xlXG4rICogZHVtcC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNvcmVkdW1wX3Rlc3QuaFwiXG4rXG4rRklYVFVSRV9TRVRVUChjb3JlZHVtcClcbit7XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldDtcbitcbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwiclwiKTtcbitcdEFTU0VSVF9ORShOVUxMLCBmaWxlKTtcbitcbitcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLFxuK1x0XHQgICAgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7XG4rXHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4rXHRBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pKTtcbitcbitcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAnXFwwJztcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbitcdEFTU0VSVF9HRShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkLCAwKTtcbitcbitcdHJldCA9IGZjbG9zZShmaWxlKTtcbitcdEFTU0VSVF9FUSgwLCByZXQpO1xuK1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfVFJJR0dFUik7XG4rXHRBU1NFUlRfRVEobWtmaWZvKE5PVElGWV9TSUdOQUxfVFJJR0dFUiwgMDYwMCksIDApO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxuK3tcbitcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbitcdEZJTEUgKmZpbGU7XG4rXHRpbnQgcmV0LCBzdGF0dXM7XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyLCBTSUdURVJNKTtcbitcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHR9XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUpO1xuK1x0dW5saW5rKE5PVElGWV9TSUdOQUxfQ09SRV9UTVBGSUxFKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHR1bmxpbmsoTk9USUZZX1NJR05BTF9UUklHR0VSKTtcbitcdHVubGluayhOT1RJRllfU0lHTkFMX01BUEZJTEUpO1xuK1xuK1x0ZmlsZSA9IGZvcGVuKFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cIiwgXCJ3XCIpO1xuK1x0aWYgKCFmaWxlKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIG9wZW4gY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdHJldCA9IGZwcmludGYoZmlsZSwgXCIlc1wiLCBzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIGNsb3NlIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCBcdTAwM2U9IDApIHtcbitcdFx0cmV0ID0gY2xvc2Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmc1wiO1xuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0fVxuK1x0XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm47XG4rZmFpbDpcbitcdC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xuK1x0ZnByaW50ZihzdGRlcnIsIFwiRmFpbGVkIHRvIGNsZWFudXAgY29yZWR1bXAgdGVzdDogJXNcXG5cIiwgcmVhc29uKTtcbit9XG4rXG4rLypcbisgKiBDaGVjayB0aGF0IHdoYXQgdGhlIGhlbHBlciBvciB0aGUgc2VydmVyIHNhdmVkIGlzIHRoZSB3aG9sZSBkdW1wLiBPbmx5XG4rICogYSBob2xlIGF0IHRoZSB2ZXJ5IGVuZCBjYW4gYmUgbWlzc2luZywgc2VlIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoKS5cbisgKi9cbitzdGF0aWMgdm9pZCBjaGVja193aG9sZV9jb3JlZHVtcChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEpXG4re1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkLCB0YWlsO1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXG4rXHRleHBlY3RlZCA9IGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsIFx1MDAyNnRhaWwpO1xuK1x0QVNTRVJUX0dUKGV4cGVjdGVkLCAwKTtcbitcdEFTU0VSVF9FUShzdGF0KE5PVElGWV9TSUdOQUxfQ09SRV9GSUxFLCBcdTAwMjZzdCksIDApO1xuK1x0QVNTRVJUX0xFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQpO1xuK1x0QVNTRVJUX0dFKChsb25nIGxvbmcpc3Quc3Rfc2l6ZSwgZXhwZWN0ZWQgLSB0YWlsKTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHVtcCBnb2VzIHRvIGEgfGhlbHBlciwgc28gdGhlIHJlYWRlciBpcyBhIHNlcGFyYXRlIHByb2dyYW0gdGhlXG4rICoga2VybmVsIHNwYXducy4gSXQgc2F2ZXMgd2hhdCBpdCByZWNlaXZlZCB0byBOT1RJRllfU0lHTkFMX0NPUkVfRklMRS5cbisgKi9cbitURVNUX0YoY29yZWR1bXAsIG5vdGlmeV9zaWduYWxfcGlwZSlcbit7XG4rXHRjaGFyIHBhdHRlcm5bUEFUSF9NQVhdLCBoZWxwZXJbUEFUSF9NQVhdLCAqcDtcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1x0aW50IHN0YXR1cywgaTtcbitcdHBpZF90IHBpZDtcbitcdHNzaXplX3QgbjtcbitcbitcdGlmICghY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKCkpXG4rXHRcdFNLSVAocmV0dXJuLCBcImlvX3VyaW5nIG5vdCBhdmFpbGFibGVcIik7XG4rXG4rXHRuID0gcmVhZGxpbmsoXCIvcHJvYy9zZWxmL2V4ZVwiLCBoZWxwZXIsIHNpemVvZihoZWxwZXIpIC0gMSk7XG4rXHRBU1NFUlRfR1QobiwgMCk7XG4rXHRoZWxwZXJbbl0gPSAnXFwwJztcbitcdHAgPSBzdHJzdHIoaGVscGVyLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfdGVzdFwiKTtcbitcdEFTU0VSVF9ORShwLCBOVUxMKTtcbitcdEFTU0VSVF9MRSgoc2l6ZV90KShwIC0gaGVscGVyKSArIHNpemVvZihcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpLFxuK1x0XHQgIHNpemVvZihoZWxwZXIpKTtcbitcdHN0cmNweShwLCBcImNvcmVkdW1wX25vdGlmeV9zaWduYWxfaGVscGVyXCIpO1xuK1x0aWYgKGFjY2VzcyhoZWxwZXIsIFhfT0spKVxuK1x0XHRTS0lQKHJldHVybiwgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsX2hlbHBlciBub3QgYnVpbHRcIik7XG4rXG4rXHRBU1NFUlRfTFQoc25wcmludGYocGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pLCBcInwlc1wiLCBoZWxwZXIpLFxuK1x0XHQgIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkID0gZm9yaygpO1xuK1x0QVNTRVJUX0dFKHBpZCwgMCk7XG4rXHRpZiAocGlkID09IDApXG4rXHRcdGNyYXNoaW5nX2NoaWxkX25vdGlmeV9zaWduYWwoKTtcbitcbitcdEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKSwgcGlkKTtcbitcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuK1xuK1x0LyogVGhlIGtlcm5lbCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgaGVscGVyLCBzbyBwb2xsIGZvciBpdC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMDsgaSsrKSB7XG4rXHRcdGlmICghc3RhdChOT1RJRllfU0lHTkFMX0NPUkVfRklMRSwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNiBzdC5zdF9zaXplKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoMTAwMDAwKTtcbitcdH1cbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuKy8qIFRoZSBzYW1lIHRoaW5nIHdpdGggdGhlIGR1bXAgZ29pbmcgdG8gYSBjb3JlZHVtcCBzb2NrZXQuICovXG4rVEVTVF9GKGNvcmVkdW1wLCBub3RpZnlfc2lnbmFsX3NvY2tldClcbit7XG4rXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXHRpbnQgaXBjX3NvY2tldHNbMl0sIHN0YXR1cztcbitcdGNoYXIgcGF0dGVybltQQVRIX01BWF07XG4rXHRjaGFyIGM7XG4rXG4rXHRpZiAoIWNvcmVkdW1wX2lvX3VyaW5nX2F2YWlsYWJsZSgpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJpb191cmluZyBub3QgYXZhaWxhYmxlXCIpO1xuK1xuK1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsXG4rXHRcdFx0ICAgICBpcGNfc29ja2V0cyksIDApO1xuK1x0QVNTRVJUX0xUKHNucHJpbnRmKHBhdHRlcm4sIHNpemVvZihwYXR0ZXJuKSwgXCJAJXNcIixcbitcdFx0XHQgICBOT1RJRllfU0lHTkFMX1NPQ0tFVCksIChpbnQpc2l6ZW9mKHBhdHRlcm4pKTtcbitcdEFTU0VSVF9UUlVFKHNldF9jb3JlX3BhdHRlcm4ocGF0dGVybikpO1xuK1xuK1x0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTtcbitcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcbitcdFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9jb3JlX2ZpbGUgPSAtMTtcbitcdFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbitcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMF0pO1xuK1xuK1x0XHRmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChOT1RJRllfU0lHTkFMX1NPQ0tFVCk7XG4rXHRcdGlmIChmZF9zZXJ2ZXIgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlmICh3cml0ZV9ub2ludHIoaXBjX3NvY2tldHNbMV0sIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMV0pO1xuK1xuK1x0XHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNjIDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXG4rXHRcdGZkX2NvcmVfZmlsZSA9IG9wZW4oTk9USUZZX1NJR05BTF9DT1JFX0ZJTEUsXG4rXHRcdFx0XHQgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyxcbitcdFx0XHRcdCAgICAwNjAwKTtcbitcdFx0aWYgKGZkX2NvcmVfZmlsZSBcdTAwM2MgMClcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0aWYgKHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChmZF9jb3JlZHVtcCwgZmRfY29yZV9maWxlLFxuK1x0XHRcdFx0XHRcdHRydWUpIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1xuK1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4rb3V0OlxuK1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkX2NvcmVkdW1wKTtcbitcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRfc2VydmVyKTtcbitcdFx0X2V4aXQoZXhpdF9jb2RlKTtcbitcdH1cbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXG4rXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcbitcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXHUwMDI2YywgMSksIDEpO1xuK1x0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7XG4rXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkLCAwKTtcbitcdGlmIChwaWQgPT0gMClcbitcdFx0Y3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCgpO1xuK1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQpO1xuK1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4rXG4rXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbitcbitcdGNoZWNrX3dob2xlX2NvcmVkdW1wKF9tZXRhZGF0YSk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG5pbmRleCBlZDQ3ZjAxZmE1M2M1Li4wNmY5OTdiYTQ3ZmQ5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbkBAIC05LDYgKzksNyBAQFxuIFxuICNpbmNsdWRlIFwiLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4gI2luY2x1ZGUgXCIuLi9waWRmZC9waWRmZC5oXCJcbisjaW5jbHVkZSBcImNvcmVkdW1wX25vdGlmeV9zaWduYWwuaFwiXG4gXG4gI2lmbmRlZiBQQUdFX1NJWkVcbiAjZGVmaW5lIFBBR0VfU0laRSA0MDk2XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggMmEyMGZhZjljYjBhZC4uMjBmY2M1YjY0NGMzMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTEsMTEgKzEsMTggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIFxuICNpbmNsdWRlIFx1MDAzY2Fzc2VydC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZWxmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NlbmRpYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW5rLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lvX3VyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb3JlZHVtcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0xMyw3ICsyMCw5IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvZXBvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuQEAgLTIxLDYgKzMwLDcgQEBcbiBcbiAjaW5jbHVkZSBcIi4uL2ZpbGVzeXN0ZW1zL3dyYXBwZXJzLmhcIlxuICNpbmNsdWRlIFwiLi4vcGlkZmQvcGlkZmQuaFwiXG4rI2luY2x1ZGUgXCJjb3JlZHVtcF9ub3RpZnlfc2lnbmFsLmhcIlxuIFxuIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIHRvIGF2b2lkIGluY2x1ZGluZyBoYXJuZXNzIGhlYWRlciAqL1xuIHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGE7XG5AQCAtMzgxLDMgKzM5MSwzMTEgQEAgdm9pZCBwcm9jZXNzX2NvcmVkdW1wX3dvcmtlcihpbnQgZmRfY29yZWR1bXAsIGludCBmZF9wZWVyX3BpZGZkLCBpbnQgZmRfY29yZV9maWxcbiBcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuIFx0X2V4aXQoZXhpdF9jb2RlKTtcbiB9XG4rXG4rLypcbisgKiBUSUZfTk9USUZZX1NJR05BTCBjb3JlZHVtcCBoZWxwZXJzLlxuKyAqXG4rICogX19kdW1wX2VtaXQoKSB0YWtlcyBhbnl0aGluZyBzaG9ydCBvZiBhIGZ1bGwgd3JpdGUgYXMgdGhlIGVuZCBvZiB0aGVcbisgKiBkdW1wLCBzbyBldmVyeSBlbWl0IHRoYXQgYmxvY2tzIG9uIGEgZnVsbCB0cmFuc3BvcnQgY2FuIGxvc2UgdGhlIHJlc3RcbisgKiBvZiBpdC4gVGhlIE5UX0ZJTEUgbm90ZSBpcyB0aGUgb25lIGVtaXQgdGhhdCBpcyBjZXJ0YWluIHRvIGJsb2NrLFxuKyAqIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgb25lIGxhcmdlciB0aGFuIHRoZSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnNcbisgKiBidWlsZCBhIG5vdGUgbGFyZ2UgZW5vdWdoIGZvciB0aGF0IGFuZCB0aGVuIHJhaXNlIFRJRl9OT1RJRllfU0lHTkFMIG9uXG4rICogdGhlIGR1bXBpbmcgdGFzayB3aGlsZSB0aGF0IHdyaXRlIGlzIGluIGZsaWdodC5cbisgKi9cbitcbitzdGF0aWMgaW50IGlvX3VyaW5nX3NldHVwX3Jhdyh1bnNpZ25lZCBpbnQgZW50cmllcywgc3RydWN0IGlvX3VyaW5nX3BhcmFtcyAqcClcbit7XG4rXHRyZXR1cm4gc3lzY2FsbChfX05SX2lvX3VyaW5nX3NldHVwLCBlbnRyaWVzLCBwKTtcbit9XG4rXG4rLyogaW9fdXJpbmcgcmVhZHMgcG9sbDMyX2V2ZW50cyBiYWNrIHRocm91Z2ggc3dhaHczMigpIG9uIGJpZyBlbmRpYW4uICovXG4rc3RhdGljIF9fdTMyIG5vdGlmeV9wb2xsX21hc2soX191MzIgZXZlbnRzKVxuK3tcbisjaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpIFx1MDAyNlx1MDAyNiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOXG4rXHRyZXR1cm4gX19zd2FodzMyKGV2ZW50cyk7XG4rI2Vsc2VcbitcdHJldHVybiBldmVudHM7XG4rI2VuZGlmXG4rfVxuK1xuK2Jvb2wgY29yZWR1bXBfaW9fdXJpbmdfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGlvX3VyaW5nX3NldHVwX3JhdygxLCBcdTAwMjZwKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qXG4rICogQXJtIGEgcG9sbCBvbiBAZmQuIGlvX3VyaW5nIGxlYXZlcyBjdHgtXHUwMDNlbm90aWZ5X21ldGhvZCBhdCBUV0FfU0lHTkFMXG4rICogdW5sZXNzIHRoZSByaW5nIGFza3MgZm9yIFNRUE9MTCBvciBDT09QX1RBU0tSVU4sIHNvIHRoZSBjb21wbGV0aW9uIHJ1bnNcbisgKiBzZXRfbm90aWZ5X3NpZ25hbCgpIGFnYWluc3QgdGhlIHRhc2sgdGhhdCBzdWJtaXR0ZWQgaXQuIFRoYXQgaXMgdXMsIGFuZFxuKyAqIHdlIGFyZSBhYm91dCB0byBiZWNvbWUgdGhlIGNvcmVkdW1waW5nIHRhc2suXG4rICovXG4rc3RhdGljIGludCBhcm1fcG9sbF9ub3RpZnkoaW50IHRyaWdnZXJfZmQpXG4re1xuK1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwID0ge307XG4rXHR1bnNpZ25lZCBpbnQgKnNxX3RhaWwsICpzcV9hcnJheTtcbitcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZXM7XG4rXHRzaXplX3Qgc3FyaW5nX3N6O1xuK1x0dm9pZCAqc3E7XG4rXHRpbnQgcmluZztcbitcbitcdHJpbmcgPSBpb191cmluZ19zZXR1cF9yYXcoOCwgXHUwMDI2cCk7XG4rXHRpZiAocmluZyBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0c3FyaW5nX3N6ID0gcC5zcV9vZmYuYXJyYXkgKyBwLnNxX2VudHJpZXMgKiBzaXplb2YodW5zaWduZWQgaW50KTtcbitcdHNxID0gbW1hcChOVUxMLCBzcXJpbmdfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUV9SSU5HKTtcbitcdGlmIChzcSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRzcWVzID0gbW1hcChOVUxMLCBwLnNxX2VudHJpZXMgKiBzaXplb2YoKnNxZXMpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgICAgTUFQX1NIQVJFRCB8IE1BUF9QT1BVTEFURSwgcmluZywgSU9SSU5HX09GRl9TUUVTKTtcbitcdGlmIChzcWVzID09IE1BUF9GQUlMRUQpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHNxX3RhaWwgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopc3EgKyBwLnNxX29mZi50YWlsKTtcbitcdHNxX2FycmF5ID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXNxICsgcC5zcV9vZmYuYXJyYXkpO1xuK1xuK1x0bWVtc2V0KFx1MDAyNnNxZXNbMF0sIDAsIHNpemVvZihzcWVzWzBdKSk7XG4rXHRzcWVzWzBdLm9wY29kZSA9IElPUklOR19PUF9QT0xMX0FERDtcbitcdHNxZXNbMF0uZmQgPSB0cmlnZ2VyX2ZkO1xuK1x0c3Flc1swXS5wb2xsMzJfZXZlbnRzID0gbm90aWZ5X3BvbGxfbWFzayhQT0xMSU4pO1xuK1xuK1x0c3FfYXJyYXlbMF0gPSAwO1xuK1x0X19hdG9taWNfc3RvcmVfbihzcV90YWlsLCAxLCBfX0FUT01JQ19SRUxFQVNFKTtcbitcbitcdGlmIChzeXNjYWxsKF9fTlJfaW9fdXJpbmdfZW50ZXIsIHJpbmcsIDEsIDAsIDAsIE5VTEwsIDApIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHQvKiBEZWxpYmVyYXRlbHkgbGVha2VkLCB3ZSBhcmUgYWJvdXQgdG8gY3Jhc2guICovXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBBZGphY2VudCBtYXBwaW5ncyB3aXRoIGlkZW50aWNhbCBmbGFncyBhbmQgY29udGlndW91cyBmaWxlIG9mZnNldHMgYXJlXG4rICogbWVyZ2VkIGludG8gb25lIFZNQSwgd2hpY2ggd291bGQgY29sbGFwc2UgTlRfRklMRSBiYWNrIHRvIG5vdGhpbmcsIHNvXG4rICogYWx0ZXJuYXRlIHRoZSBwcm90ZWN0aW9uIHRvIGtlZXAgZXZlcnkgbWFwcGluZyBhbiBlbnRyeSBvZiBpdHMgb3duLlxuKyAqIE5vdCBQUk9UX0VYRUMsIC90bXAgaXMgb2Z0ZW4gbW91bnRlZCBub2V4ZWMuIE5vdGhpbmcgaXMgZXZlciB3cml0dGVuXG4rICogdGhyb3VnaCB0aGVzZSBzbyB0aGV5IGdldCBubyBhbm9uX3ZtYSBhbmQgc3RheSBvdXQgb2YgdGhlIGR1bXAgaXRzZWxmLlxuKyAqL1xuK3N0YXRpYyBpbnQgbWFrZV9maWxlX21hcHBpbmdzKHZvaWQpXG4re1xuK1x0bG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0aW50IGZkLCBpO1xuK1xuK1x0ZmQgPSBvcGVuKE5PVElGWV9TSUdOQUxfTUFQRklMRSxcbitcdFx0ICBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDYwMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKGZ0cnVuY2F0ZShmZCwgKG9mZl90KU5PVElGWV9TSUdOQUxfTUFQX0NPVU5UICogcGdzeikpIHtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5PVElGWV9TSUdOQUxfTUFQX0NPVU5UOyBpKyspIHtcbitcdFx0aW50IHByb3QgPSAoaSBcdTAwMjYgMSkgPyBQUk9UX1JFQUQgOiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7XG4rXG4rXHRcdGlmIChtbWFwKE5VTEwsIHBnc3osIHByb3QsIE1BUF9QUklWQVRFLCBmZCxcbitcdFx0XHQgKG9mZl90KWkgKiBwZ3N6KSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGJyZWFrO1xuK1x0fVxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIGk7XG4rfVxuK1xuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfbm90aWZ5X3NpZ25hbCh2b2lkKVxuK3tcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdHVuc2lnbmVkIGNoYXIgKnA7XG4rXHRpbnQgdHJpZ2dlcl9mZDtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmO1xuK1xuK1x0LyogT3BlbiB0aGUgcmVhZCBzaWRlIGZpcnN0IHNvIHRoZSByZWFkZXIncyBvcGVuKCkgY2Fubm90IGJsb2NrLiAqL1xuK1x0dHJpZ2dlcl9mZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1JET05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1xuK1x0LyogRXhpdCByYXRoZXIgdGhhbiBjcmFzaDogYSBkdW1wIHdpdGhvdXQgdGhlIHBvbGwgYXJtZWQgcHJvdmVzIG5vdGhpbmcuICovXG4rXHRpZiAodHJpZ2dlcl9mZCBcdTAwM2MgMClcbitcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcbitcdGlmIChtYWtlX2ZpbGVfbWFwcGluZ3MoKSBcdTAwM2MgTk9USUZZX1NJR05BTF9NQVBfQ09VTlQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRwID0gbW1hcChOVUxMLCBOT1RJRllfU0lHTkFMX0FOT05fQllURVMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcbitcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRmb3IgKG9mZiA9IDA7IG9mZiBcdTAwM2MgTk9USUZZX1NJR05BTF9BTk9OX0JZVEVTOyBvZmYgKz0gcGdzeilcbitcdFx0cFtvZmZdID0gMTtcbitcbitcdGlmIChhcm1fcG9sbF9ub3RpZnkodHJpZ2dlcl9mZCkpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4rXHQqKHZvbGF0aWxlIGludCAqKU5VTEwgPSAwO1xuK1x0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbit9XG4rXG4rc3RhdGljIGludCBwdWxsX3RyaWdnZXIodm9pZClcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IG9wZW4oTk9USUZZX1NJR05BTF9UUklHR0VSLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBvcGVuIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRpZiAod3JpdGUoZmQsIFwieFwiLCAxKSAhPSAxKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiB3cml0ZSBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBwaGRyWzBdIGlzIHRoZSBQVF9OT1RFIGVudHJ5OiBlbGZfY29yZV9kdW1wKCkgZW1pdHMgaXQgcmlnaHQgYWZ0ZXIgdGhlXG4rICogRUxGIGhlYWRlci4gSXRzIHBfb2Zmc2V0IGlzIHdoZXJlIHRoZSBub3RlcyBiZWdpbi5cbisgKi9cbitzdGF0aWMgbG9uZyBsb25nIG5vdGVfb2Zmc2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkcilcbit7XG4rXHRFbGZXKFBoZHIpIHBoO1xuK1x0RWxmVyhFaGRyKSBlaDtcbitcbitcdG1lbWNweShcdTAwMjZlaCwgaGRyLCBzaXplb2YoZWgpKTtcbitcdGlmIChtZW1jbXAoZWguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSB8fCBlaC5lX3R5cGUgIT0gRVRfQ09SRSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0bWVtY3B5KFx1MDAyNnBoLCBoZHIgKyBzaXplb2YoZWgpLCBzaXplb2YocGgpKTtcbitcdGlmIChwaC5wX3R5cGUgIT0gUFRfTk9URSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIChsb25nIGxvbmcpcGgucF9vZmZzZXQ7XG4rfVxuK1xuKy8qXG4rICogRHJhaW4gYSBjb3JlZHVtcCBvZmYgQGZkLCBjb3VudGluZyB3aGF0IGFycml2ZXMuIE9uY2UgdGhlIG5vdGVzIGhhdmVcbisgKiBzdGFydGVkIHRoZSBrZXJuZWwgaXMgaW5zaWRlIHRoZSBvbmUgYmlnIG5vdGUgd3JpdGUsIHNvIHBva2UgdGhlIGZpZm9cbisgKiB0aGUgY3Jhc2hpbmcgdGFzayBpcyBwb2xsaW5nIGFuZCBzdG9wIHJlYWRpbmcsIHdoaWNoIGtlZXBzIHRoZVxuKyAqIHRyYW5zcG9ydCBmdWxsIGFuZCB0aGUgd3JpdGUgYmxvY2tlZCB3aXRoIGEgcGFydGlhbCBjb3VudCB3aGVuIHRoZVxuKyAqIHdha2V1cCBsYW5kcy4gVGhlbiBjYXJyeSBvbiB0byBlbmQgb2YgZmlsZS5cbisgKlxuKyAqIFdoYXQgYXJyaXZlcyBpcyB3cml0dGVuIHRvIEBmZF9vdXQgd2hlbiB0aGF0IGlzIG5vdCBuZWdhdGl2ZS5cbisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xLiBGYWlsaW5nIHRvIHRyaXAgdGhlIGZpZm9cbisgKiBpcyBhbiBlcnJvciB0b286IGEgZHVtcCB0aGF0IHdhcyBuZXZlciBpbnRlcnJ1cHRlZCBwcm92ZXMgbm90aGluZy5cbisgKi9cbitzc2l6ZV90IHJlY3ZfY29yZWR1bXBfbm90aWZ5X3NpZ25hbChpbnQgZmQsIGludCBmZF9vdXQsIGJvb2wgYXJtKVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgaGRyW3NpemVvZihFbGZXKEVoZHIpKSArIHNpemVvZihFbGZXKFBoZHIpKV07XG4rXHRzdGF0aWMgY2hhciBidWZbNjQgXHUwMDNjXHUwMDNjIDEwXTtcbitcdGxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGxvbmcgbG9uZyBub3RlX29mZiA9IDA7XG4rXHRzaXplX3QgaGRybGVuID0gMDtcbitcdHNzaXplX3QgdG90YWwgPSAwO1xuK1x0Ym9vbCBhcm1lZCA9IGZhbHNlO1xuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTtcbitcbitcdFx0aWYgKG4gXHUwMDNjIDApIHtcbitcdFx0XHRpZiAoZXJybm8gPT0gRUlOVFIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRyZXR1cm4gLTE7XG4rXHRcdH1cbitcdFx0aWYgKG4gPT0gMClcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKGZkX291dCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2IHdyaXRlKGZkX291dCwgYnVmLCBuKSAhPSBuKVxuK1x0XHRcdHJldHVybiAtMTtcbitcbitcdFx0aWYgKGhkcmxlbiBcdTAwM2Mgc2l6ZW9mKGhkcikpIHtcbitcdFx0XHRzaXplX3Qgd2FudCA9IHNpemVvZihoZHIpIC0gaGRybGVuO1xuK1xuK1x0XHRcdGlmICh3YW50IFx1MDAzZSAoc2l6ZV90KW4pXG4rXHRcdFx0XHR3YW50ID0gKHNpemVfdCluO1xuK1x0XHRcdG1lbWNweShoZHIgKyBoZHJsZW4sIGJ1Ziwgd2FudCk7XG4rXHRcdFx0aGRybGVuICs9IHdhbnQ7XG4rXHRcdFx0aWYgKGhkcmxlbiA9PSBzaXplb2YoaGRyKSlcbitcdFx0XHRcdG5vdGVfb2ZmID0gbm90ZV9vZmZzZXQoaGRyKTtcbitcdFx0fVxuK1xuK1x0XHR0b3RhbCArPSBuO1xuK1xuK1x0XHRpZiAoYXJtIFx1MDAyNlx1MDAyNiAhYXJtZWQgXHUwMDI2XHUwMDI2IG5vdGVfb2ZmIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgdG90YWwgXHUwMDNlIG5vdGVfb2ZmICsgKGxvbmcgbG9uZylwZ3N6KSB7XG4rXHRcdFx0aWYgKHB1bGxfdHJpZ2dlcigpKVxuK1x0XHRcdFx0cmV0dXJuIC0xO1xuK1x0XHRcdGFybWVkID0gdHJ1ZTtcbitcdFx0XHR1c2xlZXAoTk9USUZZX1NJR05BTF9TVEFMTF9VUyk7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChhcm0gXHUwMDI2XHUwMDI2ICFhcm1lZClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0dXJuIHRvdGFsO1xuK31cbitcbisvKlxuKyAqIEhvdyBsYXJnZSB0aGUgZHVtcCB3YXMgbWVhbnQgdG8gYmUuIFRoZSBFTEYgaGVhZGVyIGFuZCB0aGUgcHJvZ3JhbVxuKyAqIGhlYWRlcnMgYXJlIHRoZSBmaXJzdCB0aGluZyBlbWl0dGVkLCBzbyBldmVuIGEgdHJ1bmNhdGVkIGR1bXAgc2F5cyBob3dcbisgKiBmYXIgaXQgc2hvdWxkIGhhdmUgcnVuOiB0aGUgZW5kIGlzIG1heChwX29mZnNldCArIHBfZmlsZXN6KS5cbisgKlxuKyAqIEEgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHNlZ21lbnQgaXMgdGhlIG9uZSB0aGluZyB0aGF0IG5ldmVyXG4rICogYXJyaXZlcy4gZHVtcF9za2lwKCkgb25seSBhY2N1bXVsYXRlcyBjcHJtLVx1MDAzZXRvX3NraXAsIGVsZl9jb3JlX2R1bXAoKVxuKyAqIGhhcyBubyBmbHVzaCBhZnRlciB0aGUgbGFzdCBkdW1wX3VzZXJfcmFuZ2UoKSBhbmQgYSBwaXBlIGNhbm5vdCBzZWVrLFxuKyAqIHNvIHRob3NlIGJ5dGVzIGFyZSBkcm9wcGVkLiBPbiB4ODZfNjQgdGhlIGxhc3Qgc2VnbWVudCBpcyB0aGUgZ2F0ZSB2bWFcbisgKiBhbmQgdnN5c2NhbGw9eG9ubHkgbGVhdmVzIG5vIHBhZ2UgYmVoaW5kIGl0LCBzbyBhIHdob2xlIGR1bXAgaXMgb25lXG4rICogcGFnZSBzaG9ydCBvZiB3aGF0IHRoZSBoZWFkZXJzIHByb21pc2UuIEB0YWlsIHJldHVybnMgdGhlIHNpemUgb2YgdGhhdFxuKyAqIGxhc3Qgc2VnbWVudCwgd2hpY2ggYm91bmRzIHdoYXQgbWF5IGdvIG1pc3NpbmcgdGhpcyB3YXkuXG4rICovXG4rbG9uZyBsb25nIGNvcmVkdW1wX2V4cGVjdGVkX3NpemUoY29uc3QgY2hhciAqcGF0aCwgbG9uZyBsb25nICp0YWlsKVxuK3tcbitcdEVsZlcoUGhkcikgKnBoZHIgPSBOVUxMO1xuK1x0bG9uZyBsb25nIGV4cGVjdGVkID0gMDtcbitcdHVuc2lnbmVkIGludCBucGhkciwgaTtcbitcdEVsZlcoRWhkcikgZWg7XG4rXHRpbnQgZmQ7XG4rXG4rXHQqdGFpbCA9IDA7XG4rXG4rXHRmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocmVhZChmZCwgXHUwMDI2ZWgsIHNpemVvZihlaCkpICE9IHNpemVvZihlaCkpXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKG1lbWNtcChlaC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpIHx8IGVoLmVfdHlwZSAhPSBFVF9DT1JFKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmICghZWguZV9waG51bSB8fCBlaC5lX3BoZW50c2l6ZSAhPSBzaXplb2YoKnBoZHIpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdG5waGRyID0gZWguZV9waG51bTtcbitcdHBoZHIgPSBjYWxsb2MobnBoZHIsIHNpemVvZigqcGhkcikpO1xuK1x0aWYgKCFwaGRyKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmIChwcmVhZChmZCwgcGhkciwgKHNpemVfdClucGhkciAqIHNpemVvZigqcGhkciksIChvZmZfdCllaC5lX3Bob2ZmKSAhPVxuK1x0ICAgIChzc2l6ZV90KSgoc2l6ZV90KW5waGRyICogc2l6ZW9mKCpwaGRyKSkpXG4rXHRcdGdvdG8gZXJyO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnBoZHI7IGkrKykge1xuK1x0XHRsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylwaGRyW2ldLnBfb2Zmc2V0ICtcbitcdFx0XHRcdChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0aWYgKGVuZCBcdTAwM2UgZXhwZWN0ZWQpIHtcbitcdFx0XHRleHBlY3RlZCA9IGVuZDtcbitcdFx0XHQqdGFpbCA9IChsb25nIGxvbmcpcGhkcltpXS5wX2ZpbGVzejtcbitcdFx0fVxuK1x0fVxuK1xuK1x0ZnJlZShwaGRyKTtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBleHBlY3RlZDtcbitlcnI6XG4rXHRmcmVlKHBoZHIpO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIC0xO1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMyOjQyLjAxMjQzMDUwMVoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjA0NjQ3MTI4MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIGluIGZyb250IG9mIG1lIHRoYXQgYWltcyB0byBmaXggYSBuYXN0eSBidWcuIEFwcGFyZW50bHksIGBUSUZfTk9USUZZX1NJR05BTGAgd2FzIGFibGUgdG8gaW50ZXJydXB0IGNvcmVkdW1wcyBhbmQgU01CIHNlbmRzLCB3aGljaCBpcyBvYnZpb3VzbHkgbm90IGlkZWFsLiBUaGUgZml4IGludHJvZHVjZXMgYG5vX25vdGlmeV9zaWduYWxfc2F2ZSgpYCBhbmQgYG5vX25vdGlmeV9zaWduYWxfcmVzdG9yZSgpYCB0byBtYXNrIHRoYXQgc2lnbmFsIGJ5IHNldHRpbmcgYSBmbGFnLCBgUEZfTk9fTk9USUZZX1NJR05BTGAsIGluIHRoZSBgY3VycmVudC1cdTAwM2VmbGFnc2AuIFRoZSBjaGFuZ2VzIGFyZSBmb2N1c2VkIGluIGBmcy9jb3JlZHVtcC5jYCBhbmQgYGZzL3NtYi9jbGllbnQvdHJhbnNwb3J0LmNgLCBzcGVjaWZpY2FsbHkgYHZmc19jb3JlZHVtcCgpYCBhbmQgYHNtYl9zZW5kX2t2ZWMoKWAgcmVzcGVjdGl2ZWx5LiBJdCBhbHNvIGNvbWVzIHdpdGggYSBzZWxmdGVzdCBmb3IgY29yZWR1bXAsIHdoaWNoIGlzIGdvb2QuXG5cbk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyBuYWlsIGRvd24gYW55IHBvdGVudGlhbCBVTklOSVRJQUxJWkVEIE1FTU9SWSBpc3N1ZXMuIFdlJ3JlIGRlYWxpbmcgd2l0aCB0YXNrIGZsYWdzIGFuZCBzaWduYWwgaGFuZGxpbmcgaGVyZSwgc3BlY2lmaWNhbGx5IHByZXZlbnRpbmcgYSBzaWduYWwgZnJvbSBwcmVtYXR1cmVseSBhYm9ydGluZyB0aGluZ3MuIE5vIG5ldyBzdHJ1Y3R1cmVzLCBubyBuZXcgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2UsIG5vIG5ldyBib3VuZHMgY2hlY2tzIG9yIGxlbmd0aCBtb2RpZmljYXRpb25zLiBUaGlzIGlzICpwdXJlbHkqIGNvbnRyb2wgZmxvdyBhcm91bmQgc2lnbmFsIGludGVycnVwdGlvbi5cblxuU28sIGRvZXMgdGhpcyBpbnRyb2R1Y2UgKmFueSogdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IEknbSBub3Qgc2VlaW5nIGl0LiBJIG1lYW4sIHdlJ3JlIG5vdCB0b3VjaGluZyBkYXRhIGluIGEgd2F5IHRoYXQgY291bGQgbGVhZCB0byByZWFkcyBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBXZSdyZSBqdXN0IG1vZGlmeWluZyAqd2hlbiogY2VydGFpbiBvcGVyYXRpb25zIGdldCBpbnRlcnJ1cHRlZC5cblxuTGV0J3MgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhlIGNvZGUgc25pcHBldHMsIGp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLlxuXG5JbiBgZnMvY29yZWR1bXAuY2AsIHdlIGhhdmU6XG5cbmBgYGNcbitcdC8qIFRhc2sgd29yayBtdXN0IG5vdCBjdXQgdGhlIGR1bXAgc2hvcnQsIHNlZSBzaWduYWxfcGVuZGluZygpLiAqL1xuK1x0bm90aWZ5X2ZsYWdzID0gbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCk7XG4gXHRzY29wZWRfd2l0aF9jcmVkcyhjcmVkKVxuIFx0XHRkb19jb3JlZHVtcChcdTAwMjZjbiwgXHUwMDI2Y3BybSwgXHUwMDI2YXJndiwgXHUwMDI2YXJnYywgYmluZm10KTtcbiBcdGNvcmVkdW1wX2NsZWFudXAoXHUwMDI2Y24sIFx1MDAyNmNwcm0pO1xuK1x0bm9fbm90aWZ5X3NpZ25hbF9yZXN0b3JlKG5vdGlmeV9mbGFncyk7XG5gYGBcblxuQmFzaWNhbGx5LCB3ZSdyZSBtYWtpbmcgc3VyZSBgZG9fY29yZWR1bXBgIGlzICpub3QqIHByZW1hdHVyZWx5IGludGVycnVwdGVkIGJ5IGBUSUZfTk9USUZZX1NJR05BTGAuIFBlcmZlY3RseSByZWFzb25hYmxlLlxuXG5JbiBgZnMvc21iL2NsaWVudC90cmFuc3BvcnQuY2A6XG5cbmBgYGNcbitcdFx0bm90aWZ5X2ZsYWdzID0gbm9fbm90aWZ5X3NpZ25hbF9zYXZlKCk7XG4gXHRcdHJjID0gc29ja19zZW5kbXNnKHNzb2NrZXQsIHNtYl9tc2cpO1xuLVx0XHRpZiAocmMgPT0gLUVBR0FJTiB8fCB1bmxpa2VseShyYyA9PSAtRUlOVFIgXHUwMDI2XHUwMDI2IHRhc2tfd29ya19wZW5kaW5nKGN1cnJlbnQpKSkge1xuK1x0XHRub19ub3RpZnlfc2lnbmFsX3Jlc3RvcmUobm90aWZ5X2ZsYWdzKTtcbitcdFx0aWYgKHJjID09IC1FQUdBSU4pIHtcbmBgYFxuXG5BZ2Fpbiwgc2FtZSBwcmluY2lwbGUuIFByZXZlbnRpbmcgdGhlIHNpZ25hbCBmcm9tIGludGVycnVwdGluZyB0aGUgYHNvY2tfc2VuZG1zZ2AgY2FsbC4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UgaGVyZSBlaXRoZXIuXG5cblNvLCBib3R0b20gbGluZTogbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlzay4gVGhpcyBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGFib3V0IHRhc2sgZmxhZ3MgYW5kIHNpZ25hbCBoYW5kbGluZy4gVGhlcmUncyB6ZXJvIGNoYW5jZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBiZWNhdXNlIG9mIHRoZXNlIGNoYW5nZXMuIFRodXMsIHRoaXMgZG9lc24ndCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGNhbXBhaWduLiBLQVNBTiBhbmQgb3RoZXIgdG9vbHMgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBpc3N1ZXMuXG5cbk9rYXksIGxldCdzIGZvcm11bGF0ZSB0aGlzIHN1Y2NpbmN0bHkgYW5kIGNhbGwgaXQgYSBkYXkuXG5cbioqUmVhc29uaW5nOioqXG5cblRoZSBwYXRjaCBtb2RpZmllcyBzaWduYWwgaGFuZGxpbmcgYmVoYXZpb3IgYnkgaW50cm9kdWNpbmcgYFBGX05PX05PVElGWV9TSUdOQUxgIHRvIHByZXZlbnQgYFRJRl9OT1RJRllfU0lHTkFMYCBmcm9tIGludGVycnVwdGluZyBjb3JlZHVtcHMgKGB2ZnNfY29yZWR1bXBgKSBhbmQgU01CIHNlbmQgb3BlcmF0aW9ucyAoYHNtYl9zZW5kX2t2ZWNgKS4gVGhlIGNoYW5nZXMgYXJlIHB1cmVseSByZWxhdGVkIHRvIHRhc2sgZmxhZ3MsIGNvbnRyb2wgZmxvdywgYW5kIHNpZ25hbCBtYXNraW5nIHRvIGF2b2lkIHByZW1hdHVyZSBhYm9ydHMgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBubyBuZXcgZmllbGRzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBidWZmZXIgbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGFyZSBhbHRlcmVkIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3IgbG9naWMgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMuXG5cbkFscmlnaHQsIGBzZXQtcmVzdWx0c2AuIERvbmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDU4LCJPdXRwdXRUb2tlbnMiOjE5MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDExOjMyOjU0LjA1ODkwNTE2NFoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgc2lnbmFsIGhhbmRsaW5nIGJlaGF2aW9yIGJ5IGludHJvZHVjaW5nIGBQRl9OT19OT1RJRllfU0lHTkFMYCB0byBwcmV2ZW50IGBUSUZfTk9USUZZX1NJR05BTGAgZnJvbSBpbnRlcnJ1cHRpbmcgY29yZWR1bXBzIChgdmZzX2NvcmVkdW1wYCkgYW5kIFNNQiBzZW5kIG9wZXJhdGlvbnMgKGBzbWJfc2VuZF9rdmVjYCkuIFRoZSBjaGFuZ2VzIGFyZSBwdXJlbHkgcmVsYXRlZCB0byB0YXNrIGZsYWdzLCBjb250cm9sIGZsb3csIGFuZCBzaWduYWwgbWFza2luZyB0byBhdm9pZCBwcmVtYXR1cmUgYWJvcnRzIG9mIHRoZXNlIG9wZXJhdGlvbnMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgbm8gbmV3IGZpZWxkcyBhcmUgc2VudCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gYnVmZmVyIGxlbmd0aHMgb3IgYm91bmRzIGNoZWNrcyBhcmUgYWx0ZXJlZCBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiBTdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uIG9yIGxvZ2ljIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHNpZ25hbCBoYW5kbGluZyBiZWhhdmlvciBieSBpbnRyb2R1Y2luZyBgUEZfTk9fTk9USUZZX1NJR05BTGAgdG8gcHJldmVudCBgVElGX05PVElGWV9TSUdOQUxgIGZyb20gaW50ZXJydXB0aW5nIGNvcmVkdW1wcyAoYHZmc19jb3JlZHVtcGApIGFuZCBTTUIgc2VuZCBvcGVyYXRpb25zIChgc21iX3NlbmRfa3ZlY2ApLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGFzayBmbGFncywgY29udHJvbCBmbG93LCBhbmQgc2lnbmFsIG1hc2tpbmcgdG8gYXZvaWQgcHJlbWF0dXJlIGFib3J0cyBvZiB0aGVzZSBvcGVyYXRpb25zLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIG5vIG5ldyBmaWVsZHMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGJ1ZmZlciBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgYXJlIGFsdGVyZWQgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4gU3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBsb2dpYyBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[1] Phase: Succeeded StartedAt: 2026-08-18 11:33:19 +0000 UTC FinishedAt: 2026-08-18 11:33:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-18 11:33:19 +0000 UTC FinishedAt: 2026-08-18 11:33:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2] Phase: Succeeded StartedAt: 2026-08-18 11:33:19 +0000 UTC FinishedAt: 2026-08-18 15:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-18 11:33:19 +0000 UTC FinishedAt: 2026-08-18 15:14:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-18 11:33:19 +0000 UTC FinishedAt: 2026-08-18 11:34:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-18 11:33:19 +0000 UTC FinishedAt: 2026-08-18 11:33:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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-workflowcpdg4/series-workflowcpdg4-convert-artifact-1636736716/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-18 11:34:01 +0000 UTC FinishedAt: 2026-08-18 11:50:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-18 11:34:01 +0000 UTC FinishedAt: 2026-08-18 11:50:30 +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:*a2e65167-6d8f-4290-9470-f7779f8a424a,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-workflowcpdg4/series-workflowcpdg4-convert-artifact-1636736716/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": "fafdf9dc-d252-4678-a42c-f412c46993c3", "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-workflowcpdg4/series-workflowcpdg4-build-action-1465687290/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-18 11:34:01 +0000 UTC FinishedAt: 2026-08-18 11:50:20 +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:*a2e65167-6d8f-4290-9470-f7779f8a424a,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-workflowcpdg4/series-workflowcpdg4-convert-artifact-1636736716/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": "fafdf9dc-d252-4678-a42c-f412c46993c3", "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-workflowcpdg4/series-workflowcpdg4-build-action-1465687290/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-18 11:50:30 +0000 UTC FinishedAt: 2026-08-18 11:50:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-18 11:50:30 +0000 UTC FinishedAt: 2026-08-18 11:50:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-18 11:50:30 +0000 UTC FinishedAt: 2026-08-18 11:50:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-18 11:50:30 +0000 UTC FinishedAt: 2026-08-18 11:50:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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-workflowcpdg4/series-workflowcpdg4-convert-artifact-29710091/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-18 11:50:40 +0000 UTC FinishedAt: 2026-08-18 11:52:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-18 11:50:40 +0000 UTC FinishedAt: 2026-08-18 11:52:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*fafdf9dc-d252-4678-a42c-f412c46993c3,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-workflowcpdg4/series-workflowcpdg4-build-action-1465687290/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-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-18 11:52:46 +0000 UTC FinishedAt: 2026-08-18 11:52:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-18 11:52:46 +0000 UTC FinishedAt: 2026-08-18 11:52:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-18 11:52:46 +0000 UTC FinishedAt: 2026-08-18 12:10:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-18 11:52:46 +0000 UTC FinishedAt: 2026-08-18 12:10: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:*a2e65167-6d8f-4290-9470-f7779f8a424a,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-workflowcpdg4/series-workflowcpdg4-convert-artifact-29710091/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": "6905e939-7658-4c33-90ca-85d1b81d9632", "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-workflowcpdg4/series-workflowcpdg4-build-action-2699031983/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-18 11:52:46 +0000 UTC FinishedAt: 2026-08-18 12:09:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*a2e65167-6d8f-4290-9470-f7779f8a424a,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-workflowcpdg4/series-workflowcpdg4-convert-artifact-29710091/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": "6905e939-7658-4c33-90ca-85d1b81d9632", "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-workflowcpdg4/series-workflowcpdg4-build-action-2699031983/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-18 12:10:00 +0000 UTC FinishedAt: 2026-08-18 12:10:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-18 12:10:00 +0000 UTC FinishedAt: 2026-08-18 12:10:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-18 12:10:00 +0000 UTC FinishedAt: 2026-08-18 12:11:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-18 12:10:00 +0000 UTC FinishedAt: 2026-08-18 12:11:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6905e939-7658-4c33-90ca-85d1b81d9632,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcpdg4/series-workflowcpdg4-build-action-2699031983/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-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-18 12:11:59 +0000 UTC FinishedAt: 2026-08-18 15:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-18 12:11:59 +0000 UTC FinishedAt: 2026-08-18 15:14:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*fafdf9dc-d252-4678-a42c-f412c46993c3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6905e939-7658-4c33-90ca-85d1b81d9632,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcpdg4/series-workflowcpdg4-build-action-1465687290/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcpdg4/series-workflowcpdg4-build-action-2699031983/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-18 12:11:59 +0000 UTC FinishedAt: 2026-08-18 12:12:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-18 12:11:59 +0000 UTC FinishedAt: 2026-08-18 12:12:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},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-workflowcpdg4/series-workflowcpdg4-convert-artifact-2132710820/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-18 12:11:59 +0000 UTC FinishedAt: 2026-08-18 12:11:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-18 12:11:59 +0000 UTC FinishedAt: 2026-08-18 12:11:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-18 12:11:59 +0000 UTC FinishedAt: 2026-08-18 12:11:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-18 12:12:09 +0000 UTC FinishedAt: 2026-08-18 15:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcpdg4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["vfs_coredump","smb_send_kvec"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8d3ae59288f1e7d58d76558a6ee96d533bc5019f","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP","CIFS"],"series_id":"b84b1a73-2c94-48c2-a75a-e79de6770866","tree_name":"drm-next","tree_url":"https://gitlab.freedesktop.org/drm/kernel.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-18 12:12:09 +0000 UTC FinishedAt: 2026-08-18 15:13:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*fafdf9dc-d252-4678-a42c-f412c46993c3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6905e939-7658-4c33-90ca-85d1b81d9632,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcpdg4/series-workflowcpdg4-build-action-1465687290/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcpdg4/series-workflowcpdg4-build-action-2699031983/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcpdg4/series-workflowcpdg4-convert-artifact-2132710820/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,}