Name: series-workflowdkt2m Phase: Succeeded StartedAt: 2026-09-12 03:19:01 +0000 UTC FinishedAt: 2026-09-12 08:21:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[0] Phase: Succeeded StartedAt: 2026-09-12 03:19:01 +0000 UTC FinishedAt: 2026-09-12 03:39:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[0].run-triage Phase: Succeeded StartedAt: 2026-09-12 03:19:01 +0000 UTC FinishedAt: 2026-09-12 03:39:14 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9958290885035431e2494159f555e332c3c14906", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9958290885035431e2494159f555e332c3c14906", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION" ], "series_id": "880eb61a-dcbe-485a-bba5-7d4b6b00bae6" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "find_next_best_node_in", "next_demotion_node", "build_all_zonelists" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "", "base_commit": "9958290885035431e2494159f555e332c3c14906", "base_tree": "mm-new" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cblxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgZmluZF9uZXh0X2Jlc3Rfbm9kZSgpIGludG8gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpLCBhbGxvd2luZyBjYWxsZXJzIHRvIHNwZWNpZnkgZWxpZ2libGUgY2FuZGlkYXRlIG5vZGVzIHZpYSBhIG5vZGVtYXNrLiBJdCBhbHNvIHJlc3RydWN0dXJlcyB6b25lbGlzdCBidWlsZGluZyBpbiBtbS9wYWdlX2FsbG9jLmMgKGJ1aWxkX25vZGVfem9uZWxpc3QpIGFuZCB1cGRhdGVzIGRlbW90aW9uIHRhcmdldCByZXNvbHV0aW9uIGluIG1tL21lbW9yeS10aWVycy5jIChuZXh0X2RlbW90aW9uX25vZGUgYW5kIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKS4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIHJlYWNoYWJsZSBkdXJpbmcgTlVNQSB6b25lbGlzdCBnZW5lcmF0aW9uIChlLmcuIGJvb3QgYW5kIG1lbW9yeSBob3RwbHVnL3JlYnVpbGQpIGFuZCBmb2xpbyBkZW1vdGlvbiBkdXJpbmcgbWVtb3J5IHJlY2xhbWF0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMWJhMmQ0ZjE3OTFkYjg3MzYwMGYwYTEyZmY3M2QyOTlhYmRkM2JkN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDAzOjM3OjAyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXG5pbmRleCBkYTE0YzU2ZmIyNGUxLi4xNTE5ZGQyMWE5MDBmIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaFxuQEAgLTExMzMsNyAmIzQzOzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xuIFxuIGV4dGVybiB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIFx0XHRcdFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcbi1leHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKTtcbiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuJiM0MztcdFx0Y29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyk7XG4gI2Vsc2VcbiAjZGVmaW5lIG5vZGVfcmVjbGFpbV9tb2RlIDBcbiBcbkBAIC0xMTQyLDcgJiM0MzsxMTQzLDggQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIHtcbiBcdHJldHVybiAwO1xuIH1cbi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4mIzQzO1x0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuIHtcbiBcdHJldHVybiBOVU1BX05PX05PREU7XG4gfVxuZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmNcbmluZGV4IDU0ODUxZDhhMTk1YjAuLjI1ZTEyMTg1MWI1ODYgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmNcbkBAIC0zNzAsNyAmIzQzOzM3MCw3IEBAIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbiBcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxuIFx0ICovXG4gXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xuLVx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXHUwMDI2bWFzayk7XG4mIzQzO1x0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXHUwMDI2bWFzaywgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuQEAgLTQ1MCw3ICYjNDM7NDUwLDcgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdFx0bWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTtcbiBcdFx0dGllcl9ub2RlcyA9IGdldF9tZW10aWVyX25vZGVtYXNrKG1lbXRpZXIpO1xuIFx0XHQvKlxuLVx0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4mIzQzO1x0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4gXHRcdCAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXJcbiBcdFx0ICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlXG4gXHRcdCAqIG1lbXRpZXIgbm9kZWxpc3QuXG5AQCAtNDYzLDcgJiM0Mzs0NjMsOCBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0XHQgKiBpbiB0aGUgcHJlZmVycmVkIG1hc2sgd2hlbiBhbGxvY2F0aW5nIHBhZ2VzIGR1cmluZyBkZW1vdGlvbi5cbiBcdFx0ICovXG4gXHRcdGRvIHtcbi1cdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMpO1xuJiM0MztcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiBcdFx0XHRpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSlcbiBcdFx0XHRcdGJyZWFrO1xuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xuaW5kZXggMWNmYmQwNTgyYTEwYS4uZDE4ODhkNTYzMGUwYSAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9hbGxvYy5jXG5AQCAtNTc5Myw5ICYjNDM7NTc5MywxMCBAQCBzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxuIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4gXG4gLyoqXG4tICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3RcbiYjNDM7ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3RcbiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJiMzOTtyZSBhcHBlbmRpbmdcbiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzXG4mIzQzOyAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cbiAgKlxuICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkXG4gICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSYjMzk7cyBmYWxsYmFjayBsaXN0LiAgVGhlIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFwcGVhcmVkXG5AQCAtNTgwNyw3ICYjNDM7NTgwOCw4IEBAIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4gICpcbiAgKiBSZXR1cm46IG5vZGUgaWQgb2YgdGhlIGZvdW5kIG5vZGUgb3IgJU5VTUFfTk9fTk9ERSBpZiBubyBub2RlIGlzIGZvdW5kLlxuICAqL1xuLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuJiM0MztcdFx0XHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuIHtcbiBcdGludCBuLCB2YWw7XG4gXHRpbnQgbWluX3ZhbCA9IElOVF9NQVg7XG5AQCAtNTgxNywxMiAmIzQzOzU4MTksMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuIFx0ICogVXNlIHRoZSBsb2NhbCBub2RlIGlmIHdlIGhhdmVuJiMzOTt0IGFscmVhZHksIGJ1dCBmb3IgbWVtb3J5bGVzcyBsb2NhbFxuIFx0ICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy5cbiBcdCAqL1xuLVx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXHUwMDI2XHUwMDI2IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7XG4mIzQzO1x0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXHUwMDI2XHUwMDI2IG5vZGVfaXNzZXQobm9kZSwgKmNhbmRpZGF0ZXMpKSB7XG4gXHRcdG5vZGVfc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzayk7XG4gXHRcdHJldHVybiBub2RlO1xuIFx0fVxuIFxuLVx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuLCBOX01FTU9SWSkge1xuJiM0MztcdGZvcl9lYWNoX25vZGVfbWFzayhuLCAqY2FuZGlkYXRlcykge1xuIFxuIFx0XHQvKiBEb24mIzM5O3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovXG4gXHRcdGlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpXG5AQCAtNTg1NSwzMSAmIzQzOzU4NTcsNiBAQCBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4gfVxuIFxuIFxuLS8qXG4tICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuXG4tICogVGhpcyByZXN1bHRzIGluIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsXG4tICogRE1BIHpvbmUsIGlmIGFueS0tYnV0IHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuXG4tICovXG4tc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdfZGF0YV90ICpwZ2RhdCwgaW50ICpub2RlX29yZGVyLFxuLVx0XHR1bnNpZ25lZCBucl9ub2Rlcylcbi17XG4tXHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnM7XG4tXHRpbnQgaTtcbi1cbi1cdHpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbWk9ORUxJU1RfRkFMTEJBQ0tdLl96b25lcmVmcztcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX25vZGVzOyBpJiM0MzsmIzQzOykge1xuLVx0XHRpbnQgbnJfem9uZXM7XG4tXG4tXHRcdHBnX2RhdGFfdCAqbm9kZSA9IE5PREVfREFUQShub2RlX29yZGVyW2ldKTtcbi1cbi1cdFx0bnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTtcbi1cdFx0em9uZXJlZnMgJiM0Mzs9IG5yX3pvbmVzO1xuLVx0fVxuLVx0em9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTEw7XG4tXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4tfVxuLVxuIC8qXG4gICogQnVpbGQgX19HRlBfVEhJU05PREUgem9uZWxpc3RzXG4gICovXG5AQCAtNTg5NSwxOSAmIzQzOzU4NzIsMjQgQEAgc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4gXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuJiM0MzsvKlxuJiM0MzsgKiBCdWlsZCBvbmUgem9uZWxpc3Qgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS4gVGhpcyByZXN1bHRzIGluXG4mIzQzOyAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxuJiM0MzsgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuJiM0MztcdFx0XHRcdGludCB6bGlkeClcbiB7XG4tXHRzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTtcbi1cdGludCBub2RlLCBucl9ub2RlcyA9IDA7XG4mIzQzO1x0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbemxpZHhdLl96b25lcmVmcztcbiBcdG5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG4tXHRpbnQgbG9jYWxfbm9kZSwgcHJldl9ub2RlO1xuJiM0MztcdGludCBsb2NhbF9ub2RlID0gcGdkYXQtXHUwMDNlbm9kZV9pZDtcbiYjNDM7XHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbiYjNDM7XHRpbnQgbm9kZTtcbiBcbi1cdC8qIE5VTUEtYXdhcmUgb3JkZXJpbmcgb2Ygbm9kZXMgKi9cbi1cdGxvY2FsX25vZGUgPSBwZ2RhdC1cdTAwM2Vub2RlX2lkO1xuLVx0cHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcJiMzNDssIGxvY2FsX25vZGUpO1xuIFxuLVx0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XG4tXHR3aGlsZSAoKG5vZGUgPSBmaW5kX25leHRfYmVzdF9ub2RlKGxvY2FsX25vZGUsIFx1MDAyNnVzZWRfbWFzaykpIFx1MDAzZT0gMCkge1xuJiM0MztcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgY2FuZGlkYXRlcykpIFx1MDAzZT0gMCkge1xuIFx0XHQvKlxuIFx0XHQgKiBXZSBkb24mIzM5O3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS5cbiBcdFx0ICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZVxuQEAgLTU5MTcsMTggJiM0Mzs1ODk5LDIyIEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuIFx0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKVxuIFx0XHRcdG5vZGVfbG9hZFtub2RlXSAmIzQzOz0gMTtcbiBcbi1cdFx0bm9kZV9vcmRlcltucl9ub2RlcyYjNDM7JiM0MztdID0gbm9kZTtcbiYjNDM7XHRcdHpvbmVyZWZzICYjNDM7PSBidWlsZF96b25lcmVmc19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZXJlZnMpO1xuJiM0MztcdFx0cHJfY29udChcJiMzNDslZCBcJiMzNDssIG5vZGUpO1xuIFx0XHRwcmV2X25vZGUgPSBub2RlO1xuIFx0fVxuIFxuLVx0YnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdkYXQsIG5vZGVfb3JkZXIsIG5yX25vZGVzKTtcbi1cdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XG4tXHRwcl9pbmZvKFwmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcJiMzNDssIGxvY2FsX25vZGUpO1xuLVx0Zm9yIChub2RlID0gMDsgbm9kZSBcdTAwM2MgbnJfbm9kZXM7IG5vZGUmIzQzOyYjNDM7KVxuLVx0XHRwcl9jb250KFwmIzM0OyVkIFwmIzM0Oywgbm9kZV9vcmRlcltub2RlXSk7XG4mIzQzO1x0em9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTEw7XG4mIzQzO1x0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuIFx0cHJfY29udChcJiMzNDtcXG5cJiMzNDspO1xuIH1cbiBcbiYjNDM7c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4mIzQzO3tcbiYjNDM7XHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTtcbiYjNDM7XHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xuJiM0Mzt9XG4mIzQzO1xuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG4gLypcbiAgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFwmIzM0O2xvY2FsXCYjMzQ7IGFsbG9jYXRpb25zLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMDM6Mzc6MDIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCBkYTE0YzU2ZmIyNGUxLi4xNTE5ZGQyMWE5MDBmIDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTExMzMsNyAmIzQzOzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKIAkJCQkgIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwotZXh0ZXJuIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayk7CiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLAomIzQzOwkJY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyk7CiAjZWxzZQogI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwCiAKQEAgLTExNDIsNyAmIzQzOzExNDMsOCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaywKJiM0MzsJCWNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpCiB7CiAJcmV0dXJuIE5VTUFfTk9fTk9ERTsKIH0KZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmMKaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmMKQEAgLTM3MCw3ICYjNDM7MzcwLDcgQEAgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKQogCSAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LgogCSAqLwogCW5vZGVzX2NvbXBsZW1lbnQobWFzaywgKmFsbG93ZWRfbWFzayk7Ci0JcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgJmFtcDttYXNrKTsKJiM0MzsJcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDttYXNrLCAmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZCkKQEAgLTQ1MCw3ICYjNDM7NDUwLDcgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkKIAkJbWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTsKIAkJdGllcl9ub2RlcyA9IGdldF9tZW10aWVyX25vZGVtYXNrKG1lbXRpZXIpOwogCQkvKgotCQkgKiBmaW5kX25leHRfYmVzdF9ub2RlLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiYjNDM7CQkgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiAJCSAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXIKIAkJICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlCiAJCSAqIG1lbXRpZXIgbm9kZWxpc3QuCkBAIC00NjMsNyAmIzQzOzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpCiAJCSAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLgogCQkgKi8KIAkJZG8gewotCQkJdGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCAmYW1wO3RpZXJfbm9kZXMpOwomIzQzOwkJCXRhcmdldCA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDt0aWVyX25vZGVzLAomIzQzOwkJCQkJCQkmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiAJCQlpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSkKIAkJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDFjZmJkMDU4MmExMGEuLmQxODg4ZDU2MzBlMGEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTU3OTMsOSAmIzQzOzU3OTMsMTAgQEAgc3RhdGljIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CiAKIC8qKgotICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QKJiM0MzsgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdAogICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSYjMzk7cmUgYXBwZW5kaW5nCiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzCiYjNDM7ICogQGNhbmRpZGF0ZXM6IG5vZGVtYXNrX3Qgb2Ygbm9kZXMgZWxpZ2libGUgZm9yIHNlbGVjdGlvbgogICoKICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkCiAgKiBhcHBlYXIgb24gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWQKQEAgLTU4MDcsNyAmIzQzOzU4MDgsOCBAQCBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOwogICoKICAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuCiAgKi8KLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssCiYjNDM7CQkJICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcykKIHsKIAlpbnQgbiwgdmFsOwogCWludCBtaW5fdmFsID0gSU5UX01BWDsKQEAgLTU4MTcsMTIgJiM0Mzs1ODE5LDEyIEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIAkgKiBVc2UgdGhlIGxvY2FsIG5vZGUgaWYgd2UgaGF2ZW4mIzM5O3QgYWxyZWFkeSwgYnV0IGZvciBtZW1vcnlsZXNzIGxvY2FsCiAJICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy4KIAkgKi8KLQlpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSAmYW1wOyZhbXA7IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7CiYjNDM7CWlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spICZhbXA7JmFtcDsgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHsKIAkJbm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTsKIAkJcmV0dXJuIG5vZGU7CiAJfQogCi0JZm9yX2VhY2hfbm9kZV9zdGF0ZShuLCBOX01FTU9SWSkgewomIzQzOwlmb3JfZWFjaF9ub2RlX21hc2sobiwgKmNhbmRpZGF0ZXMpIHsKIAogCQkvKiBEb24mIzM5O3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovCiAJCWlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpCkBAIC01ODU1LDMxICYjNDM7NTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIH0KIAogCi0vKgotICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuCi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwKLSAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgotICovCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsCi0JCXVuc2lnbmVkIG5yX25vZGVzKQotewotCXN0cnVjdCB6b25lcmVmICp6b25lcmVmczsKLQlpbnQgaTsKLQotCXpvbmVyZWZzID0gcGdkYXQtJmd0O25vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfbm9kZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWludCBucl96b25lczsKLQotCQlwZ19kYXRhX3QgKm5vZGUgPSBOT0RFX0RBVEEobm9kZV9vcmRlcltpXSk7Ci0KLQkJbnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTsKLQkJem9uZXJlZnMgJiM0Mzs9IG5yX3pvbmVzOwotCX0KLQl6b25lcmVmcy0mZ3Q7em9uZSA9IE5VTEw7Ci0Jem9uZXJlZnMtJmd0O3pvbmVfaWR4ID0gMDsKLX0KLQogLyoKICAqIEJ1aWxkIF9fR0ZQX1RISVNOT0RFIHpvbmVsaXN0cwogICovCkBAIC01ODk1LDE5ICYjNDM7NTg3MiwyNCBAQCBzdGF0aWMgdm9pZCBidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKIAl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogfQogCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW4KJiM0MzsgKiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbCBETUEgem9uZSwgaWYgYW55LS1idXQKJiM0MzsgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcywKJiM0MzsJCQkJaW50IHpsaWR4KQogewotCXN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdOwotCWludCBub2RlLCBucl9ub2RlcyA9IDA7CiYjNDM7CXN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LSZndDtub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzOwogCW5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7Ci0JaW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTsKJiM0MzsJaW50IGxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKJiM0MzsJaW50IHByZXZfbm9kZSA9IGxvY2FsX25vZGU7CiYjNDM7CWludCBub2RlOwogCi0JLyogTlVNQS1hd2FyZSBvcmRlcmluZyBvZiBub2RlcyAqLwotCWxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKLQlwcmV2X25vZGUgPSBsb2NhbF9ub2RlOwomIzQzOwlwcl9pbmZvKCYjMzQ7RmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6ICYjMzQ7LCBsb2NhbF9ub2RlKTsKIAotCW1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpOwotCXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2spKSAmZ3Q7PSAwKSB7CiYjNDM7CXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2ssCiYjNDM7CQkJCQkgICAgICBjYW5kaWRhdGVzKSkgJmd0Oz0gMCkgewogCQkvKgogCQkgKiBXZSBkb24mIzM5O3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS4KIAkJICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZQpAQCAtNTkxNywxOCAmIzQzOzU4OTksMjIgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiAJCSAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpCiAJCQlub2RlX2xvYWRbbm9kZV0gJiM0Mzs9IDE7CiAKLQkJbm9kZV9vcmRlcltucl9ub2RlcyYjNDM7JiM0MztdID0gbm9kZTsKJiM0MzsJCXpvbmVyZWZzICYjNDM7PSBidWlsZF96b25lcmVmc19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZXJlZnMpOwomIzQzOwkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlKTsKIAkJcHJldl9ub2RlID0gbm9kZTsKIAl9CiAKLQlidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpOwotCWJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7Ci0JcHJfaW5mbygmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiAmIzM0OywgbG9jYWxfbm9kZSk7Ci0JZm9yIChub2RlID0gMDsgbm9kZSAmbHQ7IG5yX25vZGVzOyBub2RlJiM0MzsmIzQzOykKLQkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlX29yZGVyW25vZGVdKTsKJiM0MzsJem9uZXJlZnMtJmd0O3pvbmUgPSBOVUxMOwomIzQzOwl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogCXByX2NvbnQoJiMzNDtcbiYjMzQ7KTsKIH0KIAomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQomIzQzO3sKJiM0MzsJYnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgJmFtcDtub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTsKJiM0MzsJYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTsKJiM0Mzt9CiYjNDM7CiAjaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFUwogLyoKICAqIFJldHVybiBub2RlIGlkIG9mIG5vZGUgdXNlZCBmb3IgJiMzNDtsb2NhbCYjMzQ7IGFsbG9jYXRpb25zLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzA4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaWRlbnRpZnkgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2VzLiBUaGUgZGlmZiB0b3VjaGVzIGBtbS9pbnRlcm5hbC5oYCwgYG1tL21lbW9yeS10aWVycy5jYCwgYW5kIGBtbS9wYWdlX2FsbG9jLmNgLiBUaGlzIHN1Z2dlc3RzIGl0JiMzOTtzIGxpa2VseSByZWxhdGVkIHRvIG1lbW9yeSBub2RlIHNlbGVjdGlvbiBvciB6b25lIG1hbmFnZW1lbnQgd2l0aGluIE5VTUEgc3lzdGVtcywgbXkgc3BpZGV5IHNlbnNlcyBhcmUgdGluZ2xpbmcuIEkmIzM5O2xsIHByb2JhYmx5IGdyYWIgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBjb2RlLCBtYXliZSBsb29rIGF0IGZ1bmN0aW9uIGNhbGxzLgoKRmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgYSBoaWdoLWxldmVsIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCB0aGlzIHBhdGNoIGFjdHVhbGx5ICpkb2VzKi4KCjEuICAqKmBtbS9pbnRlcm5hbC5oYCoqOiBJdCBsb29rcyBsaWtlIGBmaW5kX25leHRfYmVzdF9ub2RlYCBpcyBnZXR0aW5nIGEgc2lnbmF0dXJlIGNoYW5nZSwgYmVpbmcgcmVuYW1lZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIEkgYWxzbyBzZWUgYSBzdGF0aWMgaW5saW5lIGZhbGxiYWNrIHdoZW4gYENPTkZJR19OVU1BYCAob3Igc29tZXRoaW5nIHNpbWlsYXIpIGlzbiYjMzk7dCBkZWZpbmVkLiBTZWVtcyBsaWtlIHRoZXkmIzM5O3JlIHRyeWluZyB0byBnZW5lcmFsaXplIGEgbm9kZSBzZWxlY3Rpb24gZnVuY3Rpb24gYW5kIGhhbmRsZSBub24tTlVNQSBjYXNlcyBncmFjZWZ1bGx5LgoyLiAgKipgbW0vbWVtb3J5LXRpZXJzLmNgKio6IFRoZSBgbmV4dF9kZW1vdGlvbl9ub2RlKClgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKWAgZnVuY3Rpb25zLCBub3cgY2FsbGluZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYC4gSSYjMzk7bSBndWVzc2luZyB0aGlzIHJlbGF0ZXMgdG8gbWVtb3J5IHRpZXJpbmcgcG9saWNpZXMgb3IgZGVtb3Rpb24vcHJvbW90aW9uIGRlY2lzaW9ucyB3aXRoaW4gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIFRoZSBgJmFtcDtub2RlX3N0YXRlc1tOX01FTU9SWV1gIGFyZ3VtZW50IGlzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nLgozLiAgKipgbW0vcGFnZV9hbGxvYy5jYCoqOiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIFRoZSBvcmlnaW5hbCBgZmluZF9uZXh0X2Jlc3Rfbm9kZSgpYCBpcyBnb25lLCBhbmQgbm93IGNhbGxpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAsIHRha2luZyBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBpbnN0ZWFkIG9mIGhhcmRjb2Rpbmcgbm9kZS1zdGF0ZSBjYWxscy4gVGhpcyBzdWdnZXN0cyBhIG1vcmUgZmxleGlibGUgbm9kZSBzZWxlY3Rpb24gbWVjaGFuaXNtLiBBbHNvLCB0aGUgcmVtb3ZhbC9tZXJnaW5nIG9mIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgIGlzIGludGVyZXN0aW5nLiBUaGUgYGJ1aWxkX3pvbmVsaXN0cygpYCBub3cgY2FsbHMgYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAgd2l0aCBkaWZmZXJlbnQgbm9kZW1hc2tzLiBUaGlzIGlzIGFsbCBhYm91dCB6b25lIG9yZGVyaW5nIGR1cmluZyBwYWdlIGFsbG9jYXRpb24uCgpJJiMzOTttIHN0YXJ0aW5nIHRvIHNlZSBhIHBhdHRlcm4gaGVyZTogZ2VuZXJhbGl6YXRpb24gYW5kIGEgcG90ZW50aWFsIHNoaWZ0IGluIGhvdyBub2RlbWFza3MgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGlzIGlzIGFib3V0IG1ha2luZyBub2RlIHNlbGVjdGlvbiBtb3JlIGZsZXhpYmxlLCBwb3RlbnRpYWxseSBmb3IgYmV0dGVyIE5VTUEgYXdhcmVuZXNzIG9yIHBlcmhhcHMgdG8gaW50ZWdyYXRlIGl0IGJldHRlciB3aXRoIG1lbW9yeSB0aWVyaW5nLgoKSSYjMzk7bSB0aGlua2luZyBJIHNob3VsZCBjaGVjayBhcm91bmQgbGluZXMgMTEzMC0xMTUwIGluIGBtbS9pbnRlcm5hbC5oYCB0byBzZWUgd2hhdCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBndWFyZHMgYXJlIGluIHBsYWNlLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgY29kZSBiZWhhdmVzIGluIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2ludGVybmFsLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTI1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExMjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgbWxvY2tfbmV3X2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pIHsgfVxuMTEyNjpcdHN0YXRpYyBpbmxpbmUgYm9vbCBuZWVkX21sb2NrX2RyYWluKGludCBjcHUpIHsgcmV0dXJuIGZhbHNlOyB9XG4xMTI3Olx0c3RhdGljIGlubGluZSB2b2lkIG1sb2NrX2RyYWluX2xvY2FsKHZvaWQpIHsgfVxuMTEyODpcdHN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9yZW1vdGUoaW50IGNwdSkgeyB9XG4xMTI5Olx0I2VuZGlmIC8qICFDT05GSUdfTU1VICovXG4xMTMwOlx0XG4xMTMxOlx0I2lmZGVmIENPTkZJR19OVU1BXG4xMTMyOlx0ZXh0ZXJuIGludCBub2RlX3JlY2xhaW1fbW9kZTtcbjExMzM6XHRcbjExMzQ6XHRleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbjExMzU6XHRcdFx0XHRcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XG4xMTM2Olx0aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuMTEzNzpcdFx0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcbjExMzg6XHQjZWxzZVxuMTEzOTpcdCNkZWZpbmUgbm9kZV9yZWNsYWltX21vZGUgMFxuMTE0MDpcdFxuMTE0MTpcdHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbjExNDI6XHRcdFx0XHRcdFx0IGdmcF90IG1hc2ssIHVuc2lnbmVkIGludCBvcmRlcilcbjExNDM6XHR7XG4xMTQ0Olx0XHRyZXR1cm4gMDtcbjExNDU6XHR9XG4xMTQ2Olx0c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4xMTQ3Olx0XHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4xMTQ4Olx0e1xuMTE0OTpcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbjExNTA6XHR9XG4xMTUxOlx0I2VuZGlmXG4xMTUyOlx0XG4xMTUzOlx0c3RhdGljIGlubGluZSBib29sIG5vZGVfcmVjbGFpbV9lbmFibGVkKHZvaWQpXG4xMTU0Olx0e1xuMTE1NTpcdFx0LyogSXMgYW55IG5vZGVfcmVjbGFpbV9tb2RlIGJpdCBzZXQ/ICovXG4xMTU2Olx0XHRyZXR1cm4gbm9kZV9yZWNsYWltX21vZGUgXHUwMDI2IChSRUNMQUlNX1pPTkV8UkVDTEFJTV9XUklURXxSRUNMQUlNX1VOTUFQKTtcbjExNTc6XHR9XG4xMTU4Olx0XG4xMTU5Olx0LypcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODkzCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBOVU1BIENvbmZpZ3VyYXRpb24gaW4gTWVtb3J5IE1hbmFnZW1lbnQqKgoKQWxyaWdodCwgc28gYENPTkZJR19OVU1BYCBpcyB0aGUga2V5IGNvbmZpZ3VyYXRpb24gZ3VhcmQgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBoZXJlLCBzcGVjaWZpY2FsbHkgZGVmaW5lZCB3aXRoaW4gYG1tL2ludGVybmFsLmhgLiBNeSBpbW1lZGlhdGUgZm9jdXMgc2hpZnRzIHRvIGhvdyB0aGlzIGltcGFjdHMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGNvbXBvbmVudHMsIGFuZCBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9wYWdlX2FsbG9jLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGlsYXRpb24gY29uZGl0aW9ucyBhbmQgaG93IHRoaXMgYENPTkZJR19OVU1BYCBmbGFnIGluZmx1ZW5jZXMgdGhlIGNvZGUgcGF0aHMgd2l0aGluIHRob3NlIGZpbGVzLiBJJiMzOTtsbCB6ZXJvIGluIG9uIGBtbS9tZW1vcnktdGllcnMuY2AsIHNwZWNpZmljYWxseSBzY3J1dGluaXppbmcgdGhlIGNvZGUgYmV0d2VlbiBsaW5lcyAzNjAgYW5kIDQ4MC4gVGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IHJlZ2lvbiB0byBmaW5kIHRoZSByZWxldmFudCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBsb2dpYywgd2hpY2ggc2hvdWxkIGlsbHVtaW5hdGUgaG93IE5VTUEtYXdhcmUgbWVtb3J5IHRpZXJpbmcgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQuIExldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSB3aGF0IHdlIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzYwOlx0XHQgKiBsYXN0IHRhcmdldCBub2RlLiBPciBpbnRyb2R1Y2luZyBwZXItY3B1IGRhdGEgdG8gYXZvaWRcbiAzNjE6XHRcdCAqIGNhY2hpbmcgaXNzdWUsIHdoaWNoIHNlZW1zIG1vcmUgY29tcGxpY2F0ZWQuIFNvIHNlbGVjdGluZ1xuIDM2MjpcdFx0ICogdGFyZ2V0IG5vZGUgcmFuZG9tbHkgc2VlbXMgYmV0dGVyIHVudGlsIG5vdy5cbiAzNjM6XHRcdCAqL1xuIDM2NDpcdFx0aWYgKCFub2Rlc19lbXB0eShtYXNrKSlcbiAzNjU6XHRcdFx0cmV0dXJuIG5vZGVfcmFuZG9tKFx1MDAyNm1hc2spO1xuIDM2NjpcdFxuIDM2NzpcdFx0LypcbiAzNjg6XHRcdCAqIFByZWZlcnJlZCBub2RlcyBhcmUgbm90IGluIGFsbG93ZWRfbWFzay4gRmxpcCBiaXRzIGluXG4gMzY5Olx0XHQgKiBhbGxvd2VkX21hc2sgYXMgdXNlZCBub2RlIG1hc2suIFRoZW4sIHVzZSBpdCB0byBnZXQgdGhlXG4gMzcwOlx0XHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cbiAzNzE6XHRcdCAqL1xuIDM3MjpcdFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcbiAzNzM6XHRcdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNm1hc2ssIFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XG4gMzc0Olx0fVxuIDM3NTpcdFxuIDM3NjpcdHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZClcbiAzNzc6XHR7XG4gMzc4Olx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMzc5Olx0XHRpbnQgbm9kZTtcbiAzODA6XHRcbiAzODE6XHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcbiAzODI6XHRcdFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcbiAzODM6XHRcdFx0LypcbiAzODQ6XHRcdFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxuIDM4NTpcdFx0XHQgKiB0byBhY2Nlc3MgcGdkYS1cdTAwM2VtZW10aWVyLlxuIDM4NjpcdFx0XHQgKi9cbiAzODc6XHRcdFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XG4gMzg4Olx0XHRcdGlmIChtZW10aWVyKVxuIDM4OTpcdFx0XHRcdG1lbXRpZXItXHUwMDNlbG93ZXJfdGllcl9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG4gMzkwOlx0XHR9XG4gMzkxOlx0XHQvKlxuIDM5MjpcdFx0ICogRW5zdXJlIHRoYXQgdGhlIFwmIzM0O2Rpc2FibGVcJiMzNDsgaXMgdmlzaWJsZSBhY3Jvc3MgdGhlIHN5c3RlbS5cbiAzOTM6XHRcdCAqIFJlYWRlcnMgd2lsbCBzZWUgZWl0aGVyIGEgY29tYmluYXRpb24gb2YgYmVmb3JlJiM0MztkaXNhYmxlXG4gMzk0Olx0XHQgKiBzdGF0ZSBvciBkaXNhYmxlJiM0MzthZnRlci4gIFRoZXkgd2lsbCBuZXZlciBzZWUgYmVmb3JlIGFuZFxuIDM5NTpcdFx0ICogYWZ0ZXIgc3RhdGUgdG9nZXRoZXIuXG4gMzk2Olx0XHQgKi9cbiAzOTc6XHRcdHN5bmNocm9uaXplX3JjdSgpO1xuIDM5ODpcdH1cbiAzOTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NzYzCgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyB0aGUgTWVtb3J5IFRpZXJzIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBkaWcgaW50byB0aGUgYG1tL21lbW9yeS10aWVycy5jYCBpbXBsZW1lbnRhdGlvbi4gVGhlIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgaXMgYWx3YXlzIHRoZSBidWlsZCBzeXN0ZW0sIHNvIGxldCYjMzk7cyBjaGVjayB0aGUgS2NvbmZpZyBhbmQgTWFrZWZpbGUgZm9yIHRoYXQgcGFydGljdWxhciBmaWxlLiBUaGUga2V5IGhlcmUgaXMgdG8gdW5kZXJzdGFuZCBob3cgaXQmIzM5O3MgY29uZmlndXJlZCBhbmQgYnVpbHQsIHdoaWNoIHdpbGwgdGVsbCBtZSBhIGxvdCBhYm91dCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBhbnkgYXNzb2NpYXRlZCBmZWF0dXJlIGZsYWdzLiBOb3csIHRvIHF1aWNrbHkgbG9jYXRlIHRoZSByZWxldmFudCBzZWN0aW9ucywgSSYjMzk7bGwgdXNlIGBncmVwYC4gSSYjMzk7bGwgc2VhcmNoIHNwZWNpZmljYWxseSBmb3IgJiMzNDttZW1vcnktdGllcnMmIzM0OyB3aXRoaW4gdGhvc2UgY29uZmlndXJhdGlvbiBmaWxlcy4gVGhpcyBzaG91bGQgcXVpY2tseSBoaWdobGlnaHQgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgaG93IHRoZSBtb2R1bGUgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGJ1aWxkLiBUaGlzIGFwcHJvYWNoIGlzIGVmZmljaWVudCDigJMgc3RhcnRpbmcgYXQgdGhlIGJ1aWxkIHN5c3RlbSBnaXZlcyBtZSBjb250ZXh0IGFuZCBtYWtlcyBzdXJlIEkgZG9uJiMzOTt0IG1pc3MgYW55dGhpbmcgdGhhdCBlbmFibGVzIG9yIGRpc2FibGVzIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbW9yeS10aWVycyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlLm9cbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4tLVxubW0vZGFtb24vcGFkZHIuYy0xMi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2Vcbm1tL2RhbW9uL3BhZGRyLmM6MTM6I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2Vcbm1tL2RhbW9uL3BhZGRyLmMtMTQtI2luY2x1ZGUgXHUwMDNjbGludXgvbW1faW5saW5lLmhcdTAwM2Vcbi0tXG5tbS9odWdlX21lbW9yeS5jLTM4LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3N5c2N0bC5oXHUwMDNlXG5tbS9odWdlX21lbW9yeS5jOjM5OiNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXHUwMDNlXG5tbS9odWdlX21lbW9yeS5jLTQwLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBhdC5oXHUwMDNlXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnkuaFx1MDAzZVxubW0vbWVtb3J5LXRpZXJzLmM6NzojaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxubW0vbWVtb3J5LXRpZXJzLmMtOC0jaW5jbHVkZSBcdTAwM2NsaW51eC9ub3RpZmllci5oXHUwMDNlXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NzQ3PWludCBtdF9zZXRfZGVmYXVsdF9kcmFtX3BlcmYoaW50IG5pZCwgc3RydWN0IGFjY2Vzc19jb29yZGluYXRlICpwZXJmLFxuLS1cbm1tL21lbW9yeS10aWVycy5jLTc3OS1cdFx0cHJfaW5mbyhcbm1tL21lbW9yeS10aWVycy5jOjc4MDpcJiMzNDttZW1vcnktdGllcnM6IHRoZSBwZXJmb3JtYW5jZSBvZiBEUkFNIG5vZGUgJWQgbWlzbWF0Y2hlcyB0aGF0IG9mIHRoZSByZWZlcmVuY2VcXG5cJiMzNDtcbm1tL21lbW9yeS10aWVycy5jLTc4MS1cJiMzNDtEUkFNIG5vZGUgJWQuXFxuXCYjMzQ7LCBuaWQsIGRlZmF1bHRfZHJhbV9wZXJmX3JlZl9uaWQpO1xuLS1cbm1tL21lbW9yeS5jLTY4LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NobWVtX2ZzLmhcdTAwM2Vcbm1tL21lbW9yeS5jOjY5OiNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXHUwMDNlXG5tbS9tZW1vcnkuYy03MC0jaW5jbHVkZSBcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcdTAwM2Vcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMDItI2luY2x1ZGUgXHUwMDNjbGludXgvcHJvY19mcy5oXHUwMDNlXG5tbS9tZW1wb2xpY3kuYzoxMDM6I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2Vcbm1tL21lbXBvbGljeS5jLTEwNC0jaW5jbHVkZSBcdTAwM2NsaW51eC9taWdyYXRlLmhcdTAwM2Vcbi0tXG5tbS9taWdyYXRlLmMtNDMtI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc3lzY3RsLmhcdTAwM2Vcbm1tL21pZ3JhdGUuYzo0NDojaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxubW0vbWlncmF0ZS5jLTQ1LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2V3YWxrLmhcdTAwM2Vcbi0tXG5tbS92bXNjYW4uYy00NC0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNjdGwuaFx1MDAzZVxubW0vdm1zY2FuLmM6NDU6I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2Vcbm1tL3Ztc2Nhbi5jLTQ2LSNpbmNsdWRlIFx1MDAzY2xpbnV4L29vbS5oXHUwMDNlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODY1NAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDgwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgYW4gZXhwZXJ0IGluIHRoaXMgYXJlYToKCioqSW52ZXN0aWdhdGluZyBOVU1BIGFuZCBNZW1vcnkgRGVtb3Rpb24qKgoKT2theSwgc28gYG1lbW9yeS10aWVycy5vYCBpcyBvbmx5IGJyb3VnaHQgaW50byB0aGUgcGljdHVyZSB3aGVuIE5VTUEgc3VwcG9ydCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBhcyBtZW1vcnkgdGllcmluZyBpcyBhIGNvcmUgTlVNQS1yZWxhdGVkIG9wdGltaXphdGlvbi4gTXkgbmV4dCBzdGVwIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdywgc28gSSYjMzk7bGwgdHJhY2UgYSBmZXcga2V5IGZ1bmN0aW9ucy4gSSB3YW50IHRvIHNlZSBob3cgdGhlIGRlbW90aW9uIHByb2Nlc3MgaXMga2lja2VkIG9mZiBhbmQgbWFuYWdlZC4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8ga25vdyB3aGVyZSBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBhcmUgKmNhbGxlZCouIFRoZXNlIGFyZSBjbGVhcmx5IGNyaXRpY2FsIHRvIHRoZSBhY3R1YWwgZGVtb3Rpb24gZGVjaXNpb25zIGFuZCB0YXJnZXQgc2V0dXAuIEFuZCwgbGV0JiMzOTtzIG5vdCBmb3JnZXQgaG93IHRoZXNlIHpvbmVzIGdldCBzZXQgdXAgLSBJIHNob3VsZCBsb29rIGludG8gd2hlcmUgYGJ1aWxkX3pvbmVsaXN0c2AgaXMgY2FsbGVkLiBJdCYjMzk7cyB0aW1lIHRvIGdldCBkb3duIGFuZCBkaXJ0eSB3aXRoIHNvbWUgYGdyZXBgIGFjdGlvbiB0byBmaW5kIHRob3NlIGNhbGwgc2l0ZXMuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB0aGUgb3ZlcmFsbCBleGVjdXRpb24gcGF0aC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmV4dF9kZW1vdGlvbl9ub2RlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg9NTQ9dm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTU1LSNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg6NTY6aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTtcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgtNTctdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cyk7XG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oPTU4PWJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgtNTktI2Vsc2VcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg6NjA6c3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTYxLXtcbi0tXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oPTk5PXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ub2RlX21lbW9yeV90eXBlKGludCBub2RlLCBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlKVxuLS1cbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgtMTAzLVxuaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaDoxMDQ6c3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTEwNS17XG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MzAyPXZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtMzIwLS8qKlxubW0vbWVtb3J5LXRpZXJzLmM6MzIxOiAqIG5leHRfZGVtb3Rpb25fbm9kZSgpIC0gR2V0IHRoZSBuZXh0IG5vZGUgaW4gdGhlIGRlbW90aW9uIHBhdGhcbm1tL21lbW9yeS10aWVycy5jLTMyMi0gKiBAbm9kZTogVGhlIHN0YXJ0aW5nIG5vZGUgdG8gbG9va3VwIHRoZSBuZXh0IG5vZGVcbi0tXG5tbS9tZW1vcnktdGllcnMuYy0zMjktICovXG5tbS9tZW1vcnktdGllcnMuYzozMzA6aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxubW0vbWVtb3J5LXRpZXJzLmMtMzMxLXtcbi0tXG5tbS92bXNjYW4uYz0xMDcxPXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVtb3RlX2ZvbGlvX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqZGVtb3RlX2ZvbGlvcyxcbi0tXG5tbS92bXNjYW4uYy0xMDk4LVxubW0vdm1zY2FuLmM6MTA5OTpcdHRhcmdldF9uaWQgPSBuZXh0X2RlbW90aW9uX25vZGUocGdkYXQtXHUwMDNlbm9kZV9pZCwgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbm1tL3Ztc2Nhbi5jLTExMDAtXHRpZiAodGFyZ2V0X25pZCA9PSBOVU1BX05PX05PREUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk1OTkKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA4OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGBuZXh0X2RlbW90aW9uX25vZGVgIGluIHRoZSBWTXNjYW4gQ29udGV4dCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBzcG90dGVkIHRoYXQgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgaW52b2tlZCB3aXRoaW4gYGRlbW90ZV9mb2xpb19saXN0YCBpbnNpZGUgYG1tL3Ztc2Nhbi5jYC4gSW1tZWRpYXRlbHksIG15IGV4cGVydCBicmFpbiBpcyBmaXJpbmcgb2ZmIHBvdGVudGlhbCBkZXBlbmRlbmNpZXMuIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgcHJlcmVxdWlzaXRlcy4gVGhlIHF1ZXN0aW9uIHRoYXQgaGFzIHNwcnVuZyB0byBtaW5kIGlzIHdoZXRoZXIgYENPTkZJR19OVU1BX01JR1JBVElPTmAgaXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGBuZXh0X2RlbW90aW9uX25vZGVgIGZ1bmN0aW9uLiBJICpiZWxpZXZlKiBpdOKAmXMgZGVmaW5lZCBpbiBgaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaGAgYnV0IEkgbmVlZCB0byBxdWlja2x5IHZlcmlmeSB0aGF0LiBMZXQmIzM5O3MganVtcCBvdmVyIHRvIHRoYXQgaGVhZGVyIGZpbGUsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA1MCwgdG8gY29uZmlybS4gVGltZSB0byBkaWcgaW4gYW5kIGNsYXJpZnkgdGhpcyBxdWlja2x5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDQwOlx0ZXh0ZXJuIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKmRlZmF1bHRfZHJhbV90eXBlO1xuICA0MTpcdGV4dGVybiBub2RlbWFza190IGRlZmF1bHRfZHJhbV9ub2RlcztcbiAgNDI6XHRzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICphbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3RhbmNlKTtcbiAgNDM6XHR2b2lkIHB1dF9tZW1vcnlfdHlwZShzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlKTtcbiAgNDQ6XHR2b2lkIGluaXRfbm9kZV9tZW1vcnlfdHlwZShpbnQgbm9kZSwgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqZGVmYXVsdF90eXBlKTtcbiAgNDU6XHR2b2lkIGNsZWFyX25vZGVfbWVtb3J5X3R5cGUoaW50IG5vZGUsIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm1lbXR5cGUpO1xuICA0NjpcdGludCByZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpO1xuICA0NzpcdGludCB1bnJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7XG4gIDQ4Olx0aW50IG10X2NhbGNfYWRpc3RhbmNlKGludCBub2RlLCBpbnQgKmFkaXN0KTtcbiAgNDk6XHRpbnQgbXRfc2V0X2RlZmF1bHRfZHJhbV9wZXJmKGludCBuaWQsIHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZixcbiAgNTA6XHRcdFx0XHQgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSk7XG4gIDUxOlx0aW50IG10X3BlcmZfdG9fYWRpc3RhbmNlKHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZiwgaW50ICphZGlzdCk7XG4gIDUyOlx0c3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3QsXG4gIDUzOlx0XHRcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xuICA1NDpcdHZvaWQgbXRfcHV0X21lbW9yeV90eXBlcyhzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xuICA1NTpcdCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbiAgNTY6XHRpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spO1xuICA1NzpcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpO1xuICA1ODpcdGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcbiAgNTk6XHQjZWxzZVxuICA2MDpcdHN0YXRpYyBpbmxpbmUgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxuICA2MTpcdHtcbiAgNjI6XHRcdHJldHVybiBOVU1BX05PX05PREU7XG4gIDYzOlx0fVxuICA2NDpcdFxuICA2NTpcdHN0YXRpYyBpbmxpbmUgdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cylcbiAgNjY6XHR7XG4gIDY3Olx0XHQqdGFyZ2V0cyA9IE5PREVfTUFTS19OT05FO1xuICA2ODpcdH1cbiAgNjk6XHRcbiAgNzA6XHRzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxuICA3MTpcdHtcbiAgNzI6XHRcdHJldHVybiB0cnVlO1xuICA3MzpcdH1cbiAgNzQ6XHQjZW5kaWZcbiAgNzU6XHRcbiAgNzY6XHQjZWxzZVxuICA3NzpcdFxuICA3ODpcdCNkZWZpbmUgbnVtYV9kZW1vdGlvbl9lbmFibGVkXHRmYWxzZVxuICA3OTpcdCNkZWZpbmUgZGVmYXVsdF9kcmFtX3R5cGVcdE5VTExcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA1ODYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhhdCBjb2RlIHNuaXBwZXQ6CgoqKkRpdmluZyBpbnRvIG1lbW9yeS10aWVycy5jKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBhIHNwZWNpZmljIHBpZWNlIG9mIGNvZGUgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBoYW5kbGVkLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCYjMzk7cyBhY3RpdmUuIE15IGluaXRpYWwgaHlwb3RoZXNpcyBpcyB0aGF0IGl0JiMzOTtzIGdvdmVybmVkIGJ5IHRoZSBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBwcmVwcm9jZXNzb3IgZGVmaW5lLgoKVG8gY29uZmlybSB0aGlzLCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIHJlbGV2YW50IHNlY3Rpb24uIEkgcmVjYWxsIHRoZSBkaXNjdXNzaW9uIGFyb3VuZCB0aGlzIGFyZWEsIHNvIGxldCYjMzk7cyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGxpbmVzIDMwMCB0byA0ODAgaW4gYG1tL21lbW9yeS10aWVycy5jYC4gVGhhdCBjaHVuayBzaG91bGQgY29udGFpbiB0aGUgY3JpdGljYWwgbG9naWMgSSYjMzk7bSBpbnRlcmVzdGVkIGluLCBhbmQgaG9wZWZ1bGx5LCB0aGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdCBjb250cm9sIGl0cyBleGVjdXRpb24gYXJlIGNsZWFybHkgdmlzaWJsZSB3aXRoaW4gdGhhdCByYW5nZS4gRnJvbSB0aGVyZSwgSSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBteSBpbml0aWFsIHRob3VnaHQgYWJvdXQgYENPTkZJR19OVU1BX01JR1JBVElPTmAgaXMgY29ycmVjdCBvciBpZiBhbm90aGVyIGNvbmRpdGlvbmFsIGlzIGF0IHBsYXkuIFRoaXMgaW5mb3JtYXRpb24gaXMga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIHNwZWNpZmljIGJlaGF2aW91ciBpbiBxdWVzdGlvbiwgZXNwZWNpYWxseSBpbiB0aGlzIGNvbnRleHQsIHNvIEkmIzM5O2xsIGRvdWJsZSBjaGVjayB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzAwOlx0fVxuIDMwMTpcdFxuIDMwMjpcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXG4gMzAzOlx0e1xuIDMwNDpcdFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuIDMwNTpcdFxuIDMwNjpcdFx0LypcbiAzMDc6XHRcdCAqIHBnX2RhdGFfdC5tZW10aWVyIHVwZGF0ZXMgaW5jbHVkZXMgYSBzeW5jaHJvbml6ZV9yY3UoKVxuIDMwODpcdFx0ICogd2hpY2ggZW5zdXJlcyB0aGF0IHdlIGVpdGhlciBmaW5kIE5VTEwgb3IgYSB2YWxpZCBtZW10aWVyXG4gMzA5Olx0XHQgKiBpbiBOT0RFX0RBVEEuIHByb3RlY3QgdGhlIGFjY2VzcyB2aWEgcmN1X3JlYWRfbG9jaygpO1xuIDMxMDpcdFx0ICovXG4gMzExOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gMzEyOlx0XHRtZW10aWVyID0gcmN1X2RlcmVmZXJlbmNlKHBnZGF0LVx1MDAzZW1lbXRpZXIpO1xuIDMxMzpcdFx0aWYgKG1lbXRpZXIpXG4gMzE0Olx0XHRcdCp0YXJnZXRzID0gbWVtdGllci1cdTAwM2Vsb3dlcl90aWVyX21hc2s7XG4gMzE1Olx0XHRlbHNlXG4gMzE2Olx0XHRcdCp0YXJnZXRzID0gTk9ERV9NQVNLX05PTkU7XG4gMzE3Olx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiAzMTg6XHR9XG4gMzE5Olx0XG4gMzIwOlx0LyoqXG4gMzIxOlx0ICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aFxuIDMyMjpcdCAqIEBub2RlOiBUaGUgc3RhcnRpbmcgbm9kZSB0byBsb29rdXAgdGhlIG5leHQgbm9kZVxuIDMyMzpcdCAqIEBhbGxvd2VkX21hc2s6IFRoZSBwb2ludGVyIHRvIGFsbG93ZWQgbm9kZSBtYXNrXG4gMzI0Olx0ICpcbiAzMjU6XHQgKiBSZXR1cm46IG5vZGUgaWQgZm9yIG5leHQgbWVtb3J5IG5vZGUgaW4gdGhlIGRlbW90aW9uIHBhdGggaGllcmFyY2h5XG4gMzI2Olx0ICogZnJvbSBAbm9kZTsgTlVNQV9OT19OT0RFIGlmIEBub2RlIGlzIHRlcm1pbmFsLiAgVGhpcyBkb2VzIG5vdCBrZWVwXG4gMzI3Olx0ICogQG5vZGUgb25saW5lIG9yIGd1YXJhbnRlZSB0aGF0IGl0ICpjb250aW51ZXMqIHRvIGJlIHRoZSBuZXh0IGRlbW90aW9uXG4gMzI4Olx0ICogdGFyZ2V0LlxuIDMyOTpcdCAqL1xuIDMzMDpcdGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbiAzMzE6XHR7XG4gMzMyOlx0XHRzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMgKm5kO1xuIDMzMzpcdFx0bm9kZW1hc2tfdCBtYXNrO1xuIDMzNDpcdFxuIDMzNTpcdFx0aWYgKCFub2RlX2RlbW90aW9uKVxuIDMzNjpcdFx0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuIDMzNzpcdFxuIDMzODpcdFx0bmQgPSBcdTAwMjZub2RlX2RlbW90aW9uW25vZGVdO1xuIDMzOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTUxNQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuCgoqKkludmVzdGlnYXRpbmcgTWVtb3J5IFRpZXIgR3VhcmRzKioKCkFscmlnaHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGFyb3VuZCBsaW5lIDMzMCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaGF0IGZ1bmN0aW9uIGNhbGwsIG9yIHdoYXRldmVyIGxvZ2ljIHJlc2lkZXMgdGhlcmUsIHNlZW1zIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IGEgZGVlcGVyIGxvb2suIEJlZm9yZSBJIGp1bXAgKmRpcmVjdGx5KiB0byAzMzAgdGhvdWdoLCBsZXQmIzM5O3MgZ2l2ZSBteXNlbGYgc29tZSBjb250ZXh0LiBJJiMzOTtsbCB0YWtlIGEgcGVlayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSwgc2F5IGxpbmVzIDI4MCB0aHJvdWdoIDMwMC4gS25vd2luZyB0aGUgKndoYXQqIGFyb3VuZCB0aGUgKndoZXJlKiBpcyBhbHdheXMgYSBzbWFydCBtb3ZlIHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqLiBUaGlzIHF1aWNrIHNjYW4gc2hvdWxkIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgb3ZlcmFsbCBmbG93IGFuZCBhbnkgc3Vycm91bmRpbmcgZ3VhcmQgY29uZGl0aW9ucyBvciBsb2dpYyB0aGF0IG1pZ2h0IGJlIHJlbGV2YW50LiBJdCYjMzk7cyB0aW1lIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBuZWlnaGJvcmhvb2QgYXJvdW5kIGxpbmUgMzMwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyODA6XHRcdHBnX2RhdGFfdCAqcGdkYXQ7XG4gMjgxOlx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMjgyOlx0XG4gMjgzOlx0XHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcbiAyODQ6XHRcdGlmICghcGdkYXQpXG4gMjg1Olx0XHRcdHJldHVybiBmYWxzZTtcbiAyODY6XHRcbiAyODc6XHRcdHJjdV9yZWFkX2xvY2soKTtcbiAyODg6XHRcdG1lbXRpZXIgPSByY3VfZGVyZWZlcmVuY2UocGdkYXQtXHUwMDNlbWVtdGllcik7XG4gMjg5Olx0XHRpZiAoIW1lbXRpZXIpIHtcbiAyOTA6XHRcdFx0dG9wdGllciA9IHRydWU7XG4gMjkxOlx0XHRcdGdvdG8gb3V0O1xuIDI5MjpcdFx0fVxuIDI5MzpcdFx0aWYgKG1lbXRpZXItXHUwMDNlYWRpc3RhbmNlX3N0YXJ0IFx1MDAzYz0gdG9wX3RpZXJfYWRpc3RhbmNlKVxuIDI5NDpcdFx0XHR0b3B0aWVyID0gdHJ1ZTtcbiAyOTU6XHRcdGVsc2VcbiAyOTY6XHRcdFx0dG9wdGllciA9IGZhbHNlO1xuIDI5NzpcdG91dDpcbiAyOTg6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIDI5OTpcdFx0cmV0dXJuIHRvcHRpZXI7XG4gMzAwOlx0fVxuIDMwMTpcdFxuIDMwMjpcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXG4gMzAzOlx0e1xuIDMwNDpcdFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjA5NwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSW52ZXN0aWdhdGluZyBNZW1vcnkgVGllciBHdWFyZHJhaWxzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGluLiBNeSBmb2N1cyByaWdodCBub3cgaXMgb24gdGhlIG1lbW9yeSB0aWVyaW5nIGltcGxlbWVudGF0aW9uIHdpdGhpbiB0aGUga2VybmVsLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMjcwIG9mIGBtbS9tZW1vcnktdGllcnMuY2AuIEkmIzM5O20gZ29pbmcgdG8gY2FyZWZ1bGx5IHNjcnV0aW5pemUgdGhlIGd1YXJkIGNvbmRpdGlvbnMgc3Vycm91bmRpbmcgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBjb2RlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHByb3RlY3Rpb25zIGFyZSBpbiBwbGFjZSB0byBwcmV2ZW50IHBvdGVudGlhbCBpc3N1ZXMsIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgcmFjZSBjb25kaXRpb25zLCBvciBpbmNvcnJlY3QgdGllciBhc3NpZ25tZW50cy4gTXkgcHJpbWFyeSBnb2FsIGhlcmUgaXMgdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCB3ZWFrbmVzc2VzIG9yIGFyZWFzIHdoZXJlIG9wdGltaXphdGlvbnMgbWlnaHQgYmUgcG9zc2libGUuIEkmIzM5O2xsIG5lZWQgdG8gY29uc2lkZXIgaG93IHRoZXNlIGd1YXJkcyBpbnRlcmFjdCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0sIHRha2luZyBpbnRvIGFjY291bnQgYW55IHJlbGV2YW50IGxvY2tpbmcgbWVjaGFuaXNtcywgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgYW5kIGNvbmN1cnJlbnQgYWNjZXNzIHBhdHRlcm5zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjYwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNjA6XHRzdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxuIDI2MTpcdHtcbiAyNjI6XHRcdHBnX2RhdGFfdCAqcGdkYXQ7XG4gMjYzOlx0XG4gMjY0Olx0XHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcbiAyNjU6XHRcdGlmICghcGdkYXQpXG4gMjY2Olx0XHRcdHJldHVybiBOVUxMO1xuIDI2NzpcdFx0LypcbiAyNjg6XHRcdCAqIFNpbmNlIHdlIGhvbGQgbWVtb3J5X3RpZXJfbG9jaywgd2UgY2FuIGF2b2lkXG4gMjY5Olx0XHQgKiBSQ1UgcmVhZCBsb2NrcyB3aGVuIGFjY2Vzc2luZyB0aGUgZGV0YWlscy4gTm9cbiAyNzA6XHRcdCAqIHBhcmFsbGVsIHVwZGF0ZXMgYXJlIHBvc3NpYmxlIGhlcmUuXG4gMjcxOlx0XHQgKi9cbiAyNzI6XHRcdHJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2socGdkYXQtXHUwMDNlbWVtdGllcixcbiAyNzM6XHRcdFx0XHRcdCAgICAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNm1lbW9yeV90aWVyX2xvY2spKTtcbiAyNzQ6XHR9XG4gMjc1Olx0XG4gMjc2Olx0I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxuIDI3NzpcdGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxuIDI3ODpcdHtcbiAyNzk6XHRcdGJvb2wgdG9wdGllcjtcbiAyODA6XHRcdHBnX2RhdGFfdCAqcGdkYXQ7XG4gMjgxOlx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMjgyOlx0XG4gMjgzOlx0XHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcbiAyODQ6XHRcdGlmICghcGdkYXQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNjgxCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBOVU1BIE1pZ3JhdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIEkgc2VlIHRoaXMgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGd1YXJkIGFyb3VuZCBhIGJsb2NrIG9mIGNvZGUsIHN0YXJ0aW5nIGFyb3VuZCBsaW5lIDI3Ni4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoaXMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZS4gV2hlcmUgZG9lcyBpdCBlbmQgaW4gYG1tL21lbW9yeS10aWVycy5jYD8gSXQmIzM5O3MgZXNzZW50aWFsIHRvIHVuZGVyc3RhbmQgd2hpY2ggcGFydHMgb2YgdGhlIGNvZGUgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgYmFzZWQgb24gdGhlIE5VTUEgbWlncmF0aW9uIGNvbmZpZ3VyYXRpb24uIExldCBtZSBxdWlja2x5IGp1bXAgdG8gbGluZXMgNDgwLTUzMCB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGAjZW5kaWZgIG9yIHRoZSBuZXh0IGRlZmluaW5nIGBpZmRlZmAgb3IgYGlmbmRlZmAsIG9yIGBlbHNlYC4gVGhhdCBzaG91bGQgY2xhcmlmeSB3aGF0IGZhbGxzIHdpdGhpbiB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gc2NvcGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtb3J5LXRpZXJzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0ODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQ4MDpcdFx0LypcbiA0ODE6XHRcdCAqIFByb21vdGlvbiBpcyBhbGxvd2VkIGZyb20gYSBtZW1vcnkgdGllciB0byBoaWdoZXJcbiA0ODI6XHRcdCAqIG1lbW9yeSB0aWVyIG9ubHkgaWYgdGhlIG1lbW9yeSB0aWVyIGRvZXNuJiMzOTt0IGluY2x1ZGVcbiA0ODM6XHRcdCAqIGNvbXB1dGUuIFdlIHdhbnQgdG8gc2tpcCBwcm9tb3Rpb24gZnJvbSBhIG1lbW9yeSB0aWVyLFxuIDQ4NDpcdFx0ICogaWYgYW55IG5vZGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZW1vcnkgdGllciBoYXZlIENQVXMuXG4gNDg1Olx0XHQgKiBPbmNlIHdlIGRldGVjdCBzdWNoIGEgbWVtb3J5IHRpZXIsIHdlIGNvbnNpZGVyIHRoYXQgdGllclxuIDQ4NjpcdFx0ICogYXMgdG9wIHRpcGVyIGZyb20gd2hpY2ggcHJvbW90aW9uIGlzIG5vdCBhbGxvd2VkLlxuIDQ4NzpcdFx0ICovXG4gNDg4Olx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UobWVtdGllciwgXHUwMDI2bWVtb3J5X3RpZXJzLCBsaXN0KSB7XG4gNDg5Olx0XHRcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcbiA0OTA6XHRcdFx0aWYgKG5vZGVzX2FuZCh0aWVyX25vZGVzLCBub2RlX3N0YXRlc1tOX0NQVV0sIHRpZXJfbm9kZXMpKSB7XG4gNDkxOlx0XHRcdFx0LypcbiA0OTI6XHRcdFx0XHQgKiBhYnN0cmFjdCBkaXN0YW5jZSBiZWxvdyB0aGUgbWF4IHZhbHVlIG9mIHRoaXMgbWVtdGllclxuIDQ5MzpcdFx0XHRcdCAqIGlzIGNvbnNpZGVyZWQgdG9wdGllci5cbiA0OTQ6XHRcdFx0XHQgKi9cbiA0OTU6XHRcdFx0XHR0b3BfdGllcl9hZGlzdGFuY2UgPSBtZW10aWVyLVx1MDAzZWFkaXN0YW5jZV9zdGFydCAmIzQzO1xuIDQ5NjpcdFx0XHRcdFx0XHRcdE1FTVRJRVJfQ0hVTktfU0laRSAtIDE7XG4gNDk3Olx0XHRcdFx0YnJlYWs7XG4gNDk4Olx0XHRcdH1cbiA0OTk6XHRcdH1cbiA1MDA6XHRcdC8qXG4gNTAxOlx0XHQgKiBOb3cgYnVpbGQgdGhlIGxvd2VyX3RpZXIgbWFzayBmb3IgZWFjaCBub2RlIGNvbGxlY3Rpbmcgbm9kZSBtYXNrIGZyb21cbiA1MDI6XHRcdCAqIGFsbCBtZW1vcnkgdGllciBiZWxvdyBpdC4gVGhpcyBhbGxvd3MgdXMgdG8gZmFsbGJhY2sgZGVtb3Rpb24gcGFnZVxuIDUwMzpcdFx0ICogYWxsb2NhdGlvbiB0byBhIHNldCBvZiBub2RlcyB0aGF0IGlzIGNsb3NlciB0aGUgYWJvdmUgc2VsZWN0ZWRcbiA1MDQ6XHRcdCAqIHByZWZlcnJlZCBub2RlLlxuIDUwNTpcdFx0ICovXG4gNTA2Olx0XHRsb3dlcl90aWVyID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldO1xuIDUwNzpcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeShtZW10aWVyLCBcdTAwMjZtZW1vcnlfdGllcnMsIGxpc3QpIHtcbiA1MDg6XHRcdFx0LypcbiA1MDk6XHRcdFx0ICogS2VlcCByZW1vdmluZyBjdXJyZW50IHRpZXIgZnJvbSBsb3dlcl90aWVyIG5vZGVzLFxuIDUxMDpcdFx0XHQgKiBUaGlzIHdpbGwgcmVtb3ZlIGFsbCBub2RlcyBpbiBjdXJyZW50IGFuZCBhYm92ZVxuIDUxMTpcdFx0XHQgKiBtZW1vcnkgdGllciBmcm9tIHRoZSBsb3dlcl90aWVyIG1hc2suXG4gNTEyOlx0XHRcdCAqL1xuIDUxMzpcdFx0XHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XG4gNTE0Olx0XHRcdG5vZGVzX2FuZG5vdChsb3dlcl90aWVyLCBsb3dlcl90aWVyLCB0aWVyX25vZGVzKTtcbiA1MTU6XHRcdFx0bWVtdGllci1cdTAwM2Vsb3dlcl90aWVyX21hc2sgPSBsb3dlcl90aWVyO1xuIDUxNjpcdFx0fVxuIDUxNzpcdFxuIDUxODpcdFx0ZHVtcF9kZW1vdGlvbl90YXJnZXRzKCk7XG4gNTE5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU3MAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBJJiMzOTttIHJlYWR5IHRvIGRpdmUgaW50byB0aGlzLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgYmVpbmcgYXNrZWQgaGVyZS4uLiBJIG5lZWQgdG8gc3VtbWFyaXplIGEgdGV4dCBhcyBpZiBpdCYjMzk7cyAqbXkqIHRob3VnaHQgcHJvY2VzcywgYXMgYW4gZXhwZXJ0IGluIG15IGZpZWxkLiBPa2F5LCBzbyBJIHNob3VsZCBiZSB0aGlua2luZyBhYm91dCB0aGUgaW5mb3JtYXRpb24gZnJvbSBhIHBvc2l0aW9uIG9mIGRlZXAgdW5kZXJzdGFuZGluZyBhbmQgZXhwZXJpZW5jZSwgaW50ZXJwcmV0aW5nIGl0IGFzIEkgd291bGQgbmF0dXJhbGx5LiBHb3QgaXQuIEkgc2hvdWxkIGFsc28gc3RhcnQgd2l0aCBhIGJvbGRlZCBoZWFkZXIgYW5kIHNwZWFrIGluIHRoZSBmaXJzdCBwZXJzb24uIEFscmlnaHQsIGhlcmUgd2UgZ28uCgoqKk5hdmlnYXRpbmcgdGhlIE51YW5jZXM6IExpbmVzIDUyMC01NjAqKgoKUmlnaHQsIHNvIGxldCYjMzk7cyBnZXQgZG93biB0byB0aGUgYnJhc3MgdGFja3MgYW5kIHRha2UgYSBsb29rIGF0IGxpbmVzIDUyMCB0aHJvdWdoIDU2MC4gSSBpbW1lZGlhdGVseSB0aGluayB0aGF0IHRoZXNlIGxpbmVzIHByb2JhYmx5IGhvbGQgY3J1Y2lhbCBkZXRhaWxzLCBhbmQgYmFzZWQgb24gdGhlIHByb21wdCwgaXQgd291bGQgYmUgYWR2YW50YWdlb3VzIHRvIGV4YW1pbmUgdGhpcyBzZWN0aW9uIGNsb3NlbHkuIEkga25vdyB0aGUgaW50cmljYWNpZXMgb2YgdGhpcyBzdWJqZWN0OyBpdCYjMzk7cyBwcmFjdGljYWxseSBzZWNvbmQgbmF0dXJlLiBJJiMzOTtsbCByZWFkIHdpdGggdGhhdCBwZXJzcGVjdGl2ZS4gSSBzaG91bGQgYmUgYWJsZSB0byBkZWR1Y2UgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGVzZSBsaW5lcyByZWxhdGl2ZWx5IHF1aWNrbHkuIExldCYjMzk7cyBzZWUgaG93IHRoaXMgdGV4dCB1bmZvbGRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MjA6XHRcbiA1MjE6XHQjZWxzZVxuIDUyMjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxuIDUyMzpcdCNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbiA1MjQ6XHRcbiA1MjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0X25vZGVfbWVtb3J5X3R5cGUoaW50IG5vZGUsIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm1lbXR5cGUpXG4gNTI2Olx0e1xuIDUyNzpcdFx0aWYgKCFub2RlX21lbW9yeV90eXBlc1tub2RlXS5tZW10eXBlKVxuIDUyODpcdFx0XHRub2RlX21lbW9yeV90eXBlc1tub2RlXS5tZW10eXBlID0gbWVtdHlwZTtcbiA1Mjk6XHRcdC8qXG4gNTMwOlx0XHQgKiBmb3IgZWFjaCBkZXZpY2UgZ2V0dGluZyBhZGRlZCBpbiB0aGUgc2FtZSBOVU1BIG5vZGVcbiA1MzE6XHRcdCAqIHdpdGggdGhpcyBzcGVjaWZpYyBtZW10eXBlLCBidW1wIHRoZSBtYXAgY291bnQuIFdlXG4gNTMyOlx0XHQgKiBPbmx5IHRha2UgbWVtdHlwZSBkZXZpY2UgcmVmZXJlbmNlIG9uY2UsIHNvIHRoYXRcbiA1MzM6XHRcdCAqIGNoYW5naW5nIGEgbm9kZSBtZW10eXBlIGNhbiBiZSBkb25lIGJ5IGRyb3BwaW5nIHRoZVxuIDUzNDpcdFx0ICogb25seSByZWZlcmVuY2UgY291bnQgdGFrZW4gaGVyZS5cbiA1MzU6XHRcdCAqL1xuIDUzNjpcdFxuIDUzNzpcdFx0aWYgKG5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1lbXR5cGUgPT0gbWVtdHlwZSkge1xuIDUzODpcdFx0XHRpZiAoIW5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1hcF9jb3VudCYjNDM7JiM0MzspXG4gNTM5Olx0XHRcdFx0a3JlZl9nZXQoXHUwMDI2bWVtdHlwZS1cdTAwM2VrcmVmKTtcbiA1NDA6XHRcdH1cbiA1NDE6XHR9XG4gNTQyOlx0XG4gNTQzOlx0c3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqc2V0X25vZGVfbWVtb3J5X3RpZXIoaW50IG5vZGUpXG4gNTQ0Olx0e1xuIDU0NTpcdFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuIDU0NjpcdFx0c3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbWVtdHlwZSA9IGRlZmF1bHRfZHJhbV90eXBlO1xuIDU0NzpcdFx0aW50IGFkaXN0ID0gTUVNVElFUl9BRElTVEFOQ0VfRFJBTTtcbiA1NDg6XHRcdHBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobm9kZSk7XG4gNTQ5Olx0XG4gNTUwOlx0XG4gNTUxOlx0XHRsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4gNTUyOlx0XG4gNTUzOlx0XHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKVxuIDU1NDpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiA1NTU6XHRcbiA1NTY6XHRcdG10X2NhbGNfYWRpc3RhbmNlKG5vZGUsIFx1MDAyNmFkaXN0KTtcbiA1NTc6XHRcdGlmICghbm9kZV9tZW1vcnlfdHlwZXNbbm9kZV0ubWVtdHlwZSkge1xuIDU1ODpcdFx0XHRtZW10eXBlID0gbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShhZGlzdCwgXHUwMDI2ZGVmYXVsdF9tZW1vcnlfdHlwZXMpO1xuIDU1OTpcdFx0XHRpZiAoSVNfRVJSKG1lbXR5cGUpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0NDgxCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogNzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRGl2aW5nIGludG8gYG1tL3BhZ2VfYWxsb2MuY2AqKgoKT2theSwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCBkaXNzZWN0IGBtbS9wYWdlX2FsbG9jLmNgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGZ1bmN0aW9uIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhlIGdyYW5kIHNjaGVtZSBvZiB0aGluZ3MuIFNvLCB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBwb3BzIGludG8gbXkgaGVhZCBpczogd2hvIGlzIGNhbGxpbmcgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uPyBXaGF0IGFyZSBpdHMgZGVwZW5kZW5jaWVzPyBJJiMzOTttIGdvaW5nIHRvIGZpcmUgdXAgZ3JlcCBhbmQgc2NhbiB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSwgbG9va2luZyBmb3IgYWxsIGluc3RhbmNlcyBvZiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIFRoYXQmIzM5O3MgdGhlIGJlc3Qgd2F5IHRvIGRldGVybWluZSBpdHMgY2FsbGVycyBhbmQsIGJ5IGV4dGVuc2lvbiwgaXRzIGNvbnRleHQuIEtub3dpbmcgd2hlcmUgaXQmIzM5O3MgdXNlZCBpcyB0aGUgZmlyc3QgY3JpdGljYWwgc3RlcCB0byB1bmRlcnN0YW5kaW5nIGl0cyBwdXJwb3NlIGFuZCBwb3RlbnRpYWwgaW1wYWN0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2ludGVybmFsLmg9MTEzND1leHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbm1tL2ludGVybmFsLmgtMTEzNS1cdFx0XHRcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XG5tbS9pbnRlcm5hbC5oOjExMzY6aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxubW0vaW50ZXJuYWwuaC0xMTM3LVx0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcbi0tXG5tbS9pbnRlcm5hbC5oPTExNDE9c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuLS1cbm1tL2ludGVybmFsLmgtMTE0NS19XG5tbS9pbnRlcm5hbC5oOjExNDY6c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG5tbS9pbnRlcm5hbC5oLTExNDctXHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MzMwPWludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbi0tXG5tbS9tZW1vcnktdGllcnMuYy0zNzItXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xubW0vbWVtb3J5LXRpZXJzLmM6MzczOlx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXHUwMDI2bWFzaywgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbm1tL21lbW9yeS10aWVycy5jLTM3NC19XG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NDI1PXN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNDUyLVx0XHQvKlxubW0vbWVtb3J5LXRpZXJzLmM6NDUzOlx0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG5tbS9tZW1vcnktdGllcnMuYy00NTQtXHRcdCAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXJcbi0tXG5tbS9tZW1vcnktdGllcnMuYy00NjUtXHRcdGRvIHtcbm1tL21lbW9yeS10aWVycy5jOjQ2NjpcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG5tbS9tZW1vcnktdGllcnMuYy00NjctXHRcdFx0XHRcdFx0XHRcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz01NzkzPXN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4tLVxubW0vcGFnZV9hbGxvYy5jLTU3OTUtLyoqXG5tbS9wYWdlX2FsbG9jLmM6NTc5NjogKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdFxubW0vcGFnZV9hbGxvYy5jLTU3OTctICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSYjMzk7cmUgYXBwZW5kaW5nXG4tLVxubW0vcGFnZV9hbGxvYy5jLTU4MTAtICovXG5tbS9wYWdlX2FsbG9jLmM6NTgxMTppbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG5tbS9wYWdlX2FsbG9jLmMtNTgxMi1cdFx0XHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz01ODgwPXN0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyxcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTg5MC1cbm1tL3BhZ2VfYWxsb2MuYzo1ODkxOlx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcdTAwMjZ1c2VkX21hc2ssXG5tbS9wYWdlX2FsbG9jLmMtNTg5Mi1cdFx0XHRcdFx0ICAgICAgY2FuZGlkYXRlcykpIFx1MDAzZT0gMCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTU4NAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipBbmFseXppbmcgRnVuY3Rpb24gQ2FsbCBHcmFwaHMqKgoKQWxyaWdodCwgZmlyc3QgdGhpbmdzIGZpcnN0LiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGFueXRoaW5nIHJlbGF0ZWQgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVgLiBUaGUgaW1wbGljYXRpb24gaXMgdGhhdCBJJiMzOTt2ZSBiZWVuIHRyYWNpbmcgdGhlIGxpbmVhZ2Ugb2YgdGhhdCBmdW5jdGlvbiwgcHJvYmFibHkgdG8gb3B0aW1pemUgb3IgdW5kZXJzdGFuZCBpdHMgdXNhZ2UuIEdvb2QhIExvb2tzIGxpa2Ugbm8gZnVydGhlciBpbnN0YW5jZXMgb2YgaXQgYXJlIGJlaW5nIGNhbGxlZC4gVGhhdCYjMzk7cyBhIGNsZWFuIGJyZWFrIHBvaW50LgoKTm93LCBteSBmb2N1cyBzaGlmdHMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmNpZXMgYXJvdW5kIGBidWlsZF96b25lbGlzdHNgIGFuZCBgYnVpbGRfYWxsX3pvbmVsaXN0c2AuIFdobyByZWxpZXMgb24gdGhlc2UgZnVuY3Rpb25zPyAgS25vd2luZyB0aGVpciBjYWxsZXJzIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyB0aGUgZGF0YSBmbG93IGFuZCBhbnkgcG90ZW50aWFsIGJvdHRsZW5lY2tzIG9yIGFyZWFzIGZvciByZWZhY3RvcmluZy4gSSYjMzk7bSBnb2luZyB0byBmb2xsb3cgdGhlIGNhbGwgZ3JhcGggdXAgdG8gc2VlIHdoYXQgZnVuY3Rpb25zIGFyZSBhZmZlY3RlZCBieSBjaGFuZ2VzIHRvIHRoZXNlIGZ1bmN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnVpbGRfem9uZWxpc3RzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jPTU4ODA9c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01OTExLVxubW0vcGFnZV9hbGxvYy5jOjU5MTI6c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG5tbS9wYWdlX2FsbG9jLmMtNTkxMy17XG4tLVxubW0vcGFnZV9hbGxvYy5jPTU5Mzc9c3RhdGljIHZvaWQgc2V0dXBfbWluX3NsYWJfcmF0aW8odm9pZCk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTU5MzktXG5tbS9wYWdlX2FsbG9jLmM6NTk0MDpzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbm1tL3BhZ2VfYWxsb2MuYy01OTQxLXtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTk3Nz1zdGF0aWMgdm9pZCBfX2J1aWxkX2FsbF96b25lbGlzdHModm9pZCAqZGF0YSlcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjAwNS1cdGlmIChzZWxmIFx1MDAyNlx1MDAyNiAhbm9kZV9vbmxpbmUoc2VsZi1cdTAwM2Vub2RlX2lkKSkge1xubW0vcGFnZV9hbGxvYy5jOjYwMDY6XHRcdGJ1aWxkX3pvbmVsaXN0cyhzZWxmKTtcbm1tL3BhZ2VfYWxsb2MuYy02MDA3LVx0fSBlbHNlIHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjAxNC1cbm1tL3BhZ2VfYWxsb2MuYzo2MDE1Olx0XHRcdGJ1aWxkX3pvbmVsaXN0cyhwZ2RhdCk7XG5tbS9wYWdlX2FsbG9jLmMtNjAxNi1cdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjE5MgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDQ2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIEhpZXJhcmNoeSBvZiBgX19idWlsZF9hbGxfem9uZWxpc3RzYCoqCgpSaWdodCwgc28gSSBzZWUgYF9fYnVpbGRfYWxsX3pvbmVsaXN0c2AgaXMgZGlyZWN0bHkgY2FsbGVkIGJ5IGBidWlsZF9hbGxfem9uZWxpc3RzYC4gVGhhdCYjMzk7cyB0aGUgaW1tZWRpYXRlIHJlbGF0aW9uc2hpcC4gTm93LCB0aGUgcmVhbCBxdWVzdGlvbiBpcywgd2hlcmUgZG9lcyBgYnVpbGRfYWxsX3pvbmVsaXN0c2AgaXRzZWxmIGZpdCBpbnRvIHRoZSBsYXJnZXIgcGljdHVyZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHVwc3RyZWFtIGRlcGVuZGVuY2llcy4gV2hlcmUgYXJlICppdHMqIGNhbGxpbmcgcG9pbnRzPyBJIG5lZWQgdG8gdHJhY2UgYmFjayBmcm9tIGBidWlsZF9hbGxfem9uZWxpc3RzYCB0byB1bmRlcnN0YW5kIHRoZSBiaWdnZXIgYXJjaGl0ZWN0dXJlIGl0IHBsYXlzIGEgcm9sZSBpbi4gTGV0JiMzOTtzIGZpbmQgdGhvc2UgY2FsbHMuIEkgZXhwZWN0IHRvIGZpbmQgc29tZSBpbnRlcmVzdGluZyB0aGluZ3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J1aWxkX2FsbF96b25lbGlzdHMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC94ODYvbW0vbnVtYS5jPTIzMj12b2lkIF9faW5pdCB4ODZfbnVtYV9pbml0KHZvaWQpXG4tLVxuYXJjaC94ODYvbW0vbnVtYS5jLTI1Ni0gKiBtZW1vcnlsZXNzIENQVSBub2RlcyBoYXZlIGFscmVhZHkgYmVlbiBicm91Z2h0IG9ubGluZSwgYW5kIGJlZm9yZSB0aGVcbmFyY2gveDg2L21tL251bWEuYzoyNTc6ICogbm9kZV9kYXRhW25pZF0gaXMgbmVlZGVkIGZvciB6b25lIGxpc3Qgc2V0dXAgaW4gYnVpbGRfYWxsX3pvbmVsaXN0cygpLlxuYXJjaC94ODYvbW0vbnVtYS5jLTI1OC0gKlxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmg9MTYyMD1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGdkYXRfZW5kX3BmbihwZ19kYXRhX3QgKnBnZGF0KVxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTYyNi1cbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTYyNzp2b2lkIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCk7XG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE2MjgtYm9vbCBfX3pvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyayxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTExNDA9aW50IG9ubGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyMTUtXHRpZiAobmVlZF96b25lbGlzdHNfcmVidWlsZClcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTIxNjpcdFx0YnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTtcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIxNy1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTEyNTY9c3RhdGljIHBnX2RhdGFfdCAqaG90YWRkX2luaXRfcGdkYXQoaW50IG5pZClcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyNzUtXHQgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTI3NjpcdGJ1aWxkX2FsbF96b25lbGlzdHMocGdkYXQpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjc3LVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTk4Nj1pbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIxNzAtXHRcdHpvbmVfcGNwX3Jlc2V0KHpvbmUpO1xubW0vbWVtb3J5X2hvdHBsdWcuYzoyMTcxOlx0XHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMTcyLVx0fVxuLS1cbm1tL21tX2luaXQuYz0yNjk3PXZvaWQgX19pbml0IG1tX2NvcmVfaW5pdCh2b2lkKVxuLS1cbm1tL21tX2luaXQuYy0yNzAzLVx0QlVJTERfQlVHX09OKE1BWF9aT05FTElTVFMgXHUwMDNlIDIpO1xubW0vbW1faW5pdC5jOjI3MDQ6XHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xubW0vbW1faW5pdC5jLTI3MDUtXHRwYWdlX2FsbG9jX2luaXRfY3B1aHAoKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTk3NT1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcl9jcHVfem9uZXN0YXQsIGJvb3Rfem9uZXN0YXRzKTtcbm1tL3BhZ2VfYWxsb2MuYy01OTc2LVxubW0vcGFnZV9hbGxvYy5jOjU5Nzc6c3RhdGljIHZvaWQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmRhdGEpXG5tbS9wYWdlX2FsbG9jLmMtNTk3OC17XG4tLVxubW0vcGFnZV9hbGxvYy5jPTYwMzY9c3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0XG5tbS9wYWdlX2FsbG9jLmM6NjAzNzpidWlsZF9hbGxfem9uZWxpc3RzX2luaXQodm9pZClcbm1tL3BhZ2VfYWxsb2MuYy02MDM4LXtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjA0MC1cbm1tL3BhZ2VfYWxsb2MuYzo2MDQxOlx0X19idWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xubW0vcGFnZV9hbGxvYy5jLTYwNDItXG4tLVxubW0vcGFnZV9hbGxvYy5jLTYwNjUtICpcbm1tL3BhZ2VfYWxsb2MuYzo2MDY2OiAqIF9fcmVmIGR1ZSB0byBjYWxsIG9mIF9faW5pdCBhbm5vdGF0ZWQgaGVscGVyIGJ1aWxkX2FsbF96b25lbGlzdHNfaW5pdFxubW0vcGFnZV9hbGxvYy5jLTYwNjctICogW3Byb3RlY3RlZCBieSBTWVNURU1fQk9PVElOR10uXG5tbS9wYWdlX2FsbG9jLmMtNjA2OC0gKi9cbm1tL3BhZ2VfYWxsb2MuYzo2MDY5OnZvaWQgX19yZWYgYnVpbGRfYWxsX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxubW0vcGFnZV9hbGxvYy5jLTYwNzAte1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy02MDczLVx0aWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykge1xubW0vcGFnZV9hbGxvYy5jOjYwNzQ6XHRcdGJ1aWxkX2FsbF96b25lbGlzdHNfaW5pdCgpO1xubW0vcGFnZV9hbGxvYy5jLTYwNzUtXHR9IGVsc2Uge1xubW0vcGFnZV9hbGxvYy5jOjYwNzY6XHRcdF9fYnVpbGRfYWxsX3pvbmVsaXN0cyhwZ2RhdCk7XG5tbS9wYWdlX2FsbG9jLmMtNjA3Ny1cdFx0LyogY3B1c2V0IHJlZnJlc2ggcm91dGluZSBzaG91bGQgYmUgaGVyZSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzU1NgoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDg0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIGNvZGU6CgoqKlRoaW5raW5nIFRocm91Z2ggWm9uZWxpc3QgSW5pdGlhbGl6YXRpb24gYW5kIERlbW90aW9uKioKCk9rYXksIHNvIGBidWlsZF9hbGxfem9uZWxpc3RzYCBpcyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBjbGVhcmx5LiBJdCYjMzk7cyBjYWxsZWQgbm90IGp1c3QgZHVyaW5nIHRoZSBpbml0aWFsIGJvb3Qgc2VxdWVuY2UgdmlhIGBtbV9jb3JlX2luaXRgLCBidXQgYWxzbyBkeW5hbWljYWxseSB3aGVuIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggbWVtb3J5IGhvdHBsdWcgZXZlbnRzOiBgb25saW5lX3BhZ2VzYCwgYGhvdGFkZF9pbml0X3BnZGF0YCwgYW5kIGBvZmZsaW5lX3BhZ2VzYC4gVGhhdCBtYWtlcyBzZW5zZTsgdGhlIHpvbmVsaXN0IHN0cnVjdHVyZSBoYXMgdG8gYmUgdXBkYXRlZCB3aGVuZXZlciB0aGUgbWVtb3J5IHRvcG9sb2d5IGNoYW5nZXMuCgpCdXQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHBpY3R1cmUuIE15IGltbWVkaWF0ZSBxdWVzdGlvbiBpcyBhYm91dCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLiBXaGVyZSBkb2VzICp0aGF0KiBmaXQgaW50byB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbGlmZWN5Y2xlPyBXaGVuIGlzICp0aGF0KiBmdW5jdGlvbiBiZWluZyBjYWxsZWQ/IEdpdmVuIGl0cyBuYW1lLCBpdCBtdXN0IHBsYXkgYSBwYXJ0LCBhbmQgaXRzIGV4ZWN1dGlvbiBjb250ZXh0IGlzIGltcG9ydGFudCB0byBhbmFseXplLgoKVGltZSB0byByZWFjaCBmb3IgdGhlIHRydXN0eSBgZ3JlcGAuIEkmIzM5O2xsIHJ1biBhIHF1aWNrIHNlYXJjaCBmb3IgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBhbmQgc2VlIHdoZXJlIGl0JiMzOTtzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlLiBLbm93aW5nIHRoYXQgc2hvdWxkIGdpdmUgbWUgYSBtb3JlIGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcgb2YgaG93IG1lbW9yeSBkZW1vdGlvbiBpcyBzZXQgdXAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2VzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jPTQwMD1zdGF0aWMgdm9pZCBkdW1wX2RlbW90aW9uX3RhcmdldHModm9pZClcbi0tXG5tbS9tZW1vcnktdGllcnMuYy00MjQtICovXG5tbS9tZW1vcnktdGllcnMuYzo0MjU6c3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbm1tL21lbW9yeS10aWVycy5jLTQyNi17XG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNTIxLSNlbHNlXG5tbS9tZW1vcnktdGllcnMuYzo1MjI6c3RhdGljIGlubGluZSB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpIHt9XG5tbS9tZW1vcnktdGllcnMuYy01MjMtI2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTcwOD1zdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfdGllcl9sYXRlX2luaXQodm9pZClcbi0tXG5tbS9tZW1vcnktdGllcnMuYy03MzEtXG5tbS9tZW1vcnktdGllcnMuYzo3MzI6XHRlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpO1xubW0vbWVtb3J5LXRpZXJzLmMtNzMzLVx0cHV0X29ubGluZV9tZW1zKCk7XG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9ODgyPXN0YXRpYyBpbnQgX19tZW1pbml0IG1lbXRpZXJfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtODkxLVx0XHRpZiAoY2xlYXJfbm9kZV9tZW1vcnlfdGllcihubi1cdTAwM2VuaWQpKVxubW0vbWVtb3J5LXRpZXJzLmM6ODkyOlx0XHRcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XG5tbS9tZW1vcnktdGllcnMuYy04OTMtXHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcbi0tXG5tbS9tZW1vcnktdGllcnMuYy04OTgtXHRcdGlmICghSVNfRVJSKG1lbXRpZXIpKVxubW0vbWVtb3J5LXRpZXJzLmM6ODk5Olx0XHRcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XG5tbS9tZW1vcnktdGllcnMuYy05MDAtXHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgzMjEKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA3MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgbXlzZWxmOgoKKipUcmFjaW5nIERvd24gYG5leHRfZGVtb3Rpb25fbm9kZWAqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBtZW1vcnkgbWFuYWdlbWVudCBzdHVmZiwgYW5kIEkmIzM5O3ZlIGhpdCBhIHBvaW50IHdoZXJlIEkgbmVlZCB0byB1bmRlcnN0YW5kIGBuZXh0X2RlbW90aW9uX25vZGVgLiBXaGVyZSBkb2VzIHRoaXMgZ2V0IGNhbGxlZCwgZXhhY3RseT8gTGV0JiMzOTtzIHNlZS4uLiBBaGEhIEl0IGxvb2tzIGxpa2UgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgaW52b2tlZCBmcm9tIGBkZW1vdGVfZm9saW9fbGlzdGAuIFJpZ2h0LCBhbmQgdGhhdCBmdW5jdGlvbiBsaXZlcyBpbiBgbW0vdm1zY2FuLmNgLiBOb3cgd2UmIzM5O3JlIGdldHRpbmcgc29tZXdoZXJlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGUgY2FsbCB0byBgbmV4dF9kZW1vdGlvbl9ub2RlYCwgc28gSSYjMzk7bSBnb2luZyB0byBqdW1wIGludG8gYGRlbW90ZV9mb2xpb19saXN0YCBpbiBgbW0vdm1zY2FuLmNgIGFuZCBzZWUgaG93ICppdCogaXMgdXNlZC4gVGhhdCB3aWxsIGdpdmUgbWUgdGhlIGJyb2FkZXIgcGljdHVyZSBvZiB3aHkgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgcmVsZXZhbnQgaGVyZS4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlIGZpbmQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vdm1zY2FuLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzEwNzA6XHQgKi9cbjEwNzE6XHRzdGF0aWMgdW5zaWduZWQgaW50IGRlbW90ZV9mb2xpb19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmRlbW90ZV9mb2xpb3MsXG4xMDcyOlx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuMTA3MzpcdFx0XHRcdFx0ICAgICAgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuMTA3NDpcdHtcbjEwNzU6XHRcdGludCB0YXJnZXRfbmlkO1xuMTA3NjpcdFx0dW5zaWduZWQgaW50IG5yX3N1Y2NlZWRlZDtcbjEwNzc6XHRcdG5vZGVtYXNrX3QgYWxsb3dlZF9tYXNrO1xuMTA3ODpcdFxuMTA3OTpcdFx0c3RydWN0IG1pZ3JhdGlvbl90YXJnZXRfY29udHJvbCBtdGMgPSB7XG4xMDgwOlx0XHRcdC8qXG4xMDgxOlx0XHRcdCAqIEFsbG9jYXRlIGZyb20gJiMzOTtub2RlJiMzOTssIG9yIGZhaWwgcXVpY2tseSBhbmQgcXVpZXRseS5cbjEwODI6XHRcdFx0ICogV2hlbiB0aGlzIGhhcHBlbnMsICYjMzk7cGFnZSYjMzk7IHdpbGwgbGlrZWx5IGp1c3QgYmUgZGlzY2FyZGVkXG4xMDgzOlx0XHRcdCAqIGluc3RlYWQgb2YgbWlncmF0ZWQuXG4xMDg0Olx0XHRcdCAqL1xuMTA4NTpcdFx0XHQuZ2ZwX21hc2sgPSAoR0ZQX0hJR0hVU0VSX01PVkFCTEUgXHUwMDI2IH5fX0dGUF9SRUNMQUlNKSB8XG4xMDg2Olx0XHRcdFx0X19HRlBfTk9NRU1BTExPQyB8IEdGUF9OT1dBSVQsXG4xMDg3Olx0XHRcdC5ubWFzayA9IFx1MDAyNmFsbG93ZWRfbWFzayxcbjEwODg6XHRcdFx0LnJlYXNvbiA9IE1SX0RFTU9USU9OLFxuMTA4OTpcdFx0fTtcbjEwOTA6XHRcbjEwOTE6XHRcdGlmIChsaXN0X2VtcHR5KGRlbW90ZV9mb2xpb3MpKVxuMTA5MjpcdFx0XHRyZXR1cm4gMDtcbjEwOTM6XHRcbjEwOTQ6XHRcdG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ2RhdCwgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbjEwOTU6XHRcdG1lbV9jZ3JvdXBfbm9kZV9maWx0ZXJfYWxsb3dlZChtZW1jZywgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbjEwOTY6XHRcdGlmIChub2Rlc19lbXB0eShhbGxvd2VkX21hc2spKVxuMTA5NzpcdFx0XHRyZXR1cm4gMDtcbjEwOTg6XHRcbjEwOTk6XHRcdHRhcmdldF9uaWQgPSBuZXh0X2RlbW90aW9uX25vZGUocGdkYXQtXHUwMDNlbm9kZV9pZCwgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbjExMDA6XHRcdGlmICh0YXJnZXRfbmlkID09IE5VTUFfTk9fTk9ERSlcbjExMDE6XHRcdFx0LyogTm8gbG93ZXItdGllciBub2RlcyBvciBub2RlcyB3ZXJlIGhvdC11bnBsdWdnZWQuICovXG4xMTAyOlx0XHRcdHJldHVybiAwO1xuMTEwMzpcdFxuMTEwNDpcdFx0bXRjLm5pZCA9IHRhcmdldF9uaWQ7XG4xMTA1Olx0XG4xMTA2Olx0XHQvKiBEZW1vdGlvbiBpZ25vcmVzIGFsbCBjcHVzZXQgYW5kIG1lbXBvbGljeSBzZXR0aW5ncyAqL1xuMTEwNzpcdFx0bWlncmF0ZV9wYWdlcyhkZW1vdGVfZm9saW9zLCBhbGxvY19kZW1vdGVfZm9saW8sIE5VTEwsXG4xMTA4Olx0XHRcdCAgICAgICh1bnNpZ25lZCBsb25nKVx1MDAyNm10YywgTUlHUkFURV9BU1lOQywgTVJfREVNT1RJT04sXG4xMTA5Olx0XHRcdCAgICAgIFx1MDAyNm5yX3N1Y2NlZWRlZCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MjcxCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTQ0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgWm9uZWxpc3QgQ2hhbmdlcyBmb3IgTWVtb3J5IE1hbmFnZW1lbnQgYW5kIEZ1enppbmcgUmVsZXZhbmNlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSwgbXkgZXhwZXJ0IG1pbmQgZmxhZ3MgYGRlbW90ZV9mb2xpb19saXN0YCBhcyBwYXJ0IG9mIHBhZ2UgcmVjbGFtYXRpb27igJRzcGVjaWZpY2FsbHksIHRoZSBkZW1vdGlvbiBwcm9jZXNzIHdoZW4gbWVtb3J5IHByZXNzdXJlIGhpdHMuIFBhZ2VzIGdldCBzaHVmZmxlZCBkb3duIHRoZSBtZW1vcnkgaGllcmFyY2h5LiBUaGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIGhvdyB0aGUgZmFsbGJhY2sgb3JkZXIgZm9yIGBub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzYCBpcyBjb25zdHJ1Y3RlZCwgbWFpbmx5IHRocm91Z2ggYGJ1aWxkX25vZGVfem9uZWxpc3RgIGFuZCB0aGUgYnJvYWRlciBgYnVpbGRfem9uZWxpc3RzYCBmdW5jdGlvbnMuIFRoaXMgYFpPTkVMSVNUX0ZBTExCQUNLYCBpcyAqY3J1Y2lhbCogYmVjYXVzZSBpdCYjMzk7cyB1c2VkIGJ5IGV2ZXJ5IGFsbG9jYXRpb24gdGhhdCBuZWVkcyB0byBmYWxsIGJhY2sgYWNyb3NzIE5VTUEgbm9kZXMuCgpJIHNlZSBhIGNsZWFyIHNoaWZ0IGhlcmUuIFRoZSBvbGQgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyYCB3YXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgaXRlcmF0aW5nIG92ZXIgbm9kZXMgaW4gYSBzZXQgb3JkZXIuIE5vdywgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGlzIHVzaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIGFuZCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzay4gVGhpcyBgY2FuZGlkYXRlc2AgbWFzayBpcyAqa2V5Ki4gQmVmb3JlLCBpdCB1c2VkIGBOX01FTU9SWWAuIEl0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIGJlaW5nIGZhciBtb3JlIHByZWNpc2UgYWJvdXQgKndoaWNoKiBub2RlcyBhcmUgY29uc2lkZXJlZCwgd2hpY2ggaXMgYSBiaWcgY2hhbmdlIQoKSSBuZWVkIHRvIGRpdmUgaW50byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYC4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBub3cgdXNlcyB0aGF0IGBjYW5kaWRhdGVzYCBtYXNrLCB3aGljaCBpcyBncmVhdCBiZWNhdXNlIGNhbGxlcnMgY2FuIG5vdyBwYXNzIGluIGEgcmVzdHJpY3RlZCBub2RlbWFzay4gSSBzZWUgdGhpcyBoYXBwZW5pbmcgaW4gdGhlIGBtZW1vcnktdGllcnNgIGNvZGUsIGluIGBuZXh0X2RlbW90aW9uX25vZGUoKWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpYC4gVGhlIHByZXZpb3VzIGNvZGUgd2FzIG1vcmUgb2YgYSBibHVudCBpbnN0cnVtZW50LCBhbmQgdGhpcyBpcyBmYXIgbW9yZSB0YXJnZXRlZC4KCk9rYXksIG5vdyBsZXQmIzM5O3MgYXBwbHkgdGhlIGZ1enppbmcgY3JpdGVyaWEuIFRoaXMgcGF0Y2ggaXMgKmRlZmluaXRlbHkqIGluIGBtbS9gIOKAkyBtZW1vcnkgbWFuYWdlbWVudC4gSXQmIzM5O3MgY2hhbmdpbmcgY29yZSB6b25lbGlzdCBidWlsZGluZyBsb2dpYywgc3BlY2lmaWNhbGx5IGhvdyB3ZSYjMzk7cmUgY2FsY3VsYXRpbmcgd2hpY2ggbm9kZSB0byB1c2UgaW4gcGFnZSByZWNsYWltIChhbmQgaW4gcGFydGljdWxhciwgZGVtb3Rpb24pLiBUaGlzIGRpcmVjdGx5IGFmZmVjdHMgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGFuZCB0aGUgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGZ1bmN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgLCBhbG9uZyB3aXRoIHVwZGF0ZXMgdG8gdGhlIGRlbW90aW9uIHRhcmdldCBjYWxjdWxhdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaG9zZSBhcmUgKmV4YWN0bHkqIHRoZSBraW5kIG9mIGNvcmUgc3Vic3lzdGVtIGFuZCBhbGdvcml0aG0gZmxvdyBjaGFuZ2VzIHRoYXQgdGhlIGZ1enppbmcgY3JpdGVyaWEgZmxhZy4KClRoZSBxdWVzdGlvbiB0aGVuIGJlY29tZXMsIGlzIHRoaXMgcGF0Y2ggY29kZSByZWFjaGFibGUgaW4gYSBmdXp6ZXIgZnJpZW5kbHkgZW52aXJvbm1lbnQ/IEFuZCB0aGUgYW5zd2VyIGlzIGFic29sdXRlbHkgeWVzISBJIGNhbiBlYXNpbHkgY29uZmlndXJlIE5VTUEgbm9kZXMgaW4gUUVNVSAoSSB1c2UgaXQgYWxsIHRoZSB0aW1lKS4gU3l6a2FsbGVyIG9mdGVuIHJ1bnMgd2l0aCBOVU1BIGVuYWJsZWQsIHRvby4gQW5kIGNydWNpYWxseSwgbWVtb3J5IGhvdHBsdWcvbWVtcG9saWN5IHN5c2NhbGxzIChlLmcuLCBgc2V0X21lbXBvbGljeWAsIGBtYmluZGAsIGBtaWdyYXRlX3BhZ2VzYCwgYG1vdmVfcGFnZXNgKSBhbmQgcGFnZSByZWNsYWltIGRlbW90aW9uIGRlZmluaXRlbHkgcnVuIHRoaXMgY29kZS4gU28gdGhpcyBpcyBncmVhdCEKCkZpbmFsbHksIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgc29tZXRoaW5nIOKAkyBpcyB0aGUgYG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcmAgc3lzY3RsIHN0aWxsIGFyb3VuZD8gSSYjMzk7ZCBleHBlY3QgaXQgaXMgYXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIHdpbGwgdXNlIGl0cyBvcmRlci4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhhdC4gQnV0IGV2ZXJ5dGhpbmcgc28gZmFyIHN0cm9uZ2x5IHN1Z2dlc3RzIHRoaXMgcGF0Y2ggaXMgKmhpZ2hseSogZnV6emFibGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O251bWFfem9uZWxpc3Rfb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9wYWdlX2FsbG9jLmM9NTc0NT1zdGF0aWMgaW50IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwgc3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01NzY0LVxubW0vcGFnZV9hbGxvYy5jOjU3NjU6c3RhdGljIGludCBfX3BhcnNlX251bWFfem9uZWxpc3Rfb3JkZXIoY2hhciAqcylcbm1tL3BhZ2VfYWxsb2MuYy01NzY2LXtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTc3My1cdGlmICghKCpzID09ICYjMzk7ZCYjMzk7IHx8ICpzID09ICYjMzk7RCYjMzk7IHx8ICpzID09ICYjMzk7biYjMzk7IHx8ICpzID09ICYjMzk7TiYjMzk7KSkge1xubW0vcGFnZV9hbGxvYy5jOjU3NzQ6XHRcdHByX3dhcm4oXCYjMzQ7SWdub3JpbmcgdW5zdXBwb3J0ZWQgbnVtYV96b25lbGlzdF9vcmRlciB2YWx1ZTogICVzXFxuXCYjMzQ7LCBzKTtcbm1tL3BhZ2VfYWxsb2MuYy01Nzc1LVx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTc3OS1cbm1tL3BhZ2VfYWxsb2MuYzo1NzgwOnN0YXRpYyBjaGFyIG51bWFfem9uZWxpc3Rfb3JkZXJbXSA9IFwmIzM0O05vZGVcJiMzNDs7XG5tbS9wYWdlX2FsbG9jLmMtNTc4MS0jZGVmaW5lIE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOXHQxNlxubW0vcGFnZV9hbGxvYy5jLTU3ODItLypcbm1tL3BhZ2VfYWxsb2MuYzo1NzgzOiAqIHN5c2N0bCBoYW5kbGVyIGZvciBudW1hX3pvbmVsaXN0X29yZGVyXG5tbS9wYWdlX2FsbG9jLmMtNTc4NC0gKi9cbm1tL3BhZ2VfYWxsb2MuYzo1Nzg1OnN0YXRpYyBpbnQgbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG5tbS9wYWdlX2FsbG9jLmMtNTc4Ni1cdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01Nzg4LVx0aWYgKHdyaXRlKVxubW0vcGFnZV9hbGxvYy5jOjU3ODk6XHRcdHJldHVybiBfX3BhcnNlX251bWFfem9uZWxpc3Rfb3JkZXIoYnVmZmVyKTtcbm1tL3BhZ2VfYWxsb2MuYy01NzkwLVx0cmV0dXJuIHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTY5MTg9c3RhdGljIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgcGFnZV9hbGxvY19zeXNjdGxfdGFibGVbXSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjk3MC1cdHtcbm1tL3BhZ2VfYWxsb2MuYzo2OTcxOlx0XHQucHJvY25hbWVcdD0gXCYjMzQ7bnVtYV96b25lbGlzdF9vcmRlclwmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYzo2OTcyOlx0XHQuZGF0YVx0XHQ9IFx1MDAyNm51bWFfem9uZWxpc3Rfb3JkZXIsXG5tbS9wYWdlX2FsbG9jLmMtNjk3My1cdFx0Lm1heGxlblx0XHQ9IE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOLFxubW0vcGFnZV9hbGxvYy5jLTY5NzQtXHRcdC5tb2RlXHRcdD0gMDY0NCxcbm1tL3BhZ2VfYWxsb2MuYzo2OTc1Olx0XHQucHJvY19oYW5kbGVyXHQ9IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcixcbm1tL3BhZ2VfYWxsb2MuYy02OTc2LVx0fSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIxMjEKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAyMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgWm9uZWxpc3QgQ29uc3RydWN0aW9uIGFuZCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3Mga2lja2luZyBvZmYgdGhpcyBgYnVpbGRfYWxsX3pvbmVsaXN0c2AgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyBpdCYjMzk7cyB0aWVkIHRvIGNoYW5nZXMgaW4gdGhlIG1lbW9yeSB0b3BvbG9neSwgcmlnaHQ/IExpa2UsIHN5c2ZzIGVudHJpZXMgZm9yIG9ubGluZS9vZmZsaW5lIG1lbW9yeSBwYWdlcyDigJMgdGhlIHVzdWFsIHN1c3BlY3RzIGF0IGAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS8uLi5gLiBBbHNvLCBpdCYjMzk7cyBnb3R0YSBiZSBpbnZvbHZlZCB3aXRoIGhvdC1hZGQgbWVtb3J5IG9wZXJhdGlvbnMsIG9idmlvdXNseS4gQW5kLCBvZiBjb3Vyc2UsIHRoZSBgbmV4dF9kZW1vdGlvbl9ub2RlYCBmdW5jdGlvbiwgd2hpY2ggSSBrbm93IGlzIGEga2V5IHBhcnQgb2YgbWVtb3J5IHJlY2xhaW0sIHNwZWNpZmljYWxseSB3aGVuIHdlJiMzOTtyZSBkZW1vdGluZyBwYWdlcyB3aXRoaW4gYGRlbW90ZV9mb2xpb19saXN0YC4gVGhlbiB0aGVyZSYjMzk7cyBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLCBjYWxsZWQgd2hlbiB0aGVyZSYjMzk7cyBhIHNoaWZ0IGluIG1lbW9yeSB0aWVycywgb3IgYWxzbyBvbiBob3RwbHVnIGV2ZW50cy4gRmluYWxseSwgem9uZWxpc3RzIGdldCBhIGJ1aWxkIGF0IGJvb3QsIHRvbywgd2hpY2ggbWFrZXMgc2Vuc2UuCgpSaWdodCwgc28gd2hhdCBjb25maWd1cmF0aW9ucyBhcmUgYWJzb2x1dGVseSBlc3NlbnRpYWwgZm9yIHRoaXMgd2hvbGUgcHJvY2Vzcz8gTGV0IG1lIGNoZWNrIHRoZSBjb2RlLgoKQWxyaWdodCwgbG9va2luZyBhdCBgbW0vbWVtb3J5LXRpZXJzLmNgLCBJIHNlZSBhIGNsZWFyIGRlcGVuZGVuY3k6IGBvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vYC4gTWFrZXMgc2Vuc2UsIHdlIG5lZWQgTlVNQSBzdXBwb3J0LiBBbmQgKmNydWNpYWxseSosIGl0IGxvb2tzIGxpa2UgdGhlIHByZXNlbmNlIG9mIGAjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGlzIHdoYXQgZ3VhcmRzIGJvdGggYG5leHRfZGVtb3Rpb25fbm9kZWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AuIFRoYXQmIzM5O3MgdGhlIGxpbmNocGluLiBTbywgdGhlIGtleSBpcyBnb2luZyB0byBiZSBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCwgYW5kLCBvZiBjb3Vyc2UsIGBDT05GSUdfTlVNQWAuIExldCBtZSBnbyBjaGVjayBLY29uZmlnIHRvIGJlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBmdWxsIHNjb3BlIG9mIHRoZXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTlVNQV9NSUdSQVRJT04mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz02NjA9Y29uZmlnIFBBR0VfUkVQT1JUSU5HXG4tLVxubW0vS2NvbmZpZy02NjctXG5tbS9LY29uZmlnOjY2ODpjb25maWcgTlVNQV9NSUdSQVRJT05cbm1tL0tjb25maWctNjY5LVx0Ym9vbCBcJiMzNDtOVU1BIHBhZ2UgbWlncmF0aW9uXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNzg5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhpbmtpbmcgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIE5VTUFfTUlHUkFUSU9OIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgb2YgYE5VTUFfTUlHUkFUSU9OYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNjY4LiBUaGF0JiMzOTtzIHVzdWFsbHkgd2hlcmUgdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucyByZXNpZGUuIEJ5IGV4YW1pbmluZyB0aGF0IHNlY3Rpb24sIEkgc2hvdWxkIGJlIGFibGUgdG8gdW5yYXZlbCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBgTlVNQV9NSUdSQVRJT05gIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuIEhvcGVmdWxseSwgdGhpcyB3aWxsIGdpdmUgbWUgYSBjbGVhciBwaWN0dXJlIG9mIHdoYXQgb3RoZXIgZmVhdHVyZXMgb3Igb3B0aW9ucyBuZWVkIHRvIGJlIGluIHBsYWNlIGZvciB0aGlzIHBhcnRpY3VsYXIgTlVNQSBtaWdyYXRpb24gZnVuY3Rpb25hbGl0eSB0byBiZSBhdmFpbGFibGUuIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBkZXBlbmRlbmNpZXMgb24gdGhlIE5VTUEgYXJjaGl0ZWN0dXJlIGl0c2VsZiwgYW5kIHBvdGVudGlhbGx5IG9uIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZlYXR1cmVzLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY2NTpcdFx0ICB0aG9zZSBwYWdlcyB0byBhbm90aGVyIGVudGl0eSwgc3VjaCBhcyBhIGh5cGVydmlzb3IsIHNvIHRoYXQgdGhlXG4gNjY2Olx0XHQgIG1lbW9yeSBjYW4gYmUgZnJlZWQgd2l0aGluIHRoZSBob3N0IGZvciBvdGhlciB1c2VzLlxuIDY2NzpcdFxuIDY2ODpcdGNvbmZpZyBOVU1BX01JR1JBVElPTlxuIDY2OTpcdFx0Ym9vbCBcJiMzNDtOVU1BIHBhZ2UgbWlncmF0aW9uXCYjMzQ7XG4gNjcwOlx0XHRkZWZhdWx0IHlcbiA2NzE6XHRcdGRlcGVuZHMgb24gTlVNQSBcdTAwMjZcdTAwMjYgTU1VXG4gNjcyOlx0XHRzZWxlY3QgTUlHUkFUSU9OXG4gNjczOlx0XHRoZWxwXG4gNjc0Olx0XHQgIFN1cHBvcnQgdGhlIG1pZ3JhdGlvbiBvZiBwYWdlcyB0byBvdGhlciBOVU1BIG5vZGVzLCBhdmFpbGFibGUgdG9cbiA2NzU6XHRcdCAgdXNlciBzcGFjZSB0aHJvdWdoIGludGVyZmFjZXMgbGlrZSBtaWdyYXRlX3BhZ2VzKCksIG1vdmVfcGFnZXMoKSxcbiA2NzY6XHRcdCAgYW5kIG1iaW5kKCkuIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBhbHNvIGVuYWJsZXMgc3VwcG9ydCBmb3IgcGFnZVxuIDY3NzpcdFx0ICBkZW1vdGlvbiBmb3IgbWVtb3J5IHRpZXJpbmcuXG4gNjc4Olx0XG4gNjc5Olx0Y29uZmlnIE1JR1JBVElPTlxuIDY4MDpcdFx0Ym9vbFxuIDY4MTpcdFx0ZGVwZW5kcyBvbiBNTVVcbiA2ODI6XHRcbiA2ODM6XHRjb25maWcgREVWSUNFX01JR1JBVElPTlxuIDY4NDpcdFx0ZGVmX2Jvb2wgTUlHUkFUSU9OIFx1MDAyNlx1MDAyNiBaT05FX0RFVklDRVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzMyMQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDc0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRlbHZpbmcgaW50byBOVU1BIE1pZ3JhdGlvbiBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgTlVNQV9NSUdSQVRJT05gIGFuZCwgbmF0dXJhbGx5LCBpdCBsZWFucyBvbiBib3RoIGBOVU1BYCBhbmQgdGhlIGBNTVVgLiBUaGF0IG1ha2VzIHNlbnNlLCByaWdodD8gSXQgd291bGRuJiMzOTt0IGJlIGFibGUgdG8gbWlncmF0ZSB3aXRob3V0IHRob3NlIHVuZGVybHlpbmcgc3RydWN0dXJlcy4gQnV0IG5vdyBteSBtaW5kIGlzIHN0YXJ0aW5nIHRvIHdhbmRlciBhIGJpdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGZ1bGwgY29udGV4dCBoZXJlLiBUaGF0JiMzOTtzIHdoZW4gSSB3b25kZXIgYWJvdXQgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIHdpdGhpbiBgbW0vcGFnZV9hbGxvYy5jYC4gSSBoYXZlIGEgZmVlbGluZyBJIG5lZWQgdG8gY2lyY2xlIGJhY2sgdG8gd2hhdCBnYXRlcyB0aGF0IGZ1bmN0aW9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQgZ3VhcmRzIHRoYXQgZnVuY3Rpb24gaW4gYG1tL3BhZ2VfYWxsb2MuY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTc5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs1NzkwOlx0XHRyZXR1cm4gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTtcbjU3OTE6XHR9XG41NzkyOlx0XG41NzkzOlx0c3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcbjU3OTQ6XHRcbjU3OTU6XHQvKipcbjU3OTY6XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdFxuNTc5NzpcdCAqIEBub2RlOiBub2RlIHdob3NlIGZhbGxiYWNrIGxpc3Qgd2UmIzM5O3JlIGFwcGVuZGluZ1xuNTc5ODpcdCAqIEB1c2VkX25vZGVfbWFzazogbm9kZW1hc2tfdCBvZiBhbHJlYWR5IHVzZWQgbm9kZXNcbjU3OTk6XHQgKiBAY2FuZGlkYXRlczogbm9kZW1hc2tfdCBvZiBub2RlcyBlbGlnaWJsZSBmb3Igc2VsZWN0aW9uXG41ODAwOlx0ICpcbjU4MDE6XHQgKiBXZSB1c2UgYSBudW1iZXIgb2YgZmFjdG9ycyB0byBkZXRlcm1pbmUgd2hpY2ggaXMgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZFxuNTgwMjpcdCAqIGFwcGVhciBvbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdC4gIFRoZSBub2RlIHNob3VsZCBub3QgaGF2ZSBhcHBlYXJlZFxuNTgwMzpcdCAqIGFscmVhZHkgaW4gQG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdCwgYW5kIGl0IHNob3VsZCBiZSB0aGUgbmV4dCBjbG9zZXN0IG5vZGVcbjU4MDQ6XHQgKiBhY2NvcmRpbmcgdG8gdGhlIGRpc3RhbmNlIGFycmF5ICh3aGljaCBjb250YWlucyBhcmJpdHJhcnkgZGlzdGFuY2UgdmFsdWVzXG41ODA1Olx0ICogZnJvbSBlYWNoIG5vZGUgdG8gZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0pLCBhbmQgc2hvdWxkIGFsc28gcHJlZmVyIG5vZGVzXG41ODA2Olx0ICogd2l0aCBubyBDUFVzLCBzaW5jZSBwcmVzdW1hYmx5IHRoZXkmIzM5O2xsIGhhdmUgdmVyeSBsaXR0bGUgYWxsb2NhdGlvbiBwcmVzc3VyZVxuNTgwNzpcdCAqIG9uIHRoZW0gb3RoZXJ3aXNlLlxuNTgwODpcdCAqXG41ODA5Olx0ICogUmV0dXJuOiBub2RlIGlkIG9mIHRoZSBmb3VuZCBub2RlIG9yICVOVU1BX05PX05PREUgaWYgbm8gbm9kZSBpcyBmb3VuZC5cbjU4MTA6XHQgKi9cbjU4MTE6XHRpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG41ODEyOlx0XHRcdFx0ICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcbjU4MTM6XHR7XG41ODE0Olx0XHRpbnQgbiwgdmFsO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDAzNgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgdGhlIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYXJlIGNvbnRyb2xsaW5nIGxpbmUgNTc5MCBpbiBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBpcyBhIHByZXR0eSBjb21tb24gZGVidWdnaW5nIHN0ZXA7IHVuZGVyc3RhbmRpbmcgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNhbiBiZSBjcnVjaWFsLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIGp1c3QgZGl2ZSBpbnRvIHRoZSBmaWxlLiBJ4oCZbGwgc2VhcmNoIGJhY2t3YXJkcyBmcm9tIGxpbmUgNTc5MCwgbG9va2luZyBmb3IgdGhlIHJlbGV2YW50IGAjaWZgIG9yIGAjaWZkZWZgIHN0YXRlbWVudCB0aGF0IGVuY2xvc2VzIGl0LiBIb3BlZnVsbHksIGl0JiMzOTtzIGEgcmVsYXRpdmVseSBzaG9ydCBzcGFuIHRvIGlkZW50aWZ5IHRoZSByZWxldmFudCBjb25kaXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14jaWYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9wYWdlX2FsbG9jLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jPTk5PXN0YXRpYyBERUZJTkVfTVVURVgocGNwX2JhdGNoX2hpZ2hfbG9jayk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTEwOS0gKi9cbm1tL3BhZ2VfYWxsb2MuYzoxMTA6I2lmbmRlZiBDT05GSUdfUFJFRU1QVF9SVFxubW0vcGFnZV9hbGxvYy5jLTExMS0jZGVmaW5lIHBjcHVfdGFza19waW4oKVx0XHRwcmVlbXB0X2Rpc2FibGUoKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xMjItICovXG5tbS9wYWdlX2FsbG9jLmM6MTIzOiNpZmRlZiBDT05GSUdfU01QXG5tbS9wYWdlX2FsbG9jLmMtMTI0LSNkZWZpbmUgcGNwX3NwaW5fdHJ5bG9jayhwdHIpXHRcdFx0XHRcdFx0XFxcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTY0LVxubW0vcGFnZV9hbGxvYy5jOjE2NTojaWZkZWYgQ09ORklHX1VTRV9QRVJDUFVfTlVNQV9OT0RFX0lEXG5tbS9wYWdlX2FsbG9jLmMtMTY2LURFRklORV9QRVJfQ1BVKGludCwgbnVtYV9ub2RlKTtcbm1tL3BhZ2VfYWxsb2MuYz0xNjc9RVhQT1JUX1BFUl9DUFVfU1lNQk9MKG51bWFfbm9kZSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTE2OS1cbm1tL3BhZ2VfYWxsb2MuYzoxNzA6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtMTcxLURFRklORV9TVEFUSUNfS0VZX1RSVUUodm1fbnVtYV9zdGF0X2tleSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTE3My1cbm1tL3BhZ2VfYWxsb2MuYzoxNzQ6I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcbm1tL3BhZ2VfYWxsb2MuYy0xNzUtLypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MTg1PXN0YXRpYyBERUZJTkVfTVVURVgocGNwdV9kcmFpbl9tdXRleCk7XG5tbS9wYWdlX2FsbG9jLmMtMTg2LVxubW0vcGFnZV9hbGxvYy5jOjE4NzojaWZkZWYgQ09ORklHX0dDQ19QTFVHSU5fTEFURU5UX0VOVFJPUFlcbm1tL3BhZ2VfYWxsb2MuYy0xODgtdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsYXRlbnRfZW50cm9weSBfX2xhdGVudF9lbnRyb3B5O1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xOTU9bm9kZW1hc2tfdCBub2RlX3N0YXRlc1tOUl9OT0RFX1NUQVRFU10gX19yZWFkX21vc3RseSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTk3LVx0W05fT05MSU5FXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxubW0vcGFnZV9hbGxvYy5jOjE5ODojaWZuZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtMTk5LVx0W05fTk9STUFMX01FTU9SWV0gPSB7IHsgWzBdID0gMVVMIH0gfSxcbm1tL3BhZ2VfYWxsb2MuYzoyMDA6I2lmZGVmIENPTkZJR19ISUdITUVNXG5tbS9wYWdlX2FsbG9jLmMtMjAxLVx0W05fSElHSF9NRU1PUlldID0geyB7IFswXSA9IDFVTCB9IH0sXG4tLVxubW0vcGFnZV9hbGxvYy5jPTIwOT1nZnBfdCBnZnBfYWxsb3dlZF9tYXNrIF9fcmVhZF9tb3N0bHkgPSBHRlBfQk9PVF9NQVNLO1xubW0vcGFnZV9hbGxvYy5jLTIxMC1cbm1tL3BhZ2VfYWxsb2MuYzoyMTE6I2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV9WQVJJQUJMRVxubW0vcGFnZV9hbGxvYy5jLTIxMi11bnNpZ25lZCBpbnQgcGFnZWJsb2NrX29yZGVyIF9fcmVhZF9tb3N0bHk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTIzMT1zdGF0aWMgaW50IHN5c2N0bF9sb3dtZW1fcmVzZXJ2ZV9yYXRpb1tNQVhfTlJfWk9ORVNdID0ge1xubW0vcGFnZV9hbGxvYy5jOjIzMjojaWZkZWYgQ09ORklHX1pPTkVfRE1BXG5tbS9wYWdlX2FsbG9jLmMtMjMzLVx0W1pPTkVfRE1BXSA9IDI1Nixcbm1tL3BhZ2VfYWxsb2MuYy0yMzQtI2VuZGlmXG5tbS9wYWdlX2FsbG9jLmM6MjM1OiNpZmRlZiBDT05GSUdfWk9ORV9ETUEzMlxubW0vcGFnZV9hbGxvYy5jLTIzNi1cdFtaT05FX0RNQTMyXSA9IDI1Nixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMjM4LVx0W1pPTkVfTk9STUFMXSA9IDMyLFxubW0vcGFnZV9hbGxvYy5jOjIzOTojaWZkZWYgQ09ORklHX0hJR0hNRU1cbm1tL3BhZ2VfYWxsb2MuYy0yNDAtXHRbWk9ORV9ISUdITUVNXSA9IDAsXG4tLVxubW0vcGFnZV9hbGxvYy5jPTI0NT1jaGFyICogY29uc3Qgem9uZV9uYW1lc1tNQVhfTlJfWk9ORVNdID0ge1xubW0vcGFnZV9hbGxvYy5jOjI0NjojaWZkZWYgQ09ORklHX1pPTkVfRE1BXG5tbS9wYWdlX2FsbG9jLmMtMjQ3LVx0IFwmIzM0O0RNQVwmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYy0yNDgtI2VuZGlmXG5tbS9wYWdlX2FsbG9jLmM6MjQ5OiNpZmRlZiBDT05GSUdfWk9ORV9ETUEzMlxubW0vcGFnZV9hbGxvYy5jLTI1MC1cdCBcJiMzNDtETUEzMlwmIzM0Oyxcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMjUyLVx0IFwmIzM0O05vcm1hbFwmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYzoyNTM6I2lmZGVmIENPTkZJR19ISUdITUVNXG5tbS9wYWdlX2FsbG9jLmMtMjU0LVx0IFwmIzM0O0hpZ2hNZW1cJiMzNDssXG4tLVxubW0vcGFnZV9hbGxvYy5jLTI1Ni1cdCBcJiMzNDtNb3ZhYmxlXCYjMzQ7LFxubW0vcGFnZV9hbGxvYy5jOjI1NzojaWZkZWYgQ09ORklHX1pPTkVfREVWSUNFXG5tbS9wYWdlX2FsbG9jLmMtMjU4LVx0IFwmIzM0O0RldmljZVwmIzM0Oyxcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MjYyPWNvbnN0IGNoYXIgKiBjb25zdCBtaWdyYXRldHlwZV9uYW1lc1tNSUdSQVRFX1RZUEVTXSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMjY2LVx0XCYjMzQ7SGlnaEF0b21pY1wmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYzoyNjc6I2lmZGVmIENPTkZJR19DTUFcbm1tL3BhZ2VfYWxsb2MuYy0yNjgtXHRcJiMzNDtDTUFcJiMzNDssXG5tbS9wYWdlX2FsbG9jLmMtMjY5LSNlbmRpZlxubW0vcGFnZV9hbGxvYy5jOjI3MDojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cbm1tL3BhZ2VfYWxsb2MuYy0yNzEtXHRcJiMzNDtJc29sYXRlXCYjMzQ7LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yODM9RVhQT1JUX1NZTUJPTChtb3ZhYmxlX3pvbmUpO1xubW0vcGFnZV9hbGxvYy5jLTI4NC1cbm1tL3BhZ2VfYWxsb2MuYzoyODU6I2lmIE1BWF9OVU1OT0RFUyBcdTAwM2UgMVxubW0vcGFnZV9hbGxvYy5jLTI4Ni11bnNpZ25lZCBpbnQgbnJfbm9kZV9pZHMgX19yZWFkX21vc3RseSA9IE1BWF9OVU1OT0RFUztcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzA1PWludCBwYWdlX2dyb3VwX2J5X21vYmlsaXR5X2Rpc2FibGVkIF9fcmVhZF9tb3N0bHk7XG5tbS9wYWdlX2FsbG9jLmMtMzA2LVxubW0vcGFnZV9hbGxvYy5jOjMwNzojaWZkZWYgQ09ORklHX0RFRkVSUkVEX1NUUlVDVF9QQUdFX0lOSVRcbm1tL3BhZ2VfYWxsb2MuYy0zMDgtLypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzM0PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqZ2V0X3BhZ2VibG9ja19iaXRtYXAoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTMzNi17XG5tbS9wYWdlX2FsbG9jLmM6MzM3OiNpZmRlZiBDT05GSUdfU1BBUlNFTUVNXG5tbS9wYWdlX2FsbG9jLmMtMzM4LVx0cmV0dXJuIHNlY3Rpb25fdG9fdXNlbWFwKF9fcGZuX3RvX3NlY3Rpb24ocGZuKSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTM0ND1zdGF0aWMgaW5saW5lIGludCBwZm5fdG9fYml0aWR4KGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbilcbm1tL3BhZ2VfYWxsb2MuYy0zNDUte1xubW0vcGFnZV9hbGxvYy5jOjM0NjojaWZkZWYgQ09ORklHX1NQQVJTRU1FTVxubW0vcGFnZV9hbGxvYy5jLTM0Ny1cdHBmbiBcdTAwMjY9IChQQUdFU19QRVJfU0VDVElPTi0xKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzYwPWdldF9wZm5ibG9ja19iaXRtYXBfYml0aWR4KGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMzY1LVxubW0vcGFnZV9hbGxvYy5jOjM2NjojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cbm1tL3BhZ2VfYWxsb2MuYy0zNjctXHRCVUlMRF9CVUdfT04oTlJfUEFHRUJMT0NLX0JJVFMgIT0gOCk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTQ0Mj1nZXRfcGZuYmxvY2tfbWlncmF0ZXR5cGUoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgcGZuKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy00NDgtXG5tbS9wYWdlX2FsbG9jLmM6NDQ5OiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxubW0vcGFnZV9hbGxvYy5jLTQ1MC1cdGlmIChmbGFncyBcdTAwMjYgQklUKFBCX21pZ3JhdGVfaXNvbGF0ZSkpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTUyNj1zdGF0aWMgdm9pZCBzZXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01MzItXG5tbS9wYWdlX2FsbG9jLmM6NTMzOiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxubW0vcGFnZV9hbGxvYy5jLTUzNC1cdGlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIHtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTQ4PXZvaWQgX19tZW1pbml0IGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01NTktXG5tbS9wYWdlX2FsbG9jLmM6NTYwOiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxubW0vcGFnZV9hbGxvYy5jLTU2MS1cdGlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTczLVxubW0vcGFnZV9hbGxvYy5jOjU3NDojaWZkZWYgQ09ORklHX0RFQlVHX1ZNXG5tbS9wYWdlX2FsbG9jLmMtNTc1LXN0YXRpYyBpbnQgcGFnZV9vdXRzaWRlX3pvbmVfYm91bmRhcmllcyhzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHBhZ2UgKnBhZ2UpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTY2MT1zdGF0aWMgaW5saW5lIGJvb2wgcGNwX2FsbG93ZWRfb3JkZXIodW5zaWduZWQgaW50IG9yZGVyKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy02NjQtXHRcdHJldHVybiB0cnVlO1xubW0vcGFnZV9hbGxvYy5jOjY2NTojaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9wYWdlX2FsbG9jLmMtNjY2LVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTY5Nj1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2J1ZGR5X29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTcwMS1cbm1tL3BhZ2VfYWxsb2MuYzo3MDI6I2lmZGVmIENPTkZJR19DT01QQUNUSU9OXG5tbS9wYWdlX2FsbG9jLmMtNzAzLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNhcHR1cmVfY29udHJvbCAqdGFza19jYXBjKHN0cnVjdCB6b25lICp6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xMDE1PXN0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2V4cGVjdGVkX3N0YXRlKHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xMDIyLVx0XHRcdHBhZ2VfcmVmX2NvdW50KHBhZ2UpIHxcbm1tL3BhZ2VfYWxsb2MuYzoxMDIzOiNpZmRlZiBDT05GSUdfTUVNQ0dcbm1tL3BhZ2VfYWxsb2MuYy0xMDI0LVx0XHRcdHBhZ2UtXHUwMDNlbWVtY2dfZGF0YSB8XG4tLVxubW0vcGFnZV9hbGxvYy5jPTEwMzM9c3RhdGljIGNvbnN0IGNoYXIgKnBhZ2VfYmFkX3JlYXNvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBmbGFncylcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTA0OC1cdH1cbm1tL3BhZ2VfYWxsb2MuYzoxMDQ5OiNpZmRlZiBDT05GSUdfTUVNQ0dcbm1tL3BhZ2VfYWxsb2MuYy0xMDUwLVx0aWYgKHVubGlrZWx5KHBhZ2UtXHUwMDNlbWVtY2dfZGF0YSkpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTEyMDI9c3RhdGljIHZvaWQgY2xlYXJfaGlnaHBhZ2VzX2thc2FuX3RhZ2dlZChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xMjE2LVxubW0vcGFnZV9hbGxvYy5jOjEyMTc6I2lmZGVmIENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HXG5tbS9wYWdlX2FsbG9jLmMtMTIxOC1cbi0tXG5tbS9wYWdlX2FsbG9jLmM9MTI5OD1zdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgX19mcmVlX3BhZ2VzX3ByZXBhcmUoc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTEzNTctXHRcdFx0cGFnZVsxXS5mbGFncy5mIFx1MDAyNj0gflBBR0VfRkxBR1NfU0VDT05EO1xubW0vcGFnZV9hbGxvYy5jOjEzNTg6I2lmZGVmIE5SX1BBR0VTX0lOX0xBUkdFX0ZPTElPXG5tbS9wYWdlX2FsbG9jLmMtMTM1OS1cdFx0XHRmb2xpby1cdTAwM2VfbnJfcGFnZXMgPSAwO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xOTE1PXN0YXRpYyBpbnQgZmFsbGJhY2tzW01JR1JBVEVfUENQVFlQRVNdW01JR1JBVEVfUENQVFlQRVMgLSAxXSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTkyMC1cbm1tL3BhZ2VfYWxsb2MuYzoxOTIxOiNpZmRlZiBDT05GSUdfQ01BXG5tbS9wYWdlX2FsbG9jLmMtMTkyMi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHN0cnVjdCBwYWdlICpfX3JtcXVldWVfY21hX2ZhbGxiYWNrKHN0cnVjdCB6b25lICp6b25lLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yMDE5PXN0YXRpYyBpbnQgbW92ZV9mcmVlcGFnZXNfYmxvY2soc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0yMDM0LVxubW0vcGFnZV9hbGxvYy5jOjIwMzU6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXG5tbS9wYWdlX2FsbG9jLmMtMjAzNi0vKiBMb29rIGZvciBhIGJ1ZGR5IHRoYXQgc3RyYWRkbGVzIHN0YXJ0X3BmbiAqL1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yNTU4PWJvb2wgZGVjYXlfcGNwX2hpZ2goc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3ApXG4tLVxubW0vcGFnZV9hbGxvYy5jLTI1OTAtXG5tbS9wYWdlX2FsbG9jLmM6MjU5MTojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0yNTkyLS8qXG4tLVxubW0vcGFnZV9hbGxvYy5jPTMxNzk9c3RhdGljIGlubGluZSB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZSAqcHJlZmVycmVkX3pvbmUsIHN0cnVjdCB6b25lICp6LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0zMTgxLXtcbm1tL3BhZ2VfYWxsb2MuYzozMTgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vcGFnZV9hbGxvYy5jLTMxODMtXHRlbnVtIG51bWFfc3RhdF9pdGVtIGxvY2FsX3N0YXQgPSBOVU1BX0xPQ0FMO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNTUzPXN0YXRpYyBpbmxpbmUgbG9uZyBfX3pvbmVfd2F0ZXJtYXJrX3VudXNhYmxlX2ZyZWUoc3RydWN0IHpvbmUgKnosXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM1NjQtXG5tbS9wYWdlX2FsbG9jLmM6MzU2NTojaWZkZWYgQ09ORklHX0NNQVxubW0vcGFnZV9hbGxvYy5jLTM1NjYtXHQvKiBJZiBhbGxvY2F0aW9uIGNhbiYjMzk7dCB1c2UgQ01BIGFyZWFzIGRvbiYjMzk7dCB1c2UgZnJlZSBDTUEgcGFnZXMgKi9cbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzU4MD1ib29sIF9fem9uZV93YXRlcm1hcmtfb2soc3RydWN0IHpvbmUgKnosIHVuc2lnbmVkIGludCBvcmRlciwgdW5zaWduZWQgbG9uZyBtYXJrLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0zNjQzLVxubW0vcGFnZV9hbGxvYy5jOjM2NDQ6I2lmZGVmIENPTkZJR19DTUFcbm1tL3BhZ2VfYWxsb2MuYy0zNjQ1LVx0XHRpZiAoKGFsbG9jX2ZsYWdzIFx1MDAyNiBBTExPQ19DTUEpIFx1MDAyNlx1MDAyNlxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNjY1PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX3dhdGVybWFya19mYXN0KHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3MDktXG5tbS9wYWdlX2FsbG9jLmM6MzcxMDojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0zNzExLWludCBfX3JlYWRfbW9zdGx5IG5vZGVfcmVjbGFpbV9kaXN0YW5jZSA9IFJFQ0xBSU1fRElTVEFOQ0U7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTM3MzQ9YWxsb2NfZmxhZ3Nfbm9mcmFnbWVudChzdHJ1Y3Qgem9uZSAqem9uZSwgZ2ZwX3QgZ2ZwX21hc2spXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3NDUtXG5tbS9wYWdlX2FsbG9jLmM6Mzc0NjojaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcbm1tL3BhZ2VfYWxsb2MuYy0zNzQ3LVx0aWYgKCF6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNzY4PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzX2NtYShnZnBfdCBnZnBfbWFzaylcbm1tL3BhZ2VfYWxsb2MuYy0zNzY5LXtcbm1tL3BhZ2VfYWxsb2MuYzozNzcwOiNpZmRlZiBDT05GSUdfQ01BXG5tbS9wYWdlX2FsbG9jLmMtMzc3MS1cdGlmIChnZnBfbWlncmF0ZXR5cGUoZ2ZwX21hc2spID09IE1JR1JBVEVfTU9WQUJMRSlcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NDAyNj1fX2FsbG9jX3BhZ2VzX21heV9vb20oZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNDExNy1cbm1tL3BhZ2VfYWxsb2MuYzo0MTE4OiNpZmRlZiBDT05GSUdfQ09NUEFDVElPTlxubW0vcGFnZV9hbGxvYy5jLTQxMTktLyogVHJ5IG1lbW9yeSBjb21wYWN0aW9uIGZvciBoaWdoLW9yZGVyIGFsbG9jYXRpb25zIGJlZm9yZSByZWNsYWltICovXG4tLVxubW0vcGFnZV9hbGxvYy5jPTQzMDc9c2hvdWxkX2NvbXBhY3RfcmV0cnkoZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBhbGxvY19jb250ZXh0ICphYywgaW50IG9yZGVyLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy00MzM0LVxubW0vcGFnZV9hbGxvYy5jOjQzMzU6I2lmZGVmIENPTkZJR19MT0NLREVQXG5tbS9wYWdlX2FsbG9jLmMtNDMzNi1zdGF0aWMgc3RydWN0IGxvY2tkZXBfbWFwIF9fZnNfcmVjbGFpbV9tYXAgPVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz00MzY1PXZvaWQgZnNfcmVjbGFpbV9hY3F1aXJlKGdmcF90IGdmcF9tYXNrKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy00MzcyLVxubW0vcGFnZV9hbGxvYy5jOjQzNzM6I2lmZGVmIENPTkZJR19NTVVfTk9USUZJRVJcbm1tL3BhZ2VfYWxsb2MuYy00Mzc0LVx0XHRsb2NrX21hcF9hY3F1aXJlKFx1MDAyNl9fbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnRfbWFwKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTE1ND11bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTUxODktXG5tbS9wYWdlX2FsbG9jLmM6NTE5MDojaWZkZWYgQ09ORklHX1BBR0VfT1dORVJcbm1tL3BhZ2VfYWxsb2MuYy01MTkxLVx0Lypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTc0NT1zdGF0aWMgaW50IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwgc3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01NzYyLVxubW0vcGFnZV9hbGxvYy5jOjU3NjM6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNTc2NC1cbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTkxMj1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTkxNy1cbm1tL3BhZ2VfYWxsb2MuYzo1OTE4OiNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG5tbS9wYWdlX2FsbG9jLmMtNTkxOS0vKlxuLS1cbm1tL3BhZ2VfYWxsb2MuYz01OTc3PXN0YXRpYyB2b2lkIF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkYXRhKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01OTk2LVxubW0vcGFnZV9hbGxvYy5jOjU5OTc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNTk5OC1cdG1lbXNldChub2RlX2xvYWQsIDAsIHNpemVvZihub2RlX2xvYWQpKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjAxNy1cbm1tL3BhZ2VfYWxsb2MuYzo2MDE4OiNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG5tbS9wYWdlX2FsbG9jLmMtNjAxOS1cdFx0Lypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NjA2OT12b2lkIF9fcmVmIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjA5Ni1cdFx0dm1fdG90YWxfcGFnZXMpO1xubW0vcGFnZV9hbGxvYy5jOjYwOTc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNjA5OC1cdHByX2luZm8oXCYjMzQ7UG9saWN5IHpvbmU6ICVzXFxuXCYjMzQ7LCB6b25lX25hbWVzW3BvbGljeV96b25lXSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTYxMDI9c3RhdGljIGludCB6b25lX2JhdGNoc2l6ZShzdHJ1Y3Qgem9uZSAqem9uZSlcbm1tL3BhZ2VfYWxsb2MuYy02MTAzLXtcbm1tL3BhZ2VfYWxsb2MuYzo2MTA0OiNpZmRlZiBDT05GSUdfTU1VXG5tbS9wYWdlX2FsbG9jLmMtNjEwNS1cdGludCBiYXRjaDtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NjE1MD1zdGF0aWMgaW50IHpvbmVfaGlnaHNpemUoc3RydWN0IHpvbmUgKnpvbmUsIGludCBiYXRjaCwgaW50IGNwdV9vbmxpbmUsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTYxNTIte1xubW0vcGFnZV9hbGxvYy5jOjYxNTM6I2lmZGVmIENPTkZJR19NTVVcbm1tL3BhZ2VfYWxsb2MuYy02MTU0LVx0aW50IGhpZ2g7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTYzNjA9dm9pZCBfX2luaXQgc2V0dXBfcGVyX2NwdV9wYWdlc2V0KHZvaWQpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTYzNjgtXG5tbS9wYWdlX2FsbG9jLmM6NjM2OTojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy02MzcwLVx0Lypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NjcyMz1pbnQgX19tZW1pbml0IGluaXRfcGVyX3pvbmVfd21hcmtfbWluKHZvaWQpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTY3MjktXG5tbS9wYWdlX2FsbG9jLmM6NjczMDojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy02NzMxLVx0c2V0dXBfbWluX3VubWFwcGVkX3JhdGlvKCk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTY3NjI9c3RhdGljIGludCB3YXRlcm1hcmtfc2NhbGVfZmFjdG9yX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTY3NzYtXG5tbS9wYWdlX2FsbG9jLmM6Njc3NzojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy02Nzc4LXN0YXRpYyB2b2lkIHNldHVwX21pbl91bm1hcHBlZF9yYXRpbyh2b2lkKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz02OTE4PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIHBhZ2VfYWxsb2Nfc3lzY3RsX3RhYmxlW10gPSB7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTY5NjgtXHR9LFxubW0vcGFnZV9hbGxvYy5jOjY5Njk6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNjk3MC1cdHtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NzA5Nz12b2lkIF9fZnJlZV9jb250aWdfcmFuZ2UodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTcxMDEtXG5tbS9wYWdlX2FsbG9jLmM6NzEwMjojaWZkZWYgQ09ORklHX0NPTlRJR19BTExPQ1xubW0vcGFnZV9hbGxvYy5jLTcxMDMtLyogVXNhZ2U6IFNlZSBhZG1pbi1ndWlkZS9keW5hbWljLWRlYnVnLWhvd3RvLnJzdCAqL1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz03Njc0PXZvaWQgem9uZV9wY3BfcmVzZXQoc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc2OTItXG5tbS9wYWdlX2FsbG9jLmM6NzY5MzojaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcbm1tL3BhZ2VfYWxsb2MuYy03Njk0LS8qXG4tLVxubW0vcGFnZV9hbGxvYy5jPTc3NjY9RVhQT1JUX1NZTUJPTChpc19mcmVlX2J1ZGR5X3BhZ2UpO1xubW0vcGFnZV9hbGxvYy5jLTc3NjctXG5tbS9wYWdlX2FsbG9jLmM6Nzc2ODojaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFXG5tbS9wYWdlX2FsbG9jLmMtNzc2OS1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHpvbmUgKnpvbmUsXG4tLVxubW0vcGFnZV9hbGxvYy5jPTc4NjE9Ym9vbCBoYXNfbWFuYWdlZF96b25lKGVudW0gem9uZV90eXBlIHpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc4NzEtXG5tbS9wYWdlX2FsbG9jLmM6Nzg3MjojaWZkZWYgQ09ORklHX1VOQUNDRVBURURfTUVNT1JZXG5tbS9wYWdlX2FsbG9jLmMtNzg3My1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjk2MjUKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGEgQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24gQmxvY2sqKgoKT2theSwgc28gbGluZSA1NzYzIG9mIHRoaXMgY29kZSBoYXMgYSBgI2lmZGVmIENPTkZJR19OVU1BYCBkaXJlY3RpdmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1JpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2NvcGUgb2YgdGhhdCBjb25kaXRpb25hbCBjb21waWxhdGlvbi4mIzM0OyBJdCYjMzk7cyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgTlVNQS1hd2FyZSBtZW1vcnkgYWxsb2NhdGlvbiB3b3JrcyBpbiB0aGlzIHNwZWNpZmljIGNvbnRleHQuIFRoZSBmaXJzdCB0aGluZyBJJiMzOTttIGdvaW5nIHRvIGRvIGlzIGxvY2F0ZSB3aGVyZSB0aGF0IGAjaWZkZWZgIGJsb2NrIHRlcm1pbmF0ZXMuIEdpdmVuIHRoZSBsaWtlbHkgc3RydWN0dXJlIG9mIHRoZSBjb2RlLCBJJiMzOTtsbCBiZXQgaXQmIzM5O3Mgbm90IGZhciBmcm9tIHRoZSBsaW5lLiBNeSBmb2N1cyBub3cgaXMgb24gbGluZXMgNTkzMC01OTQ1IHdpdGhpbiBgbW0vcGFnZV9hbGxvYy5jYCwgSSYjMzk7bGwgc3RhcnQgdGhlcmUgbG9va2luZyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYCNlbmRpZmAgc3RhdGVtZW50IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgY29kZSB0aGF0JiMzOTtzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgdGhlIE5VTUEgY29uZmlnLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzICppbnNpZGUqIHRoYXQgYmxvY2sgdG8gZ2V0IGEgZnVsbCBwaWN0dXJlIG9mIHRoZSBpbXBhY3Qgb2YgdGhlIE5VTUEgY29uZmlndXJhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9wYWdlX2FsbG9jLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1OTMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzU5MzA6XHRcdFx0XHRcdCAgIGdmcF96b25lKEdGUF9LRVJORUwpLFxuNTkzMTpcdFx0XHRcdFx0ICAgTlVMTCk7XG41OTMyOlx0XHRyZXR1cm4gem9uZWxpc3Rfbm9kZV9pZHgoeik7XG41OTMzOlx0fVxuNTkzNDpcdCNlbmRpZlxuNTkzNTpcdFxuNTkzNjpcdHN0YXRpYyB2b2lkIHNldHVwX21pbl91bm1hcHBlZF9yYXRpbyh2b2lkKTtcbjU5Mzc6XHRzdGF0aWMgdm9pZCBzZXR1cF9taW5fc2xhYl9yYXRpbyh2b2lkKTtcbjU5Mzg6XHQjZWxzZVx0LyogQ09ORklHX05VTUEgKi9cbjU5Mzk6XHRcbjU5NDA6XHRzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbjU5NDE6XHR7XG41OTQyOlx0XHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnM7XG41OTQzOlx0XHRpbnQgbnJfem9uZXM7XG41OTQ0Olx0XG41OTQ1Olx0XHR6b25lcmVmcyA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7XG41OTQ2Olx0XHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdkYXQsIHpvbmVyZWZzKTtcbjU5NDc6XHRcdHpvbmVyZWZzICYjNDM7PSBucl96b25lcztcbjU5NDg6XHRcbjU5NDk6XHRcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDIxMAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDEyMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRm9jdXNpbmcgb24gTlVNQSBNZW1vcnkgTWFuYWdlbWVudCBmb3IgRnV6emluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB0aGUgY29kZSBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vcGFnZV9hbGxvYy5jYCBsb29rcyBpbnRlcmVzdGluZywgZXNwZWNpYWxseSBjb25zaWRlcmluZyBpdCYjMzk7cyB1bmRlciBgI2lmZGVmIENPTkZJR19OVU1BYCBhbmQgc3BlY2lmaWNhbGx5LCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBpcyBwcm90ZWN0ZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gLCB3aGljaCBpbXBsaWVzIGl0JiMzOTtzIHJlbGV2YW50IHRvIE5VTUEgYW5kIG1lbW9yeSBtaWdyYXRpb24uIFNvLCBib3RoIGBDT05GSUdfTlVNQWAgYW5kIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGFyZSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuCgpOb3csIGlzIHRoaXMgY29kZSBldmVuIHdvcnRoIGZ1enppbmc/IERlZmluaXRlbHkuIFRoaXMgaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyB3aXRoaW4gdGhlIGBtbS9gIHN1YnN5c3RlbS4gSSYjMzk7dmUgZ290IGNoYW5nZXMgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGFuZCBgYnVpbGRfbm9kZV96b25lbGlzdGAgaW4gYG1tL3BhZ2VfYWxsb2MuY2AsIGFuZCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBDcnVjaWFsbHksIHRoaXMgY29kZSBpcyByZWFjaGFibGUgaW4gYSBOVU1BLWVuYWJsZWQga2VybmVsIHJ1bm5pbmcgaW4gUUVNVSBiZWNhdXNlIGBidWlsZF9ub2RlX3pvbmVsaXN0YCAob3IgYGJ1aWxkX3pvbmVsaXN0c2ApIGlzIGV4ZWN1dGVkIGF0IGJvb3QsIGR1cmluZyBtZW1vcnkgaG90cGx1ZyBhbmQgd2hlbiB0cmlnZ2VyZWQgYnkgbWVtb3J5IHByZXNzdXJlLCB0aGUgYG5leHRfZGVtb3Rpb25fbm9kZWAgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIG1lbW9yeSByZWNsYWltLiBGdXJ0aGVybW9yZSwgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBpcyBjYWxsZWQgYXQgYm9vdCBhbmQgb24gaG90cGx1ZyAvIHN5c2ZzIG1lbW9yeSB0aWVyIG9wZXJhdGlvbnMuIFRoaXMgZGlyZWN0bHkgaW1wYWN0cyBob3cgTlVNQSB6b25lbGlzdHMgYXJlIGJ1aWx0IGFuZCBob3cgd2Ugc2VsZWN0IG5vZGVzIGZvciBmYWxsYmFjayBhbmQgZGVtb3Rpb24sIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgcmVmYWN0b3JpbmcgYW5kIGxvZ2ljIGNoYW5nZSB0aGUgZnV6emluZyBndWlkZWxpbmVzIGhpZ2hsaWdodCBhcyBhIGhpZ2gtdmFsdWUgdGFyZ2V0LiBJdCYjMzk7cyBhIGNsZWFyICYjMzk7V29ydGhGdXp6aW5nPXRydWUmIzM5Oy4KClNvLCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIHNwZWNpZmljcyBvZiBGb2N1c1N5bWJvbHMuIEkmIzM5O20gZm9sbG93aW5nIHRoZSBndWlkZWxpbmVzLCB3aGljaCBzYXlzIHRvIGF2b2lkIHViaXF1aXRvdXMgaG90LXBhdGhzIGFuZCBpbnN0ZWFkIHRhcmdldCBzcGVjaWZpYyBmZWF0dXJlIGxvZ2ljIGFuZCBlbnRyeXBvaW50cy4KCkhlcmXigJlzIHRoZSBjdXJyZW50IHRoaW5raW5nOgoKMS4gIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBpbiBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBpcyBub24tc3RhdGljIChkZWNsYXJlZCBpbiBgbW0vaW50ZXJuYWwuaGAgYW5kIGRlZmluZWQgaW4gYG1tL3BhZ2VfYWxsb2MuY2ApIGFuZCBpcyBvbmx5IGNhbGxlZCB3aGVuIGJ1aWxkaW5nIHpvbmVsaXN0cyBvciBmaW5kaW5nIGRlbW90aW9uIHRhcmdldHMsIHNvIGl0JiMzOTtzIG5vdCB1YmlxdWl0b3VzLiBEZWZpbml0ZWx5IGEgY29udGVuZGVyLgoKMi4gIGBidWlsZF9ub2RlX3pvbmVsaXN0YCBpbiBgbW0vcGFnZV9hbGxvYy5jYCBpcyBzdGF0aWMsIHdoaWNoIG1pZ2h0IG1ha2UgaXQgaW5saW5lZCwgc28gcG90ZW50aWFsbHkgdXNlbGVzcyBhcyBhIGZ1enppbmcgc3ltYm9sLiBCdXQsIGl0JiMzOTtzIGNhbGxlZCBieSBgYnVpbGRfem9uZWxpc3RzYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgX19idWlsZF9hbGxfem9uZWxpc3RzYCwgd2hpY2ggaXMgKmFsc28qIGNhbGxlZCBvbiBib290IGFuZCBob3RwbHVnLCBzbyB0aGlzICpjb3VsZCogYmUgZ29vZC4gTGV0JiMzOTtzIGNoZWNrIGlmIHRoZSBkZWZpbml0aW9uIGlzIGlubGluZWQuLi4gT2gsIEkgc2VlISBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgaXMgKm5vdCogc3RhdGljLCBzbyBpdCAqaXMqIGFuIGFjdHVhbCBzeW1ib2wuIEdvb2QsIGdvb2QuCgozLiAgYG5leHRfZGVtb3Rpb25fbm9kZWAgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBub24tc3RhdGljLiBBZ2Fpbiwgbm90IHViaXF1aXRvdXMsIG9ubHkgdXNlZCBpbiBgZGVtb3RlX2ZvbGlvX2xpc3RgLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gVGhpcyBpcyBhIHNvbGlkIGNhbmRpZGF0ZS4KCjQuICBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgc3RhdGljLiBJIG5lZWQgdG8gZmluZCB0aGUgbm9uLXN0YXRpYyBmdW5jdGlvbnMgdGhhdCBjYWxsIGl0IG9yIGFyZSBlbnRyeXBvaW50cyB0byBpdHMgZnVuY3Rpb25hbGl0eS4gTG9va2luZyBhdCB0aGUgY2FsbGVycywgSSBoYXZlIGBtZW1vcnlfdGllcl9sYXRlX2luaXRgIGFuZCBgbWVtdGllcl9ob3RwbHVnX2NhbGxiYWNrYCBhcyBjYW5kaWRhdGVzLiBJIHNob3VsZCBhbHNvIGNoZWNrIHdpdGhpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGl0c2VsZi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYz00MDA9c3RhdGljIHZvaWQgZHVtcF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNDI0LSAqL1xubW0vbWVtb3J5LXRpZXJzLmM6NDI1OnN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG5tbS9tZW1vcnktdGllcnMuYy00MjYte1xuLS1cbm1tL21lbW9yeS10aWVycy5jLTUyMS0jZWxzZVxubW0vbWVtb3J5LXRpZXJzLmM6NTIyOnN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxubW0vbWVtb3J5LXRpZXJzLmMtNTIzLSNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbi0tXG5tbS9tZW1vcnktdGllcnMuYz03MDg9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfbGF0ZV9pbml0KHZvaWQpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNzMxLVxubW0vbWVtb3J5LXRpZXJzLmM6NzMyOlx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcbm1tL21lbW9yeS10aWVycy5jLTczMy1cdHB1dF9vbmxpbmVfbWVtcygpO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTg4Mj1zdGF0aWMgaW50IF9fbWVtaW5pdCBtZW10aWVyX2hvdHBsdWdfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLFxuLS1cbm1tL21lbW9yeS10aWVycy5jLTg5MS1cdFx0aWYgKGNsZWFyX25vZGVfbWVtb3J5X3RpZXIobm4tXHUwMDNlbmlkKSlcbm1tL21lbW9yeS10aWVycy5jOjg5MjpcdFx0XHRlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpO1xubW0vbWVtb3J5LXRpZXJzLmMtODkzLVx0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtODk4LVx0XHRpZiAoIUlTX0VSUihtZW10aWVyKSlcbm1tL21lbW9yeS10aWVycy5jOjg5OTpcdFx0XHRlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpO1xubW0vbWVtb3J5LXRpZXJzLmMtOTAwLVx0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyNjgwCgkJCQkJCQlvdXRwdXQ6IDE5NwoJCQkJCQkJdGhvdWdodHM6IDkwNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQ29kZSBDaGFuZ2VzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGxvb2tzIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHpvbmVsaXN0IHJlYnVpbGRpbmcsIHdoaWNoIGlzIGEgZ29vZCBwbGFjZSB0byBzdGFydC4gIFRoZSByZWFsIHdvcmsgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIGluIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCwgYW5kIHRoZSBub24tc3RhdGljIGZ1bmN0aW9uIGBuZXh0X2RlbW90aW9uX25vZGVgIHVzZWQgZHVyaW5nIGRlbW90aW9uLiAgSSBzZWUgYSBzdGF0aWMgZnVuY3Rpb24sIGBkZW1vdGVfZm9saW9fbGlzdGAsIGFzIHdlbGwgYnV0IHRoYXQgbWF5IGJlIGxlc3MgcmVsZXZhbnQgaGVyZS4gIGBidWlsZF9hbGxfem9uZWxpc3RzYCBpcyBhbHNvIG5vbi1zdGF0aWMsIHNvIHRob3NlIGFyZSBteSBrZXkgdGFyZ2V0cy4KCkkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBicm9hZGx5IHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZC4gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGlzIGludm9sdmVkIGluIHpvbmVsaXN0IGNvbnN0cnVjdGlvbiwgZGVtb3Rpb24sIGFuZCBmaW5kaW5nIHRoZSBiZXN0IG5vZGUsIHNvIHBvdGVudGlhbGx5IGltcG9ydGFudC4gIGBuZXh0X2RlbW90aW9uX25vZGVgIGFwcGVhcnMgbGltaXRlZCB0byBmb2xpbyBkZW1vdGlvbiwgYW5kIGBidWlsZF9hbGxfem9uZWxpc3RzYCBraWNrcyBpbiBkdXJpbmcgYm9vdCwgbWVtb3J5IGhvdHBsdWcvb2ZmbGluaW5nLCBhbmQgem9uZWxpc3QgcmVidWlsZHMg4oCTIG5vdCBleGFjdGx5ICp1YmlxdWl0b3VzKiwgYnV0IGRlZmluaXRlbHkgY3JpdGljYWwgc3lzdGVtIGV2ZW50cy4KCk5vdywgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiAgSSYjMzk7bSBzZWVpbmcgYE5VTUFgIGFzIGEgcmVxdWlyZW1lbnQgZm9yIHRoZSBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgaW1wbGVtZW50YXRpb24gYW5kIGNvbXBpbGluZyBgbW0vbWVtb3J5LXRpZXJzLmNgLiAgYE5VTUFfTUlHUkFUSU9OYCByZXF1aXJlcyBgTlVNQWAgYW5kIGBNTVVgICh3aGljaCBpcyBwcmV0dHkgbXVjaCBzdGFuZGFyZCBvbiBhbWQ2NCksIHNwZWNpZmljYWxseSBmb3IgYG5leHRfZGVtb3Rpb25fbm9kZWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaW4gYG1tL21lbW9yeS10aWVycy5jYC4gIFNvLCBgTlVNQWAgYW5kIGBOVU1BX01JR1JBVElPTmAgYXJlIGtleSBjb25maWcgb3B0aW9ucy4KCkRyaWxsaW5nIGludG8gdGhlIGNvZGUsIGBtbS9wYWdlX2FsbG9jLmNgIHNob3dzIHRoYXQgYG5vZGVfbG9hZGAsIGBidWlsZF9ub2RlX3pvbmVsaXN0YCwgYW5kIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBhcmUgYWxsIGd1YXJkZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQWAuIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgY29tcGlsZWQgdW5kZXIgYG9iai0kKENPTkZJR19OVU1BKSAmIzQzOz0gbWVtb3J5LXRpZXJzLm9gLiAgV2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AsIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGFyZSBwcm90ZWN0ZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gLiAgSSYjMzk7dmUgY2hlY2tlZCB0aGUgYE1ha2VmaWxlYCBhbmQgYG1lbW9yeS10aWVycy5oYCB0byBjb25maXJtIHRoZSBkZXBlbmRlbmNpZXMuCgpJbiBzdW1tYXJ5OgoqICAgVGhlIHBhdGNoIHJlZmFjdG9ycyBgZmluZF9uZXh0X2Jlc3Rfbm9kZWAgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIHdpdGggYSBjYW5kaWRhdGUgbm9kZW1hc2suCiogICBJdCB1cGRhdGVzIE5VTUEgZmFsbGJhY2sgem9uZWxpc3QgY29uc3RydWN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgIHdoaWNoIHN0cmVhbWxpbmVzIHpvbmVsaXN0IGdlbmVyYXRpb24gZGlyZWN0bHkgaW50byB0aGUgbm9kZSB6b25lbGlzdCBidWZmZXIuCiogICBJdCBtb2RpZmllcyBkZW1vdGlvbiBub2RlIHNlbGVjdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIHRvIHVzZSB0aGUgcmVmYWN0b3JlZCBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAKKiAgIFRoZSBjb2RlIHRvdWNoZXMgZnVuZGFtZW50YWwgTU0gbG9naWMsIHNwZWNpZmljYWxseSBOVU1BIHpvbmVsaXN0IGNvbnN0cnVjdGlvbiBhbmQgbWVtb3J5IHRpZXJpbmcgKGluY2x1ZGluZyBkZW1vdGlvbiB0YXJnZXQgY2FsY3VsYXRpb25zKSB0cmlnZ2VyZWQgZHVyaW5nIGJvb3QsIG1lbW9yeSBob3RwbHVnL29mZmxpbmUsIGFuZCBtZW1vcnkgcmVjbGFpbSBpZiBOVU1BIGRlbW90aW9uIGlzIGVuYWJsZWQuCgpUaGVyZWZvcmUsIHRoaXMgaXMgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuIFRoZSBrZXkgZnVuY3Rpb25zIHRvIHRhcmdldCBhcmUgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gLCBgbmV4dF9kZW1vdGlvbl9ub2RlYCwgYW5kIGBidWlsZF9hbGxfem9uZWxpc3RzYCwgYW5kIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgSSBuZWVkIHRvIGVuYWJsZSBhcmUgYE5VTUFgIGFuZCBgTlVNQV9NSUdSQVRJT05gLiAgSSYjMzk7bSBjb21mb3J0YWJsZSB3aXRoIHRoZSBhbmFseXNpcywgc28gbGV0JiMzOTtzIHNldCB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgTlVNQSB6b25lbGlzdCBnZW5lcmF0aW9uIGFuZCBub2RlIGZhbGxiYWNrIGNhbGN1bGF0aW9uIGJ5IGludHJvZHVjaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIHdpdGggYSBgY2FuZGlkYXRlc2Agbm9kZW1hc2sgcGFyYW1ldGVyIGFuZCBtZXJnaW5nIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgLlxuXG4tIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZSAobm8gaW5mby1sZWFrcykuXG4tIE5vIG5ldyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGludHJvZHVjZWQuXG4tIEFsbCB2YXJpYWJsZXMgKHN1Y2ggYXMgYHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FYCkgYW5kIHpvbmVyZWYgdGVybWluYXRpb25zIChgem9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTExgLCBgem9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwYCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLlxuLSBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludHJvZHVjZWQgYnkgem9uZWxpc3QgaW5kZXhpbmcgb3IgdHJhdmVyc2FsIHdvdWxkIGJlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgcG9pbnRlciBlcnJvcnMsIHdoaWNoIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBLTVNBTiB1bmluaXRpYWxpemVkIG1lbW9yeSBkZXRlY3Rpb24gaXMgbm90IGFwcGxpY2FibGUuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMDM6Mzc6MDIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCBkYTE0YzU2ZmIyNGUxLi4xNTE5ZGQyMWE5MDBmIDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTExMzMsNyAmIzQzOzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKIAkJCQkgIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwotZXh0ZXJuIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayk7CiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLAomIzQzOwkJY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyk7CiAjZWxzZQogI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwCiAKQEAgLTExNDIsNyAmIzQzOzExNDMsOCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaywKJiM0MzsJCWNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpCiB7CiAJcmV0dXJuIE5VTUFfTk9fTk9ERTsKIH0KZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmMKaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmMKQEAgLTM3MCw3ICYjNDM7MzcwLDcgQEAgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKQogCSAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LgogCSAqLwogCW5vZGVzX2NvbXBsZW1lbnQobWFzaywgKmFsbG93ZWRfbWFzayk7Ci0JcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgJmFtcDttYXNrKTsKJiM0MzsJcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDttYXNrLCAmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZCkKQEAgLTQ1MCw3ICYjNDM7NDUwLDcgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkKIAkJbWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTsKIAkJdGllcl9ub2RlcyA9IGdldF9tZW10aWVyX25vZGVtYXNrKG1lbXRpZXIpOwogCQkvKgotCQkgKiBmaW5kX25leHRfYmVzdF9ub2RlLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiYjNDM7CQkgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiAJCSAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXIKIAkJICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlCiAJCSAqIG1lbXRpZXIgbm9kZWxpc3QuCkBAIC00NjMsNyAmIzQzOzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpCiAJCSAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLgogCQkgKi8KIAkJZG8gewotCQkJdGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCAmYW1wO3RpZXJfbm9kZXMpOwomIzQzOwkJCXRhcmdldCA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDt0aWVyX25vZGVzLAomIzQzOwkJCQkJCQkmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiAJCQlpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSkKIAkJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDFjZmJkMDU4MmExMGEuLmQxODg4ZDU2MzBlMGEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTU3OTMsOSAmIzQzOzU3OTMsMTAgQEAgc3RhdGljIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CiAKIC8qKgotICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QKJiM0MzsgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdAogICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSYjMzk7cmUgYXBwZW5kaW5nCiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzCiYjNDM7ICogQGNhbmRpZGF0ZXM6IG5vZGVtYXNrX3Qgb2Ygbm9kZXMgZWxpZ2libGUgZm9yIHNlbGVjdGlvbgogICoKICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkCiAgKiBhcHBlYXIgb24gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWQKQEAgLTU4MDcsNyAmIzQzOzU4MDgsOCBAQCBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOwogICoKICAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuCiAgKi8KLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssCiYjNDM7CQkJICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcykKIHsKIAlpbnQgbiwgdmFsOwogCWludCBtaW5fdmFsID0gSU5UX01BWDsKQEAgLTU4MTcsMTIgJiM0Mzs1ODE5LDEyIEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIAkgKiBVc2UgdGhlIGxvY2FsIG5vZGUgaWYgd2UgaGF2ZW4mIzM5O3QgYWxyZWFkeSwgYnV0IGZvciBtZW1vcnlsZXNzIGxvY2FsCiAJICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy4KIAkgKi8KLQlpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSAmYW1wOyZhbXA7IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7CiYjNDM7CWlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spICZhbXA7JmFtcDsgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHsKIAkJbm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTsKIAkJcmV0dXJuIG5vZGU7CiAJfQogCi0JZm9yX2VhY2hfbm9kZV9zdGF0ZShuLCBOX01FTU9SWSkgewomIzQzOwlmb3JfZWFjaF9ub2RlX21hc2sobiwgKmNhbmRpZGF0ZXMpIHsKIAogCQkvKiBEb24mIzM5O3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovCiAJCWlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpCkBAIC01ODU1LDMxICYjNDM7NTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIH0KIAogCi0vKgotICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuCi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwKLSAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgotICovCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsCi0JCXVuc2lnbmVkIG5yX25vZGVzKQotewotCXN0cnVjdCB6b25lcmVmICp6b25lcmVmczsKLQlpbnQgaTsKLQotCXpvbmVyZWZzID0gcGdkYXQtJmd0O25vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfbm9kZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWludCBucl96b25lczsKLQotCQlwZ19kYXRhX3QgKm5vZGUgPSBOT0RFX0RBVEEobm9kZV9vcmRlcltpXSk7Ci0KLQkJbnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTsKLQkJem9uZXJlZnMgJiM0Mzs9IG5yX3pvbmVzOwotCX0KLQl6b25lcmVmcy0mZ3Q7em9uZSA9IE5VTEw7Ci0Jem9uZXJlZnMtJmd0O3pvbmVfaWR4ID0gMDsKLX0KLQogLyoKICAqIEJ1aWxkIF9fR0ZQX1RISVNOT0RFIHpvbmVsaXN0cwogICovCkBAIC01ODk1LDE5ICYjNDM7NTg3MiwyNCBAQCBzdGF0aWMgdm9pZCBidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKIAl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogfQogCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW4KJiM0MzsgKiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbCBETUEgem9uZSwgaWYgYW55LS1idXQKJiM0MzsgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcywKJiM0MzsJCQkJaW50IHpsaWR4KQogewotCXN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdOwotCWludCBub2RlLCBucl9ub2RlcyA9IDA7CiYjNDM7CXN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LSZndDtub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzOwogCW5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7Ci0JaW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTsKJiM0MzsJaW50IGxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKJiM0MzsJaW50IHByZXZfbm9kZSA9IGxvY2FsX25vZGU7CiYjNDM7CWludCBub2RlOwogCi0JLyogTlVNQS1hd2FyZSBvcmRlcmluZyBvZiBub2RlcyAqLwotCWxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKLQlwcmV2X25vZGUgPSBsb2NhbF9ub2RlOwomIzQzOwlwcl9pbmZvKCYjMzQ7RmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6ICYjMzQ7LCBsb2NhbF9ub2RlKTsKIAotCW1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpOwotCXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2spKSAmZ3Q7PSAwKSB7CiYjNDM7CXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2ssCiYjNDM7CQkJCQkgICAgICBjYW5kaWRhdGVzKSkgJmd0Oz0gMCkgewogCQkvKgogCQkgKiBXZSBkb24mIzM5O3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS4KIAkJICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZQpAQCAtNTkxNywxOCAmIzQzOzU4OTksMjIgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiAJCSAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpCiAJCQlub2RlX2xvYWRbbm9kZV0gJiM0Mzs9IDE7CiAKLQkJbm9kZV9vcmRlcltucl9ub2RlcyYjNDM7JiM0MztdID0gbm9kZTsKJiM0MzsJCXpvbmVyZWZzICYjNDM7PSBidWlsZF96b25lcmVmc19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZXJlZnMpOwomIzQzOwkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlKTsKIAkJcHJldl9ub2RlID0gbm9kZTsKIAl9CiAKLQlidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpOwotCWJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7Ci0JcHJfaW5mbygmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiAmIzM0OywgbG9jYWxfbm9kZSk7Ci0JZm9yIChub2RlID0gMDsgbm9kZSAmbHQ7IG5yX25vZGVzOyBub2RlJiM0MzsmIzQzOykKLQkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlX29yZGVyW25vZGVdKTsKJiM0MzsJem9uZXJlZnMtJmd0O3pvbmUgPSBOVUxMOwomIzQzOwl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogCXByX2NvbnQoJiMzNDtcbiYjMzQ7KTsKIH0KIAomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQomIzQzO3sKJiM0MzsJYnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgJmFtcDtub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTsKJiM0MzsJYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTsKJiM0Mzt9CiYjNDM7CiAjaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFUwogLyoKICAqIFJldHVybiBub2RlIGlkIG9mIG5vZGUgdXNlZCBmb3IgJiMzNDtsb2NhbCYjMzQ7IGFsbG9jYXRpb25zLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDUyMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDc4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIGZpZ3VyZSBvdXQgaWYgaXQgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY2hhbmdlcyBmaXJzdCwgdGhlbiBhc3Nlc3MgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgcmlza3MuCgpTbywgaGVyZSYjMzk7cyB3aGF0IEkgc2VlOiB0aGUgY29yZSBvZiB0aGUgcGF0Y2ggcmV2b2x2ZXMgYXJvdW5kIHRoZSBgZmluZF9uZXh0X2Jlc3Rfbm9kZWAgZnVuY3Rpb24uIEl0JiMzOTtzIGJlZW4gcmVuYW1lZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgYW5kIGEgYGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXNgIHBhcmFtZXRlciBoYXMgYmVlbiBhZGRlZC4gVGhlIGNoYW5nZXMgc2VlbSB0byBiZSBwcm9wYWdhdGluZyB0aGlzIG5ldyBmdW5jdGlvbiBzaWduYXR1cmUgdGhyb3VnaG91dCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4KClNwZWNpZmljYWxseSwgSSBzZWUgdGhpcyBmdW5jdGlvbiBub3cgYmVpbmcgdXNlZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLCBpbiBib3RoIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLiBUaGUgY3J1Y2lhbCBwYXJ0IGhlcmUgaXMgaG93IHRoZXNlIGBjYW5kaWRhdGVzYCBtYXNrcyBhcmUgYmVpbmcgdXNlZDsgaXQmIzM5O3MgbGlrZWx5IHdoZXJlIGFueSBwb3RlbnRpYWwgaXNzdWVzIG1pZ2h0IGhpZGUuCgpGdXJ0aGVyIGRvd24gdGhlIHJhYmJpdCBob2xlLCBgbW0vcGFnZV9hbGxvYy5jYCBjb250YWlucyB0aGUgbWVhdCBvZiB0aGUgaW1wbGVtZW50YXRpb24uIFRoZSBrZXkgY2hhbmdlIGhlcmUgaXMgaG93IGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBub3cgdXNlcyBgbm9kZV9pc3NldGAgYW5kIGBmb3JfZWFjaF9ub2RlX21hc2tgIHdpdGggdGhlIHByb3ZpZGVkIGBjYW5kaWRhdGVzYCBtYXNrIGluc3RlYWQgb2YgdGhlIG9sZCBgTl9NRU1PUllgIG5vZGUgc3RhdGUuIFRoZSBjaGFuZ2VzIGluIGBidWlsZF96b25lbGlzdHNgIHNlZW0gc2lnbmlmaWNhbnQgYXMgd2VsbC4gSXQgbG9va3MgbGlrZSB0aGV5JiMzOTt2ZSByZWZhY3RvcmVkIHRoZSBvbGQgbm9kZSBvcmRlcmluZyBsb2dpYyB0byBkaXJlY3RseSBidWlsZCB6b25lbGlzdHMgYmFzZWQgb24gdGhlIGBjYW5kaWRhdGVzYCBtYXNrIHdpdGhpbiBhIG5ldyBgYnVpbGRfbm9kZV96b25lbGlzdGAgZnVuY3Rpb24uIEluc3RlYWQgb2YgY2FsbGluZyBvdXQgdG8gYSBmdW5jdGlvbiB0byBidWlsZCB0aGUgem9uZSBsaXN0IHVzaW5nIG5vZGUgb3JkZXIsIHRoZSBuZXcgYXBwcm9hY2ggc2VlbXMgdG8gYmUgYnVpbGRpbmcgaXQgaW4gdGhlIGxvb3AgaXRzZWxmLgoKTm93LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3M6IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgYmFzaWNzOyBhcmUgdGhlcmUgYW55IG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9ucyB0aGF0IGFyZW4mIzM5O3QgaW5pdGlhbGl6ZWQ/IGBub2RlbWFza190IHVzZWRfbWFza2AgbG9va3MgaW5pdGlhbGl6ZWQsIGFuZCBgem9uZXJlZnNgIGlzIHBvaW50aW5nIHRvIGFuIGV4aXN0aW5nIGFycmF5IGluIGBwZ2RhdGAsIHdoaWNoIGdldHMgdGVybWluYXRlZCB3aXRoIGB6b25lcmVmcy0mZ3Q7em9uZSA9IE5VTEw7IHpvbmVyZWZzLSZndDt6b25lX2lkeCA9IDA7YC4gT2theSwgdGhhdCBsb29rcyBzYWZlLiBOb3RoaW5nIGlzIGJlaW5nIGNvcGllZCB0byB1c2Vyc3BhY2UsIHNvIHRoYXQmIzM5O3Mgb25lIGxlc3MgY29uY2Vybi4KClRoZSBtb3N0IHByb2JhYmxlIGFyZWEgb2YgY29uY2VybiBpcyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBgY2FuZGlkYXRlc2AgaXMgdGhlIGNydWNpYWwgcG9pbnRlciBoZXJlLCBwb3RlbnRpYWxseS4gSXQmIzM5O3MgcG9pbnRlZCB0byBlaXRoZXIgYG5vZGVfc3RhdGVzW05fTUVNT1JZXWAgb3IgYCZhbXA7bWFza2AgLyBgJmFtcDt0aWVyX25vZGVzYC4gU28sIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGluaXRpYWxpemF0aW9uIG9mIGBtYXNrYCBhbmQgYHRpZXJfbm9kZXNgIGluIGBtZW1vcnktdGllcnMuY2AgYXJvdW5kIGxpbmVzIDM3MCBhbmQgNDUwLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRob3NlIG1hc2tzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdGhleSYjMzk7cmUgcGFzc2VkIHRvIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzYwOlx0XHQgKiBsYXN0IHRhcmdldCBub2RlLiBPciBpbnRyb2R1Y2luZyBwZXItY3B1IGRhdGEgdG8gYXZvaWRcbiAzNjE6XHRcdCAqIGNhY2hpbmcgaXNzdWUsIHdoaWNoIHNlZW1zIG1vcmUgY29tcGxpY2F0ZWQuIFNvIHNlbGVjdGluZ1xuIDM2MjpcdFx0ICogdGFyZ2V0IG5vZGUgcmFuZG9tbHkgc2VlbXMgYmV0dGVyIHVudGlsIG5vdy5cbiAzNjM6XHRcdCAqL1xuIDM2NDpcdFx0aWYgKCFub2Rlc19lbXB0eShtYXNrKSlcbiAzNjU6XHRcdFx0cmV0dXJuIG5vZGVfcmFuZG9tKFx1MDAyNm1hc2spO1xuIDM2NjpcdFxuIDM2NzpcdFx0LypcbiAzNjg6XHRcdCAqIFByZWZlcnJlZCBub2RlcyBhcmUgbm90IGluIGFsbG93ZWRfbWFzay4gRmxpcCBiaXRzIGluXG4gMzY5Olx0XHQgKiBhbGxvd2VkX21hc2sgYXMgdXNlZCBub2RlIG1hc2suIFRoZW4sIHVzZSBpdCB0byBnZXQgdGhlXG4gMzcwOlx0XHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cbiAzNzE6XHRcdCAqL1xuIDM3MjpcdFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcbiAzNzM6XHRcdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNm1hc2ssIFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XG4gMzc0Olx0fVxuIDM3NTpcdFxuIDM3NjpcdHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZClcbiAzNzc6XHR7XG4gMzc4Olx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMzc5Olx0XHRpbnQgbm9kZTtcbiAzODA6XHRcbiAzODE6XHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcbiAzODI6XHRcdFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcbiAzODM6XHRcdFx0LypcbiAzODQ6XHRcdFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxuIDM4NTpcdFx0XHQgKiB0byBhY2Nlc3MgcGdkYS1cdTAwM2VtZW10aWVyLlxuIDM4NjpcdFx0XHQgKi9cbiAzODc6XHRcdFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XG4gMzg4Olx0XHRcdGlmIChtZW10aWVyKVxuIDM4OTpcdFx0XHRcdG1lbXRpZXItXHUwMDNlbG93ZXJfdGllcl9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG4gMzkwOlx0XHR9XG4gMzkxOlx0XHQvKlxuIDM5MjpcdFx0ICogRW5zdXJlIHRoYXQgdGhlIFwmIzM0O2Rpc2FibGVcJiMzNDsgaXMgdmlzaWJsZSBhY3Jvc3MgdGhlIHN5c3RlbS5cbiAzOTM6XHRcdCAqIFJlYWRlcnMgd2lsbCBzZWUgZWl0aGVyIGEgY29tYmluYXRpb24gb2YgYmVmb3JlJiM0MztkaXNhYmxlXG4gMzk0Olx0XHQgKiBzdGF0ZSBvciBkaXNhYmxlJiM0MzthZnRlci4gIFRoZXkgd2lsbCBuZXZlciBzZWUgYmVmb3JlIGFuZFxuIDM5NTpcdFx0ICogYWZ0ZXIgc3RhdGUgdG9nZXRoZXIuXG4gMzk2Olx0XHQgKi9cbiAzOTc6XHRcdHN5bmNocm9uaXplX3JjdSgpO1xuIDM5ODpcdH1cbiAzOTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjUxMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgbGluZXMgb2YgY29kZToKCioqRGl2aW5nIGludG8gYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBtZW1vcnkgdGllcnMgYWdhaW4uIE15IGludHVpdGlvbiB0ZWxscyBtZSB0byBkcmlsbCBkb3duIGludG8gYG1tL21lbW9yeS10aWVycy5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lcyA0NDAgdG8gNDgwIHdpdGhpbiB0aGUgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBmdW5jdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIHN1c3BlY3QgdGhpcyBzZWN0aW9uIGlzIHdoZXJlIHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvdXQgKndoaWNoKiBtZW1vcnkgcmVnaW9ucyBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZGVtb3Rpb24g4oCTIHRoYXQgaXMsIG1vdmluZyBkYXRhIGZyb20gYSBmYXN0ZXIsIG1vcmUgZXhwZW5zaXZlIHRpZXIgZG93biB0byBhIHNsb3dlciwgY2hlYXBlciBvbmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjcml0ZXJpYSBhbmQgbG9naWMgYmVpbmcgdXNlZC4gQXJlIHdlIGxvb2tpbmcgYXQgYWNjZXNzIGZyZXF1ZW5jeSwgb3ZlcmFsbCBmb290cHJpbnQsIHJlY2VuY3ksIG9yIHNvbWUgY29tcGxleCBjb21iaW5hdGlvbiBvZiB0aGVzZSBmYWN0b3JzPyBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgbGlrZWx5IGNvbnRhaW5zIHRoZSBjb3JlIGRlbW90aW9uIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLCBhbmQgaXQmIzM5O3MgZXNzZW50aWFsIHRvIGFuYWx5emUgaXQgd2l0aCBhIGZpbmUtdG9vdGggY29tYiB0byB1bmRlcnN0YW5kIGhvdyBlZmZlY3RpdmUgdGhlIHRpZXJpbmcgaXMgYW5kIGhvdyBpdCBtaWdodCBiZSBpbXByb3ZlZC4gTGV0JiMzOTtzIHNlZSB3aGF0IGdlbXMgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtb3J5LXRpZXJzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQ0MDpcdFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkge1xuIDQ0MTpcdFx0XHRiZXN0X2Rpc3RhbmNlID0gLTE7XG4gNDQyOlx0XHRcdG5kID0gXHUwMDI2bm9kZV9kZW1vdGlvbltub2RlXTtcbiA0NDM6XHRcbiA0NDQ6XHRcdFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XG4gNDQ1Olx0XHRcdGlmICghbWVtdGllciB8fCBsaXN0X2lzX2xhc3QoXHUwMDI2bWVtdGllci1cdTAwM2VsaXN0LCBcdTAwMjZtZW1vcnlfdGllcnMpKVxuIDQ0NjpcdFx0XHRcdGNvbnRpbnVlO1xuIDQ0NzpcdFx0XHQvKlxuIDQ0ODpcdFx0XHQgKiBHZXQgdGhlIGxvd2VyIG1lbXRpZXIgdG8gZmluZCB0aGUgIGRlbW90aW9uIG5vZGUgbGlzdC5cbiA0NDk6XHRcdFx0ICovXG4gNDUwOlx0XHRcdG1lbXRpZXIgPSBsaXN0X25leHRfZW50cnkobWVtdGllciwgbGlzdCk7XG4gNDUxOlx0XHRcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcbiA0NTI6XHRcdFx0LypcbiA0NTM6XHRcdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiwgdXNlICYjMzk7dXNlZCYjMzk7IG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxuIDQ1NDpcdFx0XHQgKiBBZGQgYWxsIG1lbW9yeSBub2RlcyBleGNlcHQgdGhlIHNlbGVjdGVkIG1lbW9yeSB0aWVyXG4gNDU1Olx0XHRcdCAqIG5vZGVsaXN0IHRvIHNraXAgbGlzdCBzbyB0aGF0IHdlIGZpbmQgdGhlIGJlc3Qgbm9kZSBmcm9tIHRoZVxuIDQ1NjpcdFx0XHQgKiBtZW10aWVyIG5vZGVsaXN0LlxuIDQ1NzpcdFx0XHQgKi9cbiA0NTg6XHRcdFx0bm9kZXNfYW5kbm90KHRpZXJfbm9kZXMsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgdGllcl9ub2Rlcyk7XG4gNDU5Olx0XG4gNDYwOlx0XHRcdC8qXG4gNDYxOlx0XHRcdCAqIEZpbmQgYWxsIHRoZSBub2RlcyBpbiB0aGUgbWVtb3J5IHRpZXIgbm9kZSBsaXN0IG9mIHNhbWUgYmVzdCBkaXN0YW5jZS5cbiA0NjI6XHRcdFx0ICogYWRkIHRoZW0gdG8gdGhlIHByZWZlcnJlZCBtYXNrLiBXZSByYW5kb21seSBzZWxlY3QgYmV0d2VlbiBub2Rlc1xuIDQ2MzpcdFx0XHQgKiBpbiB0aGUgcHJlZmVycmVkIG1hc2sgd2hlbiBhbGxvY2F0aW5nIHBhZ2VzIGR1cmluZyBkZW1vdGlvbi5cbiA0NjQ6XHRcdFx0ICovXG4gNDY1Olx0XHRcdGRvIHtcbiA0NjY6XHRcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4gNDY3Olx0XHRcdFx0XHRcdFx0XHRcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuIDQ2ODpcdFx0XHRcdGlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKVxuIDQ2OTpcdFx0XHRcdFx0YnJlYWs7XG4gNDcwOlx0XG4gNDcxOlx0XHRcdFx0ZGlzdGFuY2UgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIHRhcmdldCk7XG4gNDcyOlx0XHRcdFx0aWYgKGRpc3RhbmNlID09IGJlc3RfZGlzdGFuY2UgfHwgYmVzdF9kaXN0YW5jZSA9PSAtMSkge1xuIDQ3MzpcdFx0XHRcdFx0YmVzdF9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuIDQ3NDpcdFx0XHRcdFx0bm9kZV9zZXQodGFyZ2V0LCBuZC1cdTAwM2VwcmVmZXJyZWQpO1xuIDQ3NTpcdFx0XHRcdH0gZWxzZSB7XG4gNDc2Olx0XHRcdFx0XHRicmVhaztcbiA0Nzc6XHRcdFx0XHR9XG4gNDc4Olx0XHRcdH0gd2hpbGUgKDEpO1xuIDQ3OTpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NDE0CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoZSBwcm92aWRlZCBwcm9tcHQ6CgoqKkRpdmluZyBpbnRvIGBwYWdlX2FsbG9jLmNgIGFuZCBab25lbGlzdHMqKgoKT2theSwgc28gdGhlIHByb21wdCBpcyBhc2tpbmcgbWUgdG8gdGhpbmsgYWJvdXQgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIGNvZGUsIGBwYWdlX2FsbG9jLmNgLCBhbmQgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGZ1bmN0aW9uLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyByZWxhdGVzIHRvIHRoZSBmdW5kYW1lbnRhbCBtZW1vcnkgYWxsb2NhdGlvbiBtZWNoYW5pc21zIHdpdGhpbiB0aGUga2VybmVsLCBhbmQgdGhlIHN0cnVjdHVyaW5nIG9mIG1lbW9yeSB6b25lcyBhY3Jvc3MgTlVNQSBub2Rlcy4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBwcm9iYWJseSBzdGFydCBieSBxdWlja2x5IHJldmlld2luZyBgYnVpbGRfbm9kZV96b25lbGlzdGAmIzM5O3MgcHVycG9zZS4gSSByZW1lbWJlciBpdCYjMzk7cyByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHRoZSB6b25lbGlzdCBmb3IgZWFjaCBub2RlLiBUaGUgem9uZWxpc3QgZGljdGF0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBrZXJuZWwgd2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIHBhZ2VzIGZyb20gZGlmZmVyZW50IG1lbW9yeSB6b25lcyAoZS5nLiwgRE1BLCBOb3JtYWwsIEhpZ2hNZW0pIHdpdGhpbiBhIE5VTUEgbm9kZSBhbmQgcG90ZW50aWFsbHkgYWNyb3NzIG90aGVyIG5vZGVzLiBJJiMzOTtkIHByb2JhYmx5IG1lbnRhbGx5IHJlY29uc3RydWN0IGhvdyB0aGUgZGlmZmVyZW50IHpvbmVzIG9uIGEgbm9kZSwgYW5kIHpvbmVzIGZyb20gb3RoZXIgbm9kZXMsIGFyZSBhZGRlZCB0byB0aGF0IGxpc3QuCgpUaGVuLCBJJiMzOTtkIGNvbnNpZGVyIGNvbW1vbiBzY2VuYXJpb3M6IEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgdGhpbmdzIEkgc2hvdWxkIGJlIHRoaW5raW5nIGFib3V0PyBJcyB0aGlzIGEgc3RhbmRhcmQgc2NlbmFyaW8sIGlzIHRoZXJlIHNvbWV0aGluZyB1bnVzdWFsIGFib3V0IHRoZSBwcm9tcHQsIG9yIGlzIHRoaXMgYSB0cmljayBxdWVzdGlvbj8KClRoZSBpbnRlcnBsYXkgd2l0aCBOVU1BIGlzIGtleS4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0aGUgaW1wYWN0IG9mIE5VTUEgYmFsYW5jaW5nLCB0aGUgaW1wYWN0IG9mIHByZWZlcnJlZCBub2RlcywgYW5kIHRoZSBlZmZlY3RzIG9mIG5vZGUgaW50ZXJsZWF2ZSBwb2xpY2llcy4gSSYjMzk7ZCBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgY29uZmlndXJhdGlvbnMgY2FuIHNpZ25pZmljYW50bHkgYWZmZWN0IHRoZSB6b25lbGlzdCBjb25zdHJ1Y3Rpb24uCgpGaW5hbGx5LCBkZXBlbmRpbmcgb24gY29udGV4dCwgSSYjMzk7ZCBwcm9iYWJseSBiZSB0aGlua2luZyBhYm91dCBwZXJmb3JtYW5jZSBpbXBhY3RzLiBIb3cgdGhlIHpvbmVsaXN0IGlzIG9yZGVyZWQgZGlyZWN0bHkgYWZmZWN0cyBhbGxvY2F0aW9uIGxhdGVuY3kuIEFyZSB0aGVyZSBhbnkga25vd24gYXJlYXMgd2hlcmUgc3Vib3B0aW1hbCB6b25lbGlzdCBjb25zdHJ1Y3Rpb24gbGVhZHMgdG8gcGVyZm9ybWFuY2UgaXNzdWVzPyBJIG1pZ2h0IGJlIHRoaW5raW5nIGFib3V0IGhvdyB0aGluZ3MgYXJlIGNvbmZpZ3VyZWQsIGJlY2F1c2UgSSByZWNhbGwgdGhhdCBzb21ldGltZXMsIHRoZSBpZGVhbCB6b25lbGlzdCBvcmRlcmluZyBpcyBhIGJhbGFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTg3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs1ODcwOlx0XHR6b25lcmVmcyAmIzQzOz0gbnJfem9uZXM7XG41ODcxOlx0XHR6b25lcmVmcy1cdTAwM2V6b25lID0gTlVMTDtcbjU4NzI6XHRcdHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMDtcbjU4NzM6XHR9XG41ODc0Olx0XG41ODc1Olx0LypcbjU4NzY6XHQgKiBCdWlsZCBvbmUgem9uZWxpc3Qgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS4gVGhpcyByZXN1bHRzIGluXG41ODc3Olx0ICogbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwgRE1BIHpvbmUsIGlmIGFueS0tYnV0XG41ODc4Olx0ICogcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS5cbjU4Nzk6XHQgKi9cbjU4ODA6XHRzdGF0aWMgdm9pZCBidWlsZF9ub2RlX3pvbmVsaXN0KHBnX2RhdGFfdCAqcGdkYXQsIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMsXG41ODgxOlx0XHRcdFx0XHRpbnQgemxpZHgpXG41ODgyOlx0e1xuNTg4MzpcdFx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbemxpZHhdLl96b25lcmVmcztcbjU4ODQ6XHRcdG5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG41ODg1Olx0XHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG41ODg2Olx0XHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbjU4ODc6XHRcdGludCBub2RlO1xuNTg4ODpcdFxuNTg4OTpcdFx0cHJfaW5mbyhcJiMzNDtGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXCYjMzQ7LCBsb2NhbF9ub2RlKTtcbjU4OTA6XHRcbjU4OTE6XHRcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrLFxuNTg5MjpcdFx0XHRcdFx0XHQgICAgICBjYW5kaWRhdGVzKSkgXHUwMDNlPSAwKSB7XG41ODkzOlx0XHRcdC8qXG41ODk0Olx0XHRcdCAqIFdlIGRvbiYjMzk7dCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxuNTg5NTpcdFx0XHQgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lXG41ODk2Olx0XHRcdCAqIGRpc3RhbmNlIGdyb3VwIHRvIG1ha2UgaXQgcm91bmQtcm9iaW4uXG41ODk3Olx0XHRcdCAqL1xuNTg5ODpcdFx0XHRpZiAobm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBub2RlKSAhPVxuNTg5OTpcdFx0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKVxuNTkwMDpcdFx0XHRcdG5vZGVfbG9hZFtub2RlXSAmIzQzOz0gMTtcbjU5MDE6XHRcbjU5MDI6XHRcdFx0em9uZXJlZnMgJiM0Mzs9IGJ1aWxkX3pvbmVyZWZzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lcmVmcyk7XG41OTAzOlx0XHRcdHByX2NvbnQoXCYjMzQ7JWQgXCYjMzQ7LCBub2RlKTtcbjU5MDQ6XHRcdFx0cHJldl9ub2RlID0gbm9kZTtcbjU5MDU6XHRcdH1cbjU5MDY6XHRcbjU5MDc6XHRcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuNTkwODpcdFx0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuNTkwOTpcdFx0cHJfY29udChcJiMzNDtcXG5cJiMzNDspO1xuNTkxMDpcdH1cbjU5MTE6XHRcbjU5MTI6XHRzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbjU5MTM6XHR7XG41OTE0Olx0XHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTtcbjU5MTU6XHRcdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XG41OTE2Olx0fVxuNTkxNzpcdFxuNTkxODpcdCNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG41OTE5Olx0LypcbjU5MjA6XHQgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFwmIzM0O2xvY2FsXCYjMzQ7IGFsbG9jYXRpb25zLlxuNTkyMTpcdCAqIEkuZS4sIGZpcnN0IG5vZGUgaWQgb2YgZmlyc3Qgem9uZSBpbiBhcmcgbm9kZSYjMzk7cyBnZW5lcmljIHpvbmVsaXN0LlxuNTkyMjpcdCAqIFVzZWQgZm9yIGluaXRpYWxpemluZyBwZXJjcHUgJiMzOTtudW1hX21lbSYjMzk7LCB3aGljaCBpcyB1c2VkIHByaW1hcmlseVxuNTkyMzpcdCAqIGZvciBrZXJuZWwgYWxsb2NhdGlvbnMsIHNvIHVzZSBHRlBfS0VSTkVMIGZsYWdzIHRvIGxvY2F0ZSB6b25lbGlzdC5cbjU5MjQ6XHQgKi9cbjU5MjU6XHRpbnQgbG9jYWxfbWVtb3J5X25vZGUoaW50IG5vZGUpXG41OTI2Olx0e1xuNTkyNzpcdFx0c3RydWN0IHpvbmVyZWYgKno7XG41OTI4Olx0XG41OTI5Olx0XHR6ID0gZmlyc3Rfem9uZXNfem9uZWxpc3Qobm9kZV96b25lbGlzdChub2RlLCBHRlBfS0VSTkVMKSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODc5MAoJCQkJCQkJb3V0cHV0OiAyMDkKCQkJCQkJCXRob3VnaHRzOiA1NjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogVGhpcyBQYXRjaCBpcyBTYWZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IHByaW1hcnkgY29uY2VybiBpcyBhbHdheXMgdW5pbml0aWFsaXplZCBtZW1vcnksIHJpZ2h0PyBEb2VzIHRoaXMgcGF0Y2ggaW50cm9kdWNlIGEgcmlzayB0aGVyZT8gSSYjMzk7dmUgZ29uZSB0aHJvdWdoIGl0IHN0ZXAgYnkgc3RlcC4gRmlyc3QsIEkgY2hlY2tlZDogZG9lcyBhbnkga2VybmVsIG1lbW9yeSBsZWFrIGludG8gdXNlciBzcGFjZT8gTm9wZSwgbm90aGluZyYjMzk7cyBjb3BpZWQgb3V0LiBBcmUgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgc3RydWN0cyBvciBidWZmZXJzIGNyZWF0ZWQgb3IgcGFzc2VkIGFyb3VuZD8gQWdhaW4sIG5vLiBUaGUgYGNhbmRpZGF0ZXNgIHBhcmFtZXRlciBpcyBhIGBjb25zdCBub2RlbWFza190YCwgcG9pbnRpbmcgdG8gYSBnbG9iYWwga2VybmVsIHZhcmlhYmxlLCBzbyB0aGF0JiMzOTtzIGNvdmVyZWQuIEluc2lkZSB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zIGxpa2UgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGFuZCBgYnVpbGRfbm9kZV96b25lbGlzdGAsIEkgc2VlIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiBgY2FuZGlkYXRlc2AgYW5kIGluaXRpYWxpemVkIHZhcmlhYmxlcy4gTm8gcmVkIGZsYWdzIHRoZXJlLgoKVGhlbiwgSSBsb29rZWQgYXQgYWxsb2NhdGlvbnMuIElzIHRoaXMgaW50cm9kdWNpbmcgbmV3IG9uZXMsIHN0YWNrIG9yIGhlYXA/IE5vLCBhY3R1YWxseSwgaXQgKnJlbW92ZWQqIGFsbG9jYXRpb25zISBUaGF0JiMzOTtzIGEgZ29vZCBzaWduLiBBbmQgbm8gY2hhbmdlcyB0byBhbnkgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGxpa2UgaW9jdGwsIG5ldGxpbmssIG9yIHN5c2NhbGxzLiBUaGlzIGlzIGFsbCBpbnRlcm5hbCBOVU1BIG1lbW9yeSBhbGxvY2F0aW9uIGxvZ2ljLgoKU28sIGFtIEkgc2VlaW5nICphbnkqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJ1Z3MgdGhhdCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaD8gTm8uIEFueSBidWdzIGhlcmUgd291bGQgYmUgbG9naWNhbCBlcnJvcnMsIG91dC1vZi1ib3VuZHMgem9uZXJlZiBhY2Nlc3MsIHdoaWNoIEtBU0FOIHdvdWxkIGNhdGNoLCBvciBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHMsIHdoaWNoIGFyZSBub3QgcmVsZXZhbnQgdG8gS01TQU4uCgpUaGVyZWZvcmUsIG5vIEtNU0FOIGlzIG5lZWRlZCBoZXJlLiBLQVNBTiBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIG1lbW9yeSBjb3JydXB0aW9uIG9yIGJvdW5kYXJ5IGlzc3VlcyB0aGF0IG1pZ2h0IGFyaXNlLgoKTm93LCBsZXQgbWUgZG91YmxlLWNoZWNrIGFnYWluc3QgdGhlIGNyaXRlcmlhOiBUaGUgcmVxdWlyZW1lbnRzIHN0YXRlIHRoYXQgS01TQU4gaXNuJiMzOTt0IG5lZWRlZCBpZiB0aGUgcHJpbWFyeSByaXNrcyBhcmUgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG92ZXJmbG93cywgbnVsbCBkZXJlZmVyZW5jZXMsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHdoaWNoIGFyZSBLQVNBTiYjMzk7cyBkb21haW4pLCBvciBpZiBhbGwgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQuIEFsbCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIEl0IGFsc28gc3RhdGVzIHRoZSBwYXRjaCBtdXN0IG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgb3IgaW5mby1sZWFrcywgYW5kIGl0IGRvZXNuJiMzOTt0LgoKU28sIE5lZWRzS01TQU4gPSBmYWxzZS4gQ2FzZSBjbG9zZWQuIEkmIzM5O20gcmVhZHkgdG8gd3JpdGUgdXAgdGhlIHJlYXNvbmluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cblxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cblxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzowMy41MDAyOTUzNDZaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTk5ODIxMjYxODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTlVNQVwiLFxuICAgIFwiTlVNQV9NSUdSQVRJT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJmaW5kX25leHRfYmVzdF9ub2RlX2luXCIsXG4gICAgXCJuZXh0X2RlbW90aW9uX25vZGVcIixcbiAgICBcImJ1aWxkX2FsbF96b25lbGlzdHNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gYW5kIG5vZGUgZmFsbGJhY2sgY2FsY3VsYXRpb24gYnkgaW50cm9kdWNpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAgd2l0aCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBwYXJhbWV0ZXIgYW5kIG1lcmdpbmcgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKClgIGludG8gYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAuXFxuXFxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxcbi0gTm8gbmV3IGhlYXAgb3Igc3RhY2sgYWxsb2NhdGlvbnMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG4tIEFsbCB2YXJpYWJsZXMgKHN1Y2ggYXMgYHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FYCkgYW5kIHpvbmVyZWYgdGVybWluYXRpb25zIChgem9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVxcdTAwM2V6b25lX2lkeCA9IDBgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuXFxuLSBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludHJvZHVjZWQgYnkgem9uZWxpc3QgaW5kZXhpbmcgb3IgdHJhdmVyc2FsIHdvdWxkIGJlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgcG9pbnRlciBlcnJvcnMsIHdoaWNoIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBLTVNBTiB1bmluaXRpYWxpemVkIG1lbW9yeSBkZXRlY3Rpb24gaXMgbm90IGFwcGxpY2FibGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGZpbmRfbmV4dF9iZXN0X25vZGUoKSBpbnRvIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKSwgYWxsb3dpbmcgY2FsbGVycyB0byBzcGVjaWZ5IGVsaWdpYmxlIGNhbmRpZGF0ZSBub2RlcyB2aWEgYSBub2RlbWFzay4gSXQgYWxzbyByZXN0cnVjdHVyZXMgem9uZWxpc3QgYnVpbGRpbmcgaW4gbW0vcGFnZV9hbGxvYy5jIChidWlsZF9ub2RlX3pvbmVsaXN0KSBhbmQgdXBkYXRlcyBkZW1vdGlvbiB0YXJnZXQgcmVzb2x1dGlvbiBpbiBtbS9tZW1vcnktdGllcnMuYyAobmV4dF9kZW1vdGlvbl9ub2RlIGFuZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cykuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyByZWFjaGFibGUgZHVyaW5nIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiAoZS5nLiBib290IGFuZCBtZW1vcnkgaG90cGx1Zy9yZWJ1aWxkKSBhbmQgZm9saW8gZGVtb3Rpb24gZHVyaW5nIG1lbW9yeSByZWNsYW1hdGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MDMuNTAwMzAxMzk2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDIzOTYzOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgU2VwIDEyIDAzOjM3OjAyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXFxuaW5kZXggZGExNGM1NmZiMjRlMS4uMTUxOWRkMjFhOTAwZiAxMDA2NDRcXG4tLS0gYS9tbS9pbnRlcm5hbC5oXFxuKysrIGIvbW0vaW50ZXJuYWwuaFxcbkBAIC0xMTMzLDcgKzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xcbiBcXG4gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsXFxuIFxcdFxcdFxcdFxcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XFxuLWV4dGVybiBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spO1xcbitpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuK1xcdFxcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpO1xcbiAjZWxzZVxcbiAjZGVmaW5lIG5vZGVfcmVjbGFpbV9tb2RlIDBcXG4gXFxuQEAgLTExNDIsNyArMTE0Myw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG4ge1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcXG4rc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuK1xcdFxcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXFxuIHtcXG4gXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4gfVxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnktdGllcnMuYyBiL21tL21lbW9yeS10aWVycy5jXFxuaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xcbisrKyBiL21tL21lbW9yeS10aWVycy5jXFxuQEAgLTM3MCw3ICszNzAsNyBAQCBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuIFxcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxcbiBcXHQgKi9cXG4gXFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcXG4tXFx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXFx1MDAyNm1hc2spO1xcbitcXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcXHUwMDI2bWFzaywgXFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZClcXG5AQCAtNDUwLDcgKzQ1MCw3IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIFxcdFxcdG1lbXRpZXIgPSBsaXN0X25leHRfZW50cnkobWVtdGllciwgbGlzdCk7XFxuIFxcdFxcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZSwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cXG4rXFx0XFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cXG4gXFx0XFx0ICogQWRkIGFsbCBtZW1vcnkgbm9kZXMgZXhjZXB0IHRoZSBzZWxlY3RlZCBtZW1vcnkgdGllclxcbiBcXHRcXHQgKiBub2RlbGlzdCB0byBza2lwIGxpc3Qgc28gdGhhdCB3ZSBmaW5kIHRoZSBiZXN0IG5vZGUgZnJvbSB0aGVcXG4gXFx0XFx0ICogbWVtdGllciBub2RlbGlzdC5cXG5AQCAtNDYzLDcgKzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIFxcdFxcdCAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0ZG8ge1xcbi1cXHRcXHRcXHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFxcdTAwMjZ0aWVyX25vZGVzKTtcXG4rXFx0XFx0XFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcXHUwMDI2dGllcl9ub2RlcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XFxuIFxcdFxcdFxcdGlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKVxcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4gXFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xcbmluZGV4IDFjZmJkMDU4MmExMGEuLmQxODg4ZDU2MzBlMGEgMTAwNjQ0XFxuLS0tIGEvbW0vcGFnZV9hbGxvYy5jXFxuKysrIGIvbW0vcGFnZV9hbGxvYy5jXFxuQEAgLTU3OTMsOSArNTc5MywxMCBAQCBzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbiBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdO1xcbiBcXG4gLyoqXFxuLSAqIGZpbmRfbmV4dF9iZXN0X25vZGUgLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3RcXG4rICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdFxcbiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJ3JlIGFwcGVuZGluZ1xcbiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzXFxuKyAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cXG4gICpcXG4gICogV2UgdXNlIGEgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGlzIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGRcXG4gICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWRcXG5AQCAtNTgwNyw3ICs1ODA4LDggQEAgc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcXG4gICpcXG4gICogUmV0dXJuOiBub2RlIGlkIG9mIHRoZSBmb3VuZCBub2RlIG9yICVOVU1BX05PX05PREUgaWYgbm8gbm9kZSBpcyBmb3VuZC5cXG4gICovXFxuLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcXG4raW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxcbitcXHRcXHRcXHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxcbiB7XFxuIFxcdGludCBuLCB2YWw7XFxuIFxcdGludCBtaW5fdmFsID0gSU5UX01BWDtcXG5AQCAtNTgxNywxMiArNTgxOSwxMiBAQCBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXFxuIFxcdCAqIFVzZSB0aGUgbG9jYWwgbm9kZSBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJ1dCBmb3IgbWVtb3J5bGVzcyBsb2NhbFxcbiBcXHQgKiBub2RlLCB3ZSBzaG91bGQgc2tpcCBpdCBhbmQgZmFsbCBiYWNrIHRvIG90aGVyIG5vZGVzLlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXFx1MDAyNlxcdTAwMjYgbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkpIHtcXG4rXFx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXFx1MDAyNlxcdTAwMjYgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHtcXG4gXFx0XFx0bm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTtcXG4gXFx0XFx0cmV0dXJuIG5vZGU7XFxuIFxcdH1cXG4gXFxuLVxcdGZvcl9lYWNoX25vZGVfc3RhdGUobiwgTl9NRU1PUlkpIHtcXG4rXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICpjYW5kaWRhdGVzKSB7XFxuIFxcbiBcXHRcXHQvKiBEb24ndCB3YW50IGEgbm9kZSB0byBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKi9cXG4gXFx0XFx0aWYgKG5vZGVfaXNzZXQobiwgKnVzZWRfbm9kZV9tYXNrKSlcXG5AQCAtNTg1NSwzMSArNTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcXG4gfVxcbiBcXG4gXFxuLS8qXFxuLSAqIEJ1aWxkIHpvbmVsaXN0cyBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLlxcbi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWxcXG4tICogRE1BIHpvbmUsIGlmIGFueS0tYnV0IHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuXFxuLSAqL1xcbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsXFxuLVxcdFxcdHVuc2lnbmVkIG5yX25vZGVzKVxcbi17XFxuLVxcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcXG4tXFx0aW50IGk7XFxuLVxcbi1cXHR6b25lcmVmcyA9IHBnZGF0LVxcdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX25vZGVzOyBpKyspIHtcXG4tXFx0XFx0aW50IG5yX3pvbmVzO1xcbi1cXG4tXFx0XFx0cGdfZGF0YV90ICpub2RlID0gTk9ERV9EQVRBKG5vZGVfb3JkZXJbaV0pO1xcbi1cXG4tXFx0XFx0bnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTtcXG4tXFx0XFx0em9uZXJlZnMgKz0gbnJfem9uZXM7XFxuLVxcdH1cXG4tXFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbi1cXHR6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwO1xcbi19XFxuLVxcbiAvKlxcbiAgKiBCdWlsZCBfX0dGUF9USElTTk9ERSB6b25lbGlzdHNcXG4gICovXFxuQEAgLTU4OTUsMTkgKzU4NzIsMjQgQEAgc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxuIFxcdHpvbmVyZWZzLVxcdTAwM2V6b25lX2lkeCA9IDA7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxcbisvKlxcbisgKiBCdWlsZCBvbmUgem9uZWxpc3Qgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS4gVGhpcyByZXN1bHRzIGluXFxuKyAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxcbisgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbitcXHRcXHRcXHRcXHRpbnQgemxpZHgpXFxuIHtcXG4tXFx0c3RhdGljIGludCBub2RlX29yZGVyW01BWF9OVU1OT0RFU107XFxuLVxcdGludCBub2RlLCBucl9ub2RlcyA9IDA7XFxuK1xcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LVxcdTAwM2Vub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzO1xcbiBcXHRub2RlbWFza190IHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FO1xcbi1cXHRpbnQgbG9jYWxfbm9kZSwgcHJldl9ub2RlO1xcbitcXHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVxcdTAwM2Vub2RlX2lkO1xcbitcXHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcXG4rXFx0aW50IG5vZGU7XFxuIFxcbi1cXHQvKiBOVU1BLWF3YXJlIG9yZGVyaW5nIG9mIG5vZGVzICovXFxuLVxcdGxvY2FsX25vZGUgPSBwZ2RhdC1cXHUwMDNlbm9kZV9pZDtcXG4tXFx0cHJldl9ub2RlID0gbG9jYWxfbm9kZTtcXG4rXFx0cHJfaW5mbyhcXFwiRmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6IFxcXCIsIGxvY2FsX25vZGUpO1xcbiBcXG4tXFx0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XFxuLVxcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgXFx1MDAyNnVzZWRfbWFzaykpIFxcdTAwM2U9IDApIHtcXG4rXFx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcXHUwMDI2dXNlZF9tYXNrLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBjYW5kaWRhdGVzKSkgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBXZSBkb24ndCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxcbiBcXHRcXHQgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lXFxuQEAgLTU5MTcsMTggKzU4OTksMjIgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxuIFxcdFxcdCAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpXFxuIFxcdFxcdFxcdG5vZGVfbG9hZFtub2RlXSArPSAxO1xcbiBcXG4tXFx0XFx0bm9kZV9vcmRlcltucl9ub2RlcysrXSA9IG5vZGU7XFxuK1xcdFxcdHpvbmVyZWZzICs9IGJ1aWxkX3pvbmVyZWZzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lcmVmcyk7XFxuK1xcdFxcdHByX2NvbnQoXFxcIiVkIFxcXCIsIG5vZGUpO1xcbiBcXHRcXHRwcmV2X25vZGUgPSBub2RlO1xcbiBcXHR9XFxuIFxcbi1cXHRidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpO1xcbi1cXHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xcbi1cXHRwcl9pbmZvKFxcXCJGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXFxcIiwgbG9jYWxfbm9kZSk7XFxuLVxcdGZvciAobm9kZSA9IDA7IG5vZGUgXFx1MDAzYyBucl9ub2Rlczsgbm9kZSsrKVxcbi1cXHRcXHRwcl9jb250KFxcXCIlZCBcXFwiLCBub2RlX29yZGVyW25vZGVdKTtcXG4rXFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbitcXHR6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwO1xcbiBcXHRwcl9jb250KFxcXCJcXFxcblxcXCIpO1xcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4re1xcbitcXHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBaT05FTElTVF9GQUxMQkFDSyk7XFxuK1xcdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XFxuK31cXG4rXFxuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXFxuIC8qXFxuICAqIFJldHVybiBub2RlIGlkIG9mIG5vZGUgdXNlZCBmb3IgXFxcImxvY2FsXFxcIiBhbGxvY2F0aW9ucy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MDQuMDQzNDIyMDY3WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo4NDAyNTk3NTY1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOVU1BXCIsXG4gICAgXCJOVU1BX01JR1JBVElPTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImZpbmRfbmV4dF9iZXN0X25vZGVfaW5cIixcbiAgICBcIm5leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwiYnVpbGRfYWxsX3pvbmVsaXN0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMWJhMmQ0ZjE3OTFkYjg3MzYwMGYwYTEyZmY3M2QyOTlhYmRkM2JkN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDAzOjM3OjAyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IGRhMTRjNTZmYjI0ZTEuLjE1MTlkZDIxYTkwMGYgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtMTEzMyw3ICsxMTMzLDggQEAgZXh0ZXJuIGludCBub2RlX3JlY2xhaW1fbW9kZTtcbiBcbiBleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbiBcdFx0XHRcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XG4tZXh0ZXJuIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayk7XG4raW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuK1x0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcbiAjZWxzZVxuICNkZWZpbmUgbm9kZV9yZWNsYWltX21vZGUgMFxuIFxuQEAgLTExNDIsNyArMTE0Myw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbiB7XG4gXHRyZXR1cm4gMDtcbiB9XG4tc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4rc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4rXHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4ge1xuIFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LXRpZXJzLmMgYi9tbS9tZW1vcnktdGllcnMuY1xuaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDRcbi0tLSBhL21tL21lbW9yeS10aWVycy5jXG4rKysgYi9tbS9tZW1vcnktdGllcnMuY1xuQEAgLTM3MCw3ICszNzAsNyBAQCBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG4gXHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cbiBcdCAqL1xuIFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcbi1cdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFx1MDAyNm1hc2spO1xuK1x0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXHUwMDI2bWFzaywgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuQEAgLTQ1MCw3ICs0NTAsNyBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0XHRtZW10aWVyID0gbGlzdF9uZXh0X2VudHJ5KG1lbXRpZXIsIGxpc3QpO1xuIFx0XHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XG4gXHRcdC8qXG4tXHRcdCAqIGZpbmRfbmV4dF9iZXN0X25vZGUsIHVzZSAndXNlZCcgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4rXHRcdCAqIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4sIHVzZSAndXNlZCcgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4gXHRcdCAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXJcbiBcdFx0ICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlXG4gXHRcdCAqIG1lbXRpZXIgbm9kZWxpc3QuXG5AQCAtNDYzLDcgKzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4gXHRcdCAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLlxuIFx0XHQgKi9cbiBcdFx0ZG8ge1xuLVx0XHRcdHRhcmdldCA9IGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXHUwMDI2dGllcl9ub2Rlcyk7XG4rXHRcdFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcdTAwMjZ0aWVyX25vZGVzLFxuK1x0XHRcdFx0XHRcdFx0XHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiBcdFx0XHRpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSlcbiBcdFx0XHRcdGJyZWFrO1xuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xuaW5kZXggMWNmYmQwNTgyYTEwYS4uZDE4ODhkNTYzMGUwYSAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuY1xuKysrIGIvbW0vcGFnZV9hbGxvYy5jXG5AQCAtNTc5Myw5ICs1NzkzLDEwIEBAIHN0YXRpYyBpbnQgbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4gc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcbiBcbiAvKipcbi0gKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0XG4rICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdFxuICAqIEBub2RlOiBub2RlIHdob3NlIGZhbGxiYWNrIGxpc3Qgd2UncmUgYXBwZW5kaW5nXG4gICogQHVzZWRfbm9kZV9tYXNrOiBub2RlbWFza190IG9mIGFscmVhZHkgdXNlZCBub2Rlc1xuKyAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cbiAgKlxuICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkXG4gICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWRcbkBAIC01ODA3LDcgKzU4MDgsOCBAQCBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdO1xuICAqXG4gICogUmV0dXJuOiBub2RlIGlkIG9mIHRoZSBmb3VuZCBub2RlIG9yICVOVU1BX05PX05PREUgaWYgbm8gbm9kZSBpcyBmb3VuZC5cbiAgKi9cbi1pbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4raW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuK1x0XHRcdCAgIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4ge1xuIFx0aW50IG4sIHZhbDtcbiBcdGludCBtaW5fdmFsID0gSU5UX01BWDtcbkBAIC01ODE3LDEyICs1ODE5LDEyIEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiBcdCAqIFVzZSB0aGUgbG9jYWwgbm9kZSBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJ1dCBmb3IgbWVtb3J5bGVzcyBsb2NhbFxuIFx0ICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy5cbiBcdCAqL1xuLVx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXHUwMDI2XHUwMDI2IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7XG4rXHRpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSBcdTAwMjZcdTAwMjYgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHtcbiBcdFx0bm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTtcbiBcdFx0cmV0dXJuIG5vZGU7XG4gXHR9XG4gXG4tXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG4sIE5fTUVNT1JZKSB7XG4rXHRmb3JfZWFjaF9ub2RlX21hc2sobiwgKmNhbmRpZGF0ZXMpIHtcbiBcbiBcdFx0LyogRG9uJ3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovXG4gXHRcdGlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpXG5AQCAtNTg1NSwzMSArNTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiB9XG4gXG4gXG4tLypcbi0gKiBCdWlsZCB6b25lbGlzdHMgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS5cbi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWxcbi0gKiBETUEgem9uZSwgaWYgYW55LS1idXQgcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS5cbi0gKi9cbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsXG4tXHRcdHVuc2lnbmVkIG5yX25vZGVzKVxuLXtcbi1cdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcbi1cdGludCBpO1xuLVxuLVx0em9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfbm9kZXM7IGkrKykge1xuLVx0XHRpbnQgbnJfem9uZXM7XG4tXG4tXHRcdHBnX2RhdGFfdCAqbm9kZSA9IE5PREVfREFUQShub2RlX29yZGVyW2ldKTtcbi1cbi1cdFx0bnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTtcbi1cdFx0em9uZXJlZnMgKz0gbnJfem9uZXM7XG4tXHR9XG4tXHR6b25lcmVmcy1cdTAwM2V6b25lID0gTlVMTDtcbi1cdHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMDtcbi19XG4tXG4gLypcbiAgKiBCdWlsZCBfX0dGUF9USElTTk9ERSB6b25lbGlzdHNcbiAgKi9cbkBAIC01ODk1LDE5ICs1ODcyLDI0IEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuIFx0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbisvKlxuKyAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW5cbisgKiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbCBETUEgem9uZSwgaWYgYW55LS1idXRcbisgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyxcbitcdFx0XHRcdGludCB6bGlkeClcbiB7XG4tXHRzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTtcbi1cdGludCBub2RlLCBucl9ub2RlcyA9IDA7XG4rXHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzO1xuIFx0bm9kZW1hc2tfdCB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORTtcbi1cdGludCBsb2NhbF9ub2RlLCBwcmV2X25vZGU7XG4rXHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4rXHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbitcdGludCBub2RlO1xuIFxuLVx0LyogTlVNQS1hd2FyZSBvcmRlcmluZyBvZiBub2RlcyAqL1xuLVx0bG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4tXHRwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xuK1x0cHJfaW5mbyhcIkZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcIiwgbG9jYWxfbm9kZSk7XG4gXG4tXHRtZW1zZXQobm9kZV9vcmRlciwgMCwgc2l6ZW9mKG5vZGVfb3JkZXIpKTtcbi1cdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrKSkgXHUwMDNlPSAwKSB7XG4rXHR3aGlsZSAoKG5vZGUgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKGxvY2FsX25vZGUsIFx1MDAyNnVzZWRfbWFzayxcbitcdFx0XHRcdFx0ICAgICAgY2FuZGlkYXRlcykpIFx1MDAzZT0gMCkge1xuIFx0XHQvKlxuIFx0XHQgKiBXZSBkb24ndCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxuIFx0XHQgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lXG5AQCAtNTkxNywxOCArNTg5OSwyMiBAQCBzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbiBcdFx0ICAgIG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgcHJldl9ub2RlKSlcbiBcdFx0XHRub2RlX2xvYWRbbm9kZV0gKz0gMTtcbiBcbi1cdFx0bm9kZV9vcmRlcltucl9ub2RlcysrXSA9IG5vZGU7XG4rXHRcdHpvbmVyZWZzICs9IGJ1aWxkX3pvbmVyZWZzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lcmVmcyk7XG4rXHRcdHByX2NvbnQoXCIlZCBcIiwgbm9kZSk7XG4gXHRcdHByZXZfbm9kZSA9IG5vZGU7XG4gXHR9XG4gXG4tXHRidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpO1xuLVx0YnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTtcbi1cdHByX2luZm8oXCJGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXCIsIGxvY2FsX25vZGUpO1xuLVx0Zm9yIChub2RlID0gMDsgbm9kZSBcdTAwM2MgbnJfbm9kZXM7IG5vZGUrKylcbi1cdFx0cHJfY29udChcIiVkIFwiLCBub2RlX29yZGVyW25vZGVdKTtcbitcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuK1x0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuIFx0cHJfY29udChcIlxcblwiKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4re1xuK1x0YnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBaT05FTElTVF9GQUxMQkFDSyk7XG4rXHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xuK31cbitcbiAjaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFU1xuIC8qXG4gICogUmV0dXJuIG5vZGUgaWQgb2Ygbm9kZSB1c2VkIGZvciBcImxvY2FsXCIgYWxsb2NhdGlvbnMuXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzowNC4wNDM0MjQzNThaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MzMzMDA0Nzc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGlkZW50aWZ5IHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlcy4gVGhlIGRpZmYgdG91Y2hlcyBgbW0vaW50ZXJuYWwuaGAsIGBtbS9tZW1vcnktdGllcnMuY2AsIGFuZCBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBzdWdnZXN0cyBpdCdzIGxpa2VseSByZWxhdGVkIHRvIG1lbW9yeSBub2RlIHNlbGVjdGlvbiBvciB6b25lIG1hbmFnZW1lbnQgd2l0aGluIE5VTUEgc3lzdGVtcywgbXkgc3BpZGV5IHNlbnNlcyBhcmUgdGluZ2xpbmcuIEknbGwgcHJvYmFibHkgZ3JhYiBgZ3JlcHBlcmAgb3IgYHJlYWQtZmlsZWAgdG8gZ2V0IGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIGNvZGUsIG1heWJlIGxvb2sgYXQgZnVuY3Rpb24gY2FsbHMuXG5cbkZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIGEgaGlnaC1sZXZlbCB1bmRlcnN0YW5kaW5nIG9mIHdoYXQgdGhpcyBwYXRjaCBhY3R1YWxseSAqZG9lcyouXG5cbjEuICAqKmBtbS9pbnRlcm5hbC5oYCoqOiBJdCBsb29rcyBsaWtlIGBmaW5kX25leHRfYmVzdF9ub2RlYCBpcyBnZXR0aW5nIGEgc2lnbmF0dXJlIGNoYW5nZSwgYmVpbmcgcmVuYW1lZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIEkgYWxzbyBzZWUgYSBzdGF0aWMgaW5saW5lIGZhbGxiYWNrIHdoZW4gYENPTkZJR19OVU1BYCAob3Igc29tZXRoaW5nIHNpbWlsYXIpIGlzbid0IGRlZmluZWQuIFNlZW1zIGxpa2UgdGhleSdyZSB0cnlpbmcgdG8gZ2VuZXJhbGl6ZSBhIG5vZGUgc2VsZWN0aW9uIGZ1bmN0aW9uIGFuZCBoYW5kbGUgbm9uLU5VTUEgY2FzZXMgZ3JhY2VmdWxseS5cbjIuICAqKmBtbS9tZW1vcnktdGllcnMuY2AqKjogVGhlIGBuZXh0X2RlbW90aW9uX25vZGUoKWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpYCBmdW5jdGlvbnMsIG5vdyBjYWxsaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgLiBJJ20gZ3Vlc3NpbmcgdGhpcyByZWxhdGVzIHRvIG1lbW9yeSB0aWVyaW5nIHBvbGljaWVzIG9yIGRlbW90aW9uL3Byb21vdGlvbiBkZWNpc2lvbnMgd2l0aGluIHRoZSBtZW1vcnkgaGllcmFyY2h5LiBUaGUgYFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXWAgYXJndW1lbnQgaXMgaW1tZWRpYXRlbHkgaW50ZXJlc3RpbmcuXG4zLiAgKipgbW0vcGFnZV9hbGxvYy5jYCoqOiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIFRoZSBvcmlnaW5hbCBgZmluZF9uZXh0X2Jlc3Rfbm9kZSgpYCBpcyBnb25lLCBhbmQgbm93IGNhbGxpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAsIHRha2luZyBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBpbnN0ZWFkIG9mIGhhcmRjb2Rpbmcgbm9kZS1zdGF0ZSBjYWxscy4gVGhpcyBzdWdnZXN0cyBhIG1vcmUgZmxleGlibGUgbm9kZSBzZWxlY3Rpb24gbWVjaGFuaXNtLiBBbHNvLCB0aGUgcmVtb3ZhbC9tZXJnaW5nIG9mIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgIGlzIGludGVyZXN0aW5nLiBUaGUgYGJ1aWxkX3pvbmVsaXN0cygpYCBub3cgY2FsbHMgYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAgd2l0aCBkaWZmZXJlbnQgbm9kZW1hc2tzLiBUaGlzIGlzIGFsbCBhYm91dCB6b25lIG9yZGVyaW5nIGR1cmluZyBwYWdlIGFsbG9jYXRpb24uXG5cbkknbSBzdGFydGluZyB0byBzZWUgYSBwYXR0ZXJuIGhlcmU6IGdlbmVyYWxpemF0aW9uIGFuZCBhIHBvdGVudGlhbCBzaGlmdCBpbiBob3cgbm9kZW1hc2tzIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudC4gVGhpcyBpcyBhYm91dCBtYWtpbmcgbm9kZSBzZWxlY3Rpb24gbW9yZSBmbGV4aWJsZSwgcG90ZW50aWFsbHkgZm9yIGJldHRlciBOVU1BIGF3YXJlbmVzcyBvciBwZXJoYXBzIHRvIGludGVncmF0ZSBpdCBiZXR0ZXIgd2l0aCBtZW1vcnkgdGllcmluZy5cblxuSSdtIHRoaW5raW5nIEkgc2hvdWxkIGNoZWNrIGFyb3VuZCBsaW5lcyAxMTMwLTExNTAgaW4gYG1tL2ludGVybmFsLmhgIHRvIHNlZSB3aGF0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGd1YXJkcyBhcmUgaW4gcGxhY2UuIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIGJlaGF2ZXMgaW4gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MzA4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDI1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MDkuMzc2NDMxOTQyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAwOTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2ludGVybmFsLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTEyNSxcbiAgXCJMaW5lQ291bnRcIjogMzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTEyNTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbWxvY2tfbmV3X2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pIHsgfVxcbjExMjY6XFx0c3RhdGljIGlubGluZSBib29sIG5lZWRfbWxvY2tfZHJhaW4oaW50IGNwdSkgeyByZXR1cm4gZmFsc2U7IH1cXG4xMTI3OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9sb2NhbCh2b2lkKSB7IH1cXG4xMTI4OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9yZW1vdGUoaW50IGNwdSkgeyB9XFxuMTEyOTpcXHQjZW5kaWYgLyogIUNPTkZJR19NTVUgKi9cXG4xMTMwOlxcdFxcbjExMzE6XFx0I2lmZGVmIENPTkZJR19OVU1BXFxuMTEzMjpcXHRleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xcbjExMzM6XFx0XFxuMTEzNDpcXHRleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG4xMTM1OlxcdFxcdFxcdFxcdFxcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XFxuMTEzNjpcXHRpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuMTEzNzpcXHRcXHRcXHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcXG4xMTM4OlxcdCNlbHNlXFxuMTEzOTpcXHQjZGVmaW5lIG5vZGVfcmVjbGFpbV9tb2RlIDBcXG4xMTQwOlxcdFxcbjExNDE6XFx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxcbjExNDI6XFx0XFx0XFx0XFx0XFx0XFx0IGdmcF90IG1hc2ssIHVuc2lnbmVkIGludCBvcmRlcilcXG4xMTQzOlxcdHtcXG4xMTQ0OlxcdFxcdHJldHVybiAwO1xcbjExNDU6XFx0fVxcbjExNDY6XFx0c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuMTE0NzpcXHRcXHRcXHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxcbjExNDg6XFx0e1xcbjExNDk6XFx0XFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4xMTUwOlxcdH1cXG4xMTUxOlxcdCNlbmRpZlxcbjExNTI6XFx0XFxuMTE1MzpcXHRzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9yZWNsYWltX2VuYWJsZWQodm9pZClcXG4xMTU0OlxcdHtcXG4xMTU1OlxcdFxcdC8qIElzIGFueSBub2RlX3JlY2xhaW1fbW9kZSBiaXQgc2V0PyAqL1xcbjExNTY6XFx0XFx0cmV0dXJuIG5vZGVfcmVjbGFpbV9tb2RlIFxcdTAwMjYgKFJFQ0xBSU1fWk9ORXxSRUNMQUlNX1dSSVRFfFJFQ0xBSU1fVU5NQVApO1xcbjExNTc6XFx0fVxcbjExNTg6XFx0XFxuMTE1OTpcXHQvKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzowOS4zNzY1MzUyODJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNjY4NTc0MTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgTlVNQSBDb25maWd1cmF0aW9uIGluIE1lbW9yeSBNYW5hZ2VtZW50KipcblxuQWxyaWdodCwgc28gYENPTkZJR19OVU1BYCBpcyB0aGUga2V5IGNvbmZpZ3VyYXRpb24gZ3VhcmQgd2UncmUgZGVhbGluZyB3aXRoIGhlcmUsIHNwZWNpZmljYWxseSBkZWZpbmVkIHdpdGhpbiBgbW0vaW50ZXJuYWwuaGAuIE15IGltbWVkaWF0ZSBmb2N1cyBzaGlmdHMgdG8gaG93IHRoaXMgaW1wYWN0cyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgY29tcG9uZW50cywgYW5kIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vcGFnZV9hbGxvYy5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBpbGF0aW9uIGNvbmRpdGlvbnMgYW5kIGhvdyB0aGlzIGBDT05GSUdfTlVNQWAgZmxhZyBpbmZsdWVuY2VzIHRoZSBjb2RlIHBhdGhzIHdpdGhpbiB0aG9zZSBmaWxlcy4gSSdsbCB6ZXJvIGluIG9uIGBtbS9tZW1vcnktdGllcnMuY2AsIHNwZWNpZmljYWxseSBzY3J1dGluaXppbmcgdGhlIGNvZGUgYmV0d2VlbiBsaW5lcyAzNjAgYW5kIDQ4MC4gVGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IHJlZ2lvbiB0byBmaW5kIHRoZSByZWxldmFudCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBsb2dpYywgd2hpY2ggc2hvdWxkIGlsbHVtaW5hdGUgaG93IE5VTUEtYXdhcmUgbWVtb3J5IHRpZXJpbmcgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQuIExldCdzIGRpZyBpbiBhbmQgc2VlIHdoYXQgd2UgZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Njg5MywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MTIuMDQ1MTEyNDg4WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTUxNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LXRpZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzYwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzYwOlxcdFxcdCAqIGxhc3QgdGFyZ2V0IG5vZGUuIE9yIGludHJvZHVjaW5nIHBlci1jcHUgZGF0YSB0byBhdm9pZFxcbiAzNjE6XFx0XFx0ICogY2FjaGluZyBpc3N1ZSwgd2hpY2ggc2VlbXMgbW9yZSBjb21wbGljYXRlZC4gU28gc2VsZWN0aW5nXFxuIDM2MjpcXHRcXHQgKiB0YXJnZXQgbm9kZSByYW5kb21seSBzZWVtcyBiZXR0ZXIgdW50aWwgbm93LlxcbiAzNjM6XFx0XFx0ICovXFxuIDM2NDpcXHRcXHRpZiAoIW5vZGVzX2VtcHR5KG1hc2spKVxcbiAzNjU6XFx0XFx0XFx0cmV0dXJuIG5vZGVfcmFuZG9tKFxcdTAwMjZtYXNrKTtcXG4gMzY2OlxcdFxcbiAzNjc6XFx0XFx0LypcXG4gMzY4OlxcdFxcdCAqIFByZWZlcnJlZCBub2RlcyBhcmUgbm90IGluIGFsbG93ZWRfbWFzay4gRmxpcCBiaXRzIGluXFxuIDM2OTpcXHRcXHQgKiBhbGxvd2VkX21hc2sgYXMgdXNlZCBub2RlIG1hc2suIFRoZW4sIHVzZSBpdCB0byBnZXQgdGhlXFxuIDM3MDpcXHRcXHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cXG4gMzcxOlxcdFxcdCAqL1xcbiAzNzI6XFx0XFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcXG4gMzczOlxcdFxcdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFxcdTAwMjZtYXNrLCBcXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcXG4gMzc0OlxcdH1cXG4gMzc1OlxcdFxcbiAzNzY6XFx0c3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbiAzNzc6XFx0e1xcbiAzNzg6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAzNzk6XFx0XFx0aW50IG5vZGU7XFxuIDM4MDpcXHRcXG4gMzgxOlxcdFxcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcXG4gMzgyOlxcdFxcdFxcdG5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7XFxuIDM4MzpcXHRcXHRcXHQvKlxcbiAzODQ6XFx0XFx0XFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxcbiAzODU6XFx0XFx0XFx0ICogdG8gYWNjZXNzIHBnZGEtXFx1MDAzZW1lbXRpZXIuXFxuIDM4NjpcXHRcXHRcXHQgKi9cXG4gMzg3OlxcdFxcdFxcdG1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpO1xcbiAzODg6XFx0XFx0XFx0aWYgKG1lbXRpZXIpXFxuIDM4OTpcXHRcXHRcXHRcXHRtZW10aWVyLVxcdTAwM2Vsb3dlcl90aWVyX21hc2sgPSBOT0RFX01BU0tfTk9ORTtcXG4gMzkwOlxcdFxcdH1cXG4gMzkxOlxcdFxcdC8qXFxuIDM5MjpcXHRcXHQgKiBFbnN1cmUgdGhhdCB0aGUgXFxcImRpc2FibGVcXFwiIGlzIHZpc2libGUgYWNyb3NzIHRoZSBzeXN0ZW0uXFxuIDM5MzpcXHRcXHQgKiBSZWFkZXJzIHdpbGwgc2VlIGVpdGhlciBhIGNvbWJpbmF0aW9uIG9mIGJlZm9yZStkaXNhYmxlXFxuIDM5NDpcXHRcXHQgKiBzdGF0ZSBvciBkaXNhYmxlK2FmdGVyLiAgVGhleSB3aWxsIG5ldmVyIHNlZSBiZWZvcmUgYW5kXFxuIDM5NTpcXHRcXHQgKiBhZnRlciBzdGF0ZSB0b2dldGhlci5cXG4gMzk2OlxcdFxcdCAqL1xcbiAzOTc6XFx0XFx0c3luY2hyb25pemVfcmN1KCk7XFxuIDM5ODpcXHR9XFxuIDM5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MTIuMDQ1MjA5NzE4WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjQxNzM3MzIxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgTWVtb3J5IFRpZXJzIEltcGxlbWVudGF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBgbW0vbWVtb3J5LXRpZXJzLmNgIGltcGxlbWVudGF0aW9uLiBUaGUgbG9naWNhbCBzdGFydGluZyBwb2ludCBpcyBhbHdheXMgdGhlIGJ1aWxkIHN5c3RlbSwgc28gbGV0J3MgY2hlY2sgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlIGZvciB0aGF0IHBhcnRpY3VsYXIgZmlsZS4gVGhlIGtleSBoZXJlIGlzIHRvIHVuZGVyc3RhbmQgaG93IGl0J3MgY29uZmlndXJlZCBhbmQgYnVpbHQsIHdoaWNoIHdpbGwgdGVsbCBtZSBhIGxvdCBhYm91dCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBhbnkgYXNzb2NpYXRlZCBmZWF0dXJlIGZsYWdzLiBOb3csIHRvIHF1aWNrbHkgbG9jYXRlIHRoZSByZWxldmFudCBzZWN0aW9ucywgSSdsbCB1c2UgYGdyZXBgLiBJJ2xsIHNlYXJjaCBzcGVjaWZpY2FsbHkgZm9yIFwibWVtb3J5LXRpZXJzXCIgd2l0aGluIHRob3NlIGNvbmZpZ3VyYXRpb24gZmlsZXMuIFRoaXMgc2hvdWxkIHF1aWNrbHkgaGlnaGxpZ2h0IHRoZSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIGhvdyB0aGUgbW9kdWxlIGlzIGluY29ycG9yYXRlZCBpbnRvIHRoZSBidWlsZC4gVGhpcyBhcHByb2FjaCBpcyBlZmZpY2llbnQg4oCTIHN0YXJ0aW5nIGF0IHRoZSBidWlsZCBzeXN0ZW0gZ2l2ZXMgbWUgY29udGV4dCBhbmQgbWFrZXMgc3VyZSBJIGRvbid0IG1pc3MgYW55dGhpbmcgdGhhdCBlbmFibGVzIG9yIGRpc2FibGVzIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NzYzLCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoxNC40NjI1ODU5NTlaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjE3NjgwMTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtb3J5LXRpZXJzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICs9IG1pZ3JhdGUub1xcbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9cXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG4tLVxcbm1tL2RhbW9uL3BhZGRyLmMtMTItI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N3YXAuaFxcdTAwM2VcXG5tbS9kYW1vbi9wYWRkci5jOjEzOiNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFxcdTAwM2VcXG5tbS9kYW1vbi9wYWRkci5jLTE0LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbV9pbmxpbmUuaFxcdTAwM2VcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzgtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkL3N5c2N0bC5oXFx1MDAzZVxcbm1tL2h1Z2VfbWVtb3J5LmM6Mzk6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDAtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NvbXBhdC5oXFx1MDAzZVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LmhcXHUwMDNlXFxubW0vbWVtb3J5LXRpZXJzLmM6NzojaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcXHUwMDNlXFxubW0vbWVtb3J5LXRpZXJzLmMtOC0jaW5jbHVkZSBcXHUwMDNjbGludXgvbm90aWZpZXIuaFxcdTAwM2VcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTc0Nz1pbnQgbXRfc2V0X2RlZmF1bHRfZHJhbV9wZXJmKGludCBuaWQsIHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZixcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTc3OS1cXHRcXHRwcl9pbmZvKFxcbm1tL21lbW9yeS10aWVycy5jOjc4MDpcXFwibWVtb3J5LXRpZXJzOiB0aGUgcGVyZm9ybWFuY2Ugb2YgRFJBTSBub2RlICVkIG1pc21hdGNoZXMgdGhhdCBvZiB0aGUgcmVmZXJlbmNlXFxcXG5cXFwiXFxubW0vbWVtb3J5LXRpZXJzLmMtNzgxLVxcXCJEUkFNIG5vZGUgJWQuXFxcXG5cXFwiLCBuaWQsIGRlZmF1bHRfZHJhbV9wZXJmX3JlZl9uaWQpO1xcbi0tXFxubW0vbWVtb3J5LmMtNjgtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NobWVtX2ZzLmhcXHUwMDNlXFxubW0vbWVtb3J5LmM6Njk6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL21lbW9yeS5jLTcwLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcXHUwMDNlXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMDItI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2NfZnMuaFxcdTAwM2VcXG5tbS9tZW1wb2xpY3kuYzoxMDM6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL21lbXBvbGljeS5jLTEwNC0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWlncmF0ZS5oXFx1MDAzZVxcbi0tXFxubW0vbWlncmF0ZS5jLTQzLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zeXNjdGwuaFxcdTAwM2VcXG5tbS9taWdyYXRlLmM6NDQ6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL21pZ3JhdGUuYy00NS0jaW5jbHVkZSBcXHUwMDNjbGludXgvcGFnZXdhbGsuaFxcdTAwM2VcXG4tLVxcbm1tL3Ztc2Nhbi5jLTQ0LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zeXNjdGwuaFxcdTAwM2VcXG5tbS92bXNjYW4uYzo0NTojaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcXHUwMDNlXFxubW0vdm1zY2FuLmMtNDYtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L29vbS5oXFx1MDAzZVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoxNC41MjQzNjAwMjhaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMjE3MzI0NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBhbiBleHBlcnQgaW4gdGhpcyBhcmVhOlxuXG4qKkludmVzdGlnYXRpbmcgTlVNQSBhbmQgTWVtb3J5IERlbW90aW9uKipcblxuT2theSwgc28gYG1lbW9yeS10aWVycy5vYCBpcyBvbmx5IGJyb3VnaHQgaW50byB0aGUgcGljdHVyZSB3aGVuIE5VTUEgc3VwcG9ydCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBhcyBtZW1vcnkgdGllcmluZyBpcyBhIGNvcmUgTlVNQS1yZWxhdGVkIG9wdGltaXphdGlvbi4gTXkgbmV4dCBzdGVwIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdywgc28gSSdsbCB0cmFjZSBhIGZldyBrZXkgZnVuY3Rpb25zLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgZGVtb3Rpb24gcHJvY2VzcyBpcyBraWNrZWQgb2ZmIGFuZCBtYW5hZ2VkLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBrbm93IHdoZXJlIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGFyZSAqY2FsbGVkKi4gVGhlc2UgYXJlIGNsZWFybHkgY3JpdGljYWwgdG8gdGhlIGFjdHVhbCBkZW1vdGlvbiBkZWNpc2lvbnMgYW5kIHRhcmdldCBzZXR1cC4gQW5kLCBsZXQncyBub3QgZm9yZ2V0IGhvdyB0aGVzZSB6b25lcyBnZXQgc2V0IHVwIC0gSSBzaG91bGQgbG9vayBpbnRvIHdoZXJlIGBidWlsZF96b25lbGlzdHNgIGlzIGNhbGxlZC4gSXQncyB0aW1lIHRvIGdldCBkb3duIGFuZCBkaXJ0eSB3aXRoIHNvbWUgYGdyZXBgIGFjdGlvbiB0byBmaW5kIHRob3NlIGNhbGwgc2l0ZXMuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB0aGUgb3ZlcmFsbCBleGVjdXRpb24gcGF0aC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODY1NCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjE2Ljc0MTY4ODM2MVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgxOTA0MjY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXh0X2RlbW90aW9uX25vZGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaD01ND12b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTU1LSNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oOjU2OmludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzayk7XFxuaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaC01Ny12b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oPTU4PWJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTU5LSNlbHNlXFxuaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaDo2MDpzdGF0aWMgaW5saW5lIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTYxLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg9OTk9c3RhdGljIGlubGluZSB2b2lkIGNsZWFyX25vZGVfbWVtb3J5X3R5cGUoaW50IG5vZGUsIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm1lbXR5cGUpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTEwMy1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oOjEwNDpzdGF0aWMgaW5saW5lIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTEwNS17XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz0zMDI9dm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cylcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTMyMC0vKipcXG5tbS9tZW1vcnktdGllcnMuYzozMjE6ICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aFxcbm1tL21lbW9yeS10aWVycy5jLTMyMi0gKiBAbm9kZTogVGhlIHN0YXJ0aW5nIG5vZGUgdG8gbG9va3VwIHRoZSBuZXh0IG5vZGVcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTMyOS0gKi9cXG5tbS9tZW1vcnktdGllcnMuYzozMzA6aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxcbm1tL21lbW9yeS10aWVycy5jLTMzMS17XFxuLS1cXG5tbS92bXNjYW4uYz0xMDcxPXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVtb3RlX2ZvbGlvX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqZGVtb3RlX2ZvbGlvcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTEwOTgtXFxubW0vdm1zY2FuLmM6MTA5OTpcXHR0YXJnZXRfbmlkID0gbmV4dF9kZW1vdGlvbl9ub2RlKHBnZGF0LVxcdTAwM2Vub2RlX2lkLCBcXHUwMDI2YWxsb3dlZF9tYXNrKTtcXG5tbS92bXNjYW4uYy0xMTAwLVxcdGlmICh0YXJnZXRfbmlkID09IE5VTUFfTk9fTk9ERSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MTguNTYwNzM4MjIxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2MDI5MTc4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyBgbmV4dF9kZW1vdGlvbl9ub2RlYCBpbiB0aGUgVk1zY2FuIENvbnRleHQqKlxuXG5Pa2F5LCBzbyBJJ3ZlIHNwb3R0ZWQgdGhhdCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBpcyBpbnZva2VkIHdpdGhpbiBgZGVtb3RlX2ZvbGlvX2xpc3RgIGluc2lkZSBgbW0vdm1zY2FuLmNgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGlzIGZpcmluZyBvZmYgcG90ZW50aWFsIGRlcGVuZGVuY2llcy4gSSBuZWVkIHRvIHF1aWNrbHkgYXNjZXJ0YWluIHRoZSBwcmVyZXF1aXNpdGVzLiBUaGUgcXVlc3Rpb24gdGhhdCBoYXMgc3BydW5nIHRvIG1pbmQgaXMgd2hldGhlciBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBpcyBhIHJlcXVpcmVtZW50IGZvciB0aGUgYG5leHRfZGVtb3Rpb25fbm9kZWAgZnVuY3Rpb24uIEkgKmJlbGlldmUqIGl04oCZcyBkZWZpbmVkIGluIGBpbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oYCBidXQgSSBuZWVkIHRvIHF1aWNrbHkgdmVyaWZ5IHRoYXQuIExldCdzIGp1bXAgb3ZlciB0byB0aGF0IGhlYWRlciBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNTAsIHRvIGNvbmZpcm0uIFRpbWUgdG8gZGlnIGluIGFuZCBjbGFyaWZ5IHRoaXMgcXVpY2tseS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTU5OSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjIxLjE2MzY1ODk1N1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4Mzk4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDQwOlxcdGV4dGVybiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICpkZWZhdWx0X2RyYW1fdHlwZTtcXG4gIDQxOlxcdGV4dGVybiBub2RlbWFza190IGRlZmF1bHRfZHJhbV9ub2RlcztcXG4gIDQyOlxcdHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKmFsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdGFuY2UpO1xcbiAgNDM6XFx0dm9pZCBwdXRfbWVtb3J5X3R5cGUoc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbWVtdHlwZSk7XFxuICA0NDpcXHR2b2lkIGluaXRfbm9kZV9tZW1vcnlfdHlwZShpbnQgbm9kZSwgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqZGVmYXVsdF90eXBlKTtcXG4gIDQ1OlxcdHZvaWQgY2xlYXJfbm9kZV9tZW1vcnlfdHlwZShpbnQgbm9kZSwgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbWVtdHlwZSk7XFxuICA0NjpcXHRpbnQgcmVnaXN0ZXJfbXRfYWRpc3RhbmNlX2FsZ29yaXRobShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTtcXG4gIDQ3OlxcdGludCB1bnJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7XFxuICA0ODpcXHRpbnQgbXRfY2FsY19hZGlzdGFuY2UoaW50IG5vZGUsIGludCAqYWRpc3QpO1xcbiAgNDk6XFx0aW50IG10X3NldF9kZWZhdWx0X2RyYW1fcGVyZihpbnQgbmlkLCBzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgKnBlcmYsXFxuICA1MDpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSk7XFxuICA1MTpcXHRpbnQgbXRfcGVyZl90b19hZGlzdGFuY2Uoc3RydWN0IGFjY2Vzc19jb29yZGluYXRlICpwZXJmLCBpbnQgKmFkaXN0KTtcXG4gIDUyOlxcdHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm10X2ZpbmRfYWxsb2NfbWVtb3J5X3R5cGUoaW50IGFkaXN0LFxcbiAgNTM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xcbiAgNTQ6XFx0dm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XFxuICA1NTpcXHQjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxuICA1NjpcXHRpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spO1xcbiAgNTc6XFx0dm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cyk7XFxuICA1ODpcXHRib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSk7XFxuICA1OTpcXHQjZWxzZVxcbiAgNjA6XFx0c3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuICA2MTpcXHR7XFxuICA2MjpcXHRcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbiAgNjM6XFx0fVxcbiAgNjQ6XFx0XFxuICA2NTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXFxuICA2NjpcXHR7XFxuICA2NzpcXHRcXHQqdGFyZ2V0cyA9IE5PREVfTUFTS19OT05FO1xcbiAgNjg6XFx0fVxcbiAgNjk6XFx0XFxuICA3MDpcXHRzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxcbiAgNzE6XFx0e1xcbiAgNzI6XFx0XFx0cmV0dXJuIHRydWU7XFxuICA3MzpcXHR9XFxuICA3NDpcXHQjZW5kaWZcXG4gIDc1OlxcdFxcbiAgNzY6XFx0I2Vsc2VcXG4gIDc3OlxcdFxcbiAgNzg6XFx0I2RlZmluZSBudW1hX2RlbW90aW9uX2VuYWJsZWRcXHRmYWxzZVxcbiAgNzk6XFx0I2RlZmluZSBkZWZhdWx0X2RyYW1fdHlwZVxcdE5VTExcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MjEuMTYzNzQ0ODU3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI1ODk5NTkxMDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhhdCBjb2RlIHNuaXBwZXQ6XG5cbioqRGl2aW5nIGludG8gbWVtb3J5LXRpZXJzLmMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgYSBzcGVjaWZpYyBwaWVjZSBvZiBjb2RlIGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgaGFuZGxlZC4gU3BlY2lmaWNhbGx5LCBJJ20gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCdzIGFjdGl2ZS4gTXkgaW5pdGlhbCBoeXBvdGhlc2lzIGlzIHRoYXQgaXQncyBnb3Zlcm5lZCBieSB0aGUgYENPTkZJR19OVU1BX01JR1JBVElPTmAgcHJlcHJvY2Vzc29yIGRlZmluZS5cblxuVG8gY29uZmlybSB0aGlzLCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIHJlbGV2YW50IHNlY3Rpb24uIEkgcmVjYWxsIHRoZSBkaXNjdXNzaW9uIGFyb3VuZCB0aGlzIGFyZWEsIHNvIGxldCdzIHN0YXJ0IGJ5IHplcm9pbmcgaW4gb24gbGluZXMgMzAwIHRvIDQ4MCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaGF0IGNodW5rIHNob3VsZCBjb250YWluIHRoZSBjcml0aWNhbCBsb2dpYyBJJ20gaW50ZXJlc3RlZCBpbiwgYW5kIGhvcGVmdWxseSwgdGhlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQgY29udHJvbCBpdHMgZXhlY3V0aW9uIGFyZSBjbGVhcmx5IHZpc2libGUgd2l0aGluIHRoYXQgcmFuZ2UuIEZyb20gdGhlcmUsIEkgY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgbXkgaW5pdGlhbCB0aG91Z2h0IGFib3V0IGBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGlzIGNvcnJlY3Qgb3IgaWYgYW5vdGhlciBjb25kaXRpb25hbCBpcyBhdCBwbGF5LiBUaGlzIGluZm9ybWF0aW9uIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBzcGVjaWZpYyBiZWhhdmlvdXIgaW4gcXVlc3Rpb24sIGVzcGVjaWFsbHkgaW4gdGhpcyBjb250ZXh0LCBzbyBJJ2xsIGRvdWJsZSBjaGVjayB0aGUgcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA1ODYsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjIzLjc1MzcwNjU1NVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTcwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnktdGllcnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMDAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMDA6XFx0fVxcbiAzMDE6XFx0XFxuIDMwMjpcXHR2b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKVxcbiAzMDM6XFx0e1xcbiAzMDQ6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAzMDU6XFx0XFxuIDMwNjpcXHRcXHQvKlxcbiAzMDc6XFx0XFx0ICogcGdfZGF0YV90Lm1lbXRpZXIgdXBkYXRlcyBpbmNsdWRlcyBhIHN5bmNocm9uaXplX3JjdSgpXFxuIDMwODpcXHRcXHQgKiB3aGljaCBlbnN1cmVzIHRoYXQgd2UgZWl0aGVyIGZpbmQgTlVMTCBvciBhIHZhbGlkIG1lbXRpZXJcXG4gMzA5OlxcdFxcdCAqIGluIE5PREVfREFUQS4gcHJvdGVjdCB0aGUgYWNjZXNzIHZpYSByY3VfcmVhZF9sb2NrKCk7XFxuIDMxMDpcXHRcXHQgKi9cXG4gMzExOlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gMzEyOlxcdFxcdG1lbXRpZXIgPSByY3VfZGVyZWZlcmVuY2UocGdkYXQtXFx1MDAzZW1lbXRpZXIpO1xcbiAzMTM6XFx0XFx0aWYgKG1lbXRpZXIpXFxuIDMxNDpcXHRcXHRcXHQqdGFyZ2V0cyA9IG1lbXRpZXItXFx1MDAzZWxvd2VyX3RpZXJfbWFzaztcXG4gMzE1OlxcdFxcdGVsc2VcXG4gMzE2OlxcdFxcdFxcdCp0YXJnZXRzID0gTk9ERV9NQVNLX05PTkU7XFxuIDMxNzpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gMzE4OlxcdH1cXG4gMzE5OlxcdFxcbiAzMjA6XFx0LyoqXFxuIDMyMTpcXHQgKiBuZXh0X2RlbW90aW9uX25vZGUoKSAtIEdldCB0aGUgbmV4dCBub2RlIGluIHRoZSBkZW1vdGlvbiBwYXRoXFxuIDMyMjpcXHQgKiBAbm9kZTogVGhlIHN0YXJ0aW5nIG5vZGUgdG8gbG9va3VwIHRoZSBuZXh0IG5vZGVcXG4gMzIzOlxcdCAqIEBhbGxvd2VkX21hc2s6IFRoZSBwb2ludGVyIHRvIGFsbG93ZWQgbm9kZSBtYXNrXFxuIDMyNDpcXHQgKlxcbiAzMjU6XFx0ICogUmV0dXJuOiBub2RlIGlkIGZvciBuZXh0IG1lbW9yeSBub2RlIGluIHRoZSBkZW1vdGlvbiBwYXRoIGhpZXJhcmNoeVxcbiAzMjY6XFx0ICogZnJvbSBAbm9kZTsgTlVNQV9OT19OT0RFIGlmIEBub2RlIGlzIHRlcm1pbmFsLiAgVGhpcyBkb2VzIG5vdCBrZWVwXFxuIDMyNzpcXHQgKiBAbm9kZSBvbmxpbmUgb3IgZ3VhcmFudGVlIHRoYXQgaXQgKmNvbnRpbnVlcyogdG8gYmUgdGhlIG5leHQgZGVtb3Rpb25cXG4gMzI4OlxcdCAqIHRhcmdldC5cXG4gMzI5OlxcdCAqL1xcbiAzMzA6XFx0aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxcbiAzMzE6XFx0e1xcbiAzMzI6XFx0XFx0c3RydWN0IGRlbW90aW9uX25vZGVzICpuZDtcXG4gMzMzOlxcdFxcdG5vZGVtYXNrX3QgbWFzaztcXG4gMzM0OlxcdFxcbiAzMzU6XFx0XFx0aWYgKCFub2RlX2RlbW90aW9uKVxcbiAzMzY6XFx0XFx0XFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4gMzM3OlxcdFxcbiAzMzg6XFx0XFx0bmQgPSBcXHUwMDI2bm9kZV9kZW1vdGlvbltub2RlXTtcXG4gMzM5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoyMy43NTM4MDgwODVaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjAzOTYxOTI3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuXG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgVGllciBHdWFyZHMqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIGFyb3VuZCBsaW5lIDMzMCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaGF0IGZ1bmN0aW9uIGNhbGwsIG9yIHdoYXRldmVyIGxvZ2ljIHJlc2lkZXMgdGhlcmUsIHNlZW1zIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IGEgZGVlcGVyIGxvb2suIEJlZm9yZSBJIGp1bXAgKmRpcmVjdGx5KiB0byAzMzAgdGhvdWdoLCBsZXQncyBnaXZlIG15c2VsZiBzb21lIGNvbnRleHQuIEknbGwgdGFrZSBhIHBlZWsgYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUsIHNheSBsaW5lcyAyODAgdGhyb3VnaCAzMDAuIEtub3dpbmcgdGhlICp3aGF0KiBhcm91bmQgdGhlICp3aGVyZSogaXMgYWx3YXlzIGEgc21hcnQgbW92ZSB0byB1bmRlcnN0YW5kIHRoZSAqd2h5Ki4gVGhpcyBxdWljayBzY2FuIHNob3VsZCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgZmxvdyBhbmQgYW55IHN1cnJvdW5kaW5nIGd1YXJkIGNvbmRpdGlvbnMgb3IgbG9naWMgdGhhdCBtaWdodCBiZSByZWxldmFudC4gSXQncyB0aW1lIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBuZWlnaGJvcmhvb2QgYXJvdW5kIGxpbmUgMzMwLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTUxNSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MjUuNzkzNDI5NTVaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAxOTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeS10aWVycy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI4MCxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI4MDpcXHRcXHRwZ19kYXRhX3QgKnBnZGF0O1xcbiAyODE6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAyODI6XFx0XFxuIDI4MzpcXHRcXHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gMjg0OlxcdFxcdGlmICghcGdkYXQpXFxuIDI4NTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDI4NjpcXHRcXG4gMjg3OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gMjg4OlxcdFxcdG1lbXRpZXIgPSByY3VfZGVyZWZlcmVuY2UocGdkYXQtXFx1MDAzZW1lbXRpZXIpO1xcbiAyODk6XFx0XFx0aWYgKCFtZW10aWVyKSB7XFxuIDI5MDpcXHRcXHRcXHR0b3B0aWVyID0gdHJ1ZTtcXG4gMjkxOlxcdFxcdFxcdGdvdG8gb3V0O1xcbiAyOTI6XFx0XFx0fVxcbiAyOTM6XFx0XFx0aWYgKG1lbXRpZXItXFx1MDAzZWFkaXN0YW5jZV9zdGFydCBcXHUwMDNjPSB0b3BfdGllcl9hZGlzdGFuY2UpXFxuIDI5NDpcXHRcXHRcXHR0b3B0aWVyID0gdHJ1ZTtcXG4gMjk1OlxcdFxcdGVsc2VcXG4gMjk2OlxcdFxcdFxcdHRvcHRpZXIgPSBmYWxzZTtcXG4gMjk3OlxcdG91dDpcXG4gMjk4OlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAyOTk6XFx0XFx0cmV0dXJuIHRvcHRpZXI7XFxuIDMwMDpcXHR9XFxuIDMwMTpcXHRcXG4gMzAyOlxcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXFxuIDMwMzpcXHR7XFxuIDMwNDpcXHRcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjI1Ljc5MzUzMzAxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2MzI5NzM4NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgVGllciBHdWFyZHJhaWxzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbi4gTXkgZm9jdXMgcmlnaHQgbm93IGlzIG9uIHRoZSBtZW1vcnkgdGllcmluZyBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDI3MCBvZiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBJJ20gZ29pbmcgdG8gY2FyZWZ1bGx5IHNjcnV0aW5pemUgdGhlIGd1YXJkIGNvbmRpdGlvbnMgc3Vycm91bmRpbmcgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBjb2RlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHByb3RlY3Rpb25zIGFyZSBpbiBwbGFjZSB0byBwcmV2ZW50IHBvdGVudGlhbCBpc3N1ZXMsIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgcmFjZSBjb25kaXRpb25zLCBvciBpbmNvcnJlY3QgdGllciBhc3NpZ25tZW50cy4gTXkgcHJpbWFyeSBnb2FsIGhlcmUgaXMgdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCB3ZWFrbmVzc2VzIG9yIGFyZWFzIHdoZXJlIG9wdGltaXphdGlvbnMgbWlnaHQgYmUgcG9zc2libGUuIEknbGwgbmVlZCB0byBjb25zaWRlciBob3cgdGhlc2UgZ3VhcmRzIGludGVyYWN0IHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSwgdGFraW5nIGludG8gYWNjb3VudCBhbnkgcmVsZXZhbnQgbG9ja2luZyBtZWNoYW5pc21zLCBjYWNoZSBjb2hlcmVuY3kgcHJvdG9jb2xzLCBhbmQgY29uY3VycmVudCBhY2Nlc3MgcGF0dGVybnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDk3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoyOC40MjY1MTA1OTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTI1MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LXRpZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjYwLFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjYwOlxcdHN0YXRpYyBzdHJ1Y3QgbWVtb3J5X3RpZXIgKl9fbm9kZV9nZXRfbWVtb3J5X3RpZXIoaW50IG5vZGUpXFxuIDI2MTpcXHR7XFxuIDI2MjpcXHRcXHRwZ19kYXRhX3QgKnBnZGF0O1xcbiAyNjM6XFx0XFxuIDI2NDpcXHRcXHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gMjY1OlxcdFxcdGlmICghcGdkYXQpXFxuIDI2NjpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMjY3OlxcdFxcdC8qXFxuIDI2ODpcXHRcXHQgKiBTaW5jZSB3ZSBob2xkIG1lbW9yeV90aWVyX2xvY2ssIHdlIGNhbiBhdm9pZFxcbiAyNjk6XFx0XFx0ICogUkNVIHJlYWQgbG9ja3Mgd2hlbiBhY2Nlc3NpbmcgdGhlIGRldGFpbHMuIE5vXFxuIDI3MDpcXHRcXHQgKiBwYXJhbGxlbCB1cGRhdGVzIGFyZSBwb3NzaWJsZSBoZXJlLlxcbiAyNzE6XFx0XFx0ICovXFxuIDI3MjpcXHRcXHRyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHBnZGF0LVxcdTAwM2VtZW10aWVyLFxcbiAyNzM6XFx0XFx0XFx0XFx0XFx0ICAgICBsb2NrZGVwX2lzX2hlbGQoXFx1MDAyNm1lbW9yeV90aWVyX2xvY2spKTtcXG4gMjc0OlxcdH1cXG4gMjc1OlxcdFxcbiAyNzY6XFx0I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbiAyNzc6XFx0Ym9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXFxuIDI3ODpcXHR7XFxuIDI3OTpcXHRcXHRib29sIHRvcHRpZXI7XFxuIDI4MDpcXHRcXHRwZ19kYXRhX3QgKnBnZGF0O1xcbiAyODE6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAyODI6XFx0XFxuIDI4MzpcXHRcXHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gMjg0OlxcdFxcdGlmICghcGdkYXQpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjI4LjQyNjYwNjM1N1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDM0MzIzMjE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgTlVNQSBNaWdyYXRpb24gaW4gYG1tL21lbW9yeS10aWVycy5jYCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgSSBzZWUgdGhpcyBgI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTmAgZ3VhcmQgYXJvdW5kIGEgYmxvY2sgb2YgY29kZSwgc3RhcnRpbmcgYXJvdW5kIGxpbmUgMjc2LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgdGhpcyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLiBXaGVyZSBkb2VzIGl0IGVuZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgPyBJdCdzIGVzc2VudGlhbCB0byB1bmRlcnN0YW5kIHdoaWNoIHBhcnRzIG9mIHRoZSBjb2RlIGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIGJhc2VkIG9uIHRoZSBOVU1BIG1pZ3JhdGlvbiBjb25maWd1cmF0aW9uLiBMZXQgbWUgcXVpY2tseSBqdW1wIHRvIGxpbmVzIDQ4MC01MzAgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBgI2VuZGlmYCBvciB0aGUgbmV4dCBkZWZpbmluZyBgaWZkZWZgIG9yIGBpZm5kZWZgLCBvciBgZWxzZWAuIFRoYXQgc2hvdWxkIGNsYXJpZnkgd2hhdCBmYWxscyB3aXRoaW4gdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNjb3BlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjY4MSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MzAuNDYwOTMyNzI0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMjI4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnktdGllcnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0ODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0ODA6XFx0XFx0LypcXG4gNDgxOlxcdFxcdCAqIFByb21vdGlvbiBpcyBhbGxvd2VkIGZyb20gYSBtZW1vcnkgdGllciB0byBoaWdoZXJcXG4gNDgyOlxcdFxcdCAqIG1lbW9yeSB0aWVyIG9ubHkgaWYgdGhlIG1lbW9yeSB0aWVyIGRvZXNuJ3QgaW5jbHVkZVxcbiA0ODM6XFx0XFx0ICogY29tcHV0ZS4gV2Ugd2FudCB0byBza2lwIHByb21vdGlvbiBmcm9tIGEgbWVtb3J5IHRpZXIsXFxuIDQ4NDpcXHRcXHQgKiBpZiBhbnkgbm9kZSB0aGF0IGlzIHBhcnQgb2YgdGhlIG1lbW9yeSB0aWVyIGhhdmUgQ1BVcy5cXG4gNDg1OlxcdFxcdCAqIE9uY2Ugd2UgZGV0ZWN0IHN1Y2ggYSBtZW1vcnkgdGllciwgd2UgY29uc2lkZXIgdGhhdCB0aWVyXFxuIDQ4NjpcXHRcXHQgKiBhcyB0b3AgdGlwZXIgZnJvbSB3aGljaCBwcm9tb3Rpb24gaXMgbm90IGFsbG93ZWQuXFxuIDQ4NzpcXHRcXHQgKi9cXG4gNDg4OlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShtZW10aWVyLCBcXHUwMDI2bWVtb3J5X3RpZXJzLCBsaXN0KSB7XFxuIDQ4OTpcXHRcXHRcXHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XFxuIDQ5MDpcXHRcXHRcXHRpZiAobm9kZXNfYW5kKHRpZXJfbm9kZXMsIG5vZGVfc3RhdGVzW05fQ1BVXSwgdGllcl9ub2RlcykpIHtcXG4gNDkxOlxcdFxcdFxcdFxcdC8qXFxuIDQ5MjpcXHRcXHRcXHRcXHQgKiBhYnN0cmFjdCBkaXN0YW5jZSBiZWxvdyB0aGUgbWF4IHZhbHVlIG9mIHRoaXMgbWVtdGllclxcbiA0OTM6XFx0XFx0XFx0XFx0ICogaXMgY29uc2lkZXJlZCB0b3B0aWVyLlxcbiA0OTQ6XFx0XFx0XFx0XFx0ICovXFxuIDQ5NTpcXHRcXHRcXHRcXHR0b3BfdGllcl9hZGlzdGFuY2UgPSBtZW10aWVyLVxcdTAwM2VhZGlzdGFuY2Vfc3RhcnQgK1xcbiA0OTY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0TUVNVElFUl9DSFVOS19TSVpFIC0gMTtcXG4gNDk3OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiA0OTg6XFx0XFx0XFx0fVxcbiA0OTk6XFx0XFx0fVxcbiA1MDA6XFx0XFx0LypcXG4gNTAxOlxcdFxcdCAqIE5vdyBidWlsZCB0aGUgbG93ZXJfdGllciBtYXNrIGZvciBlYWNoIG5vZGUgY29sbGVjdGluZyBub2RlIG1hc2sgZnJvbVxcbiA1MDI6XFx0XFx0ICogYWxsIG1lbW9yeSB0aWVyIGJlbG93IGl0LiBUaGlzIGFsbG93cyB1cyB0byBmYWxsYmFjayBkZW1vdGlvbiBwYWdlXFxuIDUwMzpcXHRcXHQgKiBhbGxvY2F0aW9uIHRvIGEgc2V0IG9mIG5vZGVzIHRoYXQgaXMgY2xvc2VyIHRoZSBhYm92ZSBzZWxlY3RlZFxcbiA1MDQ6XFx0XFx0ICogcHJlZmVycmVkIG5vZGUuXFxuIDUwNTpcXHRcXHQgKi9cXG4gNTA2OlxcdFxcdGxvd2VyX3RpZXIgPSBub2RlX3N0YXRlc1tOX01FTU9SWV07XFxuIDUwNzpcXHRcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbXRpZXIsIFxcdTAwMjZtZW1vcnlfdGllcnMsIGxpc3QpIHtcXG4gNTA4OlxcdFxcdFxcdC8qXFxuIDUwOTpcXHRcXHRcXHQgKiBLZWVwIHJlbW92aW5nIGN1cnJlbnQgdGllciBmcm9tIGxvd2VyX3RpZXIgbm9kZXMsXFxuIDUxMDpcXHRcXHRcXHQgKiBUaGlzIHdpbGwgcmVtb3ZlIGFsbCBub2RlcyBpbiBjdXJyZW50IGFuZCBhYm92ZVxcbiA1MTE6XFx0XFx0XFx0ICogbWVtb3J5IHRpZXIgZnJvbSB0aGUgbG93ZXJfdGllciBtYXNrLlxcbiA1MTI6XFx0XFx0XFx0ICovXFxuIDUxMzpcXHRcXHRcXHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XFxuIDUxNDpcXHRcXHRcXHRub2Rlc19hbmRub3QobG93ZXJfdGllciwgbG93ZXJfdGllciwgdGllcl9ub2Rlcyk7XFxuIDUxNTpcXHRcXHRcXHRtZW10aWVyLVxcdTAwM2Vsb3dlcl90aWVyX21hc2sgPSBsb3dlcl90aWVyO1xcbiA1MTY6XFx0XFx0fVxcbiA1MTc6XFx0XFxuIDUxODpcXHRcXHRkdW1wX2RlbW90aW9uX3RhcmdldHMoKTtcXG4gNTE5OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MzAuNDYxMDM3MDk0WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIxMjI2MTQ4NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIEknbSByZWFkeSB0byBkaXZlIGludG8gdGhpcy4gTGV0J3Mgc2VlIHdoYXQncyBiZWluZyBhc2tlZCBoZXJlLi4uIEkgbmVlZCB0byBzdW1tYXJpemUgYSB0ZXh0IGFzIGlmIGl0J3MgKm15KiB0aG91Z2h0IHByb2Nlc3MsIGFzIGFuIGV4cGVydCBpbiBteSBmaWVsZC4gT2theSwgc28gSSBzaG91bGQgYmUgdGhpbmtpbmcgYWJvdXQgdGhlIGluZm9ybWF0aW9uIGZyb20gYSBwb3NpdGlvbiBvZiBkZWVwIHVuZGVyc3RhbmRpbmcgYW5kIGV4cGVyaWVuY2UsIGludGVycHJldGluZyBpdCBhcyBJIHdvdWxkIG5hdHVyYWxseS4gR290IGl0LiBJIHNob3VsZCBhbHNvIHN0YXJ0IHdpdGggYSBib2xkZWQgaGVhZGVyIGFuZCBzcGVhayBpbiB0aGUgZmlyc3QgcGVyc29uLiBBbHJpZ2h0LCBoZXJlIHdlIGdvLlxuXG4qKk5hdmlnYXRpbmcgdGhlIE51YW5jZXM6IExpbmVzIDUyMC01NjAqKlxuXG5SaWdodCwgc28gbGV0J3MgZ2V0IGRvd24gdG8gdGhlIGJyYXNzIHRhY2tzIGFuZCB0YWtlIGEgbG9vayBhdCBsaW5lcyA1MjAgdGhyb3VnaCA1NjAuIEkgaW1tZWRpYXRlbHkgdGhpbmsgdGhhdCB0aGVzZSBsaW5lcyBwcm9iYWJseSBob2xkIGNydWNpYWwgZGV0YWlscywgYW5kIGJhc2VkIG9uIHRoZSBwcm9tcHQsIGl0IHdvdWxkIGJlIGFkdmFudGFnZW91cyB0byBleGFtaW5lIHRoaXMgc2VjdGlvbiBjbG9zZWx5LiBJIGtub3cgdGhlIGludHJpY2FjaWVzIG9mIHRoaXMgc3ViamVjdDsgaXQncyBwcmFjdGljYWxseSBzZWNvbmQgbmF0dXJlLiBJJ2xsIHJlYWQgd2l0aCB0aGF0IHBlcnNwZWN0aXZlLiBJIHNob3VsZCBiZSBhYmxlIHRvIGRlZHVjZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoZXNlIGxpbmVzIHJlbGF0aXZlbHkgcXVpY2tseS4gTGV0J3Mgc2VlIGhvdyB0aGlzIHRleHQgdW5mb2xkcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM1NzAsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjMyLjU4MzY1NDE2WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxNjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeS10aWVycy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyMDpcXHRcXG4gNTIxOlxcdCNlbHNlXFxuIDUyMjpcXHRzdGF0aWMgaW5saW5lIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkge31cXG4gNTIzOlxcdCNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG4gNTI0OlxcdFxcbiA1MjU6XFx0c3RhdGljIGlubGluZSB2b2lkIF9faW5pdF9ub2RlX21lbW9yeV90eXBlKGludCBub2RlLCBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlKVxcbiA1MjY6XFx0e1xcbiA1Mjc6XFx0XFx0aWYgKCFub2RlX21lbW9yeV90eXBlc1tub2RlXS5tZW10eXBlKVxcbiA1Mjg6XFx0XFx0XFx0bm9kZV9tZW1vcnlfdHlwZXNbbm9kZV0ubWVtdHlwZSA9IG1lbXR5cGU7XFxuIDUyOTpcXHRcXHQvKlxcbiA1MzA6XFx0XFx0ICogZm9yIGVhY2ggZGV2aWNlIGdldHRpbmcgYWRkZWQgaW4gdGhlIHNhbWUgTlVNQSBub2RlXFxuIDUzMTpcXHRcXHQgKiB3aXRoIHRoaXMgc3BlY2lmaWMgbWVtdHlwZSwgYnVtcCB0aGUgbWFwIGNvdW50LiBXZVxcbiA1MzI6XFx0XFx0ICogT25seSB0YWtlIG1lbXR5cGUgZGV2aWNlIHJlZmVyZW5jZSBvbmNlLCBzbyB0aGF0XFxuIDUzMzpcXHRcXHQgKiBjaGFuZ2luZyBhIG5vZGUgbWVtdHlwZSBjYW4gYmUgZG9uZSBieSBkcm9wcGluZyB0aGVcXG4gNTM0OlxcdFxcdCAqIG9ubHkgcmVmZXJlbmNlIGNvdW50IHRha2VuIGhlcmUuXFxuIDUzNTpcXHRcXHQgKi9cXG4gNTM2OlxcdFxcbiA1Mzc6XFx0XFx0aWYgKG5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1lbXR5cGUgPT0gbWVtdHlwZSkge1xcbiA1Mzg6XFx0XFx0XFx0aWYgKCFub2RlX21lbW9yeV90eXBlc1tub2RlXS5tYXBfY291bnQrKylcXG4gNTM5OlxcdFxcdFxcdFxcdGtyZWZfZ2V0KFxcdTAwMjZtZW10eXBlLVxcdTAwM2VrcmVmKTtcXG4gNTQwOlxcdFxcdH1cXG4gNTQxOlxcdH1cXG4gNTQyOlxcdFxcbiA1NDM6XFx0c3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqc2V0X25vZGVfbWVtb3J5X3RpZXIoaW50IG5vZGUpXFxuIDU0NDpcXHR7XFxuIDU0NTpcXHRcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XFxuIDU0NjpcXHRcXHRzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlID0gZGVmYXVsdF9kcmFtX3R5cGU7XFxuIDU0NzpcXHRcXHRpbnQgYWRpc3QgPSBNRU1USUVSX0FESVNUQU5DRV9EUkFNO1xcbiA1NDg6XFx0XFx0cGdfZGF0YV90ICpwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gNTQ5OlxcdFxcbiA1NTA6XFx0XFxuIDU1MTpcXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoXFx1MDAyNm1lbW9yeV90aWVyX2xvY2spO1xcbiA1NTI6XFx0XFxuIDU1MzpcXHRcXHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKVxcbiA1NTQ6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIDU1NTpcXHRcXG4gNTU2OlxcdFxcdG10X2NhbGNfYWRpc3RhbmNlKG5vZGUsIFxcdTAwMjZhZGlzdCk7XFxuIDU1NzpcXHRcXHRpZiAoIW5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1lbXR5cGUpIHtcXG4gNTU4OlxcdFxcdFxcdG1lbXR5cGUgPSBtdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGFkaXN0LCBcXHUwMDI2ZGVmYXVsdF9tZW1vcnlfdHlwZXMpO1xcbiA1NTk6XFx0XFx0XFx0aWYgKElTX0VSUihtZW10eXBlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzozMi41ODM3NDc3WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzNjczOTE4ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRGl2aW5nIGludG8gYG1tL3BhZ2VfYWxsb2MuY2AqKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgZGlzc2VjdCBgbW0vcGFnZV9hbGxvYy5jYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIG9uIHRoZSBmdW5jdGlvbiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHRoZSBncmFuZCBzY2hlbWUgb2YgdGhpbmdzLiBTbywgdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgcG9wcyBpbnRvIG15IGhlYWQgaXM6IHdobyBpcyBjYWxsaW5nIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbj8gV2hhdCBhcmUgaXRzIGRlcGVuZGVuY2llcz8gSSdtIGdvaW5nIHRvIGZpcmUgdXAgZ3JlcCBhbmQgc2NhbiB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSwgbG9va2luZyBmb3IgYWxsIGluc3RhbmNlcyBvZiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIFRoYXQncyB0aGUgYmVzdCB3YXkgdG8gZGV0ZXJtaW5lIGl0cyBjYWxsZXJzIGFuZCwgYnkgZXh0ZW5zaW9uLCBpdHMgY29udGV4dC4gS25vd2luZyB3aGVyZSBpdCdzIHVzZWQgaXMgdGhlIGZpcnN0IGNyaXRpY2FsIHN0ZXAgdG8gdW5kZXJzdGFuZGluZyBpdHMgcHVycG9zZSBhbmQgcG90ZW50aWFsIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ0ODEsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjM0Ljk1MTE0MTcxMloiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxOTM3OTIwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmaW5kX25leHRfYmVzdF9ub2RlX2luXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2ludGVybmFsLmg9MTEzND1leHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG5tbS9pbnRlcm5hbC5oLTExMzUtXFx0XFx0XFx0XFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcXG5tbS9pbnRlcm5hbC5oOjExMzY6aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxcbm1tL2ludGVybmFsLmgtMTEzNy1cXHRcXHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcXG4tLVxcbm1tL2ludGVybmFsLmg9MTE0MT1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTExNDUtfVxcbm1tL2ludGVybmFsLmg6MTE0NjpzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcXG5tbS9pbnRlcm5hbC5oLTExNDctXFx0XFx0Y29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTMzMD1pbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy0zNzItXFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcXG5tbS9tZW1vcnktdGllcnMuYzozNzM6XFx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXFx1MDAyNm1hc2ssIFxcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xcbm1tL21lbW9yeS10aWVycy5jLTM3NC19XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz00MjU9c3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTQ1Mi1cXHRcXHQvKlxcbm1tL21lbW9yeS10aWVycy5jOjQ1MzpcXHRcXHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJ3VzZWQnIG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0Llxcbm1tL21lbW9yeS10aWVycy5jLTQ1NC1cXHRcXHQgKiBBZGQgYWxsIG1lbW9yeSBub2RlcyBleGNlcHQgdGhlIHNlbGVjdGVkIG1lbW9yeSB0aWVyXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy00NjUtXFx0XFx0ZG8ge1xcbm1tL21lbW9yeS10aWVycy5jOjQ2NjpcXHRcXHRcXHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFxcdTAwMjZ0aWVyX25vZGVzLFxcbm1tL21lbW9yeS10aWVycy5jLTQ2Ny1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01NzkzPXN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTc5NS0vKipcXG5tbS9wYWdlX2FsbG9jLmM6NTc5NjogKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0XFxubW0vcGFnZV9hbGxvYy5jLTU3OTctICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmdcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01ODEwLSAqL1xcbm1tL3BhZ2VfYWxsb2MuYzo1ODExOmludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcXG5tbS9wYWdlX2FsbG9jLmMtNTgxMi1cXHRcXHRcXHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU4ODA9c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU4OTAtXFxubW0vcGFnZV9hbGxvYy5jOjU4OTE6XFx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcXHUwMDI2dXNlZF9tYXNrLFxcbm1tL3BhZ2VfYWxsb2MuYy01ODkyLVxcdFxcdFxcdFxcdFxcdCAgICAgIGNhbmRpZGF0ZXMpKSBcXHUwMDNlPSAwKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjM2LjY3MDUyOTM1NFoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxOTgyMDgzMzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqQW5hbHl6aW5nIEZ1bmN0aW9uIENhbGwgR3JhcGhzKipcblxuQWxyaWdodCwgZmlyc3QgdGhpbmdzIGZpcnN0LiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55dGhpbmcgcmVsYXRlZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZWAuIFRoZSBpbXBsaWNhdGlvbiBpcyB0aGF0IEkndmUgYmVlbiB0cmFjaW5nIHRoZSBsaW5lYWdlIG9mIHRoYXQgZnVuY3Rpb24sIHByb2JhYmx5IHRvIG9wdGltaXplIG9yIHVuZGVyc3RhbmQgaXRzIHVzYWdlLiBHb29kISBMb29rcyBsaWtlIG5vIGZ1cnRoZXIgaW5zdGFuY2VzIG9mIGl0IGFyZSBiZWluZyBjYWxsZWQuIFRoYXQncyBhIGNsZWFuIGJyZWFrIHBvaW50LlxuXG5Ob3csIG15IGZvY3VzIHNoaWZ0cy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBhcm91bmQgYGJ1aWxkX3pvbmVsaXN0c2AgYW5kIGBidWlsZF9hbGxfem9uZWxpc3RzYC4gV2hvIHJlbGllcyBvbiB0aGVzZSBmdW5jdGlvbnM/ICBLbm93aW5nIHRoZWlyIGNhbGxlcnMgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIGZsb3cgYW5kIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3Mgb3IgYXJlYXMgZm9yIHJlZmFjdG9yaW5nLiBJJ20gZ29pbmcgdG8gZm9sbG93IHRoZSBjYWxsIGdyYXBoIHVwIHRvIHNlZSB3aGF0IGZ1bmN0aW9ucyBhcmUgYWZmZWN0ZWQgYnkgY2hhbmdlcyB0byB0aGVzZSBmdW5jdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NTg0LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MzguNjUyNjE0NzgxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDc5NzcwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJidWlsZF96b25lbGlzdHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vcGFnZV9hbGxvYy5jPTU4ODA9c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU5MTEtXFxubW0vcGFnZV9hbGxvYy5jOjU5MTI6c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxubW0vcGFnZV9hbGxvYy5jLTU5MTMte1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU5Mzc9c3RhdGljIHZvaWQgc2V0dXBfbWluX3NsYWJfcmF0aW8odm9pZCk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTkzOS1cXG5tbS9wYWdlX2FsbG9jLmM6NTk0MDpzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG5tbS9wYWdlX2FsbG9jLmMtNTk0MS17XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NTk3Nz1zdGF0aWMgdm9pZCBfX2J1aWxkX2FsbF96b25lbGlzdHModm9pZCAqZGF0YSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MDA1LVxcdGlmIChzZWxmIFxcdTAwMjZcXHUwMDI2ICFub2RlX29ubGluZShzZWxmLVxcdTAwM2Vub2RlX2lkKSkge1xcbm1tL3BhZ2VfYWxsb2MuYzo2MDA2OlxcdFxcdGJ1aWxkX3pvbmVsaXN0cyhzZWxmKTtcXG5tbS9wYWdlX2FsbG9jLmMtNjAwNy1cXHR9IGVsc2Uge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYwMTQtXFxubW0vcGFnZV9hbGxvYy5jOjYwMTU6XFx0XFx0XFx0YnVpbGRfem9uZWxpc3RzKHBnZGF0KTtcXG5tbS9wYWdlX2FsbG9jLmMtNjAxNi1cXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjM4LjcwMzQyMTc3WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE3OTI0Njg5NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIEhpZXJhcmNoeSBvZiBgX19idWlsZF9hbGxfem9uZWxpc3RzYCoqXG5cblJpZ2h0LCBzbyBJIHNlZSBgX19idWlsZF9hbGxfem9uZWxpc3RzYCBpcyBkaXJlY3RseSBjYWxsZWQgYnkgYGJ1aWxkX2FsbF96b25lbGlzdHNgLiBUaGF0J3MgdGhlIGltbWVkaWF0ZSByZWxhdGlvbnNoaXAuIE5vdywgdGhlIHJlYWwgcXVlc3Rpb24gaXMsIHdoZXJlIGRvZXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGl0c2VsZiBmaXQgaW50byB0aGUgbGFyZ2VyIHBpY3R1cmU/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB1cHN0cmVhbSBkZXBlbmRlbmNpZXMuIFdoZXJlIGFyZSAqaXRzKiBjYWxsaW5nIHBvaW50cz8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgZnJvbSBgYnVpbGRfYWxsX3pvbmVsaXN0c2AgdG8gdW5kZXJzdGFuZCB0aGUgYmlnZ2VyIGFyY2hpdGVjdHVyZSBpdCBwbGF5cyBhIHJvbGUgaW4uIExldCdzIGZpbmQgdGhvc2UgY2FsbHMuIEkgZXhwZWN0IHRvIGZpbmQgc29tZSBpbnRlcmVzdGluZyB0aGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MTkyLCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDAuNDk1ODkzMzlaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NTkwMzk5OTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnVpbGRfYWxsX3pvbmVsaXN0c1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3g4Ni9tbS9udW1hLmM9MjMyPXZvaWQgX19pbml0IHg4Nl9udW1hX2luaXQodm9pZClcXG4tLVxcbmFyY2gveDg2L21tL251bWEuYy0yNTYtICogbWVtb3J5bGVzcyBDUFUgbm9kZXMgaGF2ZSBhbHJlYWR5IGJlZW4gYnJvdWdodCBvbmxpbmUsIGFuZCBiZWZvcmUgdGhlXFxuYXJjaC94ODYvbW0vbnVtYS5jOjI1NzogKiBub2RlX2RhdGFbbmlkXSBpcyBuZWVkZWQgZm9yIHpvbmUgbGlzdCBzZXR1cCBpbiBidWlsZF9hbGxfem9uZWxpc3RzKCkuXFxuYXJjaC94ODYvbW0vbnVtYS5jLTI1OC0gKlxcbi0tXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaD0xNjIwPXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZ2RhdF9lbmRfcGZuKHBnX2RhdGFfdCAqcGdkYXQpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE2MjYtXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNjI3OnZvaWQgYnVpbGRfYWxsX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KTtcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE2MjgtYm9vbCBfX3pvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyayxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTE0MD1pbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjE1LVxcdGlmIChuZWVkX3pvbmVsaXN0c19yZWJ1aWxkKVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTIxNjpcXHRcXHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIxNy1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTI1Nj1zdGF0aWMgcGdfZGF0YV90ICpob3RhZGRfaW5pdF9wZ2RhdChpbnQgbmlkKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjc1LVxcdCAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTI3NjpcXHRidWlsZF9hbGxfem9uZWxpc3RzKHBnZGF0KTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyNzctXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE5ODY9aW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIxNzAtXFx0XFx0em9uZV9wY3BfcmVzZXQoem9uZSk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMTcxOlxcdFxcdGJ1aWxkX2FsbF96b25lbGlzdHMoTlVMTCk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMTcyLVxcdH1cXG4tLVxcbm1tL21tX2luaXQuYz0yNjk3PXZvaWQgX19pbml0IG1tX2NvcmVfaW5pdCh2b2lkKVxcbi0tXFxubW0vbW1faW5pdC5jLTI3MDMtXFx0QlVJTERfQlVHX09OKE1BWF9aT05FTElTVFMgXFx1MDAzZSAyKTtcXG5tbS9tbV9pbml0LmM6MjcwNDpcXHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xcbm1tL21tX2luaXQuYy0yNzA1LVxcdHBhZ2VfYWxsb2NfaW5pdF9jcHVocCgpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU5NzU9c3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJfY3B1X3pvbmVzdGF0LCBib290X3pvbmVzdGF0cyk7XFxubW0vcGFnZV9hbGxvYy5jLTU5NzYtXFxubW0vcGFnZV9hbGxvYy5jOjU5Nzc6c3RhdGljIHZvaWQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmRhdGEpXFxubW0vcGFnZV9hbGxvYy5jLTU5Nzgte1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTYwMzY9c3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0XFxubW0vcGFnZV9hbGxvYy5jOjYwMzc6YnVpbGRfYWxsX3pvbmVsaXN0c19pbml0KHZvaWQpXFxubW0vcGFnZV9hbGxvYy5jLTYwMzgte1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYwNDAtXFxubW0vcGFnZV9hbGxvYy5jOjYwNDE6XFx0X19idWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xcbm1tL3BhZ2VfYWxsb2MuYy02MDQyLVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYwNjUtICpcXG5tbS9wYWdlX2FsbG9jLmM6NjA2NjogKiBfX3JlZiBkdWUgdG8gY2FsbCBvZiBfX2luaXQgYW5ub3RhdGVkIGhlbHBlciBidWlsZF9hbGxfem9uZWxpc3RzX2luaXRcXG5tbS9wYWdlX2FsbG9jLmMtNjA2Ny0gKiBbcHJvdGVjdGVkIGJ5IFNZU1RFTV9CT09USU5HXS5cXG5tbS9wYWdlX2FsbG9jLmMtNjA2OC0gKi9cXG5tbS9wYWdlX2FsbG9jLmM6NjA2OTp2b2lkIF9fcmVmIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG5tbS9wYWdlX2FsbG9jLmMtNjA3MC17XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNjA3My1cXHRpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7XFxubW0vcGFnZV9hbGxvYy5jOjYwNzQ6XFx0XFx0YnVpbGRfYWxsX3pvbmVsaXN0c19pbml0KCk7XFxubW0vcGFnZV9hbGxvYy5jLTYwNzUtXFx0fSBlbHNlIHtcXG5tbS9wYWdlX2FsbG9jLmM6NjA3NjpcXHRcXHRfX2J1aWxkX2FsbF96b25lbGlzdHMocGdkYXQpO1xcbm1tL3BhZ2VfYWxsb2MuYy02MDc3LVxcdFxcdC8qIGNwdXNldCByZWZyZXNoIHJvdXRpbmUgc2hvdWxkIGJlIGhlcmUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDIuMDU0OTM5NjE1WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxNDI0NDAwMDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoZSBjb2RlOlxuXG4qKlRoaW5raW5nIFRocm91Z2ggWm9uZWxpc3QgSW5pdGlhbGl6YXRpb24gYW5kIERlbW90aW9uKipcblxuT2theSwgc28gYGJ1aWxkX2FsbF96b25lbGlzdHNgIGlzIGEgY3JpdGljYWwgZnVuY3Rpb24sIGNsZWFybHkuIEl0J3MgY2FsbGVkIG5vdCBqdXN0IGR1cmluZyB0aGUgaW5pdGlhbCBib290IHNlcXVlbmNlIHZpYSBgbW1fY29yZV9pbml0YCwgYnV0IGFsc28gZHluYW1pY2FsbHkgd2hlbiB3ZSdyZSBkZWFsaW5nIHdpdGggbWVtb3J5IGhvdHBsdWcgZXZlbnRzOiBgb25saW5lX3BhZ2VzYCwgYGhvdGFkZF9pbml0X3BnZGF0YCwgYW5kIGBvZmZsaW5lX3BhZ2VzYC4gVGhhdCBtYWtlcyBzZW5zZTsgdGhlIHpvbmVsaXN0IHN0cnVjdHVyZSBoYXMgdG8gYmUgdXBkYXRlZCB3aGVuZXZlciB0aGUgbWVtb3J5IHRvcG9sb2d5IGNoYW5nZXMuXG5cbkJ1dCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzIGFib3V0IGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AuIFdoZXJlIGRvZXMgKnRoYXQqIGZpdCBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBsaWZlY3ljbGU/IFdoZW4gaXMgKnRoYXQqIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZD8gR2l2ZW4gaXRzIG5hbWUsIGl0IG11c3QgcGxheSBhIHBhcnQsIGFuZCBpdHMgZXhlY3V0aW9uIGNvbnRleHQgaXMgaW1wb3J0YW50IHRvIGFuYWx5emUuXG5cblRpbWUgdG8gcmVhY2ggZm9yIHRoZSB0cnVzdHkgYGdyZXBgLiBJJ2xsIHJ1biBhIHF1aWNrIHNlYXJjaCBmb3IgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBhbmQgc2VlIHdoZXJlIGl0J3MgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UuIEtub3dpbmcgdGhhdCBzaG91bGQgZ2l2ZSBtZSBhIG1vcmUgY29tcGxldGUgdW5kZXJzdGFuZGluZyBvZiBob3cgbWVtb3J5IGRlbW90aW9uIGlzIHNldCB1cC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc1NTYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzo0NS4xOTczODE5NDNaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NjE5MTg4NzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LXRpZXJzLmM9NDAwPXN0YXRpYyB2b2lkIGR1bXBfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNDI0LSAqL1xcbm1tL21lbW9yeS10aWVycy5jOjQyNTpzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbm1tL21lbW9yeS10aWVycy5jLTQyNi17XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy01MjEtI2Vsc2VcXG5tbS9tZW1vcnktdGllcnMuYzo1MjI6c3RhdGljIGlubGluZSB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpIHt9XFxubW0vbWVtb3J5LXRpZXJzLmMtNTIzLSNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTcwOD1zdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfdGllcl9sYXRlX2luaXQodm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTczMS1cXG5tbS9tZW1vcnktdGllcnMuYzo3MzI6XFx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcXG5tbS9tZW1vcnktdGllcnMuYy03MzMtXFx0cHV0X29ubGluZV9tZW1zKCk7XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz04ODI9c3RhdGljIGludCBfX21lbWluaXQgbWVtdGllcl9ob3RwbHVnX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZixcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTg5MS1cXHRcXHRpZiAoY2xlYXJfbm9kZV9tZW1vcnlfdGllcihubi1cXHUwMDNlbmlkKSlcXG5tbS9tZW1vcnktdGllcnMuYzo4OTI6XFx0XFx0XFx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcXG5tbS9tZW1vcnktdGllcnMuYy04OTMtXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTg5OC1cXHRcXHRpZiAoIUlTX0VSUihtZW10aWVyKSlcXG5tbS9tZW1vcnktdGllcnMuYzo4OTk6XFx0XFx0XFx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcXG5tbS9tZW1vcnktdGllcnMuYy05MDAtXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDYuNzU5MzA3OTA3WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI1Nzc4MTgzNDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBteXNlbGY6XG5cbioqVHJhY2luZyBEb3duIGBuZXh0X2RlbW90aW9uX25vZGVgKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIG1lbW9yeSBtYW5hZ2VtZW50IHN0dWZmLCBhbmQgSSd2ZSBoaXQgYSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gdW5kZXJzdGFuZCBgbmV4dF9kZW1vdGlvbl9ub2RlYC4gV2hlcmUgZG9lcyB0aGlzIGdldCBjYWxsZWQsIGV4YWN0bHk/IExldCdzIHNlZS4uLiBBaGEhIEl0IGxvb2tzIGxpa2UgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgaW52b2tlZCBmcm9tIGBkZW1vdGVfZm9saW9fbGlzdGAuIFJpZ2h0LCBhbmQgdGhhdCBmdW5jdGlvbiBsaXZlcyBpbiBgbW0vdm1zY2FuLmNgLiBOb3cgd2UncmUgZ2V0dGluZyBzb21ld2hlcmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsIHRvIGBuZXh0X2RlbW90aW9uX25vZGVgLCBzbyBJJ20gZ29pbmcgdG8ganVtcCBpbnRvIGBkZW1vdGVfZm9saW9fbGlzdGAgaW4gYG1tL3Ztc2Nhbi5jYCBhbmQgc2VlIGhvdyAqaXQqIGlzIHVzZWQuIFRoYXQgd2lsbCBnaXZlIG1lIHRoZSBicm9hZGVyIHBpY3R1cmUgb2Ygd2h5IGBuZXh0X2RlbW90aW9uX25vZGVgIGlzIHJlbGV2YW50IGhlcmUuIExldCdzIHNlZSB3aGF0IHdlIGZpbmQhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MzIxLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDkuMzM3MTI4ODY1WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3MjE1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS92bXNjYW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDcwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDcwOlxcdCAqL1xcbjEwNzE6XFx0c3RhdGljIHVuc2lnbmVkIGludCBkZW1vdGVfZm9saW9fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpkZW1vdGVfZm9saW9zLFxcbjEwNzI6XFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG4xMDczOlxcdFxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4xMDc0OlxcdHtcXG4xMDc1OlxcdFxcdGludCB0YXJnZXRfbmlkO1xcbjEwNzY6XFx0XFx0dW5zaWduZWQgaW50IG5yX3N1Y2NlZWRlZDtcXG4xMDc3OlxcdFxcdG5vZGVtYXNrX3QgYWxsb3dlZF9tYXNrO1xcbjEwNzg6XFx0XFxuMTA3OTpcXHRcXHRzdHJ1Y3QgbWlncmF0aW9uX3RhcmdldF9jb250cm9sIG10YyA9IHtcXG4xMDgwOlxcdFxcdFxcdC8qXFxuMTA4MTpcXHRcXHRcXHQgKiBBbGxvY2F0ZSBmcm9tICdub2RlJywgb3IgZmFpbCBxdWlja2x5IGFuZCBxdWlldGx5LlxcbjEwODI6XFx0XFx0XFx0ICogV2hlbiB0aGlzIGhhcHBlbnMsICdwYWdlJyB3aWxsIGxpa2VseSBqdXN0IGJlIGRpc2NhcmRlZFxcbjEwODM6XFx0XFx0XFx0ICogaW5zdGVhZCBvZiBtaWdyYXRlZC5cXG4xMDg0OlxcdFxcdFxcdCAqL1xcbjEwODU6XFx0XFx0XFx0LmdmcF9tYXNrID0gKEdGUF9ISUdIVVNFUl9NT1ZBQkxFIFxcdTAwMjYgfl9fR0ZQX1JFQ0xBSU0pIHxcXG4xMDg2OlxcdFxcdFxcdFxcdF9fR0ZQX05PTUVNQUxMT0MgfCBHRlBfTk9XQUlULFxcbjEwODc6XFx0XFx0XFx0Lm5tYXNrID0gXFx1MDAyNmFsbG93ZWRfbWFzayxcXG4xMDg4OlxcdFxcdFxcdC5yZWFzb24gPSBNUl9ERU1PVElPTixcXG4xMDg5OlxcdFxcdH07XFxuMTA5MDpcXHRcXG4xMDkxOlxcdFxcdGlmIChsaXN0X2VtcHR5KGRlbW90ZV9mb2xpb3MpKVxcbjEwOTI6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMTA5MzpcXHRcXG4xMDk0OlxcdFxcdG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ2RhdCwgXFx1MDAyNmFsbG93ZWRfbWFzayk7XFxuMTA5NTpcXHRcXHRtZW1fY2dyb3VwX25vZGVfZmlsdGVyX2FsbG93ZWQobWVtY2csIFxcdTAwMjZhbGxvd2VkX21hc2spO1xcbjEwOTY6XFx0XFx0aWYgKG5vZGVzX2VtcHR5KGFsbG93ZWRfbWFzaykpXFxuMTA5NzpcXHRcXHRcXHRyZXR1cm4gMDtcXG4xMDk4OlxcdFxcbjEwOTk6XFx0XFx0dGFyZ2V0X25pZCA9IG5leHRfZGVtb3Rpb25fbm9kZShwZ2RhdC1cXHUwMDNlbm9kZV9pZCwgXFx1MDAyNmFsbG93ZWRfbWFzayk7XFxuMTEwMDpcXHRcXHRpZiAodGFyZ2V0X25pZCA9PSBOVU1BX05PX05PREUpXFxuMTEwMTpcXHRcXHRcXHQvKiBObyBsb3dlci10aWVyIG5vZGVzIG9yIG5vZGVzIHdlcmUgaG90LXVucGx1Z2dlZC4gKi9cXG4xMTAyOlxcdFxcdFxcdHJldHVybiAwO1xcbjExMDM6XFx0XFxuMTEwNDpcXHRcXHRtdGMubmlkID0gdGFyZ2V0X25pZDtcXG4xMTA1OlxcdFxcbjExMDY6XFx0XFx0LyogRGVtb3Rpb24gaWdub3JlcyBhbGwgY3B1c2V0IGFuZCBtZW1wb2xpY3kgc2V0dGluZ3MgKi9cXG4xMTA3OlxcdFxcdG1pZ3JhdGVfcGFnZXMoZGVtb3RlX2ZvbGlvcywgYWxsb2NfZGVtb3RlX2ZvbGlvLCBOVUxMLFxcbjExMDg6XFx0XFx0XFx0ICAgICAgKHVuc2lnbmVkIGxvbmcpXFx1MDAyNm10YywgTUlHUkFURV9BU1lOQywgTVJfREVNT1RJT04sXFxuMTEwOTpcXHRcXHRcXHQgICAgICBcXHUwMDI2bnJfc3VjY2VlZGVkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDkuMzM3NDAyOTI1WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk5NDQwNjYwNjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFpvbmVsaXN0IENoYW5nZXMgZm9yIE1lbW9yeSBNYW5hZ2VtZW50IGFuZCBGdXp6aW5nIFJlbGV2YW5jZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5LCBteSBleHBlcnQgbWluZCBmbGFncyBgZGVtb3RlX2ZvbGlvX2xpc3RgIGFzIHBhcnQgb2YgcGFnZSByZWNsYW1hdGlvbuKAlHNwZWNpZmljYWxseSwgdGhlIGRlbW90aW9uIHByb2Nlc3Mgd2hlbiBtZW1vcnkgcHJlc3N1cmUgaGl0cy4gUGFnZXMgZ2V0IHNodWZmbGVkIGRvd24gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgaG93IHRoZSBmYWxsYmFjayBvcmRlciBmb3IgYG5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnNgIGlzIGNvbnN0cnVjdGVkLCBtYWlubHkgdGhyb3VnaCBgYnVpbGRfbm9kZV96b25lbGlzdGAgYW5kIHRoZSBicm9hZGVyIGBidWlsZF96b25lbGlzdHNgIGZ1bmN0aW9ucy4gVGhpcyBgWk9ORUxJU1RfRkFMTEJBQ0tgIGlzICpjcnVjaWFsKiBiZWNhdXNlIGl0J3MgdXNlZCBieSBldmVyeSBhbGxvY2F0aW9uIHRoYXQgbmVlZHMgdG8gZmFsbCBiYWNrIGFjcm9zcyBOVU1BIG5vZGVzLlxuXG5JIHNlZSBhIGNsZWFyIHNoaWZ0IGhlcmUuIFRoZSBvbGQgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyYCB3YXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgaXRlcmF0aW5nIG92ZXIgbm9kZXMgaW4gYSBzZXQgb3JkZXIuIE5vdywgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGlzIHVzaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIGFuZCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzay4gVGhpcyBgY2FuZGlkYXRlc2AgbWFzayBpcyAqa2V5Ki4gQmVmb3JlLCBpdCB1c2VkIGBOX01FTU9SWWAuIEl0IGxvb2tzIGxpa2Ugd2UncmUgYmVpbmcgZmFyIG1vcmUgcHJlY2lzZSBhYm91dCAqd2hpY2gqIG5vZGVzIGFyZSBjb25zaWRlcmVkLCB3aGljaCBpcyBhIGJpZyBjaGFuZ2UhXG5cbkkgbmVlZCB0byBkaXZlIGludG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaXQgbm93IHVzZXMgdGhhdCBgY2FuZGlkYXRlc2AgbWFzaywgd2hpY2ggaXMgZ3JlYXQgYmVjYXVzZSBjYWxsZXJzIGNhbiBub3cgcGFzcyBpbiBhIHJlc3RyaWN0ZWQgbm9kZW1hc2suIEkgc2VlIHRoaXMgaGFwcGVuaW5nIGluIHRoZSBgbWVtb3J5LXRpZXJzYCBjb2RlLCBpbiBgbmV4dF9kZW1vdGlvbl9ub2RlKClgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKWAuIFRoZSBwcmV2aW91cyBjb2RlIHdhcyBtb3JlIG9mIGEgYmx1bnQgaW5zdHJ1bWVudCwgYW5kIHRoaXMgaXMgZmFyIG1vcmUgdGFyZ2V0ZWQuXG5cbk9rYXksIG5vdyBsZXQncyBhcHBseSB0aGUgZnV6emluZyBjcml0ZXJpYS4gVGhpcyBwYXRjaCBpcyAqZGVmaW5pdGVseSogaW4gYG1tL2Ag4oCTIG1lbW9yeSBtYW5hZ2VtZW50LiBJdCdzIGNoYW5naW5nIGNvcmUgem9uZWxpc3QgYnVpbGRpbmcgbG9naWMsIHNwZWNpZmljYWxseSBob3cgd2UncmUgY2FsY3VsYXRpbmcgd2hpY2ggbm9kZSB0byB1c2UgaW4gcGFnZSByZWNsYWltIChhbmQgaW4gcGFydGljdWxhciwgZGVtb3Rpb24pLiBUaGlzIGRpcmVjdGx5IGFmZmVjdHMgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGFuZCB0aGUgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGZ1bmN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgLCBhbG9uZyB3aXRoIHVwZGF0ZXMgdG8gdGhlIGRlbW90aW9uIHRhcmdldCBjYWxjdWxhdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaG9zZSBhcmUgKmV4YWN0bHkqIHRoZSBraW5kIG9mIGNvcmUgc3Vic3lzdGVtIGFuZCBhbGdvcml0aG0gZmxvdyBjaGFuZ2VzIHRoYXQgdGhlIGZ1enppbmcgY3JpdGVyaWEgZmxhZy5cblxuVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lcywgaXMgdGhpcyBwYXRjaCBjb2RlIHJlYWNoYWJsZSBpbiBhIGZ1enplciBmcmllbmRseSBlbnZpcm9ubWVudD8gQW5kIHRoZSBhbnN3ZXIgaXMgYWJzb2x1dGVseSB5ZXMhIEkgY2FuIGVhc2lseSBjb25maWd1cmUgTlVNQSBub2RlcyBpbiBRRU1VIChJIHVzZSBpdCBhbGwgdGhlIHRpbWUpLiBTeXprYWxsZXIgb2Z0ZW4gcnVucyB3aXRoIE5VTUEgZW5hYmxlZCwgdG9vLiBBbmQgY3J1Y2lhbGx5LCBtZW1vcnkgaG90cGx1Zy9tZW1wb2xpY3kgc3lzY2FsbHMgKGUuZy4sIGBzZXRfbWVtcG9saWN5YCwgYG1iaW5kYCwgYG1pZ3JhdGVfcGFnZXNgLCBgbW92ZV9wYWdlc2ApIGFuZCBwYWdlIHJlY2xhaW0gZGVtb3Rpb24gZGVmaW5pdGVseSBydW4gdGhpcyBjb2RlLiBTbyB0aGlzIGlzIGdyZWF0IVxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHNvbWV0aGluZyDigJMgaXMgdGhlIGBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXJgIHN5c2N0bCBzdGlsbCBhcm91bmQ/IEknZCBleHBlY3QgaXQgaXMgYXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIHdpbGwgdXNlIGl0cyBvcmRlci4gSSdsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayB0aGF0LiBCdXQgZXZlcnl0aGluZyBzbyBmYXIgc3Ryb25nbHkgc3VnZ2VzdHMgdGhpcyBwYXRjaCBpcyAqaGlnaGx5KiBmdXp6YWJsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkyNzEsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NTkuMjgxNDcxNDM5WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2Mjg3NDE0OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJudW1hX3pvbmVsaXN0X29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3BhZ2VfYWxsb2MuYz01NzQ1PXN0YXRpYyBpbnQgYnVpbGRfem9uZXJlZnNfbm9kZShwZ19kYXRhX3QgKnBnZGF0LCBzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTc2NC1cXG5tbS9wYWdlX2FsbG9jLmM6NTc2NTpzdGF0aWMgaW50IF9fcGFyc2VfbnVtYV96b25lbGlzdF9vcmRlcihjaGFyICpzKVxcbm1tL3BhZ2VfYWxsb2MuYy01NzY2LXtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01NzczLVxcdGlmICghKCpzID09ICdkJyB8fCAqcyA9PSAnRCcgfHwgKnMgPT0gJ24nIHx8ICpzID09ICdOJykpIHtcXG5tbS9wYWdlX2FsbG9jLmM6NTc3NDpcXHRcXHRwcl93YXJuKFxcXCJJZ25vcmluZyB1bnN1cHBvcnRlZCBudW1hX3pvbmVsaXN0X29yZGVyIHZhbHVlOiAgJXNcXFxcblxcXCIsIHMpO1xcbm1tL3BhZ2VfYWxsb2MuYy01Nzc1LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU3NzktXFxubW0vcGFnZV9hbGxvYy5jOjU3ODA6c3RhdGljIGNoYXIgbnVtYV96b25lbGlzdF9vcmRlcltdID0gXFxcIk5vZGVcXFwiO1xcbm1tL3BhZ2VfYWxsb2MuYy01NzgxLSNkZWZpbmUgTlVNQV9aT05FTElTVF9PUkRFUl9MRU5cXHQxNlxcbm1tL3BhZ2VfYWxsb2MuYy01NzgyLS8qXFxubW0vcGFnZV9hbGxvYy5jOjU3ODM6ICogc3lzY3RsIGhhbmRsZXIgZm9yIG51bWFfem9uZWxpc3Rfb3JkZXJcXG5tbS9wYWdlX2FsbG9jLmMtNTc4NC0gKi9cXG5tbS9wYWdlX2FsbG9jLmM6NTc4NTpzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbm1tL3BhZ2VfYWxsb2MuYy01Nzg2LVxcdFxcdHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcylcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01Nzg4LVxcdGlmICh3cml0ZSlcXG5tbS9wYWdlX2FsbG9jLmM6NTc4OTpcXHRcXHRyZXR1cm4gX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKGJ1ZmZlcik7XFxubW0vcGFnZV9hbGxvYy5jLTU3OTAtXFx0cmV0dXJuIHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjkxOD1zdGF0aWMgY29uc3Qgc3RydWN0IGN0bF90YWJsZSBwYWdlX2FsbG9jX3N5c2N0bF90YWJsZVtdID0ge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTY5NzAtXFx0e1xcbm1tL3BhZ2VfYWxsb2MuYzo2OTcxOlxcdFxcdC5wcm9jbmFtZVxcdD0gXFxcIm51bWFfem9uZWxpc3Rfb3JkZXJcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYzo2OTcyOlxcdFxcdC5kYXRhXFx0XFx0PSBcXHUwMDI2bnVtYV96b25lbGlzdF9vcmRlcixcXG5tbS9wYWdlX2FsbG9jLmMtNjk3My1cXHRcXHQubWF4bGVuXFx0XFx0PSBOVU1BX1pPTkVMSVNUX09SREVSX0xFTixcXG5tbS9wYWdlX2FsbG9jLmMtNjk3NC1cXHRcXHQubW9kZVxcdFxcdD0gMDY0NCxcXG5tbS9wYWdlX2FsbG9jLmM6Njk3NTpcXHRcXHQucHJvY19oYW5kbGVyXFx0PSBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIsXFxubW0vcGFnZV9hbGxvYy5jLTY5NzYtXFx0fSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NTkuMzQ0MzU0MjI4WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxMTA2NzkyNzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgWm9uZWxpc3QgQ29uc3RydWN0aW9uIGFuZCBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGtpY2tpbmcgb2ZmIHRoaXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgaXQncyB0aWVkIHRvIGNoYW5nZXMgaW4gdGhlIG1lbW9yeSB0b3BvbG9neSwgcmlnaHQ/IExpa2UsIHN5c2ZzIGVudHJpZXMgZm9yIG9ubGluZS9vZmZsaW5lIG1lbW9yeSBwYWdlcyDigJMgdGhlIHVzdWFsIHN1c3BlY3RzIGF0IGAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS8uLi5gLiBBbHNvLCBpdCdzIGdvdHRhIGJlIGludm9sdmVkIHdpdGggaG90LWFkZCBtZW1vcnkgb3BlcmF0aW9ucywgb2J2aW91c2x5LiBBbmQsIG9mIGNvdXJzZSwgdGhlIGBuZXh0X2RlbW90aW9uX25vZGVgIGZ1bmN0aW9uLCB3aGljaCBJIGtub3cgaXMgYSBrZXkgcGFydCBvZiBtZW1vcnkgcmVjbGFpbSwgc3BlY2lmaWNhbGx5IHdoZW4gd2UncmUgZGVtb3RpbmcgcGFnZXMgd2l0aGluIGBkZW1vdGVfZm9saW9fbGlzdGAuIFRoZW4gdGhlcmUncyBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLCBjYWxsZWQgd2hlbiB0aGVyZSdzIGEgc2hpZnQgaW4gbWVtb3J5IHRpZXJzLCBvciBhbHNvIG9uIGhvdHBsdWcgZXZlbnRzLiBGaW5hbGx5LCB6b25lbGlzdHMgZ2V0IGEgYnVpbGQgYXQgYm9vdCwgdG9vLCB3aGljaCBtYWtlcyBzZW5zZS5cblxuUmlnaHQsIHNvIHdoYXQgY29uZmlndXJhdGlvbnMgYXJlIGFic29sdXRlbHkgZXNzZW50aWFsIGZvciB0aGlzIHdob2xlIHByb2Nlc3M/IExldCBtZSBjaGVjayB0aGUgY29kZS5cblxuQWxyaWdodCwgbG9va2luZyBhdCBgbW0vbWVtb3J5LXRpZXJzLmNgLCBJIHNlZSBhIGNsZWFyIGRlcGVuZGVuY3k6IGBvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9gLiBNYWtlcyBzZW5zZSwgd2UgbmVlZCBOVU1BIHN1cHBvcnQuIEFuZCAqY3J1Y2lhbGx5KiwgaXQgbG9va3MgbGlrZSB0aGUgcHJlc2VuY2Ugb2YgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgd2hhdCBndWFyZHMgYm90aCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYC4gVGhhdCdzIHRoZSBsaW5jaHBpbi4gU28sIHRoZSBrZXkgaXMgZ29pbmcgdG8gYmUgYENPTkZJR19OVU1BX01JR1JBVElPTmAsIGFuZCwgb2YgY291cnNlLCBgQ09ORklHX05VTUFgLiBMZXQgbWUgZ28gY2hlY2sgS2NvbmZpZyB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZnVsbCBzY29wZSBvZiB0aGVzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIxMjEsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6MDIuNDU1MDM3MTU2WiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTUyMzk0ODU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBOVU1BX01JR1JBVElPTlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTY2MD1jb25maWcgUEFHRV9SRVBPUlRJTkdcXG4tLVxcbm1tL0tjb25maWctNjY3LVxcbm1tL0tjb25maWc6NjY4OmNvbmZpZyBOVU1BX01JR1JBVElPTlxcbm1tL0tjb25maWctNjY5LVxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjA0LjQwNzQzOTY2NVoiLCJTZXEiOjM3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDEwNzIzOTk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhpbmtpbmcgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB0aGUgTlVNQV9NSUdSQVRJT04gQ29uZmlndXJhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgb2YgYE5VTUFfTUlHUkFUSU9OYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNjY4LiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zIHJlc2lkZS4gQnkgZXhhbWluaW5nIHRoYXQgc2VjdGlvbiwgSSBzaG91bGQgYmUgYWJsZSB0byB1bnJhdmVsIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGBOVU1BX01JR1JBVElPTmAgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBpY3R1cmUgb2Ygd2hhdCBvdGhlciBmZWF0dXJlcyBvciBvcHRpb25zIG5lZWQgdG8gYmUgaW4gcGxhY2UgZm9yIHRoaXMgcGFydGljdWxhciBOVU1BIG1pZ3JhdGlvbiBmdW5jdGlvbmFsaXR5IHRvIGJlIGF2YWlsYWJsZS4gSSdtIGV4cGVjdGluZyB0byBzZWUgZGVwZW5kZW5jaWVzIG9uIHRoZSBOVU1BIGFyY2hpdGVjdHVyZSBpdHNlbGYsIGFuZCBwb3RlbnRpYWxseSBvbiBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBmZWF0dXJlcy4gSSdsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjc4OSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjA2LjQxODE2NzAyMVoiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTY5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiA2NjUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2NjU6XFx0XFx0ICB0aG9zZSBwYWdlcyB0byBhbm90aGVyIGVudGl0eSwgc3VjaCBhcyBhIGh5cGVydmlzb3IsIHNvIHRoYXQgdGhlXFxuIDY2NjpcXHRcXHQgIG1lbW9yeSBjYW4gYmUgZnJlZWQgd2l0aGluIHRoZSBob3N0IGZvciBvdGhlciB1c2VzLlxcbiA2Njc6XFx0XFxuIDY2ODpcXHRjb25maWcgTlVNQV9NSUdSQVRJT05cXG4gNjY5OlxcdFxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuIDY3MDpcXHRcXHRkZWZhdWx0IHlcXG4gNjcxOlxcdFxcdGRlcGVuZHMgb24gTlVNQSBcXHUwMDI2XFx1MDAyNiBNTVVcXG4gNjcyOlxcdFxcdHNlbGVjdCBNSUdSQVRJT05cXG4gNjczOlxcdFxcdGhlbHBcXG4gNjc0OlxcdFxcdCAgU3VwcG9ydCB0aGUgbWlncmF0aW9uIG9mIHBhZ2VzIHRvIG90aGVyIE5VTUEgbm9kZXMsIGF2YWlsYWJsZSB0b1xcbiA2NzU6XFx0XFx0ICB1c2VyIHNwYWNlIHRocm91Z2ggaW50ZXJmYWNlcyBsaWtlIG1pZ3JhdGVfcGFnZXMoKSwgbW92ZV9wYWdlcygpLFxcbiA2NzY6XFx0XFx0ICBhbmQgbWJpbmQoKS4gU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGFsc28gZW5hYmxlcyBzdXBwb3J0IGZvciBwYWdlXFxuIDY3NzpcXHRcXHQgIGRlbW90aW9uIGZvciBtZW1vcnkgdGllcmluZy5cXG4gNjc4OlxcdFxcbiA2Nzk6XFx0Y29uZmlnIE1JR1JBVElPTlxcbiA2ODA6XFx0XFx0Ym9vbFxcbiA2ODE6XFx0XFx0ZGVwZW5kcyBvbiBNTVVcXG4gNjgyOlxcdFxcbiA2ODM6XFx0Y29uZmlnIERFVklDRV9NSUdSQVRJT05cXG4gNjg0OlxcdFxcdGRlZl9ib29sIE1JR1JBVElPTiBcXHUwMDI2XFx1MDAyNiBaT05FX0RFVklDRVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODowNi40MTgyODY0MzFaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTk5ODk5MTY1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEZWx2aW5nIGludG8gTlVNQSBNaWdyYXRpb24gRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIGFib3V0IGBOVU1BX01JR1JBVElPTmAgYW5kLCBuYXR1cmFsbHksIGl0IGxlYW5zIG9uIGJvdGggYE5VTUFgIGFuZCB0aGUgYE1NVWAuIFRoYXQgbWFrZXMgc2Vuc2UsIHJpZ2h0PyBJdCB3b3VsZG4ndCBiZSBhYmxlIHRvIG1pZ3JhdGUgd2l0aG91dCB0aG9zZSB1bmRlcmx5aW5nIHN0cnVjdHVyZXMuIEJ1dCBub3cgbXkgbWluZCBpcyBzdGFydGluZyB0byB3YW5kZXIgYSBiaXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBmdWxsIGNvbnRleHQgaGVyZS4gVGhhdCdzIHdoZW4gSSB3b25kZXIgYWJvdXQgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIHdpdGhpbiBgbW0vcGFnZV9hbGxvYy5jYC4gSSBoYXZlIGEgZmVlbGluZyBJIG5lZWQgdG8gY2lyY2xlIGJhY2sgdG8gd2hhdCBnYXRlcyB0aGF0IGZ1bmN0aW9uLiBMZXQncyBzZWUgd2hhdCBndWFyZHMgdGhhdCBmdW5jdGlvbiBpbiBgbW0vcGFnZV9hbGxvYy5jYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjMzMjEsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjA4LjQxNzI4MTEyOVoiLCJTZXEiOjQwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTgyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vcGFnZV9hbGxvYy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU3OTAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU3OTA6XFx0XFx0cmV0dXJuIHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7XFxuNTc5MTpcXHR9XFxuNTc5MjpcXHRcXG41NzkzOlxcdHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XFxuNTc5NDpcXHRcXG41Nzk1OlxcdC8qKlxcbjU3OTY6XFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdFxcbjU3OTc6XFx0ICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmdcXG41Nzk4OlxcdCAqIEB1c2VkX25vZGVfbWFzazogbm9kZW1hc2tfdCBvZiBhbHJlYWR5IHVzZWQgbm9kZXNcXG41Nzk5OlxcdCAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cXG41ODAwOlxcdCAqXFxuNTgwMTpcXHQgKiBXZSB1c2UgYSBudW1iZXIgb2YgZmFjdG9ycyB0byBkZXRlcm1pbmUgd2hpY2ggaXMgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZFxcbjU4MDI6XFx0ICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWRcXG41ODAzOlxcdCAqIGFscmVhZHkgaW4gQG5vZGUncyBmYWxsYmFjayBsaXN0LCBhbmQgaXQgc2hvdWxkIGJlIHRoZSBuZXh0IGNsb3Nlc3Qgbm9kZVxcbjU4MDQ6XFx0ICogYWNjb3JkaW5nIHRvIHRoZSBkaXN0YW5jZSBhcnJheSAod2hpY2ggY29udGFpbnMgYXJiaXRyYXJ5IGRpc3RhbmNlIHZhbHVlc1xcbjU4MDU6XFx0ICogZnJvbSBlYWNoIG5vZGUgdG8gZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0pLCBhbmQgc2hvdWxkIGFsc28gcHJlZmVyIG5vZGVzXFxuNTgwNjpcXHQgKiB3aXRoIG5vIENQVXMsIHNpbmNlIHByZXN1bWFibHkgdGhleSdsbCBoYXZlIHZlcnkgbGl0dGxlIGFsbG9jYXRpb24gcHJlc3N1cmVcXG41ODA3OlxcdCAqIG9uIHRoZW0gb3RoZXJ3aXNlLlxcbjU4MDg6XFx0ICpcXG41ODA5OlxcdCAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuXFxuNTgxMDpcXHQgKi9cXG41ODExOlxcdGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcXG41ODEyOlxcdFxcdFxcdFxcdCAgIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXFxuNTgxMzpcXHR7XFxuNTgxNDpcXHRcXHRpbnQgbiwgdmFsO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODowOC40MTc5MDE5ODlaIiwiU2VxIjo0MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTgwMTQxNTQyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIHRoZSBDb25kaXRpb25hbCBDb21waWxhdGlvbiBpbiBgbW0vcGFnZV9hbGxvYy5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYXJlIGNvbnRyb2xsaW5nIGxpbmUgNTc5MCBpbiBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBpcyBhIHByZXR0eSBjb21tb24gZGVidWdnaW5nIHN0ZXA7IHVuZGVyc3RhbmRpbmcgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNhbiBiZSBjcnVjaWFsLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIGp1c3QgZGl2ZSBpbnRvIHRoZSBmaWxlLiBJ4oCZbGwgc2VhcmNoIGJhY2t3YXJkcyBmcm9tIGxpbmUgNTc5MCwgbG9va2luZyBmb3IgdGhlIHJlbGV2YW50IGAjaWZgIG9yIGAjaWZkZWZgIHN0YXRlbWVudCB0aGF0IGVuY2xvc2VzIGl0LiBIb3BlZnVsbHksIGl0J3MgYSByZWxhdGl2ZWx5IHNob3J0IHNwYW4gdG8gaWRlbnRpZnkgdGhlIHJlbGV2YW50IGNvbmRpdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQwMzYsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjEwLjIxOTMyMDUxOVoiLCJTZXEiOjQyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTE0Mzk3MjgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXiNpZlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9wYWdlX2FsbG9jLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vcGFnZV9hbGxvYy5jPTk5PXN0YXRpYyBERUZJTkVfTVVURVgocGNwX2JhdGNoX2hpZ2hfbG9jayk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTA5LSAqL1xcbm1tL3BhZ2VfYWxsb2MuYzoxMTA6I2lmbmRlZiBDT05GSUdfUFJFRU1QVF9SVFxcbm1tL3BhZ2VfYWxsb2MuYy0xMTEtI2RlZmluZSBwY3B1X3Rhc2tfcGluKClcXHRcXHRwcmVlbXB0X2Rpc2FibGUoKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTEyMi0gKi9cXG5tbS9wYWdlX2FsbG9jLmM6MTIzOiNpZmRlZiBDT05GSUdfU01QXFxubW0vcGFnZV9hbGxvYy5jLTEyNC0jZGVmaW5lIHBjcF9zcGluX3RyeWxvY2socHRyKVxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xNjQtXFxubW0vcGFnZV9hbGxvYy5jOjE2NTojaWZkZWYgQ09ORklHX1VTRV9QRVJDUFVfTlVNQV9OT0RFX0lEXFxubW0vcGFnZV9hbGxvYy5jLTE2Ni1ERUZJTkVfUEVSX0NQVShpbnQsIG51bWFfbm9kZSk7XFxubW0vcGFnZV9hbGxvYy5jPTE2Nz1FWFBPUlRfUEVSX0NQVV9TWU1CT0wobnVtYV9ub2RlKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xNjktXFxubW0vcGFnZV9hbGxvYy5jOjE3MDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMTcxLURFRklORV9TVEFUSUNfS0VZX1RSVUUodm1fbnVtYV9zdGF0X2tleSk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTczLVxcbm1tL3BhZ2VfYWxsb2MuYzoxNzQ6I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcXG5tbS9wYWdlX2FsbG9jLmMtMTc1LS8qXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTg1PXN0YXRpYyBERUZJTkVfTVVURVgocGNwdV9kcmFpbl9tdXRleCk7XFxubW0vcGFnZV9hbGxvYy5jLTE4Ni1cXG5tbS9wYWdlX2FsbG9jLmM6MTg3OiNpZmRlZiBDT05GSUdfR0NDX1BMVUdJTl9MQVRFTlRfRU5UUk9QWVxcbm1tL3BhZ2VfYWxsb2MuYy0xODgtdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsYXRlbnRfZW50cm9weSBfX2xhdGVudF9lbnRyb3B5O1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTE5NT1ub2RlbWFza190IG5vZGVfc3RhdGVzW05SX05PREVfU1RBVEVTXSBfX3JlYWRfbW9zdGx5ID0ge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTE5Ny1cXHRbTl9PTkxJTkVdID0geyB7IFswXSA9IDFVTCB9IH0sXFxubW0vcGFnZV9hbGxvYy5jOjE5ODojaWZuZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTE5OS1cXHRbTl9OT1JNQUxfTUVNT1JZXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxcbm1tL3BhZ2VfYWxsb2MuYzoyMDA6I2lmZGVmIENPTkZJR19ISUdITUVNXFxubW0vcGFnZV9hbGxvYy5jLTIwMS1cXHRbTl9ISUdIX01FTU9SWV0gPSB7IHsgWzBdID0gMVVMIH0gfSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0yMDk9Z2ZwX3QgZ2ZwX2FsbG93ZWRfbWFzayBfX3JlYWRfbW9zdGx5ID0gR0ZQX0JPT1RfTUFTSztcXG5tbS9wYWdlX2FsbG9jLmMtMjEwLVxcbm1tL3BhZ2VfYWxsb2MuYzoyMTE6I2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV9WQVJJQUJMRVxcbm1tL3BhZ2VfYWxsb2MuYy0yMTItdW5zaWduZWQgaW50IHBhZ2VibG9ja19vcmRlciBfX3JlYWRfbW9zdGx5O1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTIzMT1zdGF0aWMgaW50IHN5c2N0bF9sb3dtZW1fcmVzZXJ2ZV9yYXRpb1tNQVhfTlJfWk9ORVNdID0ge1xcbm1tL3BhZ2VfYWxsb2MuYzoyMzI6I2lmZGVmIENPTkZJR19aT05FX0RNQVxcbm1tL3BhZ2VfYWxsb2MuYy0yMzMtXFx0W1pPTkVfRE1BXSA9IDI1NixcXG5tbS9wYWdlX2FsbG9jLmMtMjM0LSNlbmRpZlxcbm1tL3BhZ2VfYWxsb2MuYzoyMzU6I2lmZGVmIENPTkZJR19aT05FX0RNQTMyXFxubW0vcGFnZV9hbGxvYy5jLTIzNi1cXHRbWk9ORV9ETUEzMl0gPSAyNTYsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMjM4LVxcdFtaT05FX05PUk1BTF0gPSAzMixcXG5tbS9wYWdlX2FsbG9jLmM6MjM5OiNpZmRlZiBDT05GSUdfSElHSE1FTVxcbm1tL3BhZ2VfYWxsb2MuYy0yNDAtXFx0W1pPTkVfSElHSE1FTV0gPSAwLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTI0NT1jaGFyICogY29uc3Qgem9uZV9uYW1lc1tNQVhfTlJfWk9ORVNdID0ge1xcbm1tL3BhZ2VfYWxsb2MuYzoyNDY6I2lmZGVmIENPTkZJR19aT05FX0RNQVxcbm1tL3BhZ2VfYWxsb2MuYy0yNDctXFx0IFxcXCJETUFcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYy0yNDgtI2VuZGlmXFxubW0vcGFnZV9hbGxvYy5jOjI0OTojaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcXG5tbS9wYWdlX2FsbG9jLmMtMjUwLVxcdCBcXFwiRE1BMzJcXFwiLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTI1Mi1cXHQgXFxcIk5vcm1hbFxcXCIsXFxubW0vcGFnZV9hbGxvYy5jOjI1MzojaWZkZWYgQ09ORklHX0hJR0hNRU1cXG5tbS9wYWdlX2FsbG9jLmMtMjU0LVxcdCBcXFwiSGlnaE1lbVxcXCIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMjU2LVxcdCBcXFwiTW92YWJsZVxcXCIsXFxubW0vcGFnZV9hbGxvYy5jOjI1NzojaWZkZWYgQ09ORklHX1pPTkVfREVWSUNFXFxubW0vcGFnZV9hbGxvYy5jLTI1OC1cXHQgXFxcIkRldmljZVxcXCIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MjYyPWNvbnN0IGNoYXIgKiBjb25zdCBtaWdyYXRldHlwZV9uYW1lc1tNSUdSQVRFX1RZUEVTXSA9IHtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0yNjYtXFx0XFxcIkhpZ2hBdG9taWNcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYzoyNjc6I2lmZGVmIENPTkZJR19DTUFcXG5tbS9wYWdlX2FsbG9jLmMtMjY4LVxcdFxcXCJDTUFcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYy0yNjktI2VuZGlmXFxubW0vcGFnZV9hbGxvYy5jOjI3MDojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cXG5tbS9wYWdlX2FsbG9jLmMtMjcxLVxcdFxcXCJJc29sYXRlXFxcIixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0yODM9RVhQT1JUX1NZTUJPTChtb3ZhYmxlX3pvbmUpO1xcbm1tL3BhZ2VfYWxsb2MuYy0yODQtXFxubW0vcGFnZV9hbGxvYy5jOjI4NTojaWYgTUFYX05VTU5PREVTIFxcdTAwM2UgMVxcbm1tL3BhZ2VfYWxsb2MuYy0yODYtdW5zaWduZWQgaW50IG5yX25vZGVfaWRzIF9fcmVhZF9tb3N0bHkgPSBNQVhfTlVNTk9ERVM7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MzA1PWludCBwYWdlX2dyb3VwX2J5X21vYmlsaXR5X2Rpc2FibGVkIF9fcmVhZF9tb3N0bHk7XFxubW0vcGFnZV9hbGxvYy5jLTMwNi1cXG5tbS9wYWdlX2FsbG9jLmM6MzA3OiNpZmRlZiBDT05GSUdfREVGRVJSRURfU1RSVUNUX1BBR0VfSU5JVFxcbm1tL3BhZ2VfYWxsb2MuYy0zMDgtLypcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zMzQ9c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpnZXRfcGFnZWJsb2NrX2JpdG1hcChjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zMzYte1xcbm1tL3BhZ2VfYWxsb2MuYzozMzc6I2lmZGVmIENPTkZJR19TUEFSU0VNRU1cXG5tbS9wYWdlX2FsbG9jLmMtMzM4LVxcdHJldHVybiBzZWN0aW9uX3RvX3VzZW1hcChfX3Bmbl90b19zZWN0aW9uKHBmbikpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM0ND1zdGF0aWMgaW5saW5lIGludCBwZm5fdG9fYml0aWR4KGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbilcXG5tbS9wYWdlX2FsbG9jLmMtMzQ1LXtcXG5tbS9wYWdlX2FsbG9jLmM6MzQ2OiNpZmRlZiBDT05GSUdfU1BBUlNFTUVNXFxubW0vcGFnZV9hbGxvYy5jLTM0Ny1cXHRwZm4gXFx1MDAyNj0gKFBBR0VTX1BFUl9TRUNUSU9OLTEpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM2MD1nZXRfcGZuYmxvY2tfYml0bWFwX2JpdGlkeChjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwZm4sXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMzY1LVxcbm1tL3BhZ2VfYWxsb2MuYzozNjY6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXFxubW0vcGFnZV9hbGxvYy5jLTM2Ny1cXHRCVUlMRF9CVUdfT04oTlJfUEFHRUJMT0NLX0JJVFMgIT0gOCk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NDQyPWdldF9wZm5ibG9ja19taWdyYXRldHlwZShjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwZm4pXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNDQ4LVxcbm1tL3BhZ2VfYWxsb2MuYzo0NDk6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXFxubW0vcGFnZV9hbGxvYy5jLTQ1MC1cXHRpZiAoZmxhZ3MgXFx1MDAyNiBCSVQoUEJfbWlncmF0ZV9pc29sYXRlKSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01MjY9c3RhdGljIHZvaWQgc2V0X3BhZ2VibG9ja19taWdyYXRldHlwZShzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01MzItXFxubW0vcGFnZV9hbGxvYy5jOjUzMzojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cXG5tbS9wYWdlX2FsbG9jLmMtNTM0LVxcdGlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIHtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01NDg9dm9pZCBfX21lbWluaXQgaW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTU5LVxcbm1tL3BhZ2VfYWxsb2MuYzo1NjA6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXFxubW0vcGFnZV9hbGxvYy5jLTU2MS1cXHRpZiAobWlncmF0ZXR5cGUgPT0gTUlHUkFURV9JU09MQVRFKSB7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTczLVxcbm1tL3BhZ2VfYWxsb2MuYzo1NzQ6I2lmZGVmIENPTkZJR19ERUJVR19WTVxcbm1tL3BhZ2VfYWxsb2MuYy01NzUtc3RhdGljIGludCBwYWdlX291dHNpZGVfem9uZV9ib3VuZGFyaWVzKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02NjE9c3RhdGljIGlubGluZSBib29sIHBjcF9hbGxvd2VkX29yZGVyKHVuc2lnbmVkIGludCBvcmRlcilcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02NjQtXFx0XFx0cmV0dXJuIHRydWU7XFxubW0vcGFnZV9hbGxvYy5jOjY2NTojaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vcGFnZV9hbGxvYy5jLTY2Ni1cXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02OTY9c3RhdGljIGlubGluZSB2b2lkIHNldF9idWRkeV9vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTcwMS1cXG5tbS9wYWdlX2FsbG9jLmM6NzAyOiNpZmRlZiBDT05GSUdfQ09NUEFDVElPTlxcbm1tL3BhZ2VfYWxsb2MuYy03MDMtc3RhdGljIGlubGluZSBzdHJ1Y3QgY2FwdHVyZV9jb250cm9sICp0YXNrX2NhcGMoc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTAxNT1zdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9leHBlY3RlZF9zdGF0ZShzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xMDIyLVxcdFxcdFxcdHBhZ2VfcmVmX2NvdW50KHBhZ2UpIHxcXG5tbS9wYWdlX2FsbG9jLmM6MTAyMzojaWZkZWYgQ09ORklHX01FTUNHXFxubW0vcGFnZV9hbGxvYy5jLTEwMjQtXFx0XFx0XFx0cGFnZS1cXHUwMDNlbWVtY2dfZGF0YSB8XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTAzMz1zdGF0aWMgY29uc3QgY2hhciAqcGFnZV9iYWRfcmVhc29uKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGZsYWdzKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTEwNDgtXFx0fVxcbm1tL3BhZ2VfYWxsb2MuYzoxMDQ5OiNpZmRlZiBDT05GSUdfTUVNQ0dcXG5tbS9wYWdlX2FsbG9jLmMtMTA1MC1cXHRpZiAodW5saWtlbHkocGFnZS1cXHUwMDNlbWVtY2dfZGF0YSkpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTIwMj1zdGF0aWMgdm9pZCBjbGVhcl9oaWdocGFnZXNfa2FzYW5fdGFnZ2VkKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTIxNi1cXG5tbS9wYWdlX2FsbG9jLmM6MTIxNzojaWZkZWYgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdcXG5tbS9wYWdlX2FsbG9jLmMtMTIxOC1cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0xMjk4PXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBfX2ZyZWVfcGFnZXNfcHJlcGFyZShzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xMzU3LVxcdFxcdFxcdHBhZ2VbMV0uZmxhZ3MuZiBcXHUwMDI2PSB+UEFHRV9GTEFHU19TRUNPTkQ7XFxubW0vcGFnZV9hbGxvYy5jOjEzNTg6I2lmZGVmIE5SX1BBR0VTX0lOX0xBUkdFX0ZPTElPXFxubW0vcGFnZV9hbGxvYy5jLTEzNTktXFx0XFx0XFx0Zm9saW8tXFx1MDAzZV9ucl9wYWdlcyA9IDA7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTkxNT1zdGF0aWMgaW50IGZhbGxiYWNrc1tNSUdSQVRFX1BDUFRZUEVTXVtNSUdSQVRFX1BDUFRZUEVTIC0gMV0gPSB7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTkyMC1cXG5tbS9wYWdlX2FsbG9jLmM6MTkyMTojaWZkZWYgQ09ORklHX0NNQVxcbm1tL3BhZ2VfYWxsb2MuYy0xOTIyLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgc3RydWN0IHBhZ2UgKl9fcm1xdWV1ZV9jbWFfZmFsbGJhY2soc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MjAxOT1zdGF0aWMgaW50IG1vdmVfZnJlZXBhZ2VzX2Jsb2NrKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0yMDM0LVxcbm1tL3BhZ2VfYWxsb2MuYzoyMDM1OiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxcbm1tL3BhZ2VfYWxsb2MuYy0yMDM2LS8qIExvb2sgZm9yIGEgYnVkZHkgdGhhdCBzdHJhZGRsZXMgc3RhcnRfcGZuICovXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MjU1OD1ib29sIGRlY2F5X3BjcF9oaWdoKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGVyX2NwdV9wYWdlcyAqcGNwKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTI1OTAtXFxubW0vcGFnZV9hbGxvYy5jOjI1OTE6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTI1OTItLypcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zMTc5PXN0YXRpYyBpbmxpbmUgdm9pZCB6b25lX3N0YXRpc3RpY3Moc3RydWN0IHpvbmUgKnByZWZlcnJlZF96b25lLCBzdHJ1Y3Qgem9uZSAqeixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zMTgxLXtcXG5tbS9wYWdlX2FsbG9jLmM6MzE4MjojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMzE4My1cXHRlbnVtIG51bWFfc3RhdF9pdGVtIGxvY2FsX3N0YXQgPSBOVU1BX0xPQ0FMO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM1NTM9c3RhdGljIGlubGluZSBsb25nIF9fem9uZV93YXRlcm1hcmtfdW51c2FibGVfZnJlZShzdHJ1Y3Qgem9uZSAqeixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zNTY0LVxcbm1tL3BhZ2VfYWxsb2MuYzozNTY1OiNpZmRlZiBDT05GSUdfQ01BXFxubW0vcGFnZV9hbGxvYy5jLTM1NjYtXFx0LyogSWYgYWxsb2NhdGlvbiBjYW4ndCB1c2UgQ01BIGFyZWFzIGRvbid0IHVzZSBmcmVlIENNQSBwYWdlcyAqL1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM1ODA9Ym9vbCBfX3pvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyayxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zNjQzLVxcbm1tL3BhZ2VfYWxsb2MuYzozNjQ0OiNpZmRlZiBDT05GSUdfQ01BXFxubW0vcGFnZV9hbGxvYy5jLTM2NDUtXFx0XFx0aWYgKChhbGxvY19mbGFncyBcXHUwMDI2IEFMTE9DX0NNQSkgXFx1MDAyNlxcdTAwMjZcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zNjY1PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX3dhdGVybWFya19mYXN0KHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMzcwOS1cXG5tbS9wYWdlX2FsbG9jLmM6MzcxMDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMzcxMS1pbnQgX19yZWFkX21vc3RseSBub2RlX3JlY2xhaW1fZGlzdGFuY2UgPSBSRUNMQUlNX0RJU1RBTkNFO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM3MzQ9YWxsb2NfZmxhZ3Nfbm9mcmFnbWVudChzdHJ1Y3Qgem9uZSAqem9uZSwgZ2ZwX3QgZ2ZwX21hc2spXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMzc0NS1cXG5tbS9wYWdlX2FsbG9jLmM6Mzc0NjojaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcXG5tbS9wYWdlX2FsbG9jLmMtMzc0Ny1cXHRpZiAoIXpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9Mzc2OD1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhbGxvY19mbGFnc19jbWEoZ2ZwX3QgZ2ZwX21hc2spXFxubW0vcGFnZV9hbGxvYy5jLTM3Njkte1xcbm1tL3BhZ2VfYWxsb2MuYzozNzcwOiNpZmRlZiBDT05GSUdfQ01BXFxubW0vcGFnZV9hbGxvYy5jLTM3NzEtXFx0aWYgKGdmcF9taWdyYXRldHlwZShnZnBfbWFzaykgPT0gTUlHUkFURV9NT1ZBQkxFKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTQwMjY9X19hbGxvY19wYWdlc19tYXlfb29tKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNDExNy1cXG5tbS9wYWdlX2FsbG9jLmM6NDExODojaWZkZWYgQ09ORklHX0NPTVBBQ1RJT05cXG5tbS9wYWdlX2FsbG9jLmMtNDExOS0vKiBUcnkgbWVtb3J5IGNvbXBhY3Rpb24gZm9yIGhpZ2gtb3JkZXIgYWxsb2NhdGlvbnMgYmVmb3JlIHJlY2xhaW0gKi9cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz00MzA3PXNob3VsZF9jb21wYWN0X3JldHJ5KGdmcF90IGdmcF9tYXNrLCBzdHJ1Y3QgYWxsb2NfY29udGV4dCAqYWMsIGludCBvcmRlcixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy00MzM0LVxcbm1tL3BhZ2VfYWxsb2MuYzo0MzM1OiNpZmRlZiBDT05GSUdfTE9DS0RFUFxcbm1tL3BhZ2VfYWxsb2MuYy00MzM2LXN0YXRpYyBzdHJ1Y3QgbG9ja2RlcF9tYXAgX19mc19yZWNsYWltX21hcCA9XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NDM2NT12b2lkIGZzX3JlY2xhaW1fYWNxdWlyZShnZnBfdCBnZnBfbWFzaylcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy00MzcyLVxcbm1tL3BhZ2VfYWxsb2MuYzo0MzczOiNpZmRlZiBDT05GSUdfTU1VX05PVElGSUVSXFxubW0vcGFnZV9hbGxvYy5jLTQzNzQtXFx0XFx0bG9ja19tYXBfYWNxdWlyZShcXHUwMDI2X19tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydF9tYXApO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTUxNTQ9dW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTUxODktXFxubW0vcGFnZV9hbGxvYy5jOjUxOTA6I2lmZGVmIENPTkZJR19QQUdFX09XTkVSXFxubW0vcGFnZV9hbGxvYy5jLTUxOTEtXFx0LypcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01NzQ1PXN0YXRpYyBpbnQgYnVpbGRfem9uZXJlZnNfbm9kZShwZ19kYXRhX3QgKnBnZGF0LCBzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTc2Mi1cXG5tbS9wYWdlX2FsbG9jLmM6NTc2MzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNTc2NC1cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01OTEyPXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU5MTctXFxubW0vcGFnZV9hbGxvYy5jOjU5MTg6I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcXG5tbS9wYWdlX2FsbG9jLmMtNTkxOS0vKlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU5Nzc9c3RhdGljIHZvaWQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmRhdGEpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTk5Ni1cXG5tbS9wYWdlX2FsbG9jLmM6NTk5NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNTk5OC1cXHRtZW1zZXQobm9kZV9sb2FkLCAwLCBzaXplb2Yobm9kZV9sb2FkKSk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNjAxNy1cXG5tbS9wYWdlX2FsbG9jLmM6NjAxODojaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFU1xcbm1tL3BhZ2VfYWxsb2MuYy02MDE5LVxcdFxcdC8qXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjA2OT12b2lkIF9fcmVmIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MDk2LVxcdFxcdHZtX3RvdGFsX3BhZ2VzKTtcXG5tbS9wYWdlX2FsbG9jLmM6NjA5NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNjA5OC1cXHRwcl9pbmZvKFxcXCJQb2xpY3kgem9uZTogJXNcXFxcblxcXCIsIHpvbmVfbmFtZXNbcG9saWN5X3pvbmVdKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02MTAyPXN0YXRpYyBpbnQgem9uZV9iYXRjaHNpemUoc3RydWN0IHpvbmUgKnpvbmUpXFxubW0vcGFnZV9hbGxvYy5jLTYxMDMte1xcbm1tL3BhZ2VfYWxsb2MuYzo2MTA0OiNpZmRlZiBDT05GSUdfTU1VXFxubW0vcGFnZV9hbGxvYy5jLTYxMDUtXFx0aW50IGJhdGNoO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTYxNTA9c3RhdGljIGludCB6b25lX2hpZ2hzaXplKHN0cnVjdCB6b25lICp6b25lLCBpbnQgYmF0Y2gsIGludCBjcHVfb25saW5lLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYxNTIte1xcbm1tL3BhZ2VfYWxsb2MuYzo2MTUzOiNpZmRlZiBDT05GSUdfTU1VXFxubW0vcGFnZV9hbGxvYy5jLTYxNTQtXFx0aW50IGhpZ2g7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjM2MD12b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X3BhZ2VzZXQodm9pZClcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MzY4LVxcbm1tL3BhZ2VfYWxsb2MuYzo2MzY5OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy02MzcwLVxcdC8qXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjcyMz1pbnQgX19tZW1pbml0IGluaXRfcGVyX3pvbmVfd21hcmtfbWluKHZvaWQpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNjcyOS1cXG5tbS9wYWdlX2FsbG9jLmM6NjczMDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNjczMS1cXHRzZXR1cF9taW5fdW5tYXBwZWRfcmF0aW8oKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02NzYyPXN0YXRpYyBpbnQgd2F0ZXJtYXJrX3NjYWxlX2ZhY3Rvcl9zeXNjdGxfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTY3NzYtXFxubW0vcGFnZV9hbGxvYy5jOjY3Nzc6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTY3Nzgtc3RhdGljIHZvaWQgc2V0dXBfbWluX3VubWFwcGVkX3JhdGlvKHZvaWQpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjkxOD1zdGF0aWMgY29uc3Qgc3RydWN0IGN0bF90YWJsZSBwYWdlX2FsbG9jX3N5c2N0bF90YWJsZVtdID0ge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTY5NjgtXFx0fSxcXG5tbS9wYWdlX2FsbG9jLmM6Njk2OTojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNjk3MC1cXHR7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NzA5Nz12b2lkIF9fZnJlZV9jb250aWdfcmFuZ2UodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzEwMS1cXG5tbS9wYWdlX2FsbG9jLmM6NzEwMjojaWZkZWYgQ09ORklHX0NPTlRJR19BTExPQ1xcbm1tL3BhZ2VfYWxsb2MuYy03MTAzLS8qIFVzYWdlOiBTZWUgYWRtaW4tZ3VpZGUvZHluYW1pYy1kZWJ1Zy1ob3d0by5yc3QgKi9cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz03Njc0PXZvaWQgem9uZV9wY3BfcmVzZXQoc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzY5Mi1cXG5tbS9wYWdlX2FsbG9jLmM6NzY5MzojaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcXG5tbS9wYWdlX2FsbG9jLmMtNzY5NC0vKlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTc3NjY9RVhQT1JUX1NZTUJPTChpc19mcmVlX2J1ZGR5X3BhZ2UpO1xcbm1tL3BhZ2VfYWxsb2MuYy03NzY3LVxcbm1tL3BhZ2VfYWxsb2MuYzo3NzY4OiNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkVcXG5tbS9wYWdlX2FsbG9jLmMtNzc2OS1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9Nzg2MT1ib29sIGhhc19tYW5hZ2VkX3pvbmUoZW51bSB6b25lX3R5cGUgem9uZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy03ODcxLVxcbm1tL3BhZ2VfYWxsb2MuYzo3ODcyOiNpZmRlZiBDT05GSUdfVU5BQ0NFUFRFRF9NRU1PUllcXG5tbS9wYWdlX2FsbG9jLmMtNzg3My1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6MTAuMjcwNzY2NjU4WiIsIlNlcSI6NDMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM1MTQwNjAyNzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyBhIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uIEJsb2NrKipcblxuT2theSwgc28gbGluZSA1NzYzIG9mIHRoaXMgY29kZSBoYXMgYSBgI2lmZGVmIENPTkZJR19OVU1BYCBkaXJlY3RpdmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIlJpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2NvcGUgb2YgdGhhdCBjb25kaXRpb25hbCBjb21waWxhdGlvbi5cIiBJdCdzIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBOVU1BLWF3YXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdvcmtzIGluIHRoaXMgc3BlY2lmaWMgY29udGV4dC4gVGhlIGZpcnN0IHRoaW5nIEknbSBnb2luZyB0byBkbyBpcyBsb2NhdGUgd2hlcmUgdGhhdCBgI2lmZGVmYCBibG9jayB0ZXJtaW5hdGVzLiBHaXZlbiB0aGUgbGlrZWx5IHN0cnVjdHVyZSBvZiB0aGUgY29kZSwgSSdsbCBiZXQgaXQncyBub3QgZmFyIGZyb20gdGhlIGxpbmUuIE15IGZvY3VzIG5vdyBpcyBvbiBsaW5lcyA1OTMwLTU5NDUgd2l0aGluIGBtbS9wYWdlX2FsbG9jLmNgLCBJJ2xsIHN0YXJ0IHRoZXJlIGxvb2tpbmcgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGAjZW5kaWZgIHN0YXRlbWVudCBhbmQgYW55IGludGVydmVuaW5nIGNvZGUgdGhhdCdzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgdGhlIE5VTUEgY29uZmlnLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgKmluc2lkZSogdGhhdCBibG9jayB0byBnZXQgYSBmdWxsIHBpY3R1cmUgb2YgdGhlIGltcGFjdCBvZiB0aGUgTlVNQSBjb25maWd1cmF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTYyNSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjEzLjc4NDgzMTI0MVoiLCJTZXEiOjQ0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMTA1NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vcGFnZV9hbGxvYy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU5MzAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU5MzA6XFx0XFx0XFx0XFx0XFx0ICAgZ2ZwX3pvbmUoR0ZQX0tFUk5FTCksXFxuNTkzMTpcXHRcXHRcXHRcXHRcXHQgICBOVUxMKTtcXG41OTMyOlxcdFxcdHJldHVybiB6b25lbGlzdF9ub2RlX2lkeCh6KTtcXG41OTMzOlxcdH1cXG41OTM0OlxcdCNlbmRpZlxcbjU5MzU6XFx0XFxuNTkzNjpcXHRzdGF0aWMgdm9pZCBzZXR1cF9taW5fdW5tYXBwZWRfcmF0aW8odm9pZCk7XFxuNTkzNzpcXHRzdGF0aWMgdm9pZCBzZXR1cF9taW5fc2xhYl9yYXRpbyh2b2lkKTtcXG41OTM4OlxcdCNlbHNlXFx0LyogQ09ORklHX05VTUEgKi9cXG41OTM5OlxcdFxcbjU5NDA6XFx0c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxuNTk0MTpcXHR7XFxuNTk0MjpcXHRcXHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnM7XFxuNTk0MzpcXHRcXHRpbnQgbnJfem9uZXM7XFxuNTk0NDpcXHRcXG41OTQ1OlxcdFxcdHpvbmVyZWZzID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7XFxuNTk0NjpcXHRcXHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdkYXQsIHpvbmVyZWZzKTtcXG41OTQ3OlxcdFxcdHpvbmVyZWZzICs9IG5yX3pvbmVzO1xcbjU5NDg6XFx0XFxuNTk0OTpcXHRcXHR6b25lcmVmcy1cXHUwMDNlem9uZSA9IE5VTEw7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjEzLjc4NTE0NDAzMVoiLCJTZXEiOjQ1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3MjM5MzExNDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZvY3VzaW5nIG9uIE5VTUEgTWVtb3J5IE1hbmFnZW1lbnQgZm9yIEZ1enppbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoZSBjb2RlIGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9wYWdlX2FsbG9jLmNgIGxvb2tzIGludGVyZXN0aW5nLCBlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIGl0J3MgdW5kZXIgYCNpZmRlZiBDT05GSUdfTlVNQWAgYW5kIHNwZWNpZmljYWxseSwgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgcHJvdGVjdGVkIGJ5IGAjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OYCwgd2hpY2ggaW1wbGllcyBpdCdzIHJlbGV2YW50IHRvIE5VTUEgYW5kIG1lbW9yeSBtaWdyYXRpb24uIFNvLCBib3RoIGBDT05GSUdfTlVNQWAgYW5kIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGFyZSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuXG5cbk5vdywgaXMgdGhpcyBjb2RlIGV2ZW4gd29ydGggZnV6emluZz8gRGVmaW5pdGVseS4gVGhpcyBpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIHdpdGhpbiB0aGUgYG1tL2Agc3Vic3lzdGVtLiBJJ3ZlIGdvdCBjaGFuZ2VzIHRvIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBhbmQgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGluIGBtbS9wYWdlX2FsbG9jLmNgLCBhbmQgYG5leHRfZGVtb3Rpb25fbm9kZWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaW4gYG1tL21lbW9yeS10aWVycy5jYC4gQ3J1Y2lhbGx5LCB0aGlzIGNvZGUgaXMgcmVhY2hhYmxlIGluIGEgTlVNQS1lbmFibGVkIGtlcm5lbCBydW5uaW5nIGluIFFFTVUgYmVjYXVzZSBgYnVpbGRfbm9kZV96b25lbGlzdGAgKG9yIGBidWlsZF96b25lbGlzdHNgKSBpcyBleGVjdXRlZCBhdCBib290LCBkdXJpbmcgbWVtb3J5IGhvdHBsdWcgYW5kIHdoZW4gdHJpZ2dlcmVkIGJ5IG1lbW9yeSBwcmVzc3VyZSwgdGhlIGBuZXh0X2RlbW90aW9uX25vZGVgIHdpbGwgYmUgY2FsbGVkIGR1cmluZyBtZW1vcnkgcmVjbGFpbS4gRnVydGhlcm1vcmUsIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaXMgY2FsbGVkIGF0IGJvb3QgYW5kIG9uIGhvdHBsdWcgLyBzeXNmcyBtZW1vcnkgdGllciBvcGVyYXRpb25zLiBUaGlzIGRpcmVjdGx5IGltcGFjdHMgaG93IE5VTUEgem9uZWxpc3RzIGFyZSBidWlsdCBhbmQgaG93IHdlIHNlbGVjdCBub2RlcyBmb3IgZmFsbGJhY2sgYW5kIGRlbW90aW9uLCB3aGljaCBpcyBleGFjdGx5IHRoZSBraW5kIG9mIHJlZmFjdG9yaW5nIGFuZCBsb2dpYyBjaGFuZ2UgdGhlIGZ1enppbmcgZ3VpZGVsaW5lcyBoaWdobGlnaHQgYXMgYSBoaWdoLXZhbHVlIHRhcmdldC4gSXQncyBhIGNsZWFyICdXb3J0aEZ1enppbmc9dHJ1ZScuXG5cblNvLCBsZXQncyBnZXQgaW50byB0aGUgc3BlY2lmaWNzIG9mIEZvY3VzU3ltYm9scy4gSSdtIGZvbGxvd2luZyB0aGUgZ3VpZGVsaW5lcywgd2hpY2ggc2F5cyB0byBhdm9pZCB1YmlxdWl0b3VzIGhvdC1wYXRocyBhbmQgaW5zdGVhZCB0YXJnZXQgc3BlY2lmaWMgZmVhdHVyZSBsb2dpYyBhbmQgZW50cnlwb2ludHMuXG5cbkhlcmXigJlzIHRoZSBjdXJyZW50IHRoaW5raW5nOlxuXG4xLiAgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGluIGBtbS9wYWdlX2FsbG9jLmNgLiBUaGlzIGlzIG5vbi1zdGF0aWMgKGRlY2xhcmVkIGluIGBtbS9pbnRlcm5hbC5oYCBhbmQgZGVmaW5lZCBpbiBgbW0vcGFnZV9hbGxvYy5jYCkgYW5kIGlzIG9ubHkgY2FsbGVkIHdoZW4gYnVpbGRpbmcgem9uZWxpc3RzIG9yIGZpbmRpbmcgZGVtb3Rpb24gdGFyZ2V0cywgc28gaXQncyBub3QgdWJpcXVpdG91cy4gRGVmaW5pdGVseSBhIGNvbnRlbmRlci5cblxuMi4gIGBidWlsZF9ub2RlX3pvbmVsaXN0YCBpbiBgbW0vcGFnZV9hbGxvYy5jYCBpcyBzdGF0aWMsIHdoaWNoIG1pZ2h0IG1ha2UgaXQgaW5saW5lZCwgc28gcG90ZW50aWFsbHkgdXNlbGVzcyBhcyBhIGZ1enppbmcgc3ltYm9sLiBCdXQsIGl0J3MgY2FsbGVkIGJ5IGBidWlsZF96b25lbGlzdHNgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBfX2J1aWxkX2FsbF96b25lbGlzdHNgLCB3aGljaCBpcyAqYWxzbyogY2FsbGVkIG9uIGJvb3QgYW5kIGhvdHBsdWcsIHNvIHRoaXMgKmNvdWxkKiBiZSBnb29kLiBMZXQncyBjaGVjayBpZiB0aGUgZGVmaW5pdGlvbiBpcyBpbmxpbmVkLi4uIE9oLCBJIHNlZSEgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGlzICpub3QqIHN0YXRpYywgc28gaXQgKmlzKiBhbiBhY3R1YWwgc3ltYm9sLiBHb29kLCBnb29kLlxuXG4zLiAgYG5leHRfZGVtb3Rpb25fbm9kZWAgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBub24tc3RhdGljLiBBZ2Fpbiwgbm90IHViaXF1aXRvdXMsIG9ubHkgdXNlZCBpbiBgZGVtb3RlX2ZvbGlvX2xpc3RgLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gVGhpcyBpcyBhIHNvbGlkIGNhbmRpZGF0ZS5cblxuNC4gIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBzdGF0aWMuIEkgbmVlZCB0byBmaW5kIHRoZSBub24tc3RhdGljIGZ1bmN0aW9ucyB0aGF0IGNhbGwgaXQgb3IgYXJlIGVudHJ5cG9pbnRzIHRvIGl0cyBmdW5jdGlvbmFsaXR5LiBMb29raW5nIGF0IHRoZSBjYWxsZXJzLCBJIGhhdmUgYG1lbW9yeV90aWVyX2xhdGVfaW5pdGAgYW5kIGBtZW10aWVyX2hvdHBsdWdfY2FsbGJhY2tgIGFzIGNhbmRpZGF0ZXMuIEkgc2hvdWxkIGFsc28gY2hlY2sgd2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXRzZWxmLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDIxMCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyMzcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODoyMS4wMjQ0NTgyODJaIiwiU2VxIjo0NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU4MDA3MTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS10aWVycy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS10aWVycy5jPTQwMD1zdGF0aWMgdm9pZCBkdW1wX2RlbW90aW9uX3RhcmdldHModm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTQyNC0gKi9cXG5tbS9tZW1vcnktdGllcnMuYzo0MjU6c3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcXG5tbS9tZW1vcnktdGllcnMuYy00MjYte1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNTIxLSNlbHNlXFxubW0vbWVtb3J5LXRpZXJzLmM6NTIyOnN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxcbm1tL21lbW9yeS10aWVycy5jLTUyMy0jZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz03MDg9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfbGF0ZV9pbml0KHZvaWQpXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy03MzEtXFxubW0vbWVtb3J5LXRpZXJzLmM6NzMyOlxcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XFxubW0vbWVtb3J5LXRpZXJzLmMtNzMzLVxcdHB1dF9vbmxpbmVfbWVtcygpO1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9ODgyPXN0YXRpYyBpbnQgX19tZW1pbml0IG1lbXRpZXJfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy04OTEtXFx0XFx0aWYgKGNsZWFyX25vZGVfbWVtb3J5X3RpZXIobm4tXFx1MDAzZW5pZCkpXFxubW0vbWVtb3J5LXRpZXJzLmM6ODkyOlxcdFxcdFxcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XFxubW0vbWVtb3J5LXRpZXJzLmMtODkzLVxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy04OTgtXFx0XFx0aWYgKCFJU19FUlIobWVtdGllcikpXFxubW0vbWVtb3J5LXRpZXJzLmM6ODk5OlxcdFxcdFxcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XFxubW0vbWVtb3J5LXRpZXJzLmMtOTAwLVxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjIxLjA4MjQ3MTY3MVoiLCJTZXEiOjQ3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo2OTEzODM3MzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBDb2RlIENoYW5nZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGxvb2tzIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHpvbmVsaXN0IHJlYnVpbGRpbmcsIHdoaWNoIGlzIGEgZ29vZCBwbGFjZSB0byBzdGFydC4gIFRoZSByZWFsIHdvcmsgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIGluIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCwgYW5kIHRoZSBub24tc3RhdGljIGZ1bmN0aW9uIGBuZXh0X2RlbW90aW9uX25vZGVgIHVzZWQgZHVyaW5nIGRlbW90aW9uLiAgSSBzZWUgYSBzdGF0aWMgZnVuY3Rpb24sIGBkZW1vdGVfZm9saW9fbGlzdGAsIGFzIHdlbGwgYnV0IHRoYXQgbWF5IGJlIGxlc3MgcmVsZXZhbnQgaGVyZS4gIGBidWlsZF9hbGxfem9uZWxpc3RzYCBpcyBhbHNvIG5vbi1zdGF0aWMsIHNvIHRob3NlIGFyZSBteSBrZXkgdGFyZ2V0cy5cblxuSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGJyb2FkbHkgdGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkLiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgaXMgaW52b2x2ZWQgaW4gem9uZWxpc3QgY29uc3RydWN0aW9uLCBkZW1vdGlvbiwgYW5kIGZpbmRpbmcgdGhlIGJlc3Qgbm9kZSwgc28gcG90ZW50aWFsbHkgaW1wb3J0YW50LiAgYG5leHRfZGVtb3Rpb25fbm9kZWAgYXBwZWFycyBsaW1pdGVkIHRvIGZvbGlvIGRlbW90aW9uLCBhbmQgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGtpY2tzIGluIGR1cmluZyBib290LCBtZW1vcnkgaG90cGx1Zy9vZmZsaW5pbmcsIGFuZCB6b25lbGlzdCByZWJ1aWxkcyDigJMgbm90IGV4YWN0bHkgKnViaXF1aXRvdXMqLCBidXQgZGVmaW5pdGVseSBjcml0aWNhbCBzeXN0ZW0gZXZlbnRzLlxuXG5Ob3csIGxldCdzIGxvb2sgYXQgdGhlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiAgSSdtIHNlZWluZyBgTlVNQWAgYXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBpbXBsZW1lbnRhdGlvbiBhbmQgY29tcGlsaW5nIGBtbS9tZW1vcnktdGllcnMuY2AuICBgTlVNQV9NSUdSQVRJT05gIHJlcXVpcmVzIGBOVU1BYCBhbmQgYE1NVWAgKHdoaWNoIGlzIHByZXR0eSBtdWNoIHN0YW5kYXJkIG9uIGFtZDY0KSwgc3BlY2lmaWNhbGx5IGZvciBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiAgU28sIGBOVU1BYCBhbmQgYE5VTUFfTUlHUkFUSU9OYCBhcmUga2V5IGNvbmZpZyBvcHRpb25zLlxuXG5EcmlsbGluZyBpbnRvIHRoZSBjb2RlLCBgbW0vcGFnZV9hbGxvYy5jYCBzaG93cyB0aGF0IGBub2RlX2xvYWRgLCBgYnVpbGRfbm9kZV96b25lbGlzdGAsIGFuZCBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgYXJlIGFsbCBndWFyZGVkIGJ5IGAjaWZkZWYgQ09ORklHX05VTUFgLiBgbW0vbWVtb3J5LXRpZXJzLmNgIGlzIGNvbXBpbGVkIHVuZGVyIGBvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9gLiAgV2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AsIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGFyZSBwcm90ZWN0ZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gLiAgSSd2ZSBjaGVja2VkIHRoZSBgTWFrZWZpbGVgIGFuZCBgbWVtb3J5LXRpZXJzLmhgIHRvIGNvbmZpcm0gdGhlIGRlcGVuZGVuY2llcy5cblxuSW4gc3VtbWFyeTpcbiogICBUaGUgcGF0Y2ggcmVmYWN0b3JzIGBmaW5kX25leHRfYmVzdF9ub2RlYCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgd2l0aCBhIGNhbmRpZGF0ZSBub2RlbWFzay5cbiogICBJdCB1cGRhdGVzIE5VTUEgZmFsbGJhY2sgem9uZWxpc3QgY29uc3RydWN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgIHdoaWNoIHN0cmVhbWxpbmVzIHpvbmVsaXN0IGdlbmVyYXRpb24gZGlyZWN0bHkgaW50byB0aGUgbm9kZSB6b25lbGlzdCBidWZmZXIuXG4qICAgSXQgbW9kaWZpZXMgZGVtb3Rpb24gbm9kZSBzZWxlY3Rpb24gaW4gYG1tL21lbW9yeS10aWVycy5jYCB0byB1c2UgdGhlIHJlZmFjdG9yZWQgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gXG4qICAgVGhlIGNvZGUgdG91Y2hlcyBmdW5kYW1lbnRhbCBNTSBsb2dpYywgc3BlY2lmaWNhbGx5IE5VTUEgem9uZWxpc3QgY29uc3RydWN0aW9uIGFuZCBtZW1vcnkgdGllcmluZyAoaW5jbHVkaW5nIGRlbW90aW9uIHRhcmdldCBjYWxjdWxhdGlvbnMpIHRyaWdnZXJlZCBkdXJpbmcgYm9vdCwgbWVtb3J5IGhvdHBsdWcvb2ZmbGluZSwgYW5kIG1lbW9yeSByZWNsYWltIGlmIE5VTUEgZGVtb3Rpb24gaXMgZW5hYmxlZC5cblxuVGhlcmVmb3JlLCB0aGlzIGlzIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBmdXp6aW5nLiBUaGUga2V5IGZ1bmN0aW9ucyB0byB0YXJnZXQgYXJlIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCwgYG5leHRfZGVtb3Rpb25fbm9kZWAsIGFuZCBgYnVpbGRfYWxsX3pvbmVsaXN0c2AsIGFuZCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIEkgbmVlZCB0byBlbmFibGUgYXJlIGBOVU1BYCBhbmQgYE5VTUFfTUlHUkFUSU9OYC4gIEknbSBjb21mb3J0YWJsZSB3aXRoIHRoZSBhbmFseXNpcywgc28gbGV0J3Mgc2V0IHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMjY4MCwiT3V0cHV0VG9rZW5zIjoxOTcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6MjcuOTk2MzExODI4WiIsIlNlcSI6NDgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzMwODE5MDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5VTUFcIixcbiAgICBcIk5VTUFfTUlHUkFUSU9OXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZmluZF9uZXh0X2Jlc3Rfbm9kZV9pblwiLFxuICAgIFwibmV4dF9kZW1vdGlvbl9ub2RlXCIsXG4gICAgXCJidWlsZF9hbGxfem9uZWxpc3RzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGZpbmRfbmV4dF9iZXN0X25vZGUoKSBpbnRvIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKSwgYWxsb3dpbmcgY2FsbGVycyB0byBzcGVjaWZ5IGVsaWdpYmxlIGNhbmRpZGF0ZSBub2RlcyB2aWEgYSBub2RlbWFzay4gSXQgYWxzbyByZXN0cnVjdHVyZXMgem9uZWxpc3QgYnVpbGRpbmcgaW4gbW0vcGFnZV9hbGxvYy5jIChidWlsZF9ub2RlX3pvbmVsaXN0KSBhbmQgdXBkYXRlcyBkZW1vdGlvbiB0YXJnZXQgcmVzb2x1dGlvbiBpbiBtbS9tZW1vcnktdGllcnMuYyAobmV4dF9kZW1vdGlvbl9ub2RlIGFuZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cykuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyByZWFjaGFibGUgZHVyaW5nIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiAoZS5nLiBib290IGFuZCBtZW1vcnkgaG90cGx1Zy9yZWJ1aWxkKSBhbmQgZm9saW8gZGVtb3Rpb24gZHVyaW5nIG1lbW9yeSByZWNsYW1hdGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOVU1BXCIsXG4gICAgXCJOVU1BX01JR1JBVElPTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImZpbmRfbmV4dF9iZXN0X25vZGVfaW5cIixcbiAgICBcIm5leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwiYnVpbGRfYWxsX3pvbmVsaXN0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjI4LjA2OTQwMjUxN1oiLCJTZXEiOjQ5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzU0MTMwMDg0MTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODoyOC4wNjk4OTk0MjZaIiwiU2VxIjo1MCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozNTQxMjUwNjEwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cXG5cXG4tIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZSAobm8gaW5mby1sZWFrcykuXFxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxcbi0gQWxsIHZhcmlhYmxlcyAoc3VjaCBhcyBgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkVgKSBhbmQgem9uZXJlZiB0ZXJtaW5hdGlvbnMgKGB6b25lcmVmcy1cXHUwMDNlem9uZSA9IE5VTExgLCBgem9uZXJlZnMtXFx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cXG4tIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB6b25lbGlzdCBpbmRleGluZyBvciB0cmF2ZXJzYWwgd291bGQgYmUgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBwb2ludGVyIGVycm9ycywgd2hpY2ggYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIEtNU0FOIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGRldGVjdGlvbiBpcyBub3QgYXBwbGljYWJsZS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgMTIgMDM6Mzc6MDIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggZGExNGM1NmZiMjRlMS4uMTUxOWRkMjFhOTAwZiAxMDA2NDRcbi0tLSBhL21tL2ludGVybmFsLmhcbisrKyBiL21tL2ludGVybmFsLmhcbkBAIC0xMTMzLDcgKzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xuIFxuIGV4dGVybiB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIFx0XHRcdFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcbi1leHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKTtcbitpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4rXHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpO1xuICNlbHNlXG4gI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwXG4gXG5AQCAtMTE0Miw3ICsxMTQzLDggQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIHtcbiBcdHJldHVybiAwO1xuIH1cbi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbitzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcbitcdFx0Y29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcbiB7XG4gXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuIH1cbmRpZmYgLS1naXQgYS9tbS9tZW1vcnktdGllcnMuYyBiL21tL21lbW9yeS10aWVycy5jXG5pbmRleCA1NDg1MWQ4YTE5NWIwLi4yNWUxMjE4NTFiNTg2IDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmNcbisrKyBiL21tL21lbW9yeS10aWVycy5jXG5AQCAtMzcwLDcgKzM3MCw3IEBAIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbiBcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxuIFx0ICovXG4gXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xuLVx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXHUwMDI2bWFzayk7XG4rXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcdTAwMjZtYXNrLCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG5AQCAtNDUwLDcgKzQ1MCw3IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4gXHRcdG1lbXRpZXIgPSBsaXN0X25leHRfZW50cnkobWVtdGllciwgbGlzdCk7XG4gXHRcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcbiBcdFx0Lypcbi1cdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZSwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cbitcdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cbiBcdFx0ICogQWRkIGFsbCBtZW1vcnkgbm9kZXMgZXhjZXB0IHRoZSBzZWxlY3RlZCBtZW1vcnkgdGllclxuIFx0XHQgKiBub2RlbGlzdCB0byBza2lwIGxpc3Qgc28gdGhhdCB3ZSBmaW5kIHRoZSBiZXN0IG5vZGUgZnJvbSB0aGVcbiBcdFx0ICogbWVtdGllciBub2RlbGlzdC5cbkBAIC00NjMsNyArNDYzLDggQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdFx0ICogaW4gdGhlIHByZWZlcnJlZCBtYXNrIHdoZW4gYWxsb2NhdGluZyBwYWdlcyBkdXJpbmcgZGVtb3Rpb24uXG4gXHRcdCAqL1xuIFx0XHRkbyB7XG4tXHRcdFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCBcdTAwMjZ0aWVyX25vZGVzKTtcbitcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4rXHRcdFx0XHRcdFx0XHRcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuIFx0XHRcdGlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKVxuIFx0XHRcdFx0YnJlYWs7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jXG5pbmRleCAxY2ZiZDA1ODJhMTBhLi5kMTg4OGQ1NjMwZTBhIDEwMDY0NFxuLS0tIGEvbW0vcGFnZV9hbGxvYy5jXG4rKysgYi9tbS9wYWdlX2FsbG9jLmNcbkBAIC01NzkzLDkgKzU3OTMsMTAgQEAgc3RhdGljIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcbiBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdO1xuIFxuIC8qKlxuLSAqIGZpbmRfbmV4dF9iZXN0X25vZGUgLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3RcbisgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0XG4gICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmdcbiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzXG4rICogQGNhbmRpZGF0ZXM6IG5vZGVtYXNrX3Qgb2Ygbm9kZXMgZWxpZ2libGUgZm9yIHNlbGVjdGlvblxuICAqXG4gICogV2UgdXNlIGEgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGlzIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGRcbiAgKiBhcHBlYXIgb24gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdC4gIFRoZSBub2RlIHNob3VsZCBub3QgaGF2ZSBhcHBlYXJlZFxuQEAgLTU4MDcsNyArNTgwOCw4IEBAIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4gICpcbiAgKiBSZXR1cm46IG5vZGUgaWQgb2YgdGhlIGZvdW5kIG5vZGUgb3IgJU5VTUFfTk9fTk9ERSBpZiBubyBub2RlIGlzIGZvdW5kLlxuICAqL1xuLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbitpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4rXHRcdFx0ICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcbiB7XG4gXHRpbnQgbiwgdmFsO1xuIFx0aW50IG1pbl92YWwgPSBJTlRfTUFYO1xuQEAgLTU4MTcsMTIgKzU4MTksMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuIFx0ICogVXNlIHRoZSBsb2NhbCBub2RlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYnV0IGZvciBtZW1vcnlsZXNzIGxvY2FsXG4gXHQgKiBub2RlLCB3ZSBzaG91bGQgc2tpcCBpdCBhbmQgZmFsbCBiYWNrIHRvIG90aGVyIG5vZGVzLlxuIFx0ICovXG4tXHRpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSBcdTAwMjZcdTAwMjYgbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkpIHtcbitcdGlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spIFx1MDAyNlx1MDAyNiBub2RlX2lzc2V0KG5vZGUsICpjYW5kaWRhdGVzKSkge1xuIFx0XHRub2RlX3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spO1xuIFx0XHRyZXR1cm4gbm9kZTtcbiBcdH1cbiBcbi1cdGZvcl9lYWNoX25vZGVfc3RhdGUobiwgTl9NRU1PUlkpIHtcbitcdGZvcl9lYWNoX25vZGVfbWFzayhuLCAqY2FuZGlkYXRlcykge1xuIFxuIFx0XHQvKiBEb24ndCB3YW50IGEgbm9kZSB0byBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKi9cbiBcdFx0aWYgKG5vZGVfaXNzZXQobiwgKnVzZWRfbm9kZV9tYXNrKSlcbkBAIC01ODU1LDMxICs1ODU3LDYgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuIH1cbiBcbiBcbi0vKlxuLSAqIEJ1aWxkIHpvbmVsaXN0cyBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLlxuLSAqIFRoaXMgcmVzdWx0cyBpbiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbFxuLSAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxuLSAqL1xuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnX2RhdGFfdCAqcGdkYXQsIGludCAqbm9kZV9vcmRlcixcbi1cdFx0dW5zaWduZWQgbnJfbm9kZXMpXG4te1xuLVx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzO1xuLVx0aW50IGk7XG4tXG4tXHR6b25lcmVmcyA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9ub2RlczsgaSsrKSB7XG4tXHRcdGludCBucl96b25lcztcbi1cbi1cdFx0cGdfZGF0YV90ICpub2RlID0gTk9ERV9EQVRBKG5vZGVfb3JkZXJbaV0pO1xuLVxuLVx0XHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUobm9kZSwgem9uZXJlZnMpO1xuLVx0XHR6b25lcmVmcyArPSBucl96b25lcztcbi1cdH1cbi1cdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuLVx0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuLX1cbi1cbiAvKlxuICAqIEJ1aWxkIF9fR0ZQX1RISVNOT0RFIHpvbmVsaXN0c1xuICAqL1xuQEAgLTU4OTUsMTkgKzU4NzIsMjQgQEAgc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4gXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuKy8qXG4rICogQnVpbGQgb25lIHpvbmVsaXN0IG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuIFRoaXMgcmVzdWx0cyBpblxuKyAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxuKyAqIHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuXG4rICovXG4rc3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuK1x0XHRcdFx0aW50IHpsaWR4KVxuIHtcbi1cdHN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdO1xuLVx0aW50IG5vZGUsIG5yX25vZGVzID0gMDtcbitcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZWxpc3RzW3psaWR4XS5fem9uZXJlZnM7XG4gXHRub2RlbWFza190IHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FO1xuLVx0aW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTtcbitcdGludCBsb2NhbF9ub2RlID0gcGdkYXQtXHUwMDNlbm9kZV9pZDtcbitcdGludCBwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xuK1x0aW50IG5vZGU7XG4gXG4tXHQvKiBOVU1BLWF3YXJlIG9yZGVyaW5nIG9mIG5vZGVzICovXG4tXHRsb2NhbF9ub2RlID0gcGdkYXQtXHUwMDNlbm9kZV9pZDtcbi1cdHByZXZfbm9kZSA9IGxvY2FsX25vZGU7XG4rXHRwcl9pbmZvKFwiRmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6IFwiLCBsb2NhbF9ub2RlKTtcbiBcbi1cdG1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpO1xuLVx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShsb2NhbF9ub2RlLCBcdTAwMjZ1c2VkX21hc2spKSBcdTAwM2U9IDApIHtcbitcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrLFxuK1x0XHRcdFx0XHQgICAgICBjYW5kaWRhdGVzKSkgXHUwMDNlPSAwKSB7XG4gXHRcdC8qXG4gXHRcdCAqIFdlIGRvbid0IHdhbnQgdG8gcHJlc3N1cmUgYSBwYXJ0aWN1bGFyIG5vZGUuXG4gXHRcdCAqIFNvIGFkZGluZyBwZW5hbHR5IHRvIHRoZSBmaXJzdCBub2RlIGluIHNhbWVcbkBAIC01OTE3LDE4ICs1ODk5LDIyIEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuIFx0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKVxuIFx0XHRcdG5vZGVfbG9hZFtub2RlXSArPSAxO1xuIFxuLVx0XHRub2RlX29yZGVyW25yX25vZGVzKytdID0gbm9kZTtcbitcdFx0em9uZXJlZnMgKz0gYnVpbGRfem9uZXJlZnNfbm9kZShOT0RFX0RBVEEobm9kZSksIHpvbmVyZWZzKTtcbitcdFx0cHJfY29udChcIiVkIFwiLCBub2RlKTtcbiBcdFx0cHJldl9ub2RlID0gbm9kZTtcbiBcdH1cbiBcbi1cdGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnZGF0LCBub2RlX29yZGVyLCBucl9ub2Rlcyk7XG4tXHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xuLVx0cHJfaW5mbyhcIkZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcIiwgbG9jYWxfbm9kZSk7XG4tXHRmb3IgKG5vZGUgPSAwOyBub2RlIFx1MDAzYyBucl9ub2Rlczsgbm9kZSsrKVxuLVx0XHRwcl9jb250KFwiJWQgXCIsIG5vZGVfb3JkZXJbbm9kZV0pO1xuK1x0em9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTEw7XG4rXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4gXHRwcl9jb250KFwiXFxuXCIpO1xuIH1cbiBcbitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbit7XG4rXHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTtcbitcdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XG4rfVxuK1xuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG4gLypcbiAgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFwibG9jYWxcIiBhbGxvY2F0aW9ucy5cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjI4LjA2OTkwMDk0NloiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNDM3MzAwOTc2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoIGFuZCBmaWd1cmUgb3V0IGlmIGl0IHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNoYW5nZXMgZmlyc3QsIHRoZW4gYXNzZXNzIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IHJpc2tzLlxuXG5TbywgaGVyZSdzIHdoYXQgSSBzZWU6IHRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgdGhlIGBmaW5kX25leHRfYmVzdF9ub2RlYCBmdW5jdGlvbi4gSXQncyBiZWVuIHJlbmFtZWQgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGFuZCBhIGBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzYCBwYXJhbWV0ZXIgaGFzIGJlZW4gYWRkZWQuIFRoZSBjaGFuZ2VzIHNlZW0gdG8gYmUgcHJvcGFnYXRpbmcgdGhpcyBuZXcgZnVuY3Rpb24gc2lnbmF0dXJlIHRocm91Z2hvdXQgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuXG5cblNwZWNpZmljYWxseSwgSSBzZWUgdGhpcyBmdW5jdGlvbiBub3cgYmVpbmcgdXNlZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLCBpbiBib3RoIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLiBUaGUgY3J1Y2lhbCBwYXJ0IGhlcmUgaXMgaG93IHRoZXNlIGBjYW5kaWRhdGVzYCBtYXNrcyBhcmUgYmVpbmcgdXNlZDsgaXQncyBsaWtlbHkgd2hlcmUgYW55IHBvdGVudGlhbCBpc3N1ZXMgbWlnaHQgaGlkZS5cblxuRnVydGhlciBkb3duIHRoZSByYWJiaXQgaG9sZSwgYG1tL3BhZ2VfYWxsb2MuY2AgY29udGFpbnMgdGhlIG1lYXQgb2YgdGhlIGltcGxlbWVudGF0aW9uLiBUaGUga2V5IGNoYW5nZSBoZXJlIGlzIGhvdyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgbm93IHVzZXMgYG5vZGVfaXNzZXRgIGFuZCBgZm9yX2VhY2hfbm9kZV9tYXNrYCB3aXRoIHRoZSBwcm92aWRlZCBgY2FuZGlkYXRlc2AgbWFzayBpbnN0ZWFkIG9mIHRoZSBvbGQgYE5fTUVNT1JZYCBub2RlIHN0YXRlLiBUaGUgY2hhbmdlcyBpbiBgYnVpbGRfem9uZWxpc3RzYCBzZWVtIHNpZ25pZmljYW50IGFzIHdlbGwuIEl0IGxvb2tzIGxpa2UgdGhleSd2ZSByZWZhY3RvcmVkIHRoZSBvbGQgbm9kZSBvcmRlcmluZyBsb2dpYyB0byBkaXJlY3RseSBidWlsZCB6b25lbGlzdHMgYmFzZWQgb24gdGhlIGBjYW5kaWRhdGVzYCBtYXNrIHdpdGhpbiBhIG5ldyBgYnVpbGRfbm9kZV96b25lbGlzdGAgZnVuY3Rpb24uIEluc3RlYWQgb2YgY2FsbGluZyBvdXQgdG8gYSBmdW5jdGlvbiB0byBidWlsZCB0aGUgem9uZSBsaXN0IHVzaW5nIG5vZGUgb3JkZXIsIHRoZSBuZXcgYXBwcm9hY2ggc2VlbXMgdG8gYmUgYnVpbGRpbmcgaXQgaW4gdGhlIGxvb3AgaXRzZWxmLlxuXG5Ob3csIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzOiB1bmluaXRpYWxpemVkIG1lbW9yeS4gTGV0J3Mgc3RhcnQgd2l0aCB0aGUgYmFzaWNzOyBhcmUgdGhlcmUgYW55IG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9ucyB0aGF0IGFyZW4ndCBpbml0aWFsaXplZD8gYG5vZGVtYXNrX3QgdXNlZF9tYXNrYCBsb29rcyBpbml0aWFsaXplZCwgYW5kIGB6b25lcmVmc2AgaXMgcG9pbnRpbmcgdG8gYW4gZXhpc3RpbmcgYXJyYXkgaW4gYHBnZGF0YCwgd2hpY2ggZ2V0cyB0ZXJtaW5hdGVkIHdpdGggYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMOyB6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7YC4gT2theSwgdGhhdCBsb29rcyBzYWZlLiBOb3RoaW5nIGlzIGJlaW5nIGNvcGllZCB0byB1c2Vyc3BhY2UsIHNvIHRoYXQncyBvbmUgbGVzcyBjb25jZXJuLlxuXG5UaGUgbW9zdCBwcm9iYWJsZSBhcmVhIG9mIGNvbmNlcm4gaXMgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4gYGNhbmRpZGF0ZXNgIGlzIHRoZSBjcnVjaWFsIHBvaW50ZXIgaGVyZSwgcG90ZW50aWFsbHkuIEl0J3MgcG9pbnRlZCB0byBlaXRoZXIgYG5vZGVfc3RhdGVzW05fTUVNT1JZXWAgb3IgYFx1MDAyNm1hc2tgIC8gYFx1MDAyNnRpZXJfbm9kZXNgLiBTbywgSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBpbml0aWFsaXphdGlvbiBvZiBgbWFza2AgYW5kIGB0aWVyX25vZGVzYCBpbiBgbWVtb3J5LXRpZXJzLmNgIGFyb3VuZCBsaW5lcyAzNzAgYW5kIDQ1MC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBtYXNrcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZXkncmUgcGFzc2VkIHRvIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDUyMCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjUyLjQ0MjkxNDMyOVoiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4Nzk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnktdGllcnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNjAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNjA6XFx0XFx0ICogbGFzdCB0YXJnZXQgbm9kZS4gT3IgaW50cm9kdWNpbmcgcGVyLWNwdSBkYXRhIHRvIGF2b2lkXFxuIDM2MTpcXHRcXHQgKiBjYWNoaW5nIGlzc3VlLCB3aGljaCBzZWVtcyBtb3JlIGNvbXBsaWNhdGVkLiBTbyBzZWxlY3RpbmdcXG4gMzYyOlxcdFxcdCAqIHRhcmdldCBub2RlIHJhbmRvbWx5IHNlZW1zIGJldHRlciB1bnRpbCBub3cuXFxuIDM2MzpcXHRcXHQgKi9cXG4gMzY0OlxcdFxcdGlmICghbm9kZXNfZW1wdHkobWFzaykpXFxuIDM2NTpcXHRcXHRcXHRyZXR1cm4gbm9kZV9yYW5kb20oXFx1MDAyNm1hc2spO1xcbiAzNjY6XFx0XFxuIDM2NzpcXHRcXHQvKlxcbiAzNjg6XFx0XFx0ICogUHJlZmVycmVkIG5vZGVzIGFyZSBub3QgaW4gYWxsb3dlZF9tYXNrLiBGbGlwIGJpdHMgaW5cXG4gMzY5OlxcdFxcdCAqIGFsbG93ZWRfbWFzayBhcyB1c2VkIG5vZGUgbWFzay4gVGhlbiwgdXNlIGl0IHRvIGdldCB0aGVcXG4gMzcwOlxcdFxcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxcbiAzNzE6XFx0XFx0ICovXFxuIDM3MjpcXHRcXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xcbiAzNzM6XFx0XFx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXFx1MDAyNm1hc2ssIFxcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xcbiAzNzQ6XFx0fVxcbiAzNzU6XFx0XFxuIDM3NjpcXHRzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIDM3NzpcXHR7XFxuIDM3ODpcXHRcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XFxuIDM3OTpcXHRcXHRpbnQgbm9kZTtcXG4gMzgwOlxcdFxcbiAzODE6XFx0XFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkge1xcbiAzODI6XFx0XFx0XFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcXG4gMzgzOlxcdFxcdFxcdC8qXFxuIDM4NDpcXHRcXHRcXHQgKiBXZSBhcmUgaG9sZGluZyBtZW1vcnlfdGllcl9sb2NrLCBpdCBpcyBzYWZlXFxuIDM4NTpcXHRcXHRcXHQgKiB0byBhY2Nlc3MgcGdkYS1cXHUwMDNlbWVtdGllci5cXG4gMzg2OlxcdFxcdFxcdCAqL1xcbiAzODc6XFx0XFx0XFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XFxuIDM4ODpcXHRcXHRcXHRpZiAobWVtdGllcilcXG4gMzg5OlxcdFxcdFxcdFxcdG1lbXRpZXItXFx1MDAzZWxvd2VyX3RpZXJfbWFzayA9IE5PREVfTUFTS19OT05FO1xcbiAzOTA6XFx0XFx0fVxcbiAzOTE6XFx0XFx0LypcXG4gMzkyOlxcdFxcdCAqIEVuc3VyZSB0aGF0IHRoZSBcXFwiZGlzYWJsZVxcXCIgaXMgdmlzaWJsZSBhY3Jvc3MgdGhlIHN5c3RlbS5cXG4gMzkzOlxcdFxcdCAqIFJlYWRlcnMgd2lsbCBzZWUgZWl0aGVyIGEgY29tYmluYXRpb24gb2YgYmVmb3JlK2Rpc2FibGVcXG4gMzk0OlxcdFxcdCAqIHN0YXRlIG9yIGRpc2FibGUrYWZ0ZXIuICBUaGV5IHdpbGwgbmV2ZXIgc2VlIGJlZm9yZSBhbmRcXG4gMzk1OlxcdFxcdCAqIGFmdGVyIHN0YXRlIHRvZ2V0aGVyLlxcbiAzOTY6XFx0XFx0ICovXFxuIDM5NzpcXHRcXHRzeW5jaHJvbml6ZV9yY3UoKTtcXG4gMzk4OlxcdH1cXG4gMzk5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODo1Mi40NDMwMDQ5MjlaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjM5ODgyNzE3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgbGluZXMgb2YgY29kZTpcblxuKipEaXZpbmcgaW50byBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBtZW1vcnkgdGllcnMgYWdhaW4uIE15IGludHVpdGlvbiB0ZWxscyBtZSB0byBkcmlsbCBkb3duIGludG8gYG1tL21lbW9yeS10aWVycy5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lcyA0NDAgdG8gNDgwIHdpdGhpbiB0aGUgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBmdW5jdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIHN1c3BlY3QgdGhpcyBzZWN0aW9uIGlzIHdoZXJlIHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvdXQgKndoaWNoKiBtZW1vcnkgcmVnaW9ucyBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZGVtb3Rpb24g4oCTIHRoYXQgaXMsIG1vdmluZyBkYXRhIGZyb20gYSBmYXN0ZXIsIG1vcmUgZXhwZW5zaXZlIHRpZXIgZG93biB0byBhIHNsb3dlciwgY2hlYXBlciBvbmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjcml0ZXJpYSBhbmQgbG9naWMgYmVpbmcgdXNlZC4gQXJlIHdlIGxvb2tpbmcgYXQgYWNjZXNzIGZyZXF1ZW5jeSwgb3ZlcmFsbCBmb290cHJpbnQsIHJlY2VuY3ksIG9yIHNvbWUgY29tcGxleCBjb21iaW5hdGlvbiBvZiB0aGVzZSBmYWN0b3JzPyBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgbGlrZWx5IGNvbnRhaW5zIHRoZSBjb3JlIGRlbW90aW9uIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLCBhbmQgaXQncyBlc3NlbnRpYWwgdG8gYW5hbHl6ZSBpdCB3aXRoIGEgZmluZS10b290aCBjb21iIHRvIHVuZGVyc3RhbmQgaG93IGVmZmVjdGl2ZSB0aGUgdGllcmluZyBpcyBhbmQgaG93IGl0IG1pZ2h0IGJlIGltcHJvdmVkLiBMZXQncyBzZWUgd2hhdCBnZW1zIHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTEwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODo1NC44NDE4MzQ4MTFaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODEwNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LXRpZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDQwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDQwOlxcdFxcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcXG4gNDQxOlxcdFxcdFxcdGJlc3RfZGlzdGFuY2UgPSAtMTtcXG4gNDQyOlxcdFxcdFxcdG5kID0gXFx1MDAyNm5vZGVfZGVtb3Rpb25bbm9kZV07XFxuIDQ0MzpcXHRcXG4gNDQ0OlxcdFxcdFxcdG1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpO1xcbiA0NDU6XFx0XFx0XFx0aWYgKCFtZW10aWVyIHx8IGxpc3RfaXNfbGFzdChcXHUwMDI2bWVtdGllci1cXHUwMDNlbGlzdCwgXFx1MDAyNm1lbW9yeV90aWVycykpXFxuIDQ0NjpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNDQ3OlxcdFxcdFxcdC8qXFxuIDQ0ODpcXHRcXHRcXHQgKiBHZXQgdGhlIGxvd2VyIG1lbXRpZXIgdG8gZmluZCB0aGUgIGRlbW90aW9uIG5vZGUgbGlzdC5cXG4gNDQ5OlxcdFxcdFxcdCAqL1xcbiA0NTA6XFx0XFx0XFx0bWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTtcXG4gNDUxOlxcdFxcdFxcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcXG4gNDUyOlxcdFxcdFxcdC8qXFxuIDQ1MzpcXHRcXHRcXHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJ3VzZWQnIG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxcbiA0NTQ6XFx0XFx0XFx0ICogQWRkIGFsbCBtZW1vcnkgbm9kZXMgZXhjZXB0IHRoZSBzZWxlY3RlZCBtZW1vcnkgdGllclxcbiA0NTU6XFx0XFx0XFx0ICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlXFxuIDQ1NjpcXHRcXHRcXHQgKiBtZW10aWVyIG5vZGVsaXN0LlxcbiA0NTc6XFx0XFx0XFx0ICovXFxuIDQ1ODpcXHRcXHRcXHRub2Rlc19hbmRub3QodGllcl9ub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCB0aWVyX25vZGVzKTtcXG4gNDU5OlxcdFxcbiA0NjA6XFx0XFx0XFx0LypcXG4gNDYxOlxcdFxcdFxcdCAqIEZpbmQgYWxsIHRoZSBub2RlcyBpbiB0aGUgbWVtb3J5IHRpZXIgbm9kZSBsaXN0IG9mIHNhbWUgYmVzdCBkaXN0YW5jZS5cXG4gNDYyOlxcdFxcdFxcdCAqIGFkZCB0aGVtIHRvIHRoZSBwcmVmZXJyZWQgbWFzay4gV2UgcmFuZG9tbHkgc2VsZWN0IGJldHdlZW4gbm9kZXNcXG4gNDYzOlxcdFxcdFxcdCAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLlxcbiA0NjQ6XFx0XFx0XFx0ICovXFxuIDQ2NTpcXHRcXHRcXHRkbyB7XFxuIDQ2NjpcXHRcXHRcXHRcXHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFxcdTAwMjZ0aWVyX25vZGVzLFxcbiA0Njc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XFxuIDQ2ODpcXHRcXHRcXHRcXHRpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSlcXG4gNDY5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA0NzA6XFx0XFxuIDQ3MTpcXHRcXHRcXHRcXHRkaXN0YW5jZSA9IG5vZGVfZGlzdGFuY2Uobm9kZSwgdGFyZ2V0KTtcXG4gNDcyOlxcdFxcdFxcdFxcdGlmIChkaXN0YW5jZSA9PSBiZXN0X2Rpc3RhbmNlIHx8IGJlc3RfZGlzdGFuY2UgPT0gLTEpIHtcXG4gNDczOlxcdFxcdFxcdFxcdFxcdGJlc3RfZGlzdGFuY2UgPSBkaXN0YW5jZTtcXG4gNDc0OlxcdFxcdFxcdFxcdFxcdG5vZGVfc2V0KHRhcmdldCwgbmQtXFx1MDAzZXByZWZlcnJlZCk7XFxuIDQ3NTpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbiA0NzY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDQ3NzpcXHRcXHRcXHRcXHR9XFxuIDQ3ODpcXHRcXHRcXHR9IHdoaWxlICgxKTtcXG4gNDc5OlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6NTQuODQxOTE4MjkxWiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM1MDIxNjU4MTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIHByb3ZpZGVkIHByb21wdDpcblxuKipEaXZpbmcgaW50byBgcGFnZV9hbGxvYy5jYCBhbmQgWm9uZWxpc3RzKipcblxuT2theSwgc28gdGhlIHByb21wdCBpcyBhc2tpbmcgbWUgdG8gdGhpbmsgYWJvdXQgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIGNvZGUsIGBwYWdlX2FsbG9jLmNgLCBhbmQgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGZ1bmN0aW9uLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyByZWxhdGVzIHRvIHRoZSBmdW5kYW1lbnRhbCBtZW1vcnkgYWxsb2NhdGlvbiBtZWNoYW5pc21zIHdpdGhpbiB0aGUga2VybmVsLCBhbmQgdGhlIHN0cnVjdHVyaW5nIG9mIG1lbW9yeSB6b25lcyBhY3Jvc3MgTlVNQSBub2Rlcy5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHByb2JhYmx5IHN0YXJ0IGJ5IHF1aWNrbHkgcmV2aWV3aW5nIGBidWlsZF9ub2RlX3pvbmVsaXN0YCdzIHB1cnBvc2UuIEkgcmVtZW1iZXIgaXQncyByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHRoZSB6b25lbGlzdCBmb3IgZWFjaCBub2RlLiBUaGUgem9uZWxpc3QgZGljdGF0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBrZXJuZWwgd2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIHBhZ2VzIGZyb20gZGlmZmVyZW50IG1lbW9yeSB6b25lcyAoZS5nLiwgRE1BLCBOb3JtYWwsIEhpZ2hNZW0pIHdpdGhpbiBhIE5VTUEgbm9kZSBhbmQgcG90ZW50aWFsbHkgYWNyb3NzIG90aGVyIG5vZGVzLiBJJ2QgcHJvYmFibHkgbWVudGFsbHkgcmVjb25zdHJ1Y3QgaG93IHRoZSBkaWZmZXJlbnQgem9uZXMgb24gYSBub2RlLCBhbmQgem9uZXMgZnJvbSBvdGhlciBub2RlcywgYXJlIGFkZGVkIHRvIHRoYXQgbGlzdC5cblxuVGhlbiwgSSdkIGNvbnNpZGVyIGNvbW1vbiBzY2VuYXJpb3M6IEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgdGhpbmdzIEkgc2hvdWxkIGJlIHRoaW5raW5nIGFib3V0PyBJcyB0aGlzIGEgc3RhbmRhcmQgc2NlbmFyaW8sIGlzIHRoZXJlIHNvbWV0aGluZyB1bnVzdWFsIGFib3V0IHRoZSBwcm9tcHQsIG9yIGlzIHRoaXMgYSB0cmljayBxdWVzdGlvbj9cblxuVGhlIGludGVycGxheSB3aXRoIE5VTUEgaXMga2V5LiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhlIGltcGFjdCBvZiBOVU1BIGJhbGFuY2luZywgdGhlIGltcGFjdCBvZiBwcmVmZXJyZWQgbm9kZXMsIGFuZCB0aGUgZWZmZWN0cyBvZiBub2RlIGludGVybGVhdmUgcG9saWNpZXMuIEknZCBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgY29uZmlndXJhdGlvbnMgY2FuIHNpZ25pZmljYW50bHkgYWZmZWN0IHRoZSB6b25lbGlzdCBjb25zdHJ1Y3Rpb24uXG5cbkZpbmFsbHksIGRlcGVuZGluZyBvbiBjb250ZXh0LCBJJ2QgcHJvYmFibHkgYmUgdGhpbmtpbmcgYWJvdXQgcGVyZm9ybWFuY2UgaW1wYWN0cy4gSG93IHRoZSB6b25lbGlzdCBpcyBvcmRlcmVkIGRpcmVjdGx5IGFmZmVjdHMgYWxsb2NhdGlvbiBsYXRlbmN5LiBBcmUgdGhlcmUgYW55IGtub3duIGFyZWFzIHdoZXJlIHN1Ym9wdGltYWwgem9uZWxpc3QgY29uc3RydWN0aW9uIGxlYWRzIHRvIHBlcmZvcm1hbmNlIGlzc3Vlcz8gSSBtaWdodCBiZSB0aGlua2luZyBhYm91dCBob3cgdGhpbmdzIGFyZSBjb25maWd1cmVkLCBiZWNhdXNlIEkgcmVjYWxsIHRoYXQgc29tZXRpbWVzLCB0aGUgaWRlYWwgem9uZWxpc3Qgb3JkZXJpbmcgaXMgYSBiYWxhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NDE0LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODo1OC4zNDQwODY0MzVaIiwiU2VxIjo1NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDE4MTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3BhZ2VfYWxsb2MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1ODcwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI1ODcwOlxcdFxcdHpvbmVyZWZzICs9IG5yX3pvbmVzO1xcbjU4NzE6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbjU4NzI6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmVfaWR4ID0gMDtcXG41ODczOlxcdH1cXG41ODc0OlxcdFxcbjU4NzU6XFx0LypcXG41ODc2OlxcdCAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW5cXG41ODc3OlxcdCAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxcbjU4Nzg6XFx0ICogcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS5cXG41ODc5OlxcdCAqL1xcbjU4ODA6XFx0c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbjU4ODE6XFx0XFx0XFx0XFx0XFx0aW50IHpsaWR4KVxcbjU4ODI6XFx0e1xcbjU4ODM6XFx0XFx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZWxpc3RzW3psaWR4XS5fem9uZXJlZnM7XFxuNTg4NDpcXHRcXHRub2RlbWFza190IHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FO1xcbjU4ODU6XFx0XFx0aW50IGxvY2FsX25vZGUgPSBwZ2RhdC1cXHUwMDNlbm9kZV9pZDtcXG41ODg2OlxcdFxcdGludCBwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xcbjU4ODc6XFx0XFx0aW50IG5vZGU7XFxuNTg4ODpcXHRcXG41ODg5OlxcdFxcdHByX2luZm8oXFxcIkZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcXFwiLCBsb2NhbF9ub2RlKTtcXG41ODkwOlxcdFxcbjU4OTE6XFx0XFx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcXHUwMDI2dXNlZF9tYXNrLFxcbjU4OTI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgY2FuZGlkYXRlcykpIFxcdTAwM2U9IDApIHtcXG41ODkzOlxcdFxcdFxcdC8qXFxuNTg5NDpcXHRcXHRcXHQgKiBXZSBkb24ndCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxcbjU4OTU6XFx0XFx0XFx0ICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZVxcbjU4OTY6XFx0XFx0XFx0ICogZGlzdGFuY2UgZ3JvdXAgdG8gbWFrZSBpdCByb3VuZC1yb2Jpbi5cXG41ODk3OlxcdFxcdFxcdCAqL1xcbjU4OTg6XFx0XFx0XFx0aWYgKG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgbm9kZSkgIT1cXG41ODk5OlxcdFxcdFxcdCAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpXFxuNTkwMDpcXHRcXHRcXHRcXHRub2RlX2xvYWRbbm9kZV0gKz0gMTtcXG41OTAxOlxcdFxcbjU5MDI6XFx0XFx0XFx0em9uZXJlZnMgKz0gYnVpbGRfem9uZXJlZnNfbm9kZShOT0RFX0RBVEEobm9kZSksIHpvbmVyZWZzKTtcXG41OTAzOlxcdFxcdFxcdHByX2NvbnQoXFxcIiVkIFxcXCIsIG5vZGUpO1xcbjU5MDQ6XFx0XFx0XFx0cHJldl9ub2RlID0gbm9kZTtcXG41OTA1OlxcdFxcdH1cXG41OTA2OlxcdFxcbjU5MDc6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbjU5MDg6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmVfaWR4ID0gMDtcXG41OTA5OlxcdFxcdHByX2NvbnQoXFxcIlxcXFxuXFxcIik7XFxuNTkxMDpcXHR9XFxuNTkxMTpcXHRcXG41OTEyOlxcdHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxcbjU5MTM6XFx0e1xcbjU5MTQ6XFx0XFx0YnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgXFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSwgWk9ORUxJU1RfRkFMTEJBQ0spO1xcbjU5MTU6XFx0XFx0YnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTtcXG41OTE2OlxcdH1cXG41OTE3OlxcdFxcbjU5MTg6XFx0I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcXG41OTE5OlxcdC8qXFxuNTkyMDpcXHQgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFxcXCJsb2NhbFxcXCIgYWxsb2NhdGlvbnMuXFxuNTkyMTpcXHQgKiBJLmUuLCBmaXJzdCBub2RlIGlkIG9mIGZpcnN0IHpvbmUgaW4gYXJnIG5vZGUncyBnZW5lcmljIHpvbmVsaXN0LlxcbjU5MjI6XFx0ICogVXNlZCBmb3IgaW5pdGlhbGl6aW5nIHBlcmNwdSAnbnVtYV9tZW0nLCB3aGljaCBpcyB1c2VkIHByaW1hcmlseVxcbjU5MjM6XFx0ICogZm9yIGtlcm5lbCBhbGxvY2F0aW9ucywgc28gdXNlIEdGUF9LRVJORUwgZmxhZ3MgdG8gbG9jYXRlIHpvbmVsaXN0LlxcbjU5MjQ6XFx0ICovXFxuNTkyNTpcXHRpbnQgbG9jYWxfbWVtb3J5X25vZGUoaW50IG5vZGUpXFxuNTkyNjpcXHR7XFxuNTkyNzpcXHRcXHRzdHJ1Y3Qgem9uZXJlZiAqejtcXG41OTI4OlxcdFxcbjU5Mjk6XFx0XFx0eiA9IGZpcnN0X3pvbmVzX3pvbmVsaXN0KG5vZGVfem9uZWxpc3Qobm9kZSwgR0ZQX0tFUk5FTCksXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjU4LjM0NDUwNjQ3NVoiLCJTZXEiOjU3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MTM3ODY3MDE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFRoaXMgUGF0Y2ggaXMgU2FmZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgcmlnaHQ/IERvZXMgdGhpcyBwYXRjaCBpbnRyb2R1Y2UgYSByaXNrIHRoZXJlPyBJJ3ZlIGdvbmUgdGhyb3VnaCBpdCBzdGVwIGJ5IHN0ZXAuIEZpcnN0LCBJIGNoZWNrZWQ6IGRvZXMgYW55IGtlcm5lbCBtZW1vcnkgbGVhayBpbnRvIHVzZXIgc3BhY2U/IE5vcGUsIG5vdGhpbmcncyBjb3BpZWQgb3V0LiBBcmUgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgc3RydWN0cyBvciBidWZmZXJzIGNyZWF0ZWQgb3IgcGFzc2VkIGFyb3VuZD8gQWdhaW4sIG5vLiBUaGUgYGNhbmRpZGF0ZXNgIHBhcmFtZXRlciBpcyBhIGBjb25zdCBub2RlbWFza190YCwgcG9pbnRpbmcgdG8gYSBnbG9iYWwga2VybmVsIHZhcmlhYmxlLCBzbyB0aGF0J3MgY292ZXJlZC4gSW5zaWRlIHRoZSByZWxldmFudCBmdW5jdGlvbnMgbGlrZSBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgYW5kIGBidWlsZF9ub2RlX3pvbmVsaXN0YCwgSSBzZWUgYml0d2lzZSBvcGVyYXRpb25zIG9uIGBjYW5kaWRhdGVzYCBhbmQgaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBObyByZWQgZmxhZ3MgdGhlcmUuXG5cblRoZW4sIEkgbG9va2VkIGF0IGFsbG9jYXRpb25zLiBJcyB0aGlzIGludHJvZHVjaW5nIG5ldyBvbmVzLCBzdGFjayBvciBoZWFwPyBObywgYWN0dWFsbHksIGl0ICpyZW1vdmVkKiBhbGxvY2F0aW9ucyEgVGhhdCdzIGEgZ29vZCBzaWduLiBBbmQgbm8gY2hhbmdlcyB0byBhbnkgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGxpa2UgaW9jdGwsIG5ldGxpbmssIG9yIHN5c2NhbGxzLiBUaGlzIGlzIGFsbCBpbnRlcm5hbCBOVU1BIG1lbW9yeSBhbGxvY2F0aW9uIGxvZ2ljLlxuXG5TbywgYW0gSSBzZWVpbmcgKmFueSogdW5pbml0aWFsaXplZCBtZW1vcnkgYnVncyB0aGF0IEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoPyBOby4gQW55IGJ1Z3MgaGVyZSB3b3VsZCBiZSBsb2dpY2FsIGVycm9ycywgb3V0LW9mLWJvdW5kcyB6b25lcmVmIGFjY2Vzcywgd2hpY2ggS0FTQU4gd291bGQgY2F0Y2gsIG9yIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wcywgd2hpY2ggYXJlIG5vdCByZWxldmFudCB0byBLTVNBTi5cblxuVGhlcmVmb3JlLCBubyBLTVNBTiBpcyBuZWVkZWQgaGVyZS4gS0FTQU4gaXMgc3VmZmljaWVudCB0byBjYXRjaCBtZW1vcnkgY29ycnVwdGlvbiBvciBib3VuZGFyeSBpc3N1ZXMgdGhhdCBtaWdodCBhcmlzZS5cblxuTm93LCBsZXQgbWUgZG91YmxlLWNoZWNrIGFnYWluc3QgdGhlIGNyaXRlcmlhOiBUaGUgcmVxdWlyZW1lbnRzIHN0YXRlIHRoYXQgS01TQU4gaXNuJ3QgbmVlZGVkIGlmIHRoZSBwcmltYXJ5IHJpc2tzIGFyZSBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3ZlcmZsb3dzLCBudWxsIGRlcmVmZXJlbmNlcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAod2hpY2ggYXJlIEtBU0FOJ3MgZG9tYWluKSwgb3IgaWYgYWxsIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkLiBBbGwgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBJdCBhbHNvIHN0YXRlcyB0aGUgcGF0Y2ggbXVzdCBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IG9yIGluZm8tbGVha3MsIGFuZCBpdCBkb2Vzbid0LlxuXG5TbywgTmVlZHNLTVNBTiA9IGZhbHNlLiBDYXNlIGNsb3NlZC4gSSdtIHJlYWR5IHRvIHdyaXRlIHVwIHRoZSByZWFzb25pbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg3OTAsIk91dHB1dFRva2VucyI6MjA5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTY3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzk6MDMuNDgyMzc1NTkyWiIsIlNlcSI6NTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgTlVNQSB6b25lbGlzdCBnZW5lcmF0aW9uIGFuZCBub2RlIGZhbGxiYWNrIGNhbGN1bGF0aW9uIGJ5IGludHJvZHVjaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIHdpdGggYSBgY2FuZGlkYXRlc2Agbm9kZW1hc2sgcGFyYW1ldGVyIGFuZCBtZXJnaW5nIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgLlxcblxcbi0gTm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIChubyBpbmZvLWxlYWtzKS5cXG4tIE5vIG5ldyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGludHJvZHVjZWQuXFxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVxcdTAwM2V6b25lID0gTlVMTGAsIGB6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwYCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLlxcbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gYW5kIG5vZGUgZmFsbGJhY2sgY2FsY3VsYXRpb24gYnkgaW50cm9kdWNpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAgd2l0aCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBwYXJhbWV0ZXIgYW5kIG1lcmdpbmcgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKClgIGludG8gYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAuXFxuXFxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxcbi0gTm8gbmV3IGhlYXAgb3Igc3RhY2sgYWxsb2NhdGlvbnMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG4tIEFsbCB2YXJpYWJsZXMgKHN1Y2ggYXMgYHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FYCkgYW5kIHpvbmVyZWYgdGVybWluYXRpb25zIChgem9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVxcdTAwM2V6b25lX2lkeCA9IDBgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuXFxuLSBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludHJvZHVjZWQgYnkgem9uZWxpc3QgaW5kZXhpbmcgb3IgdHJhdmVyc2FsIHdvdWxkIGJlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgcG9pbnRlciBlcnJvcnMsIHdoaWNoIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBLTVNBTiB1bmluaXRpYWxpemVkIG1lbW9yeSBkZXRlY3Rpb24gaXMgbm90IGFwcGxpY2FibGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowdkt2m[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-12 03:19:01 +0000 UTC FinishedAt: 2026-09-12 03:39:04 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9958290885035431e2494159f555e332c3c14906", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9958290885035431e2494159f555e332c3c14906", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION" ], "series_id": "880eb61a-dcbe-485a-bba5-7d4b6b00bae6" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "find_next_best_node_in", "next_demotion_node", "build_all_zonelists" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "", "base_commit": "9958290885035431e2494159f555e332c3c14906", "base_tree": "mm-new" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cblxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgZmluZF9uZXh0X2Jlc3Rfbm9kZSgpIGludG8gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpLCBhbGxvd2luZyBjYWxsZXJzIHRvIHNwZWNpZnkgZWxpZ2libGUgY2FuZGlkYXRlIG5vZGVzIHZpYSBhIG5vZGVtYXNrLiBJdCBhbHNvIHJlc3RydWN0dXJlcyB6b25lbGlzdCBidWlsZGluZyBpbiBtbS9wYWdlX2FsbG9jLmMgKGJ1aWxkX25vZGVfem9uZWxpc3QpIGFuZCB1cGRhdGVzIGRlbW90aW9uIHRhcmdldCByZXNvbHV0aW9uIGluIG1tL21lbW9yeS10aWVycy5jIChuZXh0X2RlbW90aW9uX25vZGUgYW5kIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKS4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIHJlYWNoYWJsZSBkdXJpbmcgTlVNQSB6b25lbGlzdCBnZW5lcmF0aW9uIChlLmcuIGJvb3QgYW5kIG1lbW9yeSBob3RwbHVnL3JlYnVpbGQpIGFuZCBmb2xpbyBkZW1vdGlvbiBkdXJpbmcgbWVtb3J5IHJlY2xhbWF0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMWJhMmQ0ZjE3OTFkYjg3MzYwMGYwYTEyZmY3M2QyOTlhYmRkM2JkN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDAzOjM3OjAyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXG5pbmRleCBkYTE0YzU2ZmIyNGUxLi4xNTE5ZGQyMWE5MDBmIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaFxuQEAgLTExMzMsNyAmIzQzOzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xuIFxuIGV4dGVybiB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIFx0XHRcdFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcbi1leHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKTtcbiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuJiM0MztcdFx0Y29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyk7XG4gI2Vsc2VcbiAjZGVmaW5lIG5vZGVfcmVjbGFpbV9tb2RlIDBcbiBcbkBAIC0xMTQyLDcgJiM0MzsxMTQzLDggQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIHtcbiBcdHJldHVybiAwO1xuIH1cbi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4mIzQzO1x0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuIHtcbiBcdHJldHVybiBOVU1BX05PX05PREU7XG4gfVxuZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmNcbmluZGV4IDU0ODUxZDhhMTk1YjAuLjI1ZTEyMTg1MWI1ODYgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmNcbkBAIC0zNzAsNyAmIzQzOzM3MCw3IEBAIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbiBcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxuIFx0ICovXG4gXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xuLVx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXHUwMDI2bWFzayk7XG4mIzQzO1x0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXHUwMDI2bWFzaywgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuQEAgLTQ1MCw3ICYjNDM7NDUwLDcgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdFx0bWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTtcbiBcdFx0dGllcl9ub2RlcyA9IGdldF9tZW10aWVyX25vZGVtYXNrKG1lbXRpZXIpO1xuIFx0XHQvKlxuLVx0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4mIzQzO1x0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4gXHRcdCAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXJcbiBcdFx0ICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlXG4gXHRcdCAqIG1lbXRpZXIgbm9kZWxpc3QuXG5AQCAtNDYzLDcgJiM0Mzs0NjMsOCBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0XHQgKiBpbiB0aGUgcHJlZmVycmVkIG1hc2sgd2hlbiBhbGxvY2F0aW5nIHBhZ2VzIGR1cmluZyBkZW1vdGlvbi5cbiBcdFx0ICovXG4gXHRcdGRvIHtcbi1cdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMpO1xuJiM0MztcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiBcdFx0XHRpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSlcbiBcdFx0XHRcdGJyZWFrO1xuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xuaW5kZXggMWNmYmQwNTgyYTEwYS4uZDE4ODhkNTYzMGUwYSAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9hbGxvYy5jXG5AQCAtNTc5Myw5ICYjNDM7NTc5MywxMCBAQCBzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxuIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4gXG4gLyoqXG4tICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3RcbiYjNDM7ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3RcbiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJiMzOTtyZSBhcHBlbmRpbmdcbiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzXG4mIzQzOyAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cbiAgKlxuICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkXG4gICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSYjMzk7cyBmYWxsYmFjayBsaXN0LiAgVGhlIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFwcGVhcmVkXG5AQCAtNTgwNyw3ICYjNDM7NTgwOCw4IEBAIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4gICpcbiAgKiBSZXR1cm46IG5vZGUgaWQgb2YgdGhlIGZvdW5kIG5vZGUgb3IgJU5VTUFfTk9fTk9ERSBpZiBubyBub2RlIGlzIGZvdW5kLlxuICAqL1xuLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuJiM0MztcdFx0XHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuIHtcbiBcdGludCBuLCB2YWw7XG4gXHRpbnQgbWluX3ZhbCA9IElOVF9NQVg7XG5AQCAtNTgxNywxMiAmIzQzOzU4MTksMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuIFx0ICogVXNlIHRoZSBsb2NhbCBub2RlIGlmIHdlIGhhdmVuJiMzOTt0IGFscmVhZHksIGJ1dCBmb3IgbWVtb3J5bGVzcyBsb2NhbFxuIFx0ICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy5cbiBcdCAqL1xuLVx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXHUwMDI2XHUwMDI2IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7XG4mIzQzO1x0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXHUwMDI2XHUwMDI2IG5vZGVfaXNzZXQobm9kZSwgKmNhbmRpZGF0ZXMpKSB7XG4gXHRcdG5vZGVfc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzayk7XG4gXHRcdHJldHVybiBub2RlO1xuIFx0fVxuIFxuLVx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuLCBOX01FTU9SWSkge1xuJiM0MztcdGZvcl9lYWNoX25vZGVfbWFzayhuLCAqY2FuZGlkYXRlcykge1xuIFxuIFx0XHQvKiBEb24mIzM5O3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovXG4gXHRcdGlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpXG5AQCAtNTg1NSwzMSAmIzQzOzU4NTcsNiBAQCBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4gfVxuIFxuIFxuLS8qXG4tICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuXG4tICogVGhpcyByZXN1bHRzIGluIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsXG4tICogRE1BIHpvbmUsIGlmIGFueS0tYnV0IHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuXG4tICovXG4tc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdfZGF0YV90ICpwZ2RhdCwgaW50ICpub2RlX29yZGVyLFxuLVx0XHR1bnNpZ25lZCBucl9ub2Rlcylcbi17XG4tXHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnM7XG4tXHRpbnQgaTtcbi1cbi1cdHpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbWk9ORUxJU1RfRkFMTEJBQ0tdLl96b25lcmVmcztcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX25vZGVzOyBpJiM0MzsmIzQzOykge1xuLVx0XHRpbnQgbnJfem9uZXM7XG4tXG4tXHRcdHBnX2RhdGFfdCAqbm9kZSA9IE5PREVfREFUQShub2RlX29yZGVyW2ldKTtcbi1cbi1cdFx0bnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTtcbi1cdFx0em9uZXJlZnMgJiM0Mzs9IG5yX3pvbmVzO1xuLVx0fVxuLVx0em9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTEw7XG4tXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4tfVxuLVxuIC8qXG4gICogQnVpbGQgX19HRlBfVEhJU05PREUgem9uZWxpc3RzXG4gICovXG5AQCAtNTg5NSwxOSAmIzQzOzU4NzIsMjQgQEAgc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4gXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuJiM0MzsvKlxuJiM0MzsgKiBCdWlsZCBvbmUgem9uZWxpc3Qgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS4gVGhpcyByZXN1bHRzIGluXG4mIzQzOyAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxuJiM0MzsgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuJiM0MztcdFx0XHRcdGludCB6bGlkeClcbiB7XG4tXHRzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTtcbi1cdGludCBub2RlLCBucl9ub2RlcyA9IDA7XG4mIzQzO1x0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbemxpZHhdLl96b25lcmVmcztcbiBcdG5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG4tXHRpbnQgbG9jYWxfbm9kZSwgcHJldl9ub2RlO1xuJiM0MztcdGludCBsb2NhbF9ub2RlID0gcGdkYXQtXHUwMDNlbm9kZV9pZDtcbiYjNDM7XHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbiYjNDM7XHRpbnQgbm9kZTtcbiBcbi1cdC8qIE5VTUEtYXdhcmUgb3JkZXJpbmcgb2Ygbm9kZXMgKi9cbi1cdGxvY2FsX25vZGUgPSBwZ2RhdC1cdTAwM2Vub2RlX2lkO1xuLVx0cHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcJiMzNDssIGxvY2FsX25vZGUpO1xuIFxuLVx0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XG4tXHR3aGlsZSAoKG5vZGUgPSBmaW5kX25leHRfYmVzdF9ub2RlKGxvY2FsX25vZGUsIFx1MDAyNnVzZWRfbWFzaykpIFx1MDAzZT0gMCkge1xuJiM0MztcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgY2FuZGlkYXRlcykpIFx1MDAzZT0gMCkge1xuIFx0XHQvKlxuIFx0XHQgKiBXZSBkb24mIzM5O3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS5cbiBcdFx0ICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZVxuQEAgLTU5MTcsMTggJiM0Mzs1ODk5LDIyIEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuIFx0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKVxuIFx0XHRcdG5vZGVfbG9hZFtub2RlXSAmIzQzOz0gMTtcbiBcbi1cdFx0bm9kZV9vcmRlcltucl9ub2RlcyYjNDM7JiM0MztdID0gbm9kZTtcbiYjNDM7XHRcdHpvbmVyZWZzICYjNDM7PSBidWlsZF96b25lcmVmc19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZXJlZnMpO1xuJiM0MztcdFx0cHJfY29udChcJiMzNDslZCBcJiMzNDssIG5vZGUpO1xuIFx0XHRwcmV2X25vZGUgPSBub2RlO1xuIFx0fVxuIFxuLVx0YnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdkYXQsIG5vZGVfb3JkZXIsIG5yX25vZGVzKTtcbi1cdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XG4tXHRwcl9pbmZvKFwmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcJiMzNDssIGxvY2FsX25vZGUpO1xuLVx0Zm9yIChub2RlID0gMDsgbm9kZSBcdTAwM2MgbnJfbm9kZXM7IG5vZGUmIzQzOyYjNDM7KVxuLVx0XHRwcl9jb250KFwmIzM0OyVkIFwmIzM0Oywgbm9kZV9vcmRlcltub2RlXSk7XG4mIzQzO1x0em9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTEw7XG4mIzQzO1x0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuIFx0cHJfY29udChcJiMzNDtcXG5cJiMzNDspO1xuIH1cbiBcbiYjNDM7c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4mIzQzO3tcbiYjNDM7XHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTtcbiYjNDM7XHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xuJiM0Mzt9XG4mIzQzO1xuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG4gLypcbiAgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFwmIzM0O2xvY2FsXCYjMzQ7IGFsbG9jYXRpb25zLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMDM6Mzc6MDIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCBkYTE0YzU2ZmIyNGUxLi4xNTE5ZGQyMWE5MDBmIDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTExMzMsNyAmIzQzOzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKIAkJCQkgIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwotZXh0ZXJuIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayk7CiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLAomIzQzOwkJY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyk7CiAjZWxzZQogI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwCiAKQEAgLTExNDIsNyAmIzQzOzExNDMsOCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaywKJiM0MzsJCWNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpCiB7CiAJcmV0dXJuIE5VTUFfTk9fTk9ERTsKIH0KZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmMKaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmMKQEAgLTM3MCw3ICYjNDM7MzcwLDcgQEAgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKQogCSAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LgogCSAqLwogCW5vZGVzX2NvbXBsZW1lbnQobWFzaywgKmFsbG93ZWRfbWFzayk7Ci0JcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgJmFtcDttYXNrKTsKJiM0MzsJcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDttYXNrLCAmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZCkKQEAgLTQ1MCw3ICYjNDM7NDUwLDcgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkKIAkJbWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTsKIAkJdGllcl9ub2RlcyA9IGdldF9tZW10aWVyX25vZGVtYXNrKG1lbXRpZXIpOwogCQkvKgotCQkgKiBmaW5kX25leHRfYmVzdF9ub2RlLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiYjNDM7CQkgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiAJCSAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXIKIAkJICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlCiAJCSAqIG1lbXRpZXIgbm9kZWxpc3QuCkBAIC00NjMsNyAmIzQzOzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpCiAJCSAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLgogCQkgKi8KIAkJZG8gewotCQkJdGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCAmYW1wO3RpZXJfbm9kZXMpOwomIzQzOwkJCXRhcmdldCA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDt0aWVyX25vZGVzLAomIzQzOwkJCQkJCQkmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiAJCQlpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSkKIAkJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDFjZmJkMDU4MmExMGEuLmQxODg4ZDU2MzBlMGEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTU3OTMsOSAmIzQzOzU3OTMsMTAgQEAgc3RhdGljIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CiAKIC8qKgotICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QKJiM0MzsgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdAogICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSYjMzk7cmUgYXBwZW5kaW5nCiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzCiYjNDM7ICogQGNhbmRpZGF0ZXM6IG5vZGVtYXNrX3Qgb2Ygbm9kZXMgZWxpZ2libGUgZm9yIHNlbGVjdGlvbgogICoKICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkCiAgKiBhcHBlYXIgb24gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWQKQEAgLTU4MDcsNyAmIzQzOzU4MDgsOCBAQCBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOwogICoKICAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuCiAgKi8KLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssCiYjNDM7CQkJICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcykKIHsKIAlpbnQgbiwgdmFsOwogCWludCBtaW5fdmFsID0gSU5UX01BWDsKQEAgLTU4MTcsMTIgJiM0Mzs1ODE5LDEyIEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIAkgKiBVc2UgdGhlIGxvY2FsIG5vZGUgaWYgd2UgaGF2ZW4mIzM5O3QgYWxyZWFkeSwgYnV0IGZvciBtZW1vcnlsZXNzIGxvY2FsCiAJICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy4KIAkgKi8KLQlpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSAmYW1wOyZhbXA7IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7CiYjNDM7CWlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spICZhbXA7JmFtcDsgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHsKIAkJbm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTsKIAkJcmV0dXJuIG5vZGU7CiAJfQogCi0JZm9yX2VhY2hfbm9kZV9zdGF0ZShuLCBOX01FTU9SWSkgewomIzQzOwlmb3JfZWFjaF9ub2RlX21hc2sobiwgKmNhbmRpZGF0ZXMpIHsKIAogCQkvKiBEb24mIzM5O3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovCiAJCWlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpCkBAIC01ODU1LDMxICYjNDM7NTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIH0KIAogCi0vKgotICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuCi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwKLSAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgotICovCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsCi0JCXVuc2lnbmVkIG5yX25vZGVzKQotewotCXN0cnVjdCB6b25lcmVmICp6b25lcmVmczsKLQlpbnQgaTsKLQotCXpvbmVyZWZzID0gcGdkYXQtJmd0O25vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfbm9kZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWludCBucl96b25lczsKLQotCQlwZ19kYXRhX3QgKm5vZGUgPSBOT0RFX0RBVEEobm9kZV9vcmRlcltpXSk7Ci0KLQkJbnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTsKLQkJem9uZXJlZnMgJiM0Mzs9IG5yX3pvbmVzOwotCX0KLQl6b25lcmVmcy0mZ3Q7em9uZSA9IE5VTEw7Ci0Jem9uZXJlZnMtJmd0O3pvbmVfaWR4ID0gMDsKLX0KLQogLyoKICAqIEJ1aWxkIF9fR0ZQX1RISVNOT0RFIHpvbmVsaXN0cwogICovCkBAIC01ODk1LDE5ICYjNDM7NTg3MiwyNCBAQCBzdGF0aWMgdm9pZCBidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKIAl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogfQogCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW4KJiM0MzsgKiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbCBETUEgem9uZSwgaWYgYW55LS1idXQKJiM0MzsgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcywKJiM0MzsJCQkJaW50IHpsaWR4KQogewotCXN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdOwotCWludCBub2RlLCBucl9ub2RlcyA9IDA7CiYjNDM7CXN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LSZndDtub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzOwogCW5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7Ci0JaW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTsKJiM0MzsJaW50IGxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKJiM0MzsJaW50IHByZXZfbm9kZSA9IGxvY2FsX25vZGU7CiYjNDM7CWludCBub2RlOwogCi0JLyogTlVNQS1hd2FyZSBvcmRlcmluZyBvZiBub2RlcyAqLwotCWxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKLQlwcmV2X25vZGUgPSBsb2NhbF9ub2RlOwomIzQzOwlwcl9pbmZvKCYjMzQ7RmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6ICYjMzQ7LCBsb2NhbF9ub2RlKTsKIAotCW1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpOwotCXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2spKSAmZ3Q7PSAwKSB7CiYjNDM7CXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2ssCiYjNDM7CQkJCQkgICAgICBjYW5kaWRhdGVzKSkgJmd0Oz0gMCkgewogCQkvKgogCQkgKiBXZSBkb24mIzM5O3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS4KIAkJICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZQpAQCAtNTkxNywxOCAmIzQzOzU4OTksMjIgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiAJCSAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpCiAJCQlub2RlX2xvYWRbbm9kZV0gJiM0Mzs9IDE7CiAKLQkJbm9kZV9vcmRlcltucl9ub2RlcyYjNDM7JiM0MztdID0gbm9kZTsKJiM0MzsJCXpvbmVyZWZzICYjNDM7PSBidWlsZF96b25lcmVmc19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZXJlZnMpOwomIzQzOwkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlKTsKIAkJcHJldl9ub2RlID0gbm9kZTsKIAl9CiAKLQlidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpOwotCWJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7Ci0JcHJfaW5mbygmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiAmIzM0OywgbG9jYWxfbm9kZSk7Ci0JZm9yIChub2RlID0gMDsgbm9kZSAmbHQ7IG5yX25vZGVzOyBub2RlJiM0MzsmIzQzOykKLQkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlX29yZGVyW25vZGVdKTsKJiM0MzsJem9uZXJlZnMtJmd0O3pvbmUgPSBOVUxMOwomIzQzOwl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogCXByX2NvbnQoJiMzNDtcbiYjMzQ7KTsKIH0KIAomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQomIzQzO3sKJiM0MzsJYnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgJmFtcDtub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTsKJiM0MzsJYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTsKJiM0Mzt9CiYjNDM7CiAjaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFUwogLyoKICAqIFJldHVybiBub2RlIGlkIG9mIG5vZGUgdXNlZCBmb3IgJiMzNDtsb2NhbCYjMzQ7IGFsbG9jYXRpb25zLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzA4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaWRlbnRpZnkgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2VzLiBUaGUgZGlmZiB0b3VjaGVzIGBtbS9pbnRlcm5hbC5oYCwgYG1tL21lbW9yeS10aWVycy5jYCwgYW5kIGBtbS9wYWdlX2FsbG9jLmNgLiBUaGlzIHN1Z2dlc3RzIGl0JiMzOTtzIGxpa2VseSByZWxhdGVkIHRvIG1lbW9yeSBub2RlIHNlbGVjdGlvbiBvciB6b25lIG1hbmFnZW1lbnQgd2l0aGluIE5VTUEgc3lzdGVtcywgbXkgc3BpZGV5IHNlbnNlcyBhcmUgdGluZ2xpbmcuIEkmIzM5O2xsIHByb2JhYmx5IGdyYWIgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBjb2RlLCBtYXliZSBsb29rIGF0IGZ1bmN0aW9uIGNhbGxzLgoKRmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgYSBoaWdoLWxldmVsIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCB0aGlzIHBhdGNoIGFjdHVhbGx5ICpkb2VzKi4KCjEuICAqKmBtbS9pbnRlcm5hbC5oYCoqOiBJdCBsb29rcyBsaWtlIGBmaW5kX25leHRfYmVzdF9ub2RlYCBpcyBnZXR0aW5nIGEgc2lnbmF0dXJlIGNoYW5nZSwgYmVpbmcgcmVuYW1lZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIEkgYWxzbyBzZWUgYSBzdGF0aWMgaW5saW5lIGZhbGxiYWNrIHdoZW4gYENPTkZJR19OVU1BYCAob3Igc29tZXRoaW5nIHNpbWlsYXIpIGlzbiYjMzk7dCBkZWZpbmVkLiBTZWVtcyBsaWtlIHRoZXkmIzM5O3JlIHRyeWluZyB0byBnZW5lcmFsaXplIGEgbm9kZSBzZWxlY3Rpb24gZnVuY3Rpb24gYW5kIGhhbmRsZSBub24tTlVNQSBjYXNlcyBncmFjZWZ1bGx5LgoyLiAgKipgbW0vbWVtb3J5LXRpZXJzLmNgKio6IFRoZSBgbmV4dF9kZW1vdGlvbl9ub2RlKClgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKWAgZnVuY3Rpb25zLCBub3cgY2FsbGluZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYC4gSSYjMzk7bSBndWVzc2luZyB0aGlzIHJlbGF0ZXMgdG8gbWVtb3J5IHRpZXJpbmcgcG9saWNpZXMgb3IgZGVtb3Rpb24vcHJvbW90aW9uIGRlY2lzaW9ucyB3aXRoaW4gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIFRoZSBgJmFtcDtub2RlX3N0YXRlc1tOX01FTU9SWV1gIGFyZ3VtZW50IGlzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nLgozLiAgKipgbW0vcGFnZV9hbGxvYy5jYCoqOiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIFRoZSBvcmlnaW5hbCBgZmluZF9uZXh0X2Jlc3Rfbm9kZSgpYCBpcyBnb25lLCBhbmQgbm93IGNhbGxpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAsIHRha2luZyBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBpbnN0ZWFkIG9mIGhhcmRjb2Rpbmcgbm9kZS1zdGF0ZSBjYWxscy4gVGhpcyBzdWdnZXN0cyBhIG1vcmUgZmxleGlibGUgbm9kZSBzZWxlY3Rpb24gbWVjaGFuaXNtLiBBbHNvLCB0aGUgcmVtb3ZhbC9tZXJnaW5nIG9mIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgIGlzIGludGVyZXN0aW5nLiBUaGUgYGJ1aWxkX3pvbmVsaXN0cygpYCBub3cgY2FsbHMgYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAgd2l0aCBkaWZmZXJlbnQgbm9kZW1hc2tzLiBUaGlzIGlzIGFsbCBhYm91dCB6b25lIG9yZGVyaW5nIGR1cmluZyBwYWdlIGFsbG9jYXRpb24uCgpJJiMzOTttIHN0YXJ0aW5nIHRvIHNlZSBhIHBhdHRlcm4gaGVyZTogZ2VuZXJhbGl6YXRpb24gYW5kIGEgcG90ZW50aWFsIHNoaWZ0IGluIGhvdyBub2RlbWFza3MgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGlzIGlzIGFib3V0IG1ha2luZyBub2RlIHNlbGVjdGlvbiBtb3JlIGZsZXhpYmxlLCBwb3RlbnRpYWxseSBmb3IgYmV0dGVyIE5VTUEgYXdhcmVuZXNzIG9yIHBlcmhhcHMgdG8gaW50ZWdyYXRlIGl0IGJldHRlciB3aXRoIG1lbW9yeSB0aWVyaW5nLgoKSSYjMzk7bSB0aGlua2luZyBJIHNob3VsZCBjaGVjayBhcm91bmQgbGluZXMgMTEzMC0xMTUwIGluIGBtbS9pbnRlcm5hbC5oYCB0byBzZWUgd2hhdCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBndWFyZHMgYXJlIGluIHBsYWNlLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgY29kZSBiZWhhdmVzIGluIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2ludGVybmFsLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTI1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExMjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgbWxvY2tfbmV3X2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pIHsgfVxuMTEyNjpcdHN0YXRpYyBpbmxpbmUgYm9vbCBuZWVkX21sb2NrX2RyYWluKGludCBjcHUpIHsgcmV0dXJuIGZhbHNlOyB9XG4xMTI3Olx0c3RhdGljIGlubGluZSB2b2lkIG1sb2NrX2RyYWluX2xvY2FsKHZvaWQpIHsgfVxuMTEyODpcdHN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9yZW1vdGUoaW50IGNwdSkgeyB9XG4xMTI5Olx0I2VuZGlmIC8qICFDT05GSUdfTU1VICovXG4xMTMwOlx0XG4xMTMxOlx0I2lmZGVmIENPTkZJR19OVU1BXG4xMTMyOlx0ZXh0ZXJuIGludCBub2RlX3JlY2xhaW1fbW9kZTtcbjExMzM6XHRcbjExMzQ6XHRleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbjExMzU6XHRcdFx0XHRcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XG4xMTM2Olx0aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuMTEzNzpcdFx0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcbjExMzg6XHQjZWxzZVxuMTEzOTpcdCNkZWZpbmUgbm9kZV9yZWNsYWltX21vZGUgMFxuMTE0MDpcdFxuMTE0MTpcdHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbjExNDI6XHRcdFx0XHRcdFx0IGdmcF90IG1hc2ssIHVuc2lnbmVkIGludCBvcmRlcilcbjExNDM6XHR7XG4xMTQ0Olx0XHRyZXR1cm4gMDtcbjExNDU6XHR9XG4xMTQ2Olx0c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4xMTQ3Olx0XHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4xMTQ4Olx0e1xuMTE0OTpcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbjExNTA6XHR9XG4xMTUxOlx0I2VuZGlmXG4xMTUyOlx0XG4xMTUzOlx0c3RhdGljIGlubGluZSBib29sIG5vZGVfcmVjbGFpbV9lbmFibGVkKHZvaWQpXG4xMTU0Olx0e1xuMTE1NTpcdFx0LyogSXMgYW55IG5vZGVfcmVjbGFpbV9tb2RlIGJpdCBzZXQ/ICovXG4xMTU2Olx0XHRyZXR1cm4gbm9kZV9yZWNsYWltX21vZGUgXHUwMDI2IChSRUNMQUlNX1pPTkV8UkVDTEFJTV9XUklURXxSRUNMQUlNX1VOTUFQKTtcbjExNTc6XHR9XG4xMTU4Olx0XG4xMTU5Olx0LypcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODkzCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBOVU1BIENvbmZpZ3VyYXRpb24gaW4gTWVtb3J5IE1hbmFnZW1lbnQqKgoKQWxyaWdodCwgc28gYENPTkZJR19OVU1BYCBpcyB0aGUga2V5IGNvbmZpZ3VyYXRpb24gZ3VhcmQgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBoZXJlLCBzcGVjaWZpY2FsbHkgZGVmaW5lZCB3aXRoaW4gYG1tL2ludGVybmFsLmhgLiBNeSBpbW1lZGlhdGUgZm9jdXMgc2hpZnRzIHRvIGhvdyB0aGlzIGltcGFjdHMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGNvbXBvbmVudHMsIGFuZCBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9wYWdlX2FsbG9jLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGlsYXRpb24gY29uZGl0aW9ucyBhbmQgaG93IHRoaXMgYENPTkZJR19OVU1BYCBmbGFnIGluZmx1ZW5jZXMgdGhlIGNvZGUgcGF0aHMgd2l0aGluIHRob3NlIGZpbGVzLiBJJiMzOTtsbCB6ZXJvIGluIG9uIGBtbS9tZW1vcnktdGllcnMuY2AsIHNwZWNpZmljYWxseSBzY3J1dGluaXppbmcgdGhlIGNvZGUgYmV0d2VlbiBsaW5lcyAzNjAgYW5kIDQ4MC4gVGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IHJlZ2lvbiB0byBmaW5kIHRoZSByZWxldmFudCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBsb2dpYywgd2hpY2ggc2hvdWxkIGlsbHVtaW5hdGUgaG93IE5VTUEtYXdhcmUgbWVtb3J5IHRpZXJpbmcgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQuIExldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSB3aGF0IHdlIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzYwOlx0XHQgKiBsYXN0IHRhcmdldCBub2RlLiBPciBpbnRyb2R1Y2luZyBwZXItY3B1IGRhdGEgdG8gYXZvaWRcbiAzNjE6XHRcdCAqIGNhY2hpbmcgaXNzdWUsIHdoaWNoIHNlZW1zIG1vcmUgY29tcGxpY2F0ZWQuIFNvIHNlbGVjdGluZ1xuIDM2MjpcdFx0ICogdGFyZ2V0IG5vZGUgcmFuZG9tbHkgc2VlbXMgYmV0dGVyIHVudGlsIG5vdy5cbiAzNjM6XHRcdCAqL1xuIDM2NDpcdFx0aWYgKCFub2Rlc19lbXB0eShtYXNrKSlcbiAzNjU6XHRcdFx0cmV0dXJuIG5vZGVfcmFuZG9tKFx1MDAyNm1hc2spO1xuIDM2NjpcdFxuIDM2NzpcdFx0LypcbiAzNjg6XHRcdCAqIFByZWZlcnJlZCBub2RlcyBhcmUgbm90IGluIGFsbG93ZWRfbWFzay4gRmxpcCBiaXRzIGluXG4gMzY5Olx0XHQgKiBhbGxvd2VkX21hc2sgYXMgdXNlZCBub2RlIG1hc2suIFRoZW4sIHVzZSBpdCB0byBnZXQgdGhlXG4gMzcwOlx0XHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cbiAzNzE6XHRcdCAqL1xuIDM3MjpcdFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcbiAzNzM6XHRcdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNm1hc2ssIFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XG4gMzc0Olx0fVxuIDM3NTpcdFxuIDM3NjpcdHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZClcbiAzNzc6XHR7XG4gMzc4Olx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMzc5Olx0XHRpbnQgbm9kZTtcbiAzODA6XHRcbiAzODE6XHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcbiAzODI6XHRcdFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcbiAzODM6XHRcdFx0LypcbiAzODQ6XHRcdFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxuIDM4NTpcdFx0XHQgKiB0byBhY2Nlc3MgcGdkYS1cdTAwM2VtZW10aWVyLlxuIDM4NjpcdFx0XHQgKi9cbiAzODc6XHRcdFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XG4gMzg4Olx0XHRcdGlmIChtZW10aWVyKVxuIDM4OTpcdFx0XHRcdG1lbXRpZXItXHUwMDNlbG93ZXJfdGllcl9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG4gMzkwOlx0XHR9XG4gMzkxOlx0XHQvKlxuIDM5MjpcdFx0ICogRW5zdXJlIHRoYXQgdGhlIFwmIzM0O2Rpc2FibGVcJiMzNDsgaXMgdmlzaWJsZSBhY3Jvc3MgdGhlIHN5c3RlbS5cbiAzOTM6XHRcdCAqIFJlYWRlcnMgd2lsbCBzZWUgZWl0aGVyIGEgY29tYmluYXRpb24gb2YgYmVmb3JlJiM0MztkaXNhYmxlXG4gMzk0Olx0XHQgKiBzdGF0ZSBvciBkaXNhYmxlJiM0MzthZnRlci4gIFRoZXkgd2lsbCBuZXZlciBzZWUgYmVmb3JlIGFuZFxuIDM5NTpcdFx0ICogYWZ0ZXIgc3RhdGUgdG9nZXRoZXIuXG4gMzk2Olx0XHQgKi9cbiAzOTc6XHRcdHN5bmNocm9uaXplX3JjdSgpO1xuIDM5ODpcdH1cbiAzOTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NzYzCgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyB0aGUgTWVtb3J5IFRpZXJzIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBkaWcgaW50byB0aGUgYG1tL21lbW9yeS10aWVycy5jYCBpbXBsZW1lbnRhdGlvbi4gVGhlIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgaXMgYWx3YXlzIHRoZSBidWlsZCBzeXN0ZW0sIHNvIGxldCYjMzk7cyBjaGVjayB0aGUgS2NvbmZpZyBhbmQgTWFrZWZpbGUgZm9yIHRoYXQgcGFydGljdWxhciBmaWxlLiBUaGUga2V5IGhlcmUgaXMgdG8gdW5kZXJzdGFuZCBob3cgaXQmIzM5O3MgY29uZmlndXJlZCBhbmQgYnVpbHQsIHdoaWNoIHdpbGwgdGVsbCBtZSBhIGxvdCBhYm91dCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBhbnkgYXNzb2NpYXRlZCBmZWF0dXJlIGZsYWdzLiBOb3csIHRvIHF1aWNrbHkgbG9jYXRlIHRoZSByZWxldmFudCBzZWN0aW9ucywgSSYjMzk7bGwgdXNlIGBncmVwYC4gSSYjMzk7bGwgc2VhcmNoIHNwZWNpZmljYWxseSBmb3IgJiMzNDttZW1vcnktdGllcnMmIzM0OyB3aXRoaW4gdGhvc2UgY29uZmlndXJhdGlvbiBmaWxlcy4gVGhpcyBzaG91bGQgcXVpY2tseSBoaWdobGlnaHQgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgaG93IHRoZSBtb2R1bGUgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGJ1aWxkLiBUaGlzIGFwcHJvYWNoIGlzIGVmZmljaWVudCDigJMgc3RhcnRpbmcgYXQgdGhlIGJ1aWxkIHN5c3RlbSBnaXZlcyBtZSBjb250ZXh0IGFuZCBtYWtlcyBzdXJlIEkgZG9uJiMzOTt0IG1pc3MgYW55dGhpbmcgdGhhdCBlbmFibGVzIG9yIGRpc2FibGVzIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbW9yeS10aWVycyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlLm9cbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4tLVxubW0vZGFtb24vcGFkZHIuYy0xMi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2Vcbm1tL2RhbW9uL3BhZGRyLmM6MTM6I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2Vcbm1tL2RhbW9uL3BhZGRyLmMtMTQtI2luY2x1ZGUgXHUwMDNjbGludXgvbW1faW5saW5lLmhcdTAwM2Vcbi0tXG5tbS9odWdlX21lbW9yeS5jLTM4LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3N5c2N0bC5oXHUwMDNlXG5tbS9odWdlX21lbW9yeS5jOjM5OiNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXHUwMDNlXG5tbS9odWdlX21lbW9yeS5jLTQwLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBhdC5oXHUwMDNlXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnkuaFx1MDAzZVxubW0vbWVtb3J5LXRpZXJzLmM6NzojaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxubW0vbWVtb3J5LXRpZXJzLmMtOC0jaW5jbHVkZSBcdTAwM2NsaW51eC9ub3RpZmllci5oXHUwMDNlXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NzQ3PWludCBtdF9zZXRfZGVmYXVsdF9kcmFtX3BlcmYoaW50IG5pZCwgc3RydWN0IGFjY2Vzc19jb29yZGluYXRlICpwZXJmLFxuLS1cbm1tL21lbW9yeS10aWVycy5jLTc3OS1cdFx0cHJfaW5mbyhcbm1tL21lbW9yeS10aWVycy5jOjc4MDpcJiMzNDttZW1vcnktdGllcnM6IHRoZSBwZXJmb3JtYW5jZSBvZiBEUkFNIG5vZGUgJWQgbWlzbWF0Y2hlcyB0aGF0IG9mIHRoZSByZWZlcmVuY2VcXG5cJiMzNDtcbm1tL21lbW9yeS10aWVycy5jLTc4MS1cJiMzNDtEUkFNIG5vZGUgJWQuXFxuXCYjMzQ7LCBuaWQsIGRlZmF1bHRfZHJhbV9wZXJmX3JlZl9uaWQpO1xuLS1cbm1tL21lbW9yeS5jLTY4LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NobWVtX2ZzLmhcdTAwM2Vcbm1tL21lbW9yeS5jOjY5OiNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXHUwMDNlXG5tbS9tZW1vcnkuYy03MC0jaW5jbHVkZSBcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcdTAwM2Vcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMDItI2luY2x1ZGUgXHUwMDNjbGludXgvcHJvY19mcy5oXHUwMDNlXG5tbS9tZW1wb2xpY3kuYzoxMDM6I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2Vcbm1tL21lbXBvbGljeS5jLTEwNC0jaW5jbHVkZSBcdTAwM2NsaW51eC9taWdyYXRlLmhcdTAwM2Vcbi0tXG5tbS9taWdyYXRlLmMtNDMtI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc3lzY3RsLmhcdTAwM2Vcbm1tL21pZ3JhdGUuYzo0NDojaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxubW0vbWlncmF0ZS5jLTQ1LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2V3YWxrLmhcdTAwM2Vcbi0tXG5tbS92bXNjYW4uYy00NC0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNjdGwuaFx1MDAzZVxubW0vdm1zY2FuLmM6NDU6I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2Vcbm1tL3Ztc2Nhbi5jLTQ2LSNpbmNsdWRlIFx1MDAzY2xpbnV4L29vbS5oXHUwMDNlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODY1NAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDgwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgYW4gZXhwZXJ0IGluIHRoaXMgYXJlYToKCioqSW52ZXN0aWdhdGluZyBOVU1BIGFuZCBNZW1vcnkgRGVtb3Rpb24qKgoKT2theSwgc28gYG1lbW9yeS10aWVycy5vYCBpcyBvbmx5IGJyb3VnaHQgaW50byB0aGUgcGljdHVyZSB3aGVuIE5VTUEgc3VwcG9ydCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBhcyBtZW1vcnkgdGllcmluZyBpcyBhIGNvcmUgTlVNQS1yZWxhdGVkIG9wdGltaXphdGlvbi4gTXkgbmV4dCBzdGVwIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdywgc28gSSYjMzk7bGwgdHJhY2UgYSBmZXcga2V5IGZ1bmN0aW9ucy4gSSB3YW50IHRvIHNlZSBob3cgdGhlIGRlbW90aW9uIHByb2Nlc3MgaXMga2lja2VkIG9mZiBhbmQgbWFuYWdlZC4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8ga25vdyB3aGVyZSBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBhcmUgKmNhbGxlZCouIFRoZXNlIGFyZSBjbGVhcmx5IGNyaXRpY2FsIHRvIHRoZSBhY3R1YWwgZGVtb3Rpb24gZGVjaXNpb25zIGFuZCB0YXJnZXQgc2V0dXAuIEFuZCwgbGV0JiMzOTtzIG5vdCBmb3JnZXQgaG93IHRoZXNlIHpvbmVzIGdldCBzZXQgdXAgLSBJIHNob3VsZCBsb29rIGludG8gd2hlcmUgYGJ1aWxkX3pvbmVsaXN0c2AgaXMgY2FsbGVkLiBJdCYjMzk7cyB0aW1lIHRvIGdldCBkb3duIGFuZCBkaXJ0eSB3aXRoIHNvbWUgYGdyZXBgIGFjdGlvbiB0byBmaW5kIHRob3NlIGNhbGwgc2l0ZXMuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB0aGUgb3ZlcmFsbCBleGVjdXRpb24gcGF0aC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmV4dF9kZW1vdGlvbl9ub2RlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg9NTQ9dm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTU1LSNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg6NTY6aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTtcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgtNTctdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cyk7XG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oPTU4PWJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgtNTktI2Vsc2VcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg6NjA6c3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTYxLXtcbi0tXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oPTk5PXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ub2RlX21lbW9yeV90eXBlKGludCBub2RlLCBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlKVxuLS1cbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgtMTAzLVxuaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaDoxMDQ6c3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTEwNS17XG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MzAyPXZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtMzIwLS8qKlxubW0vbWVtb3J5LXRpZXJzLmM6MzIxOiAqIG5leHRfZGVtb3Rpb25fbm9kZSgpIC0gR2V0IHRoZSBuZXh0IG5vZGUgaW4gdGhlIGRlbW90aW9uIHBhdGhcbm1tL21lbW9yeS10aWVycy5jLTMyMi0gKiBAbm9kZTogVGhlIHN0YXJ0aW5nIG5vZGUgdG8gbG9va3VwIHRoZSBuZXh0IG5vZGVcbi0tXG5tbS9tZW1vcnktdGllcnMuYy0zMjktICovXG5tbS9tZW1vcnktdGllcnMuYzozMzA6aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxubW0vbWVtb3J5LXRpZXJzLmMtMzMxLXtcbi0tXG5tbS92bXNjYW4uYz0xMDcxPXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVtb3RlX2ZvbGlvX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqZGVtb3RlX2ZvbGlvcyxcbi0tXG5tbS92bXNjYW4uYy0xMDk4LVxubW0vdm1zY2FuLmM6MTA5OTpcdHRhcmdldF9uaWQgPSBuZXh0X2RlbW90aW9uX25vZGUocGdkYXQtXHUwMDNlbm9kZV9pZCwgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbm1tL3Ztc2Nhbi5jLTExMDAtXHRpZiAodGFyZ2V0X25pZCA9PSBOVU1BX05PX05PREUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk1OTkKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA4OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGBuZXh0X2RlbW90aW9uX25vZGVgIGluIHRoZSBWTXNjYW4gQ29udGV4dCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBzcG90dGVkIHRoYXQgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgaW52b2tlZCB3aXRoaW4gYGRlbW90ZV9mb2xpb19saXN0YCBpbnNpZGUgYG1tL3Ztc2Nhbi5jYC4gSW1tZWRpYXRlbHksIG15IGV4cGVydCBicmFpbiBpcyBmaXJpbmcgb2ZmIHBvdGVudGlhbCBkZXBlbmRlbmNpZXMuIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgcHJlcmVxdWlzaXRlcy4gVGhlIHF1ZXN0aW9uIHRoYXQgaGFzIHNwcnVuZyB0byBtaW5kIGlzIHdoZXRoZXIgYENPTkZJR19OVU1BX01JR1JBVElPTmAgaXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGBuZXh0X2RlbW90aW9uX25vZGVgIGZ1bmN0aW9uLiBJICpiZWxpZXZlKiBpdOKAmXMgZGVmaW5lZCBpbiBgaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaGAgYnV0IEkgbmVlZCB0byBxdWlja2x5IHZlcmlmeSB0aGF0LiBMZXQmIzM5O3MganVtcCBvdmVyIHRvIHRoYXQgaGVhZGVyIGZpbGUsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA1MCwgdG8gY29uZmlybS4gVGltZSB0byBkaWcgaW4gYW5kIGNsYXJpZnkgdGhpcyBxdWlja2x5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDQwOlx0ZXh0ZXJuIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKmRlZmF1bHRfZHJhbV90eXBlO1xuICA0MTpcdGV4dGVybiBub2RlbWFza190IGRlZmF1bHRfZHJhbV9ub2RlcztcbiAgNDI6XHRzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICphbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3RhbmNlKTtcbiAgNDM6XHR2b2lkIHB1dF9tZW1vcnlfdHlwZShzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlKTtcbiAgNDQ6XHR2b2lkIGluaXRfbm9kZV9tZW1vcnlfdHlwZShpbnQgbm9kZSwgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqZGVmYXVsdF90eXBlKTtcbiAgNDU6XHR2b2lkIGNsZWFyX25vZGVfbWVtb3J5X3R5cGUoaW50IG5vZGUsIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm1lbXR5cGUpO1xuICA0NjpcdGludCByZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpO1xuICA0NzpcdGludCB1bnJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7XG4gIDQ4Olx0aW50IG10X2NhbGNfYWRpc3RhbmNlKGludCBub2RlLCBpbnQgKmFkaXN0KTtcbiAgNDk6XHRpbnQgbXRfc2V0X2RlZmF1bHRfZHJhbV9wZXJmKGludCBuaWQsIHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZixcbiAgNTA6XHRcdFx0XHQgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSk7XG4gIDUxOlx0aW50IG10X3BlcmZfdG9fYWRpc3RhbmNlKHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZiwgaW50ICphZGlzdCk7XG4gIDUyOlx0c3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3QsXG4gIDUzOlx0XHRcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xuICA1NDpcdHZvaWQgbXRfcHV0X21lbW9yeV90eXBlcyhzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xuICA1NTpcdCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbiAgNTY6XHRpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spO1xuICA1NzpcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpO1xuICA1ODpcdGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcbiAgNTk6XHQjZWxzZVxuICA2MDpcdHN0YXRpYyBpbmxpbmUgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxuICA2MTpcdHtcbiAgNjI6XHRcdHJldHVybiBOVU1BX05PX05PREU7XG4gIDYzOlx0fVxuICA2NDpcdFxuICA2NTpcdHN0YXRpYyBpbmxpbmUgdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cylcbiAgNjY6XHR7XG4gIDY3Olx0XHQqdGFyZ2V0cyA9IE5PREVfTUFTS19OT05FO1xuICA2ODpcdH1cbiAgNjk6XHRcbiAgNzA6XHRzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxuICA3MTpcdHtcbiAgNzI6XHRcdHJldHVybiB0cnVlO1xuICA3MzpcdH1cbiAgNzQ6XHQjZW5kaWZcbiAgNzU6XHRcbiAgNzY6XHQjZWxzZVxuICA3NzpcdFxuICA3ODpcdCNkZWZpbmUgbnVtYV9kZW1vdGlvbl9lbmFibGVkXHRmYWxzZVxuICA3OTpcdCNkZWZpbmUgZGVmYXVsdF9kcmFtX3R5cGVcdE5VTExcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA1ODYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhhdCBjb2RlIHNuaXBwZXQ6CgoqKkRpdmluZyBpbnRvIG1lbW9yeS10aWVycy5jKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBhIHNwZWNpZmljIHBpZWNlIG9mIGNvZGUgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBoYW5kbGVkLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCYjMzk7cyBhY3RpdmUuIE15IGluaXRpYWwgaHlwb3RoZXNpcyBpcyB0aGF0IGl0JiMzOTtzIGdvdmVybmVkIGJ5IHRoZSBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBwcmVwcm9jZXNzb3IgZGVmaW5lLgoKVG8gY29uZmlybSB0aGlzLCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIHJlbGV2YW50IHNlY3Rpb24uIEkgcmVjYWxsIHRoZSBkaXNjdXNzaW9uIGFyb3VuZCB0aGlzIGFyZWEsIHNvIGxldCYjMzk7cyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGxpbmVzIDMwMCB0byA0ODAgaW4gYG1tL21lbW9yeS10aWVycy5jYC4gVGhhdCBjaHVuayBzaG91bGQgY29udGFpbiB0aGUgY3JpdGljYWwgbG9naWMgSSYjMzk7bSBpbnRlcmVzdGVkIGluLCBhbmQgaG9wZWZ1bGx5LCB0aGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdCBjb250cm9sIGl0cyBleGVjdXRpb24gYXJlIGNsZWFybHkgdmlzaWJsZSB3aXRoaW4gdGhhdCByYW5nZS4gRnJvbSB0aGVyZSwgSSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBteSBpbml0aWFsIHRob3VnaHQgYWJvdXQgYENPTkZJR19OVU1BX01JR1JBVElPTmAgaXMgY29ycmVjdCBvciBpZiBhbm90aGVyIGNvbmRpdGlvbmFsIGlzIGF0IHBsYXkuIFRoaXMgaW5mb3JtYXRpb24gaXMga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIHNwZWNpZmljIGJlaGF2aW91ciBpbiBxdWVzdGlvbiwgZXNwZWNpYWxseSBpbiB0aGlzIGNvbnRleHQsIHNvIEkmIzM5O2xsIGRvdWJsZSBjaGVjayB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzAwOlx0fVxuIDMwMTpcdFxuIDMwMjpcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXG4gMzAzOlx0e1xuIDMwNDpcdFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuIDMwNTpcdFxuIDMwNjpcdFx0LypcbiAzMDc6XHRcdCAqIHBnX2RhdGFfdC5tZW10aWVyIHVwZGF0ZXMgaW5jbHVkZXMgYSBzeW5jaHJvbml6ZV9yY3UoKVxuIDMwODpcdFx0ICogd2hpY2ggZW5zdXJlcyB0aGF0IHdlIGVpdGhlciBmaW5kIE5VTEwgb3IgYSB2YWxpZCBtZW10aWVyXG4gMzA5Olx0XHQgKiBpbiBOT0RFX0RBVEEuIHByb3RlY3QgdGhlIGFjY2VzcyB2aWEgcmN1X3JlYWRfbG9jaygpO1xuIDMxMDpcdFx0ICovXG4gMzExOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gMzEyOlx0XHRtZW10aWVyID0gcmN1X2RlcmVmZXJlbmNlKHBnZGF0LVx1MDAzZW1lbXRpZXIpO1xuIDMxMzpcdFx0aWYgKG1lbXRpZXIpXG4gMzE0Olx0XHRcdCp0YXJnZXRzID0gbWVtdGllci1cdTAwM2Vsb3dlcl90aWVyX21hc2s7XG4gMzE1Olx0XHRlbHNlXG4gMzE2Olx0XHRcdCp0YXJnZXRzID0gTk9ERV9NQVNLX05PTkU7XG4gMzE3Olx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiAzMTg6XHR9XG4gMzE5Olx0XG4gMzIwOlx0LyoqXG4gMzIxOlx0ICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aFxuIDMyMjpcdCAqIEBub2RlOiBUaGUgc3RhcnRpbmcgbm9kZSB0byBsb29rdXAgdGhlIG5leHQgbm9kZVxuIDMyMzpcdCAqIEBhbGxvd2VkX21hc2s6IFRoZSBwb2ludGVyIHRvIGFsbG93ZWQgbm9kZSBtYXNrXG4gMzI0Olx0ICpcbiAzMjU6XHQgKiBSZXR1cm46IG5vZGUgaWQgZm9yIG5leHQgbWVtb3J5IG5vZGUgaW4gdGhlIGRlbW90aW9uIHBhdGggaGllcmFyY2h5XG4gMzI2Olx0ICogZnJvbSBAbm9kZTsgTlVNQV9OT19OT0RFIGlmIEBub2RlIGlzIHRlcm1pbmFsLiAgVGhpcyBkb2VzIG5vdCBrZWVwXG4gMzI3Olx0ICogQG5vZGUgb25saW5lIG9yIGd1YXJhbnRlZSB0aGF0IGl0ICpjb250aW51ZXMqIHRvIGJlIHRoZSBuZXh0IGRlbW90aW9uXG4gMzI4Olx0ICogdGFyZ2V0LlxuIDMyOTpcdCAqL1xuIDMzMDpcdGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbiAzMzE6XHR7XG4gMzMyOlx0XHRzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMgKm5kO1xuIDMzMzpcdFx0bm9kZW1hc2tfdCBtYXNrO1xuIDMzNDpcdFxuIDMzNTpcdFx0aWYgKCFub2RlX2RlbW90aW9uKVxuIDMzNjpcdFx0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuIDMzNzpcdFxuIDMzODpcdFx0bmQgPSBcdTAwMjZub2RlX2RlbW90aW9uW25vZGVdO1xuIDMzOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTUxNQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuCgoqKkludmVzdGlnYXRpbmcgTWVtb3J5IFRpZXIgR3VhcmRzKioKCkFscmlnaHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGFyb3VuZCBsaW5lIDMzMCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaGF0IGZ1bmN0aW9uIGNhbGwsIG9yIHdoYXRldmVyIGxvZ2ljIHJlc2lkZXMgdGhlcmUsIHNlZW1zIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IGEgZGVlcGVyIGxvb2suIEJlZm9yZSBJIGp1bXAgKmRpcmVjdGx5KiB0byAzMzAgdGhvdWdoLCBsZXQmIzM5O3MgZ2l2ZSBteXNlbGYgc29tZSBjb250ZXh0LiBJJiMzOTtsbCB0YWtlIGEgcGVlayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSwgc2F5IGxpbmVzIDI4MCB0aHJvdWdoIDMwMC4gS25vd2luZyB0aGUgKndoYXQqIGFyb3VuZCB0aGUgKndoZXJlKiBpcyBhbHdheXMgYSBzbWFydCBtb3ZlIHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqLiBUaGlzIHF1aWNrIHNjYW4gc2hvdWxkIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgb3ZlcmFsbCBmbG93IGFuZCBhbnkgc3Vycm91bmRpbmcgZ3VhcmQgY29uZGl0aW9ucyBvciBsb2dpYyB0aGF0IG1pZ2h0IGJlIHJlbGV2YW50LiBJdCYjMzk7cyB0aW1lIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBuZWlnaGJvcmhvb2QgYXJvdW5kIGxpbmUgMzMwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyODA6XHRcdHBnX2RhdGFfdCAqcGdkYXQ7XG4gMjgxOlx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMjgyOlx0XG4gMjgzOlx0XHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcbiAyODQ6XHRcdGlmICghcGdkYXQpXG4gMjg1Olx0XHRcdHJldHVybiBmYWxzZTtcbiAyODY6XHRcbiAyODc6XHRcdHJjdV9yZWFkX2xvY2soKTtcbiAyODg6XHRcdG1lbXRpZXIgPSByY3VfZGVyZWZlcmVuY2UocGdkYXQtXHUwMDNlbWVtdGllcik7XG4gMjg5Olx0XHRpZiAoIW1lbXRpZXIpIHtcbiAyOTA6XHRcdFx0dG9wdGllciA9IHRydWU7XG4gMjkxOlx0XHRcdGdvdG8gb3V0O1xuIDI5MjpcdFx0fVxuIDI5MzpcdFx0aWYgKG1lbXRpZXItXHUwMDNlYWRpc3RhbmNlX3N0YXJ0IFx1MDAzYz0gdG9wX3RpZXJfYWRpc3RhbmNlKVxuIDI5NDpcdFx0XHR0b3B0aWVyID0gdHJ1ZTtcbiAyOTU6XHRcdGVsc2VcbiAyOTY6XHRcdFx0dG9wdGllciA9IGZhbHNlO1xuIDI5NzpcdG91dDpcbiAyOTg6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIDI5OTpcdFx0cmV0dXJuIHRvcHRpZXI7XG4gMzAwOlx0fVxuIDMwMTpcdFxuIDMwMjpcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXG4gMzAzOlx0e1xuIDMwNDpcdFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjA5NwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSW52ZXN0aWdhdGluZyBNZW1vcnkgVGllciBHdWFyZHJhaWxzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGluLiBNeSBmb2N1cyByaWdodCBub3cgaXMgb24gdGhlIG1lbW9yeSB0aWVyaW5nIGltcGxlbWVudGF0aW9uIHdpdGhpbiB0aGUga2VybmVsLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMjcwIG9mIGBtbS9tZW1vcnktdGllcnMuY2AuIEkmIzM5O20gZ29pbmcgdG8gY2FyZWZ1bGx5IHNjcnV0aW5pemUgdGhlIGd1YXJkIGNvbmRpdGlvbnMgc3Vycm91bmRpbmcgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBjb2RlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHByb3RlY3Rpb25zIGFyZSBpbiBwbGFjZSB0byBwcmV2ZW50IHBvdGVudGlhbCBpc3N1ZXMsIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgcmFjZSBjb25kaXRpb25zLCBvciBpbmNvcnJlY3QgdGllciBhc3NpZ25tZW50cy4gTXkgcHJpbWFyeSBnb2FsIGhlcmUgaXMgdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCB3ZWFrbmVzc2VzIG9yIGFyZWFzIHdoZXJlIG9wdGltaXphdGlvbnMgbWlnaHQgYmUgcG9zc2libGUuIEkmIzM5O2xsIG5lZWQgdG8gY29uc2lkZXIgaG93IHRoZXNlIGd1YXJkcyBpbnRlcmFjdCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0sIHRha2luZyBpbnRvIGFjY291bnQgYW55IHJlbGV2YW50IGxvY2tpbmcgbWVjaGFuaXNtcywgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgYW5kIGNvbmN1cnJlbnQgYWNjZXNzIHBhdHRlcm5zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjYwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNjA6XHRzdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxuIDI2MTpcdHtcbiAyNjI6XHRcdHBnX2RhdGFfdCAqcGdkYXQ7XG4gMjYzOlx0XG4gMjY0Olx0XHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcbiAyNjU6XHRcdGlmICghcGdkYXQpXG4gMjY2Olx0XHRcdHJldHVybiBOVUxMO1xuIDI2NzpcdFx0LypcbiAyNjg6XHRcdCAqIFNpbmNlIHdlIGhvbGQgbWVtb3J5X3RpZXJfbG9jaywgd2UgY2FuIGF2b2lkXG4gMjY5Olx0XHQgKiBSQ1UgcmVhZCBsb2NrcyB3aGVuIGFjY2Vzc2luZyB0aGUgZGV0YWlscy4gTm9cbiAyNzA6XHRcdCAqIHBhcmFsbGVsIHVwZGF0ZXMgYXJlIHBvc3NpYmxlIGhlcmUuXG4gMjcxOlx0XHQgKi9cbiAyNzI6XHRcdHJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2socGdkYXQtXHUwMDNlbWVtdGllcixcbiAyNzM6XHRcdFx0XHRcdCAgICAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNm1lbW9yeV90aWVyX2xvY2spKTtcbiAyNzQ6XHR9XG4gMjc1Olx0XG4gMjc2Olx0I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxuIDI3NzpcdGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxuIDI3ODpcdHtcbiAyNzk6XHRcdGJvb2wgdG9wdGllcjtcbiAyODA6XHRcdHBnX2RhdGFfdCAqcGdkYXQ7XG4gMjgxOlx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMjgyOlx0XG4gMjgzOlx0XHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcbiAyODQ6XHRcdGlmICghcGdkYXQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNjgxCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBOVU1BIE1pZ3JhdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIEkgc2VlIHRoaXMgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGd1YXJkIGFyb3VuZCBhIGJsb2NrIG9mIGNvZGUsIHN0YXJ0aW5nIGFyb3VuZCBsaW5lIDI3Ni4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoaXMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZS4gV2hlcmUgZG9lcyBpdCBlbmQgaW4gYG1tL21lbW9yeS10aWVycy5jYD8gSXQmIzM5O3MgZXNzZW50aWFsIHRvIHVuZGVyc3RhbmQgd2hpY2ggcGFydHMgb2YgdGhlIGNvZGUgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgYmFzZWQgb24gdGhlIE5VTUEgbWlncmF0aW9uIGNvbmZpZ3VyYXRpb24uIExldCBtZSBxdWlja2x5IGp1bXAgdG8gbGluZXMgNDgwLTUzMCB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGAjZW5kaWZgIG9yIHRoZSBuZXh0IGRlZmluaW5nIGBpZmRlZmAgb3IgYGlmbmRlZmAsIG9yIGBlbHNlYC4gVGhhdCBzaG91bGQgY2xhcmlmeSB3aGF0IGZhbGxzIHdpdGhpbiB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gc2NvcGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtb3J5LXRpZXJzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0ODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQ4MDpcdFx0LypcbiA0ODE6XHRcdCAqIFByb21vdGlvbiBpcyBhbGxvd2VkIGZyb20gYSBtZW1vcnkgdGllciB0byBoaWdoZXJcbiA0ODI6XHRcdCAqIG1lbW9yeSB0aWVyIG9ubHkgaWYgdGhlIG1lbW9yeSB0aWVyIGRvZXNuJiMzOTt0IGluY2x1ZGVcbiA0ODM6XHRcdCAqIGNvbXB1dGUuIFdlIHdhbnQgdG8gc2tpcCBwcm9tb3Rpb24gZnJvbSBhIG1lbW9yeSB0aWVyLFxuIDQ4NDpcdFx0ICogaWYgYW55IG5vZGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZW1vcnkgdGllciBoYXZlIENQVXMuXG4gNDg1Olx0XHQgKiBPbmNlIHdlIGRldGVjdCBzdWNoIGEgbWVtb3J5IHRpZXIsIHdlIGNvbnNpZGVyIHRoYXQgdGllclxuIDQ4NjpcdFx0ICogYXMgdG9wIHRpcGVyIGZyb20gd2hpY2ggcHJvbW90aW9uIGlzIG5vdCBhbGxvd2VkLlxuIDQ4NzpcdFx0ICovXG4gNDg4Olx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UobWVtdGllciwgXHUwMDI2bWVtb3J5X3RpZXJzLCBsaXN0KSB7XG4gNDg5Olx0XHRcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcbiA0OTA6XHRcdFx0aWYgKG5vZGVzX2FuZCh0aWVyX25vZGVzLCBub2RlX3N0YXRlc1tOX0NQVV0sIHRpZXJfbm9kZXMpKSB7XG4gNDkxOlx0XHRcdFx0LypcbiA0OTI6XHRcdFx0XHQgKiBhYnN0cmFjdCBkaXN0YW5jZSBiZWxvdyB0aGUgbWF4IHZhbHVlIG9mIHRoaXMgbWVtdGllclxuIDQ5MzpcdFx0XHRcdCAqIGlzIGNvbnNpZGVyZWQgdG9wdGllci5cbiA0OTQ6XHRcdFx0XHQgKi9cbiA0OTU6XHRcdFx0XHR0b3BfdGllcl9hZGlzdGFuY2UgPSBtZW10aWVyLVx1MDAzZWFkaXN0YW5jZV9zdGFydCAmIzQzO1xuIDQ5NjpcdFx0XHRcdFx0XHRcdE1FTVRJRVJfQ0hVTktfU0laRSAtIDE7XG4gNDk3Olx0XHRcdFx0YnJlYWs7XG4gNDk4Olx0XHRcdH1cbiA0OTk6XHRcdH1cbiA1MDA6XHRcdC8qXG4gNTAxOlx0XHQgKiBOb3cgYnVpbGQgdGhlIGxvd2VyX3RpZXIgbWFzayBmb3IgZWFjaCBub2RlIGNvbGxlY3Rpbmcgbm9kZSBtYXNrIGZyb21cbiA1MDI6XHRcdCAqIGFsbCBtZW1vcnkgdGllciBiZWxvdyBpdC4gVGhpcyBhbGxvd3MgdXMgdG8gZmFsbGJhY2sgZGVtb3Rpb24gcGFnZVxuIDUwMzpcdFx0ICogYWxsb2NhdGlvbiB0byBhIHNldCBvZiBub2RlcyB0aGF0IGlzIGNsb3NlciB0aGUgYWJvdmUgc2VsZWN0ZWRcbiA1MDQ6XHRcdCAqIHByZWZlcnJlZCBub2RlLlxuIDUwNTpcdFx0ICovXG4gNTA2Olx0XHRsb3dlcl90aWVyID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldO1xuIDUwNzpcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeShtZW10aWVyLCBcdTAwMjZtZW1vcnlfdGllcnMsIGxpc3QpIHtcbiA1MDg6XHRcdFx0LypcbiA1MDk6XHRcdFx0ICogS2VlcCByZW1vdmluZyBjdXJyZW50IHRpZXIgZnJvbSBsb3dlcl90aWVyIG5vZGVzLFxuIDUxMDpcdFx0XHQgKiBUaGlzIHdpbGwgcmVtb3ZlIGFsbCBub2RlcyBpbiBjdXJyZW50IGFuZCBhYm92ZVxuIDUxMTpcdFx0XHQgKiBtZW1vcnkgdGllciBmcm9tIHRoZSBsb3dlcl90aWVyIG1hc2suXG4gNTEyOlx0XHRcdCAqL1xuIDUxMzpcdFx0XHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XG4gNTE0Olx0XHRcdG5vZGVzX2FuZG5vdChsb3dlcl90aWVyLCBsb3dlcl90aWVyLCB0aWVyX25vZGVzKTtcbiA1MTU6XHRcdFx0bWVtdGllci1cdTAwM2Vsb3dlcl90aWVyX21hc2sgPSBsb3dlcl90aWVyO1xuIDUxNjpcdFx0fVxuIDUxNzpcdFxuIDUxODpcdFx0ZHVtcF9kZW1vdGlvbl90YXJnZXRzKCk7XG4gNTE5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU3MAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBJJiMzOTttIHJlYWR5IHRvIGRpdmUgaW50byB0aGlzLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgYmVpbmcgYXNrZWQgaGVyZS4uLiBJIG5lZWQgdG8gc3VtbWFyaXplIGEgdGV4dCBhcyBpZiBpdCYjMzk7cyAqbXkqIHRob3VnaHQgcHJvY2VzcywgYXMgYW4gZXhwZXJ0IGluIG15IGZpZWxkLiBPa2F5LCBzbyBJIHNob3VsZCBiZSB0aGlua2luZyBhYm91dCB0aGUgaW5mb3JtYXRpb24gZnJvbSBhIHBvc2l0aW9uIG9mIGRlZXAgdW5kZXJzdGFuZGluZyBhbmQgZXhwZXJpZW5jZSwgaW50ZXJwcmV0aW5nIGl0IGFzIEkgd291bGQgbmF0dXJhbGx5LiBHb3QgaXQuIEkgc2hvdWxkIGFsc28gc3RhcnQgd2l0aCBhIGJvbGRlZCBoZWFkZXIgYW5kIHNwZWFrIGluIHRoZSBmaXJzdCBwZXJzb24uIEFscmlnaHQsIGhlcmUgd2UgZ28uCgoqKk5hdmlnYXRpbmcgdGhlIE51YW5jZXM6IExpbmVzIDUyMC01NjAqKgoKUmlnaHQsIHNvIGxldCYjMzk7cyBnZXQgZG93biB0byB0aGUgYnJhc3MgdGFja3MgYW5kIHRha2UgYSBsb29rIGF0IGxpbmVzIDUyMCB0aHJvdWdoIDU2MC4gSSBpbW1lZGlhdGVseSB0aGluayB0aGF0IHRoZXNlIGxpbmVzIHByb2JhYmx5IGhvbGQgY3J1Y2lhbCBkZXRhaWxzLCBhbmQgYmFzZWQgb24gdGhlIHByb21wdCwgaXQgd291bGQgYmUgYWR2YW50YWdlb3VzIHRvIGV4YW1pbmUgdGhpcyBzZWN0aW9uIGNsb3NlbHkuIEkga25vdyB0aGUgaW50cmljYWNpZXMgb2YgdGhpcyBzdWJqZWN0OyBpdCYjMzk7cyBwcmFjdGljYWxseSBzZWNvbmQgbmF0dXJlLiBJJiMzOTtsbCByZWFkIHdpdGggdGhhdCBwZXJzcGVjdGl2ZS4gSSBzaG91bGQgYmUgYWJsZSB0byBkZWR1Y2UgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGVzZSBsaW5lcyByZWxhdGl2ZWx5IHF1aWNrbHkuIExldCYjMzk7cyBzZWUgaG93IHRoaXMgdGV4dCB1bmZvbGRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MjA6XHRcbiA1MjE6XHQjZWxzZVxuIDUyMjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxuIDUyMzpcdCNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbiA1MjQ6XHRcbiA1MjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0X25vZGVfbWVtb3J5X3R5cGUoaW50IG5vZGUsIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm1lbXR5cGUpXG4gNTI2Olx0e1xuIDUyNzpcdFx0aWYgKCFub2RlX21lbW9yeV90eXBlc1tub2RlXS5tZW10eXBlKVxuIDUyODpcdFx0XHRub2RlX21lbW9yeV90eXBlc1tub2RlXS5tZW10eXBlID0gbWVtdHlwZTtcbiA1Mjk6XHRcdC8qXG4gNTMwOlx0XHQgKiBmb3IgZWFjaCBkZXZpY2UgZ2V0dGluZyBhZGRlZCBpbiB0aGUgc2FtZSBOVU1BIG5vZGVcbiA1MzE6XHRcdCAqIHdpdGggdGhpcyBzcGVjaWZpYyBtZW10eXBlLCBidW1wIHRoZSBtYXAgY291bnQuIFdlXG4gNTMyOlx0XHQgKiBPbmx5IHRha2UgbWVtdHlwZSBkZXZpY2UgcmVmZXJlbmNlIG9uY2UsIHNvIHRoYXRcbiA1MzM6XHRcdCAqIGNoYW5naW5nIGEgbm9kZSBtZW10eXBlIGNhbiBiZSBkb25lIGJ5IGRyb3BwaW5nIHRoZVxuIDUzNDpcdFx0ICogb25seSByZWZlcmVuY2UgY291bnQgdGFrZW4gaGVyZS5cbiA1MzU6XHRcdCAqL1xuIDUzNjpcdFxuIDUzNzpcdFx0aWYgKG5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1lbXR5cGUgPT0gbWVtdHlwZSkge1xuIDUzODpcdFx0XHRpZiAoIW5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1hcF9jb3VudCYjNDM7JiM0MzspXG4gNTM5Olx0XHRcdFx0a3JlZl9nZXQoXHUwMDI2bWVtdHlwZS1cdTAwM2VrcmVmKTtcbiA1NDA6XHRcdH1cbiA1NDE6XHR9XG4gNTQyOlx0XG4gNTQzOlx0c3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqc2V0X25vZGVfbWVtb3J5X3RpZXIoaW50IG5vZGUpXG4gNTQ0Olx0e1xuIDU0NTpcdFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuIDU0NjpcdFx0c3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbWVtdHlwZSA9IGRlZmF1bHRfZHJhbV90eXBlO1xuIDU0NzpcdFx0aW50IGFkaXN0ID0gTUVNVElFUl9BRElTVEFOQ0VfRFJBTTtcbiA1NDg6XHRcdHBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobm9kZSk7XG4gNTQ5Olx0XG4gNTUwOlx0XG4gNTUxOlx0XHRsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4gNTUyOlx0XG4gNTUzOlx0XHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKVxuIDU1NDpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiA1NTU6XHRcbiA1NTY6XHRcdG10X2NhbGNfYWRpc3RhbmNlKG5vZGUsIFx1MDAyNmFkaXN0KTtcbiA1NTc6XHRcdGlmICghbm9kZV9tZW1vcnlfdHlwZXNbbm9kZV0ubWVtdHlwZSkge1xuIDU1ODpcdFx0XHRtZW10eXBlID0gbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShhZGlzdCwgXHUwMDI2ZGVmYXVsdF9tZW1vcnlfdHlwZXMpO1xuIDU1OTpcdFx0XHRpZiAoSVNfRVJSKG1lbXR5cGUpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0NDgxCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogNzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRGl2aW5nIGludG8gYG1tL3BhZ2VfYWxsb2MuY2AqKgoKT2theSwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCBkaXNzZWN0IGBtbS9wYWdlX2FsbG9jLmNgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGZ1bmN0aW9uIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhlIGdyYW5kIHNjaGVtZSBvZiB0aGluZ3MuIFNvLCB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBwb3BzIGludG8gbXkgaGVhZCBpczogd2hvIGlzIGNhbGxpbmcgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uPyBXaGF0IGFyZSBpdHMgZGVwZW5kZW5jaWVzPyBJJiMzOTttIGdvaW5nIHRvIGZpcmUgdXAgZ3JlcCBhbmQgc2NhbiB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSwgbG9va2luZyBmb3IgYWxsIGluc3RhbmNlcyBvZiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIFRoYXQmIzM5O3MgdGhlIGJlc3Qgd2F5IHRvIGRldGVybWluZSBpdHMgY2FsbGVycyBhbmQsIGJ5IGV4dGVuc2lvbiwgaXRzIGNvbnRleHQuIEtub3dpbmcgd2hlcmUgaXQmIzM5O3MgdXNlZCBpcyB0aGUgZmlyc3QgY3JpdGljYWwgc3RlcCB0byB1bmRlcnN0YW5kaW5nIGl0cyBwdXJwb3NlIGFuZCBwb3RlbnRpYWwgaW1wYWN0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2ludGVybmFsLmg9MTEzND1leHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbm1tL2ludGVybmFsLmgtMTEzNS1cdFx0XHRcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XG5tbS9pbnRlcm5hbC5oOjExMzY6aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxubW0vaW50ZXJuYWwuaC0xMTM3LVx0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcbi0tXG5tbS9pbnRlcm5hbC5oPTExNDE9c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuLS1cbm1tL2ludGVybmFsLmgtMTE0NS19XG5tbS9pbnRlcm5hbC5oOjExNDY6c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG5tbS9pbnRlcm5hbC5oLTExNDctXHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MzMwPWludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbi0tXG5tbS9tZW1vcnktdGllcnMuYy0zNzItXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xubW0vbWVtb3J5LXRpZXJzLmM6MzczOlx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXHUwMDI2bWFzaywgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbm1tL21lbW9yeS10aWVycy5jLTM3NC19XG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NDI1PXN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNDUyLVx0XHQvKlxubW0vbWVtb3J5LXRpZXJzLmM6NDUzOlx0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG5tbS9tZW1vcnktdGllcnMuYy00NTQtXHRcdCAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXJcbi0tXG5tbS9tZW1vcnktdGllcnMuYy00NjUtXHRcdGRvIHtcbm1tL21lbW9yeS10aWVycy5jOjQ2NjpcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG5tbS9tZW1vcnktdGllcnMuYy00NjctXHRcdFx0XHRcdFx0XHRcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz01NzkzPXN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4tLVxubW0vcGFnZV9hbGxvYy5jLTU3OTUtLyoqXG5tbS9wYWdlX2FsbG9jLmM6NTc5NjogKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdFxubW0vcGFnZV9hbGxvYy5jLTU3OTctICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSYjMzk7cmUgYXBwZW5kaW5nXG4tLVxubW0vcGFnZV9hbGxvYy5jLTU4MTAtICovXG5tbS9wYWdlX2FsbG9jLmM6NTgxMTppbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG5tbS9wYWdlX2FsbG9jLmMtNTgxMi1cdFx0XHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz01ODgwPXN0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyxcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTg5MC1cbm1tL3BhZ2VfYWxsb2MuYzo1ODkxOlx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcdTAwMjZ1c2VkX21hc2ssXG5tbS9wYWdlX2FsbG9jLmMtNTg5Mi1cdFx0XHRcdFx0ICAgICAgY2FuZGlkYXRlcykpIFx1MDAzZT0gMCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTU4NAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipBbmFseXppbmcgRnVuY3Rpb24gQ2FsbCBHcmFwaHMqKgoKQWxyaWdodCwgZmlyc3QgdGhpbmdzIGZpcnN0LiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGFueXRoaW5nIHJlbGF0ZWQgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVgLiBUaGUgaW1wbGljYXRpb24gaXMgdGhhdCBJJiMzOTt2ZSBiZWVuIHRyYWNpbmcgdGhlIGxpbmVhZ2Ugb2YgdGhhdCBmdW5jdGlvbiwgcHJvYmFibHkgdG8gb3B0aW1pemUgb3IgdW5kZXJzdGFuZCBpdHMgdXNhZ2UuIEdvb2QhIExvb2tzIGxpa2Ugbm8gZnVydGhlciBpbnN0YW5jZXMgb2YgaXQgYXJlIGJlaW5nIGNhbGxlZC4gVGhhdCYjMzk7cyBhIGNsZWFuIGJyZWFrIHBvaW50LgoKTm93LCBteSBmb2N1cyBzaGlmdHMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmNpZXMgYXJvdW5kIGBidWlsZF96b25lbGlzdHNgIGFuZCBgYnVpbGRfYWxsX3pvbmVsaXN0c2AuIFdobyByZWxpZXMgb24gdGhlc2UgZnVuY3Rpb25zPyAgS25vd2luZyB0aGVpciBjYWxsZXJzIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyB0aGUgZGF0YSBmbG93IGFuZCBhbnkgcG90ZW50aWFsIGJvdHRsZW5lY2tzIG9yIGFyZWFzIGZvciByZWZhY3RvcmluZy4gSSYjMzk7bSBnb2luZyB0byBmb2xsb3cgdGhlIGNhbGwgZ3JhcGggdXAgdG8gc2VlIHdoYXQgZnVuY3Rpb25zIGFyZSBhZmZlY3RlZCBieSBjaGFuZ2VzIHRvIHRoZXNlIGZ1bmN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnVpbGRfem9uZWxpc3RzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jPTU4ODA9c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01OTExLVxubW0vcGFnZV9hbGxvYy5jOjU5MTI6c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG5tbS9wYWdlX2FsbG9jLmMtNTkxMy17XG4tLVxubW0vcGFnZV9hbGxvYy5jPTU5Mzc9c3RhdGljIHZvaWQgc2V0dXBfbWluX3NsYWJfcmF0aW8odm9pZCk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTU5MzktXG5tbS9wYWdlX2FsbG9jLmM6NTk0MDpzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbm1tL3BhZ2VfYWxsb2MuYy01OTQxLXtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTk3Nz1zdGF0aWMgdm9pZCBfX2J1aWxkX2FsbF96b25lbGlzdHModm9pZCAqZGF0YSlcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjAwNS1cdGlmIChzZWxmIFx1MDAyNlx1MDAyNiAhbm9kZV9vbmxpbmUoc2VsZi1cdTAwM2Vub2RlX2lkKSkge1xubW0vcGFnZV9hbGxvYy5jOjYwMDY6XHRcdGJ1aWxkX3pvbmVsaXN0cyhzZWxmKTtcbm1tL3BhZ2VfYWxsb2MuYy02MDA3LVx0fSBlbHNlIHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjAxNC1cbm1tL3BhZ2VfYWxsb2MuYzo2MDE1Olx0XHRcdGJ1aWxkX3pvbmVsaXN0cyhwZ2RhdCk7XG5tbS9wYWdlX2FsbG9jLmMtNjAxNi1cdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjE5MgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDQ2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIEhpZXJhcmNoeSBvZiBgX19idWlsZF9hbGxfem9uZWxpc3RzYCoqCgpSaWdodCwgc28gSSBzZWUgYF9fYnVpbGRfYWxsX3pvbmVsaXN0c2AgaXMgZGlyZWN0bHkgY2FsbGVkIGJ5IGBidWlsZF9hbGxfem9uZWxpc3RzYC4gVGhhdCYjMzk7cyB0aGUgaW1tZWRpYXRlIHJlbGF0aW9uc2hpcC4gTm93LCB0aGUgcmVhbCBxdWVzdGlvbiBpcywgd2hlcmUgZG9lcyBgYnVpbGRfYWxsX3pvbmVsaXN0c2AgaXRzZWxmIGZpdCBpbnRvIHRoZSBsYXJnZXIgcGljdHVyZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHVwc3RyZWFtIGRlcGVuZGVuY2llcy4gV2hlcmUgYXJlICppdHMqIGNhbGxpbmcgcG9pbnRzPyBJIG5lZWQgdG8gdHJhY2UgYmFjayBmcm9tIGBidWlsZF9hbGxfem9uZWxpc3RzYCB0byB1bmRlcnN0YW5kIHRoZSBiaWdnZXIgYXJjaGl0ZWN0dXJlIGl0IHBsYXlzIGEgcm9sZSBpbi4gTGV0JiMzOTtzIGZpbmQgdGhvc2UgY2FsbHMuIEkgZXhwZWN0IHRvIGZpbmQgc29tZSBpbnRlcmVzdGluZyB0aGluZ3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J1aWxkX2FsbF96b25lbGlzdHMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC94ODYvbW0vbnVtYS5jPTIzMj12b2lkIF9faW5pdCB4ODZfbnVtYV9pbml0KHZvaWQpXG4tLVxuYXJjaC94ODYvbW0vbnVtYS5jLTI1Ni0gKiBtZW1vcnlsZXNzIENQVSBub2RlcyBoYXZlIGFscmVhZHkgYmVlbiBicm91Z2h0IG9ubGluZSwgYW5kIGJlZm9yZSB0aGVcbmFyY2gveDg2L21tL251bWEuYzoyNTc6ICogbm9kZV9kYXRhW25pZF0gaXMgbmVlZGVkIGZvciB6b25lIGxpc3Qgc2V0dXAgaW4gYnVpbGRfYWxsX3pvbmVsaXN0cygpLlxuYXJjaC94ODYvbW0vbnVtYS5jLTI1OC0gKlxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmg9MTYyMD1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGdkYXRfZW5kX3BmbihwZ19kYXRhX3QgKnBnZGF0KVxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTYyNi1cbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTYyNzp2b2lkIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCk7XG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE2MjgtYm9vbCBfX3pvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyayxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTExNDA9aW50IG9ubGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyMTUtXHRpZiAobmVlZF96b25lbGlzdHNfcmVidWlsZClcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTIxNjpcdFx0YnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTtcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIxNy1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTEyNTY9c3RhdGljIHBnX2RhdGFfdCAqaG90YWRkX2luaXRfcGdkYXQoaW50IG5pZClcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyNzUtXHQgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTI3NjpcdGJ1aWxkX2FsbF96b25lbGlzdHMocGdkYXQpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjc3LVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTk4Nj1pbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIxNzAtXHRcdHpvbmVfcGNwX3Jlc2V0KHpvbmUpO1xubW0vbWVtb3J5X2hvdHBsdWcuYzoyMTcxOlx0XHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMTcyLVx0fVxuLS1cbm1tL21tX2luaXQuYz0yNjk3PXZvaWQgX19pbml0IG1tX2NvcmVfaW5pdCh2b2lkKVxuLS1cbm1tL21tX2luaXQuYy0yNzAzLVx0QlVJTERfQlVHX09OKE1BWF9aT05FTElTVFMgXHUwMDNlIDIpO1xubW0vbW1faW5pdC5jOjI3MDQ6XHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xubW0vbW1faW5pdC5jLTI3MDUtXHRwYWdlX2FsbG9jX2luaXRfY3B1aHAoKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTk3NT1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcl9jcHVfem9uZXN0YXQsIGJvb3Rfem9uZXN0YXRzKTtcbm1tL3BhZ2VfYWxsb2MuYy01OTc2LVxubW0vcGFnZV9hbGxvYy5jOjU5Nzc6c3RhdGljIHZvaWQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmRhdGEpXG5tbS9wYWdlX2FsbG9jLmMtNTk3OC17XG4tLVxubW0vcGFnZV9hbGxvYy5jPTYwMzY9c3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0XG5tbS9wYWdlX2FsbG9jLmM6NjAzNzpidWlsZF9hbGxfem9uZWxpc3RzX2luaXQodm9pZClcbm1tL3BhZ2VfYWxsb2MuYy02MDM4LXtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjA0MC1cbm1tL3BhZ2VfYWxsb2MuYzo2MDQxOlx0X19idWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xubW0vcGFnZV9hbGxvYy5jLTYwNDItXG4tLVxubW0vcGFnZV9hbGxvYy5jLTYwNjUtICpcbm1tL3BhZ2VfYWxsb2MuYzo2MDY2OiAqIF9fcmVmIGR1ZSB0byBjYWxsIG9mIF9faW5pdCBhbm5vdGF0ZWQgaGVscGVyIGJ1aWxkX2FsbF96b25lbGlzdHNfaW5pdFxubW0vcGFnZV9hbGxvYy5jLTYwNjctICogW3Byb3RlY3RlZCBieSBTWVNURU1fQk9PVElOR10uXG5tbS9wYWdlX2FsbG9jLmMtNjA2OC0gKi9cbm1tL3BhZ2VfYWxsb2MuYzo2MDY5OnZvaWQgX19yZWYgYnVpbGRfYWxsX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxubW0vcGFnZV9hbGxvYy5jLTYwNzAte1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy02MDczLVx0aWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykge1xubW0vcGFnZV9hbGxvYy5jOjYwNzQ6XHRcdGJ1aWxkX2FsbF96b25lbGlzdHNfaW5pdCgpO1xubW0vcGFnZV9hbGxvYy5jLTYwNzUtXHR9IGVsc2Uge1xubW0vcGFnZV9hbGxvYy5jOjYwNzY6XHRcdF9fYnVpbGRfYWxsX3pvbmVsaXN0cyhwZ2RhdCk7XG5tbS9wYWdlX2FsbG9jLmMtNjA3Ny1cdFx0LyogY3B1c2V0IHJlZnJlc2ggcm91dGluZSBzaG91bGQgYmUgaGVyZSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzU1NgoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDg0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIGNvZGU6CgoqKlRoaW5raW5nIFRocm91Z2ggWm9uZWxpc3QgSW5pdGlhbGl6YXRpb24gYW5kIERlbW90aW9uKioKCk9rYXksIHNvIGBidWlsZF9hbGxfem9uZWxpc3RzYCBpcyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBjbGVhcmx5LiBJdCYjMzk7cyBjYWxsZWQgbm90IGp1c3QgZHVyaW5nIHRoZSBpbml0aWFsIGJvb3Qgc2VxdWVuY2UgdmlhIGBtbV9jb3JlX2luaXRgLCBidXQgYWxzbyBkeW5hbWljYWxseSB3aGVuIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggbWVtb3J5IGhvdHBsdWcgZXZlbnRzOiBgb25saW5lX3BhZ2VzYCwgYGhvdGFkZF9pbml0X3BnZGF0YCwgYW5kIGBvZmZsaW5lX3BhZ2VzYC4gVGhhdCBtYWtlcyBzZW5zZTsgdGhlIHpvbmVsaXN0IHN0cnVjdHVyZSBoYXMgdG8gYmUgdXBkYXRlZCB3aGVuZXZlciB0aGUgbWVtb3J5IHRvcG9sb2d5IGNoYW5nZXMuCgpCdXQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHBpY3R1cmUuIE15IGltbWVkaWF0ZSBxdWVzdGlvbiBpcyBhYm91dCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLiBXaGVyZSBkb2VzICp0aGF0KiBmaXQgaW50byB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbGlmZWN5Y2xlPyBXaGVuIGlzICp0aGF0KiBmdW5jdGlvbiBiZWluZyBjYWxsZWQ/IEdpdmVuIGl0cyBuYW1lLCBpdCBtdXN0IHBsYXkgYSBwYXJ0LCBhbmQgaXRzIGV4ZWN1dGlvbiBjb250ZXh0IGlzIGltcG9ydGFudCB0byBhbmFseXplLgoKVGltZSB0byByZWFjaCBmb3IgdGhlIHRydXN0eSBgZ3JlcGAuIEkmIzM5O2xsIHJ1biBhIHF1aWNrIHNlYXJjaCBmb3IgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBhbmQgc2VlIHdoZXJlIGl0JiMzOTtzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlLiBLbm93aW5nIHRoYXQgc2hvdWxkIGdpdmUgbWUgYSBtb3JlIGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcgb2YgaG93IG1lbW9yeSBkZW1vdGlvbiBpcyBzZXQgdXAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2VzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS10aWVycy5jPTQwMD1zdGF0aWMgdm9pZCBkdW1wX2RlbW90aW9uX3RhcmdldHModm9pZClcbi0tXG5tbS9tZW1vcnktdGllcnMuYy00MjQtICovXG5tbS9tZW1vcnktdGllcnMuYzo0MjU6c3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbm1tL21lbW9yeS10aWVycy5jLTQyNi17XG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNTIxLSNlbHNlXG5tbS9tZW1vcnktdGllcnMuYzo1MjI6c3RhdGljIGlubGluZSB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpIHt9XG5tbS9tZW1vcnktdGllcnMuYy01MjMtI2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTcwOD1zdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfdGllcl9sYXRlX2luaXQodm9pZClcbi0tXG5tbS9tZW1vcnktdGllcnMuYy03MzEtXG5tbS9tZW1vcnktdGllcnMuYzo3MzI6XHRlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpO1xubW0vbWVtb3J5LXRpZXJzLmMtNzMzLVx0cHV0X29ubGluZV9tZW1zKCk7XG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9ODgyPXN0YXRpYyBpbnQgX19tZW1pbml0IG1lbXRpZXJfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtODkxLVx0XHRpZiAoY2xlYXJfbm9kZV9tZW1vcnlfdGllcihubi1cdTAwM2VuaWQpKVxubW0vbWVtb3J5LXRpZXJzLmM6ODkyOlx0XHRcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XG5tbS9tZW1vcnktdGllcnMuYy04OTMtXHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcbi0tXG5tbS9tZW1vcnktdGllcnMuYy04OTgtXHRcdGlmICghSVNfRVJSKG1lbXRpZXIpKVxubW0vbWVtb3J5LXRpZXJzLmM6ODk5Olx0XHRcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XG5tbS9tZW1vcnktdGllcnMuYy05MDAtXHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgzMjEKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA3MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgbXlzZWxmOgoKKipUcmFjaW5nIERvd24gYG5leHRfZGVtb3Rpb25fbm9kZWAqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBtZW1vcnkgbWFuYWdlbWVudCBzdHVmZiwgYW5kIEkmIzM5O3ZlIGhpdCBhIHBvaW50IHdoZXJlIEkgbmVlZCB0byB1bmRlcnN0YW5kIGBuZXh0X2RlbW90aW9uX25vZGVgLiBXaGVyZSBkb2VzIHRoaXMgZ2V0IGNhbGxlZCwgZXhhY3RseT8gTGV0JiMzOTtzIHNlZS4uLiBBaGEhIEl0IGxvb2tzIGxpa2UgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgaW52b2tlZCBmcm9tIGBkZW1vdGVfZm9saW9fbGlzdGAuIFJpZ2h0LCBhbmQgdGhhdCBmdW5jdGlvbiBsaXZlcyBpbiBgbW0vdm1zY2FuLmNgLiBOb3cgd2UmIzM5O3JlIGdldHRpbmcgc29tZXdoZXJlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGUgY2FsbCB0byBgbmV4dF9kZW1vdGlvbl9ub2RlYCwgc28gSSYjMzk7bSBnb2luZyB0byBqdW1wIGludG8gYGRlbW90ZV9mb2xpb19saXN0YCBpbiBgbW0vdm1zY2FuLmNgIGFuZCBzZWUgaG93ICppdCogaXMgdXNlZC4gVGhhdCB3aWxsIGdpdmUgbWUgdGhlIGJyb2FkZXIgcGljdHVyZSBvZiB3aHkgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgcmVsZXZhbnQgaGVyZS4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlIGZpbmQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vdm1zY2FuLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzEwNzA6XHQgKi9cbjEwNzE6XHRzdGF0aWMgdW5zaWduZWQgaW50IGRlbW90ZV9mb2xpb19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmRlbW90ZV9mb2xpb3MsXG4xMDcyOlx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuMTA3MzpcdFx0XHRcdFx0ICAgICAgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuMTA3NDpcdHtcbjEwNzU6XHRcdGludCB0YXJnZXRfbmlkO1xuMTA3NjpcdFx0dW5zaWduZWQgaW50IG5yX3N1Y2NlZWRlZDtcbjEwNzc6XHRcdG5vZGVtYXNrX3QgYWxsb3dlZF9tYXNrO1xuMTA3ODpcdFxuMTA3OTpcdFx0c3RydWN0IG1pZ3JhdGlvbl90YXJnZXRfY29udHJvbCBtdGMgPSB7XG4xMDgwOlx0XHRcdC8qXG4xMDgxOlx0XHRcdCAqIEFsbG9jYXRlIGZyb20gJiMzOTtub2RlJiMzOTssIG9yIGZhaWwgcXVpY2tseSBhbmQgcXVpZXRseS5cbjEwODI6XHRcdFx0ICogV2hlbiB0aGlzIGhhcHBlbnMsICYjMzk7cGFnZSYjMzk7IHdpbGwgbGlrZWx5IGp1c3QgYmUgZGlzY2FyZGVkXG4xMDgzOlx0XHRcdCAqIGluc3RlYWQgb2YgbWlncmF0ZWQuXG4xMDg0Olx0XHRcdCAqL1xuMTA4NTpcdFx0XHQuZ2ZwX21hc2sgPSAoR0ZQX0hJR0hVU0VSX01PVkFCTEUgXHUwMDI2IH5fX0dGUF9SRUNMQUlNKSB8XG4xMDg2Olx0XHRcdFx0X19HRlBfTk9NRU1BTExPQyB8IEdGUF9OT1dBSVQsXG4xMDg3Olx0XHRcdC5ubWFzayA9IFx1MDAyNmFsbG93ZWRfbWFzayxcbjEwODg6XHRcdFx0LnJlYXNvbiA9IE1SX0RFTU9USU9OLFxuMTA4OTpcdFx0fTtcbjEwOTA6XHRcbjEwOTE6XHRcdGlmIChsaXN0X2VtcHR5KGRlbW90ZV9mb2xpb3MpKVxuMTA5MjpcdFx0XHRyZXR1cm4gMDtcbjEwOTM6XHRcbjEwOTQ6XHRcdG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ2RhdCwgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbjEwOTU6XHRcdG1lbV9jZ3JvdXBfbm9kZV9maWx0ZXJfYWxsb3dlZChtZW1jZywgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbjEwOTY6XHRcdGlmIChub2Rlc19lbXB0eShhbGxvd2VkX21hc2spKVxuMTA5NzpcdFx0XHRyZXR1cm4gMDtcbjEwOTg6XHRcbjEwOTk6XHRcdHRhcmdldF9uaWQgPSBuZXh0X2RlbW90aW9uX25vZGUocGdkYXQtXHUwMDNlbm9kZV9pZCwgXHUwMDI2YWxsb3dlZF9tYXNrKTtcbjExMDA6XHRcdGlmICh0YXJnZXRfbmlkID09IE5VTUFfTk9fTk9ERSlcbjExMDE6XHRcdFx0LyogTm8gbG93ZXItdGllciBub2RlcyBvciBub2RlcyB3ZXJlIGhvdC11bnBsdWdnZWQuICovXG4xMTAyOlx0XHRcdHJldHVybiAwO1xuMTEwMzpcdFxuMTEwNDpcdFx0bXRjLm5pZCA9IHRhcmdldF9uaWQ7XG4xMTA1Olx0XG4xMTA2Olx0XHQvKiBEZW1vdGlvbiBpZ25vcmVzIGFsbCBjcHVzZXQgYW5kIG1lbXBvbGljeSBzZXR0aW5ncyAqL1xuMTEwNzpcdFx0bWlncmF0ZV9wYWdlcyhkZW1vdGVfZm9saW9zLCBhbGxvY19kZW1vdGVfZm9saW8sIE5VTEwsXG4xMTA4Olx0XHRcdCAgICAgICh1bnNpZ25lZCBsb25nKVx1MDAyNm10YywgTUlHUkFURV9BU1lOQywgTVJfREVNT1RJT04sXG4xMTA5Olx0XHRcdCAgICAgIFx1MDAyNm5yX3N1Y2NlZWRlZCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MjcxCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTQ0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgWm9uZWxpc3QgQ2hhbmdlcyBmb3IgTWVtb3J5IE1hbmFnZW1lbnQgYW5kIEZ1enppbmcgUmVsZXZhbmNlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSwgbXkgZXhwZXJ0IG1pbmQgZmxhZ3MgYGRlbW90ZV9mb2xpb19saXN0YCBhcyBwYXJ0IG9mIHBhZ2UgcmVjbGFtYXRpb27igJRzcGVjaWZpY2FsbHksIHRoZSBkZW1vdGlvbiBwcm9jZXNzIHdoZW4gbWVtb3J5IHByZXNzdXJlIGhpdHMuIFBhZ2VzIGdldCBzaHVmZmxlZCBkb3duIHRoZSBtZW1vcnkgaGllcmFyY2h5LiBUaGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIGhvdyB0aGUgZmFsbGJhY2sgb3JkZXIgZm9yIGBub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzYCBpcyBjb25zdHJ1Y3RlZCwgbWFpbmx5IHRocm91Z2ggYGJ1aWxkX25vZGVfem9uZWxpc3RgIGFuZCB0aGUgYnJvYWRlciBgYnVpbGRfem9uZWxpc3RzYCBmdW5jdGlvbnMuIFRoaXMgYFpPTkVMSVNUX0ZBTExCQUNLYCBpcyAqY3J1Y2lhbCogYmVjYXVzZSBpdCYjMzk7cyB1c2VkIGJ5IGV2ZXJ5IGFsbG9jYXRpb24gdGhhdCBuZWVkcyB0byBmYWxsIGJhY2sgYWNyb3NzIE5VTUEgbm9kZXMuCgpJIHNlZSBhIGNsZWFyIHNoaWZ0IGhlcmUuIFRoZSBvbGQgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyYCB3YXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgaXRlcmF0aW5nIG92ZXIgbm9kZXMgaW4gYSBzZXQgb3JkZXIuIE5vdywgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGlzIHVzaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIGFuZCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzay4gVGhpcyBgY2FuZGlkYXRlc2AgbWFzayBpcyAqa2V5Ki4gQmVmb3JlLCBpdCB1c2VkIGBOX01FTU9SWWAuIEl0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIGJlaW5nIGZhciBtb3JlIHByZWNpc2UgYWJvdXQgKndoaWNoKiBub2RlcyBhcmUgY29uc2lkZXJlZCwgd2hpY2ggaXMgYSBiaWcgY2hhbmdlIQoKSSBuZWVkIHRvIGRpdmUgaW50byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYC4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBub3cgdXNlcyB0aGF0IGBjYW5kaWRhdGVzYCBtYXNrLCB3aGljaCBpcyBncmVhdCBiZWNhdXNlIGNhbGxlcnMgY2FuIG5vdyBwYXNzIGluIGEgcmVzdHJpY3RlZCBub2RlbWFzay4gSSBzZWUgdGhpcyBoYXBwZW5pbmcgaW4gdGhlIGBtZW1vcnktdGllcnNgIGNvZGUsIGluIGBuZXh0X2RlbW90aW9uX25vZGUoKWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpYC4gVGhlIHByZXZpb3VzIGNvZGUgd2FzIG1vcmUgb2YgYSBibHVudCBpbnN0cnVtZW50LCBhbmQgdGhpcyBpcyBmYXIgbW9yZSB0YXJnZXRlZC4KCk9rYXksIG5vdyBsZXQmIzM5O3MgYXBwbHkgdGhlIGZ1enppbmcgY3JpdGVyaWEuIFRoaXMgcGF0Y2ggaXMgKmRlZmluaXRlbHkqIGluIGBtbS9gIOKAkyBtZW1vcnkgbWFuYWdlbWVudC4gSXQmIzM5O3MgY2hhbmdpbmcgY29yZSB6b25lbGlzdCBidWlsZGluZyBsb2dpYywgc3BlY2lmaWNhbGx5IGhvdyB3ZSYjMzk7cmUgY2FsY3VsYXRpbmcgd2hpY2ggbm9kZSB0byB1c2UgaW4gcGFnZSByZWNsYWltIChhbmQgaW4gcGFydGljdWxhciwgZGVtb3Rpb24pLiBUaGlzIGRpcmVjdGx5IGFmZmVjdHMgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGFuZCB0aGUgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGZ1bmN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgLCBhbG9uZyB3aXRoIHVwZGF0ZXMgdG8gdGhlIGRlbW90aW9uIHRhcmdldCBjYWxjdWxhdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaG9zZSBhcmUgKmV4YWN0bHkqIHRoZSBraW5kIG9mIGNvcmUgc3Vic3lzdGVtIGFuZCBhbGdvcml0aG0gZmxvdyBjaGFuZ2VzIHRoYXQgdGhlIGZ1enppbmcgY3JpdGVyaWEgZmxhZy4KClRoZSBxdWVzdGlvbiB0aGVuIGJlY29tZXMsIGlzIHRoaXMgcGF0Y2ggY29kZSByZWFjaGFibGUgaW4gYSBmdXp6ZXIgZnJpZW5kbHkgZW52aXJvbm1lbnQ/IEFuZCB0aGUgYW5zd2VyIGlzIGFic29sdXRlbHkgeWVzISBJIGNhbiBlYXNpbHkgY29uZmlndXJlIE5VTUEgbm9kZXMgaW4gUUVNVSAoSSB1c2UgaXQgYWxsIHRoZSB0aW1lKS4gU3l6a2FsbGVyIG9mdGVuIHJ1bnMgd2l0aCBOVU1BIGVuYWJsZWQsIHRvby4gQW5kIGNydWNpYWxseSwgbWVtb3J5IGhvdHBsdWcvbWVtcG9saWN5IHN5c2NhbGxzIChlLmcuLCBgc2V0X21lbXBvbGljeWAsIGBtYmluZGAsIGBtaWdyYXRlX3BhZ2VzYCwgYG1vdmVfcGFnZXNgKSBhbmQgcGFnZSByZWNsYWltIGRlbW90aW9uIGRlZmluaXRlbHkgcnVuIHRoaXMgY29kZS4gU28gdGhpcyBpcyBncmVhdCEKCkZpbmFsbHksIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgc29tZXRoaW5nIOKAkyBpcyB0aGUgYG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcmAgc3lzY3RsIHN0aWxsIGFyb3VuZD8gSSYjMzk7ZCBleHBlY3QgaXQgaXMgYXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIHdpbGwgdXNlIGl0cyBvcmRlci4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhhdC4gQnV0IGV2ZXJ5dGhpbmcgc28gZmFyIHN0cm9uZ2x5IHN1Z2dlc3RzIHRoaXMgcGF0Y2ggaXMgKmhpZ2hseSogZnV6emFibGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O251bWFfem9uZWxpc3Rfb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9wYWdlX2FsbG9jLmM9NTc0NT1zdGF0aWMgaW50IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwgc3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01NzY0LVxubW0vcGFnZV9hbGxvYy5jOjU3NjU6c3RhdGljIGludCBfX3BhcnNlX251bWFfem9uZWxpc3Rfb3JkZXIoY2hhciAqcylcbm1tL3BhZ2VfYWxsb2MuYy01NzY2LXtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTc3My1cdGlmICghKCpzID09ICYjMzk7ZCYjMzk7IHx8ICpzID09ICYjMzk7RCYjMzk7IHx8ICpzID09ICYjMzk7biYjMzk7IHx8ICpzID09ICYjMzk7TiYjMzk7KSkge1xubW0vcGFnZV9hbGxvYy5jOjU3NzQ6XHRcdHByX3dhcm4oXCYjMzQ7SWdub3JpbmcgdW5zdXBwb3J0ZWQgbnVtYV96b25lbGlzdF9vcmRlciB2YWx1ZTogICVzXFxuXCYjMzQ7LCBzKTtcbm1tL3BhZ2VfYWxsb2MuYy01Nzc1LVx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTc3OS1cbm1tL3BhZ2VfYWxsb2MuYzo1NzgwOnN0YXRpYyBjaGFyIG51bWFfem9uZWxpc3Rfb3JkZXJbXSA9IFwmIzM0O05vZGVcJiMzNDs7XG5tbS9wYWdlX2FsbG9jLmMtNTc4MS0jZGVmaW5lIE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOXHQxNlxubW0vcGFnZV9hbGxvYy5jLTU3ODItLypcbm1tL3BhZ2VfYWxsb2MuYzo1NzgzOiAqIHN5c2N0bCBoYW5kbGVyIGZvciBudW1hX3pvbmVsaXN0X29yZGVyXG5tbS9wYWdlX2FsbG9jLmMtNTc4NC0gKi9cbm1tL3BhZ2VfYWxsb2MuYzo1Nzg1OnN0YXRpYyBpbnQgbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG5tbS9wYWdlX2FsbG9jLmMtNTc4Ni1cdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01Nzg4LVx0aWYgKHdyaXRlKVxubW0vcGFnZV9hbGxvYy5jOjU3ODk6XHRcdHJldHVybiBfX3BhcnNlX251bWFfem9uZWxpc3Rfb3JkZXIoYnVmZmVyKTtcbm1tL3BhZ2VfYWxsb2MuYy01NzkwLVx0cmV0dXJuIHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTY5MTg9c3RhdGljIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgcGFnZV9hbGxvY19zeXNjdGxfdGFibGVbXSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjk3MC1cdHtcbm1tL3BhZ2VfYWxsb2MuYzo2OTcxOlx0XHQucHJvY25hbWVcdD0gXCYjMzQ7bnVtYV96b25lbGlzdF9vcmRlclwmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYzo2OTcyOlx0XHQuZGF0YVx0XHQ9IFx1MDAyNm51bWFfem9uZWxpc3Rfb3JkZXIsXG5tbS9wYWdlX2FsbG9jLmMtNjk3My1cdFx0Lm1heGxlblx0XHQ9IE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOLFxubW0vcGFnZV9hbGxvYy5jLTY5NzQtXHRcdC5tb2RlXHRcdD0gMDY0NCxcbm1tL3BhZ2VfYWxsb2MuYzo2OTc1Olx0XHQucHJvY19oYW5kbGVyXHQ9IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcixcbm1tL3BhZ2VfYWxsb2MuYy02OTc2LVx0fSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIxMjEKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAyMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgWm9uZWxpc3QgQ29uc3RydWN0aW9uIGFuZCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3Mga2lja2luZyBvZmYgdGhpcyBgYnVpbGRfYWxsX3pvbmVsaXN0c2AgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyBpdCYjMzk7cyB0aWVkIHRvIGNoYW5nZXMgaW4gdGhlIG1lbW9yeSB0b3BvbG9neSwgcmlnaHQ/IExpa2UsIHN5c2ZzIGVudHJpZXMgZm9yIG9ubGluZS9vZmZsaW5lIG1lbW9yeSBwYWdlcyDigJMgdGhlIHVzdWFsIHN1c3BlY3RzIGF0IGAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS8uLi5gLiBBbHNvLCBpdCYjMzk7cyBnb3R0YSBiZSBpbnZvbHZlZCB3aXRoIGhvdC1hZGQgbWVtb3J5IG9wZXJhdGlvbnMsIG9idmlvdXNseS4gQW5kLCBvZiBjb3Vyc2UsIHRoZSBgbmV4dF9kZW1vdGlvbl9ub2RlYCBmdW5jdGlvbiwgd2hpY2ggSSBrbm93IGlzIGEga2V5IHBhcnQgb2YgbWVtb3J5IHJlY2xhaW0sIHNwZWNpZmljYWxseSB3aGVuIHdlJiMzOTtyZSBkZW1vdGluZyBwYWdlcyB3aXRoaW4gYGRlbW90ZV9mb2xpb19saXN0YC4gVGhlbiB0aGVyZSYjMzk7cyBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLCBjYWxsZWQgd2hlbiB0aGVyZSYjMzk7cyBhIHNoaWZ0IGluIG1lbW9yeSB0aWVycywgb3IgYWxzbyBvbiBob3RwbHVnIGV2ZW50cy4gRmluYWxseSwgem9uZWxpc3RzIGdldCBhIGJ1aWxkIGF0IGJvb3QsIHRvbywgd2hpY2ggbWFrZXMgc2Vuc2UuCgpSaWdodCwgc28gd2hhdCBjb25maWd1cmF0aW9ucyBhcmUgYWJzb2x1dGVseSBlc3NlbnRpYWwgZm9yIHRoaXMgd2hvbGUgcHJvY2Vzcz8gTGV0IG1lIGNoZWNrIHRoZSBjb2RlLgoKQWxyaWdodCwgbG9va2luZyBhdCBgbW0vbWVtb3J5LXRpZXJzLmNgLCBJIHNlZSBhIGNsZWFyIGRlcGVuZGVuY3k6IGBvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vYC4gTWFrZXMgc2Vuc2UsIHdlIG5lZWQgTlVNQSBzdXBwb3J0LiBBbmQgKmNydWNpYWxseSosIGl0IGxvb2tzIGxpa2UgdGhlIHByZXNlbmNlIG9mIGAjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGlzIHdoYXQgZ3VhcmRzIGJvdGggYG5leHRfZGVtb3Rpb25fbm9kZWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AuIFRoYXQmIzM5O3MgdGhlIGxpbmNocGluLiBTbywgdGhlIGtleSBpcyBnb2luZyB0byBiZSBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCwgYW5kLCBvZiBjb3Vyc2UsIGBDT05GSUdfTlVNQWAuIExldCBtZSBnbyBjaGVjayBLY29uZmlnIHRvIGJlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBmdWxsIHNjb3BlIG9mIHRoZXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTlVNQV9NSUdSQVRJT04mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz02NjA9Y29uZmlnIFBBR0VfUkVQT1JUSU5HXG4tLVxubW0vS2NvbmZpZy02NjctXG5tbS9LY29uZmlnOjY2ODpjb25maWcgTlVNQV9NSUdSQVRJT05cbm1tL0tjb25maWctNjY5LVx0Ym9vbCBcJiMzNDtOVU1BIHBhZ2UgbWlncmF0aW9uXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNzg5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhpbmtpbmcgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIE5VTUFfTUlHUkFUSU9OIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgb2YgYE5VTUFfTUlHUkFUSU9OYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNjY4LiBUaGF0JiMzOTtzIHVzdWFsbHkgd2hlcmUgdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucyByZXNpZGUuIEJ5IGV4YW1pbmluZyB0aGF0IHNlY3Rpb24sIEkgc2hvdWxkIGJlIGFibGUgdG8gdW5yYXZlbCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBgTlVNQV9NSUdSQVRJT05gIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuIEhvcGVmdWxseSwgdGhpcyB3aWxsIGdpdmUgbWUgYSBjbGVhciBwaWN0dXJlIG9mIHdoYXQgb3RoZXIgZmVhdHVyZXMgb3Igb3B0aW9ucyBuZWVkIHRvIGJlIGluIHBsYWNlIGZvciB0aGlzIHBhcnRpY3VsYXIgTlVNQSBtaWdyYXRpb24gZnVuY3Rpb25hbGl0eSB0byBiZSBhdmFpbGFibGUuIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBkZXBlbmRlbmNpZXMgb24gdGhlIE5VTUEgYXJjaGl0ZWN0dXJlIGl0c2VsZiwgYW5kIHBvdGVudGlhbGx5IG9uIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZlYXR1cmVzLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY2NTpcdFx0ICB0aG9zZSBwYWdlcyB0byBhbm90aGVyIGVudGl0eSwgc3VjaCBhcyBhIGh5cGVydmlzb3IsIHNvIHRoYXQgdGhlXG4gNjY2Olx0XHQgIG1lbW9yeSBjYW4gYmUgZnJlZWQgd2l0aGluIHRoZSBob3N0IGZvciBvdGhlciB1c2VzLlxuIDY2NzpcdFxuIDY2ODpcdGNvbmZpZyBOVU1BX01JR1JBVElPTlxuIDY2OTpcdFx0Ym9vbCBcJiMzNDtOVU1BIHBhZ2UgbWlncmF0aW9uXCYjMzQ7XG4gNjcwOlx0XHRkZWZhdWx0IHlcbiA2NzE6XHRcdGRlcGVuZHMgb24gTlVNQSBcdTAwMjZcdTAwMjYgTU1VXG4gNjcyOlx0XHRzZWxlY3QgTUlHUkFUSU9OXG4gNjczOlx0XHRoZWxwXG4gNjc0Olx0XHQgIFN1cHBvcnQgdGhlIG1pZ3JhdGlvbiBvZiBwYWdlcyB0byBvdGhlciBOVU1BIG5vZGVzLCBhdmFpbGFibGUgdG9cbiA2NzU6XHRcdCAgdXNlciBzcGFjZSB0aHJvdWdoIGludGVyZmFjZXMgbGlrZSBtaWdyYXRlX3BhZ2VzKCksIG1vdmVfcGFnZXMoKSxcbiA2NzY6XHRcdCAgYW5kIG1iaW5kKCkuIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBhbHNvIGVuYWJsZXMgc3VwcG9ydCBmb3IgcGFnZVxuIDY3NzpcdFx0ICBkZW1vdGlvbiBmb3IgbWVtb3J5IHRpZXJpbmcuXG4gNjc4Olx0XG4gNjc5Olx0Y29uZmlnIE1JR1JBVElPTlxuIDY4MDpcdFx0Ym9vbFxuIDY4MTpcdFx0ZGVwZW5kcyBvbiBNTVVcbiA2ODI6XHRcbiA2ODM6XHRjb25maWcgREVWSUNFX01JR1JBVElPTlxuIDY4NDpcdFx0ZGVmX2Jvb2wgTUlHUkFUSU9OIFx1MDAyNlx1MDAyNiBaT05FX0RFVklDRVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzMyMQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDc0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRlbHZpbmcgaW50byBOVU1BIE1pZ3JhdGlvbiBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgTlVNQV9NSUdSQVRJT05gIGFuZCwgbmF0dXJhbGx5LCBpdCBsZWFucyBvbiBib3RoIGBOVU1BYCBhbmQgdGhlIGBNTVVgLiBUaGF0IG1ha2VzIHNlbnNlLCByaWdodD8gSXQgd291bGRuJiMzOTt0IGJlIGFibGUgdG8gbWlncmF0ZSB3aXRob3V0IHRob3NlIHVuZGVybHlpbmcgc3RydWN0dXJlcy4gQnV0IG5vdyBteSBtaW5kIGlzIHN0YXJ0aW5nIHRvIHdhbmRlciBhIGJpdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGZ1bGwgY29udGV4dCBoZXJlLiBUaGF0JiMzOTtzIHdoZW4gSSB3b25kZXIgYWJvdXQgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIHdpdGhpbiBgbW0vcGFnZV9hbGxvYy5jYC4gSSBoYXZlIGEgZmVlbGluZyBJIG5lZWQgdG8gY2lyY2xlIGJhY2sgdG8gd2hhdCBnYXRlcyB0aGF0IGZ1bmN0aW9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQgZ3VhcmRzIHRoYXQgZnVuY3Rpb24gaW4gYG1tL3BhZ2VfYWxsb2MuY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTc5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs1NzkwOlx0XHRyZXR1cm4gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTtcbjU3OTE6XHR9XG41NzkyOlx0XG41NzkzOlx0c3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcbjU3OTQ6XHRcbjU3OTU6XHQvKipcbjU3OTY6XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdFxuNTc5NzpcdCAqIEBub2RlOiBub2RlIHdob3NlIGZhbGxiYWNrIGxpc3Qgd2UmIzM5O3JlIGFwcGVuZGluZ1xuNTc5ODpcdCAqIEB1c2VkX25vZGVfbWFzazogbm9kZW1hc2tfdCBvZiBhbHJlYWR5IHVzZWQgbm9kZXNcbjU3OTk6XHQgKiBAY2FuZGlkYXRlczogbm9kZW1hc2tfdCBvZiBub2RlcyBlbGlnaWJsZSBmb3Igc2VsZWN0aW9uXG41ODAwOlx0ICpcbjU4MDE6XHQgKiBXZSB1c2UgYSBudW1iZXIgb2YgZmFjdG9ycyB0byBkZXRlcm1pbmUgd2hpY2ggaXMgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZFxuNTgwMjpcdCAqIGFwcGVhciBvbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdC4gIFRoZSBub2RlIHNob3VsZCBub3QgaGF2ZSBhcHBlYXJlZFxuNTgwMzpcdCAqIGFscmVhZHkgaW4gQG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdCwgYW5kIGl0IHNob3VsZCBiZSB0aGUgbmV4dCBjbG9zZXN0IG5vZGVcbjU4MDQ6XHQgKiBhY2NvcmRpbmcgdG8gdGhlIGRpc3RhbmNlIGFycmF5ICh3aGljaCBjb250YWlucyBhcmJpdHJhcnkgZGlzdGFuY2UgdmFsdWVzXG41ODA1Olx0ICogZnJvbSBlYWNoIG5vZGUgdG8gZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0pLCBhbmQgc2hvdWxkIGFsc28gcHJlZmVyIG5vZGVzXG41ODA2Olx0ICogd2l0aCBubyBDUFVzLCBzaW5jZSBwcmVzdW1hYmx5IHRoZXkmIzM5O2xsIGhhdmUgdmVyeSBsaXR0bGUgYWxsb2NhdGlvbiBwcmVzc3VyZVxuNTgwNzpcdCAqIG9uIHRoZW0gb3RoZXJ3aXNlLlxuNTgwODpcdCAqXG41ODA5Olx0ICogUmV0dXJuOiBub2RlIGlkIG9mIHRoZSBmb3VuZCBub2RlIG9yICVOVU1BX05PX05PREUgaWYgbm8gbm9kZSBpcyBmb3VuZC5cbjU4MTA6XHQgKi9cbjU4MTE6XHRpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG41ODEyOlx0XHRcdFx0ICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcbjU4MTM6XHR7XG41ODE0Olx0XHRpbnQgbiwgdmFsO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDAzNgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgdGhlIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYXJlIGNvbnRyb2xsaW5nIGxpbmUgNTc5MCBpbiBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBpcyBhIHByZXR0eSBjb21tb24gZGVidWdnaW5nIHN0ZXA7IHVuZGVyc3RhbmRpbmcgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNhbiBiZSBjcnVjaWFsLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIGp1c3QgZGl2ZSBpbnRvIHRoZSBmaWxlLiBJ4oCZbGwgc2VhcmNoIGJhY2t3YXJkcyBmcm9tIGxpbmUgNTc5MCwgbG9va2luZyBmb3IgdGhlIHJlbGV2YW50IGAjaWZgIG9yIGAjaWZkZWZgIHN0YXRlbWVudCB0aGF0IGVuY2xvc2VzIGl0LiBIb3BlZnVsbHksIGl0JiMzOTtzIGEgcmVsYXRpdmVseSBzaG9ydCBzcGFuIHRvIGlkZW50aWZ5IHRoZSByZWxldmFudCBjb25kaXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14jaWYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9wYWdlX2FsbG9jLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jPTk5PXN0YXRpYyBERUZJTkVfTVVURVgocGNwX2JhdGNoX2hpZ2hfbG9jayk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTEwOS0gKi9cbm1tL3BhZ2VfYWxsb2MuYzoxMTA6I2lmbmRlZiBDT05GSUdfUFJFRU1QVF9SVFxubW0vcGFnZV9hbGxvYy5jLTExMS0jZGVmaW5lIHBjcHVfdGFza19waW4oKVx0XHRwcmVlbXB0X2Rpc2FibGUoKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xMjItICovXG5tbS9wYWdlX2FsbG9jLmM6MTIzOiNpZmRlZiBDT05GSUdfU01QXG5tbS9wYWdlX2FsbG9jLmMtMTI0LSNkZWZpbmUgcGNwX3NwaW5fdHJ5bG9jayhwdHIpXHRcdFx0XHRcdFx0XFxcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTY0LVxubW0vcGFnZV9hbGxvYy5jOjE2NTojaWZkZWYgQ09ORklHX1VTRV9QRVJDUFVfTlVNQV9OT0RFX0lEXG5tbS9wYWdlX2FsbG9jLmMtMTY2LURFRklORV9QRVJfQ1BVKGludCwgbnVtYV9ub2RlKTtcbm1tL3BhZ2VfYWxsb2MuYz0xNjc9RVhQT1JUX1BFUl9DUFVfU1lNQk9MKG51bWFfbm9kZSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTE2OS1cbm1tL3BhZ2VfYWxsb2MuYzoxNzA6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtMTcxLURFRklORV9TVEFUSUNfS0VZX1RSVUUodm1fbnVtYV9zdGF0X2tleSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTE3My1cbm1tL3BhZ2VfYWxsb2MuYzoxNzQ6I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcbm1tL3BhZ2VfYWxsb2MuYy0xNzUtLypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MTg1PXN0YXRpYyBERUZJTkVfTVVURVgocGNwdV9kcmFpbl9tdXRleCk7XG5tbS9wYWdlX2FsbG9jLmMtMTg2LVxubW0vcGFnZV9hbGxvYy5jOjE4NzojaWZkZWYgQ09ORklHX0dDQ19QTFVHSU5fTEFURU5UX0VOVFJPUFlcbm1tL3BhZ2VfYWxsb2MuYy0xODgtdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsYXRlbnRfZW50cm9weSBfX2xhdGVudF9lbnRyb3B5O1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xOTU9bm9kZW1hc2tfdCBub2RlX3N0YXRlc1tOUl9OT0RFX1NUQVRFU10gX19yZWFkX21vc3RseSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTk3LVx0W05fT05MSU5FXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxubW0vcGFnZV9hbGxvYy5jOjE5ODojaWZuZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtMTk5LVx0W05fTk9STUFMX01FTU9SWV0gPSB7IHsgWzBdID0gMVVMIH0gfSxcbm1tL3BhZ2VfYWxsb2MuYzoyMDA6I2lmZGVmIENPTkZJR19ISUdITUVNXG5tbS9wYWdlX2FsbG9jLmMtMjAxLVx0W05fSElHSF9NRU1PUlldID0geyB7IFswXSA9IDFVTCB9IH0sXG4tLVxubW0vcGFnZV9hbGxvYy5jPTIwOT1nZnBfdCBnZnBfYWxsb3dlZF9tYXNrIF9fcmVhZF9tb3N0bHkgPSBHRlBfQk9PVF9NQVNLO1xubW0vcGFnZV9hbGxvYy5jLTIxMC1cbm1tL3BhZ2VfYWxsb2MuYzoyMTE6I2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV9WQVJJQUJMRVxubW0vcGFnZV9hbGxvYy5jLTIxMi11bnNpZ25lZCBpbnQgcGFnZWJsb2NrX29yZGVyIF9fcmVhZF9tb3N0bHk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTIzMT1zdGF0aWMgaW50IHN5c2N0bF9sb3dtZW1fcmVzZXJ2ZV9yYXRpb1tNQVhfTlJfWk9ORVNdID0ge1xubW0vcGFnZV9hbGxvYy5jOjIzMjojaWZkZWYgQ09ORklHX1pPTkVfRE1BXG5tbS9wYWdlX2FsbG9jLmMtMjMzLVx0W1pPTkVfRE1BXSA9IDI1Nixcbm1tL3BhZ2VfYWxsb2MuYy0yMzQtI2VuZGlmXG5tbS9wYWdlX2FsbG9jLmM6MjM1OiNpZmRlZiBDT05GSUdfWk9ORV9ETUEzMlxubW0vcGFnZV9hbGxvYy5jLTIzNi1cdFtaT05FX0RNQTMyXSA9IDI1Nixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMjM4LVx0W1pPTkVfTk9STUFMXSA9IDMyLFxubW0vcGFnZV9hbGxvYy5jOjIzOTojaWZkZWYgQ09ORklHX0hJR0hNRU1cbm1tL3BhZ2VfYWxsb2MuYy0yNDAtXHRbWk9ORV9ISUdITUVNXSA9IDAsXG4tLVxubW0vcGFnZV9hbGxvYy5jPTI0NT1jaGFyICogY29uc3Qgem9uZV9uYW1lc1tNQVhfTlJfWk9ORVNdID0ge1xubW0vcGFnZV9hbGxvYy5jOjI0NjojaWZkZWYgQ09ORklHX1pPTkVfRE1BXG5tbS9wYWdlX2FsbG9jLmMtMjQ3LVx0IFwmIzM0O0RNQVwmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYy0yNDgtI2VuZGlmXG5tbS9wYWdlX2FsbG9jLmM6MjQ5OiNpZmRlZiBDT05GSUdfWk9ORV9ETUEzMlxubW0vcGFnZV9hbGxvYy5jLTI1MC1cdCBcJiMzNDtETUEzMlwmIzM0Oyxcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMjUyLVx0IFwmIzM0O05vcm1hbFwmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYzoyNTM6I2lmZGVmIENPTkZJR19ISUdITUVNXG5tbS9wYWdlX2FsbG9jLmMtMjU0LVx0IFwmIzM0O0hpZ2hNZW1cJiMzNDssXG4tLVxubW0vcGFnZV9hbGxvYy5jLTI1Ni1cdCBcJiMzNDtNb3ZhYmxlXCYjMzQ7LFxubW0vcGFnZV9hbGxvYy5jOjI1NzojaWZkZWYgQ09ORklHX1pPTkVfREVWSUNFXG5tbS9wYWdlX2FsbG9jLmMtMjU4LVx0IFwmIzM0O0RldmljZVwmIzM0Oyxcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MjYyPWNvbnN0IGNoYXIgKiBjb25zdCBtaWdyYXRldHlwZV9uYW1lc1tNSUdSQVRFX1RZUEVTXSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMjY2LVx0XCYjMzQ7SGlnaEF0b21pY1wmIzM0Oyxcbm1tL3BhZ2VfYWxsb2MuYzoyNjc6I2lmZGVmIENPTkZJR19DTUFcbm1tL3BhZ2VfYWxsb2MuYy0yNjgtXHRcJiMzNDtDTUFcJiMzNDssXG5tbS9wYWdlX2FsbG9jLmMtMjY5LSNlbmRpZlxubW0vcGFnZV9hbGxvYy5jOjI3MDojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cbm1tL3BhZ2VfYWxsb2MuYy0yNzEtXHRcJiMzNDtJc29sYXRlXCYjMzQ7LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yODM9RVhQT1JUX1NZTUJPTChtb3ZhYmxlX3pvbmUpO1xubW0vcGFnZV9hbGxvYy5jLTI4NC1cbm1tL3BhZ2VfYWxsb2MuYzoyODU6I2lmIE1BWF9OVU1OT0RFUyBcdTAwM2UgMVxubW0vcGFnZV9hbGxvYy5jLTI4Ni11bnNpZ25lZCBpbnQgbnJfbm9kZV9pZHMgX19yZWFkX21vc3RseSA9IE1BWF9OVU1OT0RFUztcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzA1PWludCBwYWdlX2dyb3VwX2J5X21vYmlsaXR5X2Rpc2FibGVkIF9fcmVhZF9tb3N0bHk7XG5tbS9wYWdlX2FsbG9jLmMtMzA2LVxubW0vcGFnZV9hbGxvYy5jOjMwNzojaWZkZWYgQ09ORklHX0RFRkVSUkVEX1NUUlVDVF9QQUdFX0lOSVRcbm1tL3BhZ2VfYWxsb2MuYy0zMDgtLypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzM0PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqZ2V0X3BhZ2VibG9ja19iaXRtYXAoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTMzNi17XG5tbS9wYWdlX2FsbG9jLmM6MzM3OiNpZmRlZiBDT05GSUdfU1BBUlNFTUVNXG5tbS9wYWdlX2FsbG9jLmMtMzM4LVx0cmV0dXJuIHNlY3Rpb25fdG9fdXNlbWFwKF9fcGZuX3RvX3NlY3Rpb24ocGZuKSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTM0ND1zdGF0aWMgaW5saW5lIGludCBwZm5fdG9fYml0aWR4KGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbilcbm1tL3BhZ2VfYWxsb2MuYy0zNDUte1xubW0vcGFnZV9hbGxvYy5jOjM0NjojaWZkZWYgQ09ORklHX1NQQVJTRU1FTVxubW0vcGFnZV9hbGxvYy5jLTM0Ny1cdHBmbiBcdTAwMjY9IChQQUdFU19QRVJfU0VDVElPTi0xKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzYwPWdldF9wZm5ibG9ja19iaXRtYXBfYml0aWR4KGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMzY1LVxubW0vcGFnZV9hbGxvYy5jOjM2NjojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cbm1tL3BhZ2VfYWxsb2MuYy0zNjctXHRCVUlMRF9CVUdfT04oTlJfUEFHRUJMT0NLX0JJVFMgIT0gOCk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTQ0Mj1nZXRfcGZuYmxvY2tfbWlncmF0ZXR5cGUoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgcGZuKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy00NDgtXG5tbS9wYWdlX2FsbG9jLmM6NDQ5OiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxubW0vcGFnZV9hbGxvYy5jLTQ1MC1cdGlmIChmbGFncyBcdTAwMjYgQklUKFBCX21pZ3JhdGVfaXNvbGF0ZSkpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTUyNj1zdGF0aWMgdm9pZCBzZXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01MzItXG5tbS9wYWdlX2FsbG9jLmM6NTMzOiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxubW0vcGFnZV9hbGxvYy5jLTUzNC1cdGlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIHtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTQ4PXZvaWQgX19tZW1pbml0IGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01NTktXG5tbS9wYWdlX2FsbG9jLmM6NTYwOiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxubW0vcGFnZV9hbGxvYy5jLTU2MS1cdGlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTczLVxubW0vcGFnZV9hbGxvYy5jOjU3NDojaWZkZWYgQ09ORklHX0RFQlVHX1ZNXG5tbS9wYWdlX2FsbG9jLmMtNTc1LXN0YXRpYyBpbnQgcGFnZV9vdXRzaWRlX3pvbmVfYm91bmRhcmllcyhzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHBhZ2UgKnBhZ2UpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTY2MT1zdGF0aWMgaW5saW5lIGJvb2wgcGNwX2FsbG93ZWRfb3JkZXIodW5zaWduZWQgaW50IG9yZGVyKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy02NjQtXHRcdHJldHVybiB0cnVlO1xubW0vcGFnZV9hbGxvYy5jOjY2NTojaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9wYWdlX2FsbG9jLmMtNjY2LVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTY5Nj1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2J1ZGR5X29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTcwMS1cbm1tL3BhZ2VfYWxsb2MuYzo3MDI6I2lmZGVmIENPTkZJR19DT01QQUNUSU9OXG5tbS9wYWdlX2FsbG9jLmMtNzAzLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNhcHR1cmVfY29udHJvbCAqdGFza19jYXBjKHN0cnVjdCB6b25lICp6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xMDE1PXN0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2V4cGVjdGVkX3N0YXRlKHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xMDIyLVx0XHRcdHBhZ2VfcmVmX2NvdW50KHBhZ2UpIHxcbm1tL3BhZ2VfYWxsb2MuYzoxMDIzOiNpZmRlZiBDT05GSUdfTUVNQ0dcbm1tL3BhZ2VfYWxsb2MuYy0xMDI0LVx0XHRcdHBhZ2UtXHUwMDNlbWVtY2dfZGF0YSB8XG4tLVxubW0vcGFnZV9hbGxvYy5jPTEwMzM9c3RhdGljIGNvbnN0IGNoYXIgKnBhZ2VfYmFkX3JlYXNvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBmbGFncylcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTA0OC1cdH1cbm1tL3BhZ2VfYWxsb2MuYzoxMDQ5OiNpZmRlZiBDT05GSUdfTUVNQ0dcbm1tL3BhZ2VfYWxsb2MuYy0xMDUwLVx0aWYgKHVubGlrZWx5KHBhZ2UtXHUwMDNlbWVtY2dfZGF0YSkpXG4tLVxubW0vcGFnZV9hbGxvYy5jPTEyMDI9c3RhdGljIHZvaWQgY2xlYXJfaGlnaHBhZ2VzX2thc2FuX3RhZ2dlZChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xMjE2LVxubW0vcGFnZV9hbGxvYy5jOjEyMTc6I2lmZGVmIENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HXG5tbS9wYWdlX2FsbG9jLmMtMTIxOC1cbi0tXG5tbS9wYWdlX2FsbG9jLmM9MTI5OD1zdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgX19mcmVlX3BhZ2VzX3ByZXBhcmUoc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTEzNTctXHRcdFx0cGFnZVsxXS5mbGFncy5mIFx1MDAyNj0gflBBR0VfRkxBR1NfU0VDT05EO1xubW0vcGFnZV9hbGxvYy5jOjEzNTg6I2lmZGVmIE5SX1BBR0VTX0lOX0xBUkdFX0ZPTElPXG5tbS9wYWdlX2FsbG9jLmMtMTM1OS1cdFx0XHRmb2xpby1cdTAwM2VfbnJfcGFnZXMgPSAwO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xOTE1PXN0YXRpYyBpbnQgZmFsbGJhY2tzW01JR1JBVEVfUENQVFlQRVNdW01JR1JBVEVfUENQVFlQRVMgLSAxXSA9IHtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTkyMC1cbm1tL3BhZ2VfYWxsb2MuYzoxOTIxOiNpZmRlZiBDT05GSUdfQ01BXG5tbS9wYWdlX2FsbG9jLmMtMTkyMi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHN0cnVjdCBwYWdlICpfX3JtcXVldWVfY21hX2ZhbGxiYWNrKHN0cnVjdCB6b25lICp6b25lLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yMDE5PXN0YXRpYyBpbnQgbW92ZV9mcmVlcGFnZXNfYmxvY2soc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0yMDM0LVxubW0vcGFnZV9hbGxvYy5jOjIwMzU6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXG5tbS9wYWdlX2FsbG9jLmMtMjAzNi0vKiBMb29rIGZvciBhIGJ1ZGR5IHRoYXQgc3RyYWRkbGVzIHN0YXJ0X3BmbiAqL1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yNTU4PWJvb2wgZGVjYXlfcGNwX2hpZ2goc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3ApXG4tLVxubW0vcGFnZV9hbGxvYy5jLTI1OTAtXG5tbS9wYWdlX2FsbG9jLmM6MjU5MTojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0yNTkyLS8qXG4tLVxubW0vcGFnZV9hbGxvYy5jPTMxNzk9c3RhdGljIGlubGluZSB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZSAqcHJlZmVycmVkX3pvbmUsIHN0cnVjdCB6b25lICp6LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0zMTgxLXtcbm1tL3BhZ2VfYWxsb2MuYzozMTgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vcGFnZV9hbGxvYy5jLTMxODMtXHRlbnVtIG51bWFfc3RhdF9pdGVtIGxvY2FsX3N0YXQgPSBOVU1BX0xPQ0FMO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNTUzPXN0YXRpYyBpbmxpbmUgbG9uZyBfX3pvbmVfd2F0ZXJtYXJrX3VudXNhYmxlX2ZyZWUoc3RydWN0IHpvbmUgKnosXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM1NjQtXG5tbS9wYWdlX2FsbG9jLmM6MzU2NTojaWZkZWYgQ09ORklHX0NNQVxubW0vcGFnZV9hbGxvYy5jLTM1NjYtXHQvKiBJZiBhbGxvY2F0aW9uIGNhbiYjMzk7dCB1c2UgQ01BIGFyZWFzIGRvbiYjMzk7dCB1c2UgZnJlZSBDTUEgcGFnZXMgKi9cbi0tXG5tbS9wYWdlX2FsbG9jLmM9MzU4MD1ib29sIF9fem9uZV93YXRlcm1hcmtfb2soc3RydWN0IHpvbmUgKnosIHVuc2lnbmVkIGludCBvcmRlciwgdW5zaWduZWQgbG9uZyBtYXJrLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0zNjQzLVxubW0vcGFnZV9hbGxvYy5jOjM2NDQ6I2lmZGVmIENPTkZJR19DTUFcbm1tL3BhZ2VfYWxsb2MuYy0zNjQ1LVx0XHRpZiAoKGFsbG9jX2ZsYWdzIFx1MDAyNiBBTExPQ19DTUEpIFx1MDAyNlx1MDAyNlxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNjY1PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX3dhdGVybWFya19mYXN0KHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3MDktXG5tbS9wYWdlX2FsbG9jLmM6MzcxMDojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0zNzExLWludCBfX3JlYWRfbW9zdGx5IG5vZGVfcmVjbGFpbV9kaXN0YW5jZSA9IFJFQ0xBSU1fRElTVEFOQ0U7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTM3MzQ9YWxsb2NfZmxhZ3Nfbm9mcmFnbWVudChzdHJ1Y3Qgem9uZSAqem9uZSwgZ2ZwX3QgZ2ZwX21hc2spXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3NDUtXG5tbS9wYWdlX2FsbG9jLmM6Mzc0NjojaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcbm1tL3BhZ2VfYWxsb2MuYy0zNzQ3LVx0aWYgKCF6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNzY4PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzX2NtYShnZnBfdCBnZnBfbWFzaylcbm1tL3BhZ2VfYWxsb2MuYy0zNzY5LXtcbm1tL3BhZ2VfYWxsb2MuYzozNzcwOiNpZmRlZiBDT05GSUdfQ01BXG5tbS9wYWdlX2FsbG9jLmMtMzc3MS1cdGlmIChnZnBfbWlncmF0ZXR5cGUoZ2ZwX21hc2spID09IE1JR1JBVEVfTU9WQUJMRSlcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NDAyNj1fX2FsbG9jX3BhZ2VzX21heV9vb20oZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNDExNy1cbm1tL3BhZ2VfYWxsb2MuYzo0MTE4OiNpZmRlZiBDT05GSUdfQ09NUEFDVElPTlxubW0vcGFnZV9hbGxvYy5jLTQxMTktLyogVHJ5IG1lbW9yeSBjb21wYWN0aW9uIGZvciBoaWdoLW9yZGVyIGFsbG9jYXRpb25zIGJlZm9yZSByZWNsYWltICovXG4tLVxubW0vcGFnZV9hbGxvYy5jPTQzMDc9c2hvdWxkX2NvbXBhY3RfcmV0cnkoZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBhbGxvY19jb250ZXh0ICphYywgaW50IG9yZGVyLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy00MzM0LVxubW0vcGFnZV9hbGxvYy5jOjQzMzU6I2lmZGVmIENPTkZJR19MT0NLREVQXG5tbS9wYWdlX2FsbG9jLmMtNDMzNi1zdGF0aWMgc3RydWN0IGxvY2tkZXBfbWFwIF9fZnNfcmVjbGFpbV9tYXAgPVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz00MzY1PXZvaWQgZnNfcmVjbGFpbV9hY3F1aXJlKGdmcF90IGdmcF9tYXNrKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy00MzcyLVxubW0vcGFnZV9hbGxvYy5jOjQzNzM6I2lmZGVmIENPTkZJR19NTVVfTk9USUZJRVJcbm1tL3BhZ2VfYWxsb2MuYy00Mzc0LVx0XHRsb2NrX21hcF9hY3F1aXJlKFx1MDAyNl9fbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnRfbWFwKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTE1ND11bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTUxODktXG5tbS9wYWdlX2FsbG9jLmM6NTE5MDojaWZkZWYgQ09ORklHX1BBR0VfT1dORVJcbm1tL3BhZ2VfYWxsb2MuYy01MTkxLVx0Lypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTc0NT1zdGF0aWMgaW50IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwgc3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01NzYyLVxubW0vcGFnZV9hbGxvYy5jOjU3NjM6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNTc2NC1cbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTkxMj1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTkxNy1cbm1tL3BhZ2VfYWxsb2MuYzo1OTE4OiNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG5tbS9wYWdlX2FsbG9jLmMtNTkxOS0vKlxuLS1cbm1tL3BhZ2VfYWxsb2MuYz01OTc3PXN0YXRpYyB2b2lkIF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkYXRhKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01OTk2LVxubW0vcGFnZV9hbGxvYy5jOjU5OTc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNTk5OC1cdG1lbXNldChub2RlX2xvYWQsIDAsIHNpemVvZihub2RlX2xvYWQpKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjAxNy1cbm1tL3BhZ2VfYWxsb2MuYzo2MDE4OiNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG5tbS9wYWdlX2FsbG9jLmMtNjAxOS1cdFx0Lypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NjA2OT12b2lkIF9fcmVmIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjA5Ni1cdFx0dm1fdG90YWxfcGFnZXMpO1xubW0vcGFnZV9hbGxvYy5jOjYwOTc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNjA5OC1cdHByX2luZm8oXCYjMzQ7UG9saWN5IHpvbmU6ICVzXFxuXCYjMzQ7LCB6b25lX25hbWVzW3BvbGljeV96b25lXSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTYxMDI9c3RhdGljIGludCB6b25lX2JhdGNoc2l6ZShzdHJ1Y3Qgem9uZSAqem9uZSlcbm1tL3BhZ2VfYWxsb2MuYy02MTAzLXtcbm1tL3BhZ2VfYWxsb2MuYzo2MTA0OiNpZmRlZiBDT05GSUdfTU1VXG5tbS9wYWdlX2FsbG9jLmMtNjEwNS1cdGludCBiYXRjaDtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NjE1MD1zdGF0aWMgaW50IHpvbmVfaGlnaHNpemUoc3RydWN0IHpvbmUgKnpvbmUsIGludCBiYXRjaCwgaW50IGNwdV9vbmxpbmUsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTYxNTIte1xubW0vcGFnZV9hbGxvYy5jOjYxNTM6I2lmZGVmIENPTkZJR19NTVVcbm1tL3BhZ2VfYWxsb2MuYy02MTU0LVx0aW50IGhpZ2g7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTYzNjA9dm9pZCBfX2luaXQgc2V0dXBfcGVyX2NwdV9wYWdlc2V0KHZvaWQpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTYzNjgtXG5tbS9wYWdlX2FsbG9jLmM6NjM2OTojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy02MzcwLVx0Lypcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NjcyMz1pbnQgX19tZW1pbml0IGluaXRfcGVyX3pvbmVfd21hcmtfbWluKHZvaWQpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTY3MjktXG5tbS9wYWdlX2FsbG9jLmM6NjczMDojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy02NzMxLVx0c2V0dXBfbWluX3VubWFwcGVkX3JhdGlvKCk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTY3NjI9c3RhdGljIGludCB3YXRlcm1hcmtfc2NhbGVfZmFjdG9yX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTY3NzYtXG5tbS9wYWdlX2FsbG9jLmM6Njc3NzojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy02Nzc4LXN0YXRpYyB2b2lkIHNldHVwX21pbl91bm1hcHBlZF9yYXRpbyh2b2lkKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz02OTE4PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIHBhZ2VfYWxsb2Nfc3lzY3RsX3RhYmxlW10gPSB7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTY5NjgtXHR9LFxubW0vcGFnZV9hbGxvYy5jOjY5Njk6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtNjk3MC1cdHtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NzA5Nz12b2lkIF9fZnJlZV9jb250aWdfcmFuZ2UodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTcxMDEtXG5tbS9wYWdlX2FsbG9jLmM6NzEwMjojaWZkZWYgQ09ORklHX0NPTlRJR19BTExPQ1xubW0vcGFnZV9hbGxvYy5jLTcxMDMtLyogVXNhZ2U6IFNlZSBhZG1pbi1ndWlkZS9keW5hbWljLWRlYnVnLWhvd3RvLnJzdCAqL1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz03Njc0PXZvaWQgem9uZV9wY3BfcmVzZXQoc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc2OTItXG5tbS9wYWdlX2FsbG9jLmM6NzY5MzojaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcbm1tL3BhZ2VfYWxsb2MuYy03Njk0LS8qXG4tLVxubW0vcGFnZV9hbGxvYy5jPTc3NjY9RVhQT1JUX1NZTUJPTChpc19mcmVlX2J1ZGR5X3BhZ2UpO1xubW0vcGFnZV9hbGxvYy5jLTc3NjctXG5tbS9wYWdlX2FsbG9jLmM6Nzc2ODojaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFXG5tbS9wYWdlX2FsbG9jLmMtNzc2OS1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHpvbmUgKnpvbmUsXG4tLVxubW0vcGFnZV9hbGxvYy5jPTc4NjE9Ym9vbCBoYXNfbWFuYWdlZF96b25lKGVudW0gem9uZV90eXBlIHpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc4NzEtXG5tbS9wYWdlX2FsbG9jLmM6Nzg3MjojaWZkZWYgQ09ORklHX1VOQUNDRVBURURfTUVNT1JZXG5tbS9wYWdlX2FsbG9jLmMtNzg3My1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjk2MjUKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGEgQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24gQmxvY2sqKgoKT2theSwgc28gbGluZSA1NzYzIG9mIHRoaXMgY29kZSBoYXMgYSBgI2lmZGVmIENPTkZJR19OVU1BYCBkaXJlY3RpdmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1JpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2NvcGUgb2YgdGhhdCBjb25kaXRpb25hbCBjb21waWxhdGlvbi4mIzM0OyBJdCYjMzk7cyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgTlVNQS1hd2FyZSBtZW1vcnkgYWxsb2NhdGlvbiB3b3JrcyBpbiB0aGlzIHNwZWNpZmljIGNvbnRleHQuIFRoZSBmaXJzdCB0aGluZyBJJiMzOTttIGdvaW5nIHRvIGRvIGlzIGxvY2F0ZSB3aGVyZSB0aGF0IGAjaWZkZWZgIGJsb2NrIHRlcm1pbmF0ZXMuIEdpdmVuIHRoZSBsaWtlbHkgc3RydWN0dXJlIG9mIHRoZSBjb2RlLCBJJiMzOTtsbCBiZXQgaXQmIzM5O3Mgbm90IGZhciBmcm9tIHRoZSBsaW5lLiBNeSBmb2N1cyBub3cgaXMgb24gbGluZXMgNTkzMC01OTQ1IHdpdGhpbiBgbW0vcGFnZV9hbGxvYy5jYCwgSSYjMzk7bGwgc3RhcnQgdGhlcmUgbG9va2luZyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYCNlbmRpZmAgc3RhdGVtZW50IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgY29kZSB0aGF0JiMzOTtzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgdGhlIE5VTUEgY29uZmlnLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzICppbnNpZGUqIHRoYXQgYmxvY2sgdG8gZ2V0IGEgZnVsbCBwaWN0dXJlIG9mIHRoZSBpbXBhY3Qgb2YgdGhlIE5VTUEgY29uZmlndXJhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9wYWdlX2FsbG9jLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1OTMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzU5MzA6XHRcdFx0XHRcdCAgIGdmcF96b25lKEdGUF9LRVJORUwpLFxuNTkzMTpcdFx0XHRcdFx0ICAgTlVMTCk7XG41OTMyOlx0XHRyZXR1cm4gem9uZWxpc3Rfbm9kZV9pZHgoeik7XG41OTMzOlx0fVxuNTkzNDpcdCNlbmRpZlxuNTkzNTpcdFxuNTkzNjpcdHN0YXRpYyB2b2lkIHNldHVwX21pbl91bm1hcHBlZF9yYXRpbyh2b2lkKTtcbjU5Mzc6XHRzdGF0aWMgdm9pZCBzZXR1cF9taW5fc2xhYl9yYXRpbyh2b2lkKTtcbjU5Mzg6XHQjZWxzZVx0LyogQ09ORklHX05VTUEgKi9cbjU5Mzk6XHRcbjU5NDA6XHRzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbjU5NDE6XHR7XG41OTQyOlx0XHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnM7XG41OTQzOlx0XHRpbnQgbnJfem9uZXM7XG41OTQ0Olx0XG41OTQ1Olx0XHR6b25lcmVmcyA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7XG41OTQ2Olx0XHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdkYXQsIHpvbmVyZWZzKTtcbjU5NDc6XHRcdHpvbmVyZWZzICYjNDM7PSBucl96b25lcztcbjU5NDg6XHRcbjU5NDk6XHRcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDIxMAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDEyMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRm9jdXNpbmcgb24gTlVNQSBNZW1vcnkgTWFuYWdlbWVudCBmb3IgRnV6emluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB0aGUgY29kZSBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vcGFnZV9hbGxvYy5jYCBsb29rcyBpbnRlcmVzdGluZywgZXNwZWNpYWxseSBjb25zaWRlcmluZyBpdCYjMzk7cyB1bmRlciBgI2lmZGVmIENPTkZJR19OVU1BYCBhbmQgc3BlY2lmaWNhbGx5LCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBpcyBwcm90ZWN0ZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gLCB3aGljaCBpbXBsaWVzIGl0JiMzOTtzIHJlbGV2YW50IHRvIE5VTUEgYW5kIG1lbW9yeSBtaWdyYXRpb24uIFNvLCBib3RoIGBDT05GSUdfTlVNQWAgYW5kIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGFyZSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuCgpOb3csIGlzIHRoaXMgY29kZSBldmVuIHdvcnRoIGZ1enppbmc/IERlZmluaXRlbHkuIFRoaXMgaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyB3aXRoaW4gdGhlIGBtbS9gIHN1YnN5c3RlbS4gSSYjMzk7dmUgZ290IGNoYW5nZXMgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGFuZCBgYnVpbGRfbm9kZV96b25lbGlzdGAgaW4gYG1tL3BhZ2VfYWxsb2MuY2AsIGFuZCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBDcnVjaWFsbHksIHRoaXMgY29kZSBpcyByZWFjaGFibGUgaW4gYSBOVU1BLWVuYWJsZWQga2VybmVsIHJ1bm5pbmcgaW4gUUVNVSBiZWNhdXNlIGBidWlsZF9ub2RlX3pvbmVsaXN0YCAob3IgYGJ1aWxkX3pvbmVsaXN0c2ApIGlzIGV4ZWN1dGVkIGF0IGJvb3QsIGR1cmluZyBtZW1vcnkgaG90cGx1ZyBhbmQgd2hlbiB0cmlnZ2VyZWQgYnkgbWVtb3J5IHByZXNzdXJlLCB0aGUgYG5leHRfZGVtb3Rpb25fbm9kZWAgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIG1lbW9yeSByZWNsYWltLiBGdXJ0aGVybW9yZSwgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBpcyBjYWxsZWQgYXQgYm9vdCBhbmQgb24gaG90cGx1ZyAvIHN5c2ZzIG1lbW9yeSB0aWVyIG9wZXJhdGlvbnMuIFRoaXMgZGlyZWN0bHkgaW1wYWN0cyBob3cgTlVNQSB6b25lbGlzdHMgYXJlIGJ1aWx0IGFuZCBob3cgd2Ugc2VsZWN0IG5vZGVzIGZvciBmYWxsYmFjayBhbmQgZGVtb3Rpb24sIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgcmVmYWN0b3JpbmcgYW5kIGxvZ2ljIGNoYW5nZSB0aGUgZnV6emluZyBndWlkZWxpbmVzIGhpZ2hsaWdodCBhcyBhIGhpZ2gtdmFsdWUgdGFyZ2V0LiBJdCYjMzk7cyBhIGNsZWFyICYjMzk7V29ydGhGdXp6aW5nPXRydWUmIzM5Oy4KClNvLCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIHNwZWNpZmljcyBvZiBGb2N1c1N5bWJvbHMuIEkmIzM5O20gZm9sbG93aW5nIHRoZSBndWlkZWxpbmVzLCB3aGljaCBzYXlzIHRvIGF2b2lkIHViaXF1aXRvdXMgaG90LXBhdGhzIGFuZCBpbnN0ZWFkIHRhcmdldCBzcGVjaWZpYyBmZWF0dXJlIGxvZ2ljIGFuZCBlbnRyeXBvaW50cy4KCkhlcmXigJlzIHRoZSBjdXJyZW50IHRoaW5raW5nOgoKMS4gIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBpbiBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBpcyBub24tc3RhdGljIChkZWNsYXJlZCBpbiBgbW0vaW50ZXJuYWwuaGAgYW5kIGRlZmluZWQgaW4gYG1tL3BhZ2VfYWxsb2MuY2ApIGFuZCBpcyBvbmx5IGNhbGxlZCB3aGVuIGJ1aWxkaW5nIHpvbmVsaXN0cyBvciBmaW5kaW5nIGRlbW90aW9uIHRhcmdldHMsIHNvIGl0JiMzOTtzIG5vdCB1YmlxdWl0b3VzLiBEZWZpbml0ZWx5IGEgY29udGVuZGVyLgoKMi4gIGBidWlsZF9ub2RlX3pvbmVsaXN0YCBpbiBgbW0vcGFnZV9hbGxvYy5jYCBpcyBzdGF0aWMsIHdoaWNoIG1pZ2h0IG1ha2UgaXQgaW5saW5lZCwgc28gcG90ZW50aWFsbHkgdXNlbGVzcyBhcyBhIGZ1enppbmcgc3ltYm9sLiBCdXQsIGl0JiMzOTtzIGNhbGxlZCBieSBgYnVpbGRfem9uZWxpc3RzYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgX19idWlsZF9hbGxfem9uZWxpc3RzYCwgd2hpY2ggaXMgKmFsc28qIGNhbGxlZCBvbiBib290IGFuZCBob3RwbHVnLCBzbyB0aGlzICpjb3VsZCogYmUgZ29vZC4gTGV0JiMzOTtzIGNoZWNrIGlmIHRoZSBkZWZpbml0aW9uIGlzIGlubGluZWQuLi4gT2gsIEkgc2VlISBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgaXMgKm5vdCogc3RhdGljLCBzbyBpdCAqaXMqIGFuIGFjdHVhbCBzeW1ib2wuIEdvb2QsIGdvb2QuCgozLiAgYG5leHRfZGVtb3Rpb25fbm9kZWAgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBub24tc3RhdGljLiBBZ2Fpbiwgbm90IHViaXF1aXRvdXMsIG9ubHkgdXNlZCBpbiBgZGVtb3RlX2ZvbGlvX2xpc3RgLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gVGhpcyBpcyBhIHNvbGlkIGNhbmRpZGF0ZS4KCjQuICBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgc3RhdGljLiBJIG5lZWQgdG8gZmluZCB0aGUgbm9uLXN0YXRpYyBmdW5jdGlvbnMgdGhhdCBjYWxsIGl0IG9yIGFyZSBlbnRyeXBvaW50cyB0byBpdHMgZnVuY3Rpb25hbGl0eS4gTG9va2luZyBhdCB0aGUgY2FsbGVycywgSSBoYXZlIGBtZW1vcnlfdGllcl9sYXRlX2luaXRgIGFuZCBgbWVtdGllcl9ob3RwbHVnX2NhbGxiYWNrYCBhcyBjYW5kaWRhdGVzLiBJIHNob3VsZCBhbHNvIGNoZWNrIHdpdGhpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGl0c2VsZi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYz00MDA9c3RhdGljIHZvaWQgZHVtcF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNDI0LSAqL1xubW0vbWVtb3J5LXRpZXJzLmM6NDI1OnN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG5tbS9tZW1vcnktdGllcnMuYy00MjYte1xuLS1cbm1tL21lbW9yeS10aWVycy5jLTUyMS0jZWxzZVxubW0vbWVtb3J5LXRpZXJzLmM6NTIyOnN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxubW0vbWVtb3J5LXRpZXJzLmMtNTIzLSNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbi0tXG5tbS9tZW1vcnktdGllcnMuYz03MDg9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfbGF0ZV9pbml0KHZvaWQpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNzMxLVxubW0vbWVtb3J5LXRpZXJzLmM6NzMyOlx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcbm1tL21lbW9yeS10aWVycy5jLTczMy1cdHB1dF9vbmxpbmVfbWVtcygpO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTg4Mj1zdGF0aWMgaW50IF9fbWVtaW5pdCBtZW10aWVyX2hvdHBsdWdfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLFxuLS1cbm1tL21lbW9yeS10aWVycy5jLTg5MS1cdFx0aWYgKGNsZWFyX25vZGVfbWVtb3J5X3RpZXIobm4tXHUwMDNlbmlkKSlcbm1tL21lbW9yeS10aWVycy5jOjg5MjpcdFx0XHRlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpO1xubW0vbWVtb3J5LXRpZXJzLmMtODkzLVx0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtODk4LVx0XHRpZiAoIUlTX0VSUihtZW10aWVyKSlcbm1tL21lbW9yeS10aWVycy5jOjg5OTpcdFx0XHRlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpO1xubW0vbWVtb3J5LXRpZXJzLmMtOTAwLVx0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyNjgwCgkJCQkJCQlvdXRwdXQ6IDE5NwoJCQkJCQkJdGhvdWdodHM6IDkwNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQ29kZSBDaGFuZ2VzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGxvb2tzIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHpvbmVsaXN0IHJlYnVpbGRpbmcsIHdoaWNoIGlzIGEgZ29vZCBwbGFjZSB0byBzdGFydC4gIFRoZSByZWFsIHdvcmsgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIGluIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCwgYW5kIHRoZSBub24tc3RhdGljIGZ1bmN0aW9uIGBuZXh0X2RlbW90aW9uX25vZGVgIHVzZWQgZHVyaW5nIGRlbW90aW9uLiAgSSBzZWUgYSBzdGF0aWMgZnVuY3Rpb24sIGBkZW1vdGVfZm9saW9fbGlzdGAsIGFzIHdlbGwgYnV0IHRoYXQgbWF5IGJlIGxlc3MgcmVsZXZhbnQgaGVyZS4gIGBidWlsZF9hbGxfem9uZWxpc3RzYCBpcyBhbHNvIG5vbi1zdGF0aWMsIHNvIHRob3NlIGFyZSBteSBrZXkgdGFyZ2V0cy4KCkkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBicm9hZGx5IHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZC4gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGlzIGludm9sdmVkIGluIHpvbmVsaXN0IGNvbnN0cnVjdGlvbiwgZGVtb3Rpb24sIGFuZCBmaW5kaW5nIHRoZSBiZXN0IG5vZGUsIHNvIHBvdGVudGlhbGx5IGltcG9ydGFudC4gIGBuZXh0X2RlbW90aW9uX25vZGVgIGFwcGVhcnMgbGltaXRlZCB0byBmb2xpbyBkZW1vdGlvbiwgYW5kIGBidWlsZF9hbGxfem9uZWxpc3RzYCBraWNrcyBpbiBkdXJpbmcgYm9vdCwgbWVtb3J5IGhvdHBsdWcvb2ZmbGluaW5nLCBhbmQgem9uZWxpc3QgcmVidWlsZHMg4oCTIG5vdCBleGFjdGx5ICp1YmlxdWl0b3VzKiwgYnV0IGRlZmluaXRlbHkgY3JpdGljYWwgc3lzdGVtIGV2ZW50cy4KCk5vdywgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiAgSSYjMzk7bSBzZWVpbmcgYE5VTUFgIGFzIGEgcmVxdWlyZW1lbnQgZm9yIHRoZSBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgaW1wbGVtZW50YXRpb24gYW5kIGNvbXBpbGluZyBgbW0vbWVtb3J5LXRpZXJzLmNgLiAgYE5VTUFfTUlHUkFUSU9OYCByZXF1aXJlcyBgTlVNQWAgYW5kIGBNTVVgICh3aGljaCBpcyBwcmV0dHkgbXVjaCBzdGFuZGFyZCBvbiBhbWQ2NCksIHNwZWNpZmljYWxseSBmb3IgYG5leHRfZGVtb3Rpb25fbm9kZWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaW4gYG1tL21lbW9yeS10aWVycy5jYC4gIFNvLCBgTlVNQWAgYW5kIGBOVU1BX01JR1JBVElPTmAgYXJlIGtleSBjb25maWcgb3B0aW9ucy4KCkRyaWxsaW5nIGludG8gdGhlIGNvZGUsIGBtbS9wYWdlX2FsbG9jLmNgIHNob3dzIHRoYXQgYG5vZGVfbG9hZGAsIGBidWlsZF9ub2RlX3pvbmVsaXN0YCwgYW5kIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBhcmUgYWxsIGd1YXJkZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQWAuIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgY29tcGlsZWQgdW5kZXIgYG9iai0kKENPTkZJR19OVU1BKSAmIzQzOz0gbWVtb3J5LXRpZXJzLm9gLiAgV2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AsIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGFyZSBwcm90ZWN0ZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gLiAgSSYjMzk7dmUgY2hlY2tlZCB0aGUgYE1ha2VmaWxlYCBhbmQgYG1lbW9yeS10aWVycy5oYCB0byBjb25maXJtIHRoZSBkZXBlbmRlbmNpZXMuCgpJbiBzdW1tYXJ5OgoqICAgVGhlIHBhdGNoIHJlZmFjdG9ycyBgZmluZF9uZXh0X2Jlc3Rfbm9kZWAgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIHdpdGggYSBjYW5kaWRhdGUgbm9kZW1hc2suCiogICBJdCB1cGRhdGVzIE5VTUEgZmFsbGJhY2sgem9uZWxpc3QgY29uc3RydWN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgIHdoaWNoIHN0cmVhbWxpbmVzIHpvbmVsaXN0IGdlbmVyYXRpb24gZGlyZWN0bHkgaW50byB0aGUgbm9kZSB6b25lbGlzdCBidWZmZXIuCiogICBJdCBtb2RpZmllcyBkZW1vdGlvbiBub2RlIHNlbGVjdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIHRvIHVzZSB0aGUgcmVmYWN0b3JlZCBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAKKiAgIFRoZSBjb2RlIHRvdWNoZXMgZnVuZGFtZW50YWwgTU0gbG9naWMsIHNwZWNpZmljYWxseSBOVU1BIHpvbmVsaXN0IGNvbnN0cnVjdGlvbiBhbmQgbWVtb3J5IHRpZXJpbmcgKGluY2x1ZGluZyBkZW1vdGlvbiB0YXJnZXQgY2FsY3VsYXRpb25zKSB0cmlnZ2VyZWQgZHVyaW5nIGJvb3QsIG1lbW9yeSBob3RwbHVnL29mZmxpbmUsIGFuZCBtZW1vcnkgcmVjbGFpbSBpZiBOVU1BIGRlbW90aW9uIGlzIGVuYWJsZWQuCgpUaGVyZWZvcmUsIHRoaXMgaXMgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuIFRoZSBrZXkgZnVuY3Rpb25zIHRvIHRhcmdldCBhcmUgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gLCBgbmV4dF9kZW1vdGlvbl9ub2RlYCwgYW5kIGBidWlsZF9hbGxfem9uZWxpc3RzYCwgYW5kIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgSSBuZWVkIHRvIGVuYWJsZSBhcmUgYE5VTUFgIGFuZCBgTlVNQV9NSUdSQVRJT05gLiAgSSYjMzk7bSBjb21mb3J0YWJsZSB3aXRoIHRoZSBhbmFseXNpcywgc28gbGV0JiMzOTtzIHNldCB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtmaW5kX25leHRfYmVzdF9ub2RlX2luJiMzNDssCiAgICAmIzM0O25leHRfZGVtb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDtidWlsZF9hbGxfem9uZWxpc3RzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgTlVNQSB6b25lbGlzdCBnZW5lcmF0aW9uIGFuZCBub2RlIGZhbGxiYWNrIGNhbGN1bGF0aW9uIGJ5IGludHJvZHVjaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIHdpdGggYSBgY2FuZGlkYXRlc2Agbm9kZW1hc2sgcGFyYW1ldGVyIGFuZCBtZXJnaW5nIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgLlxuXG4tIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZSAobm8gaW5mby1sZWFrcykuXG4tIE5vIG5ldyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGludHJvZHVjZWQuXG4tIEFsbCB2YXJpYWJsZXMgKHN1Y2ggYXMgYHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FYCkgYW5kIHpvbmVyZWYgdGVybWluYXRpb25zIChgem9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTExgLCBgem9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwYCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLlxuLSBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludHJvZHVjZWQgYnkgem9uZWxpc3QgaW5kZXhpbmcgb3IgdHJhdmVyc2FsIHdvdWxkIGJlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgcG9pbnRlciBlcnJvcnMsIHdoaWNoIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBLTVNBTiB1bmluaXRpYWxpemVkIG1lbW9yeSBkZXRlY3Rpb24gaXMgbm90IGFwcGxpY2FibGUuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMDM6Mzc6MDIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCBkYTE0YzU2ZmIyNGUxLi4xNTE5ZGQyMWE5MDBmIDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTExMzMsNyAmIzQzOzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKIAkJCQkgIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwotZXh0ZXJuIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayk7CiYjNDM7aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLAomIzQzOwkJY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyk7CiAjZWxzZQogI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwCiAKQEAgLTExNDIsNyAmIzQzOzExNDMsOCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaywKJiM0MzsJCWNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpCiB7CiAJcmV0dXJuIE5VTUFfTk9fTk9ERTsKIH0KZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmMKaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmMKQEAgLTM3MCw3ICYjNDM7MzcwLDcgQEAgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKQogCSAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LgogCSAqLwogCW5vZGVzX2NvbXBsZW1lbnQobWFzaywgKmFsbG93ZWRfbWFzayk7Ci0JcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgJmFtcDttYXNrKTsKJiM0MzsJcmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDttYXNrLCAmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZCkKQEAgLTQ1MCw3ICYjNDM7NDUwLDcgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkKIAkJbWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTsKIAkJdGllcl9ub2RlcyA9IGdldF9tZW10aWVyX25vZGVtYXNrKG1lbXRpZXIpOwogCQkvKgotCQkgKiBmaW5kX25leHRfYmVzdF9ub2RlLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiYjNDM7CQkgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJiMzOTt1c2VkJiMzOTsgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuCiAJCSAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXIKIAkJICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlCiAJCSAqIG1lbXRpZXIgbm9kZWxpc3QuCkBAIC00NjMsNyAmIzQzOzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpCiAJCSAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLgogCQkgKi8KIAkJZG8gewotCQkJdGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCAmYW1wO3RpZXJfbm9kZXMpOwomIzQzOwkJCXRhcmdldCA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDt0aWVyX25vZGVzLAomIzQzOwkJCQkJCQkmYW1wO25vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiAJCQlpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSkKIAkJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDFjZmJkMDU4MmExMGEuLmQxODg4ZDU2MzBlMGEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTU3OTMsOSAmIzQzOzU3OTMsMTAgQEAgc3RhdGljIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CiAKIC8qKgotICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QKJiM0MzsgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdAogICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSYjMzk7cmUgYXBwZW5kaW5nCiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzCiYjNDM7ICogQGNhbmRpZGF0ZXM6IG5vZGVtYXNrX3Qgb2Ygbm9kZXMgZWxpZ2libGUgZm9yIHNlbGVjdGlvbgogICoKICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkCiAgKiBhcHBlYXIgb24gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWQKQEAgLTU4MDcsNyAmIzQzOzU4MDgsOCBAQCBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOwogICoKICAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuCiAgKi8KLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssCiYjNDM7CQkJICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcykKIHsKIAlpbnQgbiwgdmFsOwogCWludCBtaW5fdmFsID0gSU5UX01BWDsKQEAgLTU4MTcsMTIgJiM0Mzs1ODE5LDEyIEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIAkgKiBVc2UgdGhlIGxvY2FsIG5vZGUgaWYgd2UgaGF2ZW4mIzM5O3QgYWxyZWFkeSwgYnV0IGZvciBtZW1vcnlsZXNzIGxvY2FsCiAJICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy4KIAkgKi8KLQlpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSAmYW1wOyZhbXA7IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7CiYjNDM7CWlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spICZhbXA7JmFtcDsgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHsKIAkJbm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTsKIAkJcmV0dXJuIG5vZGU7CiAJfQogCi0JZm9yX2VhY2hfbm9kZV9zdGF0ZShuLCBOX01FTU9SWSkgewomIzQzOwlmb3JfZWFjaF9ub2RlX21hc2sobiwgKmNhbmRpZGF0ZXMpIHsKIAogCQkvKiBEb24mIzM5O3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovCiAJCWlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpCkBAIC01ODU1LDMxICYjNDM7NTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIH0KIAogCi0vKgotICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuCi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwKLSAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgotICovCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsCi0JCXVuc2lnbmVkIG5yX25vZGVzKQotewotCXN0cnVjdCB6b25lcmVmICp6b25lcmVmczsKLQlpbnQgaTsKLQotCXpvbmVyZWZzID0gcGdkYXQtJmd0O25vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfbm9kZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWludCBucl96b25lczsKLQotCQlwZ19kYXRhX3QgKm5vZGUgPSBOT0RFX0RBVEEobm9kZV9vcmRlcltpXSk7Ci0KLQkJbnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTsKLQkJem9uZXJlZnMgJiM0Mzs9IG5yX3pvbmVzOwotCX0KLQl6b25lcmVmcy0mZ3Q7em9uZSA9IE5VTEw7Ci0Jem9uZXJlZnMtJmd0O3pvbmVfaWR4ID0gMDsKLX0KLQogLyoKICAqIEJ1aWxkIF9fR0ZQX1RISVNOT0RFIHpvbmVsaXN0cwogICovCkBAIC01ODk1LDE5ICYjNDM7NTg3MiwyNCBAQCBzdGF0aWMgdm9pZCBidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKIAl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogfQogCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW4KJiM0MzsgKiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbCBETUEgem9uZSwgaWYgYW55LS1idXQKJiM0MzsgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcywKJiM0MzsJCQkJaW50IHpsaWR4KQogewotCXN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdOwotCWludCBub2RlLCBucl9ub2RlcyA9IDA7CiYjNDM7CXN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LSZndDtub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzOwogCW5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7Ci0JaW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTsKJiM0MzsJaW50IGxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKJiM0MzsJaW50IHByZXZfbm9kZSA9IGxvY2FsX25vZGU7CiYjNDM7CWludCBub2RlOwogCi0JLyogTlVNQS1hd2FyZSBvcmRlcmluZyBvZiBub2RlcyAqLwotCWxvY2FsX25vZGUgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKLQlwcmV2X25vZGUgPSBsb2NhbF9ub2RlOwomIzQzOwlwcl9pbmZvKCYjMzQ7RmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6ICYjMzQ7LCBsb2NhbF9ub2RlKTsKIAotCW1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpOwotCXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2spKSAmZ3Q7PSAwKSB7CiYjNDM7CXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgJmFtcDt1c2VkX21hc2ssCiYjNDM7CQkJCQkgICAgICBjYW5kaWRhdGVzKSkgJmd0Oz0gMCkgewogCQkvKgogCQkgKiBXZSBkb24mIzM5O3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS4KIAkJICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZQpAQCAtNTkxNywxOCAmIzQzOzU4OTksMjIgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiAJCSAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpCiAJCQlub2RlX2xvYWRbbm9kZV0gJiM0Mzs9IDE7CiAKLQkJbm9kZV9vcmRlcltucl9ub2RlcyYjNDM7JiM0MztdID0gbm9kZTsKJiM0MzsJCXpvbmVyZWZzICYjNDM7PSBidWlsZF96b25lcmVmc19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZXJlZnMpOwomIzQzOwkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlKTsKIAkJcHJldl9ub2RlID0gbm9kZTsKIAl9CiAKLQlidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpOwotCWJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7Ci0JcHJfaW5mbygmIzM0O0ZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiAmIzM0OywgbG9jYWxfbm9kZSk7Ci0JZm9yIChub2RlID0gMDsgbm9kZSAmbHQ7IG5yX25vZGVzOyBub2RlJiM0MzsmIzQzOykKLQkJcHJfY29udCgmIzM0OyVkICYjMzQ7LCBub2RlX29yZGVyW25vZGVdKTsKJiM0MzsJem9uZXJlZnMtJmd0O3pvbmUgPSBOVUxMOwomIzQzOwl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogCXByX2NvbnQoJiMzNDtcbiYjMzQ7KTsKIH0KIAomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQomIzQzO3sKJiM0MzsJYnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgJmFtcDtub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTsKJiM0MzsJYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTsKJiM0Mzt9CiYjNDM7CiAjaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFUwogLyoKICAqIFJldHVybiBub2RlIGlkIG9mIG5vZGUgdXNlZCBmb3IgJiMzNDtsb2NhbCYjMzQ7IGFsbG9jYXRpb25zLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDUyMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDc4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIGZpZ3VyZSBvdXQgaWYgaXQgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY2hhbmdlcyBmaXJzdCwgdGhlbiBhc3Nlc3MgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgcmlza3MuCgpTbywgaGVyZSYjMzk7cyB3aGF0IEkgc2VlOiB0aGUgY29yZSBvZiB0aGUgcGF0Y2ggcmV2b2x2ZXMgYXJvdW5kIHRoZSBgZmluZF9uZXh0X2Jlc3Rfbm9kZWAgZnVuY3Rpb24uIEl0JiMzOTtzIGJlZW4gcmVuYW1lZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgYW5kIGEgYGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXNgIHBhcmFtZXRlciBoYXMgYmVlbiBhZGRlZC4gVGhlIGNoYW5nZXMgc2VlbSB0byBiZSBwcm9wYWdhdGluZyB0aGlzIG5ldyBmdW5jdGlvbiBzaWduYXR1cmUgdGhyb3VnaG91dCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4KClNwZWNpZmljYWxseSwgSSBzZWUgdGhpcyBmdW5jdGlvbiBub3cgYmVpbmcgdXNlZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLCBpbiBib3RoIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLiBUaGUgY3J1Y2lhbCBwYXJ0IGhlcmUgaXMgaG93IHRoZXNlIGBjYW5kaWRhdGVzYCBtYXNrcyBhcmUgYmVpbmcgdXNlZDsgaXQmIzM5O3MgbGlrZWx5IHdoZXJlIGFueSBwb3RlbnRpYWwgaXNzdWVzIG1pZ2h0IGhpZGUuCgpGdXJ0aGVyIGRvd24gdGhlIHJhYmJpdCBob2xlLCBgbW0vcGFnZV9hbGxvYy5jYCBjb250YWlucyB0aGUgbWVhdCBvZiB0aGUgaW1wbGVtZW50YXRpb24uIFRoZSBrZXkgY2hhbmdlIGhlcmUgaXMgaG93IGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBub3cgdXNlcyBgbm9kZV9pc3NldGAgYW5kIGBmb3JfZWFjaF9ub2RlX21hc2tgIHdpdGggdGhlIHByb3ZpZGVkIGBjYW5kaWRhdGVzYCBtYXNrIGluc3RlYWQgb2YgdGhlIG9sZCBgTl9NRU1PUllgIG5vZGUgc3RhdGUuIFRoZSBjaGFuZ2VzIGluIGBidWlsZF96b25lbGlzdHNgIHNlZW0gc2lnbmlmaWNhbnQgYXMgd2VsbC4gSXQgbG9va3MgbGlrZSB0aGV5JiMzOTt2ZSByZWZhY3RvcmVkIHRoZSBvbGQgbm9kZSBvcmRlcmluZyBsb2dpYyB0byBkaXJlY3RseSBidWlsZCB6b25lbGlzdHMgYmFzZWQgb24gdGhlIGBjYW5kaWRhdGVzYCBtYXNrIHdpdGhpbiBhIG5ldyBgYnVpbGRfbm9kZV96b25lbGlzdGAgZnVuY3Rpb24uIEluc3RlYWQgb2YgY2FsbGluZyBvdXQgdG8gYSBmdW5jdGlvbiB0byBidWlsZCB0aGUgem9uZSBsaXN0IHVzaW5nIG5vZGUgb3JkZXIsIHRoZSBuZXcgYXBwcm9hY2ggc2VlbXMgdG8gYmUgYnVpbGRpbmcgaXQgaW4gdGhlIGxvb3AgaXRzZWxmLgoKTm93LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3M6IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgYmFzaWNzOyBhcmUgdGhlcmUgYW55IG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9ucyB0aGF0IGFyZW4mIzM5O3QgaW5pdGlhbGl6ZWQ/IGBub2RlbWFza190IHVzZWRfbWFza2AgbG9va3MgaW5pdGlhbGl6ZWQsIGFuZCBgem9uZXJlZnNgIGlzIHBvaW50aW5nIHRvIGFuIGV4aXN0aW5nIGFycmF5IGluIGBwZ2RhdGAsIHdoaWNoIGdldHMgdGVybWluYXRlZCB3aXRoIGB6b25lcmVmcy0mZ3Q7em9uZSA9IE5VTEw7IHpvbmVyZWZzLSZndDt6b25lX2lkeCA9IDA7YC4gT2theSwgdGhhdCBsb29rcyBzYWZlLiBOb3RoaW5nIGlzIGJlaW5nIGNvcGllZCB0byB1c2Vyc3BhY2UsIHNvIHRoYXQmIzM5O3Mgb25lIGxlc3MgY29uY2Vybi4KClRoZSBtb3N0IHByb2JhYmxlIGFyZWEgb2YgY29uY2VybiBpcyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBgY2FuZGlkYXRlc2AgaXMgdGhlIGNydWNpYWwgcG9pbnRlciBoZXJlLCBwb3RlbnRpYWxseS4gSXQmIzM5O3MgcG9pbnRlZCB0byBlaXRoZXIgYG5vZGVfc3RhdGVzW05fTUVNT1JZXWAgb3IgYCZhbXA7bWFza2AgLyBgJmFtcDt0aWVyX25vZGVzYC4gU28sIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGluaXRpYWxpemF0aW9uIG9mIGBtYXNrYCBhbmQgYHRpZXJfbm9kZXNgIGluIGBtZW1vcnktdGllcnMuY2AgYXJvdW5kIGxpbmVzIDM3MCBhbmQgNDUwLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRob3NlIG1hc2tzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdGhleSYjMzk7cmUgcGFzc2VkIHRvIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnktdGllcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzYwOlx0XHQgKiBsYXN0IHRhcmdldCBub2RlLiBPciBpbnRyb2R1Y2luZyBwZXItY3B1IGRhdGEgdG8gYXZvaWRcbiAzNjE6XHRcdCAqIGNhY2hpbmcgaXNzdWUsIHdoaWNoIHNlZW1zIG1vcmUgY29tcGxpY2F0ZWQuIFNvIHNlbGVjdGluZ1xuIDM2MjpcdFx0ICogdGFyZ2V0IG5vZGUgcmFuZG9tbHkgc2VlbXMgYmV0dGVyIHVudGlsIG5vdy5cbiAzNjM6XHRcdCAqL1xuIDM2NDpcdFx0aWYgKCFub2Rlc19lbXB0eShtYXNrKSlcbiAzNjU6XHRcdFx0cmV0dXJuIG5vZGVfcmFuZG9tKFx1MDAyNm1hc2spO1xuIDM2NjpcdFxuIDM2NzpcdFx0LypcbiAzNjg6XHRcdCAqIFByZWZlcnJlZCBub2RlcyBhcmUgbm90IGluIGFsbG93ZWRfbWFzay4gRmxpcCBiaXRzIGluXG4gMzY5Olx0XHQgKiBhbGxvd2VkX21hc2sgYXMgdXNlZCBub2RlIG1hc2suIFRoZW4sIHVzZSBpdCB0byBnZXQgdGhlXG4gMzcwOlx0XHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cbiAzNzE6XHRcdCAqL1xuIDM3MjpcdFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcbiAzNzM6XHRcdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNm1hc2ssIFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XG4gMzc0Olx0fVxuIDM3NTpcdFxuIDM3NjpcdHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZClcbiAzNzc6XHR7XG4gMzc4Olx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XG4gMzc5Olx0XHRpbnQgbm9kZTtcbiAzODA6XHRcbiAzODE6XHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcbiAzODI6XHRcdFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcbiAzODM6XHRcdFx0LypcbiAzODQ6XHRcdFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxuIDM4NTpcdFx0XHQgKiB0byBhY2Nlc3MgcGdkYS1cdTAwM2VtZW10aWVyLlxuIDM4NjpcdFx0XHQgKi9cbiAzODc6XHRcdFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XG4gMzg4Olx0XHRcdGlmIChtZW10aWVyKVxuIDM4OTpcdFx0XHRcdG1lbXRpZXItXHUwMDNlbG93ZXJfdGllcl9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG4gMzkwOlx0XHR9XG4gMzkxOlx0XHQvKlxuIDM5MjpcdFx0ICogRW5zdXJlIHRoYXQgdGhlIFwmIzM0O2Rpc2FibGVcJiMzNDsgaXMgdmlzaWJsZSBhY3Jvc3MgdGhlIHN5c3RlbS5cbiAzOTM6XHRcdCAqIFJlYWRlcnMgd2lsbCBzZWUgZWl0aGVyIGEgY29tYmluYXRpb24gb2YgYmVmb3JlJiM0MztkaXNhYmxlXG4gMzk0Olx0XHQgKiBzdGF0ZSBvciBkaXNhYmxlJiM0MzthZnRlci4gIFRoZXkgd2lsbCBuZXZlciBzZWUgYmVmb3JlIGFuZFxuIDM5NTpcdFx0ICogYWZ0ZXIgc3RhdGUgdG9nZXRoZXIuXG4gMzk2Olx0XHQgKi9cbiAzOTc6XHRcdHN5bmNocm9uaXplX3JjdSgpO1xuIDM5ODpcdH1cbiAzOTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjUxMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgbGluZXMgb2YgY29kZToKCioqRGl2aW5nIGludG8gYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBtZW1vcnkgdGllcnMgYWdhaW4uIE15IGludHVpdGlvbiB0ZWxscyBtZSB0byBkcmlsbCBkb3duIGludG8gYG1tL21lbW9yeS10aWVycy5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lcyA0NDAgdG8gNDgwIHdpdGhpbiB0aGUgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBmdW5jdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIHN1c3BlY3QgdGhpcyBzZWN0aW9uIGlzIHdoZXJlIHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvdXQgKndoaWNoKiBtZW1vcnkgcmVnaW9ucyBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZGVtb3Rpb24g4oCTIHRoYXQgaXMsIG1vdmluZyBkYXRhIGZyb20gYSBmYXN0ZXIsIG1vcmUgZXhwZW5zaXZlIHRpZXIgZG93biB0byBhIHNsb3dlciwgY2hlYXBlciBvbmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjcml0ZXJpYSBhbmQgbG9naWMgYmVpbmcgdXNlZC4gQXJlIHdlIGxvb2tpbmcgYXQgYWNjZXNzIGZyZXF1ZW5jeSwgb3ZlcmFsbCBmb290cHJpbnQsIHJlY2VuY3ksIG9yIHNvbWUgY29tcGxleCBjb21iaW5hdGlvbiBvZiB0aGVzZSBmYWN0b3JzPyBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgbGlrZWx5IGNvbnRhaW5zIHRoZSBjb3JlIGRlbW90aW9uIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLCBhbmQgaXQmIzM5O3MgZXNzZW50aWFsIHRvIGFuYWx5emUgaXQgd2l0aCBhIGZpbmUtdG9vdGggY29tYiB0byB1bmRlcnN0YW5kIGhvdyBlZmZlY3RpdmUgdGhlIHRpZXJpbmcgaXMgYW5kIGhvdyBpdCBtaWdodCBiZSBpbXByb3ZlZC4gTGV0JiMzOTtzIHNlZSB3aGF0IGdlbXMgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtb3J5LXRpZXJzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQ0MDpcdFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkge1xuIDQ0MTpcdFx0XHRiZXN0X2Rpc3RhbmNlID0gLTE7XG4gNDQyOlx0XHRcdG5kID0gXHUwMDI2bm9kZV9kZW1vdGlvbltub2RlXTtcbiA0NDM6XHRcbiA0NDQ6XHRcdFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XG4gNDQ1Olx0XHRcdGlmICghbWVtdGllciB8fCBsaXN0X2lzX2xhc3QoXHUwMDI2bWVtdGllci1cdTAwM2VsaXN0LCBcdTAwMjZtZW1vcnlfdGllcnMpKVxuIDQ0NjpcdFx0XHRcdGNvbnRpbnVlO1xuIDQ0NzpcdFx0XHQvKlxuIDQ0ODpcdFx0XHQgKiBHZXQgdGhlIGxvd2VyIG1lbXRpZXIgdG8gZmluZCB0aGUgIGRlbW90aW9uIG5vZGUgbGlzdC5cbiA0NDk6XHRcdFx0ICovXG4gNDUwOlx0XHRcdG1lbXRpZXIgPSBsaXN0X25leHRfZW50cnkobWVtdGllciwgbGlzdCk7XG4gNDUxOlx0XHRcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcbiA0NTI6XHRcdFx0LypcbiA0NTM6XHRcdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiwgdXNlICYjMzk7dXNlZCYjMzk7IG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxuIDQ1NDpcdFx0XHQgKiBBZGQgYWxsIG1lbW9yeSBub2RlcyBleGNlcHQgdGhlIHNlbGVjdGVkIG1lbW9yeSB0aWVyXG4gNDU1Olx0XHRcdCAqIG5vZGVsaXN0IHRvIHNraXAgbGlzdCBzbyB0aGF0IHdlIGZpbmQgdGhlIGJlc3Qgbm9kZSBmcm9tIHRoZVxuIDQ1NjpcdFx0XHQgKiBtZW10aWVyIG5vZGVsaXN0LlxuIDQ1NzpcdFx0XHQgKi9cbiA0NTg6XHRcdFx0bm9kZXNfYW5kbm90KHRpZXJfbm9kZXMsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgdGllcl9ub2Rlcyk7XG4gNDU5Olx0XG4gNDYwOlx0XHRcdC8qXG4gNDYxOlx0XHRcdCAqIEZpbmQgYWxsIHRoZSBub2RlcyBpbiB0aGUgbWVtb3J5IHRpZXIgbm9kZSBsaXN0IG9mIHNhbWUgYmVzdCBkaXN0YW5jZS5cbiA0NjI6XHRcdFx0ICogYWRkIHRoZW0gdG8gdGhlIHByZWZlcnJlZCBtYXNrLiBXZSByYW5kb21seSBzZWxlY3QgYmV0d2VlbiBub2Rlc1xuIDQ2MzpcdFx0XHQgKiBpbiB0aGUgcHJlZmVycmVkIG1hc2sgd2hlbiBhbGxvY2F0aW5nIHBhZ2VzIGR1cmluZyBkZW1vdGlvbi5cbiA0NjQ6XHRcdFx0ICovXG4gNDY1Olx0XHRcdGRvIHtcbiA0NjY6XHRcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4gNDY3Olx0XHRcdFx0XHRcdFx0XHRcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuIDQ2ODpcdFx0XHRcdGlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKVxuIDQ2OTpcdFx0XHRcdFx0YnJlYWs7XG4gNDcwOlx0XG4gNDcxOlx0XHRcdFx0ZGlzdGFuY2UgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIHRhcmdldCk7XG4gNDcyOlx0XHRcdFx0aWYgKGRpc3RhbmNlID09IGJlc3RfZGlzdGFuY2UgfHwgYmVzdF9kaXN0YW5jZSA9PSAtMSkge1xuIDQ3MzpcdFx0XHRcdFx0YmVzdF9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuIDQ3NDpcdFx0XHRcdFx0bm9kZV9zZXQodGFyZ2V0LCBuZC1cdTAwM2VwcmVmZXJyZWQpO1xuIDQ3NTpcdFx0XHRcdH0gZWxzZSB7XG4gNDc2Olx0XHRcdFx0XHRicmVhaztcbiA0Nzc6XHRcdFx0XHR9XG4gNDc4Olx0XHRcdH0gd2hpbGUgKDEpO1xuIDQ3OTpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NDE0CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoZSBwcm92aWRlZCBwcm9tcHQ6CgoqKkRpdmluZyBpbnRvIGBwYWdlX2FsbG9jLmNgIGFuZCBab25lbGlzdHMqKgoKT2theSwgc28gdGhlIHByb21wdCBpcyBhc2tpbmcgbWUgdG8gdGhpbmsgYWJvdXQgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIGNvZGUsIGBwYWdlX2FsbG9jLmNgLCBhbmQgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGZ1bmN0aW9uLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyByZWxhdGVzIHRvIHRoZSBmdW5kYW1lbnRhbCBtZW1vcnkgYWxsb2NhdGlvbiBtZWNoYW5pc21zIHdpdGhpbiB0aGUga2VybmVsLCBhbmQgdGhlIHN0cnVjdHVyaW5nIG9mIG1lbW9yeSB6b25lcyBhY3Jvc3MgTlVNQSBub2Rlcy4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBwcm9iYWJseSBzdGFydCBieSBxdWlja2x5IHJldmlld2luZyBgYnVpbGRfbm9kZV96b25lbGlzdGAmIzM5O3MgcHVycG9zZS4gSSByZW1lbWJlciBpdCYjMzk7cyByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHRoZSB6b25lbGlzdCBmb3IgZWFjaCBub2RlLiBUaGUgem9uZWxpc3QgZGljdGF0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBrZXJuZWwgd2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIHBhZ2VzIGZyb20gZGlmZmVyZW50IG1lbW9yeSB6b25lcyAoZS5nLiwgRE1BLCBOb3JtYWwsIEhpZ2hNZW0pIHdpdGhpbiBhIE5VTUEgbm9kZSBhbmQgcG90ZW50aWFsbHkgYWNyb3NzIG90aGVyIG5vZGVzLiBJJiMzOTtkIHByb2JhYmx5IG1lbnRhbGx5IHJlY29uc3RydWN0IGhvdyB0aGUgZGlmZmVyZW50IHpvbmVzIG9uIGEgbm9kZSwgYW5kIHpvbmVzIGZyb20gb3RoZXIgbm9kZXMsIGFyZSBhZGRlZCB0byB0aGF0IGxpc3QuCgpUaGVuLCBJJiMzOTtkIGNvbnNpZGVyIGNvbW1vbiBzY2VuYXJpb3M6IEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgdGhpbmdzIEkgc2hvdWxkIGJlIHRoaW5raW5nIGFib3V0PyBJcyB0aGlzIGEgc3RhbmRhcmQgc2NlbmFyaW8sIGlzIHRoZXJlIHNvbWV0aGluZyB1bnVzdWFsIGFib3V0IHRoZSBwcm9tcHQsIG9yIGlzIHRoaXMgYSB0cmljayBxdWVzdGlvbj8KClRoZSBpbnRlcnBsYXkgd2l0aCBOVU1BIGlzIGtleS4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0aGUgaW1wYWN0IG9mIE5VTUEgYmFsYW5jaW5nLCB0aGUgaW1wYWN0IG9mIHByZWZlcnJlZCBub2RlcywgYW5kIHRoZSBlZmZlY3RzIG9mIG5vZGUgaW50ZXJsZWF2ZSBwb2xpY2llcy4gSSYjMzk7ZCBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgY29uZmlndXJhdGlvbnMgY2FuIHNpZ25pZmljYW50bHkgYWZmZWN0IHRoZSB6b25lbGlzdCBjb25zdHJ1Y3Rpb24uCgpGaW5hbGx5LCBkZXBlbmRpbmcgb24gY29udGV4dCwgSSYjMzk7ZCBwcm9iYWJseSBiZSB0aGlua2luZyBhYm91dCBwZXJmb3JtYW5jZSBpbXBhY3RzLiBIb3cgdGhlIHpvbmVsaXN0IGlzIG9yZGVyZWQgZGlyZWN0bHkgYWZmZWN0cyBhbGxvY2F0aW9uIGxhdGVuY3kuIEFyZSB0aGVyZSBhbnkga25vd24gYXJlYXMgd2hlcmUgc3Vib3B0aW1hbCB6b25lbGlzdCBjb25zdHJ1Y3Rpb24gbGVhZHMgdG8gcGVyZm9ybWFuY2UgaXNzdWVzPyBJIG1pZ2h0IGJlIHRoaW5raW5nIGFib3V0IGhvdyB0aGluZ3MgYXJlIGNvbmZpZ3VyZWQsIGJlY2F1c2UgSSByZWNhbGwgdGhhdCBzb21ldGltZXMsIHRoZSBpZGVhbCB6b25lbGlzdCBvcmRlcmluZyBpcyBhIGJhbGFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTg3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs1ODcwOlx0XHR6b25lcmVmcyAmIzQzOz0gbnJfem9uZXM7XG41ODcxOlx0XHR6b25lcmVmcy1cdTAwM2V6b25lID0gTlVMTDtcbjU4NzI6XHRcdHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMDtcbjU4NzM6XHR9XG41ODc0Olx0XG41ODc1Olx0LypcbjU4NzY6XHQgKiBCdWlsZCBvbmUgem9uZWxpc3Qgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS4gVGhpcyByZXN1bHRzIGluXG41ODc3Olx0ICogbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwgRE1BIHpvbmUsIGlmIGFueS0tYnV0XG41ODc4Olx0ICogcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS5cbjU4Nzk6XHQgKi9cbjU4ODA6XHRzdGF0aWMgdm9pZCBidWlsZF9ub2RlX3pvbmVsaXN0KHBnX2RhdGFfdCAqcGdkYXQsIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMsXG41ODgxOlx0XHRcdFx0XHRpbnQgemxpZHgpXG41ODgyOlx0e1xuNTg4MzpcdFx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbemxpZHhdLl96b25lcmVmcztcbjU4ODQ6XHRcdG5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG41ODg1Olx0XHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG41ODg2Olx0XHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbjU4ODc6XHRcdGludCBub2RlO1xuNTg4ODpcdFxuNTg4OTpcdFx0cHJfaW5mbyhcJiMzNDtGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXCYjMzQ7LCBsb2NhbF9ub2RlKTtcbjU4OTA6XHRcbjU4OTE6XHRcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrLFxuNTg5MjpcdFx0XHRcdFx0XHQgICAgICBjYW5kaWRhdGVzKSkgXHUwMDNlPSAwKSB7XG41ODkzOlx0XHRcdC8qXG41ODk0Olx0XHRcdCAqIFdlIGRvbiYjMzk7dCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxuNTg5NTpcdFx0XHQgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lXG41ODk2Olx0XHRcdCAqIGRpc3RhbmNlIGdyb3VwIHRvIG1ha2UgaXQgcm91bmQtcm9iaW4uXG41ODk3Olx0XHRcdCAqL1xuNTg5ODpcdFx0XHRpZiAobm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBub2RlKSAhPVxuNTg5OTpcdFx0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKVxuNTkwMDpcdFx0XHRcdG5vZGVfbG9hZFtub2RlXSAmIzQzOz0gMTtcbjU5MDE6XHRcbjU5MDI6XHRcdFx0em9uZXJlZnMgJiM0Mzs9IGJ1aWxkX3pvbmVyZWZzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lcmVmcyk7XG41OTAzOlx0XHRcdHByX2NvbnQoXCYjMzQ7JWQgXCYjMzQ7LCBub2RlKTtcbjU5MDQ6XHRcdFx0cHJldl9ub2RlID0gbm9kZTtcbjU5MDU6XHRcdH1cbjU5MDY6XHRcbjU5MDc6XHRcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuNTkwODpcdFx0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuNTkwOTpcdFx0cHJfY29udChcJiMzNDtcXG5cJiMzNDspO1xuNTkxMDpcdH1cbjU5MTE6XHRcbjU5MTI6XHRzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbjU5MTM6XHR7XG41OTE0Olx0XHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTtcbjU5MTU6XHRcdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XG41OTE2Olx0fVxuNTkxNzpcdFxuNTkxODpcdCNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG41OTE5Olx0LypcbjU5MjA6XHQgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFwmIzM0O2xvY2FsXCYjMzQ7IGFsbG9jYXRpb25zLlxuNTkyMTpcdCAqIEkuZS4sIGZpcnN0IG5vZGUgaWQgb2YgZmlyc3Qgem9uZSBpbiBhcmcgbm9kZSYjMzk7cyBnZW5lcmljIHpvbmVsaXN0LlxuNTkyMjpcdCAqIFVzZWQgZm9yIGluaXRpYWxpemluZyBwZXJjcHUgJiMzOTtudW1hX21lbSYjMzk7LCB3aGljaCBpcyB1c2VkIHByaW1hcmlseVxuNTkyMzpcdCAqIGZvciBrZXJuZWwgYWxsb2NhdGlvbnMsIHNvIHVzZSBHRlBfS0VSTkVMIGZsYWdzIHRvIGxvY2F0ZSB6b25lbGlzdC5cbjU5MjQ6XHQgKi9cbjU5MjU6XHRpbnQgbG9jYWxfbWVtb3J5X25vZGUoaW50IG5vZGUpXG41OTI2Olx0e1xuNTkyNzpcdFx0c3RydWN0IHpvbmVyZWYgKno7XG41OTI4Olx0XG41OTI5Olx0XHR6ID0gZmlyc3Rfem9uZXNfem9uZWxpc3Qobm9kZV96b25lbGlzdChub2RlLCBHRlBfS0VSTkVMKSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODc5MAoJCQkJCQkJb3V0cHV0OiAyMDkKCQkJCQkJCXRob3VnaHRzOiA1NjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogVGhpcyBQYXRjaCBpcyBTYWZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IHByaW1hcnkgY29uY2VybiBpcyBhbHdheXMgdW5pbml0aWFsaXplZCBtZW1vcnksIHJpZ2h0PyBEb2VzIHRoaXMgcGF0Y2ggaW50cm9kdWNlIGEgcmlzayB0aGVyZT8gSSYjMzk7dmUgZ29uZSB0aHJvdWdoIGl0IHN0ZXAgYnkgc3RlcC4gRmlyc3QsIEkgY2hlY2tlZDogZG9lcyBhbnkga2VybmVsIG1lbW9yeSBsZWFrIGludG8gdXNlciBzcGFjZT8gTm9wZSwgbm90aGluZyYjMzk7cyBjb3BpZWQgb3V0LiBBcmUgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgc3RydWN0cyBvciBidWZmZXJzIGNyZWF0ZWQgb3IgcGFzc2VkIGFyb3VuZD8gQWdhaW4sIG5vLiBUaGUgYGNhbmRpZGF0ZXNgIHBhcmFtZXRlciBpcyBhIGBjb25zdCBub2RlbWFza190YCwgcG9pbnRpbmcgdG8gYSBnbG9iYWwga2VybmVsIHZhcmlhYmxlLCBzbyB0aGF0JiMzOTtzIGNvdmVyZWQuIEluc2lkZSB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zIGxpa2UgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGFuZCBgYnVpbGRfbm9kZV96b25lbGlzdGAsIEkgc2VlIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiBgY2FuZGlkYXRlc2AgYW5kIGluaXRpYWxpemVkIHZhcmlhYmxlcy4gTm8gcmVkIGZsYWdzIHRoZXJlLgoKVGhlbiwgSSBsb29rZWQgYXQgYWxsb2NhdGlvbnMuIElzIHRoaXMgaW50cm9kdWNpbmcgbmV3IG9uZXMsIHN0YWNrIG9yIGhlYXA/IE5vLCBhY3R1YWxseSwgaXQgKnJlbW92ZWQqIGFsbG9jYXRpb25zISBUaGF0JiMzOTtzIGEgZ29vZCBzaWduLiBBbmQgbm8gY2hhbmdlcyB0byBhbnkgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGxpa2UgaW9jdGwsIG5ldGxpbmssIG9yIHN5c2NhbGxzLiBUaGlzIGlzIGFsbCBpbnRlcm5hbCBOVU1BIG1lbW9yeSBhbGxvY2F0aW9uIGxvZ2ljLgoKU28sIGFtIEkgc2VlaW5nICphbnkqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJ1Z3MgdGhhdCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaD8gTm8uIEFueSBidWdzIGhlcmUgd291bGQgYmUgbG9naWNhbCBlcnJvcnMsIG91dC1vZi1ib3VuZHMgem9uZXJlZiBhY2Nlc3MsIHdoaWNoIEtBU0FOIHdvdWxkIGNhdGNoLCBvciBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHMsIHdoaWNoIGFyZSBub3QgcmVsZXZhbnQgdG8gS01TQU4uCgpUaGVyZWZvcmUsIG5vIEtNU0FOIGlzIG5lZWRlZCBoZXJlLiBLQVNBTiBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIG1lbW9yeSBjb3JydXB0aW9uIG9yIGJvdW5kYXJ5IGlzc3VlcyB0aGF0IG1pZ2h0IGFyaXNlLgoKTm93LCBsZXQgbWUgZG91YmxlLWNoZWNrIGFnYWluc3QgdGhlIGNyaXRlcmlhOiBUaGUgcmVxdWlyZW1lbnRzIHN0YXRlIHRoYXQgS01TQU4gaXNuJiMzOTt0IG5lZWRlZCBpZiB0aGUgcHJpbWFyeSByaXNrcyBhcmUgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG92ZXJmbG93cywgbnVsbCBkZXJlZmVyZW5jZXMsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHdoaWNoIGFyZSBLQVNBTiYjMzk7cyBkb21haW4pLCBvciBpZiBhbGwgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQuIEFsbCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIEl0IGFsc28gc3RhdGVzIHRoZSBwYXRjaCBtdXN0IG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgb3IgaW5mby1sZWFrcywgYW5kIGl0IGRvZXNuJiMzOTt0LgoKU28sIE5lZWRzS01TQU4gPSBmYWxzZS4gQ2FzZSBjbG9zZWQuIEkmIzM5O20gcmVhZHkgdG8gd3JpdGUgdXAgdGhlIHJlYXNvbmluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDM6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cblxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cblxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzowMy41MDAyOTUzNDZaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTk5ODIxMjYxODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTlVNQVwiLFxuICAgIFwiTlVNQV9NSUdSQVRJT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJmaW5kX25leHRfYmVzdF9ub2RlX2luXCIsXG4gICAgXCJuZXh0X2RlbW90aW9uX25vZGVcIixcbiAgICBcImJ1aWxkX2FsbF96b25lbGlzdHNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gYW5kIG5vZGUgZmFsbGJhY2sgY2FsY3VsYXRpb24gYnkgaW50cm9kdWNpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAgd2l0aCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBwYXJhbWV0ZXIgYW5kIG1lcmdpbmcgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKClgIGludG8gYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAuXFxuXFxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxcbi0gTm8gbmV3IGhlYXAgb3Igc3RhY2sgYWxsb2NhdGlvbnMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG4tIEFsbCB2YXJpYWJsZXMgKHN1Y2ggYXMgYHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FYCkgYW5kIHpvbmVyZWYgdGVybWluYXRpb25zIChgem9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVxcdTAwM2V6b25lX2lkeCA9IDBgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuXFxuLSBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludHJvZHVjZWQgYnkgem9uZWxpc3QgaW5kZXhpbmcgb3IgdHJhdmVyc2FsIHdvdWxkIGJlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgcG9pbnRlciBlcnJvcnMsIHdoaWNoIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBLTVNBTiB1bmluaXRpYWxpemVkIG1lbW9yeSBkZXRlY3Rpb24gaXMgbm90IGFwcGxpY2FibGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGZpbmRfbmV4dF9iZXN0X25vZGUoKSBpbnRvIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKSwgYWxsb3dpbmcgY2FsbGVycyB0byBzcGVjaWZ5IGVsaWdpYmxlIGNhbmRpZGF0ZSBub2RlcyB2aWEgYSBub2RlbWFzay4gSXQgYWxzbyByZXN0cnVjdHVyZXMgem9uZWxpc3QgYnVpbGRpbmcgaW4gbW0vcGFnZV9hbGxvYy5jIChidWlsZF9ub2RlX3pvbmVsaXN0KSBhbmQgdXBkYXRlcyBkZW1vdGlvbiB0YXJnZXQgcmVzb2x1dGlvbiBpbiBtbS9tZW1vcnktdGllcnMuYyAobmV4dF9kZW1vdGlvbl9ub2RlIGFuZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cykuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyByZWFjaGFibGUgZHVyaW5nIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiAoZS5nLiBib290IGFuZCBtZW1vcnkgaG90cGx1Zy9yZWJ1aWxkKSBhbmQgZm9saW8gZGVtb3Rpb24gZHVyaW5nIG1lbW9yeSByZWNsYW1hdGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MDMuNTAwMzAxMzk2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDIzOTYzOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgU2VwIDEyIDAzOjM3OjAyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXFxuaW5kZXggZGExNGM1NmZiMjRlMS4uMTUxOWRkMjFhOTAwZiAxMDA2NDRcXG4tLS0gYS9tbS9pbnRlcm5hbC5oXFxuKysrIGIvbW0vaW50ZXJuYWwuaFxcbkBAIC0xMTMzLDcgKzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xcbiBcXG4gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsXFxuIFxcdFxcdFxcdFxcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XFxuLWV4dGVybiBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spO1xcbitpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuK1xcdFxcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpO1xcbiAjZWxzZVxcbiAjZGVmaW5lIG5vZGVfcmVjbGFpbV9tb2RlIDBcXG4gXFxuQEAgLTExNDIsNyArMTE0Myw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG4ge1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcXG4rc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuK1xcdFxcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXFxuIHtcXG4gXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4gfVxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnktdGllcnMuYyBiL21tL21lbW9yeS10aWVycy5jXFxuaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xcbisrKyBiL21tL21lbW9yeS10aWVycy5jXFxuQEAgLTM3MCw3ICszNzAsNyBAQCBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuIFxcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxcbiBcXHQgKi9cXG4gXFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcXG4tXFx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXFx1MDAyNm1hc2spO1xcbitcXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcXHUwMDI2bWFzaywgXFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZClcXG5AQCAtNDUwLDcgKzQ1MCw3IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIFxcdFxcdG1lbXRpZXIgPSBsaXN0X25leHRfZW50cnkobWVtdGllciwgbGlzdCk7XFxuIFxcdFxcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZSwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cXG4rXFx0XFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cXG4gXFx0XFx0ICogQWRkIGFsbCBtZW1vcnkgbm9kZXMgZXhjZXB0IHRoZSBzZWxlY3RlZCBtZW1vcnkgdGllclxcbiBcXHRcXHQgKiBub2RlbGlzdCB0byBza2lwIGxpc3Qgc28gdGhhdCB3ZSBmaW5kIHRoZSBiZXN0IG5vZGUgZnJvbSB0aGVcXG4gXFx0XFx0ICogbWVtdGllciBub2RlbGlzdC5cXG5AQCAtNDYzLDcgKzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIFxcdFxcdCAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0ZG8ge1xcbi1cXHRcXHRcXHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFxcdTAwMjZ0aWVyX25vZGVzKTtcXG4rXFx0XFx0XFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcXHUwMDI2dGllcl9ub2RlcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XFxuIFxcdFxcdFxcdGlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKVxcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4gXFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xcbmluZGV4IDFjZmJkMDU4MmExMGEuLmQxODg4ZDU2MzBlMGEgMTAwNjQ0XFxuLS0tIGEvbW0vcGFnZV9hbGxvYy5jXFxuKysrIGIvbW0vcGFnZV9hbGxvYy5jXFxuQEAgLTU3OTMsOSArNTc5MywxMCBAQCBzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbiBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdO1xcbiBcXG4gLyoqXFxuLSAqIGZpbmRfbmV4dF9iZXN0X25vZGUgLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3RcXG4rICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdFxcbiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJ3JlIGFwcGVuZGluZ1xcbiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzXFxuKyAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cXG4gICpcXG4gICogV2UgdXNlIGEgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGlzIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGRcXG4gICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWRcXG5AQCAtNTgwNyw3ICs1ODA4LDggQEAgc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcXG4gICpcXG4gICogUmV0dXJuOiBub2RlIGlkIG9mIHRoZSBmb3VuZCBub2RlIG9yICVOVU1BX05PX05PREUgaWYgbm8gbm9kZSBpcyBmb3VuZC5cXG4gICovXFxuLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcXG4raW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxcbitcXHRcXHRcXHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxcbiB7XFxuIFxcdGludCBuLCB2YWw7XFxuIFxcdGludCBtaW5fdmFsID0gSU5UX01BWDtcXG5AQCAtNTgxNywxMiArNTgxOSwxMiBAQCBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXFxuIFxcdCAqIFVzZSB0aGUgbG9jYWwgbm9kZSBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJ1dCBmb3IgbWVtb3J5bGVzcyBsb2NhbFxcbiBcXHQgKiBub2RlLCB3ZSBzaG91bGQgc2tpcCBpdCBhbmQgZmFsbCBiYWNrIHRvIG90aGVyIG5vZGVzLlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXFx1MDAyNlxcdTAwMjYgbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkpIHtcXG4rXFx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXFx1MDAyNlxcdTAwMjYgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHtcXG4gXFx0XFx0bm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTtcXG4gXFx0XFx0cmV0dXJuIG5vZGU7XFxuIFxcdH1cXG4gXFxuLVxcdGZvcl9lYWNoX25vZGVfc3RhdGUobiwgTl9NRU1PUlkpIHtcXG4rXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICpjYW5kaWRhdGVzKSB7XFxuIFxcbiBcXHRcXHQvKiBEb24ndCB3YW50IGEgbm9kZSB0byBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKi9cXG4gXFx0XFx0aWYgKG5vZGVfaXNzZXQobiwgKnVzZWRfbm9kZV9tYXNrKSlcXG5AQCAtNTg1NSwzMSArNTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcXG4gfVxcbiBcXG4gXFxuLS8qXFxuLSAqIEJ1aWxkIHpvbmVsaXN0cyBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLlxcbi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWxcXG4tICogRE1BIHpvbmUsIGlmIGFueS0tYnV0IHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuXFxuLSAqL1xcbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsXFxuLVxcdFxcdHVuc2lnbmVkIG5yX25vZGVzKVxcbi17XFxuLVxcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcXG4tXFx0aW50IGk7XFxuLVxcbi1cXHR6b25lcmVmcyA9IHBnZGF0LVxcdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX25vZGVzOyBpKyspIHtcXG4tXFx0XFx0aW50IG5yX3pvbmVzO1xcbi1cXG4tXFx0XFx0cGdfZGF0YV90ICpub2RlID0gTk9ERV9EQVRBKG5vZGVfb3JkZXJbaV0pO1xcbi1cXG4tXFx0XFx0bnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTtcXG4tXFx0XFx0em9uZXJlZnMgKz0gbnJfem9uZXM7XFxuLVxcdH1cXG4tXFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbi1cXHR6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwO1xcbi19XFxuLVxcbiAvKlxcbiAgKiBCdWlsZCBfX0dGUF9USElTTk9ERSB6b25lbGlzdHNcXG4gICovXFxuQEAgLTU4OTUsMTkgKzU4NzIsMjQgQEAgc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxuIFxcdHpvbmVyZWZzLVxcdTAwM2V6b25lX2lkeCA9IDA7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxcbisvKlxcbisgKiBCdWlsZCBvbmUgem9uZWxpc3Qgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS4gVGhpcyByZXN1bHRzIGluXFxuKyAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxcbisgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbitcXHRcXHRcXHRcXHRpbnQgemxpZHgpXFxuIHtcXG4tXFx0c3RhdGljIGludCBub2RlX29yZGVyW01BWF9OVU1OT0RFU107XFxuLVxcdGludCBub2RlLCBucl9ub2RlcyA9IDA7XFxuK1xcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LVxcdTAwM2Vub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzO1xcbiBcXHRub2RlbWFza190IHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FO1xcbi1cXHRpbnQgbG9jYWxfbm9kZSwgcHJldl9ub2RlO1xcbitcXHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVxcdTAwM2Vub2RlX2lkO1xcbitcXHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcXG4rXFx0aW50IG5vZGU7XFxuIFxcbi1cXHQvKiBOVU1BLWF3YXJlIG9yZGVyaW5nIG9mIG5vZGVzICovXFxuLVxcdGxvY2FsX25vZGUgPSBwZ2RhdC1cXHUwMDNlbm9kZV9pZDtcXG4tXFx0cHJldl9ub2RlID0gbG9jYWxfbm9kZTtcXG4rXFx0cHJfaW5mbyhcXFwiRmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6IFxcXCIsIGxvY2FsX25vZGUpO1xcbiBcXG4tXFx0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XFxuLVxcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgXFx1MDAyNnVzZWRfbWFzaykpIFxcdTAwM2U9IDApIHtcXG4rXFx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcXHUwMDI2dXNlZF9tYXNrLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBjYW5kaWRhdGVzKSkgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBXZSBkb24ndCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxcbiBcXHRcXHQgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lXFxuQEAgLTU5MTcsMTggKzU4OTksMjIgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxuIFxcdFxcdCAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpXFxuIFxcdFxcdFxcdG5vZGVfbG9hZFtub2RlXSArPSAxO1xcbiBcXG4tXFx0XFx0bm9kZV9vcmRlcltucl9ub2RlcysrXSA9IG5vZGU7XFxuK1xcdFxcdHpvbmVyZWZzICs9IGJ1aWxkX3pvbmVyZWZzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lcmVmcyk7XFxuK1xcdFxcdHByX2NvbnQoXFxcIiVkIFxcXCIsIG5vZGUpO1xcbiBcXHRcXHRwcmV2X25vZGUgPSBub2RlO1xcbiBcXHR9XFxuIFxcbi1cXHRidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpO1xcbi1cXHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xcbi1cXHRwcl9pbmZvKFxcXCJGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXFxcIiwgbG9jYWxfbm9kZSk7XFxuLVxcdGZvciAobm9kZSA9IDA7IG5vZGUgXFx1MDAzYyBucl9ub2Rlczsgbm9kZSsrKVxcbi1cXHRcXHRwcl9jb250KFxcXCIlZCBcXFwiLCBub2RlX29yZGVyW25vZGVdKTtcXG4rXFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbitcXHR6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwO1xcbiBcXHRwcl9jb250KFxcXCJcXFxcblxcXCIpO1xcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4re1xcbitcXHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBaT05FTElTVF9GQUxMQkFDSyk7XFxuK1xcdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XFxuK31cXG4rXFxuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXFxuIC8qXFxuICAqIFJldHVybiBub2RlIGlkIG9mIG5vZGUgdXNlZCBmb3IgXFxcImxvY2FsXFxcIiBhbGxvY2F0aW9ucy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MDQuMDQzNDIyMDY3WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo4NDAyNTk3NTY1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOVU1BXCIsXG4gICAgXCJOVU1BX01JR1JBVElPTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImZpbmRfbmV4dF9iZXN0X25vZGVfaW5cIixcbiAgICBcIm5leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwiYnVpbGRfYWxsX3pvbmVsaXN0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMWJhMmQ0ZjE3OTFkYjg3MzYwMGYwYTEyZmY3M2QyOTlhYmRkM2JkN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDAzOjM3OjAyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IGRhMTRjNTZmYjI0ZTEuLjE1MTlkZDIxYTkwMGYgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtMTEzMyw3ICsxMTMzLDggQEAgZXh0ZXJuIGludCBub2RlX3JlY2xhaW1fbW9kZTtcbiBcbiBleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbiBcdFx0XHRcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XG4tZXh0ZXJuIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayk7XG4raW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuK1x0XHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcbiAjZWxzZVxuICNkZWZpbmUgbm9kZV9yZWNsYWltX21vZGUgMFxuIFxuQEAgLTExNDIsNyArMTE0Myw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbiB7XG4gXHRyZXR1cm4gMDtcbiB9XG4tc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4rc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4rXHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4ge1xuIFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LXRpZXJzLmMgYi9tbS9tZW1vcnktdGllcnMuY1xuaW5kZXggNTQ4NTFkOGExOTViMC4uMjVlMTIxODUxYjU4NiAxMDA2NDRcbi0tLSBhL21tL21lbW9yeS10aWVycy5jXG4rKysgYi9tbS9tZW1vcnktdGllcnMuY1xuQEAgLTM3MCw3ICszNzAsNyBAQCBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG4gXHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cbiBcdCAqL1xuIFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcbi1cdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFx1MDAyNm1hc2spO1xuK1x0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXHUwMDI2bWFzaywgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuQEAgLTQ1MCw3ICs0NTAsNyBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0XHRtZW10aWVyID0gbGlzdF9uZXh0X2VudHJ5KG1lbXRpZXIsIGxpc3QpO1xuIFx0XHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XG4gXHRcdC8qXG4tXHRcdCAqIGZpbmRfbmV4dF9iZXN0X25vZGUsIHVzZSAndXNlZCcgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4rXHRcdCAqIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4sIHVzZSAndXNlZCcgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXG4gXHRcdCAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXJcbiBcdFx0ICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlXG4gXHRcdCAqIG1lbXRpZXIgbm9kZWxpc3QuXG5AQCAtNDYzLDcgKzQ2Myw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4gXHRcdCAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLlxuIFx0XHQgKi9cbiBcdFx0ZG8ge1xuLVx0XHRcdHRhcmdldCA9IGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXHUwMDI2dGllcl9ub2Rlcyk7XG4rXHRcdFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcdTAwMjZ0aWVyX25vZGVzLFxuK1x0XHRcdFx0XHRcdFx0XHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiBcdFx0XHRpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSlcbiBcdFx0XHRcdGJyZWFrO1xuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xuaW5kZXggMWNmYmQwNTgyYTEwYS4uZDE4ODhkNTYzMGUwYSAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuY1xuKysrIGIvbW0vcGFnZV9hbGxvYy5jXG5AQCAtNTc5Myw5ICs1NzkzLDEwIEBAIHN0YXRpYyBpbnQgbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4gc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcbiBcbiAvKipcbi0gKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0XG4rICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdFxuICAqIEBub2RlOiBub2RlIHdob3NlIGZhbGxiYWNrIGxpc3Qgd2UncmUgYXBwZW5kaW5nXG4gICogQHVzZWRfbm9kZV9tYXNrOiBub2RlbWFza190IG9mIGFscmVhZHkgdXNlZCBub2Rlc1xuKyAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cbiAgKlxuICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkXG4gICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWRcbkBAIC01ODA3LDcgKzU4MDgsOCBAQCBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdO1xuICAqXG4gICogUmV0dXJuOiBub2RlIGlkIG9mIHRoZSBmb3VuZCBub2RlIG9yICVOVU1BX05PX05PREUgaWYgbm8gbm9kZSBpcyBmb3VuZC5cbiAgKi9cbi1pbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4raW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuK1x0XHRcdCAgIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4ge1xuIFx0aW50IG4sIHZhbDtcbiBcdGludCBtaW5fdmFsID0gSU5UX01BWDtcbkBAIC01ODE3LDEyICs1ODE5LDEyIEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiBcdCAqIFVzZSB0aGUgbG9jYWwgbm9kZSBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJ1dCBmb3IgbWVtb3J5bGVzcyBsb2NhbFxuIFx0ICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy5cbiBcdCAqL1xuLVx0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXHUwMDI2XHUwMDI2IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7XG4rXHRpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSBcdTAwMjZcdTAwMjYgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHtcbiBcdFx0bm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTtcbiBcdFx0cmV0dXJuIG5vZGU7XG4gXHR9XG4gXG4tXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG4sIE5fTUVNT1JZKSB7XG4rXHRmb3JfZWFjaF9ub2RlX21hc2sobiwgKmNhbmRpZGF0ZXMpIHtcbiBcbiBcdFx0LyogRG9uJ3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovXG4gXHRcdGlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpXG5AQCAtNTg1NSwzMSArNTg1Nyw2IEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbiB9XG4gXG4gXG4tLypcbi0gKiBCdWlsZCB6b25lbGlzdHMgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS5cbi0gKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWxcbi0gKiBETUEgem9uZSwgaWYgYW55LS1idXQgcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS5cbi0gKi9cbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsXG4tXHRcdHVuc2lnbmVkIG5yX25vZGVzKVxuLXtcbi1cdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcbi1cdGludCBpO1xuLVxuLVx0em9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfbm9kZXM7IGkrKykge1xuLVx0XHRpbnQgbnJfem9uZXM7XG4tXG4tXHRcdHBnX2RhdGFfdCAqbm9kZSA9IE5PREVfREFUQShub2RlX29yZGVyW2ldKTtcbi1cbi1cdFx0bnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKG5vZGUsIHpvbmVyZWZzKTtcbi1cdFx0em9uZXJlZnMgKz0gbnJfem9uZXM7XG4tXHR9XG4tXHR6b25lcmVmcy1cdTAwM2V6b25lID0gTlVMTDtcbi1cdHpvbmVyZWZzLVx1MDAzZXpvbmVfaWR4ID0gMDtcbi19XG4tXG4gLypcbiAgKiBCdWlsZCBfX0dGUF9USElTTk9ERSB6b25lbGlzdHNcbiAgKi9cbkBAIC01ODk1LDE5ICs1ODcyLDI0IEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuIFx0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbisvKlxuKyAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW5cbisgKiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbCBETUEgem9uZSwgaWYgYW55LS1idXRcbisgKiByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyxcbitcdFx0XHRcdGludCB6bGlkeClcbiB7XG4tXHRzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTtcbi1cdGludCBub2RlLCBucl9ub2RlcyA9IDA7XG4rXHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzO1xuIFx0bm9kZW1hc2tfdCB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORTtcbi1cdGludCBsb2NhbF9ub2RlLCBwcmV2X25vZGU7XG4rXHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4rXHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcbitcdGludCBub2RlO1xuIFxuLVx0LyogTlVNQS1hd2FyZSBvcmRlcmluZyBvZiBub2RlcyAqL1xuLVx0bG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4tXHRwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xuK1x0cHJfaW5mbyhcIkZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcIiwgbG9jYWxfbm9kZSk7XG4gXG4tXHRtZW1zZXQobm9kZV9vcmRlciwgMCwgc2l6ZW9mKG5vZGVfb3JkZXIpKTtcbi1cdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrKSkgXHUwMDNlPSAwKSB7XG4rXHR3aGlsZSAoKG5vZGUgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKGxvY2FsX25vZGUsIFx1MDAyNnVzZWRfbWFzayxcbitcdFx0XHRcdFx0ICAgICAgY2FuZGlkYXRlcykpIFx1MDAzZT0gMCkge1xuIFx0XHQvKlxuIFx0XHQgKiBXZSBkb24ndCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxuIFx0XHQgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lXG5AQCAtNTkxNywxOCArNTg5OSwyMiBAQCBzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbiBcdFx0ICAgIG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgcHJldl9ub2RlKSlcbiBcdFx0XHRub2RlX2xvYWRbbm9kZV0gKz0gMTtcbiBcbi1cdFx0bm9kZV9vcmRlcltucl9ub2RlcysrXSA9IG5vZGU7XG4rXHRcdHpvbmVyZWZzICs9IGJ1aWxkX3pvbmVyZWZzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lcmVmcyk7XG4rXHRcdHByX2NvbnQoXCIlZCBcIiwgbm9kZSk7XG4gXHRcdHByZXZfbm9kZSA9IG5vZGU7XG4gXHR9XG4gXG4tXHRidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpO1xuLVx0YnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTtcbi1cdHByX2luZm8oXCJGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXCIsIGxvY2FsX25vZGUpO1xuLVx0Zm9yIChub2RlID0gMDsgbm9kZSBcdTAwM2MgbnJfbm9kZXM7IG5vZGUrKylcbi1cdFx0cHJfY29udChcIiVkIFwiLCBub2RlX29yZGVyW25vZGVdKTtcbitcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuK1x0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuIFx0cHJfY29udChcIlxcblwiKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4re1xuK1x0YnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBaT05FTElTVF9GQUxMQkFDSyk7XG4rXHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xuK31cbitcbiAjaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFU1xuIC8qXG4gICogUmV0dXJuIG5vZGUgaWQgb2Ygbm9kZSB1c2VkIGZvciBcImxvY2FsXCIgYWxsb2NhdGlvbnMuXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzowNC4wNDM0MjQzNThaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MzMzMDA0Nzc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGlkZW50aWZ5IHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlcy4gVGhlIGRpZmYgdG91Y2hlcyBgbW0vaW50ZXJuYWwuaGAsIGBtbS9tZW1vcnktdGllcnMuY2AsIGFuZCBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBzdWdnZXN0cyBpdCdzIGxpa2VseSByZWxhdGVkIHRvIG1lbW9yeSBub2RlIHNlbGVjdGlvbiBvciB6b25lIG1hbmFnZW1lbnQgd2l0aGluIE5VTUEgc3lzdGVtcywgbXkgc3BpZGV5IHNlbnNlcyBhcmUgdGluZ2xpbmcuIEknbGwgcHJvYmFibHkgZ3JhYiBgZ3JlcHBlcmAgb3IgYHJlYWQtZmlsZWAgdG8gZ2V0IGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIGNvZGUsIG1heWJlIGxvb2sgYXQgZnVuY3Rpb24gY2FsbHMuXG5cbkZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIGEgaGlnaC1sZXZlbCB1bmRlcnN0YW5kaW5nIG9mIHdoYXQgdGhpcyBwYXRjaCBhY3R1YWxseSAqZG9lcyouXG5cbjEuICAqKmBtbS9pbnRlcm5hbC5oYCoqOiBJdCBsb29rcyBsaWtlIGBmaW5kX25leHRfYmVzdF9ub2RlYCBpcyBnZXR0aW5nIGEgc2lnbmF0dXJlIGNoYW5nZSwgYmVpbmcgcmVuYW1lZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIEkgYWxzbyBzZWUgYSBzdGF0aWMgaW5saW5lIGZhbGxiYWNrIHdoZW4gYENPTkZJR19OVU1BYCAob3Igc29tZXRoaW5nIHNpbWlsYXIpIGlzbid0IGRlZmluZWQuIFNlZW1zIGxpa2UgdGhleSdyZSB0cnlpbmcgdG8gZ2VuZXJhbGl6ZSBhIG5vZGUgc2VsZWN0aW9uIGZ1bmN0aW9uIGFuZCBoYW5kbGUgbm9uLU5VTUEgY2FzZXMgZ3JhY2VmdWxseS5cbjIuICAqKmBtbS9tZW1vcnktdGllcnMuY2AqKjogVGhlIGBuZXh0X2RlbW90aW9uX25vZGUoKWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cygpYCBmdW5jdGlvbnMsIG5vdyBjYWxsaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgLiBJJ20gZ3Vlc3NpbmcgdGhpcyByZWxhdGVzIHRvIG1lbW9yeSB0aWVyaW5nIHBvbGljaWVzIG9yIGRlbW90aW9uL3Byb21vdGlvbiBkZWNpc2lvbnMgd2l0aGluIHRoZSBtZW1vcnkgaGllcmFyY2h5LiBUaGUgYFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXWAgYXJndW1lbnQgaXMgaW1tZWRpYXRlbHkgaW50ZXJlc3RpbmcuXG4zLiAgKipgbW0vcGFnZV9hbGxvYy5jYCoqOiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIFRoZSBvcmlnaW5hbCBgZmluZF9uZXh0X2Jlc3Rfbm9kZSgpYCBpcyBnb25lLCBhbmQgbm93IGNhbGxpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAsIHRha2luZyBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBpbnN0ZWFkIG9mIGhhcmRjb2Rpbmcgbm9kZS1zdGF0ZSBjYWxscy4gVGhpcyBzdWdnZXN0cyBhIG1vcmUgZmxleGlibGUgbm9kZSBzZWxlY3Rpb24gbWVjaGFuaXNtLiBBbHNvLCB0aGUgcmVtb3ZhbC9tZXJnaW5nIG9mIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgIGlzIGludGVyZXN0aW5nLiBUaGUgYGJ1aWxkX3pvbmVsaXN0cygpYCBub3cgY2FsbHMgYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAgd2l0aCBkaWZmZXJlbnQgbm9kZW1hc2tzLiBUaGlzIGlzIGFsbCBhYm91dCB6b25lIG9yZGVyaW5nIGR1cmluZyBwYWdlIGFsbG9jYXRpb24uXG5cbkknbSBzdGFydGluZyB0byBzZWUgYSBwYXR0ZXJuIGhlcmU6IGdlbmVyYWxpemF0aW9uIGFuZCBhIHBvdGVudGlhbCBzaGlmdCBpbiBob3cgbm9kZW1hc2tzIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudC4gVGhpcyBpcyBhYm91dCBtYWtpbmcgbm9kZSBzZWxlY3Rpb24gbW9yZSBmbGV4aWJsZSwgcG90ZW50aWFsbHkgZm9yIGJldHRlciBOVU1BIGF3YXJlbmVzcyBvciBwZXJoYXBzIHRvIGludGVncmF0ZSBpdCBiZXR0ZXIgd2l0aCBtZW1vcnkgdGllcmluZy5cblxuSSdtIHRoaW5raW5nIEkgc2hvdWxkIGNoZWNrIGFyb3VuZCBsaW5lcyAxMTMwLTExNTAgaW4gYG1tL2ludGVybmFsLmhgIHRvIHNlZSB3aGF0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGd1YXJkcyBhcmUgaW4gcGxhY2UuIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIGJlaGF2ZXMgaW4gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MzA4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDI1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MDkuMzc2NDMxOTQyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAwOTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2ludGVybmFsLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTEyNSxcbiAgXCJMaW5lQ291bnRcIjogMzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTEyNTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbWxvY2tfbmV3X2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pIHsgfVxcbjExMjY6XFx0c3RhdGljIGlubGluZSBib29sIG5lZWRfbWxvY2tfZHJhaW4oaW50IGNwdSkgeyByZXR1cm4gZmFsc2U7IH1cXG4xMTI3OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9sb2NhbCh2b2lkKSB7IH1cXG4xMTI4OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9yZW1vdGUoaW50IGNwdSkgeyB9XFxuMTEyOTpcXHQjZW5kaWYgLyogIUNPTkZJR19NTVUgKi9cXG4xMTMwOlxcdFxcbjExMzE6XFx0I2lmZGVmIENPTkZJR19OVU1BXFxuMTEzMjpcXHRleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xcbjExMzM6XFx0XFxuMTEzNDpcXHRleHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG4xMTM1OlxcdFxcdFxcdFxcdFxcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XFxuMTEzNjpcXHRpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuMTEzNzpcXHRcXHRcXHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcXG4xMTM4OlxcdCNlbHNlXFxuMTEzOTpcXHQjZGVmaW5lIG5vZGVfcmVjbGFpbV9tb2RlIDBcXG4xMTQwOlxcdFxcbjExNDE6XFx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxcbjExNDI6XFx0XFx0XFx0XFx0XFx0XFx0IGdmcF90IG1hc2ssIHVuc2lnbmVkIGludCBvcmRlcilcXG4xMTQzOlxcdHtcXG4xMTQ0OlxcdFxcdHJldHVybiAwO1xcbjExNDU6XFx0fVxcbjExNDY6XFx0c3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuMTE0NzpcXHRcXHRcXHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxcbjExNDg6XFx0e1xcbjExNDk6XFx0XFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4xMTUwOlxcdH1cXG4xMTUxOlxcdCNlbmRpZlxcbjExNTI6XFx0XFxuMTE1MzpcXHRzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9yZWNsYWltX2VuYWJsZWQodm9pZClcXG4xMTU0OlxcdHtcXG4xMTU1OlxcdFxcdC8qIElzIGFueSBub2RlX3JlY2xhaW1fbW9kZSBiaXQgc2V0PyAqL1xcbjExNTY6XFx0XFx0cmV0dXJuIG5vZGVfcmVjbGFpbV9tb2RlIFxcdTAwMjYgKFJFQ0xBSU1fWk9ORXxSRUNMQUlNX1dSSVRFfFJFQ0xBSU1fVU5NQVApO1xcbjExNTc6XFx0fVxcbjExNTg6XFx0XFxuMTE1OTpcXHQvKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzowOS4zNzY1MzUyODJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNjY4NTc0MTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgTlVNQSBDb25maWd1cmF0aW9uIGluIE1lbW9yeSBNYW5hZ2VtZW50KipcblxuQWxyaWdodCwgc28gYENPTkZJR19OVU1BYCBpcyB0aGUga2V5IGNvbmZpZ3VyYXRpb24gZ3VhcmQgd2UncmUgZGVhbGluZyB3aXRoIGhlcmUsIHNwZWNpZmljYWxseSBkZWZpbmVkIHdpdGhpbiBgbW0vaW50ZXJuYWwuaGAuIE15IGltbWVkaWF0ZSBmb2N1cyBzaGlmdHMgdG8gaG93IHRoaXMgaW1wYWN0cyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgY29tcG9uZW50cywgYW5kIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vcGFnZV9hbGxvYy5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBpbGF0aW9uIGNvbmRpdGlvbnMgYW5kIGhvdyB0aGlzIGBDT05GSUdfTlVNQWAgZmxhZyBpbmZsdWVuY2VzIHRoZSBjb2RlIHBhdGhzIHdpdGhpbiB0aG9zZSBmaWxlcy4gSSdsbCB6ZXJvIGluIG9uIGBtbS9tZW1vcnktdGllcnMuY2AsIHNwZWNpZmljYWxseSBzY3J1dGluaXppbmcgdGhlIGNvZGUgYmV0d2VlbiBsaW5lcyAzNjAgYW5kIDQ4MC4gVGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IHJlZ2lvbiB0byBmaW5kIHRoZSByZWxldmFudCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBsb2dpYywgd2hpY2ggc2hvdWxkIGlsbHVtaW5hdGUgaG93IE5VTUEtYXdhcmUgbWVtb3J5IHRpZXJpbmcgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQuIExldCdzIGRpZyBpbiBhbmQgc2VlIHdoYXQgd2UgZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Njg5MywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MTIuMDQ1MTEyNDg4WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTUxNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LXRpZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzYwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzYwOlxcdFxcdCAqIGxhc3QgdGFyZ2V0IG5vZGUuIE9yIGludHJvZHVjaW5nIHBlci1jcHUgZGF0YSB0byBhdm9pZFxcbiAzNjE6XFx0XFx0ICogY2FjaGluZyBpc3N1ZSwgd2hpY2ggc2VlbXMgbW9yZSBjb21wbGljYXRlZC4gU28gc2VsZWN0aW5nXFxuIDM2MjpcXHRcXHQgKiB0YXJnZXQgbm9kZSByYW5kb21seSBzZWVtcyBiZXR0ZXIgdW50aWwgbm93LlxcbiAzNjM6XFx0XFx0ICovXFxuIDM2NDpcXHRcXHRpZiAoIW5vZGVzX2VtcHR5KG1hc2spKVxcbiAzNjU6XFx0XFx0XFx0cmV0dXJuIG5vZGVfcmFuZG9tKFxcdTAwMjZtYXNrKTtcXG4gMzY2OlxcdFxcbiAzNjc6XFx0XFx0LypcXG4gMzY4OlxcdFxcdCAqIFByZWZlcnJlZCBub2RlcyBhcmUgbm90IGluIGFsbG93ZWRfbWFzay4gRmxpcCBiaXRzIGluXFxuIDM2OTpcXHRcXHQgKiBhbGxvd2VkX21hc2sgYXMgdXNlZCBub2RlIG1hc2suIFRoZW4sIHVzZSBpdCB0byBnZXQgdGhlXFxuIDM3MDpcXHRcXHQgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC5cXG4gMzcxOlxcdFxcdCAqL1xcbiAzNzI6XFx0XFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcXG4gMzczOlxcdFxcdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFxcdTAwMjZtYXNrLCBcXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcXG4gMzc0OlxcdH1cXG4gMzc1OlxcdFxcbiAzNzY6XFx0c3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbiAzNzc6XFx0e1xcbiAzNzg6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAzNzk6XFx0XFx0aW50IG5vZGU7XFxuIDM4MDpcXHRcXG4gMzgxOlxcdFxcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcXG4gMzgyOlxcdFxcdFxcdG5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7XFxuIDM4MzpcXHRcXHRcXHQvKlxcbiAzODQ6XFx0XFx0XFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxcbiAzODU6XFx0XFx0XFx0ICogdG8gYWNjZXNzIHBnZGEtXFx1MDAzZW1lbXRpZXIuXFxuIDM4NjpcXHRcXHRcXHQgKi9cXG4gMzg3OlxcdFxcdFxcdG1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpO1xcbiAzODg6XFx0XFx0XFx0aWYgKG1lbXRpZXIpXFxuIDM4OTpcXHRcXHRcXHRcXHRtZW10aWVyLVxcdTAwM2Vsb3dlcl90aWVyX21hc2sgPSBOT0RFX01BU0tfTk9ORTtcXG4gMzkwOlxcdFxcdH1cXG4gMzkxOlxcdFxcdC8qXFxuIDM5MjpcXHRcXHQgKiBFbnN1cmUgdGhhdCB0aGUgXFxcImRpc2FibGVcXFwiIGlzIHZpc2libGUgYWNyb3NzIHRoZSBzeXN0ZW0uXFxuIDM5MzpcXHRcXHQgKiBSZWFkZXJzIHdpbGwgc2VlIGVpdGhlciBhIGNvbWJpbmF0aW9uIG9mIGJlZm9yZStkaXNhYmxlXFxuIDM5NDpcXHRcXHQgKiBzdGF0ZSBvciBkaXNhYmxlK2FmdGVyLiAgVGhleSB3aWxsIG5ldmVyIHNlZSBiZWZvcmUgYW5kXFxuIDM5NTpcXHRcXHQgKiBhZnRlciBzdGF0ZSB0b2dldGhlci5cXG4gMzk2OlxcdFxcdCAqL1xcbiAzOTc6XFx0XFx0c3luY2hyb25pemVfcmN1KCk7XFxuIDM5ODpcXHR9XFxuIDM5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MTIuMDQ1MjA5NzE4WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjQxNzM3MzIxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgTWVtb3J5IFRpZXJzIEltcGxlbWVudGF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBgbW0vbWVtb3J5LXRpZXJzLmNgIGltcGxlbWVudGF0aW9uLiBUaGUgbG9naWNhbCBzdGFydGluZyBwb2ludCBpcyBhbHdheXMgdGhlIGJ1aWxkIHN5c3RlbSwgc28gbGV0J3MgY2hlY2sgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlIGZvciB0aGF0IHBhcnRpY3VsYXIgZmlsZS4gVGhlIGtleSBoZXJlIGlzIHRvIHVuZGVyc3RhbmQgaG93IGl0J3MgY29uZmlndXJlZCBhbmQgYnVpbHQsIHdoaWNoIHdpbGwgdGVsbCBtZSBhIGxvdCBhYm91dCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBhbnkgYXNzb2NpYXRlZCBmZWF0dXJlIGZsYWdzLiBOb3csIHRvIHF1aWNrbHkgbG9jYXRlIHRoZSByZWxldmFudCBzZWN0aW9ucywgSSdsbCB1c2UgYGdyZXBgLiBJJ2xsIHNlYXJjaCBzcGVjaWZpY2FsbHkgZm9yIFwibWVtb3J5LXRpZXJzXCIgd2l0aGluIHRob3NlIGNvbmZpZ3VyYXRpb24gZmlsZXMuIFRoaXMgc2hvdWxkIHF1aWNrbHkgaGlnaGxpZ2h0IHRoZSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIGhvdyB0aGUgbW9kdWxlIGlzIGluY29ycG9yYXRlZCBpbnRvIHRoZSBidWlsZC4gVGhpcyBhcHByb2FjaCBpcyBlZmZpY2llbnQg4oCTIHN0YXJ0aW5nIGF0IHRoZSBidWlsZCBzeXN0ZW0gZ2l2ZXMgbWUgY29udGV4dCBhbmQgbWFrZXMgc3VyZSBJIGRvbid0IG1pc3MgYW55dGhpbmcgdGhhdCBlbmFibGVzIG9yIGRpc2FibGVzIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NzYzLCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoxNC40NjI1ODU5NTlaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjE3NjgwMTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtb3J5LXRpZXJzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICs9IG1pZ3JhdGUub1xcbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9cXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG4tLVxcbm1tL2RhbW9uL3BhZGRyLmMtMTItI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N3YXAuaFxcdTAwM2VcXG5tbS9kYW1vbi9wYWRkci5jOjEzOiNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFxcdTAwM2VcXG5tbS9kYW1vbi9wYWRkci5jLTE0LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbV9pbmxpbmUuaFxcdTAwM2VcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzgtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkL3N5c2N0bC5oXFx1MDAzZVxcbm1tL2h1Z2VfbWVtb3J5LmM6Mzk6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDAtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NvbXBhdC5oXFx1MDAzZVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LmhcXHUwMDNlXFxubW0vbWVtb3J5LXRpZXJzLmM6NzojaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcXHUwMDNlXFxubW0vbWVtb3J5LXRpZXJzLmMtOC0jaW5jbHVkZSBcXHUwMDNjbGludXgvbm90aWZpZXIuaFxcdTAwM2VcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTc0Nz1pbnQgbXRfc2V0X2RlZmF1bHRfZHJhbV9wZXJmKGludCBuaWQsIHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZixcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTc3OS1cXHRcXHRwcl9pbmZvKFxcbm1tL21lbW9yeS10aWVycy5jOjc4MDpcXFwibWVtb3J5LXRpZXJzOiB0aGUgcGVyZm9ybWFuY2Ugb2YgRFJBTSBub2RlICVkIG1pc21hdGNoZXMgdGhhdCBvZiB0aGUgcmVmZXJlbmNlXFxcXG5cXFwiXFxubW0vbWVtb3J5LXRpZXJzLmMtNzgxLVxcXCJEUkFNIG5vZGUgJWQuXFxcXG5cXFwiLCBuaWQsIGRlZmF1bHRfZHJhbV9wZXJmX3JlZl9uaWQpO1xcbi0tXFxubW0vbWVtb3J5LmMtNjgtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NobWVtX2ZzLmhcXHUwMDNlXFxubW0vbWVtb3J5LmM6Njk6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL21lbW9yeS5jLTcwLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcXHUwMDNlXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMDItI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2NfZnMuaFxcdTAwM2VcXG5tbS9tZW1wb2xpY3kuYzoxMDM6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL21lbXBvbGljeS5jLTEwNC0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWlncmF0ZS5oXFx1MDAzZVxcbi0tXFxubW0vbWlncmF0ZS5jLTQzLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zeXNjdGwuaFxcdTAwM2VcXG5tbS9taWdyYXRlLmM6NDQ6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbm1tL21pZ3JhdGUuYy00NS0jaW5jbHVkZSBcXHUwMDNjbGludXgvcGFnZXdhbGsuaFxcdTAwM2VcXG4tLVxcbm1tL3Ztc2Nhbi5jLTQ0LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zeXNjdGwuaFxcdTAwM2VcXG5tbS92bXNjYW4uYzo0NTojaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcXHUwMDNlXFxubW0vdm1zY2FuLmMtNDYtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L29vbS5oXFx1MDAzZVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoxNC41MjQzNjAwMjhaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMjE3MzI0NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBhbiBleHBlcnQgaW4gdGhpcyBhcmVhOlxuXG4qKkludmVzdGlnYXRpbmcgTlVNQSBhbmQgTWVtb3J5IERlbW90aW9uKipcblxuT2theSwgc28gYG1lbW9yeS10aWVycy5vYCBpcyBvbmx5IGJyb3VnaHQgaW50byB0aGUgcGljdHVyZSB3aGVuIE5VTUEgc3VwcG9ydCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBhcyBtZW1vcnkgdGllcmluZyBpcyBhIGNvcmUgTlVNQS1yZWxhdGVkIG9wdGltaXphdGlvbi4gTXkgbmV4dCBzdGVwIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdywgc28gSSdsbCB0cmFjZSBhIGZldyBrZXkgZnVuY3Rpb25zLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgZGVtb3Rpb24gcHJvY2VzcyBpcyBraWNrZWQgb2ZmIGFuZCBtYW5hZ2VkLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBrbm93IHdoZXJlIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGFyZSAqY2FsbGVkKi4gVGhlc2UgYXJlIGNsZWFybHkgY3JpdGljYWwgdG8gdGhlIGFjdHVhbCBkZW1vdGlvbiBkZWNpc2lvbnMgYW5kIHRhcmdldCBzZXR1cC4gQW5kLCBsZXQncyBub3QgZm9yZ2V0IGhvdyB0aGVzZSB6b25lcyBnZXQgc2V0IHVwIC0gSSBzaG91bGQgbG9vayBpbnRvIHdoZXJlIGBidWlsZF96b25lbGlzdHNgIGlzIGNhbGxlZC4gSXQncyB0aW1lIHRvIGdldCBkb3duIGFuZCBkaXJ0eSB3aXRoIHNvbWUgYGdyZXBgIGFjdGlvbiB0byBmaW5kIHRob3NlIGNhbGwgc2l0ZXMuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB0aGUgb3ZlcmFsbCBleGVjdXRpb24gcGF0aC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODY1NCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjE2Ljc0MTY4ODM2MVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgxOTA0MjY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXh0X2RlbW90aW9uX25vZGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaD01ND12b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTU1LSNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oOjU2OmludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzayk7XFxuaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaC01Ny12b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oPTU4PWJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTU5LSNlbHNlXFxuaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaDo2MDpzdGF0aWMgaW5saW5lIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTYxLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmg9OTk9c3RhdGljIGlubGluZSB2b2lkIGNsZWFyX25vZGVfbWVtb3J5X3R5cGUoaW50IG5vZGUsIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm1lbXR5cGUpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTEwMy1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oOjEwNDpzdGF0aWMgaW5saW5lIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcXG5pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oLTEwNS17XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz0zMDI9dm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cylcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTMyMC0vKipcXG5tbS9tZW1vcnktdGllcnMuYzozMjE6ICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aFxcbm1tL21lbW9yeS10aWVycy5jLTMyMi0gKiBAbm9kZTogVGhlIHN0YXJ0aW5nIG5vZGUgdG8gbG9va3VwIHRoZSBuZXh0IG5vZGVcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTMyOS0gKi9cXG5tbS9tZW1vcnktdGllcnMuYzozMzA6aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxcbm1tL21lbW9yeS10aWVycy5jLTMzMS17XFxuLS1cXG5tbS92bXNjYW4uYz0xMDcxPXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVtb3RlX2ZvbGlvX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqZGVtb3RlX2ZvbGlvcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTEwOTgtXFxubW0vdm1zY2FuLmM6MTA5OTpcXHR0YXJnZXRfbmlkID0gbmV4dF9kZW1vdGlvbl9ub2RlKHBnZGF0LVxcdTAwM2Vub2RlX2lkLCBcXHUwMDI2YWxsb3dlZF9tYXNrKTtcXG5tbS92bXNjYW4uYy0xMTAwLVxcdGlmICh0YXJnZXRfbmlkID09IE5VTUFfTk9fTk9ERSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MTguNTYwNzM4MjIxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2MDI5MTc4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyBgbmV4dF9kZW1vdGlvbl9ub2RlYCBpbiB0aGUgVk1zY2FuIENvbnRleHQqKlxuXG5Pa2F5LCBzbyBJJ3ZlIHNwb3R0ZWQgdGhhdCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBpcyBpbnZva2VkIHdpdGhpbiBgZGVtb3RlX2ZvbGlvX2xpc3RgIGluc2lkZSBgbW0vdm1zY2FuLmNgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGlzIGZpcmluZyBvZmYgcG90ZW50aWFsIGRlcGVuZGVuY2llcy4gSSBuZWVkIHRvIHF1aWNrbHkgYXNjZXJ0YWluIHRoZSBwcmVyZXF1aXNpdGVzLiBUaGUgcXVlc3Rpb24gdGhhdCBoYXMgc3BydW5nIHRvIG1pbmQgaXMgd2hldGhlciBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBpcyBhIHJlcXVpcmVtZW50IGZvciB0aGUgYG5leHRfZGVtb3Rpb25fbm9kZWAgZnVuY3Rpb24uIEkgKmJlbGlldmUqIGl04oCZcyBkZWZpbmVkIGluIGBpbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oYCBidXQgSSBuZWVkIHRvIHF1aWNrbHkgdmVyaWZ5IHRoYXQuIExldCdzIGp1bXAgb3ZlciB0byB0aGF0IGhlYWRlciBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNTAsIHRvIGNvbmZpcm0uIFRpbWUgdG8gZGlnIGluIGFuZCBjbGFyaWZ5IHRoaXMgcXVpY2tseS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTU5OSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjIxLjE2MzY1ODk1N1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4Mzk4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDQwOlxcdGV4dGVybiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICpkZWZhdWx0X2RyYW1fdHlwZTtcXG4gIDQxOlxcdGV4dGVybiBub2RlbWFza190IGRlZmF1bHRfZHJhbV9ub2RlcztcXG4gIDQyOlxcdHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKmFsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdGFuY2UpO1xcbiAgNDM6XFx0dm9pZCBwdXRfbWVtb3J5X3R5cGUoc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbWVtdHlwZSk7XFxuICA0NDpcXHR2b2lkIGluaXRfbm9kZV9tZW1vcnlfdHlwZShpbnQgbm9kZSwgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqZGVmYXVsdF90eXBlKTtcXG4gIDQ1OlxcdHZvaWQgY2xlYXJfbm9kZV9tZW1vcnlfdHlwZShpbnQgbm9kZSwgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbWVtdHlwZSk7XFxuICA0NjpcXHRpbnQgcmVnaXN0ZXJfbXRfYWRpc3RhbmNlX2FsZ29yaXRobShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTtcXG4gIDQ3OlxcdGludCB1bnJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7XFxuICA0ODpcXHRpbnQgbXRfY2FsY19hZGlzdGFuY2UoaW50IG5vZGUsIGludCAqYWRpc3QpO1xcbiAgNDk6XFx0aW50IG10X3NldF9kZWZhdWx0X2RyYW1fcGVyZihpbnQgbmlkLCBzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgKnBlcmYsXFxuICA1MDpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSk7XFxuICA1MTpcXHRpbnQgbXRfcGVyZl90b19hZGlzdGFuY2Uoc3RydWN0IGFjY2Vzc19jb29yZGluYXRlICpwZXJmLCBpbnQgKmFkaXN0KTtcXG4gIDUyOlxcdHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm10X2ZpbmRfYWxsb2NfbWVtb3J5X3R5cGUoaW50IGFkaXN0LFxcbiAgNTM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xcbiAgNTQ6XFx0dm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XFxuICA1NTpcXHQjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxuICA1NjpcXHRpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spO1xcbiAgNTc6XFx0dm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cyk7XFxuICA1ODpcXHRib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSk7XFxuICA1OTpcXHQjZWxzZVxcbiAgNjA6XFx0c3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuICA2MTpcXHR7XFxuICA2MjpcXHRcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbiAgNjM6XFx0fVxcbiAgNjQ6XFx0XFxuICA2NTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXFxuICA2NjpcXHR7XFxuICA2NzpcXHRcXHQqdGFyZ2V0cyA9IE5PREVfTUFTS19OT05FO1xcbiAgNjg6XFx0fVxcbiAgNjk6XFx0XFxuICA3MDpcXHRzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxcbiAgNzE6XFx0e1xcbiAgNzI6XFx0XFx0cmV0dXJuIHRydWU7XFxuICA3MzpcXHR9XFxuICA3NDpcXHQjZW5kaWZcXG4gIDc1OlxcdFxcbiAgNzY6XFx0I2Vsc2VcXG4gIDc3OlxcdFxcbiAgNzg6XFx0I2RlZmluZSBudW1hX2RlbW90aW9uX2VuYWJsZWRcXHRmYWxzZVxcbiAgNzk6XFx0I2RlZmluZSBkZWZhdWx0X2RyYW1fdHlwZVxcdE5VTExcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MjEuMTYzNzQ0ODU3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI1ODk5NTkxMDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhhdCBjb2RlIHNuaXBwZXQ6XG5cbioqRGl2aW5nIGludG8gbWVtb3J5LXRpZXJzLmMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgYSBzcGVjaWZpYyBwaWVjZSBvZiBjb2RlIGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgaGFuZGxlZC4gU3BlY2lmaWNhbGx5LCBJJ20gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCdzIGFjdGl2ZS4gTXkgaW5pdGlhbCBoeXBvdGhlc2lzIGlzIHRoYXQgaXQncyBnb3Zlcm5lZCBieSB0aGUgYENPTkZJR19OVU1BX01JR1JBVElPTmAgcHJlcHJvY2Vzc29yIGRlZmluZS5cblxuVG8gY29uZmlybSB0aGlzLCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIHJlbGV2YW50IHNlY3Rpb24uIEkgcmVjYWxsIHRoZSBkaXNjdXNzaW9uIGFyb3VuZCB0aGlzIGFyZWEsIHNvIGxldCdzIHN0YXJ0IGJ5IHplcm9pbmcgaW4gb24gbGluZXMgMzAwIHRvIDQ4MCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaGF0IGNodW5rIHNob3VsZCBjb250YWluIHRoZSBjcml0aWNhbCBsb2dpYyBJJ20gaW50ZXJlc3RlZCBpbiwgYW5kIGhvcGVmdWxseSwgdGhlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQgY29udHJvbCBpdHMgZXhlY3V0aW9uIGFyZSBjbGVhcmx5IHZpc2libGUgd2l0aGluIHRoYXQgcmFuZ2UuIEZyb20gdGhlcmUsIEkgY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgbXkgaW5pdGlhbCB0aG91Z2h0IGFib3V0IGBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGlzIGNvcnJlY3Qgb3IgaWYgYW5vdGhlciBjb25kaXRpb25hbCBpcyBhdCBwbGF5LiBUaGlzIGluZm9ybWF0aW9uIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBzcGVjaWZpYyBiZWhhdmlvdXIgaW4gcXVlc3Rpb24sIGVzcGVjaWFsbHkgaW4gdGhpcyBjb250ZXh0LCBzbyBJJ2xsIGRvdWJsZSBjaGVjayB0aGUgcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA1ODYsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjIzLjc1MzcwNjU1NVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTcwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnktdGllcnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMDAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMDA6XFx0fVxcbiAzMDE6XFx0XFxuIDMwMjpcXHR2b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKVxcbiAzMDM6XFx0e1xcbiAzMDQ6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAzMDU6XFx0XFxuIDMwNjpcXHRcXHQvKlxcbiAzMDc6XFx0XFx0ICogcGdfZGF0YV90Lm1lbXRpZXIgdXBkYXRlcyBpbmNsdWRlcyBhIHN5bmNocm9uaXplX3JjdSgpXFxuIDMwODpcXHRcXHQgKiB3aGljaCBlbnN1cmVzIHRoYXQgd2UgZWl0aGVyIGZpbmQgTlVMTCBvciBhIHZhbGlkIG1lbXRpZXJcXG4gMzA5OlxcdFxcdCAqIGluIE5PREVfREFUQS4gcHJvdGVjdCB0aGUgYWNjZXNzIHZpYSByY3VfcmVhZF9sb2NrKCk7XFxuIDMxMDpcXHRcXHQgKi9cXG4gMzExOlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gMzEyOlxcdFxcdG1lbXRpZXIgPSByY3VfZGVyZWZlcmVuY2UocGdkYXQtXFx1MDAzZW1lbXRpZXIpO1xcbiAzMTM6XFx0XFx0aWYgKG1lbXRpZXIpXFxuIDMxNDpcXHRcXHRcXHQqdGFyZ2V0cyA9IG1lbXRpZXItXFx1MDAzZWxvd2VyX3RpZXJfbWFzaztcXG4gMzE1OlxcdFxcdGVsc2VcXG4gMzE2OlxcdFxcdFxcdCp0YXJnZXRzID0gTk9ERV9NQVNLX05PTkU7XFxuIDMxNzpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gMzE4OlxcdH1cXG4gMzE5OlxcdFxcbiAzMjA6XFx0LyoqXFxuIDMyMTpcXHQgKiBuZXh0X2RlbW90aW9uX25vZGUoKSAtIEdldCB0aGUgbmV4dCBub2RlIGluIHRoZSBkZW1vdGlvbiBwYXRoXFxuIDMyMjpcXHQgKiBAbm9kZTogVGhlIHN0YXJ0aW5nIG5vZGUgdG8gbG9va3VwIHRoZSBuZXh0IG5vZGVcXG4gMzIzOlxcdCAqIEBhbGxvd2VkX21hc2s6IFRoZSBwb2ludGVyIHRvIGFsbG93ZWQgbm9kZSBtYXNrXFxuIDMyNDpcXHQgKlxcbiAzMjU6XFx0ICogUmV0dXJuOiBub2RlIGlkIGZvciBuZXh0IG1lbW9yeSBub2RlIGluIHRoZSBkZW1vdGlvbiBwYXRoIGhpZXJhcmNoeVxcbiAzMjY6XFx0ICogZnJvbSBAbm9kZTsgTlVNQV9OT19OT0RFIGlmIEBub2RlIGlzIHRlcm1pbmFsLiAgVGhpcyBkb2VzIG5vdCBrZWVwXFxuIDMyNzpcXHQgKiBAbm9kZSBvbmxpbmUgb3IgZ3VhcmFudGVlIHRoYXQgaXQgKmNvbnRpbnVlcyogdG8gYmUgdGhlIG5leHQgZGVtb3Rpb25cXG4gMzI4OlxcdCAqIHRhcmdldC5cXG4gMzI5OlxcdCAqL1xcbiAzMzA6XFx0aW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxcbiAzMzE6XFx0e1xcbiAzMzI6XFx0XFx0c3RydWN0IGRlbW90aW9uX25vZGVzICpuZDtcXG4gMzMzOlxcdFxcdG5vZGVtYXNrX3QgbWFzaztcXG4gMzM0OlxcdFxcbiAzMzU6XFx0XFx0aWYgKCFub2RlX2RlbW90aW9uKVxcbiAzMzY6XFx0XFx0XFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4gMzM3OlxcdFxcbiAzMzg6XFx0XFx0bmQgPSBcXHUwMDI2bm9kZV9kZW1vdGlvbltub2RlXTtcXG4gMzM5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoyMy43NTM4MDgwODVaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjAzOTYxOTI3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuXG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgVGllciBHdWFyZHMqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIGFyb3VuZCBsaW5lIDMzMCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaGF0IGZ1bmN0aW9uIGNhbGwsIG9yIHdoYXRldmVyIGxvZ2ljIHJlc2lkZXMgdGhlcmUsIHNlZW1zIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IGEgZGVlcGVyIGxvb2suIEJlZm9yZSBJIGp1bXAgKmRpcmVjdGx5KiB0byAzMzAgdGhvdWdoLCBsZXQncyBnaXZlIG15c2VsZiBzb21lIGNvbnRleHQuIEknbGwgdGFrZSBhIHBlZWsgYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUsIHNheSBsaW5lcyAyODAgdGhyb3VnaCAzMDAuIEtub3dpbmcgdGhlICp3aGF0KiBhcm91bmQgdGhlICp3aGVyZSogaXMgYWx3YXlzIGEgc21hcnQgbW92ZSB0byB1bmRlcnN0YW5kIHRoZSAqd2h5Ki4gVGhpcyBxdWljayBzY2FuIHNob3VsZCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgZmxvdyBhbmQgYW55IHN1cnJvdW5kaW5nIGd1YXJkIGNvbmRpdGlvbnMgb3IgbG9naWMgdGhhdCBtaWdodCBiZSByZWxldmFudC4gSXQncyB0aW1lIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBuZWlnaGJvcmhvb2QgYXJvdW5kIGxpbmUgMzMwLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTUxNSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MjUuNzkzNDI5NTVaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAxOTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeS10aWVycy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI4MCxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI4MDpcXHRcXHRwZ19kYXRhX3QgKnBnZGF0O1xcbiAyODE6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAyODI6XFx0XFxuIDI4MzpcXHRcXHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gMjg0OlxcdFxcdGlmICghcGdkYXQpXFxuIDI4NTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDI4NjpcXHRcXG4gMjg3OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gMjg4OlxcdFxcdG1lbXRpZXIgPSByY3VfZGVyZWZlcmVuY2UocGdkYXQtXFx1MDAzZW1lbXRpZXIpO1xcbiAyODk6XFx0XFx0aWYgKCFtZW10aWVyKSB7XFxuIDI5MDpcXHRcXHRcXHR0b3B0aWVyID0gdHJ1ZTtcXG4gMjkxOlxcdFxcdFxcdGdvdG8gb3V0O1xcbiAyOTI6XFx0XFx0fVxcbiAyOTM6XFx0XFx0aWYgKG1lbXRpZXItXFx1MDAzZWFkaXN0YW5jZV9zdGFydCBcXHUwMDNjPSB0b3BfdGllcl9hZGlzdGFuY2UpXFxuIDI5NDpcXHRcXHRcXHR0b3B0aWVyID0gdHJ1ZTtcXG4gMjk1OlxcdFxcdGVsc2VcXG4gMjk2OlxcdFxcdFxcdHRvcHRpZXIgPSBmYWxzZTtcXG4gMjk3OlxcdG91dDpcXG4gMjk4OlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAyOTk6XFx0XFx0cmV0dXJuIHRvcHRpZXI7XFxuIDMwMDpcXHR9XFxuIDMwMTpcXHRcXG4gMzAyOlxcdHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXFxuIDMwMzpcXHR7XFxuIDMwNDpcXHRcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjI1Ljc5MzUzMzAxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2MzI5NzM4NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgVGllciBHdWFyZHJhaWxzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbi4gTXkgZm9jdXMgcmlnaHQgbm93IGlzIG9uIHRoZSBtZW1vcnkgdGllcmluZyBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDI3MCBvZiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBJJ20gZ29pbmcgdG8gY2FyZWZ1bGx5IHNjcnV0aW5pemUgdGhlIGd1YXJkIGNvbmRpdGlvbnMgc3Vycm91bmRpbmcgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBjb2RlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHByb3RlY3Rpb25zIGFyZSBpbiBwbGFjZSB0byBwcmV2ZW50IHBvdGVudGlhbCBpc3N1ZXMsIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgcmFjZSBjb25kaXRpb25zLCBvciBpbmNvcnJlY3QgdGllciBhc3NpZ25tZW50cy4gTXkgcHJpbWFyeSBnb2FsIGhlcmUgaXMgdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCB3ZWFrbmVzc2VzIG9yIGFyZWFzIHdoZXJlIG9wdGltaXphdGlvbnMgbWlnaHQgYmUgcG9zc2libGUuIEknbGwgbmVlZCB0byBjb25zaWRlciBob3cgdGhlc2UgZ3VhcmRzIGludGVyYWN0IHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSwgdGFraW5nIGludG8gYWNjb3VudCBhbnkgcmVsZXZhbnQgbG9ja2luZyBtZWNoYW5pc21zLCBjYWNoZSBjb2hlcmVuY3kgcHJvdG9jb2xzLCBhbmQgY29uY3VycmVudCBhY2Nlc3MgcGF0dGVybnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDk3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzoyOC40MjY1MTA1OTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTI1MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LXRpZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjYwLFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjYwOlxcdHN0YXRpYyBzdHJ1Y3QgbWVtb3J5X3RpZXIgKl9fbm9kZV9nZXRfbWVtb3J5X3RpZXIoaW50IG5vZGUpXFxuIDI2MTpcXHR7XFxuIDI2MjpcXHRcXHRwZ19kYXRhX3QgKnBnZGF0O1xcbiAyNjM6XFx0XFxuIDI2NDpcXHRcXHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gMjY1OlxcdFxcdGlmICghcGdkYXQpXFxuIDI2NjpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMjY3OlxcdFxcdC8qXFxuIDI2ODpcXHRcXHQgKiBTaW5jZSB3ZSBob2xkIG1lbW9yeV90aWVyX2xvY2ssIHdlIGNhbiBhdm9pZFxcbiAyNjk6XFx0XFx0ICogUkNVIHJlYWQgbG9ja3Mgd2hlbiBhY2Nlc3NpbmcgdGhlIGRldGFpbHMuIE5vXFxuIDI3MDpcXHRcXHQgKiBwYXJhbGxlbCB1cGRhdGVzIGFyZSBwb3NzaWJsZSBoZXJlLlxcbiAyNzE6XFx0XFx0ICovXFxuIDI3MjpcXHRcXHRyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHBnZGF0LVxcdTAwM2VtZW10aWVyLFxcbiAyNzM6XFx0XFx0XFx0XFx0XFx0ICAgICBsb2NrZGVwX2lzX2hlbGQoXFx1MDAyNm1lbW9yeV90aWVyX2xvY2spKTtcXG4gMjc0OlxcdH1cXG4gMjc1OlxcdFxcbiAyNzY6XFx0I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbiAyNzc6XFx0Ym9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXFxuIDI3ODpcXHR7XFxuIDI3OTpcXHRcXHRib29sIHRvcHRpZXI7XFxuIDI4MDpcXHRcXHRwZ19kYXRhX3QgKnBnZGF0O1xcbiAyODE6XFx0XFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xcbiAyODI6XFx0XFxuIDI4MzpcXHRcXHRwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gMjg0OlxcdFxcdGlmICghcGdkYXQpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjI4LjQyNjYwNjM1N1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDM0MzIzMjE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgTlVNQSBNaWdyYXRpb24gaW4gYG1tL21lbW9yeS10aWVycy5jYCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgSSBzZWUgdGhpcyBgI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTmAgZ3VhcmQgYXJvdW5kIGEgYmxvY2sgb2YgY29kZSwgc3RhcnRpbmcgYXJvdW5kIGxpbmUgMjc2LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgdGhpcyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLiBXaGVyZSBkb2VzIGl0IGVuZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgPyBJdCdzIGVzc2VudGlhbCB0byB1bmRlcnN0YW5kIHdoaWNoIHBhcnRzIG9mIHRoZSBjb2RlIGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIGJhc2VkIG9uIHRoZSBOVU1BIG1pZ3JhdGlvbiBjb25maWd1cmF0aW9uLiBMZXQgbWUgcXVpY2tseSBqdW1wIHRvIGxpbmVzIDQ4MC01MzAgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBgI2VuZGlmYCBvciB0aGUgbmV4dCBkZWZpbmluZyBgaWZkZWZgIG9yIGBpZm5kZWZgLCBvciBgZWxzZWAuIFRoYXQgc2hvdWxkIGNsYXJpZnkgd2hhdCBmYWxscyB3aXRoaW4gdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNjb3BlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjY4MSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MzAuNDYwOTMyNzI0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMjI4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnktdGllcnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0ODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0ODA6XFx0XFx0LypcXG4gNDgxOlxcdFxcdCAqIFByb21vdGlvbiBpcyBhbGxvd2VkIGZyb20gYSBtZW1vcnkgdGllciB0byBoaWdoZXJcXG4gNDgyOlxcdFxcdCAqIG1lbW9yeSB0aWVyIG9ubHkgaWYgdGhlIG1lbW9yeSB0aWVyIGRvZXNuJ3QgaW5jbHVkZVxcbiA0ODM6XFx0XFx0ICogY29tcHV0ZS4gV2Ugd2FudCB0byBza2lwIHByb21vdGlvbiBmcm9tIGEgbWVtb3J5IHRpZXIsXFxuIDQ4NDpcXHRcXHQgKiBpZiBhbnkgbm9kZSB0aGF0IGlzIHBhcnQgb2YgdGhlIG1lbW9yeSB0aWVyIGhhdmUgQ1BVcy5cXG4gNDg1OlxcdFxcdCAqIE9uY2Ugd2UgZGV0ZWN0IHN1Y2ggYSBtZW1vcnkgdGllciwgd2UgY29uc2lkZXIgdGhhdCB0aWVyXFxuIDQ4NjpcXHRcXHQgKiBhcyB0b3AgdGlwZXIgZnJvbSB3aGljaCBwcm9tb3Rpb24gaXMgbm90IGFsbG93ZWQuXFxuIDQ4NzpcXHRcXHQgKi9cXG4gNDg4OlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShtZW10aWVyLCBcXHUwMDI2bWVtb3J5X3RpZXJzLCBsaXN0KSB7XFxuIDQ4OTpcXHRcXHRcXHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XFxuIDQ5MDpcXHRcXHRcXHRpZiAobm9kZXNfYW5kKHRpZXJfbm9kZXMsIG5vZGVfc3RhdGVzW05fQ1BVXSwgdGllcl9ub2RlcykpIHtcXG4gNDkxOlxcdFxcdFxcdFxcdC8qXFxuIDQ5MjpcXHRcXHRcXHRcXHQgKiBhYnN0cmFjdCBkaXN0YW5jZSBiZWxvdyB0aGUgbWF4IHZhbHVlIG9mIHRoaXMgbWVtdGllclxcbiA0OTM6XFx0XFx0XFx0XFx0ICogaXMgY29uc2lkZXJlZCB0b3B0aWVyLlxcbiA0OTQ6XFx0XFx0XFx0XFx0ICovXFxuIDQ5NTpcXHRcXHRcXHRcXHR0b3BfdGllcl9hZGlzdGFuY2UgPSBtZW10aWVyLVxcdTAwM2VhZGlzdGFuY2Vfc3RhcnQgK1xcbiA0OTY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0TUVNVElFUl9DSFVOS19TSVpFIC0gMTtcXG4gNDk3OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiA0OTg6XFx0XFx0XFx0fVxcbiA0OTk6XFx0XFx0fVxcbiA1MDA6XFx0XFx0LypcXG4gNTAxOlxcdFxcdCAqIE5vdyBidWlsZCB0aGUgbG93ZXJfdGllciBtYXNrIGZvciBlYWNoIG5vZGUgY29sbGVjdGluZyBub2RlIG1hc2sgZnJvbVxcbiA1MDI6XFx0XFx0ICogYWxsIG1lbW9yeSB0aWVyIGJlbG93IGl0LiBUaGlzIGFsbG93cyB1cyB0byBmYWxsYmFjayBkZW1vdGlvbiBwYWdlXFxuIDUwMzpcXHRcXHQgKiBhbGxvY2F0aW9uIHRvIGEgc2V0IG9mIG5vZGVzIHRoYXQgaXMgY2xvc2VyIHRoZSBhYm92ZSBzZWxlY3RlZFxcbiA1MDQ6XFx0XFx0ICogcHJlZmVycmVkIG5vZGUuXFxuIDUwNTpcXHRcXHQgKi9cXG4gNTA2OlxcdFxcdGxvd2VyX3RpZXIgPSBub2RlX3N0YXRlc1tOX01FTU9SWV07XFxuIDUwNzpcXHRcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbXRpZXIsIFxcdTAwMjZtZW1vcnlfdGllcnMsIGxpc3QpIHtcXG4gNTA4OlxcdFxcdFxcdC8qXFxuIDUwOTpcXHRcXHRcXHQgKiBLZWVwIHJlbW92aW5nIGN1cnJlbnQgdGllciBmcm9tIGxvd2VyX3RpZXIgbm9kZXMsXFxuIDUxMDpcXHRcXHRcXHQgKiBUaGlzIHdpbGwgcmVtb3ZlIGFsbCBub2RlcyBpbiBjdXJyZW50IGFuZCBhYm92ZVxcbiA1MTE6XFx0XFx0XFx0ICogbWVtb3J5IHRpZXIgZnJvbSB0aGUgbG93ZXJfdGllciBtYXNrLlxcbiA1MTI6XFx0XFx0XFx0ICovXFxuIDUxMzpcXHRcXHRcXHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XFxuIDUxNDpcXHRcXHRcXHRub2Rlc19hbmRub3QobG93ZXJfdGllciwgbG93ZXJfdGllciwgdGllcl9ub2Rlcyk7XFxuIDUxNTpcXHRcXHRcXHRtZW10aWVyLVxcdTAwM2Vsb3dlcl90aWVyX21hc2sgPSBsb3dlcl90aWVyO1xcbiA1MTY6XFx0XFx0fVxcbiA1MTc6XFx0XFxuIDUxODpcXHRcXHRkdW1wX2RlbW90aW9uX3RhcmdldHMoKTtcXG4gNTE5OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MzAuNDYxMDM3MDk0WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIxMjI2MTQ4NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIEknbSByZWFkeSB0byBkaXZlIGludG8gdGhpcy4gTGV0J3Mgc2VlIHdoYXQncyBiZWluZyBhc2tlZCBoZXJlLi4uIEkgbmVlZCB0byBzdW1tYXJpemUgYSB0ZXh0IGFzIGlmIGl0J3MgKm15KiB0aG91Z2h0IHByb2Nlc3MsIGFzIGFuIGV4cGVydCBpbiBteSBmaWVsZC4gT2theSwgc28gSSBzaG91bGQgYmUgdGhpbmtpbmcgYWJvdXQgdGhlIGluZm9ybWF0aW9uIGZyb20gYSBwb3NpdGlvbiBvZiBkZWVwIHVuZGVyc3RhbmRpbmcgYW5kIGV4cGVyaWVuY2UsIGludGVycHJldGluZyBpdCBhcyBJIHdvdWxkIG5hdHVyYWxseS4gR290IGl0LiBJIHNob3VsZCBhbHNvIHN0YXJ0IHdpdGggYSBib2xkZWQgaGVhZGVyIGFuZCBzcGVhayBpbiB0aGUgZmlyc3QgcGVyc29uLiBBbHJpZ2h0LCBoZXJlIHdlIGdvLlxuXG4qKk5hdmlnYXRpbmcgdGhlIE51YW5jZXM6IExpbmVzIDUyMC01NjAqKlxuXG5SaWdodCwgc28gbGV0J3MgZ2V0IGRvd24gdG8gdGhlIGJyYXNzIHRhY2tzIGFuZCB0YWtlIGEgbG9vayBhdCBsaW5lcyA1MjAgdGhyb3VnaCA1NjAuIEkgaW1tZWRpYXRlbHkgdGhpbmsgdGhhdCB0aGVzZSBsaW5lcyBwcm9iYWJseSBob2xkIGNydWNpYWwgZGV0YWlscywgYW5kIGJhc2VkIG9uIHRoZSBwcm9tcHQsIGl0IHdvdWxkIGJlIGFkdmFudGFnZW91cyB0byBleGFtaW5lIHRoaXMgc2VjdGlvbiBjbG9zZWx5LiBJIGtub3cgdGhlIGludHJpY2FjaWVzIG9mIHRoaXMgc3ViamVjdDsgaXQncyBwcmFjdGljYWxseSBzZWNvbmQgbmF0dXJlLiBJJ2xsIHJlYWQgd2l0aCB0aGF0IHBlcnNwZWN0aXZlLiBJIHNob3VsZCBiZSBhYmxlIHRvIGRlZHVjZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoZXNlIGxpbmVzIHJlbGF0aXZlbHkgcXVpY2tseS4gTGV0J3Mgc2VlIGhvdyB0aGlzIHRleHQgdW5mb2xkcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM1NzAsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjMyLjU4MzY1NDE2WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxNjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeS10aWVycy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyMDpcXHRcXG4gNTIxOlxcdCNlbHNlXFxuIDUyMjpcXHRzdGF0aWMgaW5saW5lIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkge31cXG4gNTIzOlxcdCNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG4gNTI0OlxcdFxcbiA1MjU6XFx0c3RhdGljIGlubGluZSB2b2lkIF9faW5pdF9ub2RlX21lbW9yeV90eXBlKGludCBub2RlLCBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlKVxcbiA1MjY6XFx0e1xcbiA1Mjc6XFx0XFx0aWYgKCFub2RlX21lbW9yeV90eXBlc1tub2RlXS5tZW10eXBlKVxcbiA1Mjg6XFx0XFx0XFx0bm9kZV9tZW1vcnlfdHlwZXNbbm9kZV0ubWVtdHlwZSA9IG1lbXR5cGU7XFxuIDUyOTpcXHRcXHQvKlxcbiA1MzA6XFx0XFx0ICogZm9yIGVhY2ggZGV2aWNlIGdldHRpbmcgYWRkZWQgaW4gdGhlIHNhbWUgTlVNQSBub2RlXFxuIDUzMTpcXHRcXHQgKiB3aXRoIHRoaXMgc3BlY2lmaWMgbWVtdHlwZSwgYnVtcCB0aGUgbWFwIGNvdW50LiBXZVxcbiA1MzI6XFx0XFx0ICogT25seSB0YWtlIG1lbXR5cGUgZGV2aWNlIHJlZmVyZW5jZSBvbmNlLCBzbyB0aGF0XFxuIDUzMzpcXHRcXHQgKiBjaGFuZ2luZyBhIG5vZGUgbWVtdHlwZSBjYW4gYmUgZG9uZSBieSBkcm9wcGluZyB0aGVcXG4gNTM0OlxcdFxcdCAqIG9ubHkgcmVmZXJlbmNlIGNvdW50IHRha2VuIGhlcmUuXFxuIDUzNTpcXHRcXHQgKi9cXG4gNTM2OlxcdFxcbiA1Mzc6XFx0XFx0aWYgKG5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1lbXR5cGUgPT0gbWVtdHlwZSkge1xcbiA1Mzg6XFx0XFx0XFx0aWYgKCFub2RlX21lbW9yeV90eXBlc1tub2RlXS5tYXBfY291bnQrKylcXG4gNTM5OlxcdFxcdFxcdFxcdGtyZWZfZ2V0KFxcdTAwMjZtZW10eXBlLVxcdTAwM2VrcmVmKTtcXG4gNTQwOlxcdFxcdH1cXG4gNTQxOlxcdH1cXG4gNTQyOlxcdFxcbiA1NDM6XFx0c3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqc2V0X25vZGVfbWVtb3J5X3RpZXIoaW50IG5vZGUpXFxuIDU0NDpcXHR7XFxuIDU0NTpcXHRcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XFxuIDU0NjpcXHRcXHRzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptZW10eXBlID0gZGVmYXVsdF9kcmFtX3R5cGU7XFxuIDU0NzpcXHRcXHRpbnQgYWRpc3QgPSBNRU1USUVSX0FESVNUQU5DRV9EUkFNO1xcbiA1NDg6XFx0XFx0cGdfZGF0YV90ICpwZ2RhdCA9IE5PREVfREFUQShub2RlKTtcXG4gNTQ5OlxcdFxcbiA1NTA6XFx0XFxuIDU1MTpcXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoXFx1MDAyNm1lbW9yeV90aWVyX2xvY2spO1xcbiA1NTI6XFx0XFxuIDU1MzpcXHRcXHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKVxcbiA1NTQ6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIDU1NTpcXHRcXG4gNTU2OlxcdFxcdG10X2NhbGNfYWRpc3RhbmNlKG5vZGUsIFxcdTAwMjZhZGlzdCk7XFxuIDU1NzpcXHRcXHRpZiAoIW5vZGVfbWVtb3J5X3R5cGVzW25vZGVdLm1lbXR5cGUpIHtcXG4gNTU4OlxcdFxcdFxcdG1lbXR5cGUgPSBtdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGFkaXN0LCBcXHUwMDI2ZGVmYXVsdF9tZW1vcnlfdHlwZXMpO1xcbiA1NTk6XFx0XFx0XFx0aWYgKElTX0VSUihtZW10eXBlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzozMi41ODM3NDc3WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzNjczOTE4ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRGl2aW5nIGludG8gYG1tL3BhZ2VfYWxsb2MuY2AqKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgZGlzc2VjdCBgbW0vcGFnZV9hbGxvYy5jYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIG9uIHRoZSBmdW5jdGlvbiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHRoZSBncmFuZCBzY2hlbWUgb2YgdGhpbmdzLiBTbywgdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgcG9wcyBpbnRvIG15IGhlYWQgaXM6IHdobyBpcyBjYWxsaW5nIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbj8gV2hhdCBhcmUgaXRzIGRlcGVuZGVuY2llcz8gSSdtIGdvaW5nIHRvIGZpcmUgdXAgZ3JlcCBhbmQgc2NhbiB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSwgbG9va2luZyBmb3IgYWxsIGluc3RhbmNlcyBvZiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAuIFRoYXQncyB0aGUgYmVzdCB3YXkgdG8gZGV0ZXJtaW5lIGl0cyBjYWxsZXJzIGFuZCwgYnkgZXh0ZW5zaW9uLCBpdHMgY29udGV4dC4gS25vd2luZyB3aGVyZSBpdCdzIHVzZWQgaXMgdGhlIGZpcnN0IGNyaXRpY2FsIHN0ZXAgdG8gdW5kZXJzdGFuZGluZyBpdHMgcHVycG9zZSBhbmQgcG90ZW50aWFsIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ0ODEsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjM0Ljk1MTE0MTcxMloiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxOTM3OTIwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmaW5kX25leHRfYmVzdF9ub2RlX2luXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2ludGVybmFsLmg9MTEzND1leHRlcm4gdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG5tbS9pbnRlcm5hbC5oLTExMzUtXFx0XFx0XFx0XFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcXG5tbS9pbnRlcm5hbC5oOjExMzY6aW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxcbm1tL2ludGVybmFsLmgtMTEzNy1cXHRcXHRjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcXG4tLVxcbm1tL2ludGVybmFsLmg9MTE0MT1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTExNDUtfVxcbm1tL2ludGVybmFsLmg6MTE0NjpzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcXG5tbS9pbnRlcm5hbC5oLTExNDctXFx0XFx0Y29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTMzMD1pbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy0zNzItXFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcXG5tbS9tZW1vcnktdGllcnMuYzozNzM6XFx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXFx1MDAyNm1hc2ssIFxcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xcbm1tL21lbW9yeS10aWVycy5jLTM3NC19XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz00MjU9c3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTQ1Mi1cXHRcXHQvKlxcbm1tL21lbW9yeS10aWVycy5jOjQ1MzpcXHRcXHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJ3VzZWQnIG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0Llxcbm1tL21lbW9yeS10aWVycy5jLTQ1NC1cXHRcXHQgKiBBZGQgYWxsIG1lbW9yeSBub2RlcyBleGNlcHQgdGhlIHNlbGVjdGVkIG1lbW9yeSB0aWVyXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy00NjUtXFx0XFx0ZG8ge1xcbm1tL21lbW9yeS10aWVycy5jOjQ2NjpcXHRcXHRcXHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFxcdTAwMjZ0aWVyX25vZGVzLFxcbm1tL21lbW9yeS10aWVycy5jLTQ2Ny1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01NzkzPXN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTc5NS0vKipcXG5tbS9wYWdlX2FsbG9jLmM6NTc5NjogKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0XFxubW0vcGFnZV9hbGxvYy5jLTU3OTctICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmdcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01ODEwLSAqL1xcbm1tL3BhZ2VfYWxsb2MuYzo1ODExOmludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcXG5tbS9wYWdlX2FsbG9jLmMtNTgxMi1cXHRcXHRcXHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU4ODA9c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU4OTAtXFxubW0vcGFnZV9hbGxvYy5jOjU4OTE6XFx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcXHUwMDI2dXNlZF9tYXNrLFxcbm1tL3BhZ2VfYWxsb2MuYy01ODkyLVxcdFxcdFxcdFxcdFxcdCAgICAgIGNhbmRpZGF0ZXMpKSBcXHUwMDNlPSAwKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjM2LjY3MDUyOTM1NFoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxOTgyMDgzMzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqQW5hbHl6aW5nIEZ1bmN0aW9uIENhbGwgR3JhcGhzKipcblxuQWxyaWdodCwgZmlyc3QgdGhpbmdzIGZpcnN0LiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55dGhpbmcgcmVsYXRlZCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZWAuIFRoZSBpbXBsaWNhdGlvbiBpcyB0aGF0IEkndmUgYmVlbiB0cmFjaW5nIHRoZSBsaW5lYWdlIG9mIHRoYXQgZnVuY3Rpb24sIHByb2JhYmx5IHRvIG9wdGltaXplIG9yIHVuZGVyc3RhbmQgaXRzIHVzYWdlLiBHb29kISBMb29rcyBsaWtlIG5vIGZ1cnRoZXIgaW5zdGFuY2VzIG9mIGl0IGFyZSBiZWluZyBjYWxsZWQuIFRoYXQncyBhIGNsZWFuIGJyZWFrIHBvaW50LlxuXG5Ob3csIG15IGZvY3VzIHNoaWZ0cy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBhcm91bmQgYGJ1aWxkX3pvbmVsaXN0c2AgYW5kIGBidWlsZF9hbGxfem9uZWxpc3RzYC4gV2hvIHJlbGllcyBvbiB0aGVzZSBmdW5jdGlvbnM/ICBLbm93aW5nIHRoZWlyIGNhbGxlcnMgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIGZsb3cgYW5kIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3Mgb3IgYXJlYXMgZm9yIHJlZmFjdG9yaW5nLiBJJ20gZ29pbmcgdG8gZm9sbG93IHRoZSBjYWxsIGdyYXBoIHVwIHRvIHNlZSB3aGF0IGZ1bmN0aW9ucyBhcmUgYWZmZWN0ZWQgYnkgY2hhbmdlcyB0byB0aGVzZSBmdW5jdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NTg0LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6MzguNjUyNjE0NzgxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDc5NzcwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJidWlsZF96b25lbGlzdHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vcGFnZV9hbGxvYy5jPTU4ODA9c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU5MTEtXFxubW0vcGFnZV9hbGxvYy5jOjU5MTI6c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxubW0vcGFnZV9hbGxvYy5jLTU5MTMte1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU5Mzc9c3RhdGljIHZvaWQgc2V0dXBfbWluX3NsYWJfcmF0aW8odm9pZCk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTkzOS1cXG5tbS9wYWdlX2FsbG9jLmM6NTk0MDpzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG5tbS9wYWdlX2FsbG9jLmMtNTk0MS17XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NTk3Nz1zdGF0aWMgdm9pZCBfX2J1aWxkX2FsbF96b25lbGlzdHModm9pZCAqZGF0YSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MDA1LVxcdGlmIChzZWxmIFxcdTAwMjZcXHUwMDI2ICFub2RlX29ubGluZShzZWxmLVxcdTAwM2Vub2RlX2lkKSkge1xcbm1tL3BhZ2VfYWxsb2MuYzo2MDA2OlxcdFxcdGJ1aWxkX3pvbmVsaXN0cyhzZWxmKTtcXG5tbS9wYWdlX2FsbG9jLmMtNjAwNy1cXHR9IGVsc2Uge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYwMTQtXFxubW0vcGFnZV9hbGxvYy5jOjYwMTU6XFx0XFx0XFx0YnVpbGRfem9uZWxpc3RzKHBnZGF0KTtcXG5tbS9wYWdlX2FsbG9jLmMtNjAxNi1cXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM3OjM4LjcwMzQyMTc3WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE3OTI0Njg5NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIEhpZXJhcmNoeSBvZiBgX19idWlsZF9hbGxfem9uZWxpc3RzYCoqXG5cblJpZ2h0LCBzbyBJIHNlZSBgX19idWlsZF9hbGxfem9uZWxpc3RzYCBpcyBkaXJlY3RseSBjYWxsZWQgYnkgYGJ1aWxkX2FsbF96b25lbGlzdHNgLiBUaGF0J3MgdGhlIGltbWVkaWF0ZSByZWxhdGlvbnNoaXAuIE5vdywgdGhlIHJlYWwgcXVlc3Rpb24gaXMsIHdoZXJlIGRvZXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGl0c2VsZiBmaXQgaW50byB0aGUgbGFyZ2VyIHBpY3R1cmU/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB1cHN0cmVhbSBkZXBlbmRlbmNpZXMuIFdoZXJlIGFyZSAqaXRzKiBjYWxsaW5nIHBvaW50cz8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgZnJvbSBgYnVpbGRfYWxsX3pvbmVsaXN0c2AgdG8gdW5kZXJzdGFuZCB0aGUgYmlnZ2VyIGFyY2hpdGVjdHVyZSBpdCBwbGF5cyBhIHJvbGUgaW4uIExldCdzIGZpbmQgdGhvc2UgY2FsbHMuIEkgZXhwZWN0IHRvIGZpbmQgc29tZSBpbnRlcmVzdGluZyB0aGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MTkyLCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDAuNDk1ODkzMzlaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NTkwMzk5OTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnVpbGRfYWxsX3pvbmVsaXN0c1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3g4Ni9tbS9udW1hLmM9MjMyPXZvaWQgX19pbml0IHg4Nl9udW1hX2luaXQodm9pZClcXG4tLVxcbmFyY2gveDg2L21tL251bWEuYy0yNTYtICogbWVtb3J5bGVzcyBDUFUgbm9kZXMgaGF2ZSBhbHJlYWR5IGJlZW4gYnJvdWdodCBvbmxpbmUsIGFuZCBiZWZvcmUgdGhlXFxuYXJjaC94ODYvbW0vbnVtYS5jOjI1NzogKiBub2RlX2RhdGFbbmlkXSBpcyBuZWVkZWQgZm9yIHpvbmUgbGlzdCBzZXR1cCBpbiBidWlsZF9hbGxfem9uZWxpc3RzKCkuXFxuYXJjaC94ODYvbW0vbnVtYS5jLTI1OC0gKlxcbi0tXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaD0xNjIwPXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZ2RhdF9lbmRfcGZuKHBnX2RhdGFfdCAqcGdkYXQpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE2MjYtXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNjI3OnZvaWQgYnVpbGRfYWxsX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KTtcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE2MjgtYm9vbCBfX3pvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyayxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTE0MD1pbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjE1LVxcdGlmIChuZWVkX3pvbmVsaXN0c19yZWJ1aWxkKVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTIxNjpcXHRcXHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIxNy1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTI1Nj1zdGF0aWMgcGdfZGF0YV90ICpob3RhZGRfaW5pdF9wZ2RhdChpbnQgbmlkKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjc1LVxcdCAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTI3NjpcXHRidWlsZF9hbGxfem9uZWxpc3RzKHBnZGF0KTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyNzctXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE5ODY9aW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIxNzAtXFx0XFx0em9uZV9wY3BfcmVzZXQoem9uZSk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMTcxOlxcdFxcdGJ1aWxkX2FsbF96b25lbGlzdHMoTlVMTCk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMTcyLVxcdH1cXG4tLVxcbm1tL21tX2luaXQuYz0yNjk3PXZvaWQgX19pbml0IG1tX2NvcmVfaW5pdCh2b2lkKVxcbi0tXFxubW0vbW1faW5pdC5jLTI3MDMtXFx0QlVJTERfQlVHX09OKE1BWF9aT05FTElTVFMgXFx1MDAzZSAyKTtcXG5tbS9tbV9pbml0LmM6MjcwNDpcXHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xcbm1tL21tX2luaXQuYy0yNzA1LVxcdHBhZ2VfYWxsb2NfaW5pdF9jcHVocCgpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU5NzU9c3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJfY3B1X3pvbmVzdGF0LCBib290X3pvbmVzdGF0cyk7XFxubW0vcGFnZV9hbGxvYy5jLTU5NzYtXFxubW0vcGFnZV9hbGxvYy5jOjU5Nzc6c3RhdGljIHZvaWQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmRhdGEpXFxubW0vcGFnZV9hbGxvYy5jLTU5Nzgte1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTYwMzY9c3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0XFxubW0vcGFnZV9hbGxvYy5jOjYwMzc6YnVpbGRfYWxsX3pvbmVsaXN0c19pbml0KHZvaWQpXFxubW0vcGFnZV9hbGxvYy5jLTYwMzgte1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYwNDAtXFxubW0vcGFnZV9hbGxvYy5jOjYwNDE6XFx0X19idWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xcbm1tL3BhZ2VfYWxsb2MuYy02MDQyLVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYwNjUtICpcXG5tbS9wYWdlX2FsbG9jLmM6NjA2NjogKiBfX3JlZiBkdWUgdG8gY2FsbCBvZiBfX2luaXQgYW5ub3RhdGVkIGhlbHBlciBidWlsZF9hbGxfem9uZWxpc3RzX2luaXRcXG5tbS9wYWdlX2FsbG9jLmMtNjA2Ny0gKiBbcHJvdGVjdGVkIGJ5IFNZU1RFTV9CT09USU5HXS5cXG5tbS9wYWdlX2FsbG9jLmMtNjA2OC0gKi9cXG5tbS9wYWdlX2FsbG9jLmM6NjA2OTp2b2lkIF9fcmVmIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG5tbS9wYWdlX2FsbG9jLmMtNjA3MC17XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNjA3My1cXHRpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7XFxubW0vcGFnZV9hbGxvYy5jOjYwNzQ6XFx0XFx0YnVpbGRfYWxsX3pvbmVsaXN0c19pbml0KCk7XFxubW0vcGFnZV9hbGxvYy5jLTYwNzUtXFx0fSBlbHNlIHtcXG5tbS9wYWdlX2FsbG9jLmM6NjA3NjpcXHRcXHRfX2J1aWxkX2FsbF96b25lbGlzdHMocGdkYXQpO1xcbm1tL3BhZ2VfYWxsb2MuYy02MDc3LVxcdFxcdC8qIGNwdXNldCByZWZyZXNoIHJvdXRpbmUgc2hvdWxkIGJlIGhlcmUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDIuMDU0OTM5NjE1WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxNDI0NDAwMDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoZSBjb2RlOlxuXG4qKlRoaW5raW5nIFRocm91Z2ggWm9uZWxpc3QgSW5pdGlhbGl6YXRpb24gYW5kIERlbW90aW9uKipcblxuT2theSwgc28gYGJ1aWxkX2FsbF96b25lbGlzdHNgIGlzIGEgY3JpdGljYWwgZnVuY3Rpb24sIGNsZWFybHkuIEl0J3MgY2FsbGVkIG5vdCBqdXN0IGR1cmluZyB0aGUgaW5pdGlhbCBib290IHNlcXVlbmNlIHZpYSBgbW1fY29yZV9pbml0YCwgYnV0IGFsc28gZHluYW1pY2FsbHkgd2hlbiB3ZSdyZSBkZWFsaW5nIHdpdGggbWVtb3J5IGhvdHBsdWcgZXZlbnRzOiBgb25saW5lX3BhZ2VzYCwgYGhvdGFkZF9pbml0X3BnZGF0YCwgYW5kIGBvZmZsaW5lX3BhZ2VzYC4gVGhhdCBtYWtlcyBzZW5zZTsgdGhlIHpvbmVsaXN0IHN0cnVjdHVyZSBoYXMgdG8gYmUgdXBkYXRlZCB3aGVuZXZlciB0aGUgbWVtb3J5IHRvcG9sb2d5IGNoYW5nZXMuXG5cbkJ1dCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzIGFib3V0IGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AuIFdoZXJlIGRvZXMgKnRoYXQqIGZpdCBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBsaWZlY3ljbGU/IFdoZW4gaXMgKnRoYXQqIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZD8gR2l2ZW4gaXRzIG5hbWUsIGl0IG11c3QgcGxheSBhIHBhcnQsIGFuZCBpdHMgZXhlY3V0aW9uIGNvbnRleHQgaXMgaW1wb3J0YW50IHRvIGFuYWx5emUuXG5cblRpbWUgdG8gcmVhY2ggZm9yIHRoZSB0cnVzdHkgYGdyZXBgLiBJJ2xsIHJ1biBhIHF1aWNrIHNlYXJjaCBmb3IgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBhbmQgc2VlIHdoZXJlIGl0J3MgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UuIEtub3dpbmcgdGhhdCBzaG91bGQgZ2l2ZSBtZSBhIG1vcmUgY29tcGxldGUgdW5kZXJzdGFuZGluZyBvZiBob3cgbWVtb3J5IGRlbW90aW9uIGlzIHNldCB1cC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc1NTYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozNzo0NS4xOTczODE5NDNaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NjE5MTg4NzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LXRpZXJzLmM9NDAwPXN0YXRpYyB2b2lkIGR1bXBfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNDI0LSAqL1xcbm1tL21lbW9yeS10aWVycy5jOjQyNTpzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbm1tL21lbW9yeS10aWVycy5jLTQyNi17XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy01MjEtI2Vsc2VcXG5tbS9tZW1vcnktdGllcnMuYzo1MjI6c3RhdGljIGlubGluZSB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpIHt9XFxubW0vbWVtb3J5LXRpZXJzLmMtNTIzLSNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTcwOD1zdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfdGllcl9sYXRlX2luaXQodm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTczMS1cXG5tbS9tZW1vcnktdGllcnMuYzo3MzI6XFx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcXG5tbS9tZW1vcnktdGllcnMuYy03MzMtXFx0cHV0X29ubGluZV9tZW1zKCk7XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz04ODI9c3RhdGljIGludCBfX21lbWluaXQgbWVtdGllcl9ob3RwbHVnX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZixcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTg5MS1cXHRcXHRpZiAoY2xlYXJfbm9kZV9tZW1vcnlfdGllcihubi1cXHUwMDNlbmlkKSlcXG5tbS9tZW1vcnktdGllcnMuYzo4OTI6XFx0XFx0XFx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcXG5tbS9tZW1vcnktdGllcnMuYy04OTMtXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTg5OC1cXHRcXHRpZiAoIUlTX0VSUihtZW10aWVyKSlcXG5tbS9tZW1vcnktdGllcnMuYzo4OTk6XFx0XFx0XFx0ZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKTtcXG5tbS9tZW1vcnktdGllcnMuYy05MDAtXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDYuNzU5MzA3OTA3WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI1Nzc4MTgzNDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBteXNlbGY6XG5cbioqVHJhY2luZyBEb3duIGBuZXh0X2RlbW90aW9uX25vZGVgKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIG1lbW9yeSBtYW5hZ2VtZW50IHN0dWZmLCBhbmQgSSd2ZSBoaXQgYSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gdW5kZXJzdGFuZCBgbmV4dF9kZW1vdGlvbl9ub2RlYC4gV2hlcmUgZG9lcyB0aGlzIGdldCBjYWxsZWQsIGV4YWN0bHk/IExldCdzIHNlZS4uLiBBaGEhIEl0IGxvb2tzIGxpa2UgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgaW52b2tlZCBmcm9tIGBkZW1vdGVfZm9saW9fbGlzdGAuIFJpZ2h0LCBhbmQgdGhhdCBmdW5jdGlvbiBsaXZlcyBpbiBgbW0vdm1zY2FuLmNgLiBOb3cgd2UncmUgZ2V0dGluZyBzb21ld2hlcmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsIHRvIGBuZXh0X2RlbW90aW9uX25vZGVgLCBzbyBJJ20gZ29pbmcgdG8ganVtcCBpbnRvIGBkZW1vdGVfZm9saW9fbGlzdGAgaW4gYG1tL3Ztc2Nhbi5jYCBhbmQgc2VlIGhvdyAqaXQqIGlzIHVzZWQuIFRoYXQgd2lsbCBnaXZlIG1lIHRoZSBicm9hZGVyIHBpY3R1cmUgb2Ygd2h5IGBuZXh0X2RlbW90aW9uX25vZGVgIGlzIHJlbGV2YW50IGhlcmUuIExldCdzIHNlZSB3aGF0IHdlIGZpbmQhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MzIxLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDkuMzM3MTI4ODY1WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3MjE1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS92bXNjYW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDcwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDcwOlxcdCAqL1xcbjEwNzE6XFx0c3RhdGljIHVuc2lnbmVkIGludCBkZW1vdGVfZm9saW9fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpkZW1vdGVfZm9saW9zLFxcbjEwNzI6XFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG4xMDczOlxcdFxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4xMDc0OlxcdHtcXG4xMDc1OlxcdFxcdGludCB0YXJnZXRfbmlkO1xcbjEwNzY6XFx0XFx0dW5zaWduZWQgaW50IG5yX3N1Y2NlZWRlZDtcXG4xMDc3OlxcdFxcdG5vZGVtYXNrX3QgYWxsb3dlZF9tYXNrO1xcbjEwNzg6XFx0XFxuMTA3OTpcXHRcXHRzdHJ1Y3QgbWlncmF0aW9uX3RhcmdldF9jb250cm9sIG10YyA9IHtcXG4xMDgwOlxcdFxcdFxcdC8qXFxuMTA4MTpcXHRcXHRcXHQgKiBBbGxvY2F0ZSBmcm9tICdub2RlJywgb3IgZmFpbCBxdWlja2x5IGFuZCBxdWlldGx5LlxcbjEwODI6XFx0XFx0XFx0ICogV2hlbiB0aGlzIGhhcHBlbnMsICdwYWdlJyB3aWxsIGxpa2VseSBqdXN0IGJlIGRpc2NhcmRlZFxcbjEwODM6XFx0XFx0XFx0ICogaW5zdGVhZCBvZiBtaWdyYXRlZC5cXG4xMDg0OlxcdFxcdFxcdCAqL1xcbjEwODU6XFx0XFx0XFx0LmdmcF9tYXNrID0gKEdGUF9ISUdIVVNFUl9NT1ZBQkxFIFxcdTAwMjYgfl9fR0ZQX1JFQ0xBSU0pIHxcXG4xMDg2OlxcdFxcdFxcdFxcdF9fR0ZQX05PTUVNQUxMT0MgfCBHRlBfTk9XQUlULFxcbjEwODc6XFx0XFx0XFx0Lm5tYXNrID0gXFx1MDAyNmFsbG93ZWRfbWFzayxcXG4xMDg4OlxcdFxcdFxcdC5yZWFzb24gPSBNUl9ERU1PVElPTixcXG4xMDg5OlxcdFxcdH07XFxuMTA5MDpcXHRcXG4xMDkxOlxcdFxcdGlmIChsaXN0X2VtcHR5KGRlbW90ZV9mb2xpb3MpKVxcbjEwOTI6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMTA5MzpcXHRcXG4xMDk0OlxcdFxcdG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ2RhdCwgXFx1MDAyNmFsbG93ZWRfbWFzayk7XFxuMTA5NTpcXHRcXHRtZW1fY2dyb3VwX25vZGVfZmlsdGVyX2FsbG93ZWQobWVtY2csIFxcdTAwMjZhbGxvd2VkX21hc2spO1xcbjEwOTY6XFx0XFx0aWYgKG5vZGVzX2VtcHR5KGFsbG93ZWRfbWFzaykpXFxuMTA5NzpcXHRcXHRcXHRyZXR1cm4gMDtcXG4xMDk4OlxcdFxcbjEwOTk6XFx0XFx0dGFyZ2V0X25pZCA9IG5leHRfZGVtb3Rpb25fbm9kZShwZ2RhdC1cXHUwMDNlbm9kZV9pZCwgXFx1MDAyNmFsbG93ZWRfbWFzayk7XFxuMTEwMDpcXHRcXHRpZiAodGFyZ2V0X25pZCA9PSBOVU1BX05PX05PREUpXFxuMTEwMTpcXHRcXHRcXHQvKiBObyBsb3dlci10aWVyIG5vZGVzIG9yIG5vZGVzIHdlcmUgaG90LXVucGx1Z2dlZC4gKi9cXG4xMTAyOlxcdFxcdFxcdHJldHVybiAwO1xcbjExMDM6XFx0XFxuMTEwNDpcXHRcXHRtdGMubmlkID0gdGFyZ2V0X25pZDtcXG4xMTA1OlxcdFxcbjExMDY6XFx0XFx0LyogRGVtb3Rpb24gaWdub3JlcyBhbGwgY3B1c2V0IGFuZCBtZW1wb2xpY3kgc2V0dGluZ3MgKi9cXG4xMTA3OlxcdFxcdG1pZ3JhdGVfcGFnZXMoZGVtb3RlX2ZvbGlvcywgYWxsb2NfZGVtb3RlX2ZvbGlvLCBOVUxMLFxcbjExMDg6XFx0XFx0XFx0ICAgICAgKHVuc2lnbmVkIGxvbmcpXFx1MDAyNm10YywgTUlHUkFURV9BU1lOQywgTVJfREVNT1RJT04sXFxuMTEwOTpcXHRcXHRcXHQgICAgICBcXHUwMDI2bnJfc3VjY2VlZGVkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NDkuMzM3NDAyOTI1WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk5NDQwNjYwNjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFpvbmVsaXN0IENoYW5nZXMgZm9yIE1lbW9yeSBNYW5hZ2VtZW50IGFuZCBGdXp6aW5nIFJlbGV2YW5jZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5LCBteSBleHBlcnQgbWluZCBmbGFncyBgZGVtb3RlX2ZvbGlvX2xpc3RgIGFzIHBhcnQgb2YgcGFnZSByZWNsYW1hdGlvbuKAlHNwZWNpZmljYWxseSwgdGhlIGRlbW90aW9uIHByb2Nlc3Mgd2hlbiBtZW1vcnkgcHJlc3N1cmUgaGl0cy4gUGFnZXMgZ2V0IHNodWZmbGVkIGRvd24gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgaG93IHRoZSBmYWxsYmFjayBvcmRlciBmb3IgYG5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnNgIGlzIGNvbnN0cnVjdGVkLCBtYWlubHkgdGhyb3VnaCBgYnVpbGRfbm9kZV96b25lbGlzdGAgYW5kIHRoZSBicm9hZGVyIGBidWlsZF96b25lbGlzdHNgIGZ1bmN0aW9ucy4gVGhpcyBgWk9ORUxJU1RfRkFMTEJBQ0tgIGlzICpjcnVjaWFsKiBiZWNhdXNlIGl0J3MgdXNlZCBieSBldmVyeSBhbGxvY2F0aW9uIHRoYXQgbmVlZHMgdG8gZmFsbCBiYWNrIGFjcm9zcyBOVU1BIG5vZGVzLlxuXG5JIHNlZSBhIGNsZWFyIHNoaWZ0IGhlcmUuIFRoZSBvbGQgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyYCB3YXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgaXRlcmF0aW5nIG92ZXIgbm9kZXMgaW4gYSBzZXQgb3JkZXIuIE5vdywgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGlzIHVzaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIGFuZCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzay4gVGhpcyBgY2FuZGlkYXRlc2AgbWFzayBpcyAqa2V5Ki4gQmVmb3JlLCBpdCB1c2VkIGBOX01FTU9SWWAuIEl0IGxvb2tzIGxpa2Ugd2UncmUgYmVpbmcgZmFyIG1vcmUgcHJlY2lzZSBhYm91dCAqd2hpY2gqIG5vZGVzIGFyZSBjb25zaWRlcmVkLCB3aGljaCBpcyBhIGJpZyBjaGFuZ2UhXG5cbkkgbmVlZCB0byBkaXZlIGludG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaXQgbm93IHVzZXMgdGhhdCBgY2FuZGlkYXRlc2AgbWFzaywgd2hpY2ggaXMgZ3JlYXQgYmVjYXVzZSBjYWxsZXJzIGNhbiBub3cgcGFzcyBpbiBhIHJlc3RyaWN0ZWQgbm9kZW1hc2suIEkgc2VlIHRoaXMgaGFwcGVuaW5nIGluIHRoZSBgbWVtb3J5LXRpZXJzYCBjb2RlLCBpbiBgbmV4dF9kZW1vdGlvbl9ub2RlKClgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMoKWAuIFRoZSBwcmV2aW91cyBjb2RlIHdhcyBtb3JlIG9mIGEgYmx1bnQgaW5zdHJ1bWVudCwgYW5kIHRoaXMgaXMgZmFyIG1vcmUgdGFyZ2V0ZWQuXG5cbk9rYXksIG5vdyBsZXQncyBhcHBseSB0aGUgZnV6emluZyBjcml0ZXJpYS4gVGhpcyBwYXRjaCBpcyAqZGVmaW5pdGVseSogaW4gYG1tL2Ag4oCTIG1lbW9yeSBtYW5hZ2VtZW50LiBJdCdzIGNoYW5naW5nIGNvcmUgem9uZWxpc3QgYnVpbGRpbmcgbG9naWMsIHNwZWNpZmljYWxseSBob3cgd2UncmUgY2FsY3VsYXRpbmcgd2hpY2ggbm9kZSB0byB1c2UgaW4gcGFnZSByZWNsYWltIChhbmQgaW4gcGFydGljdWxhciwgZGVtb3Rpb24pLiBUaGlzIGRpcmVjdGx5IGFmZmVjdHMgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGFuZCB0aGUgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGZ1bmN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgLCBhbG9uZyB3aXRoIHVwZGF0ZXMgdG8gdGhlIGRlbW90aW9uIHRhcmdldCBjYWxjdWxhdGlvbiBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiBUaG9zZSBhcmUgKmV4YWN0bHkqIHRoZSBraW5kIG9mIGNvcmUgc3Vic3lzdGVtIGFuZCBhbGdvcml0aG0gZmxvdyBjaGFuZ2VzIHRoYXQgdGhlIGZ1enppbmcgY3JpdGVyaWEgZmxhZy5cblxuVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lcywgaXMgdGhpcyBwYXRjaCBjb2RlIHJlYWNoYWJsZSBpbiBhIGZ1enplciBmcmllbmRseSBlbnZpcm9ubWVudD8gQW5kIHRoZSBhbnN3ZXIgaXMgYWJzb2x1dGVseSB5ZXMhIEkgY2FuIGVhc2lseSBjb25maWd1cmUgTlVNQSBub2RlcyBpbiBRRU1VIChJIHVzZSBpdCBhbGwgdGhlIHRpbWUpLiBTeXprYWxsZXIgb2Z0ZW4gcnVucyB3aXRoIE5VTUEgZW5hYmxlZCwgdG9vLiBBbmQgY3J1Y2lhbGx5LCBtZW1vcnkgaG90cGx1Zy9tZW1wb2xpY3kgc3lzY2FsbHMgKGUuZy4sIGBzZXRfbWVtcG9saWN5YCwgYG1iaW5kYCwgYG1pZ3JhdGVfcGFnZXNgLCBgbW92ZV9wYWdlc2ApIGFuZCBwYWdlIHJlY2xhaW0gZGVtb3Rpb24gZGVmaW5pdGVseSBydW4gdGhpcyBjb2RlLiBTbyB0aGlzIGlzIGdyZWF0IVxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHNvbWV0aGluZyDigJMgaXMgdGhlIGBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXJgIHN5c2N0bCBzdGlsbCBhcm91bmQ/IEknZCBleHBlY3QgaXQgaXMgYXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIHdpbGwgdXNlIGl0cyBvcmRlci4gSSdsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayB0aGF0LiBCdXQgZXZlcnl0aGluZyBzbyBmYXIgc3Ryb25nbHkgc3VnZ2VzdHMgdGhpcyBwYXRjaCBpcyAqaGlnaGx5KiBmdXp6YWJsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkyNzEsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NTkuMjgxNDcxNDM5WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2Mjg3NDE0OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJudW1hX3pvbmVsaXN0X29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3BhZ2VfYWxsb2MuYz01NzQ1PXN0YXRpYyBpbnQgYnVpbGRfem9uZXJlZnNfbm9kZShwZ19kYXRhX3QgKnBnZGF0LCBzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTc2NC1cXG5tbS9wYWdlX2FsbG9jLmM6NTc2NTpzdGF0aWMgaW50IF9fcGFyc2VfbnVtYV96b25lbGlzdF9vcmRlcihjaGFyICpzKVxcbm1tL3BhZ2VfYWxsb2MuYy01NzY2LXtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01NzczLVxcdGlmICghKCpzID09ICdkJyB8fCAqcyA9PSAnRCcgfHwgKnMgPT0gJ24nIHx8ICpzID09ICdOJykpIHtcXG5tbS9wYWdlX2FsbG9jLmM6NTc3NDpcXHRcXHRwcl93YXJuKFxcXCJJZ25vcmluZyB1bnN1cHBvcnRlZCBudW1hX3pvbmVsaXN0X29yZGVyIHZhbHVlOiAgJXNcXFxcblxcXCIsIHMpO1xcbm1tL3BhZ2VfYWxsb2MuYy01Nzc1LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU3NzktXFxubW0vcGFnZV9hbGxvYy5jOjU3ODA6c3RhdGljIGNoYXIgbnVtYV96b25lbGlzdF9vcmRlcltdID0gXFxcIk5vZGVcXFwiO1xcbm1tL3BhZ2VfYWxsb2MuYy01NzgxLSNkZWZpbmUgTlVNQV9aT05FTElTVF9PUkRFUl9MRU5cXHQxNlxcbm1tL3BhZ2VfYWxsb2MuYy01NzgyLS8qXFxubW0vcGFnZV9hbGxvYy5jOjU3ODM6ICogc3lzY3RsIGhhbmRsZXIgZm9yIG51bWFfem9uZWxpc3Rfb3JkZXJcXG5tbS9wYWdlX2FsbG9jLmMtNTc4NC0gKi9cXG5tbS9wYWdlX2FsbG9jLmM6NTc4NTpzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbm1tL3BhZ2VfYWxsb2MuYy01Nzg2LVxcdFxcdHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcylcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01Nzg4LVxcdGlmICh3cml0ZSlcXG5tbS9wYWdlX2FsbG9jLmM6NTc4OTpcXHRcXHRyZXR1cm4gX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKGJ1ZmZlcik7XFxubW0vcGFnZV9hbGxvYy5jLTU3OTAtXFx0cmV0dXJuIHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjkxOD1zdGF0aWMgY29uc3Qgc3RydWN0IGN0bF90YWJsZSBwYWdlX2FsbG9jX3N5c2N0bF90YWJsZVtdID0ge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTY5NzAtXFx0e1xcbm1tL3BhZ2VfYWxsb2MuYzo2OTcxOlxcdFxcdC5wcm9jbmFtZVxcdD0gXFxcIm51bWFfem9uZWxpc3Rfb3JkZXJcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYzo2OTcyOlxcdFxcdC5kYXRhXFx0XFx0PSBcXHUwMDI2bnVtYV96b25lbGlzdF9vcmRlcixcXG5tbS9wYWdlX2FsbG9jLmMtNjk3My1cXHRcXHQubWF4bGVuXFx0XFx0PSBOVU1BX1pPTkVMSVNUX09SREVSX0xFTixcXG5tbS9wYWdlX2FsbG9jLmMtNjk3NC1cXHRcXHQubW9kZVxcdFxcdD0gMDY0NCxcXG5tbS9wYWdlX2FsbG9jLmM6Njk3NTpcXHRcXHQucHJvY19oYW5kbGVyXFx0PSBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIsXFxubW0vcGFnZV9hbGxvYy5jLTY5NzYtXFx0fSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzc6NTkuMzQ0MzU0MjI4WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxMTA2NzkyNzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgWm9uZWxpc3QgQ29uc3RydWN0aW9uIGFuZCBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGtpY2tpbmcgb2ZmIHRoaXMgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgaXQncyB0aWVkIHRvIGNoYW5nZXMgaW4gdGhlIG1lbW9yeSB0b3BvbG9neSwgcmlnaHQ/IExpa2UsIHN5c2ZzIGVudHJpZXMgZm9yIG9ubGluZS9vZmZsaW5lIG1lbW9yeSBwYWdlcyDigJMgdGhlIHVzdWFsIHN1c3BlY3RzIGF0IGAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS8uLi5gLiBBbHNvLCBpdCdzIGdvdHRhIGJlIGludm9sdmVkIHdpdGggaG90LWFkZCBtZW1vcnkgb3BlcmF0aW9ucywgb2J2aW91c2x5LiBBbmQsIG9mIGNvdXJzZSwgdGhlIGBuZXh0X2RlbW90aW9uX25vZGVgIGZ1bmN0aW9uLCB3aGljaCBJIGtub3cgaXMgYSBrZXkgcGFydCBvZiBtZW1vcnkgcmVjbGFpbSwgc3BlY2lmaWNhbGx5IHdoZW4gd2UncmUgZGVtb3RpbmcgcGFnZXMgd2l0aGluIGBkZW1vdGVfZm9saW9fbGlzdGAuIFRoZW4gdGhlcmUncyBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLCBjYWxsZWQgd2hlbiB0aGVyZSdzIGEgc2hpZnQgaW4gbWVtb3J5IHRpZXJzLCBvciBhbHNvIG9uIGhvdHBsdWcgZXZlbnRzLiBGaW5hbGx5LCB6b25lbGlzdHMgZ2V0IGEgYnVpbGQgYXQgYm9vdCwgdG9vLCB3aGljaCBtYWtlcyBzZW5zZS5cblxuUmlnaHQsIHNvIHdoYXQgY29uZmlndXJhdGlvbnMgYXJlIGFic29sdXRlbHkgZXNzZW50aWFsIGZvciB0aGlzIHdob2xlIHByb2Nlc3M/IExldCBtZSBjaGVjayB0aGUgY29kZS5cblxuQWxyaWdodCwgbG9va2luZyBhdCBgbW0vbWVtb3J5LXRpZXJzLmNgLCBJIHNlZSBhIGNsZWFyIGRlcGVuZGVuY3k6IGBvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9gLiBNYWtlcyBzZW5zZSwgd2UgbmVlZCBOVU1BIHN1cHBvcnQuIEFuZCAqY3J1Y2lhbGx5KiwgaXQgbG9va3MgbGlrZSB0aGUgcHJlc2VuY2Ugb2YgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXMgd2hhdCBndWFyZHMgYm90aCBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYC4gVGhhdCdzIHRoZSBsaW5jaHBpbi4gU28sIHRoZSBrZXkgaXMgZ29pbmcgdG8gYmUgYENPTkZJR19OVU1BX01JR1JBVElPTmAsIGFuZCwgb2YgY291cnNlLCBgQ09ORklHX05VTUFgLiBMZXQgbWUgZ28gY2hlY2sgS2NvbmZpZyB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZnVsbCBzY29wZSBvZiB0aGVzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIxMjEsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6MDIuNDU1MDM3MTU2WiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTUyMzk0ODU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBOVU1BX01JR1JBVElPTlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTY2MD1jb25maWcgUEFHRV9SRVBPUlRJTkdcXG4tLVxcbm1tL0tjb25maWctNjY3LVxcbm1tL0tjb25maWc6NjY4OmNvbmZpZyBOVU1BX01JR1JBVElPTlxcbm1tL0tjb25maWctNjY5LVxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjA0LjQwNzQzOTY2NVoiLCJTZXEiOjM3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDEwNzIzOTk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhpbmtpbmcgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB0aGUgTlVNQV9NSUdSQVRJT04gQ29uZmlndXJhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgb2YgYE5VTUFfTUlHUkFUSU9OYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNjY4LiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zIHJlc2lkZS4gQnkgZXhhbWluaW5nIHRoYXQgc2VjdGlvbiwgSSBzaG91bGQgYmUgYWJsZSB0byB1bnJhdmVsIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGBOVU1BX01JR1JBVElPTmAgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBpY3R1cmUgb2Ygd2hhdCBvdGhlciBmZWF0dXJlcyBvciBvcHRpb25zIG5lZWQgdG8gYmUgaW4gcGxhY2UgZm9yIHRoaXMgcGFydGljdWxhciBOVU1BIG1pZ3JhdGlvbiBmdW5jdGlvbmFsaXR5IHRvIGJlIGF2YWlsYWJsZS4gSSdtIGV4cGVjdGluZyB0byBzZWUgZGVwZW5kZW5jaWVzIG9uIHRoZSBOVU1BIGFyY2hpdGVjdHVyZSBpdHNlbGYsIGFuZCBwb3RlbnRpYWxseSBvbiBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBmZWF0dXJlcy4gSSdsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjc4OSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjA2LjQxODE2NzAyMVoiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTY5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiA2NjUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2NjU6XFx0XFx0ICB0aG9zZSBwYWdlcyB0byBhbm90aGVyIGVudGl0eSwgc3VjaCBhcyBhIGh5cGVydmlzb3IsIHNvIHRoYXQgdGhlXFxuIDY2NjpcXHRcXHQgIG1lbW9yeSBjYW4gYmUgZnJlZWQgd2l0aGluIHRoZSBob3N0IGZvciBvdGhlciB1c2VzLlxcbiA2Njc6XFx0XFxuIDY2ODpcXHRjb25maWcgTlVNQV9NSUdSQVRJT05cXG4gNjY5OlxcdFxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuIDY3MDpcXHRcXHRkZWZhdWx0IHlcXG4gNjcxOlxcdFxcdGRlcGVuZHMgb24gTlVNQSBcXHUwMDI2XFx1MDAyNiBNTVVcXG4gNjcyOlxcdFxcdHNlbGVjdCBNSUdSQVRJT05cXG4gNjczOlxcdFxcdGhlbHBcXG4gNjc0OlxcdFxcdCAgU3VwcG9ydCB0aGUgbWlncmF0aW9uIG9mIHBhZ2VzIHRvIG90aGVyIE5VTUEgbm9kZXMsIGF2YWlsYWJsZSB0b1xcbiA2NzU6XFx0XFx0ICB1c2VyIHNwYWNlIHRocm91Z2ggaW50ZXJmYWNlcyBsaWtlIG1pZ3JhdGVfcGFnZXMoKSwgbW92ZV9wYWdlcygpLFxcbiA2NzY6XFx0XFx0ICBhbmQgbWJpbmQoKS4gU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGFsc28gZW5hYmxlcyBzdXBwb3J0IGZvciBwYWdlXFxuIDY3NzpcXHRcXHQgIGRlbW90aW9uIGZvciBtZW1vcnkgdGllcmluZy5cXG4gNjc4OlxcdFxcbiA2Nzk6XFx0Y29uZmlnIE1JR1JBVElPTlxcbiA2ODA6XFx0XFx0Ym9vbFxcbiA2ODE6XFx0XFx0ZGVwZW5kcyBvbiBNTVVcXG4gNjgyOlxcdFxcbiA2ODM6XFx0Y29uZmlnIERFVklDRV9NSUdSQVRJT05cXG4gNjg0OlxcdFxcdGRlZl9ib29sIE1JR1JBVElPTiBcXHUwMDI2XFx1MDAyNiBaT05FX0RFVklDRVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODowNi40MTgyODY0MzFaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTk5ODk5MTY1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEZWx2aW5nIGludG8gTlVNQSBNaWdyYXRpb24gRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIGFib3V0IGBOVU1BX01JR1JBVElPTmAgYW5kLCBuYXR1cmFsbHksIGl0IGxlYW5zIG9uIGJvdGggYE5VTUFgIGFuZCB0aGUgYE1NVWAuIFRoYXQgbWFrZXMgc2Vuc2UsIHJpZ2h0PyBJdCB3b3VsZG4ndCBiZSBhYmxlIHRvIG1pZ3JhdGUgd2l0aG91dCB0aG9zZSB1bmRlcmx5aW5nIHN0cnVjdHVyZXMuIEJ1dCBub3cgbXkgbWluZCBpcyBzdGFydGluZyB0byB3YW5kZXIgYSBiaXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBmdWxsIGNvbnRleHQgaGVyZS4gVGhhdCdzIHdoZW4gSSB3b25kZXIgYWJvdXQgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIHdpdGhpbiBgbW0vcGFnZV9hbGxvYy5jYC4gSSBoYXZlIGEgZmVlbGluZyBJIG5lZWQgdG8gY2lyY2xlIGJhY2sgdG8gd2hhdCBnYXRlcyB0aGF0IGZ1bmN0aW9uLiBMZXQncyBzZWUgd2hhdCBndWFyZHMgdGhhdCBmdW5jdGlvbiBpbiBgbW0vcGFnZV9hbGxvYy5jYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjMzMjEsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjA4LjQxNzI4MTEyOVoiLCJTZXEiOjQwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTgyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vcGFnZV9hbGxvYy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU3OTAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU3OTA6XFx0XFx0cmV0dXJuIHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7XFxuNTc5MTpcXHR9XFxuNTc5MjpcXHRcXG41NzkzOlxcdHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XFxuNTc5NDpcXHRcXG41Nzk1OlxcdC8qKlxcbjU3OTY6XFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdFxcbjU3OTc6XFx0ICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmdcXG41Nzk4OlxcdCAqIEB1c2VkX25vZGVfbWFzazogbm9kZW1hc2tfdCBvZiBhbHJlYWR5IHVzZWQgbm9kZXNcXG41Nzk5OlxcdCAqIEBjYW5kaWRhdGVzOiBub2RlbWFza190IG9mIG5vZGVzIGVsaWdpYmxlIGZvciBzZWxlY3Rpb25cXG41ODAwOlxcdCAqXFxuNTgwMTpcXHQgKiBXZSB1c2UgYSBudW1iZXIgb2YgZmFjdG9ycyB0byBkZXRlcm1pbmUgd2hpY2ggaXMgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZFxcbjU4MDI6XFx0ICogYXBwZWFyIG9uIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWRcXG41ODAzOlxcdCAqIGFscmVhZHkgaW4gQG5vZGUncyBmYWxsYmFjayBsaXN0LCBhbmQgaXQgc2hvdWxkIGJlIHRoZSBuZXh0IGNsb3Nlc3Qgbm9kZVxcbjU4MDQ6XFx0ICogYWNjb3JkaW5nIHRvIHRoZSBkaXN0YW5jZSBhcnJheSAod2hpY2ggY29udGFpbnMgYXJiaXRyYXJ5IGRpc3RhbmNlIHZhbHVlc1xcbjU4MDU6XFx0ICogZnJvbSBlYWNoIG5vZGUgdG8gZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0pLCBhbmQgc2hvdWxkIGFsc28gcHJlZmVyIG5vZGVzXFxuNTgwNjpcXHQgKiB3aXRoIG5vIENQVXMsIHNpbmNlIHByZXN1bWFibHkgdGhleSdsbCBoYXZlIHZlcnkgbGl0dGxlIGFsbG9jYXRpb24gcHJlc3N1cmVcXG41ODA3OlxcdCAqIG9uIHRoZW0gb3RoZXJ3aXNlLlxcbjU4MDg6XFx0ICpcXG41ODA5OlxcdCAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuXFxuNTgxMDpcXHQgKi9cXG41ODExOlxcdGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcXG41ODEyOlxcdFxcdFxcdFxcdCAgIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXFxuNTgxMzpcXHR7XFxuNTgxNDpcXHRcXHRpbnQgbiwgdmFsO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODowOC40MTc5MDE5ODlaIiwiU2VxIjo0MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTgwMTQxNTQyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIHRoZSBDb25kaXRpb25hbCBDb21waWxhdGlvbiBpbiBgbW0vcGFnZV9hbGxvYy5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYXJlIGNvbnRyb2xsaW5nIGxpbmUgNTc5MCBpbiBgbW0vcGFnZV9hbGxvYy5jYC4gVGhpcyBpcyBhIHByZXR0eSBjb21tb24gZGVidWdnaW5nIHN0ZXA7IHVuZGVyc3RhbmRpbmcgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNhbiBiZSBjcnVjaWFsLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIGp1c3QgZGl2ZSBpbnRvIHRoZSBmaWxlLiBJ4oCZbGwgc2VhcmNoIGJhY2t3YXJkcyBmcm9tIGxpbmUgNTc5MCwgbG9va2luZyBmb3IgdGhlIHJlbGV2YW50IGAjaWZgIG9yIGAjaWZkZWZgIHN0YXRlbWVudCB0aGF0IGVuY2xvc2VzIGl0LiBIb3BlZnVsbHksIGl0J3MgYSByZWxhdGl2ZWx5IHNob3J0IHNwYW4gdG8gaWRlbnRpZnkgdGhlIHJlbGV2YW50IGNvbmRpdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQwMzYsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjEwLjIxOTMyMDUxOVoiLCJTZXEiOjQyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTE0Mzk3MjgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXiNpZlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9wYWdlX2FsbG9jLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vcGFnZV9hbGxvYy5jPTk5PXN0YXRpYyBERUZJTkVfTVVURVgocGNwX2JhdGNoX2hpZ2hfbG9jayk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTA5LSAqL1xcbm1tL3BhZ2VfYWxsb2MuYzoxMTA6I2lmbmRlZiBDT05GSUdfUFJFRU1QVF9SVFxcbm1tL3BhZ2VfYWxsb2MuYy0xMTEtI2RlZmluZSBwY3B1X3Rhc2tfcGluKClcXHRcXHRwcmVlbXB0X2Rpc2FibGUoKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTEyMi0gKi9cXG5tbS9wYWdlX2FsbG9jLmM6MTIzOiNpZmRlZiBDT05GSUdfU01QXFxubW0vcGFnZV9hbGxvYy5jLTEyNC0jZGVmaW5lIHBjcF9zcGluX3RyeWxvY2socHRyKVxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xNjQtXFxubW0vcGFnZV9hbGxvYy5jOjE2NTojaWZkZWYgQ09ORklHX1VTRV9QRVJDUFVfTlVNQV9OT0RFX0lEXFxubW0vcGFnZV9hbGxvYy5jLTE2Ni1ERUZJTkVfUEVSX0NQVShpbnQsIG51bWFfbm9kZSk7XFxubW0vcGFnZV9hbGxvYy5jPTE2Nz1FWFBPUlRfUEVSX0NQVV9TWU1CT0wobnVtYV9ub2RlKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xNjktXFxubW0vcGFnZV9hbGxvYy5jOjE3MDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMTcxLURFRklORV9TVEFUSUNfS0VZX1RSVUUodm1fbnVtYV9zdGF0X2tleSk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTczLVxcbm1tL3BhZ2VfYWxsb2MuYzoxNzQ6I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcXG5tbS9wYWdlX2FsbG9jLmMtMTc1LS8qXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTg1PXN0YXRpYyBERUZJTkVfTVVURVgocGNwdV9kcmFpbl9tdXRleCk7XFxubW0vcGFnZV9hbGxvYy5jLTE4Ni1cXG5tbS9wYWdlX2FsbG9jLmM6MTg3OiNpZmRlZiBDT05GSUdfR0NDX1BMVUdJTl9MQVRFTlRfRU5UUk9QWVxcbm1tL3BhZ2VfYWxsb2MuYy0xODgtdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsYXRlbnRfZW50cm9weSBfX2xhdGVudF9lbnRyb3B5O1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTE5NT1ub2RlbWFza190IG5vZGVfc3RhdGVzW05SX05PREVfU1RBVEVTXSBfX3JlYWRfbW9zdGx5ID0ge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTE5Ny1cXHRbTl9PTkxJTkVdID0geyB7IFswXSA9IDFVTCB9IH0sXFxubW0vcGFnZV9hbGxvYy5jOjE5ODojaWZuZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTE5OS1cXHRbTl9OT1JNQUxfTUVNT1JZXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxcbm1tL3BhZ2VfYWxsb2MuYzoyMDA6I2lmZGVmIENPTkZJR19ISUdITUVNXFxubW0vcGFnZV9hbGxvYy5jLTIwMS1cXHRbTl9ISUdIX01FTU9SWV0gPSB7IHsgWzBdID0gMVVMIH0gfSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0yMDk9Z2ZwX3QgZ2ZwX2FsbG93ZWRfbWFzayBfX3JlYWRfbW9zdGx5ID0gR0ZQX0JPT1RfTUFTSztcXG5tbS9wYWdlX2FsbG9jLmMtMjEwLVxcbm1tL3BhZ2VfYWxsb2MuYzoyMTE6I2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV9WQVJJQUJMRVxcbm1tL3BhZ2VfYWxsb2MuYy0yMTItdW5zaWduZWQgaW50IHBhZ2VibG9ja19vcmRlciBfX3JlYWRfbW9zdGx5O1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTIzMT1zdGF0aWMgaW50IHN5c2N0bF9sb3dtZW1fcmVzZXJ2ZV9yYXRpb1tNQVhfTlJfWk9ORVNdID0ge1xcbm1tL3BhZ2VfYWxsb2MuYzoyMzI6I2lmZGVmIENPTkZJR19aT05FX0RNQVxcbm1tL3BhZ2VfYWxsb2MuYy0yMzMtXFx0W1pPTkVfRE1BXSA9IDI1NixcXG5tbS9wYWdlX2FsbG9jLmMtMjM0LSNlbmRpZlxcbm1tL3BhZ2VfYWxsb2MuYzoyMzU6I2lmZGVmIENPTkZJR19aT05FX0RNQTMyXFxubW0vcGFnZV9hbGxvYy5jLTIzNi1cXHRbWk9ORV9ETUEzMl0gPSAyNTYsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMjM4LVxcdFtaT05FX05PUk1BTF0gPSAzMixcXG5tbS9wYWdlX2FsbG9jLmM6MjM5OiNpZmRlZiBDT05GSUdfSElHSE1FTVxcbm1tL3BhZ2VfYWxsb2MuYy0yNDAtXFx0W1pPTkVfSElHSE1FTV0gPSAwLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTI0NT1jaGFyICogY29uc3Qgem9uZV9uYW1lc1tNQVhfTlJfWk9ORVNdID0ge1xcbm1tL3BhZ2VfYWxsb2MuYzoyNDY6I2lmZGVmIENPTkZJR19aT05FX0RNQVxcbm1tL3BhZ2VfYWxsb2MuYy0yNDctXFx0IFxcXCJETUFcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYy0yNDgtI2VuZGlmXFxubW0vcGFnZV9hbGxvYy5jOjI0OTojaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcXG5tbS9wYWdlX2FsbG9jLmMtMjUwLVxcdCBcXFwiRE1BMzJcXFwiLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTI1Mi1cXHQgXFxcIk5vcm1hbFxcXCIsXFxubW0vcGFnZV9hbGxvYy5jOjI1MzojaWZkZWYgQ09ORklHX0hJR0hNRU1cXG5tbS9wYWdlX2FsbG9jLmMtMjU0LVxcdCBcXFwiSGlnaE1lbVxcXCIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMjU2LVxcdCBcXFwiTW92YWJsZVxcXCIsXFxubW0vcGFnZV9hbGxvYy5jOjI1NzojaWZkZWYgQ09ORklHX1pPTkVfREVWSUNFXFxubW0vcGFnZV9hbGxvYy5jLTI1OC1cXHQgXFxcIkRldmljZVxcXCIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MjYyPWNvbnN0IGNoYXIgKiBjb25zdCBtaWdyYXRldHlwZV9uYW1lc1tNSUdSQVRFX1RZUEVTXSA9IHtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0yNjYtXFx0XFxcIkhpZ2hBdG9taWNcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYzoyNjc6I2lmZGVmIENPTkZJR19DTUFcXG5tbS9wYWdlX2FsbG9jLmMtMjY4LVxcdFxcXCJDTUFcXFwiLFxcbm1tL3BhZ2VfYWxsb2MuYy0yNjktI2VuZGlmXFxubW0vcGFnZV9hbGxvYy5jOjI3MDojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cXG5tbS9wYWdlX2FsbG9jLmMtMjcxLVxcdFxcXCJJc29sYXRlXFxcIixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0yODM9RVhQT1JUX1NZTUJPTChtb3ZhYmxlX3pvbmUpO1xcbm1tL3BhZ2VfYWxsb2MuYy0yODQtXFxubW0vcGFnZV9hbGxvYy5jOjI4NTojaWYgTUFYX05VTU5PREVTIFxcdTAwM2UgMVxcbm1tL3BhZ2VfYWxsb2MuYy0yODYtdW5zaWduZWQgaW50IG5yX25vZGVfaWRzIF9fcmVhZF9tb3N0bHkgPSBNQVhfTlVNTk9ERVM7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MzA1PWludCBwYWdlX2dyb3VwX2J5X21vYmlsaXR5X2Rpc2FibGVkIF9fcmVhZF9tb3N0bHk7XFxubW0vcGFnZV9hbGxvYy5jLTMwNi1cXG5tbS9wYWdlX2FsbG9jLmM6MzA3OiNpZmRlZiBDT05GSUdfREVGRVJSRURfU1RSVUNUX1BBR0VfSU5JVFxcbm1tL3BhZ2VfYWxsb2MuYy0zMDgtLypcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zMzQ9c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpnZXRfcGFnZWJsb2NrX2JpdG1hcChjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zMzYte1xcbm1tL3BhZ2VfYWxsb2MuYzozMzc6I2lmZGVmIENPTkZJR19TUEFSU0VNRU1cXG5tbS9wYWdlX2FsbG9jLmMtMzM4LVxcdHJldHVybiBzZWN0aW9uX3RvX3VzZW1hcChfX3Bmbl90b19zZWN0aW9uKHBmbikpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM0ND1zdGF0aWMgaW5saW5lIGludCBwZm5fdG9fYml0aWR4KGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbilcXG5tbS9wYWdlX2FsbG9jLmMtMzQ1LXtcXG5tbS9wYWdlX2FsbG9jLmM6MzQ2OiNpZmRlZiBDT05GSUdfU1BBUlNFTUVNXFxubW0vcGFnZV9hbGxvYy5jLTM0Ny1cXHRwZm4gXFx1MDAyNj0gKFBBR0VTX1BFUl9TRUNUSU9OLTEpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM2MD1nZXRfcGZuYmxvY2tfYml0bWFwX2JpdGlkeChjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwZm4sXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMzY1LVxcbm1tL3BhZ2VfYWxsb2MuYzozNjY6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXFxubW0vcGFnZV9hbGxvYy5jLTM2Ny1cXHRCVUlMRF9CVUdfT04oTlJfUEFHRUJMT0NLX0JJVFMgIT0gOCk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NDQyPWdldF9wZm5ibG9ja19taWdyYXRldHlwZShjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwZm4pXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNDQ4LVxcbm1tL3BhZ2VfYWxsb2MuYzo0NDk6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXFxubW0vcGFnZV9hbGxvYy5jLTQ1MC1cXHRpZiAoZmxhZ3MgXFx1MDAyNiBCSVQoUEJfbWlncmF0ZV9pc29sYXRlKSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01MjY9c3RhdGljIHZvaWQgc2V0X3BhZ2VibG9ja19taWdyYXRldHlwZShzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01MzItXFxubW0vcGFnZV9hbGxvYy5jOjUzMzojaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cXG5tbS9wYWdlX2FsbG9jLmMtNTM0LVxcdGlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIHtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01NDg9dm9pZCBfX21lbWluaXQgaW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTU5LVxcbm1tL3BhZ2VfYWxsb2MuYzo1NjA6I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXFxubW0vcGFnZV9hbGxvYy5jLTU2MS1cXHRpZiAobWlncmF0ZXR5cGUgPT0gTUlHUkFURV9JU09MQVRFKSB7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTczLVxcbm1tL3BhZ2VfYWxsb2MuYzo1NzQ6I2lmZGVmIENPTkZJR19ERUJVR19WTVxcbm1tL3BhZ2VfYWxsb2MuYy01NzUtc3RhdGljIGludCBwYWdlX291dHNpZGVfem9uZV9ib3VuZGFyaWVzKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02NjE9c3RhdGljIGlubGluZSBib29sIHBjcF9hbGxvd2VkX29yZGVyKHVuc2lnbmVkIGludCBvcmRlcilcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02NjQtXFx0XFx0cmV0dXJuIHRydWU7XFxubW0vcGFnZV9hbGxvYy5jOjY2NTojaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vcGFnZV9hbGxvYy5jLTY2Ni1cXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02OTY9c3RhdGljIGlubGluZSB2b2lkIHNldF9idWRkeV9vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTcwMS1cXG5tbS9wYWdlX2FsbG9jLmM6NzAyOiNpZmRlZiBDT05GSUdfQ09NUEFDVElPTlxcbm1tL3BhZ2VfYWxsb2MuYy03MDMtc3RhdGljIGlubGluZSBzdHJ1Y3QgY2FwdHVyZV9jb250cm9sICp0YXNrX2NhcGMoc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTAxNT1zdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9leHBlY3RlZF9zdGF0ZShzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xMDIyLVxcdFxcdFxcdHBhZ2VfcmVmX2NvdW50KHBhZ2UpIHxcXG5tbS9wYWdlX2FsbG9jLmM6MTAyMzojaWZkZWYgQ09ORklHX01FTUNHXFxubW0vcGFnZV9hbGxvYy5jLTEwMjQtXFx0XFx0XFx0cGFnZS1cXHUwMDNlbWVtY2dfZGF0YSB8XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTAzMz1zdGF0aWMgY29uc3QgY2hhciAqcGFnZV9iYWRfcmVhc29uKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGZsYWdzKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTEwNDgtXFx0fVxcbm1tL3BhZ2VfYWxsb2MuYzoxMDQ5OiNpZmRlZiBDT05GSUdfTUVNQ0dcXG5tbS9wYWdlX2FsbG9jLmMtMTA1MC1cXHRpZiAodW5saWtlbHkocGFnZS1cXHUwMDNlbWVtY2dfZGF0YSkpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTIwMj1zdGF0aWMgdm9pZCBjbGVhcl9oaWdocGFnZXNfa2FzYW5fdGFnZ2VkKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTIxNi1cXG5tbS9wYWdlX2FsbG9jLmM6MTIxNzojaWZkZWYgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdcXG5tbS9wYWdlX2FsbG9jLmMtMTIxOC1cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0xMjk4PXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBfX2ZyZWVfcGFnZXNfcHJlcGFyZShzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xMzU3LVxcdFxcdFxcdHBhZ2VbMV0uZmxhZ3MuZiBcXHUwMDI2PSB+UEFHRV9GTEFHU19TRUNPTkQ7XFxubW0vcGFnZV9hbGxvYy5jOjEzNTg6I2lmZGVmIE5SX1BBR0VTX0lOX0xBUkdFX0ZPTElPXFxubW0vcGFnZV9hbGxvYy5jLTEzNTktXFx0XFx0XFx0Zm9saW8tXFx1MDAzZV9ucl9wYWdlcyA9IDA7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTkxNT1zdGF0aWMgaW50IGZhbGxiYWNrc1tNSUdSQVRFX1BDUFRZUEVTXVtNSUdSQVRFX1BDUFRZUEVTIC0gMV0gPSB7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTkyMC1cXG5tbS9wYWdlX2FsbG9jLmM6MTkyMTojaWZkZWYgQ09ORklHX0NNQVxcbm1tL3BhZ2VfYWxsb2MuYy0xOTIyLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgc3RydWN0IHBhZ2UgKl9fcm1xdWV1ZV9jbWFfZmFsbGJhY2soc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MjAxOT1zdGF0aWMgaW50IG1vdmVfZnJlZXBhZ2VzX2Jsb2NrKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0yMDM0LVxcbm1tL3BhZ2VfYWxsb2MuYzoyMDM1OiNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxcbm1tL3BhZ2VfYWxsb2MuYy0yMDM2LS8qIExvb2sgZm9yIGEgYnVkZHkgdGhhdCBzdHJhZGRsZXMgc3RhcnRfcGZuICovXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MjU1OD1ib29sIGRlY2F5X3BjcF9oaWdoKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGVyX2NwdV9wYWdlcyAqcGNwKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTI1OTAtXFxubW0vcGFnZV9hbGxvYy5jOjI1OTE6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTI1OTItLypcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zMTc5PXN0YXRpYyBpbmxpbmUgdm9pZCB6b25lX3N0YXRpc3RpY3Moc3RydWN0IHpvbmUgKnByZWZlcnJlZF96b25lLCBzdHJ1Y3Qgem9uZSAqeixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zMTgxLXtcXG5tbS9wYWdlX2FsbG9jLmM6MzE4MjojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMzE4My1cXHRlbnVtIG51bWFfc3RhdF9pdGVtIGxvY2FsX3N0YXQgPSBOVU1BX0xPQ0FMO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM1NTM9c3RhdGljIGlubGluZSBsb25nIF9fem9uZV93YXRlcm1hcmtfdW51c2FibGVfZnJlZShzdHJ1Y3Qgem9uZSAqeixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zNTY0LVxcbm1tL3BhZ2VfYWxsb2MuYzozNTY1OiNpZmRlZiBDT05GSUdfQ01BXFxubW0vcGFnZV9hbGxvYy5jLTM1NjYtXFx0LyogSWYgYWxsb2NhdGlvbiBjYW4ndCB1c2UgQ01BIGFyZWFzIGRvbid0IHVzZSBmcmVlIENNQSBwYWdlcyAqL1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM1ODA9Ym9vbCBfX3pvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyayxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0zNjQzLVxcbm1tL3BhZ2VfYWxsb2MuYzozNjQ0OiNpZmRlZiBDT05GSUdfQ01BXFxubW0vcGFnZV9hbGxvYy5jLTM2NDUtXFx0XFx0aWYgKChhbGxvY19mbGFncyBcXHUwMDI2IEFMTE9DX0NNQSkgXFx1MDAyNlxcdTAwMjZcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zNjY1PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX3dhdGVybWFya19mYXN0KHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMzcwOS1cXG5tbS9wYWdlX2FsbG9jLmM6MzcxMDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMzcxMS1pbnQgX19yZWFkX21vc3RseSBub2RlX3JlY2xhaW1fZGlzdGFuY2UgPSBSRUNMQUlNX0RJU1RBTkNFO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTM3MzQ9YWxsb2NfZmxhZ3Nfbm9mcmFnbWVudChzdHJ1Y3Qgem9uZSAqem9uZSwgZ2ZwX3QgZ2ZwX21hc2spXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMzc0NS1cXG5tbS9wYWdlX2FsbG9jLmM6Mzc0NjojaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcXG5tbS9wYWdlX2FsbG9jLmMtMzc0Ny1cXHRpZiAoIXpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9Mzc2OD1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhbGxvY19mbGFnc19jbWEoZ2ZwX3QgZ2ZwX21hc2spXFxubW0vcGFnZV9hbGxvYy5jLTM3Njkte1xcbm1tL3BhZ2VfYWxsb2MuYzozNzcwOiNpZmRlZiBDT05GSUdfQ01BXFxubW0vcGFnZV9hbGxvYy5jLTM3NzEtXFx0aWYgKGdmcF9taWdyYXRldHlwZShnZnBfbWFzaykgPT0gTUlHUkFURV9NT1ZBQkxFKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTQwMjY9X19hbGxvY19wYWdlc19tYXlfb29tKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNDExNy1cXG5tbS9wYWdlX2FsbG9jLmM6NDExODojaWZkZWYgQ09ORklHX0NPTVBBQ1RJT05cXG5tbS9wYWdlX2FsbG9jLmMtNDExOS0vKiBUcnkgbWVtb3J5IGNvbXBhY3Rpb24gZm9yIGhpZ2gtb3JkZXIgYWxsb2NhdGlvbnMgYmVmb3JlIHJlY2xhaW0gKi9cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz00MzA3PXNob3VsZF9jb21wYWN0X3JldHJ5KGdmcF90IGdmcF9tYXNrLCBzdHJ1Y3QgYWxsb2NfY29udGV4dCAqYWMsIGludCBvcmRlcixcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy00MzM0LVxcbm1tL3BhZ2VfYWxsb2MuYzo0MzM1OiNpZmRlZiBDT05GSUdfTE9DS0RFUFxcbm1tL3BhZ2VfYWxsb2MuYy00MzM2LXN0YXRpYyBzdHJ1Y3QgbG9ja2RlcF9tYXAgX19mc19yZWNsYWltX21hcCA9XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NDM2NT12b2lkIGZzX3JlY2xhaW1fYWNxdWlyZShnZnBfdCBnZnBfbWFzaylcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy00MzcyLVxcbm1tL3BhZ2VfYWxsb2MuYzo0MzczOiNpZmRlZiBDT05GSUdfTU1VX05PVElGSUVSXFxubW0vcGFnZV9hbGxvYy5jLTQzNzQtXFx0XFx0bG9ja19tYXBfYWNxdWlyZShcXHUwMDI2X19tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydF9tYXApO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTUxNTQ9dW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTUxODktXFxubW0vcGFnZV9hbGxvYy5jOjUxOTA6I2lmZGVmIENPTkZJR19QQUdFX09XTkVSXFxubW0vcGFnZV9hbGxvYy5jLTUxOTEtXFx0LypcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01NzQ1PXN0YXRpYyBpbnQgYnVpbGRfem9uZXJlZnNfbm9kZShwZ19kYXRhX3QgKnBnZGF0LCBzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTc2Mi1cXG5tbS9wYWdlX2FsbG9jLmM6NTc2MzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNTc2NC1cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01OTEyPXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU5MTctXFxubW0vcGFnZV9hbGxvYy5jOjU5MTg6I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcXG5tbS9wYWdlX2FsbG9jLmMtNTkxOS0vKlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTU5Nzc9c3RhdGljIHZvaWQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmRhdGEpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTk5Ni1cXG5tbS9wYWdlX2FsbG9jLmM6NTk5NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNTk5OC1cXHRtZW1zZXQobm9kZV9sb2FkLCAwLCBzaXplb2Yobm9kZV9sb2FkKSk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNjAxNy1cXG5tbS9wYWdlX2FsbG9jLmM6NjAxODojaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFU1xcbm1tL3BhZ2VfYWxsb2MuYy02MDE5LVxcdFxcdC8qXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjA2OT12b2lkIF9fcmVmIGJ1aWxkX2FsbF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MDk2LVxcdFxcdHZtX3RvdGFsX3BhZ2VzKTtcXG5tbS9wYWdlX2FsbG9jLmM6NjA5NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNjA5OC1cXHRwcl9pbmZvKFxcXCJQb2xpY3kgem9uZTogJXNcXFxcblxcXCIsIHpvbmVfbmFtZXNbcG9saWN5X3pvbmVdKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02MTAyPXN0YXRpYyBpbnQgem9uZV9iYXRjaHNpemUoc3RydWN0IHpvbmUgKnpvbmUpXFxubW0vcGFnZV9hbGxvYy5jLTYxMDMte1xcbm1tL3BhZ2VfYWxsb2MuYzo2MTA0OiNpZmRlZiBDT05GSUdfTU1VXFxubW0vcGFnZV9hbGxvYy5jLTYxMDUtXFx0aW50IGJhdGNoO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTYxNTA9c3RhdGljIGludCB6b25lX2hpZ2hzaXplKHN0cnVjdCB6b25lICp6b25lLCBpbnQgYmF0Y2gsIGludCBjcHVfb25saW5lLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYxNTIte1xcbm1tL3BhZ2VfYWxsb2MuYzo2MTUzOiNpZmRlZiBDT05GSUdfTU1VXFxubW0vcGFnZV9hbGxvYy5jLTYxNTQtXFx0aW50IGhpZ2g7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjM2MD12b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X3BhZ2VzZXQodm9pZClcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MzY4LVxcbm1tL3BhZ2VfYWxsb2MuYzo2MzY5OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy02MzcwLVxcdC8qXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjcyMz1pbnQgX19tZW1pbml0IGluaXRfcGVyX3pvbmVfd21hcmtfbWluKHZvaWQpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNjcyOS1cXG5tbS9wYWdlX2FsbG9jLmM6NjczMDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNjczMS1cXHRzZXR1cF9taW5fdW5tYXBwZWRfcmF0aW8oKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz02NzYyPXN0YXRpYyBpbnQgd2F0ZXJtYXJrX3NjYWxlX2ZhY3Rvcl9zeXNjdGxfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTY3NzYtXFxubW0vcGFnZV9hbGxvYy5jOjY3Nzc6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTY3Nzgtc3RhdGljIHZvaWQgc2V0dXBfbWluX3VubWFwcGVkX3JhdGlvKHZvaWQpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjkxOD1zdGF0aWMgY29uc3Qgc3RydWN0IGN0bF90YWJsZSBwYWdlX2FsbG9jX3N5c2N0bF90YWJsZVtdID0ge1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTY5NjgtXFx0fSxcXG5tbS9wYWdlX2FsbG9jLmM6Njk2OTojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtNjk3MC1cXHR7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NzA5Nz12b2lkIF9fZnJlZV9jb250aWdfcmFuZ2UodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzEwMS1cXG5tbS9wYWdlX2FsbG9jLmM6NzEwMjojaWZkZWYgQ09ORklHX0NPTlRJR19BTExPQ1xcbm1tL3BhZ2VfYWxsb2MuYy03MTAzLS8qIFVzYWdlOiBTZWUgYWRtaW4tZ3VpZGUvZHluYW1pYy1kZWJ1Zy1ob3d0by5yc3QgKi9cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz03Njc0PXZvaWQgem9uZV9wY3BfcmVzZXQoc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzY5Mi1cXG5tbS9wYWdlX2FsbG9jLmM6NzY5MzojaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcXG5tbS9wYWdlX2FsbG9jLmMtNzY5NC0vKlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTc3NjY9RVhQT1JUX1NZTUJPTChpc19mcmVlX2J1ZGR5X3BhZ2UpO1xcbm1tL3BhZ2VfYWxsb2MuYy03NzY3LVxcbm1tL3BhZ2VfYWxsb2MuYzo3NzY4OiNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkVcXG5tbS9wYWdlX2FsbG9jLmMtNzc2OS1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9Nzg2MT1ib29sIGhhc19tYW5hZ2VkX3pvbmUoZW51bSB6b25lX3R5cGUgem9uZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy03ODcxLVxcbm1tL3BhZ2VfYWxsb2MuYzo3ODcyOiNpZmRlZiBDT05GSUdfVU5BQ0NFUFRFRF9NRU1PUllcXG5tbS9wYWdlX2FsbG9jLmMtNzg3My1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6MTAuMjcwNzY2NjU4WiIsIlNlcSI6NDMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM1MTQwNjAyNzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyBhIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uIEJsb2NrKipcblxuT2theSwgc28gbGluZSA1NzYzIG9mIHRoaXMgY29kZSBoYXMgYSBgI2lmZGVmIENPTkZJR19OVU1BYCBkaXJlY3RpdmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIlJpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2NvcGUgb2YgdGhhdCBjb25kaXRpb25hbCBjb21waWxhdGlvbi5cIiBJdCdzIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBOVU1BLWF3YXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdvcmtzIGluIHRoaXMgc3BlY2lmaWMgY29udGV4dC4gVGhlIGZpcnN0IHRoaW5nIEknbSBnb2luZyB0byBkbyBpcyBsb2NhdGUgd2hlcmUgdGhhdCBgI2lmZGVmYCBibG9jayB0ZXJtaW5hdGVzLiBHaXZlbiB0aGUgbGlrZWx5IHN0cnVjdHVyZSBvZiB0aGUgY29kZSwgSSdsbCBiZXQgaXQncyBub3QgZmFyIGZyb20gdGhlIGxpbmUuIE15IGZvY3VzIG5vdyBpcyBvbiBsaW5lcyA1OTMwLTU5NDUgd2l0aGluIGBtbS9wYWdlX2FsbG9jLmNgLCBJJ2xsIHN0YXJ0IHRoZXJlIGxvb2tpbmcgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGAjZW5kaWZgIHN0YXRlbWVudCBhbmQgYW55IGludGVydmVuaW5nIGNvZGUgdGhhdCdzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgdGhlIE5VTUEgY29uZmlnLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgKmluc2lkZSogdGhhdCBibG9jayB0byBnZXQgYSBmdWxsIHBpY3R1cmUgb2YgdGhlIGltcGFjdCBvZiB0aGUgTlVNQSBjb25maWd1cmF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTYyNSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjEzLjc4NDgzMTI0MVoiLCJTZXEiOjQ0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMTA1NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vcGFnZV9hbGxvYy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU5MzAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU5MzA6XFx0XFx0XFx0XFx0XFx0ICAgZ2ZwX3pvbmUoR0ZQX0tFUk5FTCksXFxuNTkzMTpcXHRcXHRcXHRcXHRcXHQgICBOVUxMKTtcXG41OTMyOlxcdFxcdHJldHVybiB6b25lbGlzdF9ub2RlX2lkeCh6KTtcXG41OTMzOlxcdH1cXG41OTM0OlxcdCNlbmRpZlxcbjU5MzU6XFx0XFxuNTkzNjpcXHRzdGF0aWMgdm9pZCBzZXR1cF9taW5fdW5tYXBwZWRfcmF0aW8odm9pZCk7XFxuNTkzNzpcXHRzdGF0aWMgdm9pZCBzZXR1cF9taW5fc2xhYl9yYXRpbyh2b2lkKTtcXG41OTM4OlxcdCNlbHNlXFx0LyogQ09ORklHX05VTUEgKi9cXG41OTM5OlxcdFxcbjU5NDA6XFx0c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxuNTk0MTpcXHR7XFxuNTk0MjpcXHRcXHRzdHJ1Y3Qgem9uZXJlZiAqem9uZXJlZnM7XFxuNTk0MzpcXHRcXHRpbnQgbnJfem9uZXM7XFxuNTk0NDpcXHRcXG41OTQ1OlxcdFxcdHpvbmVyZWZzID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7XFxuNTk0NjpcXHRcXHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdkYXQsIHpvbmVyZWZzKTtcXG41OTQ3OlxcdFxcdHpvbmVyZWZzICs9IG5yX3pvbmVzO1xcbjU5NDg6XFx0XFxuNTk0OTpcXHRcXHR6b25lcmVmcy1cXHUwMDNlem9uZSA9IE5VTEw7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjEzLjc4NTE0NDAzMVoiLCJTZXEiOjQ1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3MjM5MzExNDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZvY3VzaW5nIG9uIE5VTUEgTWVtb3J5IE1hbmFnZW1lbnQgZm9yIEZ1enppbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoZSBjb2RlIGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9wYWdlX2FsbG9jLmNgIGxvb2tzIGludGVyZXN0aW5nLCBlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIGl0J3MgdW5kZXIgYCNpZmRlZiBDT05GSUdfTlVNQWAgYW5kIHNwZWNpZmljYWxseSwgYG5leHRfZGVtb3Rpb25fbm9kZWAgaXMgcHJvdGVjdGVkIGJ5IGAjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OYCwgd2hpY2ggaW1wbGllcyBpdCdzIHJlbGV2YW50IHRvIE5VTUEgYW5kIG1lbW9yeSBtaWdyYXRpb24uIFNvLCBib3RoIGBDT05GSUdfTlVNQWAgYW5kIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gIGFyZSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuXG5cbk5vdywgaXMgdGhpcyBjb2RlIGV2ZW4gd29ydGggZnV6emluZz8gRGVmaW5pdGVseS4gVGhpcyBpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIHdpdGhpbiB0aGUgYG1tL2Agc3Vic3lzdGVtLiBJJ3ZlIGdvdCBjaGFuZ2VzIHRvIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBhbmQgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGluIGBtbS9wYWdlX2FsbG9jLmNgLCBhbmQgYG5leHRfZGVtb3Rpb25fbm9kZWAgYW5kIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaW4gYG1tL21lbW9yeS10aWVycy5jYC4gQ3J1Y2lhbGx5LCB0aGlzIGNvZGUgaXMgcmVhY2hhYmxlIGluIGEgTlVNQS1lbmFibGVkIGtlcm5lbCBydW5uaW5nIGluIFFFTVUgYmVjYXVzZSBgYnVpbGRfbm9kZV96b25lbGlzdGAgKG9yIGBidWlsZF96b25lbGlzdHNgKSBpcyBleGVjdXRlZCBhdCBib290LCBkdXJpbmcgbWVtb3J5IGhvdHBsdWcgYW5kIHdoZW4gdHJpZ2dlcmVkIGJ5IG1lbW9yeSBwcmVzc3VyZSwgdGhlIGBuZXh0X2RlbW90aW9uX25vZGVgIHdpbGwgYmUgY2FsbGVkIGR1cmluZyBtZW1vcnkgcmVjbGFpbS4gRnVydGhlcm1vcmUsIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaXMgY2FsbGVkIGF0IGJvb3QgYW5kIG9uIGhvdHBsdWcgLyBzeXNmcyBtZW1vcnkgdGllciBvcGVyYXRpb25zLiBUaGlzIGRpcmVjdGx5IGltcGFjdHMgaG93IE5VTUEgem9uZWxpc3RzIGFyZSBidWlsdCBhbmQgaG93IHdlIHNlbGVjdCBub2RlcyBmb3IgZmFsbGJhY2sgYW5kIGRlbW90aW9uLCB3aGljaCBpcyBleGFjdGx5IHRoZSBraW5kIG9mIHJlZmFjdG9yaW5nIGFuZCBsb2dpYyBjaGFuZ2UgdGhlIGZ1enppbmcgZ3VpZGVsaW5lcyBoaWdobGlnaHQgYXMgYSBoaWdoLXZhbHVlIHRhcmdldC4gSXQncyBhIGNsZWFyICdXb3J0aEZ1enppbmc9dHJ1ZScuXG5cblNvLCBsZXQncyBnZXQgaW50byB0aGUgc3BlY2lmaWNzIG9mIEZvY3VzU3ltYm9scy4gSSdtIGZvbGxvd2luZyB0aGUgZ3VpZGVsaW5lcywgd2hpY2ggc2F5cyB0byBhdm9pZCB1YmlxdWl0b3VzIGhvdC1wYXRocyBhbmQgaW5zdGVhZCB0YXJnZXQgc3BlY2lmaWMgZmVhdHVyZSBsb2dpYyBhbmQgZW50cnlwb2ludHMuXG5cbkhlcmXigJlzIHRoZSBjdXJyZW50IHRoaW5raW5nOlxuXG4xLiAgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGluIGBtbS9wYWdlX2FsbG9jLmNgLiBUaGlzIGlzIG5vbi1zdGF0aWMgKGRlY2xhcmVkIGluIGBtbS9pbnRlcm5hbC5oYCBhbmQgZGVmaW5lZCBpbiBgbW0vcGFnZV9hbGxvYy5jYCkgYW5kIGlzIG9ubHkgY2FsbGVkIHdoZW4gYnVpbGRpbmcgem9uZWxpc3RzIG9yIGZpbmRpbmcgZGVtb3Rpb24gdGFyZ2V0cywgc28gaXQncyBub3QgdWJpcXVpdG91cy4gRGVmaW5pdGVseSBhIGNvbnRlbmRlci5cblxuMi4gIGBidWlsZF9ub2RlX3pvbmVsaXN0YCBpbiBgbW0vcGFnZV9hbGxvYy5jYCBpcyBzdGF0aWMsIHdoaWNoIG1pZ2h0IG1ha2UgaXQgaW5saW5lZCwgc28gcG90ZW50aWFsbHkgdXNlbGVzcyBhcyBhIGZ1enppbmcgc3ltYm9sLiBCdXQsIGl0J3MgY2FsbGVkIGJ5IGBidWlsZF96b25lbGlzdHNgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBfX2J1aWxkX2FsbF96b25lbGlzdHNgLCB3aGljaCBpcyAqYWxzbyogY2FsbGVkIG9uIGJvb3QgYW5kIGhvdHBsdWcsIHNvIHRoaXMgKmNvdWxkKiBiZSBnb29kLiBMZXQncyBjaGVjayBpZiB0aGUgZGVmaW5pdGlvbiBpcyBpbmxpbmVkLi4uIE9oLCBJIHNlZSEgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGlzICpub3QqIHN0YXRpYywgc28gaXQgKmlzKiBhbiBhY3R1YWwgc3ltYm9sLiBHb29kLCBnb29kLlxuXG4zLiAgYG5leHRfZGVtb3Rpb25fbm9kZWAgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBub24tc3RhdGljLiBBZ2Fpbiwgbm90IHViaXF1aXRvdXMsIG9ubHkgdXNlZCBpbiBgZGVtb3RlX2ZvbGlvX2xpc3RgLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gVGhpcyBpcyBhIHNvbGlkIGNhbmRpZGF0ZS5cblxuNC4gIGBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0c2AgaW4gYG1tL21lbW9yeS10aWVycy5jYCBpcyBzdGF0aWMuIEkgbmVlZCB0byBmaW5kIHRoZSBub24tc3RhdGljIGZ1bmN0aW9ucyB0aGF0IGNhbGwgaXQgb3IgYXJlIGVudHJ5cG9pbnRzIHRvIGl0cyBmdW5jdGlvbmFsaXR5LiBMb29raW5nIGF0IHRoZSBjYWxsZXJzLCBJIGhhdmUgYG1lbW9yeV90aWVyX2xhdGVfaW5pdGAgYW5kIGBtZW10aWVyX2hvdHBsdWdfY2FsbGJhY2tgIGFzIGNhbmRpZGF0ZXMuIEkgc2hvdWxkIGFsc28gY2hlY2sgd2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AgaXRzZWxmLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDIxMCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyMzcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODoyMS4wMjQ0NTgyODJaIiwiU2VxIjo0NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU4MDA3MTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeS10aWVycy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS10aWVycy5jPTQwMD1zdGF0aWMgdm9pZCBkdW1wX2RlbW90aW9uX3RhcmdldHModm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTQyNC0gKi9cXG5tbS9tZW1vcnktdGllcnMuYzo0MjU6c3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcXG5tbS9tZW1vcnktdGllcnMuYy00MjYte1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNTIxLSNlbHNlXFxubW0vbWVtb3J5LXRpZXJzLmM6NTIyOnN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxcbm1tL21lbW9yeS10aWVycy5jLTUyMy0jZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz03MDg9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfbGF0ZV9pbml0KHZvaWQpXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy03MzEtXFxubW0vbWVtb3J5LXRpZXJzLmM6NzMyOlxcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XFxubW0vbWVtb3J5LXRpZXJzLmMtNzMzLVxcdHB1dF9vbmxpbmVfbWVtcygpO1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9ODgyPXN0YXRpYyBpbnQgX19tZW1pbml0IG1lbXRpZXJfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy04OTEtXFx0XFx0aWYgKGNsZWFyX25vZGVfbWVtb3J5X3RpZXIobm4tXFx1MDAzZW5pZCkpXFxubW0vbWVtb3J5LXRpZXJzLmM6ODkyOlxcdFxcdFxcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XFxubW0vbWVtb3J5LXRpZXJzLmMtODkzLVxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy04OTgtXFx0XFx0aWYgKCFJU19FUlIobWVtdGllcikpXFxubW0vbWVtb3J5LXRpZXJzLmM6ODk5OlxcdFxcdFxcdGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKCk7XFxubW0vbWVtb3J5LXRpZXJzLmMtOTAwLVxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjIxLjA4MjQ3MTY3MVoiLCJTZXEiOjQ3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo2OTEzODM3MzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBDb2RlIENoYW5nZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGxvb2tzIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHpvbmVsaXN0IHJlYnVpbGRpbmcsIHdoaWNoIGlzIGEgZ29vZCBwbGFjZSB0byBzdGFydC4gIFRoZSByZWFsIHdvcmsgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIGluIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCwgYW5kIHRoZSBub24tc3RhdGljIGZ1bmN0aW9uIGBuZXh0X2RlbW90aW9uX25vZGVgIHVzZWQgZHVyaW5nIGRlbW90aW9uLiAgSSBzZWUgYSBzdGF0aWMgZnVuY3Rpb24sIGBkZW1vdGVfZm9saW9fbGlzdGAsIGFzIHdlbGwgYnV0IHRoYXQgbWF5IGJlIGxlc3MgcmVsZXZhbnQgaGVyZS4gIGBidWlsZF9hbGxfem9uZWxpc3RzYCBpcyBhbHNvIG5vbi1zdGF0aWMsIHNvIHRob3NlIGFyZSBteSBrZXkgdGFyZ2V0cy5cblxuSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGJyb2FkbHkgdGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkLiBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgaXMgaW52b2x2ZWQgaW4gem9uZWxpc3QgY29uc3RydWN0aW9uLCBkZW1vdGlvbiwgYW5kIGZpbmRpbmcgdGhlIGJlc3Qgbm9kZSwgc28gcG90ZW50aWFsbHkgaW1wb3J0YW50LiAgYG5leHRfZGVtb3Rpb25fbm9kZWAgYXBwZWFycyBsaW1pdGVkIHRvIGZvbGlvIGRlbW90aW9uLCBhbmQgYGJ1aWxkX2FsbF96b25lbGlzdHNgIGtpY2tzIGluIGR1cmluZyBib290LCBtZW1vcnkgaG90cGx1Zy9vZmZsaW5pbmcsIGFuZCB6b25lbGlzdCByZWJ1aWxkcyDigJMgbm90IGV4YWN0bHkgKnViaXF1aXRvdXMqLCBidXQgZGVmaW5pdGVseSBjcml0aWNhbCBzeXN0ZW0gZXZlbnRzLlxuXG5Ob3csIGxldCdzIGxvb2sgYXQgdGhlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiAgSSdtIHNlZWluZyBgTlVNQWAgYXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCBpbXBsZW1lbnRhdGlvbiBhbmQgY29tcGlsaW5nIGBtbS9tZW1vcnktdGllcnMuY2AuICBgTlVNQV9NSUdSQVRJT05gIHJlcXVpcmVzIGBOVU1BYCBhbmQgYE1NVWAgKHdoaWNoIGlzIHByZXR0eSBtdWNoIHN0YW5kYXJkIG9uIGFtZDY0KSwgc3BlY2lmaWNhbGx5IGZvciBgbmV4dF9kZW1vdGlvbl9ub2RlYCBhbmQgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLiAgU28sIGBOVU1BYCBhbmQgYE5VTUFfTUlHUkFUSU9OYCBhcmUga2V5IGNvbmZpZyBvcHRpb25zLlxuXG5EcmlsbGluZyBpbnRvIHRoZSBjb2RlLCBgbW0vcGFnZV9hbGxvYy5jYCBzaG93cyB0aGF0IGBub2RlX2xvYWRgLCBgYnVpbGRfbm9kZV96b25lbGlzdGAsIGFuZCBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgYXJlIGFsbCBndWFyZGVkIGJ5IGAjaWZkZWYgQ09ORklHX05VTUFgLiBgbW0vbWVtb3J5LXRpZXJzLmNgIGlzIGNvbXBpbGVkIHVuZGVyIGBvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9gLiAgV2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AsIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgIGFyZSBwcm90ZWN0ZWQgYnkgYCNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05gLiAgSSd2ZSBjaGVja2VkIHRoZSBgTWFrZWZpbGVgIGFuZCBgbWVtb3J5LXRpZXJzLmhgIHRvIGNvbmZpcm0gdGhlIGRlcGVuZGVuY2llcy5cblxuSW4gc3VtbWFyeTpcbiogICBUaGUgcGF0Y2ggcmVmYWN0b3JzIGBmaW5kX25leHRfYmVzdF9ub2RlYCB0byBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgd2l0aCBhIGNhbmRpZGF0ZSBub2RlbWFzay5cbiogICBJdCB1cGRhdGVzIE5VTUEgZmFsbGJhY2sgem9uZWxpc3QgY29uc3RydWN0aW9uIGluIGBtbS9wYWdlX2FsbG9jLmNgIHdoaWNoIHN0cmVhbWxpbmVzIHpvbmVsaXN0IGdlbmVyYXRpb24gZGlyZWN0bHkgaW50byB0aGUgbm9kZSB6b25lbGlzdCBidWZmZXIuXG4qICAgSXQgbW9kaWZpZXMgZGVtb3Rpb24gbm9kZSBzZWxlY3Rpb24gaW4gYG1tL21lbW9yeS10aWVycy5jYCB0byB1c2UgdGhlIHJlZmFjdG9yZWQgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gXG4qICAgVGhlIGNvZGUgdG91Y2hlcyBmdW5kYW1lbnRhbCBNTSBsb2dpYywgc3BlY2lmaWNhbGx5IE5VTUEgem9uZWxpc3QgY29uc3RydWN0aW9uIGFuZCBtZW1vcnkgdGllcmluZyAoaW5jbHVkaW5nIGRlbW90aW9uIHRhcmdldCBjYWxjdWxhdGlvbnMpIHRyaWdnZXJlZCBkdXJpbmcgYm9vdCwgbWVtb3J5IGhvdHBsdWcvb2ZmbGluZSwgYW5kIG1lbW9yeSByZWNsYWltIGlmIE5VTUEgZGVtb3Rpb24gaXMgZW5hYmxlZC5cblxuVGhlcmVmb3JlLCB0aGlzIGlzIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBmdXp6aW5nLiBUaGUga2V5IGZ1bmN0aW9ucyB0byB0YXJnZXQgYXJlIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYCwgYG5leHRfZGVtb3Rpb25fbm9kZWAsIGFuZCBgYnVpbGRfYWxsX3pvbmVsaXN0c2AsIGFuZCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIEkgbmVlZCB0byBlbmFibGUgYXJlIGBOVU1BYCBhbmQgYE5VTUFfTUlHUkFUSU9OYC4gIEknbSBjb21mb3J0YWJsZSB3aXRoIHRoZSBhbmFseXNpcywgc28gbGV0J3Mgc2V0IHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMjY4MCwiT3V0cHV0VG9rZW5zIjoxOTcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6MjcuOTk2MzExODI4WiIsIlNlcSI6NDgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzMwODE5MDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5VTUFcIixcbiAgICBcIk5VTUFfTUlHUkFUSU9OXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZmluZF9uZXh0X2Jlc3Rfbm9kZV9pblwiLFxuICAgIFwibmV4dF9kZW1vdGlvbl9ub2RlXCIsXG4gICAgXCJidWlsZF9hbGxfem9uZWxpc3RzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGZpbmRfbmV4dF9iZXN0X25vZGUoKSBpbnRvIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKSwgYWxsb3dpbmcgY2FsbGVycyB0byBzcGVjaWZ5IGVsaWdpYmxlIGNhbmRpZGF0ZSBub2RlcyB2aWEgYSBub2RlbWFzay4gSXQgYWxzbyByZXN0cnVjdHVyZXMgem9uZWxpc3QgYnVpbGRpbmcgaW4gbW0vcGFnZV9hbGxvYy5jIChidWlsZF9ub2RlX3pvbmVsaXN0KSBhbmQgdXBkYXRlcyBkZW1vdGlvbiB0YXJnZXQgcmVzb2x1dGlvbiBpbiBtbS9tZW1vcnktdGllcnMuYyAobmV4dF9kZW1vdGlvbl9ub2RlIGFuZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cykuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyByZWFjaGFibGUgZHVyaW5nIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiAoZS5nLiBib290IGFuZCBtZW1vcnkgaG90cGx1Zy9yZWJ1aWxkKSBhbmQgZm9saW8gZGVtb3Rpb24gZHVyaW5nIG1lbW9yeSByZWNsYW1hdGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOVU1BXCIsXG4gICAgXCJOVU1BX01JR1JBVElPTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImZpbmRfbmV4dF9iZXN0X25vZGVfaW5cIixcbiAgICBcIm5leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwiYnVpbGRfYWxsX3pvbmVsaXN0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmaW5kX25leHRfYmVzdF9ub2RlKCkgaW50byBmaW5kX25leHRfYmVzdF9ub2RlX2luKCksIGFsbG93aW5nIGNhbGxlcnMgdG8gc3BlY2lmeSBlbGlnaWJsZSBjYW5kaWRhdGUgbm9kZXMgdmlhIGEgbm9kZW1hc2suIEl0IGFsc28gcmVzdHJ1Y3R1cmVzIHpvbmVsaXN0IGJ1aWxkaW5nIGluIG1tL3BhZ2VfYWxsb2MuYyAoYnVpbGRfbm9kZV96b25lbGlzdCkgYW5kIHVwZGF0ZXMgZGVtb3Rpb24gdGFyZ2V0IHJlc29sdXRpb24gaW4gbW0vbWVtb3J5LXRpZXJzLmMgKG5leHRfZGVtb3Rpb25fbm9kZSBhbmQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHMpLiBUaGlzIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVhY2hhYmxlIGR1cmluZyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gKGUuZy4gYm9vdCBhbmQgbWVtb3J5IGhvdHBsdWcvcmVidWlsZCkgYW5kIGZvbGlvIGRlbW90aW9uIGR1cmluZyBtZW1vcnkgcmVjbGFtYXRpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjI4LjA2OTQwMjUxN1oiLCJTZXEiOjQ5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzU0MTMwMDg0MTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODoyOC4wNjk4OTk0MjZaIiwiU2VxIjo1MCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozNTQxMjUwNjEwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIE5VTUEgem9uZWxpc3QgZ2VuZXJhdGlvbiBhbmQgbm9kZSBmYWxsYmFjayBjYWxjdWxhdGlvbiBieSBpbnRyb2R1Y2luZyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbigpYCB3aXRoIGEgYGNhbmRpZGF0ZXNgIG5vZGVtYXNrIHBhcmFtZXRlciBhbmQgbWVyZ2luZyBgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIoKWAgaW50byBgYnVpbGRfbm9kZV96b25lbGlzdCgpYC5cXG5cXG4tIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZSAobm8gaW5mby1sZWFrcykuXFxuLSBObyBuZXcgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxcbi0gQWxsIHZhcmlhYmxlcyAoc3VjaCBhcyBgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkVgKSBhbmQgem9uZXJlZiB0ZXJtaW5hdGlvbnMgKGB6b25lcmVmcy1cXHUwMDNlem9uZSA9IE5VTExgLCBgem9uZXJlZnMtXFx1MDAzZXpvbmVfaWR4ID0gMGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cXG4tIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB6b25lbGlzdCBpbmRleGluZyBvciB0cmF2ZXJzYWwgd291bGQgYmUgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBwb2ludGVyIGVycm9ycywgd2hpY2ggYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIEtNU0FOIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGRldGVjdGlvbiBpcyBub3QgYXBwbGljYWJsZS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxYmEyZDRmMTc5MWRiODczNjAwZjBhMTJmZjczZDI5OWFiZGQzYmQ3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgMTIgMDM6Mzc6MDIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggZGExNGM1NmZiMjRlMS4uMTUxOWRkMjFhOTAwZiAxMDA2NDRcbi0tLSBhL21tL2ludGVybmFsLmhcbisrKyBiL21tL2ludGVybmFsLmhcbkBAIC0xMTMzLDcgKzExMzMsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xuIFxuIGV4dGVybiB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIFx0XHRcdFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcbi1leHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKTtcbitpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4rXHRcdGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpO1xuICNlbHNlXG4gI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwXG4gXG5AQCAtMTE0Miw3ICsxMTQzLDggQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIHtcbiBcdHJldHVybiAwO1xuIH1cbi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbitzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcbitcdFx0Y29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcbiB7XG4gXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuIH1cbmRpZmYgLS1naXQgYS9tbS9tZW1vcnktdGllcnMuYyBiL21tL21lbW9yeS10aWVycy5jXG5pbmRleCA1NDg1MWQ4YTE5NWIwLi4yNWUxMjE4NTFiNTg2IDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmNcbisrKyBiL21tL21lbW9yeS10aWVycy5jXG5AQCAtMzcwLDcgKzM3MCw3IEBAIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbiBcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxuIFx0ICovXG4gXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xuLVx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXHUwMDI2bWFzayk7XG4rXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcdTAwMjZtYXNrLCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG5AQCAtNDUwLDcgKzQ1MCw3IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4gXHRcdG1lbXRpZXIgPSBsaXN0X25leHRfZW50cnkobWVtdGllciwgbGlzdCk7XG4gXHRcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcbiBcdFx0Lypcbi1cdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZSwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cbitcdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiwgdXNlICd1c2VkJyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC5cbiBcdFx0ICogQWRkIGFsbCBtZW1vcnkgbm9kZXMgZXhjZXB0IHRoZSBzZWxlY3RlZCBtZW1vcnkgdGllclxuIFx0XHQgKiBub2RlbGlzdCB0byBza2lwIGxpc3Qgc28gdGhhdCB3ZSBmaW5kIHRoZSBiZXN0IG5vZGUgZnJvbSB0aGVcbiBcdFx0ICogbWVtdGllciBub2RlbGlzdC5cbkBAIC00NjMsNyArNDYzLDggQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdFx0ICogaW4gdGhlIHByZWZlcnJlZCBtYXNrIHdoZW4gYWxsb2NhdGluZyBwYWdlcyBkdXJpbmcgZGVtb3Rpb24uXG4gXHRcdCAqL1xuIFx0XHRkbyB7XG4tXHRcdFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCBcdTAwMjZ0aWVyX25vZGVzKTtcbitcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4rXHRcdFx0XHRcdFx0XHRcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuIFx0XHRcdGlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKVxuIFx0XHRcdFx0YnJlYWs7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jXG5pbmRleCAxY2ZiZDA1ODJhMTBhLi5kMTg4OGQ1NjMwZTBhIDEwMDY0NFxuLS0tIGEvbW0vcGFnZV9hbGxvYy5jXG4rKysgYi9tbS9wYWdlX2FsbG9jLmNcbkBAIC01NzkzLDkgKzU3OTMsMTAgQEAgc3RhdGljIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcbiBzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdO1xuIFxuIC8qKlxuLSAqIGZpbmRfbmV4dF9iZXN0X25vZGUgLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3RcbisgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0XG4gICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmdcbiAgKiBAdXNlZF9ub2RlX21hc2s6IG5vZGVtYXNrX3Qgb2YgYWxyZWFkeSB1c2VkIG5vZGVzXG4rICogQGNhbmRpZGF0ZXM6IG5vZGVtYXNrX3Qgb2Ygbm9kZXMgZWxpZ2libGUgZm9yIHNlbGVjdGlvblxuICAqXG4gICogV2UgdXNlIGEgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGlzIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGRcbiAgKiBhcHBlYXIgb24gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdC4gIFRoZSBub2RlIHNob3VsZCBub3QgaGF2ZSBhcHBlYXJlZFxuQEAgLTU4MDcsNyArNTgwOCw4IEBAIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4gICpcbiAgKiBSZXR1cm46IG5vZGUgaWQgb2YgdGhlIGZvdW5kIG5vZGUgb3IgJU5VTUFfTk9fTk9ERSBpZiBubyBub2RlIGlzIGZvdW5kLlxuICAqL1xuLWludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcbitpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4rXHRcdFx0ICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcbiB7XG4gXHRpbnQgbiwgdmFsO1xuIFx0aW50IG1pbl92YWwgPSBJTlRfTUFYO1xuQEAgLTU4MTcsMTIgKzU4MTksMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuIFx0ICogVXNlIHRoZSBsb2NhbCBub2RlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYnV0IGZvciBtZW1vcnlsZXNzIGxvY2FsXG4gXHQgKiBub2RlLCB3ZSBzaG91bGQgc2tpcCBpdCBhbmQgZmFsbCBiYWNrIHRvIG90aGVyIG5vZGVzLlxuIFx0ICovXG4tXHRpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSBcdTAwMjZcdTAwMjYgbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkpIHtcbitcdGlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spIFx1MDAyNlx1MDAyNiBub2RlX2lzc2V0KG5vZGUsICpjYW5kaWRhdGVzKSkge1xuIFx0XHRub2RlX3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spO1xuIFx0XHRyZXR1cm4gbm9kZTtcbiBcdH1cbiBcbi1cdGZvcl9lYWNoX25vZGVfc3RhdGUobiwgTl9NRU1PUlkpIHtcbitcdGZvcl9lYWNoX25vZGVfbWFzayhuLCAqY2FuZGlkYXRlcykge1xuIFxuIFx0XHQvKiBEb24ndCB3YW50IGEgbm9kZSB0byBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKi9cbiBcdFx0aWYgKG5vZGVfaXNzZXQobiwgKnVzZWRfbm9kZV9tYXNrKSlcbkBAIC01ODU1LDMxICs1ODU3LDYgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuIH1cbiBcbiBcbi0vKlxuLSAqIEJ1aWxkIHpvbmVsaXN0cyBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLlxuLSAqIFRoaXMgcmVzdWx0cyBpbiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbFxuLSAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxuLSAqL1xuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnX2RhdGFfdCAqcGdkYXQsIGludCAqbm9kZV9vcmRlcixcbi1cdFx0dW5zaWduZWQgbnJfbm9kZXMpXG4te1xuLVx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzO1xuLVx0aW50IGk7XG4tXG4tXHR6b25lcmVmcyA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX0ZBTExCQUNLXS5fem9uZXJlZnM7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9ub2RlczsgaSsrKSB7XG4tXHRcdGludCBucl96b25lcztcbi1cbi1cdFx0cGdfZGF0YV90ICpub2RlID0gTk9ERV9EQVRBKG5vZGVfb3JkZXJbaV0pO1xuLVxuLVx0XHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUobm9kZSwgem9uZXJlZnMpO1xuLVx0XHR6b25lcmVmcyArPSBucl96b25lcztcbi1cdH1cbi1cdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuLVx0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuLX1cbi1cbiAvKlxuICAqIEJ1aWxkIF9fR0ZQX1RISVNOT0RFIHpvbmVsaXN0c1xuICAqL1xuQEAgLTU4OTUsMTkgKzU4NzIsMjQgQEAgc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4gXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuKy8qXG4rICogQnVpbGQgb25lIHpvbmVsaXN0IG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuIFRoaXMgcmVzdWx0cyBpblxuKyAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxuKyAqIHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuXG4rICovXG4rc3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuK1x0XHRcdFx0aW50IHpsaWR4KVxuIHtcbi1cdHN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdO1xuLVx0aW50IG5vZGUsIG5yX25vZGVzID0gMDtcbitcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcyA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZWxpc3RzW3psaWR4XS5fem9uZXJlZnM7XG4gXHRub2RlbWFza190IHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FO1xuLVx0aW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTtcbitcdGludCBsb2NhbF9ub2RlID0gcGdkYXQtXHUwMDNlbm9kZV9pZDtcbitcdGludCBwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xuK1x0aW50IG5vZGU7XG4gXG4tXHQvKiBOVU1BLWF3YXJlIG9yZGVyaW5nIG9mIG5vZGVzICovXG4tXHRsb2NhbF9ub2RlID0gcGdkYXQtXHUwMDNlbm9kZV9pZDtcbi1cdHByZXZfbm9kZSA9IGxvY2FsX25vZGU7XG4rXHRwcl9pbmZvKFwiRmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6IFwiLCBsb2NhbF9ub2RlKTtcbiBcbi1cdG1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpO1xuLVx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShsb2NhbF9ub2RlLCBcdTAwMjZ1c2VkX21hc2spKSBcdTAwM2U9IDApIHtcbitcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrLFxuK1x0XHRcdFx0XHQgICAgICBjYW5kaWRhdGVzKSkgXHUwMDNlPSAwKSB7XG4gXHRcdC8qXG4gXHRcdCAqIFdlIGRvbid0IHdhbnQgdG8gcHJlc3N1cmUgYSBwYXJ0aWN1bGFyIG5vZGUuXG4gXHRcdCAqIFNvIGFkZGluZyBwZW5hbHR5IHRvIHRoZSBmaXJzdCBub2RlIGluIHNhbWVcbkBAIC01OTE3LDE4ICs1ODk5LDIyIEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuIFx0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKVxuIFx0XHRcdG5vZGVfbG9hZFtub2RlXSArPSAxO1xuIFxuLVx0XHRub2RlX29yZGVyW25yX25vZGVzKytdID0gbm9kZTtcbitcdFx0em9uZXJlZnMgKz0gYnVpbGRfem9uZXJlZnNfbm9kZShOT0RFX0RBVEEobm9kZSksIHpvbmVyZWZzKTtcbitcdFx0cHJfY29udChcIiVkIFwiLCBub2RlKTtcbiBcdFx0cHJldl9ub2RlID0gbm9kZTtcbiBcdH1cbiBcbi1cdGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnZGF0LCBub2RlX29yZGVyLCBucl9ub2Rlcyk7XG4tXHRidWlsZF90aGlzbm9kZV96b25lbGlzdHMocGdkYXQpO1xuLVx0cHJfaW5mbyhcIkZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcIiwgbG9jYWxfbm9kZSk7XG4tXHRmb3IgKG5vZGUgPSAwOyBub2RlIFx1MDAzYyBucl9ub2Rlczsgbm9kZSsrKVxuLVx0XHRwcl9jb250KFwiJWQgXCIsIG5vZGVfb3JkZXJbbm9kZV0pO1xuK1x0em9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTEw7XG4rXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4gXHRwcl9jb250KFwiXFxuXCIpO1xuIH1cbiBcbitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbit7XG4rXHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLKTtcbitcdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XG4rfVxuK1xuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG4gLypcbiAgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFwibG9jYWxcIiBhbGxvY2F0aW9ucy5cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjI4LjA2OTkwMDk0NloiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNDM3MzAwOTc2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoIGFuZCBmaWd1cmUgb3V0IGlmIGl0IHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNoYW5nZXMgZmlyc3QsIHRoZW4gYXNzZXNzIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IHJpc2tzLlxuXG5TbywgaGVyZSdzIHdoYXQgSSBzZWU6IHRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgdGhlIGBmaW5kX25leHRfYmVzdF9ub2RlYCBmdW5jdGlvbi4gSXQncyBiZWVuIHJlbmFtZWQgdG8gYGZpbmRfbmV4dF9iZXN0X25vZGVfaW5gIGFuZCBhIGBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzYCBwYXJhbWV0ZXIgaGFzIGJlZW4gYWRkZWQuIFRoZSBjaGFuZ2VzIHNlZW0gdG8gYmUgcHJvcGFnYXRpbmcgdGhpcyBuZXcgZnVuY3Rpb24gc2lnbmF0dXJlIHRocm91Z2hvdXQgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuXG5cblNwZWNpZmljYWxseSwgSSBzZWUgdGhpcyBmdW5jdGlvbiBub3cgYmVpbmcgdXNlZCBpbiBgbW0vbWVtb3J5LXRpZXJzLmNgLCBpbiBib3RoIGBuZXh0X2RlbW90aW9uX25vZGVgIGFuZCBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgLiBUaGUgY3J1Y2lhbCBwYXJ0IGhlcmUgaXMgaG93IHRoZXNlIGBjYW5kaWRhdGVzYCBtYXNrcyBhcmUgYmVpbmcgdXNlZDsgaXQncyBsaWtlbHkgd2hlcmUgYW55IHBvdGVudGlhbCBpc3N1ZXMgbWlnaHQgaGlkZS5cblxuRnVydGhlciBkb3duIHRoZSByYWJiaXQgaG9sZSwgYG1tL3BhZ2VfYWxsb2MuY2AgY29udGFpbnMgdGhlIG1lYXQgb2YgdGhlIGltcGxlbWVudGF0aW9uLiBUaGUga2V5IGNoYW5nZSBoZXJlIGlzIGhvdyBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgbm93IHVzZXMgYG5vZGVfaXNzZXRgIGFuZCBgZm9yX2VhY2hfbm9kZV9tYXNrYCB3aXRoIHRoZSBwcm92aWRlZCBgY2FuZGlkYXRlc2AgbWFzayBpbnN0ZWFkIG9mIHRoZSBvbGQgYE5fTUVNT1JZYCBub2RlIHN0YXRlLiBUaGUgY2hhbmdlcyBpbiBgYnVpbGRfem9uZWxpc3RzYCBzZWVtIHNpZ25pZmljYW50IGFzIHdlbGwuIEl0IGxvb2tzIGxpa2UgdGhleSd2ZSByZWZhY3RvcmVkIHRoZSBvbGQgbm9kZSBvcmRlcmluZyBsb2dpYyB0byBkaXJlY3RseSBidWlsZCB6b25lbGlzdHMgYmFzZWQgb24gdGhlIGBjYW5kaWRhdGVzYCBtYXNrIHdpdGhpbiBhIG5ldyBgYnVpbGRfbm9kZV96b25lbGlzdGAgZnVuY3Rpb24uIEluc3RlYWQgb2YgY2FsbGluZyBvdXQgdG8gYSBmdW5jdGlvbiB0byBidWlsZCB0aGUgem9uZSBsaXN0IHVzaW5nIG5vZGUgb3JkZXIsIHRoZSBuZXcgYXBwcm9hY2ggc2VlbXMgdG8gYmUgYnVpbGRpbmcgaXQgaW4gdGhlIGxvb3AgaXRzZWxmLlxuXG5Ob3csIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzOiB1bmluaXRpYWxpemVkIG1lbW9yeS4gTGV0J3Mgc3RhcnQgd2l0aCB0aGUgYmFzaWNzOyBhcmUgdGhlcmUgYW55IG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9ucyB0aGF0IGFyZW4ndCBpbml0aWFsaXplZD8gYG5vZGVtYXNrX3QgdXNlZF9tYXNrYCBsb29rcyBpbml0aWFsaXplZCwgYW5kIGB6b25lcmVmc2AgaXMgcG9pbnRpbmcgdG8gYW4gZXhpc3RpbmcgYXJyYXkgaW4gYHBnZGF0YCwgd2hpY2ggZ2V0cyB0ZXJtaW5hdGVkIHdpdGggYHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMOyB6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7YC4gT2theSwgdGhhdCBsb29rcyBzYWZlLiBOb3RoaW5nIGlzIGJlaW5nIGNvcGllZCB0byB1c2Vyc3BhY2UsIHNvIHRoYXQncyBvbmUgbGVzcyBjb25jZXJuLlxuXG5UaGUgbW9zdCBwcm9iYWJsZSBhcmVhIG9mIGNvbmNlcm4gaXMgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4gYGNhbmRpZGF0ZXNgIGlzIHRoZSBjcnVjaWFsIHBvaW50ZXIgaGVyZSwgcG90ZW50aWFsbHkuIEl0J3MgcG9pbnRlZCB0byBlaXRoZXIgYG5vZGVfc3RhdGVzW05fTUVNT1JZXWAgb3IgYFx1MDAyNm1hc2tgIC8gYFx1MDAyNnRpZXJfbm9kZXNgLiBTbywgSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBpbml0aWFsaXphdGlvbiBvZiBgbWFza2AgYW5kIGB0aWVyX25vZGVzYCBpbiBgbWVtb3J5LXRpZXJzLmNgIGFyb3VuZCBsaW5lcyAzNzAgYW5kIDQ1MC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBtYXNrcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZXkncmUgcGFzc2VkIHRvIGBmaW5kX25leHRfYmVzdF9ub2RlX2luYC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDUyMCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjUyLjQ0MjkxNDMyOVoiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4Nzk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnktdGllcnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNjAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNjA6XFx0XFx0ICogbGFzdCB0YXJnZXQgbm9kZS4gT3IgaW50cm9kdWNpbmcgcGVyLWNwdSBkYXRhIHRvIGF2b2lkXFxuIDM2MTpcXHRcXHQgKiBjYWNoaW5nIGlzc3VlLCB3aGljaCBzZWVtcyBtb3JlIGNvbXBsaWNhdGVkLiBTbyBzZWxlY3RpbmdcXG4gMzYyOlxcdFxcdCAqIHRhcmdldCBub2RlIHJhbmRvbWx5IHNlZW1zIGJldHRlciB1bnRpbCBub3cuXFxuIDM2MzpcXHRcXHQgKi9cXG4gMzY0OlxcdFxcdGlmICghbm9kZXNfZW1wdHkobWFzaykpXFxuIDM2NTpcXHRcXHRcXHRyZXR1cm4gbm9kZV9yYW5kb20oXFx1MDAyNm1hc2spO1xcbiAzNjY6XFx0XFxuIDM2NzpcXHRcXHQvKlxcbiAzNjg6XFx0XFx0ICogUHJlZmVycmVkIG5vZGVzIGFyZSBub3QgaW4gYWxsb3dlZF9tYXNrLiBGbGlwIGJpdHMgaW5cXG4gMzY5OlxcdFxcdCAqIGFsbG93ZWRfbWFzayBhcyB1c2VkIG5vZGUgbWFzay4gVGhlbiwgdXNlIGl0IHRvIGdldCB0aGVcXG4gMzcwOlxcdFxcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxcbiAzNzE6XFx0XFx0ICovXFxuIDM3MjpcXHRcXHRub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spO1xcbiAzNzM6XFx0XFx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgXFx1MDAyNm1hc2ssIFxcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xcbiAzNzQ6XFx0fVxcbiAzNzU6XFx0XFxuIDM3NjpcXHRzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIDM3NzpcXHR7XFxuIDM3ODpcXHRcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XFxuIDM3OTpcXHRcXHRpbnQgbm9kZTtcXG4gMzgwOlxcdFxcbiAzODE6XFx0XFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkge1xcbiAzODI6XFx0XFx0XFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcXG4gMzgzOlxcdFxcdFxcdC8qXFxuIDM4NDpcXHRcXHRcXHQgKiBXZSBhcmUgaG9sZGluZyBtZW1vcnlfdGllcl9sb2NrLCBpdCBpcyBzYWZlXFxuIDM4NTpcXHRcXHRcXHQgKiB0byBhY2Nlc3MgcGdkYS1cXHUwMDNlbWVtdGllci5cXG4gMzg2OlxcdFxcdFxcdCAqL1xcbiAzODc6XFx0XFx0XFx0bWVtdGllciA9IF9fbm9kZV9nZXRfbWVtb3J5X3RpZXIobm9kZSk7XFxuIDM4ODpcXHRcXHRcXHRpZiAobWVtdGllcilcXG4gMzg5OlxcdFxcdFxcdFxcdG1lbXRpZXItXFx1MDAzZWxvd2VyX3RpZXJfbWFzayA9IE5PREVfTUFTS19OT05FO1xcbiAzOTA6XFx0XFx0fVxcbiAzOTE6XFx0XFx0LypcXG4gMzkyOlxcdFxcdCAqIEVuc3VyZSB0aGF0IHRoZSBcXFwiZGlzYWJsZVxcXCIgaXMgdmlzaWJsZSBhY3Jvc3MgdGhlIHN5c3RlbS5cXG4gMzkzOlxcdFxcdCAqIFJlYWRlcnMgd2lsbCBzZWUgZWl0aGVyIGEgY29tYmluYXRpb24gb2YgYmVmb3JlK2Rpc2FibGVcXG4gMzk0OlxcdFxcdCAqIHN0YXRlIG9yIGRpc2FibGUrYWZ0ZXIuICBUaGV5IHdpbGwgbmV2ZXIgc2VlIGJlZm9yZSBhbmRcXG4gMzk1OlxcdFxcdCAqIGFmdGVyIHN0YXRlIHRvZ2V0aGVyLlxcbiAzOTY6XFx0XFx0ICovXFxuIDM5NzpcXHRcXHRzeW5jaHJvbml6ZV9yY3UoKTtcXG4gMzk4OlxcdH1cXG4gMzk5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODo1Mi40NDMwMDQ5MjlaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjM5ODgyNzE3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgbGluZXMgb2YgY29kZTpcblxuKipEaXZpbmcgaW50byBgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHNgKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBtZW1vcnkgdGllcnMgYWdhaW4uIE15IGludHVpdGlvbiB0ZWxscyBtZSB0byBkcmlsbCBkb3duIGludG8gYG1tL21lbW9yeS10aWVycy5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lcyA0NDAgdG8gNDgwIHdpdGhpbiB0aGUgYGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzYCBmdW5jdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIHN1c3BlY3QgdGhpcyBzZWN0aW9uIGlzIHdoZXJlIHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvdXQgKndoaWNoKiBtZW1vcnkgcmVnaW9ucyBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZGVtb3Rpb24g4oCTIHRoYXQgaXMsIG1vdmluZyBkYXRhIGZyb20gYSBmYXN0ZXIsIG1vcmUgZXhwZW5zaXZlIHRpZXIgZG93biB0byBhIHNsb3dlciwgY2hlYXBlciBvbmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjcml0ZXJpYSBhbmQgbG9naWMgYmVpbmcgdXNlZC4gQXJlIHdlIGxvb2tpbmcgYXQgYWNjZXNzIGZyZXF1ZW5jeSwgb3ZlcmFsbCBmb290cHJpbnQsIHJlY2VuY3ksIG9yIHNvbWUgY29tcGxleCBjb21iaW5hdGlvbiBvZiB0aGVzZSBmYWN0b3JzPyBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgbGlrZWx5IGNvbnRhaW5zIHRoZSBjb3JlIGRlbW90aW9uIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLCBhbmQgaXQncyBlc3NlbnRpYWwgdG8gYW5hbHl6ZSBpdCB3aXRoIGEgZmluZS10b290aCBjb21iIHRvIHVuZGVyc3RhbmQgaG93IGVmZmVjdGl2ZSB0aGUgdGllcmluZyBpcyBhbmQgaG93IGl0IG1pZ2h0IGJlIGltcHJvdmVkLiBMZXQncyBzZWUgd2hhdCBnZW1zIHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTEwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODo1NC44NDE4MzQ4MTFaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODEwNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LXRpZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDQwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDQwOlxcdFxcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcXG4gNDQxOlxcdFxcdFxcdGJlc3RfZGlzdGFuY2UgPSAtMTtcXG4gNDQyOlxcdFxcdFxcdG5kID0gXFx1MDAyNm5vZGVfZGVtb3Rpb25bbm9kZV07XFxuIDQ0MzpcXHRcXG4gNDQ0OlxcdFxcdFxcdG1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpO1xcbiA0NDU6XFx0XFx0XFx0aWYgKCFtZW10aWVyIHx8IGxpc3RfaXNfbGFzdChcXHUwMDI2bWVtdGllci1cXHUwMDNlbGlzdCwgXFx1MDAyNm1lbW9yeV90aWVycykpXFxuIDQ0NjpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNDQ3OlxcdFxcdFxcdC8qXFxuIDQ0ODpcXHRcXHRcXHQgKiBHZXQgdGhlIGxvd2VyIG1lbXRpZXIgdG8gZmluZCB0aGUgIGRlbW90aW9uIG5vZGUgbGlzdC5cXG4gNDQ5OlxcdFxcdFxcdCAqL1xcbiA0NTA6XFx0XFx0XFx0bWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTtcXG4gNDUxOlxcdFxcdFxcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcXG4gNDUyOlxcdFxcdFxcdC8qXFxuIDQ1MzpcXHRcXHRcXHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJ3VzZWQnIG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxcbiA0NTQ6XFx0XFx0XFx0ICogQWRkIGFsbCBtZW1vcnkgbm9kZXMgZXhjZXB0IHRoZSBzZWxlY3RlZCBtZW1vcnkgdGllclxcbiA0NTU6XFx0XFx0XFx0ICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlXFxuIDQ1NjpcXHRcXHRcXHQgKiBtZW10aWVyIG5vZGVsaXN0LlxcbiA0NTc6XFx0XFx0XFx0ICovXFxuIDQ1ODpcXHRcXHRcXHRub2Rlc19hbmRub3QodGllcl9ub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCB0aWVyX25vZGVzKTtcXG4gNDU5OlxcdFxcbiA0NjA6XFx0XFx0XFx0LypcXG4gNDYxOlxcdFxcdFxcdCAqIEZpbmQgYWxsIHRoZSBub2RlcyBpbiB0aGUgbWVtb3J5IHRpZXIgbm9kZSBsaXN0IG9mIHNhbWUgYmVzdCBkaXN0YW5jZS5cXG4gNDYyOlxcdFxcdFxcdCAqIGFkZCB0aGVtIHRvIHRoZSBwcmVmZXJyZWQgbWFzay4gV2UgcmFuZG9tbHkgc2VsZWN0IGJldHdlZW4gbm9kZXNcXG4gNDYzOlxcdFxcdFxcdCAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLlxcbiA0NjQ6XFx0XFx0XFx0ICovXFxuIDQ2NTpcXHRcXHRcXHRkbyB7XFxuIDQ2NjpcXHRcXHRcXHRcXHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFxcdTAwMjZ0aWVyX25vZGVzLFxcbiA0Njc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSk7XFxuIDQ2ODpcXHRcXHRcXHRcXHRpZiAodGFyZ2V0ID09IE5VTUFfTk9fTk9ERSlcXG4gNDY5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA0NzA6XFx0XFxuIDQ3MTpcXHRcXHRcXHRcXHRkaXN0YW5jZSA9IG5vZGVfZGlzdGFuY2Uobm9kZSwgdGFyZ2V0KTtcXG4gNDcyOlxcdFxcdFxcdFxcdGlmIChkaXN0YW5jZSA9PSBiZXN0X2Rpc3RhbmNlIHx8IGJlc3RfZGlzdGFuY2UgPT0gLTEpIHtcXG4gNDczOlxcdFxcdFxcdFxcdFxcdGJlc3RfZGlzdGFuY2UgPSBkaXN0YW5jZTtcXG4gNDc0OlxcdFxcdFxcdFxcdFxcdG5vZGVfc2V0KHRhcmdldCwgbmQtXFx1MDAzZXByZWZlcnJlZCk7XFxuIDQ3NTpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbiA0NzY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDQ3NzpcXHRcXHRcXHRcXHR9XFxuIDQ3ODpcXHRcXHRcXHR9IHdoaWxlICgxKTtcXG4gNDc5OlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzg6NTQuODQxOTE4MjkxWiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM1MDIxNjU4MTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIHByb3ZpZGVkIHByb21wdDpcblxuKipEaXZpbmcgaW50byBgcGFnZV9hbGxvYy5jYCBhbmQgWm9uZWxpc3RzKipcblxuT2theSwgc28gdGhlIHByb21wdCBpcyBhc2tpbmcgbWUgdG8gdGhpbmsgYWJvdXQgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIGNvZGUsIGBwYWdlX2FsbG9jLmNgLCBhbmQgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGJ1aWxkX25vZGVfem9uZWxpc3RgIGZ1bmN0aW9uLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyByZWxhdGVzIHRvIHRoZSBmdW5kYW1lbnRhbCBtZW1vcnkgYWxsb2NhdGlvbiBtZWNoYW5pc21zIHdpdGhpbiB0aGUga2VybmVsLCBhbmQgdGhlIHN0cnVjdHVyaW5nIG9mIG1lbW9yeSB6b25lcyBhY3Jvc3MgTlVNQSBub2Rlcy5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHByb2JhYmx5IHN0YXJ0IGJ5IHF1aWNrbHkgcmV2aWV3aW5nIGBidWlsZF9ub2RlX3pvbmVsaXN0YCdzIHB1cnBvc2UuIEkgcmVtZW1iZXIgaXQncyByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHRoZSB6b25lbGlzdCBmb3IgZWFjaCBub2RlLiBUaGUgem9uZWxpc3QgZGljdGF0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBrZXJuZWwgd2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIHBhZ2VzIGZyb20gZGlmZmVyZW50IG1lbW9yeSB6b25lcyAoZS5nLiwgRE1BLCBOb3JtYWwsIEhpZ2hNZW0pIHdpdGhpbiBhIE5VTUEgbm9kZSBhbmQgcG90ZW50aWFsbHkgYWNyb3NzIG90aGVyIG5vZGVzLiBJJ2QgcHJvYmFibHkgbWVudGFsbHkgcmVjb25zdHJ1Y3QgaG93IHRoZSBkaWZmZXJlbnQgem9uZXMgb24gYSBub2RlLCBhbmQgem9uZXMgZnJvbSBvdGhlciBub2RlcywgYXJlIGFkZGVkIHRvIHRoYXQgbGlzdC5cblxuVGhlbiwgSSdkIGNvbnNpZGVyIGNvbW1vbiBzY2VuYXJpb3M6IEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgdGhpbmdzIEkgc2hvdWxkIGJlIHRoaW5raW5nIGFib3V0PyBJcyB0aGlzIGEgc3RhbmRhcmQgc2NlbmFyaW8sIGlzIHRoZXJlIHNvbWV0aGluZyB1bnVzdWFsIGFib3V0IHRoZSBwcm9tcHQsIG9yIGlzIHRoaXMgYSB0cmljayBxdWVzdGlvbj9cblxuVGhlIGludGVycGxheSB3aXRoIE5VTUEgaXMga2V5LiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhlIGltcGFjdCBvZiBOVU1BIGJhbGFuY2luZywgdGhlIGltcGFjdCBvZiBwcmVmZXJyZWQgbm9kZXMsIGFuZCB0aGUgZWZmZWN0cyBvZiBub2RlIGludGVybGVhdmUgcG9saWNpZXMuIEknZCBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgY29uZmlndXJhdGlvbnMgY2FuIHNpZ25pZmljYW50bHkgYWZmZWN0IHRoZSB6b25lbGlzdCBjb25zdHJ1Y3Rpb24uXG5cbkZpbmFsbHksIGRlcGVuZGluZyBvbiBjb250ZXh0LCBJJ2QgcHJvYmFibHkgYmUgdGhpbmtpbmcgYWJvdXQgcGVyZm9ybWFuY2UgaW1wYWN0cy4gSG93IHRoZSB6b25lbGlzdCBpcyBvcmRlcmVkIGRpcmVjdGx5IGFmZmVjdHMgYWxsb2NhdGlvbiBsYXRlbmN5LiBBcmUgdGhlcmUgYW55IGtub3duIGFyZWFzIHdoZXJlIHN1Ym9wdGltYWwgem9uZWxpc3QgY29uc3RydWN0aW9uIGxlYWRzIHRvIHBlcmZvcm1hbmNlIGlzc3Vlcz8gSSBtaWdodCBiZSB0aGlua2luZyBhYm91dCBob3cgdGhpbmdzIGFyZSBjb25maWd1cmVkLCBiZWNhdXNlIEkgcmVjYWxsIHRoYXQgc29tZXRpbWVzLCB0aGUgaWRlYWwgem9uZWxpc3Qgb3JkZXJpbmcgaXMgYSBiYWxhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NDE0LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwMzozODo1OC4zNDQwODY0MzVaIiwiU2VxIjo1NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDE4MTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3BhZ2VfYWxsb2MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1ODcwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI1ODcwOlxcdFxcdHpvbmVyZWZzICs9IG5yX3pvbmVzO1xcbjU4NzE6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbjU4NzI6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmVfaWR4ID0gMDtcXG41ODczOlxcdH1cXG41ODc0OlxcdFxcbjU4NzU6XFx0LypcXG41ODc2OlxcdCAqIEJ1aWxkIG9uZSB6b25lbGlzdCBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLiBUaGlzIHJlc3VsdHMgaW5cXG41ODc3OlxcdCAqIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsIERNQSB6b25lLCBpZiBhbnktLWJ1dFxcbjU4Nzg6XFx0ICogcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS5cXG41ODc5OlxcdCAqL1xcbjU4ODA6XFx0c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbjU4ODE6XFx0XFx0XFx0XFx0XFx0aW50IHpsaWR4KVxcbjU4ODI6XFx0e1xcbjU4ODM6XFx0XFx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZWxpc3RzW3psaWR4XS5fem9uZXJlZnM7XFxuNTg4NDpcXHRcXHRub2RlbWFza190IHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FO1xcbjU4ODU6XFx0XFx0aW50IGxvY2FsX25vZGUgPSBwZ2RhdC1cXHUwMDNlbm9kZV9pZDtcXG41ODg2OlxcdFxcdGludCBwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xcbjU4ODc6XFx0XFx0aW50IG5vZGU7XFxuNTg4ODpcXHRcXG41ODg5OlxcdFxcdHByX2luZm8oXFxcIkZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcXFwiLCBsb2NhbF9ub2RlKTtcXG41ODkwOlxcdFxcbjU4OTE6XFx0XFx0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcXHUwMDI2dXNlZF9tYXNrLFxcbjU4OTI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgY2FuZGlkYXRlcykpIFxcdTAwM2U9IDApIHtcXG41ODkzOlxcdFxcdFxcdC8qXFxuNTg5NDpcXHRcXHRcXHQgKiBXZSBkb24ndCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxcbjU4OTU6XFx0XFx0XFx0ICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZVxcbjU4OTY6XFx0XFx0XFx0ICogZGlzdGFuY2UgZ3JvdXAgdG8gbWFrZSBpdCByb3VuZC1yb2Jpbi5cXG41ODk3OlxcdFxcdFxcdCAqL1xcbjU4OTg6XFx0XFx0XFx0aWYgKG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgbm9kZSkgIT1cXG41ODk5OlxcdFxcdFxcdCAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpXFxuNTkwMDpcXHRcXHRcXHRcXHRub2RlX2xvYWRbbm9kZV0gKz0gMTtcXG41OTAxOlxcdFxcbjU5MDI6XFx0XFx0XFx0em9uZXJlZnMgKz0gYnVpbGRfem9uZXJlZnNfbm9kZShOT0RFX0RBVEEobm9kZSksIHpvbmVyZWZzKTtcXG41OTAzOlxcdFxcdFxcdHByX2NvbnQoXFxcIiVkIFxcXCIsIG5vZGUpO1xcbjU5MDQ6XFx0XFx0XFx0cHJldl9ub2RlID0gbm9kZTtcXG41OTA1OlxcdFxcdH1cXG41OTA2OlxcdFxcbjU5MDc6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbjU5MDg6XFx0XFx0em9uZXJlZnMtXFx1MDAzZXpvbmVfaWR4ID0gMDtcXG41OTA5OlxcdFxcdHByX2NvbnQoXFxcIlxcXFxuXFxcIik7XFxuNTkxMDpcXHR9XFxuNTkxMTpcXHRcXG41OTEyOlxcdHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxcbjU5MTM6XFx0e1xcbjU5MTQ6XFx0XFx0YnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgXFx1MDAyNm5vZGVfc3RhdGVzW05fTUVNT1JZXSwgWk9ORUxJU1RfRkFMTEJBQ0spO1xcbjU5MTU6XFx0XFx0YnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTtcXG41OTE2OlxcdH1cXG41OTE3OlxcdFxcbjU5MTg6XFx0I2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcXG41OTE5OlxcdC8qXFxuNTkyMDpcXHQgKiBSZXR1cm4gbm9kZSBpZCBvZiBub2RlIHVzZWQgZm9yIFxcXCJsb2NhbFxcXCIgYWxsb2NhdGlvbnMuXFxuNTkyMTpcXHQgKiBJLmUuLCBmaXJzdCBub2RlIGlkIG9mIGZpcnN0IHpvbmUgaW4gYXJnIG5vZGUncyBnZW5lcmljIHpvbmVsaXN0LlxcbjU5MjI6XFx0ICogVXNlZCBmb3IgaW5pdGlhbGl6aW5nIHBlcmNwdSAnbnVtYV9tZW0nLCB3aGljaCBpcyB1c2VkIHByaW1hcmlseVxcbjU5MjM6XFx0ICogZm9yIGtlcm5lbCBhbGxvY2F0aW9ucywgc28gdXNlIEdGUF9LRVJORUwgZmxhZ3MgdG8gbG9jYXRlIHpvbmVsaXN0LlxcbjU5MjQ6XFx0ICovXFxuNTkyNTpcXHRpbnQgbG9jYWxfbWVtb3J5X25vZGUoaW50IG5vZGUpXFxuNTkyNjpcXHR7XFxuNTkyNzpcXHRcXHRzdHJ1Y3Qgem9uZXJlZiAqejtcXG41OTI4OlxcdFxcbjU5Mjk6XFx0XFx0eiA9IGZpcnN0X3pvbmVzX3pvbmVsaXN0KG5vZGVfem9uZWxpc3Qobm9kZSwgR0ZQX0tFUk5FTCksXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDAzOjM4OjU4LjM0NDUwNjQ3NVoiLCJTZXEiOjU3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MTM3ODY3MDE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFRoaXMgUGF0Y2ggaXMgU2FmZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgcmlnaHQ/IERvZXMgdGhpcyBwYXRjaCBpbnRyb2R1Y2UgYSByaXNrIHRoZXJlPyBJJ3ZlIGdvbmUgdGhyb3VnaCBpdCBzdGVwIGJ5IHN0ZXAuIEZpcnN0LCBJIGNoZWNrZWQ6IGRvZXMgYW55IGtlcm5lbCBtZW1vcnkgbGVhayBpbnRvIHVzZXIgc3BhY2U/IE5vcGUsIG5vdGhpbmcncyBjb3BpZWQgb3V0LiBBcmUgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgc3RydWN0cyBvciBidWZmZXJzIGNyZWF0ZWQgb3IgcGFzc2VkIGFyb3VuZD8gQWdhaW4sIG5vLiBUaGUgYGNhbmRpZGF0ZXNgIHBhcmFtZXRlciBpcyBhIGBjb25zdCBub2RlbWFza190YCwgcG9pbnRpbmcgdG8gYSBnbG9iYWwga2VybmVsIHZhcmlhYmxlLCBzbyB0aGF0J3MgY292ZXJlZC4gSW5zaWRlIHRoZSByZWxldmFudCBmdW5jdGlvbnMgbGlrZSBgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbmAgYW5kIGBidWlsZF9ub2RlX3pvbmVsaXN0YCwgSSBzZWUgYml0d2lzZSBvcGVyYXRpb25zIG9uIGBjYW5kaWRhdGVzYCBhbmQgaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBObyByZWQgZmxhZ3MgdGhlcmUuXG5cblRoZW4sIEkgbG9va2VkIGF0IGFsbG9jYXRpb25zLiBJcyB0aGlzIGludHJvZHVjaW5nIG5ldyBvbmVzLCBzdGFjayBvciBoZWFwPyBObywgYWN0dWFsbHksIGl0ICpyZW1vdmVkKiBhbGxvY2F0aW9ucyEgVGhhdCdzIGEgZ29vZCBzaWduLiBBbmQgbm8gY2hhbmdlcyB0byBhbnkgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGxpa2UgaW9jdGwsIG5ldGxpbmssIG9yIHN5c2NhbGxzLiBUaGlzIGlzIGFsbCBpbnRlcm5hbCBOVU1BIG1lbW9yeSBhbGxvY2F0aW9uIGxvZ2ljLlxuXG5TbywgYW0gSSBzZWVpbmcgKmFueSogdW5pbml0aWFsaXplZCBtZW1vcnkgYnVncyB0aGF0IEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoPyBOby4gQW55IGJ1Z3MgaGVyZSB3b3VsZCBiZSBsb2dpY2FsIGVycm9ycywgb3V0LW9mLWJvdW5kcyB6b25lcmVmIGFjY2Vzcywgd2hpY2ggS0FTQU4gd291bGQgY2F0Y2gsIG9yIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wcywgd2hpY2ggYXJlIG5vdCByZWxldmFudCB0byBLTVNBTi5cblxuVGhlcmVmb3JlLCBubyBLTVNBTiBpcyBuZWVkZWQgaGVyZS4gS0FTQU4gaXMgc3VmZmljaWVudCB0byBjYXRjaCBtZW1vcnkgY29ycnVwdGlvbiBvciBib3VuZGFyeSBpc3N1ZXMgdGhhdCBtaWdodCBhcmlzZS5cblxuTm93LCBsZXQgbWUgZG91YmxlLWNoZWNrIGFnYWluc3QgdGhlIGNyaXRlcmlhOiBUaGUgcmVxdWlyZW1lbnRzIHN0YXRlIHRoYXQgS01TQU4gaXNuJ3QgbmVlZGVkIGlmIHRoZSBwcmltYXJ5IHJpc2tzIGFyZSBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3ZlcmZsb3dzLCBudWxsIGRlcmVmZXJlbmNlcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAod2hpY2ggYXJlIEtBU0FOJ3MgZG9tYWluKSwgb3IgaWYgYWxsIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkLiBBbGwgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBJdCBhbHNvIHN0YXRlcyB0aGUgcGF0Y2ggbXVzdCBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IG9yIGluZm8tbGVha3MsIGFuZCBpdCBkb2Vzbid0LlxuXG5TbywgTmVlZHNLTVNBTiA9IGZhbHNlLiBDYXNlIGNsb3NlZC4gSSdtIHJlYWR5IHRvIHdyaXRlIHVwIHRoZSByZWFzb25pbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg3OTAsIk91dHB1dFRva2VucyI6MjA5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTY3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDM6Mzk6MDMuNDgyMzc1NTkyWiIsIlNlcSI6NTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgTlVNQSB6b25lbGlzdCBnZW5lcmF0aW9uIGFuZCBub2RlIGZhbGxiYWNrIGNhbGN1bGF0aW9uIGJ5IGludHJvZHVjaW5nIGBmaW5kX25leHRfYmVzdF9ub2RlX2luKClgIHdpdGggYSBgY2FuZGlkYXRlc2Agbm9kZW1hc2sgcGFyYW1ldGVyIGFuZCBtZXJnaW5nIGBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcigpYCBpbnRvIGBidWlsZF9ub2RlX3pvbmVsaXN0KClgLlxcblxcbi0gTm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIChubyBpbmZvLWxlYWtzKS5cXG4tIE5vIG5ldyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGludHJvZHVjZWQuXFxuLSBBbGwgdmFyaWFibGVzIChzdWNoIGFzIGB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORWApIGFuZCB6b25lcmVmIHRlcm1pbmF0aW9ucyAoYHpvbmVyZWZzLVxcdTAwM2V6b25lID0gTlVMTGAsIGB6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwYCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLlxcbi0gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHpvbmVsaXN0IGluZGV4aW5nIG9yIHRyYXZlcnNhbCB3b3VsZCBiZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHBvaW50ZXIgZXJyb3JzLCB3aGljaCBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gS01TQU4gdW5pbml0aWFsaXplZCBtZW1vcnkgZGV0ZWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBOVU1BIHpvbmVsaXN0IGdlbmVyYXRpb24gYW5kIG5vZGUgZmFsbGJhY2sgY2FsY3VsYXRpb24gYnkgaW50cm9kdWNpbmcgYGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oKWAgd2l0aCBhIGBjYW5kaWRhdGVzYCBub2RlbWFzayBwYXJhbWV0ZXIgYW5kIG1lcmdpbmcgYGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKClgIGludG8gYGJ1aWxkX25vZGVfem9uZWxpc3QoKWAuXFxuXFxuLSBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UgKG5vIGluZm8tbGVha3MpLlxcbi0gTm8gbmV3IGhlYXAgb3Igc3RhY2sgYWxsb2NhdGlvbnMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG4tIEFsbCB2YXJpYWJsZXMgKHN1Y2ggYXMgYHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FYCkgYW5kIHpvbmVyZWYgdGVybWluYXRpb25zIChgem9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMYCwgYHpvbmVyZWZzLVxcdTAwM2V6b25lX2lkeCA9IDBgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuXFxuLSBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludHJvZHVjZWQgYnkgem9uZWxpc3QgaW5kZXhpbmcgb3IgdHJhdmVyc2FsIHdvdWxkIGJlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgcG9pbnRlciBlcnJvcnMsIHdoaWNoIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBLTVNBTiB1bmluaXRpYWxpemVkIG1lbW9yeSBkZXRlY3Rpb24gaXMgbm90IGFwcGxpY2FibGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowdkt2m[1] Phase: Succeeded StartedAt: 2026-09-12 03:39:14 +0000 UTC FinishedAt: 2026-09-12 03:39:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-12 03:39:14 +0000 UTC FinishedAt: 2026-09-12 03:39:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2] Phase: Succeeded StartedAt: 2026-09-12 03:39:14 +0000 UTC FinishedAt: 2026-09-12 08:21:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-12 03:39:14 +0000 UTC FinishedAt: 2026-09-12 08:21:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-12 03:39:14 +0000 UTC FinishedAt: 2026-09-12 03:39:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-12 03:39:14 +0000 UTC FinishedAt: 2026-09-12 03:39:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowdkt2m/series-workflowdkt2m-convert-artifact-2332830901/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-12 03:39:24 +0000 UTC FinishedAt: 2026-09-12 03:55:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-12 03:39:24 +0000 UTC FinishedAt: 2026-09-12 03:55:34 +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:*a052257b-bd73-477e-8d75-6e9e0be372db,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-workflowdkt2m/series-workflowdkt2m-convert-artifact-2332830901/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": "26dae47e-5bfc-4035-8188-e00350469ecf", "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-workflowdkt2m/series-workflowdkt2m-build-action-3766085787/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-12 03:39:24 +0000 UTC FinishedAt: 2026-09-12 03:55:24 +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:*a052257b-bd73-477e-8d75-6e9e0be372db,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-workflowdkt2m/series-workflowdkt2m-convert-artifact-2332830901/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": "26dae47e-5bfc-4035-8188-e00350469ecf", "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-workflowdkt2m/series-workflowdkt2m-build-action-3766085787/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-12 03:55:34 +0000 UTC FinishedAt: 2026-09-12 03:55:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-12 03:55:34 +0000 UTC FinishedAt: 2026-09-12 03:55:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-12 03:55:34 +0000 UTC FinishedAt: 2026-09-12 03:55:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-12 03:55:34 +0000 UTC FinishedAt: 2026-09-12 03:55:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowdkt2m/series-workflowdkt2m-convert-artifact-1310453520/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-12 03:55:44 +0000 UTC FinishedAt: 2026-09-12 03:57:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-12 03:55:44 +0000 UTC FinishedAt: 2026-09-12 03:57:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*26dae47e-5bfc-4035-8188-e00350469ecf,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-workflowdkt2m/series-workflowdkt2m-build-action-3766085787/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-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-12 03:57:50 +0000 UTC FinishedAt: 2026-09-12 03:57:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-12 03:57:50 +0000 UTC FinishedAt: 2026-09-12 03:57:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-12 03:57:50 +0000 UTC FinishedAt: 2026-09-12 04:14:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-12 03:57:50 +0000 UTC FinishedAt: 2026-09-12 04:14:14 +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:*a052257b-bd73-477e-8d75-6e9e0be372db,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-workflowdkt2m/series-workflowdkt2m-convert-artifact-1310453520/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": "cc1c29e9-23b8-41e0-a85c-54b8c62c6628", "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-workflowdkt2m/series-workflowdkt2m-build-action-1621224332/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-12 03:57:50 +0000 UTC FinishedAt: 2026-09-12 04:14:04 +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:*a052257b-bd73-477e-8d75-6e9e0be372db,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-workflowdkt2m/series-workflowdkt2m-convert-artifact-1310453520/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": "cc1c29e9-23b8-41e0-a85c-54b8c62c6628", "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-workflowdkt2m/series-workflowdkt2m-build-action-1621224332/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-12 04:14:14 +0000 UTC FinishedAt: 2026-09-12 04:14:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-12 04:14:14 +0000 UTC FinishedAt: 2026-09-12 04:14:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-12 04:14:14 +0000 UTC FinishedAt: 2026-09-12 04:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-12 04:14:14 +0000 UTC FinishedAt: 2026-09-12 04:15:57 +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:*cc1c29e9-23b8-41e0-a85c-54b8c62c6628,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-workflowdkt2m/series-workflowdkt2m-build-action-1621224332/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-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-12 04:16:07 +0000 UTC FinishedAt: 2026-09-12 08:21:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-12 04:16:07 +0000 UTC FinishedAt: 2026-09-12 08:21:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"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:*26dae47e-5bfc-4035-8188-e00350469ecf,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*cc1c29e9-23b8-41e0-a85c-54b8c62c6628,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-workflowdkt2m/series-workflowdkt2m-build-action-3766085787/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-workflowdkt2m/series-workflowdkt2m-build-action-1621224332/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-12 04:16:07 +0000 UTC FinishedAt: 2026-09-12 04:16:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-12 04:16:07 +0000 UTC FinishedAt: 2026-09-12 04:16:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"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-workflowdkt2m/series-workflowdkt2m-convert-artifact-1321056777/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-12 04:16:07 +0000 UTC FinishedAt: 2026-09-12 04:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-12 04:16:07 +0000 UTC FinishedAt: 2026-09-12 04:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-12 04:16:07 +0000 UTC FinishedAt: 2026-09-12 04:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-12 04:16:18 +0000 UTC FinishedAt: 2026-09-12 08:21:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdkt2m[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"9958290885035431e2494159f555e332c3c14906","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["find_next_best_node_in","next_demotion_node","build_all_zonelists"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9958290885035431e2494159f555e332c3c14906","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION"],"series_id":"880eb61a-dcbe-485a-bba5-7d4b6b00bae6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-12 04:16:18 +0000 UTC FinishedAt: 2026-09-12 08:21:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*26dae47e-5bfc-4035-8188-e00350469ecf,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*cc1c29e9-23b8-41e0-a85c-54b8c62c6628,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-workflowdkt2m/series-workflowdkt2m-build-action-3766085787/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-workflowdkt2m/series-workflowdkt2m-build-action-1621224332/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-workflowdkt2m/series-workflowdkt2m-convert-artifact-1321056777/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,}