Name: series-workflowmcc9v Phase: Succeeded StartedAt: 2026-08-08 00:48:45 +0000 UTC FinishedAt: 2026-08-08 04:36:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[0] Phase: Succeeded StartedAt: 2026-08-08 00:48:45 +0000 UTC FinishedAt: 2026-08-08 00:53:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[0].run-triage Phase: Succeeded StartedAt: 2026-08-08 00:48:45 +0000 UTC FinishedAt: 2026-08-08 00:53:08 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HSR" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HSR" ], "series_id": "7702a22c-a562-4665-a5a8-5bcef03032b2" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "hsr_forward_skb", "hsr_create_tagged_frame", "prp_create_tagged_frame" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hTUiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2hzcl9mb3J3YXJkX3NrYiYjMzQ7LAogICAgJiMzNDtoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7LAogICAgJiMzNDtwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMWM4NjBiNDQ1NDZkNDQyOTZlZDkxYmNjNWQ4Nzc5NTg5ZDVlMGM4MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDggMDA6NTE6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2hzci9oc3JfZm9yd2FyZC5jIGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG5pbmRleCAwNzc0OTgxYTY1YzE2Li5lZmNiZjNjZjI2ZjliIDEwMDY0NFxuLS0tIGEvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvaHNyL2hzcl9mb3J3YXJkLmNcbkBAIC0zMjUsOCAmIzQzOzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHNrYjtcbiB9XG4gXG4tLyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCBqdXN0IGNsb25lIGl0IHRvIGJlIHNlbnRcbi0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJiMzOTtwb3J0JiMzOTsuXG4mIzQzOy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUmIzM5O3MgZGF0YSBwcml2YXRlLCBzbyB0aGF0IHBlci1lZ3Jlc3NcbiYjNDM7ICogd3JpdGVzIGNhbm5vdCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LlxuJiM0MzsgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfY2xvbmVfcHJpdmF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNrX2J1ZmYgKmNsb25lO1xuJiM0MztcbiYjNDM7XHRjbG9uZSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpO1xuJiM0MztcdGlmICghY2xvbmUpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHtcbiYjNDM7XHRcdGtmcmVlX3NrYihjbG9uZSk7XG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBjbG9uZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCByZXR1cm4gYSBwcml2YXRlIGNsb25lXG4mIzQzOyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJiMzOTtwb3J0JiMzOTsuIE90aGVyd2lzZSwgcmV0dXJuIGEgcHJpdmF0ZVxuJiM0MzsgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XG4mIzQzOyAqIHRhZ2dlZCBmb3IgJiMzOTtwb3J0JiMzOTsuXG4gICovXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbkBAIC0zMzYsMTQgJiM0MzszNTcsMTggQEAgc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRpbnQgbW92ZWxlbjtcbiBcbiBcdGlmIChmcmFtZS1cdTAwM2Vza2JfaHNyKSB7XG4tXHRcdHN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyID1cbi1cdFx0XHQoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihmcmFtZS1cdTAwM2Vza2JfaHNyKTtcbiYjNDM7XHRcdHN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyO1xuJiM0MztcbiYjNDM7XHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9oc3IpO1xuJiM0MztcdFx0aWYgKCFza2IpXG4mIzQzO1x0XHRcdHJldHVybiBOVUxMO1xuIFxuIFx0XHQvKiBzZXQgdGhlIGxhbmUgaWQgcHJvcGVybHkgKi9cbiYjNDM7XHRcdGhzcl9ldGhoZHIgPSAoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpO1xuIFx0XHRoc3Jfc2V0X3BhdGhfaWQoZnJhbWUsIGhzcl9ldGhoZHIsIHBvcnQpO1xuLVx0XHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVx1MDAzZXNrYl9oc3IsIEdGUF9BVE9NSUMpO1xuJiM0MztcdFx0cmV0dXJuIHNrYjtcbiBcdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcbiYjNDM7XHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbiBcdH1cbiBcbiBcdC8qIENyZWF0ZSB0aGUgbmV3IHNrYiB3aXRoIGVub3VnaCBoZWFkcm9vbSB0byBmaXQgdGhlIEhTUiB0YWcgKi9cbkBAIC0zNzcsMTcgJiM0Mzs0MDIsMjMgQEAgc3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuIFxuIFx0aWYgKGZyYW1lLVx1MDAzZXNrYl9wcnApIHtcbi1cdFx0c3RydWN0IHBycF9yY3QgKnRyYWlsZXIgPSBza2JfZ2V0X1BSUF9yY3QoZnJhbWUtXHUwMDNlc2tiX3BycCk7XG4mIzQzO1x0XHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlcjtcbiYjNDM7XG4mIzQzO1x0XHRza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2JfcHJwKTtcbiYjNDM7XHRcdGlmICghc2tiKVxuJiM0MztcdFx0XHRyZXR1cm4gTlVMTDtcbiBcbiYjNDM7XHRcdHRyYWlsZXIgPSBza2JfZ2V0X1BSUF9yY3Qoc2tiKTtcbiBcdFx0aWYgKHRyYWlsZXIpIHtcbiBcdFx0XHRwcnBfc2V0X2xhbl9pZCh0cmFpbGVyLCBwb3J0KTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRXQVJOX09OQ0UoIXRyYWlsZXIsIFwmIzM0O2Vycm9yZWQgUFJQIHNrYlwmIzM0Oyk7XG4mIzQzO1x0XHRcdGtmcmVlX3NrYihza2IpO1xuIFx0XHRcdHJldHVybiBOVUxMO1xuIFx0XHR9XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX3BycCwgR0ZQX0FUT01JQyk7XG4mIzQzO1x0XHRyZXR1cm4gc2tiO1xuIFx0fSBlbHNlIGlmIChwb3J0LVx1MDAzZWRldi1cdTAwM2VmZWF0dXJlcyBcdTAwMjYgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykge1xuLVx0XHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVx1MDAzZXNrYl9zdGQsIEdGUF9BVE9NSUMpO1xuJiM0MztcdFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9zdGQpO1xuIFx0fVxuIFxuIFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKGZyYW1lLVx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cdTAwM2Vza2Jfc3RkKSxcbkBAIC00MjAsNiAmIzQzOzQ1MSwyMiBAQCBzdGF0aWMgdm9pZCBoc3JfZGVsaXZlcl9tYXN0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiBzdGF0aWMgaW50IGhzcl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoc3JfcG9ydCAqcG9ydCxcbiBcdFx0ICAgIHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXG4ge1xuJiM0MztcdC8qIEFuIGludGVybGluay1ib3VuZCBza2IgZnJvbSBnZXRfdW50YWdnZWRfZnJhbWUoKSBjYW4gc3RpbGwgYWxpYXNcbiYjNDM7XHQgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lXG4mIzQzO1x0ICogc2hhcmVzIHRoZSBvcmlnaW5hbCBUWCBza2IgKHdoaWNoIHRhcHMgb3IgdGhlIFRYIHBhdGggbWF5IHN0aWxsXG4mIzQzO1x0ICogaG9sZCk7IGZvciByaW5nIGZyYW1lcyB0aGUgbWFzdGVyIGFsc28gY29uc3VtZXMgdGhlbSB3aGVuIHRoZXlcbiYjNDM7XHQgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuXG4mIzQzO1x0ICogUHJpdmF0aXplIGJlZm9yZSBhbnkgYWRkcmVzcyBtdXRhdGlvbi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChmcmFtZS1cdTAwM2Vwb3J0X3Jjdi1cdTAwM2V0eXBlID09IEhTUl9QVF9NQVNURVIgfHxcbiYjNDM7XHQgICAgIChmcmFtZS1cdTAwM2Vpc19sb2NhbF9kZXN0IFx1MDAyNlx1MDAyNiAhZnJhbWUtXHUwMDNlaXNfbG9jYWxfZXhjbHVzaXZlKSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHNrYl9jb3coc2tiLCAwKSkge1xuJiM0MztcdFx0ZnJhbWUtXHUwMDNlcG9ydF9yY3YtXHUwMDNlZGV2LVx1MDAzZXN0YXRzLnJ4X2Ryb3BwZWQmIzQzOyYjNDM7O1xuJiM0MztcdFx0a2ZyZWVfc2tiKHNrYik7XG4mIzQzO1x0XHRyZXR1cm4gTkVUX1hNSVRfRFJPUDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGZyYW1lLVx1MDAzZXBvcnRfcmN2LVx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUikge1xuIFx0XHRoc3JfYWRkcl9zdWJzdF9kZXN0KGZyYW1lLVx1MDAzZW5vZGVfc3JjLCBza2IsIHBvcnQpO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG5pbmRleCAzMWZiOTMyNmNmNTMzLi44N2ZlMzQ5NTFiOGIwIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxuQEAgLTUsNiAmIzQzOzUsNyBAQCB0b3Bfc3JjZGlyID0gLi4vLi4vLi4vLi4vLi5cbiBURVNUX1BST0dTIDo9IFxcXG4gXHRoc3JfcGluZy5zaCBcXFxuIFx0aHNyX3JlZGJveC5zaCBcXFxuJiM0MztcdGhzcl9zaGFyZWRfbXV0YXRpb24uc2ggXFxcbiBcdGxpbmtfZmF1bHRzLnNoIFxcXG4gXHRwcnBfcGluZy5zaCBcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbm5ldyBmaWxlIG1vZGUgMTAwNzU1XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbkBAIC0wLDAgJiM0MzsxLDI0MiBAQFxuJiM0MzsjIS9iaW4vYmFzaFxuJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNcbiYjNDM7IyBWZXJpZnkgdGhhdCBwZXItZWdyZXNzIG11dGF0aW9ucyBvZiBzaGFyZWQgc2tiIGRhdGEgYXJlIHByaXZhdGU6XG4mIzQzOyNcbiYjNDM7IyBGMiAocGF0aC9MQU4gSUQpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgdGhlIHNlY29uZCBzbGF2ZSYjMzk7cyBMQU4tSUQgd3JpdGVcbiYjNDM7IyBsYW5kcyBpbiB0aGUgZmlyc3Qgc2xhdmUmIzM5O3Mgc3RpbGwtcXVldWVkIGNsb25lOyB3aXRoIGEgbmV0ZW0gZGVsYXkgb25cbiYjNDM7IyBzbGF2ZSBBLCBpbmplY3RlZCBmcmFtZXMgbGVhdmUgQSBjYXJyeWluZyBCJiMzOTtzIExBTiBJRC5cbiYjNDM7I1xuJiM0MzsjIEYxIChSZWRCb3ggc291cmNlIE1BQyk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCBhbiBIU1ItdGFnZ2VkIG11bHRpY2FzdFxuJiM0MzsjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssXG4mIzQzOyMgYW5kIHRoZSBpbnRlcmxpbmsmIzM5O3MgUmVkQm94LU1BQyByZXdyaXRlIGxhbmRzIGluIHRoZSBtYXN0ZXIgY2xvbmUmIzM5O3NcbiYjNDM7IyBidWZmZXIsIHNvIHRoZSBsb2NhbCBzdGFjayByZWNlaXZlcyB0aGUgUmVkQm94IE1BQyBpbnN0ZWFkIG9mIHRoZVxuJiM0MzsjIG9yaWdpbmF0aW5nIG5vZGUmIzM5O3MgTUFDLlxuJiM0MztcbiYjNDM7aXB2Nj1mYWxzZVxuJiM0MztcbiYjNDM7c291cmNlIC4vaHNyX2NvbW1vbi5zaFxuJiM0MztcbiYjNDM7RFVSPTVcbiYjNDM7XG4mIzQzO3JlcXVpcmUoKVxuJiM0Mzt7XG4mIzQzO1x0Y29tbWFuZCAtdiBcJiMzNDskMVwmIzM0OyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjEgXHUwMDI2XHUwMDI2IHJldHVybiAwXG4mIzQzO1x0ZWNobyBcJiMzNDtTS0lQOiAkMSBub3QgYXZhaWxhYmxlXCYjMzQ7XG4mIzQzO1x0ZXhpdCAka3NmdF9za2lwXG4mIzQzO31cbiYjNDM7XG4mIzQzO3JlcXVpcmUgaXBcbiYjNDM7cmVxdWlyZSB0Y1xuJiM0MztyZXF1aXJlIHB5dGhvbjNcbiYjNDM7XG4mIzQzO3RyYXAgY2xlYW51cF9hbGxfbnMgRVhJVFxuJiM0MztcbiYjNDM7IyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEYyOiBMQU4tSUQgaXNvbGF0aW9uXG4mIzQzOyMgUFJQIERBTlAgKHByb3RvIDEpLCBBRl9QQUNLRVQgcHJlLXRhZ2dlZCBpbmplY3Rpb24sIG5ldGVtIG9uIHNsYXZlIEEuXG4mIzQzO3J1bl9mMigpXG4mIzQzO3tcbiYjNDM7XHRzZXR1cF9ucyBucyAyXHUwMDNlL2Rldi9udWxsIHx8IHJldHVybiAka3NmdF9za2lwXG4mIzQzO1x0bnN4KCkgeyBpcCBuZXRucyBleGVjIFwmIzM0OyRuc1wmIzM0OyBcJiMzNDskQFwmIzM0OzsgfVxuJiM0MztcbiYjNDM7XHQjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuXG4mIzQzO1x0aWYgISBuc3ggdGMgcWRpc2MgYWRkIGRldiBsbyByb290IG5ldGVtIGRlbGF5IDFtcyAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4mIzQzO1x0XHRlY2hvIFwmIzM0O1NLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXCYjMzQ7XG4mIzQzO1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuJiM0MztcdGZpXG4mIzQzO1x0bnN4IHRjIHFkaXNjIGRlbCBkZXYgbG8gcm9vdCAyXHUwMDNlL2Rldi9udWxsXG4mIzQzO1xuJiM0MztcdCMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLlxuJiM0MztcdG5zeCBpcCBsaW5rIGFkZCB2QSB0eXBlIHZldGggcGVlciBuYW1lIHZBcCB8fFxuJiM0MztcdFx0eyBlY2hvIFwmIzM0O0ZBSUw6IHZldGggQVwmIzM0OzsgcmV0dXJuIDE7IH1cbiYjNDM7XHRuc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHxcbiYjNDM7XHRcdHsgZWNobyBcJiMzNDtGQUlMOiB2ZXRoIEJcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cbiYjNDM7XHRcdG5zeCBpcCBsaW5rIHNldCBcJiMzNDskaVwmIzM0OyB1cCB8fCB7IGVjaG8gXCYjMzQ7RkFJTDogJGkgdXBcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0ZG9uZVxuJiM0MztcdGlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgcHJwMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFxcXG4mIzQzO1x0XHRzdXBlcnZpc2lvbiA0NSBwcm90byAxIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbiYjNDM7XHRcdGVjaG8gXCYjMzQ7U0tJUDogSFNSL1BSUCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsXCYjMzQ7XG4mIzQzO1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuJiM0MztcdGZpXG4mIzQzO1x0bnN4IGlwIGxpbmsgc2V0IHBycDAgdXAgfHwgeyBlY2hvIFwmIzM0O0ZBSUw6IHBycDAgdXBcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0bnN4IHRjIHFkaXNjIGFkZCBkZXYgdkEgcm9vdCBuZXRlbSBkZWxheSAyMDBtcyB8fFxuJiM0MztcdFx0eyBlY2hvIFwmIzM0O0ZBSUw6IG5ldGVtXCYjMzQ7OyByZXR1cm4gMTsgfVxuJiM0MztcbiYjNDM7XHRuc3ggcHl0aG9uMyAvZGV2L3N0ZGluIFwmIzM0OyREVVJcJiMzNDsgXHUwMDNjXHUwMDNjJiMzOTtQWUYyJiMzOTtcbiYjNDM7aW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZVxuJiM0MztcbiYjNDM7ZHVyID0gaW50KHN5cy5hcmd2WzFdKVxuJiM0MztkZWYgbGFuaWQocGt0KTpcbiYjNDM7ICAgIGlmIGxlbihwa3QpIFx1MDAzYyAyMCBvciBwa3RbLTI6XSAhPSBiXCYjMzQ7XFx4ODhcXHhmYlwmIzM0OzpcbiYjNDM7ICAgICAgICByZXR1cm4gTm9uZVxuJiM0MzsgICAgcmV0dXJuIChwa3RbLTRdIFx1MDAzZVx1MDAzZSA0KSBcdTAwMjYgMHhGXG4mIzQzO1xuJiM0MztTUkMgPSBieXRlcy5mcm9taGV4KG9wZW4oXCYjMzQ7L3N5cy9jbGFzcy9uZXQvcHJwMC9hZGRyZXNzXCYjMzQ7KS5yZWFkKCkucmVwbGFjZShcJiMzNDs6XCYjMzQ7LCBcJiMzNDtcJiMzNDspKVxuJiM0MztEU1QgPSBieXRlcy5mcm9taGV4KFwmIzM0OzAyYWFiYmNjZGQwMVwmIzM0OylcbiYjNDM7UEFZID0gYnl0ZXMocmFuZ2UoNDYpKVxuJiM0MztyY3QwID0gc3RydWN0LnBhY2soXCYjMzQ7XHUwMDNlSFwmIzM0OywgMCkgJiM0Mzsgc3RydWN0LnBhY2soXCYjMzQ7XHUwMDNlSFwmIzM0OywgNTIgXHUwMDI2IDB4MEZGRikgJiM0MzsgYlwmIzM0O1xceDg4XFx4ZmJcJiMzNDtcbiYjNDM7ZnJhbWUgPSBEU1QgJiM0MzsgU1JDICYjNDM7IGJcJiMzNDtcXHgwOFxceDAwXCYjMzQ7ICYjNDM7IFBBWSAmIzQzOyByY3QwXG4mIzQzO1xuJiM0Mzt0eCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXKTsgdHguYmluZCgoXCYjMzQ7cHJwMFwmIzM0OywgMCkpXG4mIzQzO3NBID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4mIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4mIzQzO3NBLmJpbmQoKFwmIzM0O3ZBcFwmIzM0OywgMCkpXG4mIzQzO3NCID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4mIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4mIzQzO3NCLmJpbmQoKFwmIzM0O3ZCcFwmIzM0OywgMCkpXG4mIzQzO3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpXG4mIzQzO1xuJiM0MzthLCBiID0gW10sIFtdXG4mIzQzO1xuJiM0MztkZWYgbWF0Y2gocGt0KTpcbiYjNDM7ICAgIHJldHVybiAocGt0Wzo2XSA9PSBEU1QgYW5kIHBrdFs2OjEyXSA9PSBTUkNcbiYjNDM7ICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYlwmIzM0O1xceDA4XFx4MDBcJiMzNDsgYW5kIHBrdFsxNDoxNCAmIzQzOyBsZW4oUEFZKV0gPT0gUEFZKVxuJiM0MztcbiYjNDM7ZGVmIGRyYWluKHRpbWVvdXQpOlxuJiM0MzsgICAgd2FpdCA9IHRpbWVvdXRcbiYjNDM7ICAgIHdoaWxlIFRydWU6XG4mIzQzOyAgICAgICAgciwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3NBLCBzQl0sIFtdLCBbXSwgd2FpdClcbiYjNDM7ICAgICAgICBpZiBub3QgcjpcbiYjNDM7ICAgICAgICAgICAgcmV0dXJuXG4mIzQzOyAgICAgICAgZm9yIHMgaW4gcjpcbiYjNDM7ICAgICAgICAgICAgcGt0ID0gcy5yZWN2KDY1NTM1KVxuJiM0MzsgICAgICAgICAgICBpZiBub3QgbWF0Y2gocGt0KTpcbiYjNDM7ICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4mIzQzOyAgICAgICAgICAgIGxpZCA9IGxhbmlkKHBrdClcbiYjNDM7ICAgICAgICAgICAgaWYgbGlkIGlzIG5vdCBOb25lOlxuJiM0MzsgICAgICAgICAgICAgICAgKGEgaWYgcyBpcyBzQSBlbHNlIGIpLmFwcGVuZChsaWQpXG4mIzQzOyAgICAgICAgd2FpdCA9IDBcbiYjNDM7XG4mIzQzOyMgRHJhaW4gd2hpbGUgc2VuZGluZyBzbyB0aGUgYnVyc3QgY2Fubm90IG92ZXJmbG93IHRoZSBjYXB0dXJlIHNvY2tldHMmIzM5O1xuJiM0MzsjIHJlY2VpdmUgYnVmZmVyczsgdGhlIG5ldGVtLWRlbGF5ZWQgQS1zaWRlIGZyYW1lcyBhcnJpdmUgYWZ0ZXJ3YXJkcyBhbmRcbiYjNDM7IyBhcmUgY29sbGVjdGVkIGJlbG93LlxuJiM0Mztmb3IgXyBpbiByYW5nZSgyMDApOlxuJiM0MzsgICAgdHguc2VuZChmcmFtZSlcbiYjNDM7ICAgIGRyYWluKDApXG4mIzQzOyAgICB0aW1lLnNsZWVwKDAuMDAxKVxuJiM0MztcbiYjNDM7ZW5kID0gdGltZS50aW1lKCkgJiM0MzsgZHVyXG4mIzQzO3doaWxlIHRpbWUudGltZSgpIFx1MDAzYyBlbmQ6XG4mIzQzOyAgICBkcmFpbigwLjMpXG4mIzQzO1xuJiM0MztwcmludChcJiMzNDtBLXNpZGUgY291bnQ9JWQgbGFuIGlkcz0lc1wmIzM0OyAlIChsZW4oYSksIHNvcnRlZChzZXQoYSkpKSlcbiYjNDM7cHJpbnQoXCYjMzQ7Qi1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcJiMzNDsgJSAobGVuKGIpLCBzb3J0ZWQoc2V0KGIpKSkpXG4mIzQzO2lmIGxlbihhKSBcdTAwM2MgMTUwIG9yIGxlbihiKSBcdTAwM2MgMTUwOlxuJiM0MzsgICAgcHJpbnQoXCYjMzQ7RkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApXCYjMzQ7XG4mIzQzOyAgICAgICAgICAlIChsZW4oYSksIGxlbihiKSkpXG4mIzQzOyAgICBzeXMuZXhpdCgxKVxuJiM0MztiYWRfYSA9IFt4IGZvciB4IGluIGEgaWYgKHggXHUwMDI2IDEpICE9IDBdXG4mIzQzO2JhZF9iID0gW3ggZm9yIHggaW4gYiBpZiAoeCBcdTAwMjYgMSkgIT0gMV1cbiYjNDM7aWYgYmFkX2Egb3IgYmFkX2I6XG4mIzQzOyAgICBwcmludChcJiMzNDtGQUlMOiBzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbiAtIEE6ICVkLyVkIHdyb25nLWxhbixcJiMzNDtcbiYjNDM7ICAgICAgICAgIFwmIzM0OyBCOiAlZC8lZCB3cm9uZy1sYW5cJiMzNDtcbiYjNDM7ICAgICAgICAgICUgKGxlbihiYWRfYSksIGxlbihhKSwgbGVuKGJhZF9iKSwgbGVuKGIpKSlcbiYjNDM7ICAgIHN5cy5leGl0KDEpXG4mIzQzO3ByaW50KFwmIzM0O1BBU1M6IHBlci1lZ3Jlc3MgTEFOIElEcyBpc29sYXRlZCAoQSBhbGwgYml0MD0wLCBCIGFsbCBiaXQwPTEpXCYjMzQ7KVxuJiM0MztzeXMuZXhpdCgwKVxuJiM0MztQWUYyXG4mIzQzO31cbiYjNDM7XG4mIzQzOyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEYxOiBSZWRCb3ggc291cmNlLU1BQyBwcml2YWN5XG4mIzQzOyMgSFNSIFJlZEJveCAocHJvdG8gMCksIHRhZ2dlZCBtdWx0aWNhc3QgZnJvbSBhIHNsYXZlOiBtYXN0ZXIgbXVzdCBrZWVwXG4mIzQzOyMgdGhlIG5vZGUgTUFDLCBpbnRlcmxpbmsgbXVzdCBjYXJyeSB0aGUgUmVkQm94IE1BQy5cbiYjNDM7cnVuX2YxKClcbiYjNDM7e1xuJiM0MztcdHNldHVwX25zIG5zIDJcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcbiYjNDM7XHRuc3goKSB7IGlwIG5ldG5zIGV4ZWMgXCYjMzQ7JG5zXCYjMzQ7IFwmIzM0OyRAXCYjMzQ7OyB9XG4mIzQzO1xuJiM0MztcdG5zeCBpcCBsaW5rIGFkZCB2QSB0eXBlIHZldGggcGVlciBuYW1lIHZBcCB8fFxuJiM0MztcdFx0eyBlY2hvIFwmIzM0O0ZBSUw6IHZldGggQVwmIzM0OzsgcmV0dXJuIDE7IH1cbiYjNDM7XHRuc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHxcbiYjNDM7XHRcdHsgZWNobyBcJiMzNDtGQUlMOiB2ZXRoIEJcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0bnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8XG4mIzQzO1x0XHR7IGVjaG8gXCYjMzQ7RkFJTDogdmV0aCBJXCYjMzQ7OyByZXR1cm4gMTsgfVxuJiM0MztcdGZvciBpIGluIHZBIHZCIHZJIHZBcCB2QnAgdklwOyBkb1xuJiM0MztcdFx0bnN4IGlwIGxpbmsgc2V0IFwmIzM0OyRpXCYjMzQ7IHVwIHx8IHsgZWNobyBcJiMzNDtGQUlMOiAkaSB1cFwmIzM0OzsgcmV0dXJuIDE7IH1cbiYjNDM7XHRkb25lXG4mIzQzO1x0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBoc3IwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcbiYjNDM7XHRcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbiYjNDM7XHRcdGVjaG8gXCYjMzQ7U0tJUDogSFNSIFJlZEJveCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsXCYjMzQ7XG4mIzQzO1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuJiM0MztcdGZpXG4mIzQzO1x0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFwmIzM0O0ZBSUw6IGhzcjAgdXBcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1xuJiM0MztcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXHUwMDNjXHUwMDNjJiMzOTtQWUYxJiMzOTtcbiYjNDM7aW1wb3J0IHNvY2tldCwgc2VsZWN0LCBzeXMsIHRpbWVcbiYjNDM7XG4mIzQzO05PREUgID0gYnl0ZXMuZnJvbWhleChcJiMzNDswMjExMjIzMzQ0NTVcJiMzNDspXG4mIzQzO01DQVNUID0gYnl0ZXMuZnJvbWhleChcJiMzNDswMTAwNWUwMDAwMDFcJiMzNDspXG4mIzQzO1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKFwmIzM0Oy9zeXMvY2xhc3MvbmV0L3ZJL2FkZHJlc3NcJiMzNDspLnJlYWQoKS5yZXBsYWNlKFwmIzM0OzpcJiMzNDssIFwmIzM0O1wmIzM0OykpXG4mIzQzO1BBWSAgID0gYnl0ZXMocmFuZ2UoNDYpKVxuJiM0MztcbiYjNDM7ZGVmIGZyYW1lKHNlcSk6XG4mIzQzOyAgICAjIExTRFUgc2l6ZSA9IHBheWxvYWQgJiM0MzsgSFNSIHRhZyAoSFNSX0hMRU4pLCBhcyBoc3JfZmlsbF90YWcoKSBjb21wdXRlcyBpdFxuJiM0MzsgICAgdGFnID0gKCgoMSBcdTAwM2NcdTAwM2MgMTIpIHwgKGxlbihQQVkpICYjNDM7IDYpKS50b19ieXRlcygyLCBcJiMzNDtiaWdcJiMzNDspXG4mIzQzOyAgICAgICAgICAgJiM0Mzsgc2VxLnRvX2J5dGVzKDIsIFwmIzM0O2JpZ1wmIzM0OykgJiM0MzsgYlwmIzM0O1xceDA4XFx4MDBcJiMzNDspXG4mIzQzOyAgICByZXR1cm4gTUNBU1QgJiM0MzsgTk9ERSAmIzQzOyBiXCYjMzQ7XFx4ODlcXHgyZlwmIzM0OyAmIzQzOyB0YWcgJiM0MzsgUEFZXG4mIzQzO1xuJiM0Mzt0eCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXKTsgdHguYmluZCgoXCYjMzQ7dkFwXCYjMzQ7LCAwKSlcbiYjNDM7c20gPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyxcbiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSlcbiYjNDM7c20uYmluZCgoXCYjMzQ7aHNyMFwmIzM0OywgMCkpXG4mIzQzO3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4mIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4mIzQzO3NpLmJpbmQoKFwmIzM0O3ZJcFwmIzM0OywgMCkpXG4mIzQzO3NtLnNldGJsb2NraW5nKEZhbHNlKTsgc2kuc2V0YmxvY2tpbmcoRmFsc2UpXG4mIzQzO1xuJiM0Mztmb3IgaSBpbiByYW5nZSgzKTpcbiYjNDM7ICAgIHR4LnNlbmQoZnJhbWUoaSAmIzQzOyAxKSk7IHRpbWUuc2xlZXAoMC4wNSlcbiYjNDM7XG4mIzQzO21fc3JjID0gaV9zcmMgPSBOb25lXG4mIzQzO2VuZCA9IHRpbWUudGltZSgpICYjNDM7IDRcbiYjNDM7d2hpbGUgdGltZS50aW1lKCkgXHUwMDNjIGVuZCBhbmQgKG1fc3JjIGlzIE5vbmUgb3IgaV9zcmMgaXMgTm9uZSk6XG4mIzQzOyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpXG4mIzQzOyAgICBmb3IgcyBpbiByOlxuJiM0MzsgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSlcbiYjNDM7ICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7XG4mIzQzOyAgICAgICAgIyBoX3NvdXJjZSBpcyB0aGUgYXNzZXJ0ZWQgdmFsdWUgYW5kIG11c3QgTk9UIGJlIGZpbHRlcmVkIG9uXG4mIzQzOyAgICAgICAgaWYgKGxlbihwa3QpIFx1MDAzYyA2MCBvciBwa3RbOjZdICE9IE1DQVNUIG9yIHBrdFsxMjoxNF0gIT0gYlwmIzM0O1xceDA4XFx4MDBcJiMzNDtcbiYjNDM7ICAgICAgICAgICAgICAgIG9yIHBrdFsxNDoxNCAmIzQzOyBsZW4oUEFZKV0gIT0gUEFZKTpcbiYjNDM7ICAgICAgICAgICAgY29udGludWVcbiYjNDM7ICAgICAgICBpZiBzIGlzIHNtIGFuZCBtX3NyYyBpcyBOb25lOlxuJiM0MzsgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXVxuJiM0MzsgICAgICAgIGVsaWYgcyBpcyBzaSBhbmQgaV9zcmMgaXMgTm9uZTpcbiYjNDM7ICAgICAgICAgICAgaV9zcmMgPSBwa3RbNjoxMl1cbiYjNDM7XG4mIzQzO3ByaW50KFwmIzM0O21hc3RlciBoX3NvdXJjZSAgICA9XCYjMzQ7LCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXG4mIzQzO3ByaW50KFwmIzM0O25vZGUgTUFDICAgICAgICAgICA9XCYjMzQ7LCBOT0RFLmhleCgpKVxuJiM0MztwcmludChcJiMzNDtpbnRlcmxpbmsgaF9zb3VyY2UgPVwmIzM0OywgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKVxuJiM0MztwcmludChcJiMzNDtyZWRib3ggTUFDICAgICAgICAgPVwmIzM0OywgUkIuaGV4KCkpXG4mIzQzO2lmIGlfc3JjICE9IFJCOlxuJiM0MzsgICAgcHJpbnQoXCYjMzQ7RkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUNcJiMzNDspXG4mIzQzOyAgICBzeXMuZXhpdCgxKVxuJiM0MztpZiBtX3NyYyAhPSBOT0RFOlxuJiM0MzsgICAgcHJpbnQoXCYjMzQ7RkFJTDogbWFzdGVyIHJlY2VpdmVkICVzIGluc3RlYWQgb2YgdGhlIG5vZGUgTUFDIFwmIzM0O1xuJiM0MzsgICAgICAgICAgXCYjMzQ7KHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uKVwmIzM0O1xuJiM0MzsgICAgICAgICAgJSAobV9zcmMuaGV4KCkgaWYgbV9zcmMgZWxzZSBcJiMzNDtub3RoaW5nXCYjMzQ7KSlcbiYjNDM7ICAgIHN5cy5leGl0KDEpXG4mIzQzO3ByaW50KFwmIzM0O1BBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXCYjMzQ7KVxuJiM0MztzeXMuZXhpdCgwKVxuJiM0MztQWUYxXG4mIzQzO31cbiYjNDM7XG4mIzQzO3JjPTBcbiYjNDM7XG4mIzQzO3J1bl9mMlxuJiM0MztyZXQ9JD9cbiYjNDM7cmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcJiMzNDskcmNcJiMzNDsgXCYjMzQ7JHJldFwmIzM0OylcbiYjNDM7XG4mIzQzO3J1bl9mMVxuJiM0MztyZXQ9JD9cbiYjNDM7cmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcJiMzNDskcmNcJiMzNDsgXCYjMzQ7JHJldFwmIzM0OylcbiYjNDM7XG4mIzQzO2lmIFsgXCYjMzQ7JHJjXCYjMzQ7IC1lcSAwIF07IHRoZW5cbiYjNDM7XHRlY2hvIFwmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHBlci1lZ3Jlc3MgbXV0YXRpb24gaXNvbGF0aW9uIChGMSYjNDM7RjIpIFsgT0sgXVwmIzM0O1xuJiM0MztlbGlmIFsgXCYjMzQ7JHJjXCYjMzQ7IC1lcSBcJiMzNDska3NmdF9za2lwXCYjMzQ7IF07IHRoZW5cbiYjNDM7XHRlY2hvIFwmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHN1YnRlc3RzIHNraXBwZWQgKGNhcGFiaWxpdGllcyBtaXNzaW5nKVwmIzM0O1xuJiM0MztlbHNlXG4mIzQzO1x0ZWNobyBcJiMzNDtoc3Jfc2hhcmVkX211dGF0aW9uOiBwZXItZWdyZXNzIG11dGF0aW9uIGlzb2xhdGlvbiBbIEZBSUwgXVwmIzM0OyBcXFxuJiM0MztcdFx0XCYjMzQ7cmM9JHJjXCYjMzQ7IDFcdTAwM2VcdTAwMjYyXG4mIzQzO2ZpXG4mIzQzO2V4aXQgXCYjMzQ7JHJjXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hTUiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2hzcl9mb3J3YXJkX3NrYiYjMzQ7LAogICAgJiMzNDtoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7LAogICAgJiMzNDtwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAxYzg2MGI0NDU0NmQ0NDI5NmVkOTFiY2M1ZDg3Nzk1ODlkNWUwYzgwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL25ldC9oc3IvaHNyX2ZvcndhcmQuYyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuYwppbmRleCAwNzc0OTgxYTY1YzE2Li5lZmNiZjNjZjI2ZjliIDEwMDY0NAotLS0gYS9uZXQvaHNyL2hzcl9mb3J3YXJkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jCkBAIC0zMjUsOCAmIzQzOzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCXJldHVybiBza2I7CiB9CiAKLS8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwganVzdCBjbG9uZSBpdCB0byBiZSBzZW50Ci0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJiMzOTtwb3J0JiMzOTsuCiYjNDM7LyogQ2xvbmUgYW4gc2tiIGFuZCBtYWtlIHRoZSBjbG9uZSYjMzk7cyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzcwomIzQzOyAqIHdyaXRlcyBjYW5ub3QgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4KJiM0MzsgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBza19idWZmICpjbG9uZTsKJiM0MzsKJiM0MzsJY2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKJiM0MzsJaWYgKCFjbG9uZSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHsKJiM0MzsJCWtmcmVlX3NrYihjbG9uZSk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gY2xvbmU7CiYjNDM7fQomIzQzOwomIzQzOy8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwgcmV0dXJuIGEgcHJpdmF0ZSBjbG9uZQomIzQzOyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJiMzOTtwb3J0JiMzOTsuIE90aGVyd2lzZSwgcmV0dXJuIGEgcHJpdmF0ZQomIzQzOyAqIGNsb25lIGZvciBoYXJkd2FyZSB0YWcgaW5zZXJ0aW9uLCBvciBjcmVhdGUgYSBwcml2YXRlIGZyYW1lIGVzcGVjaWFsbHkKJiM0MzsgKiB0YWdnZWQgZm9yICYjMzk7cG9ydCYjMzk7LgogICovCiBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSwKIAkJCQkJc3RydWN0IGhzcl9wb3J0ICpwb3J0KQpAQCAtMzM2LDE0ICYjNDM7MzU3LDE4IEBAIHN0cnVjdCBza19idWZmICpoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLAogCWludCBtb3ZlbGVuOwogCiAJaWYgKGZyYW1lLSZndDtza2JfaHNyKSB7Ci0JCXN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyID0KLQkJCShzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKGZyYW1lLSZndDtza2JfaHNyKTsKJiM0MzsJCXN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyOwomIzQzOwomIzQzOwkJc2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtJmd0O3NrYl9oc3IpOwomIzQzOwkJaWYgKCFza2IpCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiAKIAkJLyogc2V0IHRoZSBsYW5lIGlkIHByb3Blcmx5ICovCiYjNDM7CQloc3JfZXRoaGRyID0gKHN0cnVjdCBoc3JfZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIAkJaHNyX3NldF9wYXRoX2lkKGZyYW1lLCBoc3JfZXRoaGRyLCBwb3J0KTsKLQkJcmV0dXJuIHNrYl9jbG9uZShmcmFtZS0mZ3Q7c2tiX2hzciwgR0ZQX0FUT01JQyk7CiYjNDM7CQlyZXR1cm4gc2tiOwogCX0gZWxzZSBpZiAocG9ydC0mZ3Q7ZGV2LSZndDtmZWF0dXJlcyAmYW1wOyBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7Ci0JCXJldHVybiBza2JfY2xvbmUoZnJhbWUtJmd0O3NrYl9zdGQsIEdGUF9BVE9NSUMpOwomIzQzOwkJcmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2Jfc3RkKTsKIAl9CiAKIAkvKiBDcmVhdGUgdGhlIG5ldyBza2Igd2l0aCBlbm91Z2ggaGVhZHJvb20gdG8gZml0IHRoZSBIU1IgdGFnICovCkBAIC0zNzcsMTcgJiM0Mzs0MDIsMjMgQEAgc3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsCiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWlmIChmcmFtZS0mZ3Q7c2tiX3BycCkgewotCQlzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS0mZ3Q7c2tiX3BycCk7CiYjNDM7CQlzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlcjsKJiM0MzsKJiM0MzsJCXNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2JfcHJwKTsKJiM0MzsJCWlmICghc2tiKQomIzQzOwkJCXJldHVybiBOVUxMOwogCiYjNDM7CQl0cmFpbGVyID0gc2tiX2dldF9QUlBfcmN0KHNrYik7CiAJCWlmICh0cmFpbGVyKSB7CiAJCQlwcnBfc2V0X2xhbl9pZCh0cmFpbGVyLCBwb3J0KTsKIAkJfSBlbHNlIHsKIAkJCVdBUk5fT05DRSghdHJhaWxlciwgJiMzNDtlcnJvcmVkIFBSUCBza2ImIzM0Oyk7CiYjNDM7CQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLSZndDtza2JfcHJwLCBHRlBfQVRPTUlDKTsKJiM0MzsJCXJldHVybiBza2I7CiAJfSBlbHNlIGlmIChwb3J0LSZndDtkZXYtJmd0O2ZlYXR1cmVzICZhbXA7IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHsKLQkJcmV0dXJuIHNrYl9jbG9uZShmcmFtZS0mZ3Q7c2tiX3N0ZCwgR0ZQX0FUT01JQyk7CiYjNDM7CQlyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtJmd0O3NrYl9zdGQpOwogCX0KIAogCXNrYiA9IHNrYl9jb3B5X2V4cGFuZChmcmFtZS0mZ3Q7c2tiX3N0ZCwgc2tiX2hlYWRyb29tKGZyYW1lLSZndDtza2Jfc3RkKSwKQEAgLTQyMCw2ICYjNDM7NDUxLDIyIEBAIHN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogc3RhdGljIGludCBoc3JfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQsCiAJCSAgICBzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lKQogewomIzQzOwkvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzCiYjNDM7CSAqIGFub3RoZXIgbGl2ZSBjb25zdW1lcjogZm9yIG1hc3Rlci1vcmlnaW5hdGVkIGZyYW1lcyB0aGUgY2xvbmUKJiM0MzsJICogc2hhcmVzIHRoZSBvcmlnaW5hbCBUWCBza2IgKHdoaWNoIHRhcHMgb3IgdGhlIFRYIHBhdGggbWF5IHN0aWxsCiYjNDM7CSAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5CiYjNDM7CSAqIGFyZSBkZXN0aW5lZCB0byB0aGUgbG9jYWwgbm9kZSB3aXRob3V0IGJlaW5nIGV4Y2x1c2l2ZSB0byBpdC4KJiM0MzsJICogUHJpdmF0aXplIGJlZm9yZSBhbnkgYWRkcmVzcyBtdXRhdGlvbi4KJiM0MzsJICovCiYjNDM7CWlmIChwb3J0LSZndDt0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgJmFtcDsmYW1wOwomIzQzOwkgICAgKGZyYW1lLSZndDtwb3J0X3Jjdi0mZ3Q7dHlwZSA9PSBIU1JfUFRfTUFTVEVSIHx8CiYjNDM7CSAgICAgKGZyYW1lLSZndDtpc19sb2NhbF9kZXN0ICZhbXA7JmFtcDsgIWZyYW1lLSZndDtpc19sb2NhbF9leGNsdXNpdmUpKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBza2JfY293KHNrYiwgMCkpIHsKJiM0MzsJCWZyYW1lLSZndDtwb3J0X3Jjdi0mZ3Q7ZGV2LSZndDtzdGF0cy5yeF9kcm9wcGVkJiM0MzsmIzQzOzsKJiM0MzsJCWtmcmVlX3NrYihza2IpOwomIzQzOwkJcmV0dXJuIE5FVF9YTUlUX0RST1A7CiYjNDM7CX0KJiM0MzsKIAlpZiAoZnJhbWUtJmd0O3BvcnRfcmN2LSZndDt0eXBlID09IEhTUl9QVF9NQVNURVIpIHsKIAkJaHNyX2FkZHJfc3Vic3RfZGVzdChmcmFtZS0mZ3Q7bm9kZV9zcmMsIHNrYiwgcG9ydCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlCmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZQpAQCAtNSw2ICYjNDM7NSw3IEBAIHRvcF9zcmNkaXIgPSAuLi8uLi8uLi8uLi8uLgogVEVTVF9QUk9HUyA6PSBcCiAJaHNyX3Bpbmcuc2ggXAogCWhzcl9yZWRib3guc2ggXAomIzQzOwloc3Jfc2hhcmVkX211dGF0aW9uLnNoIFwKIAlsaW5rX2ZhdWx0cy5zaCBcCiAJcHJwX3Bpbmcuc2ggXAogIyBlbmQgb2YgVEVTVF9QUk9HUwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAwMDAwMDAuLjBiOGI4NzkxMTkwZDEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2gKQEAgLTAsMCAmIzQzOzEsMjQyIEBACiYjNDM7IyEvYmluL2Jhc2gKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7IwomIzQzOyMgVmVyaWZ5IHRoYXQgcGVyLWVncmVzcyBtdXRhdGlvbnMgb2Ygc2hhcmVkIHNrYiBkYXRhIGFyZSBwcml2YXRlOgomIzQzOyMKJiM0MzsjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJiMzOTtzIExBTi1JRCB3cml0ZQomIzQzOyMgbGFuZHMgaW4gdGhlIGZpcnN0IHNsYXZlJiMzOTtzIHN0aWxsLXF1ZXVlZCBjbG9uZTsgd2l0aCBhIG5ldGVtIGRlbGF5IG9uCiYjNDM7IyBzbGF2ZSBBLCBpbmplY3RlZCBmcmFtZXMgbGVhdmUgQSBjYXJyeWluZyBCJiMzOTtzIExBTiBJRC4KJiM0MzsjCiYjNDM7IyBGMSAoUmVkQm94IHNvdXJjZSBNQUMpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgYW4gSFNSLXRhZ2dlZCBtdWx0aWNhc3QKJiM0MzsjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssCiYjNDM7IyBhbmQgdGhlIGludGVybGluayYjMzk7cyBSZWRCb3gtTUFDIHJld3JpdGUgbGFuZHMgaW4gdGhlIG1hc3RlciBjbG9uZSYjMzk7cwomIzQzOyMgYnVmZmVyLCBzbyB0aGUgbG9jYWwgc3RhY2sgcmVjZWl2ZXMgdGhlIFJlZEJveCBNQUMgaW5zdGVhZCBvZiB0aGUKJiM0MzsjIG9yaWdpbmF0aW5nIG5vZGUmIzM5O3MgTUFDLgomIzQzOwomIzQzO2lwdjY9ZmFsc2UKJiM0MzsKJiM0Mztzb3VyY2UgLi9oc3JfY29tbW9uLnNoCiYjNDM7CiYjNDM7RFVSPTUKJiM0MzsKJiM0MztyZXF1aXJlKCkKJiM0Mzt7CiYjNDM7CWNvbW1hbmQgLXYgJiMzNDskMSYjMzQ7ICZndDsvZGV2L251bGwgMiZndDsmYW1wOzEgJmFtcDsmYW1wOyByZXR1cm4gMAomIzQzOwllY2hvICYjMzQ7U0tJUDogJDEgbm90IGF2YWlsYWJsZSYjMzQ7CiYjNDM7CWV4aXQgJGtzZnRfc2tpcAomIzQzO30KJiM0MzsKJiM0MztyZXF1aXJlIGlwCiYjNDM7cmVxdWlyZSB0YwomIzQzO3JlcXVpcmUgcHl0aG9uMwomIzQzOwomIzQzO3RyYXAgY2xlYW51cF9hbGxfbnMgRVhJVAomIzQzOwomIzQzOyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGMjogTEFOLUlEIGlzb2xhdGlvbgomIzQzOyMgUFJQIERBTlAgKHByb3RvIDEpLCBBRl9QQUNLRVQgcHJlLXRhZ2dlZCBpbmplY3Rpb24sIG5ldGVtIG9uIHNsYXZlIEEuCiYjNDM7cnVuX2YyKCkKJiM0Mzt7CiYjNDM7CXNldHVwX25zIG5zIDImZ3Q7L2Rldi9udWxsIHx8IHJldHVybiAka3NmdF9za2lwCiYjNDM7CW5zeCgpIHsgaXAgbmV0bnMgZXhlYyAmIzM0OyRucyYjMzQ7ICYjMzQ7JEAmIzM0OzsgfQomIzQzOwomIzQzOwkjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuCiYjNDM7CWlmICEgbnN4IHRjIHFkaXNjIGFkZCBkZXYgbG8gcm9vdCBuZXRlbSBkZWxheSAxbXMgMiZndDsvZGV2L251bGw7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtTS0lQOiBzY2hfbmV0ZW0gbm90IGF2YWlsYWJsZSYjMzQ7CiYjNDM7CQlyZXR1cm4gJGtzZnRfc2tpcAomIzQzOwlmaQomIzQzOwluc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDImZ3Q7L2Rldi9udWxsCiYjNDM7CiYjNDM7CSMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLgomIzQzOwluc3ggaXAgbGluayBhZGQgdkEgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QXAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQiYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwlmb3IgaSBpbiB2QSB2QiB2QXAgdkJwOyBkbwomIzQzOwkJbnN4IGlwIGxpbmsgc2V0ICYjMzQ7JGkmIzM0OyB1cCB8fCB7IGVjaG8gJiMzNDtGQUlMOiAkaSB1cCYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwlkb25lCiYjNDM7CWlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgcHJwMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFwKJiM0MzsJCXN1cGVydmlzaW9uIDQ1IHByb3RvIDEgMiZndDsvZGV2L251bGw7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtTS0lQOiBIU1IvUFJQIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWwmIzM0OwomIzQzOwkJcmV0dXJuICRrc2Z0X3NraXAKJiM0MzsJZmkKJiM0MzsJbnN4IGlwIGxpbmsgc2V0IHBycDAgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogcHJwMCB1cCYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggdGMgcWRpc2MgYWRkIGRldiB2QSByb290IG5ldGVtIGRlbGF5IDIwMG1zIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiBuZXRlbSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwomIzQzOwluc3ggcHl0aG9uMyAvZGV2L3N0ZGluICYjMzQ7JERVUiYjMzQ7ICZsdDsmbHQ7JiMzOTtQWUYyJiMzOTsKJiM0MztpbXBvcnQgc29ja2V0LCBzdHJ1Y3QsIHNlbGVjdCwgc3lzLCB0aW1lCiYjNDM7CiYjNDM7ZHVyID0gaW50KHN5cy5hcmd2WzFdKQomIzQzO2RlZiBsYW5pZChwa3QpOgomIzQzOyAgICBpZiBsZW4ocGt0KSAmbHQ7IDIwIG9yIHBrdFstMjpdICE9IGImIzM0O1x4ODhceGZiJiMzNDs6CiYjNDM7ICAgICAgICByZXR1cm4gTm9uZQomIzQzOyAgICByZXR1cm4gKHBrdFstNF0gJmd0OyZndDsgNCkgJmFtcDsgMHhGCiYjNDM7CiYjNDM7U1JDID0gYnl0ZXMuZnJvbWhleChvcGVuKCYjMzQ7L3N5cy9jbGFzcy9uZXQvcHJwMC9hZGRyZXNzJiMzNDspLnJlYWQoKS5yZXBsYWNlKCYjMzQ7OiYjMzQ7LCAmIzM0OyYjMzQ7KSkKJiM0MztEU1QgPSBieXRlcy5mcm9taGV4KCYjMzQ7MDJhYWJiY2NkZDAxJiMzNDspCiYjNDM7UEFZID0gYnl0ZXMocmFuZ2UoNDYpKQomIzQzO3JjdDAgPSBzdHJ1Y3QucGFjaygmIzM0OyZndDtIJiMzNDssIDApICYjNDM7IHN0cnVjdC5wYWNrKCYjMzQ7Jmd0O0gmIzM0OywgNTIgJmFtcDsgMHgwRkZGKSAmIzQzOyBiJiMzNDtceDg4XHhmYiYjMzQ7CiYjNDM7ZnJhbWUgPSBEU1QgJiM0MzsgU1JDICYjNDM7IGImIzM0O1x4MDhceDAwJiMzNDsgJiM0MzsgUEFZICYjNDM7IHJjdDAKJiM0MzsKJiM0Mzt0eCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXKTsgdHguYmluZCgoJiMzNDtwcnAwJiMzNDssIDApKQomIzQzO3NBID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsCiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSkKJiM0MztzQS5iaW5kKCgmIzM0O3ZBcCYjMzQ7LCAwKSkKJiM0MztzQiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLAomIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpCiYjNDM7c0IuYmluZCgoJiMzNDt2QnAmIzM0OywgMCkpCiYjNDM7c0Euc2V0YmxvY2tpbmcoRmFsc2UpOyBzQi5zZXRibG9ja2luZyhGYWxzZSkKJiM0MzsKJiM0MzthLCBiID0gW10sIFtdCiYjNDM7CiYjNDM7ZGVmIG1hdGNoKHBrdCk6CiYjNDM7ICAgIHJldHVybiAocGt0Wzo2XSA9PSBEU1QgYW5kIHBrdFs2OjEyXSA9PSBTUkMKJiM0MzsgICAgICAgICAgICBhbmQgcGt0WzEyOjE0XSA9PSBiJiMzNDtceDA4XHgwMCYjMzQ7IGFuZCBwa3RbMTQ6MTQgJiM0MzsgbGVuKFBBWSldID09IFBBWSkKJiM0MzsKJiM0MztkZWYgZHJhaW4odGltZW91dCk6CiYjNDM7ICAgIHdhaXQgPSB0aW1lb3V0CiYjNDM7ICAgIHdoaWxlIFRydWU6CiYjNDM7ICAgICAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc0EsIHNCXSwgW10sIFtdLCB3YWl0KQomIzQzOyAgICAgICAgaWYgbm90IHI6CiYjNDM7ICAgICAgICAgICAgcmV0dXJuCiYjNDM7ICAgICAgICBmb3IgcyBpbiByOgomIzQzOyAgICAgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSkKJiM0MzsgICAgICAgICAgICBpZiBub3QgbWF0Y2gocGt0KToKJiM0MzsgICAgICAgICAgICAgICAgY29udGludWUKJiM0MzsgICAgICAgICAgICBsaWQgPSBsYW5pZChwa3QpCiYjNDM7ICAgICAgICAgICAgaWYgbGlkIGlzIG5vdCBOb25lOgomIzQzOyAgICAgICAgICAgICAgICAoYSBpZiBzIGlzIHNBIGVsc2UgYikuYXBwZW5kKGxpZCkKJiM0MzsgICAgICAgIHdhaXQgPSAwCiYjNDM7CiYjNDM7IyBEcmFpbiB3aGlsZSBzZW5kaW5nIHNvIHRoZSBidXJzdCBjYW5ub3Qgb3ZlcmZsb3cgdGhlIGNhcHR1cmUgc29ja2V0cyYjMzk7CiYjNDM7IyByZWNlaXZlIGJ1ZmZlcnM7IHRoZSBuZXRlbS1kZWxheWVkIEEtc2lkZSBmcmFtZXMgYXJyaXZlIGFmdGVyd2FyZHMgYW5kCiYjNDM7IyBhcmUgY29sbGVjdGVkIGJlbG93LgomIzQzO2ZvciBfIGluIHJhbmdlKDIwMCk6CiYjNDM7ICAgIHR4LnNlbmQoZnJhbWUpCiYjNDM7ICAgIGRyYWluKDApCiYjNDM7ICAgIHRpbWUuc2xlZXAoMC4wMDEpCiYjNDM7CiYjNDM7ZW5kID0gdGltZS50aW1lKCkgJiM0MzsgZHVyCiYjNDM7d2hpbGUgdGltZS50aW1lKCkgJmx0OyBlbmQ6CiYjNDM7ICAgIGRyYWluKDAuMykKJiM0MzsKJiM0MztwcmludCgmIzM0O0Etc2lkZSBjb3VudD0lZCBsYW4gaWRzPSVzJiMzNDsgJSAobGVuKGEpLCBzb3J0ZWQoc2V0KGEpKSkpCiYjNDM7cHJpbnQoJiMzNDtCLXNpZGUgY291bnQ9JWQgbGFuIGlkcz0lcyYjMzQ7ICUgKGxlbihiKSwgc29ydGVkKHNldChiKSkpKQomIzQzO2lmIGxlbihhKSAmbHQ7IDE1MCBvciBsZW4oYikgJmx0OyAxNTA6CiYjNDM7ICAgIHByaW50KCYjMzQ7RkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApJiMzNDsKJiM0MzsgICAgICAgICAgJSAobGVuKGEpLCBsZW4oYikpKQomIzQzOyAgICBzeXMuZXhpdCgxKQomIzQzO2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCAmYW1wOyAxKSAhPSAwXQomIzQzO2JhZF9iID0gW3ggZm9yIHggaW4gYiBpZiAoeCAmYW1wOyAxKSAhPSAxXQomIzQzO2lmIGJhZF9hIG9yIGJhZF9iOgomIzQzOyAgICBwcmludCgmIzM0O0ZBSUw6IHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uIC0gQTogJWQvJWQgd3JvbmctbGFuLCYjMzQ7CiYjNDM7ICAgICAgICAgICYjMzQ7IEI6ICVkLyVkIHdyb25nLWxhbiYjMzQ7CiYjNDM7ICAgICAgICAgICUgKGxlbihiYWRfYSksIGxlbihhKSwgbGVuKGJhZF9iKSwgbGVuKGIpKSkKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztwcmludCgmIzM0O1BBU1M6IHBlci1lZ3Jlc3MgTEFOIElEcyBpc29sYXRlZCAoQSBhbGwgYml0MD0wLCBCIGFsbCBiaXQwPTEpJiMzNDspCiYjNDM7c3lzLmV4aXQoMCkKJiM0MztQWUYyCiYjNDM7fQomIzQzOwomIzQzOyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEYxOiBSZWRCb3ggc291cmNlLU1BQyBwcml2YWN5CiYjNDM7IyBIU1IgUmVkQm94IChwcm90byAwKSwgdGFnZ2VkIG11bHRpY2FzdCBmcm9tIGEgc2xhdmU6IG1hc3RlciBtdXN0IGtlZXAKJiM0MzsjIHRoZSBub2RlIE1BQywgaW50ZXJsaW5rIG11c3QgY2FycnkgdGhlIFJlZEJveCBNQUMuCiYjNDM7cnVuX2YxKCkKJiM0Mzt7CiYjNDM7CXNldHVwX25zIG5zIDImZ3Q7L2Rldi9udWxsIHx8IHJldHVybiAka3NmdF9za2lwCiYjNDM7CW5zeCgpIHsgaXAgbmV0bnMgZXhlYyAmIzM0OyRucyYjMzQ7ICYjMzQ7JEAmIzM0OzsgfQomIzQzOwomIzQzOwluc3ggaXAgbGluayBhZGQgdkEgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QXAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQiYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggaXAgbGluayBhZGQgdkkgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2SXAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggSSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwlmb3IgaSBpbiB2QSB2QiB2SSB2QXAgdkJwIHZJcDsgZG8KJiM0MzsJCW5zeCBpcCBsaW5rIHNldCAmIzM0OyRpJiMzNDsgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogJGkgdXAmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZG9uZQomIzQzOwlpZiAhIG5zeCBpcCBsaW5rIGFkZCBuYW1lIGhzcjAgdHlwZSBoc3Igc2xhdmUxIHZBIHNsYXZlMiB2QiBcCiYjNDM7CQlpbnRlcmxpbmsgdkkgc3VwZXJ2aXNpb24gNDUgcHJvdG8gMCAyJmd0Oy9kZXYvbnVsbDsgdGhlbgomIzQzOwkJZWNobyAmIzM0O1NLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbCYjMzQ7CiYjNDM7CQlyZXR1cm4gJGtzZnRfc2tpcAomIzQzOwlmaQomIzQzOwluc3ggaXAgbGluayBzZXQgaHNyMCB1cCB8fCB7IGVjaG8gJiMzNDtGQUlMOiBoc3IwIHVwJiMzNDs7IHJldHVybiAxOyB9CiYjNDM7CiYjNDM7CW5zeCBweXRob24zIC9kZXYvc3RkaW4gJmx0OyZsdDsmIzM5O1BZRjEmIzM5OwomIzQzO2ltcG9ydCBzb2NrZXQsIHNlbGVjdCwgc3lzLCB0aW1lCiYjNDM7CiYjNDM7Tk9ERSAgPSBieXRlcy5mcm9taGV4KCYjMzQ7MDIxMTIyMzM0NDU1JiMzNDspCiYjNDM7TUNBU1QgPSBieXRlcy5mcm9taGV4KCYjMzQ7MDEwMDVlMDAwMDAxJiMzNDspCiYjNDM7UkIgICAgPSBieXRlcy5mcm9taGV4KG9wZW4oJiMzNDsvc3lzL2NsYXNzL25ldC92SS9hZGRyZXNzJiMzNDspLnJlYWQoKS5yZXBsYWNlKCYjMzQ7OiYjMzQ7LCAmIzM0OyYjMzQ7KSkKJiM0MztQQVkgICA9IGJ5dGVzKHJhbmdlKDQ2KSkKJiM0MzsKJiM0MztkZWYgZnJhbWUoc2VxKToKJiM0MzsgICAgIyBMU0RVIHNpemUgPSBwYXlsb2FkICYjNDM7IEhTUiB0YWcgKEhTUl9ITEVOKSwgYXMgaHNyX2ZpbGxfdGFnKCkgY29tcHV0ZXMgaXQKJiM0MzsgICAgdGFnID0gKCgoMSAmbHQ7Jmx0OyAxMikgfCAobGVuKFBBWSkgJiM0MzsgNikpLnRvX2J5dGVzKDIsICYjMzQ7YmlnJiMzNDspCiYjNDM7ICAgICAgICAgICAmIzQzOyBzZXEudG9fYnl0ZXMoMiwgJiMzNDtiaWcmIzM0OykgJiM0MzsgYiYjMzQ7XHgwOFx4MDAmIzM0OykKJiM0MzsgICAgcmV0dXJuIE1DQVNUICYjNDM7IE5PREUgJiM0MzsgYiYjMzQ7XHg4OVx4MmYmIzM0OyAmIzQzOyB0YWcgJiM0MzsgUEFZCiYjNDM7CiYjNDM7dHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKCYjMzQ7dkFwJiMzNDssIDApKQomIzQzO3NtID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsCiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSkKJiM0MztzbS5iaW5kKCgmIzM0O2hzcjAmIzM0OywgMCkpCiYjNDM7c2kgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVywKJiM0MzsgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKQomIzQzO3NpLmJpbmQoKCYjMzQ7dklwJiMzNDssIDApKQomIzQzO3NtLnNldGJsb2NraW5nKEZhbHNlKTsgc2kuc2V0YmxvY2tpbmcoRmFsc2UpCiYjNDM7CiYjNDM7Zm9yIGkgaW4gcmFuZ2UoMyk6CiYjNDM7ICAgIHR4LnNlbmQoZnJhbWUoaSAmIzQzOyAxKSk7IHRpbWUuc2xlZXAoMC4wNSkKJiM0MzsKJiM0MzttX3NyYyA9IGlfc3JjID0gTm9uZQomIzQzO2VuZCA9IHRpbWUudGltZSgpICYjNDM7IDQKJiM0Mzt3aGlsZSB0aW1lLnRpbWUoKSAmbHQ7IGVuZCBhbmQgKG1fc3JjIGlzIE5vbmUgb3IgaV9zcmMgaXMgTm9uZSk6CiYjNDM7ICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzbSwgc2ldLCBbXSwgW10sIDAuMykKJiM0MzsgICAgZm9yIHMgaW4gcjoKJiM0MzsgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSkKJiM0MzsgICAgICAgICMgZXhhY3QgZmxvdzogZHN0LCBwb3N0LXN0cmlwIEV0aGVyVHlwZSwgZXhhY3QgcGF5bG9hZCwgbWluIGxlbmd0aDsKJiM0MzsgICAgICAgICMgaF9zb3VyY2UgaXMgdGhlIGFzc2VydGVkIHZhbHVlIGFuZCBtdXN0IE5PVCBiZSBmaWx0ZXJlZCBvbgomIzQzOyAgICAgICAgaWYgKGxlbihwa3QpICZsdDsgNjAgb3IgcGt0Wzo2XSAhPSBNQ0FTVCBvciBwa3RbMTI6MTRdICE9IGImIzM0O1x4MDhceDAwJiMzNDsKJiM0MzsgICAgICAgICAgICAgICAgb3IgcGt0WzE0OjE0ICYjNDM7IGxlbihQQVkpXSAhPSBQQVkpOgomIzQzOyAgICAgICAgICAgIGNvbnRpbnVlCiYjNDM7ICAgICAgICBpZiBzIGlzIHNtIGFuZCBtX3NyYyBpcyBOb25lOgomIzQzOyAgICAgICAgICAgIG1fc3JjID0gcGt0WzY6MTJdCiYjNDM7ICAgICAgICBlbGlmIHMgaXMgc2kgYW5kIGlfc3JjIGlzIE5vbmU6CiYjNDM7ICAgICAgICAgICAgaV9zcmMgPSBwa3RbNjoxMl0KJiM0MzsKJiM0MztwcmludCgmIzM0O21hc3RlciBoX3NvdXJjZSAgICA9JiMzNDssIG1fc3JjLmhleCgpIGlmIG1fc3JjIGVsc2UgTm9uZSkKJiM0MztwcmludCgmIzM0O25vZGUgTUFDICAgICAgICAgICA9JiMzNDssIE5PREUuaGV4KCkpCiYjNDM7cHJpbnQoJiMzNDtpbnRlcmxpbmsgaF9zb3VyY2UgPSYjMzQ7LCBpX3NyYy5oZXgoKSBpZiBpX3NyYyBlbHNlIE5vbmUpCiYjNDM7cHJpbnQoJiMzNDtyZWRib3ggTUFDICAgICAgICAgPSYjMzQ7LCBSQi5oZXgoKSkKJiM0MztpZiBpX3NyYyAhPSBSQjoKJiM0MzsgICAgcHJpbnQoJiMzNDtGQUlMOiBpbnRlcmxpbmsgZGlkIG5vdCBjYXJyeSB0aGUgUmVkQm94IE1BQyYjMzQ7KQomIzQzOyAgICBzeXMuZXhpdCgxKQomIzQzO2lmIG1fc3JjICE9IE5PREU6CiYjNDM7ICAgIHByaW50KCYjMzQ7RkFJTDogbWFzdGVyIHJlY2VpdmVkICVzIGluc3RlYWQgb2YgdGhlIG5vZGUgTUFDICYjMzQ7CiYjNDM7ICAgICAgICAgICYjMzQ7KHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uKSYjMzQ7CiYjNDM7ICAgICAgICAgICUgKG1fc3JjLmhleCgpIGlmIG1fc3JjIGVsc2UgJiMzNDtub3RoaW5nJiMzNDspKQomIzQzOyAgICBzeXMuZXhpdCgxKQomIzQzO3ByaW50KCYjMzQ7UEFTUzogbWFzdGVyIGtlcHQgbm9kZSBNQUMsIGludGVybGluayBrZXB0IFJlZEJveCBNQUMmIzM0OykKJiM0MztzeXMuZXhpdCgwKQomIzQzO1BZRjEKJiM0Mzt9CiYjNDM7CiYjNDM7cmM9MAomIzQzOwomIzQzO3J1bl9mMgomIzQzO3JldD0kPwomIzQzO3JjPSQoa3NmdF9zdGF0dXNfbWVyZ2UgJiMzNDskcmMmIzM0OyAmIzM0OyRyZXQmIzM0OykKJiM0MzsKJiM0MztydW5fZjEKJiM0MztyZXQ9JD8KJiM0MztyYz0kKGtzZnRfc3RhdHVzX21lcmdlICYjMzQ7JHJjJiMzNDsgJiMzNDskcmV0JiMzNDspCiYjNDM7CiYjNDM7aWYgWyAmIzM0OyRyYyYjMzQ7IC1lcSAwIF07IHRoZW4KJiM0MzsJZWNobyAmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHBlci1lZ3Jlc3MgbXV0YXRpb24gaXNvbGF0aW9uIChGMSYjNDM7RjIpIFsgT0sgXSYjMzQ7CiYjNDM7ZWxpZiBbICYjMzQ7JHJjJiMzNDsgLWVxICYjMzQ7JGtzZnRfc2tpcCYjMzQ7IF07IHRoZW4KJiM0MzsJZWNobyAmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHN1YnRlc3RzIHNraXBwZWQgKGNhcGFiaWxpdGllcyBtaXNzaW5nKSYjMzQ7CiYjNDM7ZWxzZQomIzQzOwllY2hvICYjMzQ7aHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF0mIzM0OyBcCiYjNDM7CQkmIzM0O3JjPSRyYyYjMzQ7IDEmZ3Q7JmFtcDsyCiYjNDM7ZmkKJiM0MztleGl0ICYjMzQ7JHJjJiMzNDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjgwMwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDE4NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEhTUiBEcml2ZXIgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIHRoZSBIU1IgZHJpdmVyLCBzcGVjaWZpY2FsbHkgaW4gYG5ldC9oc3IvaHNyX2ZvcndhcmQuY2AuIEl0JiMzOTtzIGludHJvZHVjaW5nIGEgY3JpdGljYWwgY2hhbmdlOyBpdCYjMzk7cyB1c2luZyBhIG5ldyBmdW5jdGlvbiwgYGhzcl9jbG9uZV9wcml2YXRlKClgLCB3aGljaCBkb2VzIGEgY29weS1vbi13cml0ZSAoYHNrYl9jb3coKWApIG9mIHRoZSBTS0IsIGVmZmVjdGl2ZWx5IG1ha2luZyB0aGUgZGF0YSBwcml2YXRlLiAgVGhlIGltcGxpY2F0aW9ucyBoZXJlIGFyZSBzaWduaWZpY2FudC4gSXQmIzM5O3MgcmVwbGFjaW5nIHRoZSBzdGFuZGFyZCBgc2tiX2Nsb25lKClgIGNhbGxzIGluIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgIHdpdGggdGhpcyBjb3B5LW9uLXdyaXRlIHZlcnNpb24uCgpUaGUgcmF0aW9uYWxlIGlzIGNsZWFyIOKAkyBhbmQgY3J1Y2lhbC4gVGhpcyBpcyBhYm91dCBwcmV2ZW50aW5nIGRhdGEgY29ycnVwdGlvbi4gV2l0aCBgc2tiX2Nsb25lKClgLCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgY2xvbmVkIFNLQiB3b3VsZCBhZmZlY3QgdGhlIG9yaWdpbmFsIGFuZCBhbnkgb3RoZXIgY2xvbmVzLCBwYXJ0aWN1bGFybHkgZHVyaW5nIHBlci1lZ3Jlc3Mgd3JpdGVzLCBhbmQgdGhhdCYjMzk7cyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIgaW4gYSBoaWdoLWF2YWlsYWJpbGl0eSBzeXN0ZW0uIFRoaXMgdXBkYXRlIGluIGBoc3JfeG1pdCgpYCBpcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcuIFRoZSBwYXRjaCBpcyBlbnN1cmluZyB0aGUgU0tCIGlzIHByaXZhdGl6ZWQgKmJlZm9yZSogYW55IGFkZHJlc3MgbW9kaWZpY2F0aW9uIGZvciBpbnRlcmxpbmstYm91bmQgU0tCcy4gVGhhdCBtZWFucyB0aGUgY29weS1vbi13cml0ZSBoYXBwZW5zIHVwZnJvbnQgdG8gZ3VhcmQgYWdhaW5zdCBleGFjdGx5IHRoaXMgdHlwZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBpc3N1ZS4KCkVzc2VudGlhbGx5LCB0aGlzIHBhdGNoIGlzIGFkZHJlc3NpbmcgYSByYWNlIGNvbmRpdGlvbiwgYSBjbGFzc2ljIHByb2JsZW0gaW4gbmV0d29yayBkcml2ZXJzIHdoZXJlIG11bHRpcGxlIHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXJlIHRyeWluZyB0byB3cml0ZSB0byB0aGUgc2FtZSBidWZmZXIuIFRoaXMgaXMgYSBzb2xpZCBhcHByb2FjaCB0byBmaXhpbmcgdGhhdC4gTm93LCBJIG5lZWQgdG8gZGl2ZSBpbnRvIHRoZSBjb2RlIGl0c2VsZiwgYW5hbHl6ZSB0aGUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zLCBhbmQgYWxzbyBtYWtlIHN1cmUgdGhlIEtjb25maWcgbWFrZXMgc2Vuc2UsIGNvbmZpcm1pbmcgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBzZXQuICBMZXQmIzM5O3Mgc2VlIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2hzcl9jbG9uZV9wcml2YXRlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvaHNyX2ZvcndhcmQuYz0yODg9c3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfZmlsbF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzMxLSAqL1xubmV0L2hzci9oc3JfZm9yd2FyZC5jOjMzMjpzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzMzLXtcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzUyPXN0cnVjdCBza19idWZmICpoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLFxuLS1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNjEtXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6MzYyOlx0XHRza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2JfaHNyKTtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNjMtXHRcdGlmICghc2tiKVxuLS1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNzAtXHR9IGVsc2UgaWYgKHBvcnQtXHUwMDNlZGV2LVx1MDAzZWZlYXR1cmVzIFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6MzcxOlx0XHRyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXHUwMDNlc2tiX3N0ZCk7XG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzcyLVx0fVxuLS1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYz0zOTk9c3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQwNi1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0MDc6XHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9wcnApO1xubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQwOC1cdFx0aWYgKCFza2IpXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQyMC1cdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0MjE6XHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00MjItXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzkxNwoJCQkJCQkJb3V0cHV0OiAxNwoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIGNoYW5nZXMgYW5kIHdoZXJlIEkgc2hvdWxkIGZvY3VzIG15IGF0dGVudGlvbjoKCioqTmF2aWdhdGluZyB0aGUgSFNSIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIHRoZSBtb2RpZmljYXRpb25zIGFyZSBkZWZpbml0ZWx5IHdpdGhpbiBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gVGhhdCYjMzk7cyB0aGUgY29yZSBmb3J3YXJkaW5nIGxvZ2ljIGZvciBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IpLCBzbyBpdCYjMzk7cyB0aGUgcmlnaHQgcGxhY2UgdG8gYmVnaW4uIEJlZm9yZSBkaXZpbmcgZGVlcCBpbnRvIHRoZSBjb2RlIGl0c2VsZiwgSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIEtjb25maWcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBIU1IuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgcG90ZW50aWFsbHkgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgaG93IEkgY2FuIGNvbnRyb2wgaXQgaW4gdGhlIGJ1aWxkLiBLbm93aW5nIHRoZSBLY29uZmlnIG9wdGlvbnMgd2lsbCBxdWlja2x5IGlsbHVtaW5hdGUgdGhlIGJpZ2dlciBwaWN0dXJlLiBUaGlzIHdpbGwgaGVscCBmcmFtZSB0aGUgY2hhbmdlcyB3aXRoaW4gdGhlIG92ZXJhbGwgc3lzdGVtIGRlc2lnbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgSFNSJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvS2NvbmZpZy01LVxubmV0L2hzci9LY29uZmlnOjY6Y29uZmlnIEhTUlxubmV0L2hzci9LY29uZmlnLTctXHR0cmlzdGF0ZSBcJiMzNDtIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXHUwMDI2IFBSUClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MTc3CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjoKCioqRnV6emluZyBGb2N1czogSW5pdGlhbCBBc3Nlc3NtZW50KioKCk9rYXksIHNvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgYEhTUmAuIFRoYXQmIzM5O3MgdGhlIGJhc2VsaW5lLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgbGV0JiMzOTtzIG5haWwgZG93biB3aGVyZSB3ZSYjMzk7cmUgZ29pbmcgdG8gZGlyZWN0IG91ciBmdXp6aW5nIGVmZm9ydHMuIFRoZSBzeXN0ZW0mIzM5O3MgdGVsbGluZyBtZSBhYm91dCB0aGVzZSBtb2RpZmllZCBmdW5jdGlvbnM6IGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZWAsIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZWAsIGFuZCBgaHNyX3htaXRgLiBSaWdodCwgdGhvc2UgYXJlIG91ciB0YXJnZXRzLiBOb3csIGJlZm9yZSBJIGRpdmUgZGVlcCBpbnRvIGNyYWZ0aW5nIHRlc3QgY2FzZXMsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgcG90ZW50aWFsIGZvciB0aGlzLiBBcmUgdGhlc2UgZ2xvYmFsLCBvciBhcmUgdGhleSBzdGF0aWMgd2l0aGluIGEgc3BlY2lmaWMgbW9kdWxlPyBUaGUgc3RhdGljL25vbi1zdGF0aWMgbmF0dXJlIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIGluZmx1ZW5jZSBob3cgSSBhcHByb2FjaCB2dWxuZXJhYmlsaXR5IGRpc2NvdmVyeSBhbmQgZXhwbG9pdCBkZXNpZ24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2hzci9oc3JfZGV2aWNlLmM9NjIxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHNyX3Byb3RvX29wcyBoc3Jfb3BzID0ge1xubmV0L2hzci9oc3JfZGV2aWNlLmMtNjIyLVx0LnNlbmRfc3ZfZnJhbWUgPSBzZW5kX2hzcl9zdXBlcnZpc2lvbl9mcmFtZSxcbm5ldC9oc3IvaHNyX2RldmljZS5jOjYyMzpcdC5jcmVhdGVfdGFnZ2VkX2ZyYW1lID0gaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUsXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy02MjQtXHQuZ2V0X3VudGFnZ2VkX2ZyYW1lID0gaHNyX2dldF91bnRhZ2dlZF9mcmFtZSxcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzMyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzUxLSAqL1xubmV0L2hzci9oc3JfZm9yd2FyZC5jOjM1MjpzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNTMtXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg9MTc9c3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMTgtXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydCk7XG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg6MTk6c3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMjAtXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODg0MgoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIGNvZGUgc25pcHBldHMsIHN1bW1hcml6ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXMgeW91IHJlcXVlc3RlZDoKCioqQXNzZXNzaW5nIEZ1bmN0aW9uIFNjb3BlKioKCkFscmlnaHQsIGxldCBtZSBxdWlja2x5IGFuYWx5emUgdGhlc2UgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiBJdCYjMzk7cyBpbW1lZGlhdGVseSBhcHBhcmVudCB0aGF0IGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZWAgYW5kIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZWAgYXJlIGRlY2xhcmVkIGFzIG5vbi1zdGF0aWMuIFRoaXMgbGlrZWx5IGluZGljYXRlcyB0aGF0IHRoZXkgYXJlIGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LCBwcm9iYWJseSB3aXRoaW4gYSBsYXJnZXIgbW9kdWxlIG9yIHByb2plY3QuIFRoZXkgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxhYmxlIGZyb20gZWxzZXdoZXJlLCBsaWtlbHkgYXMgcGFydCBvZiBzb21lIHB1YmxpYyBBUEkgb3IgaW50ZXJmYWNlLiBIb3dldmVyLCB0aGUgdXNlIGNhc2Ugb2YgYGhzcl94bWl0YCBpcyBzbGlnaHRseSBkaWZmZXJlbnQuIFRoZSBgc3RhdGljYCBrZXl3b3JkIHN1Z2dlc3RzIGl0JiMzOTtzIHNjb3BlZCB0byB0aGUgY3VycmVudCBmaWxlIG9yIHRyYW5zbGF0aW9uIHVuaXQuIFNvLCBgaHNyX3htaXRgIGlzIGNsZWFybHkgYW4gaW50ZXJuYWwgZnVuY3Rpb24sIHByb2JhYmx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbm90IG1lYW50IGZvciBleHRlcm5hbCB1c2UuIEl0JiMzOTtzIGxpa2VseSBpbnZvbHZlZCBpbiBoYW5kbGluZyBzb21lIGRhdGEgdHJhbnNtaXNzaW9uIHByb2Nlc3MsIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMga2VwdCBoaWRkZW4sIHBvdGVudGlhbGx5IHRvIGFsbG93IGZvciBmdXR1cmUgaW50ZXJuYWwgY2hhbmdlcyB3aXRob3V0IGJyZWFraW5nIGV4dGVybmFsIGRlcGVuZGVuY2llcy4gVW5kZXJzdGFuZGluZyB0aGUgc3RhdGljL25vbi1zdGF0aWMgZGlzdGluY3Rpb24gaXMgY3J1Y2lhbCBmb3IgcHJvcGVyIG1vZHVsZSBkZXNpZ24gYW5kIGNvZGUgbWFpbnRhaW5hYmlsaXR5LCBlc3BlY2lhbGx5IGZvciBhbiBleHBlcmllbmNlZCBkZXZlbG9wZXIgbGlrZSBteXNlbGYuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2hzcl94bWl0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvaHNyX2ZvcndhcmQuYz00MzA9c3RhdGljIHZvaWQgaHNyX2RlbGl2ZXJfbWFzdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQ1MC1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0NTE6c3RhdGljIGludCBoc3JfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQsXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNDUyLVx0XHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9NTY2PXN0YXRpYyB2b2lkIGhzcl9mb3J3YXJkX2RvKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTYyNy1cdFx0fSBlbHNlIHtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo2Mjg6XHRcdFx0aWYgKCFoc3JfeG1pdChza2IsIHBvcnQsIGZyYW1lKSlcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy02MjktXHRcdFx0XHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9TTEFWRV9BIHx8XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0MTEKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IGNvZGUgc3RydWN0dXJlLCBwcmVzZW50ZWQgYXMgaWYgaXQgd2VyZSBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBIU1IgVHJhbnNtaXNzaW9uIExvZ2ljKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJJiMzOTttIHNlZWluZywgYGhzcl94bWl0YCBpcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCBtZWFucyBpdCYjMzk7cyBpbnRlcm5hbCB0byB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIG5vdCBtZWFudCBmb3IgZXh0ZXJuYWwgdXNlLiBJdCYjMzk7cyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGZ1bmN0aW9uIHdpdGhpbiB0aGUgc2FtZSBmaWxlLCB3aGljaCBpcyBgaHNyX2ZvcndhcmRfZG9gLiBPa2F5LCB0aGF0IGdpdmVzIG1lIGEgY2xlYXIgaWRlYSBvZiBpdHMgcHVycG9zZTogaXQmIzM5O3MgbGlrZWx5IHJlc3BvbnNpYmxlIGZvciB0aGUgYWN0dWFsICp0cmFuc21pc3Npb24qIG9mIGEgSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3MgUmVkdW5kYW5jeSAoSFNSKSBmcmFtZSwgbGlrZWx5IHRoZSBsb3dlci1sZXZlbCBzZW5kaW5nIGZ1bmN0aW9uLgoKTm93LCBgaHNyX2ZvcndhcmRfZG9gIGl0c2VsZiBpcyBhbHNvIHN0YXRpYy4gU28gaXQmIzM5O3Mgc2ltaWxhcjsgYWxzbyBoaWRkZW4gYXdheSBmcm9tIGV4dGVybmFsIGNhbGxzLiBJdCBzZWVtcyBsaWtlIGl0JiMzOTtzIHRoZSBuZXh0IGxldmVsIHVwLCB0aGUgZnVuY3Rpb24gdGhhdCAqZG9lcyogdGhlIEhTUiBmb3J3YXJkaW5nLCBhbmQgSSYjMzk7bSBndWVzc2luZyBzb21lIHNvcnQgb2YgcHJlLXByb2Nlc3NpbmcgYmVmb3JlIGl0IGhhbmRzIGl0IG9mZiB0byB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiBmdW5jdGlvbi4gQW5kIHRoZSBrZXkgaXMgdGhhdCBpdCYjMzk7cyBjYWxsZWQgZnJvbSBgaHNyX2ZvcndhcmRfc2tiYCwgc28gdGhpcyBtZWFucyB0aGF0IGFuIGluY29taW5nIFNLQiBpcyBnb2luZyB0byBnZXQgaGFuZGxlZCBoZXJlLgpPa2F5LCBzbyB0aGUgd29ya2Zsb3cgYXBwZWFycyB0byBiZTogYW4gaW5jb21pbmcgcGFja2V0IChgc2tiYCkgZ29lcyB0byBgaHNyX2ZvcndhcmRfc2tiYCwgd2hpY2ggdGhlbiB0cmlnZ2VycyBgaHNyX2ZvcndhcmRfZG9gLCB3aGljaCBwcmVwcyB0aGUgZnJhbWUsIGFuZCBmaW5hbGx5IGNhbGxzIGBoc3JfeG1pdGAgdG8gc2VuZCBpdCBvdXQuIFRoYXQgc2V0dXAgaW5kaWNhdGVzIGEgZGVsaWJlcmF0ZSBlbmNhcHN1bGF0aW9uIG9mIHRoZSBIU1IgZm9yd2FyZGluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcG90ZW50aWFsIGludGVybmFsIG9wdGltaXphdGlvbnMgb3IgY2hhbmdlcyB0byB0aGUgZm9yd2FyZGluZyBsb2dpYyB3aXRob3V0IGFmZmVjdGluZyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiBJdCYjMzk7cyBhIGNsZWFuIHdheSB0byBtYW5hZ2UgdGhlIHRyYW5zbWlzc2lvbiBwYXRoLgoKU28sIGluIHNob3J0LCBJJiMzOTttIGluZmVycmluZyB0aGlzIGZsb3c6IGBoc3JfZm9yd2FyZF9za2JgIC0mZ3Q7IGBoc3JfZm9yd2FyZF9kb2AgLSZndDsgYGhzcl94bWl0YC4gRWFjaCBwaWVjZSBpcyBuZWF0bHkgdHVja2VkIGF3YXksIGxpa2VseSBmb3IgZ29vZCBjb2RlIHN0cnVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aHNyX2ZvcndhcmRfc2tiJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvaHNyX2RldmljZS5jPTIyND1zdGF0aWMgbmV0ZGV2X3R4X3QgaHNyX2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4tLVxubmV0L2hzci9oc3JfZGV2aWNlLmMtMjM1LVx0XHRzcGluX2xvY2tfYmgoXHUwMDI2aHNyLVx1MDAzZXNlcW5yX2xvY2spO1xubmV0L2hzci9oc3JfZGV2aWNlLmM6MjM2Olx0XHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBtYXN0ZXIpO1xubmV0L2hzci9oc3JfZGV2aWNlLmMtMjM3LVx0XHRzcGluX3VubG9ja19iaChcdTAwMjZoc3ItXHUwMDNlc2VxbnJfbG9jayk7XG4tLVxubmV0L2hzci9oc3JfZGV2aWNlLmM9MjkzPXN0YXRpYyB2b2lkIHNlbmRfaHNyX3N1cGVydmlzaW9uX2ZyYW1lKHN0cnVjdCBoc3JfcG9ydCAqcG9ydCxcbi0tXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy0zNjMtXG5uZXQvaHNyL2hzcl9kZXZpY2UuYzozNjQ6XHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBwb3J0KTtcbm5ldC9oc3IvaHNyX2RldmljZS5jLTM2NS1cdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmhzci1cdTAwM2VzZXFucl9sb2NrKTtcbi0tXG5uZXQvaHNyL2hzcl9kZXZpY2UuYz0zNjk9c3RhdGljIHZvaWQgc2VuZF9wcnBfc3VwZXJ2aXNpb25fZnJhbWUoc3RydWN0IGhzcl9wb3J0ICptYXN0ZXIsXG4tLVxubmV0L2hzci9oc3JfZGV2aWNlLmMtNDA0LVxubmV0L2hzci9oc3JfZGV2aWNlLmM6NDA1Olx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgbWFzdGVyKTtcbm5ldC9oc3IvaHNyX2RldmljZS5jLTQwNi1cdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmhzci1cdTAwM2VzZXFucl9sb2NrKTtcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9NzIzPXN0YXRpYyBpbnQgZmlsbF9mcmFtZV9pbmZvKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTc4MC0vKiBNdXN0IGJlIGNhbGxlZCBob2xkaW5nIHJjdSByZWFkIGxvY2sgKGJlY2F1c2Ugb2YgdGhlIHBvcnQgcGFyYW1ldGVyKSAqL1xubmV0L2hzci9oc3JfZm9yd2FyZC5jOjc4MTp2b2lkIGhzcl9mb3J3YXJkX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQpXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNzgyLXtcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMTUtXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg6MTY6dm9pZCBoc3JfZm9yd2FyZF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0KTtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaC0xNy1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbi0tXG5uZXQvaHNyL2hzcl9zbGF2ZS5jPTI0PXN0YXRpYyByeF9oYW5kbGVyX3Jlc3VsdF90IGhzcl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKVxuLS1cbm5ldC9oc3IvaHNyX3NsYXZlLmMtODAtXHRcdHNwaW5fbG9ja19iaChcdTAwMjZoc3ItXHUwMDNlc2VxbnJfbG9jayk7XG5uZXQvaHNyL2hzcl9zbGF2ZS5jOjgxOlx0XHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBwb3J0KTtcbm5ldC9oc3IvaHNyX3NsYXZlLmMtODItXHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmhzci1cdTAwM2VzZXFucl9sb2NrKTtcbm5ldC9oc3IvaHNyX3NsYXZlLmMtODMtXHR9IGVsc2Uge1xubmV0L2hzci9oc3Jfc2xhdmUuYzo4NDpcdFx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgcG9ydCk7XG5uZXQvaHNyL2hzcl9zbGF2ZS5jLTg1LVx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDcxOAoJCQkJCQkJb3V0cHV0OiAxNwoJCQkJCQkJdGhvdWdodHM6IDY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDoKCioqRm9jdXNpbmcgSW4gb24gdGhlIEhTUiBDb2RlKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgSFNSIGltcGxlbWVudGF0aW9uLiBUaGUgYGhzcl9mb3J3YXJkX3NrYmAgZnVuY3Rpb24gaXMgbm9uLXN0YXRpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFRoYXQgbWVhbnMgaXQmIzM5O3MgbGlrZWx5IGNhbGxlZCBmcm9tIHNvbWV3aGVyZSBvdXRzaWRlIHRoZSBpbW1lZGlhdGUgSFNSIG1vZHVsZSBpdHNlbGYsIG1ha2luZyBpdCBhIGdvb2QganVtcGluZy1vZmYgcG9pbnQgZm9yIGFuYWx5c2lzLiBJdCwgYWxvbmcgd2l0aCBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVgIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVgLCBzZWVtIGxpa2Uga2V5IHN5bWJvbHMgdG8gY29uY2VudHJhdGUgb24uIFRoZXkmIzM5O3JlIHByb2JhYmx5IGNvcmUgdG8gdGhlIHBhY2tldCBwcm9jZXNzaW5nIGFuZCB0YWdnaW5nLiBNeSBuZXh0IHN0ZXAgd2lsbCBiZSB0byBmaWd1cmUgb3V0IGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMgZm9yIEhTUi4gVW5kZXJzdGFuZGluZyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBvciBjb25kaXRpb25hbCBvbiBzb21lIG90aGVyIGZlYXR1cmUgYmVpbmcgZW5hYmxlZC4gVGhpcyBnaXZlcyBtZSBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgSFNSJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvS2NvbmZpZy01LVxubmV0L2hzci9LY29uZmlnOjY6Y29uZmlnIEhTUlxubmV0L2hzci9LY29uZmlnLTctXHR0cmlzdGF0ZSBcJiMzNDtIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXHUwMDI2IFBSUClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEwNDQKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqQXNzZXNzaW5nIHRoZSBMYW5kc2NhcGUqKgoKT2theSwgaG9sZCBvbiBhIHNlY29uZC4gQmVmb3JlIEkgZGl2ZSB0b28gZGVlcCwgSSBuZWVkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIGRlcGVuZGVuY2llcyBpbnZvbHZlZCB3aXRoIEhTUi4gSSBjYW4mIzM5O3QganVzdCBqdW1wIGluOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIGNvbXBvbmVudHMsIHN5c3RlbXMsIG9yIGRhdGEgc291cmNlcyBIU1IgcmVsaWVzIG9uLiBXaGF0IGFyZSB0aGUgaW5wdXRzPyBXaGF0IG90aGVyIHN5c3RlbXMgZG9lcyBpdCBpbnRlcmZhY2Ugd2l0aD8gSWRlbnRpZnlpbmcgdGhlc2UgZGVwZW5kZW5jaWVzIGlzIGNydWNpYWwgZm9yIGFueSBtZWFuaW5nZnVsIGFuYWx5c2lzIG9yIHVuZGVyc3RhbmRpbmcuIEl0IHdpbGwgZGljdGF0ZSB0aGUgc2NvcGUgb2YgbXkgaW52ZXN0aWdhdGlvbiBhbmQgaW5mb3JtIHRoZSBkaXJlY3Rpb24gb2YgbXkgcmVzZWFyY2guIFVuZGVyc3RhbmRpbmcgdGhlIGNvbm5lY3Rpb25zIGlzIGZ1bmRhbWVudGFsIHRvIGF2b2lkIG1pc3NpbmcgYW55IHBpZWNlIG9mIHRoZSBwdXp6bGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2hzci9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0I1xuICAgMzpcdCMgSUVDIDYyNDM5LTMgSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3MgUmVkdW5kYW5jeVxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRjb25maWcgSFNSXG4gICA3Olx0XHR0cmlzdGF0ZSBcJiMzNDtIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXHUwMDI2IFBSUClcJiMzNDtcbiAgIDg6XHRcdGhlbHBcbiAgIDk6XHRcdCAgVGhpcyBlbmFibGVzIElFQyA2MjQzOSBkZWZpbmVkIEhpZ2gtYXZhaWxhYmlsaXR5IFNlYW1sZXNzXG4gIDEwOlx0XHQgIFJlZHVuZGFuY3kgKEhTUikgYW5kIFBhcmFsbGVsIFJlZHVuZGFuY3kgUHJvdG9jb2wgKFBSUCkuXG4gIDExOlx0XG4gIDEyOlx0XHQgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHlvdXIgTGludXggYm94IHdpbGwgYmUgYWJsZSB0byBhY3QgYXMgYVxuICAxMzpcdFx0ICBEQU5IIChcJiMzNDtEb3VibHkgYXR0YWNoZWQgbm9kZSBpbXBsZW1lbnRpbmcgSFNSXCYjMzQ7KSBvciBEQU5QIChcJiMzNDtEb3VibHlcbiAgMTQ6XHRcdCAgYXR0YWNoZWQgbm9kZSBpbXBsZW1lbnRpbmcgUFJQXCYjMzQ7KS4gRm9yIHRoaXMgdG8gd29yaywgeW91ciBMaW51eCBib3hcbiAgMTU6XHRcdCAgbmVlZHMgKGF0IGxlYXN0KSB0d28gcGh5c2ljYWwgRXRoZXJuZXQgaW50ZXJmYWNlcy5cbiAgMTY6XHRcbiAgMTc6XHRcdCAgRm9yIERBTkgsIGl0IG11c3QgYmUgY29ubmVjdGVkIGFzIGEgbm9kZSBpbiBhIHJpbmcgbmV0d29yayB0b2dldGhlclxuICAxODpcdFx0ICB3aXRoIG90aGVyIEhTUiBjYXBhYmxlIG5vZGVzLiBBbGwgRXRoZXJuZXQgZnJhbWVzIHNlbnQgb3ZlciB0aGUgSFNSXG4gIDE5Olx0XHQgIGRldmljZSB3aWxsIGJlIHNlbnQgaW4gYm90aCBkaXJlY3Rpb25zIG9uIHRoZSByaW5nIChvdmVyIGJvdGggc2xhdmVcbiAgMjA6XHRcdCAgcG9ydHMpLCBnaXZpbmcgYSByZWR1bmRhbnQsIGluc3RhbnQgZmFpbC1vdmVyIG5ldHdvcmsuIEVhY2ggSFNSIG5vZGVcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE1NjEKCQkJCQkJCW91dHB1dDogMTM1CgkJCQkJCQl0aG91Z2h0czogMzU1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBIU1IgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggZm9yIHRoZSBIU1IgZHJpdmVyLiBUaGUgZmlyc3QgdGhpbmcgSSBub3RlIGlzIHRoYXQgaXQgZG9lc24mIzM5O3Qgc2VlbSB0byBpbnRyb2R1Y2UgYW55IG5ldyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzIGdvb2QuIEkgbmVlZCB0byBiZSBlZmZpY2llbnQgaGVyZS4KClJpZ2h0LCBsZXQmIzM5O3Mgc2VlIHdoYXQgZWxzZSB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoLiBUaGUgYWN0dWFsIGNvZGUgY2hhbmdlIGlzIGluIGBuZXQvaHNyL2hzcl9mb3J3YXJkLmNgLiBJIGFsc28gc2VlIGEgdGVzdCBzY3JpcHQsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hgLCB3aGljaCBzZWVtcyB0byBiZSB1c2luZyBgaXAgbGlua2AgdG8gc2V0IHVwIEhTUiBhbmQgUFJQIGludGVyZmFjZXMuIEludGVyZXN0aW5nLiBUaGUgY29uZmlnIHVzZWQgaW4gdGhlIHRlc3QgaXMganVzdCBgSFNSYCwgd2hpY2ggc2ltcGxpZmllcyB0aGluZ3MgYSBiaXQuCgpJIGhhZCBhIHF1aWNrIGxvb2sgYXQgYE5FVF9GX0hXX0hTUl9UQUdfSU5TYCwgYnV0IGl0IGxvb2tzIGxpa2UganVzdCBhIG5ldGRldiBmZWF0dXJlIGZsYWcgYW5kIGRvZXNuJiMzOTt0IGFwcGVhciB0byBiZSB0aWVkIHRvIGEgc3BlY2lmaWMgY29uZmlnLiBTbywgdGhlIG9ubHkgcmVsZXZhbnQgY29uZmlnIGhlcmUgaXMgaW5kZWVkIGBIU1JgLgoKTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHRoZSByZWFzb25pbmcuIFRoaXMgcGF0Y2ggZml4ZXMgYSBidWcuIFRoZSBkcml2ZXIgY291bGQgY29ycnVwdCBTS0JzIG9yIHRoZWlyIGNsb25lcyBkdXJpbmcgcGVyLWVncmVzcyB3cml0ZXMsIGFuZCB0aGF0JiMzOTtzIG5vdCBnb29kLCBvZiBjb3Vyc2UuIEl0IGludHJvZHVjZXMgYGhzcl9jbG9uZV9wcml2YXRlKClgIHRvIGVuc3VyZSBza2IgZGF0YSBpcyBwcml2YXRlIGJlZm9yZSBtb2RpZmljYXRpb24uIFRoYXQmIzM5O3MgYSBnb29kIGFwcHJvYWNoIHRvIGFkZHJlc3MgdGhlIHNoYXJlZCBkYXRhIGlzc3Vlcy4gVGhlIGNoYW5nZXMgYXJlIHdpdGhpbiB0aGUgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYywgc28gdGhlIGltcGFjdCBpcyBwb3RlbnRpYWxseSBzaWduaWZpY2FudC4gVGhpcyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBjb2RlIGFuZCB3b3J0aCBmdXp6aW5nLgoKSSYjMzk7dmUgdGFrZW4gYSBxdWljayBnbGFuY2UgYXQgdGhlIHN5bWJvbHMgaW4gcXVlc3Rpb246IGBoc3JfZm9yd2FyZF9za2JgLCBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVgLCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lYC4gSnVzdCBtYWtpbmcgc3VyZSwgbGV0JiMzOTtzIHF1aWNrbHkgY2hlY2sgd2hldGhlciBgaHNyX2Nsb25lX3ByaXZhdGVgIGlzIHN0YXRpYyBhbmQgaXQgaXMuIEFuZCB0aGUgb3RoZXIgdHdvIGFyZSBub24tc3RhdGljLgoKT2theSwgSSYjMzk7bSBzYXRpc2ZpZWQuIEkmIzM5O2xsIHVzZSBzZXQtcmVzdWx0cyB0byByZXR1cm4gdGhlIHJlc3VsdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtIU1ImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtoc3JfZm9yd2FyZF9za2ImIzM0OywKICAgICYjMzQ7aHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OywKICAgICYjMzQ7cHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtIU1ImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtoc3JfZm9yd2FyZF9za2ImIzM0OywKICAgICYjMzQ7aHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OywKICAgICYjMzQ7cHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMWM4NjBiNDQ1NDZkNDQyOTZlZDkxYmNjNWQ4Nzc5NTg5ZDVlMGM4MApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgQXVnIDggMDA6NTE6NTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvaHNyL2hzcl9mb3J3YXJkLmMgYi9uZXQvaHNyL2hzcl9mb3J3YXJkLmMKaW5kZXggMDc3NDk4MWE2NWMxNi4uZWZjYmYzY2YyNmY5YiAxMDA2NDQKLS0tIGEvbmV0L2hzci9oc3JfZm9yd2FyZC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuYwpAQCAtMzI1LDggJiM0MzszMjUsMjkgQEAgc3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfZmlsbF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAlyZXR1cm4gc2tiOwogfQogCi0vKiBJZiB0aGUgb3JpZ2luYWwgZnJhbWUgd2FzIGFuIEhTUiB0YWdnZWQgZnJhbWUsIGp1c3QgY2xvbmUgaXQgdG8gYmUgc2VudAotICogdW5jaGFuZ2VkLiBPdGhlcndpc2UsIGNyZWF0ZSBhIHByaXZhdGUgZnJhbWUgZXNwZWNpYWxseSB0YWdnZWQgZm9yICYjMzk7cG9ydCYjMzk7LgomIzQzOy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUmIzM5O3MgZGF0YSBwcml2YXRlLCBzbyB0aGF0IHBlci1lZ3Jlc3MKJiM0MzsgKiB3cml0ZXMgY2Fubm90IGNvcnJ1cHQgdGhlIG9yaWdpbmFsIHNrYiBvciBvdGhlciBjbG9uZXMgb2YgaXQuCiYjNDM7ICogUmV0dXJucyBOVUxMIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7CiYjNDM7CiYjNDM7CWNsb25lID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiYjNDM7CWlmICghY2xvbmUpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKHNrYl9jb3coY2xvbmUsIDApKSB7CiYjNDM7CQlrZnJlZV9za2IoY2xvbmUpOwomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIGNsb25lOwomIzQzO30KJiM0MzsKJiM0MzsvKiBJZiB0aGUgb3JpZ2luYWwgZnJhbWUgd2FzIGFuIEhTUiB0YWdnZWQgZnJhbWUsIHJldHVybiBhIHByaXZhdGUgY2xvbmUKJiM0MzsgKiBvZiBpdCB3aXRoIHRoZSBwYXRoIGlkIHVwZGF0ZWQgZm9yICYjMzk7cG9ydCYjMzk7LiBPdGhlcndpc2UsIHJldHVybiBhIHByaXZhdGUKJiM0MzsgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5CiYjNDM7ICogdGFnZ2VkIGZvciAmIzM5O3BvcnQmIzM5Oy4KICAqLwogc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsCiAJCQkJCXN0cnVjdCBoc3JfcG9ydCAqcG9ydCkKQEAgLTMzNiwxNCAmIzQzOzM1NywxOCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSwKIAlpbnQgbW92ZWxlbjsKIAogCWlmIChmcmFtZS0mZ3Q7c2tiX2hzcikgewotCQlzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkciA9Ci0JCQkoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihmcmFtZS0mZ3Q7c2tiX2hzcik7CiYjNDM7CQlzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjsKJiM0MzsKJiM0MzsJCXNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2JfaHNyKTsKJiM0MzsJCWlmICghc2tiKQomIzQzOwkJCXJldHVybiBOVUxMOwogCiAJCS8qIHNldCB0aGUgbGFuZSBpZCBwcm9wZXJseSAqLwomIzQzOwkJaHNyX2V0aGhkciA9IChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiAJCWhzcl9zZXRfcGF0aF9pZChmcmFtZSwgaHNyX2V0aGhkciwgcG9ydCk7Ci0JCXJldHVybiBza2JfY2xvbmUoZnJhbWUtJmd0O3NrYl9oc3IsIEdGUF9BVE9NSUMpOwomIzQzOwkJcmV0dXJuIHNrYjsKIAl9IGVsc2UgaWYgKHBvcnQtJmd0O2Rldi0mZ3Q7ZmVhdHVyZXMgJmFtcDsgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykgewotCQlyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLSZndDtza2Jfc3RkLCBHRlBfQVRPTUlDKTsKJiM0MzsJCXJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS0mZ3Q7c2tiX3N0ZCk7CiAJfQogCiAJLyogQ3JlYXRlIHRoZSBuZXcgc2tiIHdpdGggZW5vdWdoIGhlYWRyb29tIHRvIGZpdCB0aGUgSFNSIHRhZyAqLwpAQCAtMzc3LDE3ICYjNDM7NDAyLDIzIEBAIHN0cnVjdCBza19idWZmICpwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlpZiAoZnJhbWUtJmd0O3NrYl9wcnApIHsKLQkJc3RydWN0IHBycF9yY3QgKnRyYWlsZXIgPSBza2JfZ2V0X1BSUF9yY3QoZnJhbWUtJmd0O3NrYl9wcnApOwomIzQzOwkJc3RydWN0IHBycF9yY3QgKnRyYWlsZXI7CiYjNDM7CiYjNDM7CQlza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS0mZ3Q7c2tiX3BycCk7CiYjNDM7CQlpZiAoIXNrYikKJiM0MzsJCQlyZXR1cm4gTlVMTDsKIAomIzQzOwkJdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChza2IpOwogCQlpZiAodHJhaWxlcikgewogCQkJcHJwX3NldF9sYW5faWQodHJhaWxlciwgcG9ydCk7CiAJCX0gZWxzZSB7CiAJCQlXQVJOX09OQ0UoIXRyYWlsZXIsICYjMzQ7ZXJyb3JlZCBQUlAgc2tiJiMzNDspOwomIzQzOwkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJcmV0dXJuIHNrYl9jbG9uZShmcmFtZS0mZ3Q7c2tiX3BycCwgR0ZQX0FUT01JQyk7CiYjNDM7CQlyZXR1cm4gc2tiOwogCX0gZWxzZSBpZiAocG9ydC0mZ3Q7ZGV2LSZndDtmZWF0dXJlcyAmYW1wOyBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7Ci0JCXJldHVybiBza2JfY2xvbmUoZnJhbWUtJmd0O3NrYl9zdGQsIEdGUF9BVE9NSUMpOwomIzQzOwkJcmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2Jfc3RkKTsKIAl9CiAKIAlza2IgPSBza2JfY29weV9leHBhbmQoZnJhbWUtJmd0O3NrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS0mZ3Q7c2tiX3N0ZCksCkBAIC00MjAsNiAmIzQzOzQ1MSwyMiBAQCBzdGF0aWMgdm9pZCBoc3JfZGVsaXZlcl9tYXN0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LAogCQkgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSkKIHsKJiM0MzsJLyogQW4gaW50ZXJsaW5rLWJvdW5kIHNrYiBmcm9tIGdldF91bnRhZ2dlZF9mcmFtZSgpIGNhbiBzdGlsbCBhbGlhcwomIzQzOwkgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lCiYjNDM7CSAqIHNoYXJlcyB0aGUgb3JpZ2luYWwgVFggc2tiICh3aGljaCB0YXBzIG9yIHRoZSBUWCBwYXRoIG1heSBzdGlsbAomIzQzOwkgKiBob2xkKTsgZm9yIHJpbmcgZnJhbWVzIHRoZSBtYXN0ZXIgYWxzbyBjb25zdW1lcyB0aGVtIHdoZW4gdGhleQomIzQzOwkgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuCiYjNDM7CSAqIFByaXZhdGl6ZSBiZWZvcmUgYW55IGFkZHJlc3MgbXV0YXRpb24uCiYjNDM7CSAqLwomIzQzOwlpZiAocG9ydC0mZ3Q7dHlwZSA9PSBIU1JfUFRfSU5URVJMSU5LICZhbXA7JmFtcDsKJiM0MzsJICAgIChmcmFtZS0mZ3Q7cG9ydF9yY3YtJmd0O3R5cGUgPT0gSFNSX1BUX01BU1RFUiB8fAomIzQzOwkgICAgIChmcmFtZS0mZ3Q7aXNfbG9jYWxfZGVzdCAmYW1wOyZhbXA7ICFmcmFtZS0mZ3Q7aXNfbG9jYWxfZXhjbHVzaXZlKSkgJmFtcDsmYW1wOwomIzQzOwkgICAgc2tiX2Nvdyhza2IsIDApKSB7CiYjNDM7CQlmcmFtZS0mZ3Q7cG9ydF9yY3YtJmd0O2Rldi0mZ3Q7c3RhdHMucnhfZHJvcHBlZCYjNDM7JiM0Mzs7CiYjNDM7CQlrZnJlZV9za2Ioc2tiKTsKJiM0MzsJCXJldHVybiBORVRfWE1JVF9EUk9QOwomIzQzOwl9CiYjNDM7CiAJaWYgKGZyYW1lLSZndDtwb3J0X3Jjdi0mZ3Q7dHlwZSA9PSBIU1JfUFRfTUFTVEVSKSB7CiAJCWhzcl9hZGRyX3N1YnN0X2Rlc3QoZnJhbWUtJmd0O25vZGVfc3JjLCBza2IsIHBvcnQpOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZQppbmRleCAzMWZiOTMyNmNmNTMzLi44N2ZlMzQ5NTFiOGIwIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUKQEAgLTUsNiAmIzQzOzUsNyBAQCB0b3Bfc3JjZGlyID0gLi4vLi4vLi4vLi4vLi4KIFRFU1RfUFJPR1MgOj0gXAogCWhzcl9waW5nLnNoIFwKIAloc3JfcmVkYm94LnNoIFwKJiM0MzsJaHNyX3NoYXJlZF9tdXRhdGlvbi5zaCBcCiAJbGlua19mYXVsdHMuc2ggXAogCXBycF9waW5nLnNoIFwKICMgZW5kIG9mIFRFU1RfUFJPR1MKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvaHNyX3NoYXJlZF9tdXRhdGlvbi5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvaHNyX3NoYXJlZF9tdXRhdGlvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoCkBAIC0wLDAgJiM0MzsxLDI0MiBAQAomIzQzOyMhL2Jpbi9iYXNoCiYjNDM7IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyMKJiM0MzsjIFZlcmlmeSB0aGF0IHBlci1lZ3Jlc3MgbXV0YXRpb25zIG9mIHNoYXJlZCBza2IgZGF0YSBhcmUgcHJpdmF0ZToKJiM0MzsjCiYjNDM7IyBGMiAocGF0aC9MQU4gSUQpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgdGhlIHNlY29uZCBzbGF2ZSYjMzk7cyBMQU4tSUQgd3JpdGUKJiM0MzsjIGxhbmRzIGluIHRoZSBmaXJzdCBzbGF2ZSYjMzk7cyBzdGlsbC1xdWV1ZWQgY2xvbmU7IHdpdGggYSBuZXRlbSBkZWxheSBvbgomIzQzOyMgc2xhdmUgQSwgaW5qZWN0ZWQgZnJhbWVzIGxlYXZlIEEgY2FycnlpbmcgQiYjMzk7cyBMQU4gSUQuCiYjNDM7IwomIzQzOyMgRjEgKFJlZEJveCBzb3VyY2UgTUFDKTogb24gYW4gYWZmZWN0ZWQga2VybmVsIGFuIEhTUi10YWdnZWQgbXVsdGljYXN0CiYjNDM7IyBmcmFtZSByZWNlaXZlZCBvbiBhIFJlZEJveCBzbGF2ZSBpcyBjbG9uZWQgZm9yIG1hc3RlciBhbmQgaW50ZXJsaW5rLAomIzQzOyMgYW5kIHRoZSBpbnRlcmxpbmsmIzM5O3MgUmVkQm94LU1BQyByZXdyaXRlIGxhbmRzIGluIHRoZSBtYXN0ZXIgY2xvbmUmIzM5O3MKJiM0MzsjIGJ1ZmZlciwgc28gdGhlIGxvY2FsIHN0YWNrIHJlY2VpdmVzIHRoZSBSZWRCb3ggTUFDIGluc3RlYWQgb2YgdGhlCiYjNDM7IyBvcmlnaW5hdGluZyBub2RlJiMzOTtzIE1BQy4KJiM0MzsKJiM0MztpcHY2PWZhbHNlCiYjNDM7CiYjNDM7c291cmNlIC4vaHNyX2NvbW1vbi5zaAomIzQzOwomIzQzO0RVUj01CiYjNDM7CiYjNDM7cmVxdWlyZSgpCiYjNDM7ewomIzQzOwljb21tYW5kIC12ICYjMzQ7JDEmIzM0OyAmZ3Q7L2Rldi9udWxsIDImZ3Q7JmFtcDsxICZhbXA7JmFtcDsgcmV0dXJuIDAKJiM0MzsJZWNobyAmIzM0O1NLSVA6ICQxIG5vdCBhdmFpbGFibGUmIzM0OwomIzQzOwlleGl0ICRrc2Z0X3NraXAKJiM0Mzt9CiYjNDM7CiYjNDM7cmVxdWlyZSBpcAomIzQzO3JlcXVpcmUgdGMKJiM0MztyZXF1aXJlIHB5dGhvbjMKJiM0MzsKJiM0Mzt0cmFwIGNsZWFudXBfYWxsX25zIEVYSVQKJiM0MzsKJiM0MzsjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb24KJiM0MzsjIFBSUCBEQU5QIChwcm90byAxKSwgQUZfUEFDS0VUIHByZS10YWdnZWQgaW5qZWN0aW9uLCBuZXRlbSBvbiBzbGF2ZSBBLgomIzQzO3J1bl9mMigpCiYjNDM7ewomIzQzOwlzZXR1cF9ucyBucyAyJmd0Oy9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcAomIzQzOwluc3goKSB7IGlwIG5ldG5zIGV4ZWMgJiMzNDskbnMmIzM0OyAmIzM0OyRAJiMzNDs7IH0KJiM0MzsKJiM0MzsJIyBQcm9iZSBzY2hfbmV0ZW0gaW5zaWRlIHRoZSBkaXNwb3NhYmxlIG5hbWVzcGFjZSBvbmx5LgomIzQzOwlpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDImZ3Q7L2Rldi9udWxsOyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7U0tJUDogc2NoX25ldGVtIG5vdCBhdmFpbGFibGUmIzM0OwomIzQzOwkJcmV0dXJuICRrc2Z0X3NraXAKJiM0MzsJZmkKJiM0MzsJbnN4IHRjIHFkaXNjIGRlbCBkZXYgbG8gcm9vdCAyJmd0Oy9kZXYvbnVsbAomIzQzOwomIzQzOwkjIENhcGFiaWxpdHkgcHJvYmVzIGVuZCBoZXJlOyBzZXR1cCBvciBydW50aW1lIGZhaWx1cmUgYmVsb3cgaXMgRkFJTC4KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEEmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEImIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG8KJiM0MzsJCW5zeCBpcCBsaW5rIHNldCAmIzM0OyRpJiMzNDsgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogJGkgdXAmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZG9uZQomIzQzOwlpZiAhIG5zeCBpcCBsaW5rIGFkZCBuYW1lIHBycDAgdHlwZSBoc3Igc2xhdmUxIHZBIHNsYXZlMiB2QiBcCiYjNDM7CQlzdXBlcnZpc2lvbiA0NSBwcm90byAxIDImZ3Q7L2Rldi9udWxsOyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7U0tJUDogSFNSL1BSUCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsJiMzNDsKJiM0MzsJCXJldHVybiAka3NmdF9za2lwCiYjNDM7CWZpCiYjNDM7CW5zeCBpcCBsaW5rIHNldCBwcnAwIHVwIHx8IHsgZWNobyAmIzM0O0ZBSUw6IHBycDAgdXAmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IHRjIHFkaXNjIGFkZCBkZXYgdkEgcm9vdCBuZXRlbSBkZWxheSAyMDBtcyB8fAomIzQzOwkJeyBlY2hvICYjMzQ7RkFJTDogbmV0ZW0mIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsKJiM0MzsJbnN4IHB5dGhvbjMgL2Rldi9zdGRpbiAmIzM0OyREVVImIzM0OyAmbHQ7Jmx0OyYjMzk7UFlGMiYjMzk7CiYjNDM7aW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZQomIzQzOwomIzQzO2R1ciA9IGludChzeXMuYXJndlsxXSkKJiM0MztkZWYgbGFuaWQocGt0KToKJiM0MzsgICAgaWYgbGVuKHBrdCkgJmx0OyAyMCBvciBwa3RbLTI6XSAhPSBiJiMzNDtceDg4XHhmYiYjMzQ7OgomIzQzOyAgICAgICAgcmV0dXJuIE5vbmUKJiM0MzsgICAgcmV0dXJuIChwa3RbLTRdICZndDsmZ3Q7IDQpICZhbXA7IDB4RgomIzQzOwomIzQzO1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbigmIzM0Oy9zeXMvY2xhc3MvbmV0L3BycDAvYWRkcmVzcyYjMzQ7KS5yZWFkKCkucmVwbGFjZSgmIzM0OzomIzM0OywgJiMzNDsmIzM0OykpCiYjNDM7RFNUID0gYnl0ZXMuZnJvbWhleCgmIzM0OzAyYWFiYmNjZGQwMSYjMzQ7KQomIzQzO1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSkKJiM0MztyY3QwID0gc3RydWN0LnBhY2soJiMzNDsmZ3Q7SCYjMzQ7LCAwKSAmIzQzOyBzdHJ1Y3QucGFjaygmIzM0OyZndDtIJiMzNDssIDUyICZhbXA7IDB4MEZGRikgJiM0MzsgYiYjMzQ7XHg4OFx4ZmImIzM0OwomIzQzO2ZyYW1lID0gRFNUICYjNDM7IFNSQyAmIzQzOyBiJiMzNDtceDA4XHgwMCYjMzQ7ICYjNDM7IFBBWSAmIzQzOyByY3QwCiYjNDM7CiYjNDM7dHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKCYjMzQ7cHJwMCYjMzQ7LCAwKSkKJiM0MztzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLAomIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpCiYjNDM7c0EuYmluZCgoJiMzNDt2QXAmIzM0OywgMCkpCiYjNDM7c0IgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVywKJiM0MzsgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKQomIzQzO3NCLmJpbmQoKCYjMzQ7dkJwJiMzNDssIDApKQomIzQzO3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpCiYjNDM7CiYjNDM7YSwgYiA9IFtdLCBbXQomIzQzOwomIzQzO2RlZiBtYXRjaChwa3QpOgomIzQzOyAgICByZXR1cm4gKHBrdFs6Nl0gPT0gRFNUIGFuZCBwa3RbNjoxMl0gPT0gU1JDCiYjNDM7ICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYiYjMzQ7XHgwOFx4MDAmIzM0OyBhbmQgcGt0WzE0OjE0ICYjNDM7IGxlbihQQVkpXSA9PSBQQVkpCiYjNDM7CiYjNDM7ZGVmIGRyYWluKHRpbWVvdXQpOgomIzQzOyAgICB3YWl0ID0gdGltZW91dAomIzQzOyAgICB3aGlsZSBUcnVlOgomIzQzOyAgICAgICAgciwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3NBLCBzQl0sIFtdLCBbXSwgd2FpdCkKJiM0MzsgICAgICAgIGlmIG5vdCByOgomIzQzOyAgICAgICAgICAgIHJldHVybgomIzQzOyAgICAgICAgZm9yIHMgaW4gcjoKJiM0MzsgICAgICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpCiYjNDM7ICAgICAgICAgICAgaWYgbm90IG1hdGNoKHBrdCk6CiYjNDM7ICAgICAgICAgICAgICAgIGNvbnRpbnVlCiYjNDM7ICAgICAgICAgICAgbGlkID0gbGFuaWQocGt0KQomIzQzOyAgICAgICAgICAgIGlmIGxpZCBpcyBub3QgTm9uZToKJiM0MzsgICAgICAgICAgICAgICAgKGEgaWYgcyBpcyBzQSBlbHNlIGIpLmFwcGVuZChsaWQpCiYjNDM7ICAgICAgICB3YWl0ID0gMAomIzQzOwomIzQzOyMgRHJhaW4gd2hpbGUgc2VuZGluZyBzbyB0aGUgYnVyc3QgY2Fubm90IG92ZXJmbG93IHRoZSBjYXB0dXJlIHNvY2tldHMmIzM5OwomIzQzOyMgcmVjZWl2ZSBidWZmZXJzOyB0aGUgbmV0ZW0tZGVsYXllZCBBLXNpZGUgZnJhbWVzIGFycml2ZSBhZnRlcndhcmRzIGFuZAomIzQzOyMgYXJlIGNvbGxlY3RlZCBiZWxvdy4KJiM0Mztmb3IgXyBpbiByYW5nZSgyMDApOgomIzQzOyAgICB0eC5zZW5kKGZyYW1lKQomIzQzOyAgICBkcmFpbigwKQomIzQzOyAgICB0aW1lLnNsZWVwKDAuMDAxKQomIzQzOwomIzQzO2VuZCA9IHRpbWUudGltZSgpICYjNDM7IGR1cgomIzQzO3doaWxlIHRpbWUudGltZSgpICZsdDsgZW5kOgomIzQzOyAgICBkcmFpbigwLjMpCiYjNDM7CiYjNDM7cHJpbnQoJiMzNDtBLXNpZGUgY291bnQ9JWQgbGFuIGlkcz0lcyYjMzQ7ICUgKGxlbihhKSwgc29ydGVkKHNldChhKSkpKQomIzQzO3ByaW50KCYjMzQ7Qi1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXMmIzM0OyAlIChsZW4oYiksIHNvcnRlZChzZXQoYikpKSkKJiM0MztpZiBsZW4oYSkgJmx0OyAxNTAgb3IgbGVuKGIpICZsdDsgMTUwOgomIzQzOyAgICBwcmludCgmIzM0O0ZBSUw6IHRvbyBmZXcgaW5qZWN0ZWQgZnJhbWVzIGNhcHR1cmVkIChBPSVkIEI9JWQsIHNlbnQgMjAwKSYjMzQ7CiYjNDM7ICAgICAgICAgICUgKGxlbihhKSwgbGVuKGIpKSkKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztiYWRfYSA9IFt4IGZvciB4IGluIGEgaWYgKHggJmFtcDsgMSkgIT0gMF0KJiM0MztiYWRfYiA9IFt4IGZvciB4IGluIGIgaWYgKHggJmFtcDsgMSkgIT0gMV0KJiM0MztpZiBiYWRfYSBvciBiYWRfYjoKJiM0MzsgICAgcHJpbnQoJiMzNDtGQUlMOiBzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbiAtIEE6ICVkLyVkIHdyb25nLWxhbiwmIzM0OwomIzQzOyAgICAgICAgICAmIzM0OyBCOiAlZC8lZCB3cm9uZy1sYW4mIzM0OwomIzQzOyAgICAgICAgICAlIChsZW4oYmFkX2EpLCBsZW4oYSksIGxlbihiYWRfYiksIGxlbihiKSkpCiYjNDM7ICAgIHN5cy5leGl0KDEpCiYjNDM7cHJpbnQoJiMzNDtQQVNTOiBwZXItZWdyZXNzIExBTiBJRHMgaXNvbGF0ZWQgKEEgYWxsIGJpdDA9MCwgQiBhbGwgYml0MD0xKSYjMzQ7KQomIzQzO3N5cy5leGl0KDApCiYjNDM7UFlGMgomIzQzO30KJiM0MzsKJiM0MzsjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGMTogUmVkQm94IHNvdXJjZS1NQUMgcHJpdmFjeQomIzQzOyMgSFNSIFJlZEJveCAocHJvdG8gMCksIHRhZ2dlZCBtdWx0aWNhc3QgZnJvbSBhIHNsYXZlOiBtYXN0ZXIgbXVzdCBrZWVwCiYjNDM7IyB0aGUgbm9kZSBNQUMsIGludGVybGluayBtdXN0IGNhcnJ5IHRoZSBSZWRCb3ggTUFDLgomIzQzO3J1bl9mMSgpCiYjNDM7ewomIzQzOwlzZXR1cF9ucyBucyAyJmd0Oy9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcAomIzQzOwluc3goKSB7IGlwIG5ldG5zIGV4ZWMgJiMzNDskbnMmIzM0OyAmIzM0OyRAJiMzNDs7IH0KJiM0MzsKJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEEmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEImIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEkmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZm9yIGkgaW4gdkEgdkIgdkkgdkFwIHZCcCB2SXA7IGRvCiYjNDM7CQluc3ggaXAgbGluayBzZXQgJiMzNDskaSYjMzQ7IHVwIHx8IHsgZWNobyAmIzM0O0ZBSUw6ICRpIHVwJiMzNDs7IHJldHVybiAxOyB9CiYjNDM7CWRvbmUKJiM0MzsJaWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBoc3IwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXAomIzQzOwkJaW50ZXJsaW5rIHZJIHN1cGVydmlzaW9uIDQ1IHByb3RvIDAgMiZndDsvZGV2L251bGw7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtTS0lQOiBIU1IgUmVkQm94IG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWwmIzM0OwomIzQzOwkJcmV0dXJuICRrc2Z0X3NraXAKJiM0MzsJZmkKJiM0MzsJbnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogaHNyMCB1cCYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwomIzQzOwluc3ggcHl0aG9uMyAvZGV2L3N0ZGluICZsdDsmbHQ7JiMzOTtQWUYxJiMzOTsKJiM0MztpbXBvcnQgc29ja2V0LCBzZWxlY3QsIHN5cywgdGltZQomIzQzOwomIzQzO05PREUgID0gYnl0ZXMuZnJvbWhleCgmIzM0OzAyMTEyMjMzNDQ1NSYjMzQ7KQomIzQzO01DQVNUID0gYnl0ZXMuZnJvbWhleCgmIzM0OzAxMDA1ZTAwMDAwMSYjMzQ7KQomIzQzO1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKCYjMzQ7L3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzcyYjMzQ7KS5yZWFkKCkucmVwbGFjZSgmIzM0OzomIzM0OywgJiMzNDsmIzM0OykpCiYjNDM7UEFZICAgPSBieXRlcyhyYW5nZSg0NikpCiYjNDM7CiYjNDM7ZGVmIGZyYW1lKHNlcSk6CiYjNDM7ICAgICMgTFNEVSBzaXplID0gcGF5bG9hZCAmIzQzOyBIU1IgdGFnIChIU1JfSExFTiksIGFzIGhzcl9maWxsX3RhZygpIGNvbXB1dGVzIGl0CiYjNDM7ICAgIHRhZyA9ICgoKDEgJmx0OyZsdDsgMTIpIHwgKGxlbihQQVkpICYjNDM7IDYpKS50b19ieXRlcygyLCAmIzM0O2JpZyYjMzQ7KQomIzQzOyAgICAgICAgICAgJiM0Mzsgc2VxLnRvX2J5dGVzKDIsICYjMzQ7YmlnJiMzNDspICYjNDM7IGImIzM0O1x4MDhceDAwJiMzNDspCiYjNDM7ICAgIHJldHVybiBNQ0FTVCAmIzQzOyBOT0RFICYjNDM7IGImIzM0O1x4ODlceDJmJiMzNDsgJiM0MzsgdGFnICYjNDM7IFBBWQomIzQzOwomIzQzO3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKCgmIzM0O3ZBcCYjMzQ7LCAwKSkKJiM0MztzbSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLAomIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpCiYjNDM7c20uYmluZCgoJiMzNDtoc3IwJiMzNDssIDApKQomIzQzO3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsCiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSkKJiM0MztzaS5iaW5kKCgmIzM0O3ZJcCYjMzQ7LCAwKSkKJiM0MztzbS5zZXRibG9ja2luZyhGYWxzZSk7IHNpLnNldGJsb2NraW5nKEZhbHNlKQomIzQzOwomIzQzO2ZvciBpIGluIHJhbmdlKDMpOgomIzQzOyAgICB0eC5zZW5kKGZyYW1lKGkgJiM0MzsgMSkpOyB0aW1lLnNsZWVwKDAuMDUpCiYjNDM7CiYjNDM7bV9zcmMgPSBpX3NyYyA9IE5vbmUKJiM0MztlbmQgPSB0aW1lLnRpbWUoKSAmIzQzOyA0CiYjNDM7d2hpbGUgdGltZS50aW1lKCkgJmx0OyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOgomIzQzOyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpCiYjNDM7ICAgIGZvciBzIGluIHI6CiYjNDM7ICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpCiYjNDM7ICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7CiYjNDM7ICAgICAgICAjIGhfc291cmNlIGlzIHRoZSBhc3NlcnRlZCB2YWx1ZSBhbmQgbXVzdCBOT1QgYmUgZmlsdGVyZWQgb24KJiM0MzsgICAgICAgIGlmIChsZW4ocGt0KSAmbHQ7IDYwIG9yIHBrdFs6Nl0gIT0gTUNBU1Qgb3IgcGt0WzEyOjE0XSAhPSBiJiMzNDtceDA4XHgwMCYjMzQ7CiYjNDM7ICAgICAgICAgICAgICAgIG9yIHBrdFsxNDoxNCAmIzQzOyBsZW4oUEFZKV0gIT0gUEFZKToKJiM0MzsgICAgICAgICAgICBjb250aW51ZQomIzQzOyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZToKJiM0MzsgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXQomIzQzOyAgICAgICAgZWxpZiBzIGlzIHNpIGFuZCBpX3NyYyBpcyBOb25lOgomIzQzOyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdCiYjNDM7CiYjNDM7cHJpbnQoJiMzNDttYXN0ZXIgaF9zb3VyY2UgICAgPSYjMzQ7LCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpCiYjNDM7cHJpbnQoJiMzNDtub2RlIE1BQyAgICAgICAgICAgPSYjMzQ7LCBOT0RFLmhleCgpKQomIzQzO3ByaW50KCYjMzQ7aW50ZXJsaW5rIGhfc291cmNlID0mIzM0OywgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKQomIzQzO3ByaW50KCYjMzQ7cmVkYm94IE1BQyAgICAgICAgID0mIzM0OywgUkIuaGV4KCkpCiYjNDM7aWYgaV9zcmMgIT0gUkI6CiYjNDM7ICAgIHByaW50KCYjMzQ7RkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUMmIzM0OykKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztpZiBtX3NyYyAhPSBOT0RFOgomIzQzOyAgICBwcmludCgmIzM0O0ZBSUw6IG1hc3RlciByZWNlaXZlZCAlcyBpbnN0ZWFkIG9mIHRoZSBub2RlIE1BQyAmIzM0OwomIzQzOyAgICAgICAgICAmIzM0OyhzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbikmIzM0OwomIzQzOyAgICAgICAgICAlIChtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlICYjMzQ7bm90aGluZyYjMzQ7KSkKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztwcmludCgmIzM0O1BBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDJiMzNDspCiYjNDM7c3lzLmV4aXQoMCkKJiM0MztQWUYxCiYjNDM7fQomIzQzOwomIzQzO3JjPTAKJiM0MzsKJiM0MztydW5fZjIKJiM0MztyZXQ9JD8KJiM0MztyYz0kKGtzZnRfc3RhdHVzX21lcmdlICYjMzQ7JHJjJiMzNDsgJiMzNDskcmV0JiMzNDspCiYjNDM7CiYjNDM7cnVuX2YxCiYjNDM7cmV0PSQ/CiYjNDM7cmM9JChrc2Z0X3N0YXR1c19tZXJnZSAmIzM0OyRyYyYjMzQ7ICYjMzQ7JHJldCYjMzQ7KQomIzQzOwomIzQzO2lmIFsgJiMzNDskcmMmIzM0OyAtZXEgMCBdOyB0aGVuCiYjNDM7CWVjaG8gJiMzNDtoc3Jfc2hhcmVkX211dGF0aW9uOiBwZXItZWdyZXNzIG11dGF0aW9uIGlzb2xhdGlvbiAoRjEmIzQzO0YyKSBbIE9LIF0mIzM0OwomIzQzO2VsaWYgWyAmIzM0OyRyYyYjMzQ7IC1lcSAmIzM0OyRrc2Z0X3NraXAmIzM0OyBdOyB0aGVuCiYjNDM7CWVjaG8gJiMzNDtoc3Jfc2hhcmVkX211dGF0aW9uOiBzdWJ0ZXN0cyBza2lwcGVkIChjYXBhYmlsaXRpZXMgbWlzc2luZykmIzM0OwomIzQzO2Vsc2UKJiM0MzsJZWNobyAmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHBlci1lZ3Jlc3MgbXV0YXRpb24gaXNvbGF0aW9uIFsgRkFJTCBdJiMzNDsgXAomIzQzOwkJJiMzNDtyYz0kcmMmIzM0OyAxJmd0OyZhbXA7MgomIzQzO2ZpCiYjNDM7ZXhpdCAmIzM0OyRyYyYjMzQ7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODAwCgkJCQkJCQlvdXRwdXQ6IDE2MgoJCQkJCQkJdGhvdWdodHM6IDEwMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBIU1IgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5KioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gbG9va2luZyBvdmVyIHRoaXMgcGF0Y2ggdGhhdCBtb2RpZmllcyBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQmIzM5O3MgZGVzaWduZWQgdG8gZml4IGRhdGEgY29ycnVwdGlvbiBzdGVtbWluZyBmcm9tIHNoYXJlZCBgc2tiYCBkYXRhIGluIHRoZSBIU1IgbW9kdWxlLCBzcGVjaWZpY2FsbHkgd2hlbiBoYW5kbGluZyBtdWx0aXBsZSBlZ3Jlc3MgcGF0aHMuIFRoZSBjb3JlIG9mIHRoZSBmaXggcmV2b2x2ZXMgYXJvdW5kIHByaXZhdGl6aW5nIHRoZSBgc2tiYCBkYXRhIGJlZm9yZSBtb2RpZmljYXRpb24gdG8gYXZvaWQgY3Jvc3MtdGFsayBiZXR3ZWVuIGRpZmZlcmVudCBjbG9uZXMsIHdoaWNoIG1ha2VzIHNlbnNlLgoKVGhlIHByaW1hcnkgY2hhbmdlcyBpbnZvbHZlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYGhzcl9jbG9uZV9wcml2YXRlKClgLCB3aGljaCBjb21iaW5lcyBgc2tiX2Nsb25lKClgIGFuZCBgc2tiX2NvdygpYC4gVGhpcyBuZXcgZnVuY3Rpb24gcmVwbGFjZXMgdGhlIHJhdyBgc2tiX2Nsb25lKClgIGNhbGxzIGluIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgLiBBZGRpdGlvbmFsbHksIGEgY2hlY2sgaGFzIGJlZW4gYWRkZWQgaW4gYGhzcl94bWl0KClgIHRvIHVzZSBgc2tiX2NvdygpYCBmb3IgaW50ZXJsaW5rLWJvdW5kIFNLQnMuCgpNeSBwcmltYXJ5IGNvbmNlcm4sIGdpdmVuIHRoZSBjb250ZXh0LCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBleHBvc2VzIG9yIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBFc3NlbnRpYWxseSwgd2UmIzM5O3JlIHRyeWluZyB0byBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbi4gVGhlIHNoYXJlZCBkYXRhIGlzc3VlIGlzIHRoZSBwcm9ibGVtLiBXaGVuIG11bHRpcGxlIGVncmVzcyBwYXRocyBtdXRhdGUgc2tiIGRhdGEsIHRoZXkgY2hhbmdlIHNoYXJlZCBkYXRhLCB3aGljaCwgaWYgbm90IGRvbmUgY29ycmVjdGx5LCBjYW4gY2F1c2UgaXNzdWVzIHdpdGggb3RoZXIgY2xvbmVzLiBUaGUgZml4IHVzZXMgYHNrYl9jb3coKWAgdG8gZW5zdXJlIHRoYXQgdGhlIHNrYiBoYXMgcHJpdmF0ZSBkYXRhLgoKTXkgYW5hbHlzaXMgZm9jdXNlcyBvbiB0aGlzIHBvaW50LiBgc2tiX2Nvdyhza2IsIDApYCBpcyBjcml0aWNhbCBoZXJlLiBJdCBlbnN1cmVzIHRoYXQgdGhlIFNLQiBlaXRoZXIgYWxyZWFkeSBoYXMgYSBwcml2YXRlIGhlYWQgKGFuZCBkYXRhKSwgb3Igd2lsbCByZWFsbG9jYXRlIHRoZW0uIEltcG9ydGFudGx5LCB0aGlzIHJlYWxsb2NhdGlvbiAqY29waWVzKiBleGlzdGluZyBkYXRhLCBpdCBkb2VzbiYjMzk7dCBsZWF2ZSBhbnkgcGFydCBvZiB0aGUgYnVmZmVyIHVuaW5pdGlhbGl6ZWQuIFdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBsb2dpY2FsIGJ1ZyDigJMgZGF0YSBjb3JydXB0aW9uIGR1ZSB0byBpbmNvcnJlY3Qgc2hhcmluZyDigJMgbm90IGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgb3IgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWsuIFRoZSAmIzM0O2NvcnJ1cHRlZCYjMzQ7IGRhdGEgaXMgdmFsaWQgcGFja2V0IGRhdGEuIEl0JiMzOTtzIGp1c3QgKmluY29ycmVjdCogZm9yIGEgc3BlY2lmaWMgY2xvbmUuIFRoZXJlJiMzOTtzIG5vIHNjZW5hcmlvIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4KCkkmIzM5O3ZlIGRvdWJsZS1jaGVja2VkIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBgc2tiX2NvdygpYC4gSXQgdWx0aW1hdGVseSBjYWxscyBgX19za2JfY293KClgLCB3aGljaCB0aGVuIHVzZXMgYHBza2JfZXhwYW5kX2hlYWRgIGlmIGEgcmVhbGxvY2F0aW9uIGlzIG5lZWRlZC4gV2hpbGUgdGhlIG5ld2x5IGFsbG9jYXRlZCBoZWFkcm9vbS90YWlscm9vbSBpbiBgcHNrYl9leHBhbmRfaGVhZGAgKmlzKiB1bmluaXRpYWxpemVkLCBpdCBpcyAqb3V0c2lkZSogdGhlIGBza2ItJmd0O2RhdGFgIHRvIGBza2ItJmd0O3RhaWxgIHJhbmdlLiBUaHVzLCBpdCYjMzk7cyBub3QgcmVhZCB1bmxlc3MgZXhwbGljaXRseSBwdXNoZWQvcHV0LCB3aGljaCBpcyBzdGFuZGFyZCBza2IgYmVoYXZpb3IuCgpUaGUgcGF0Y2gmIzM5O3MgY2hhbmdlcyBjYW4gYmUgc3VtbWFyaXplZCBhczoKCjEuICBgaHNyX2Nsb25lX3ByaXZhdGUoKWA6IENsb25lcyBhbmQgcHJpdmF0aXplcyBhbiBza2IuCjIuICBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoKWAgYW5kIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYDogUmVwbGFjZSBjbG9uZSB3aXRoIHByaXZhdGUgY2xvbmUuCjMuICBgaHNyX3htaXQoKWA6ICBQcml2YXRpemVzIGZvciBpbnRlcmxpbmsgcG9ydHMgYmVmb3JlIG11dGF0aW9uLgoKTm9uZSBvZiB0aGVzZSBjaGFuZ2VzICppbnRyb2R1Y2UqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gVGhleSBhcmUgYWxsIGFib3V0IHByb3Blcmx5IHByaXZhdGl6aW5nIHRoZSBza2IgZGF0YSB0byBwcmV2ZW50IHVuaW50ZW5kZWQgZGF0YSBzaGFyaW5nIGFuZCBtb2RpZmljYXRpb24sIGEgY2xhc3NpYyBzaGFyZWQtbXV0YWJsZS1zdGF0ZSBidWcuIFRoZSBwYXRjaCBkb2VzbiYjMzk7dCBpbnZvbHZlIGFueSBjb21wbGV4IHN0cnVjdHVyZSBhbGxvY2F0aW9ucyB0aGF0IG1pZ2h0IGxlYXZlIGZpZWxkcyB1bmluaXRpYWxpemVkLiBTdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgbWVtb3J5IHNhZmV0eSBoZXJlLiBLTVNBTiBpcyBub3QgYXBwbGljYWJsZSBhcyB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBUaGVyZWZvcmUsIHRoZSAmIzM0O05lZWRzS01TQU4mIzM0OyBmbGFnIHNob3VsZCBiZSBgZmFsc2VgLiBUaGUgcmVhc29uaW5nIGlzIHRoYXQgdGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgcmVsYXRlZCB0byBzaGFyZWQgZGF0YSBjb3JydXB0aW9uIHdpdGggYHNrYl9jb3coKWAgYW5kIHRoaXMgZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrcyByZWxhdGVkIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJJiMzOTttIGNvbmZpZGVudCBhYm91dCB0aGlzLiBJJiMzOTtsbCBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjYWxsIGFuZCBtYXJrIGl0IGFzIHN1Y2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTE6NTcuNjQ0Mzg2MjA4WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTk2NzY3MDcwNjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFNSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHNyX2ZvcndhcmRfc2tiXCIsXG4gICAgXCJoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZVwiLFxuICAgIFwicHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUxOjU3LjY0NDM5MjE5OFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE4MDU0NTU3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDFjODYwYjQ0NTQ2ZDQ0Mjk2ZWQ5MWJjYzVkODc3OTU4OWQ1ZTBjODBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9uZXQvaHNyL2hzcl9mb3J3YXJkLmMgYi9uZXQvaHNyL2hzcl9mb3J3YXJkLmNcXG5pbmRleCAwNzc0OTgxYTY1YzE2Li5lZmNiZjNjZjI2ZjliIDEwMDY0NFxcbi0tLSBhL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xcbisrKyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xcbkBAIC0zMjUsOCArMzI1LDI5IEBAIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2ZpbGxfdGFnKHN0cnVjdCBza19idWZmICpza2IsXFxuIFxcdHJldHVybiBza2I7XFxuIH1cXG4gXFxuLS8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwganVzdCBjbG9uZSBpdCB0byBiZSBzZW50XFxuLSAqIHVuY2hhbmdlZC4gT3RoZXJ3aXNlLCBjcmVhdGUgYSBwcml2YXRlIGZyYW1lIGVzcGVjaWFsbHkgdGFnZ2VkIGZvciAncG9ydCcuXFxuKy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUncyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzc1xcbisgKiB3cml0ZXMgY2Fubm90IGNvcnJ1cHQgdGhlIG9yaWdpbmFsIHNrYiBvciBvdGhlciBjbG9uZXMgb2YgaXQuXFxuKyAqIFJldHVybnMgTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuKyAqL1xcbitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpXFxuK3tcXG4rXFx0c3RydWN0IHNrX2J1ZmYgKmNsb25lO1xcbitcXG4rXFx0Y2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTtcXG4rXFx0aWYgKCFjbG9uZSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChza2JfY293KGNsb25lLCAwKSkge1xcbitcXHRcXHRrZnJlZV9za2IoY2xvbmUpO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIGNsb25lO1xcbit9XFxuK1xcbisvKiBJZiB0aGUgb3JpZ2luYWwgZnJhbWUgd2FzIGFuIEhTUiB0YWdnZWQgZnJhbWUsIHJldHVybiBhIHByaXZhdGUgY2xvbmVcXG4rICogb2YgaXQgd2l0aCB0aGUgcGF0aCBpZCB1cGRhdGVkIGZvciAncG9ydCcuIE90aGVyd2lzZSwgcmV0dXJuIGEgcHJpdmF0ZVxcbisgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XFxuKyAqIHRhZ2dlZCBmb3IgJ3BvcnQnLlxcbiAgKi9cXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXFxuIFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcXG5AQCAtMzM2LDE0ICszNTcsMTggQEAgc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXFxuIFxcdGludCBtb3ZlbGVuO1xcbiBcXG4gXFx0aWYgKGZyYW1lLVxcdTAwM2Vza2JfaHNyKSB7XFxuLVxcdFxcdHN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyID1cXG4tXFx0XFx0XFx0KHN0cnVjdCBoc3JfZXRoaGRyICopc2tiX21hY19oZWFkZXIoZnJhbWUtXFx1MDAzZXNrYl9oc3IpO1xcbitcXHRcXHRzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjtcXG4rXFxuK1xcdFxcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2JfaHNyKTtcXG4rXFx0XFx0aWYgKCFza2IpXFxuK1xcdFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4gXFx0XFx0Lyogc2V0IHRoZSBsYW5lIGlkIHByb3Blcmx5ICovXFxuK1xcdFxcdGhzcl9ldGhoZHIgPSAoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpO1xcbiBcXHRcXHRoc3Jfc2V0X3BhdGhfaWQoZnJhbWUsIGhzcl9ldGhoZHIsIHBvcnQpO1xcbi1cXHRcXHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVxcdTAwM2Vza2JfaHNyLCBHRlBfQVRPTUlDKTtcXG4rXFx0XFx0cmV0dXJuIHNrYjtcXG4gXFx0fSBlbHNlIGlmIChwb3J0LVxcdTAwM2VkZXYtXFx1MDAzZWZlYXR1cmVzIFxcdTAwMjYgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykge1xcbi1cXHRcXHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVxcdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcXG4rXFx0XFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2Jfc3RkKTtcXG4gXFx0fVxcbiBcXG4gXFx0LyogQ3JlYXRlIHRoZSBuZXcgc2tiIHdpdGggZW5vdWdoIGhlYWRyb29tIHRvIGZpdCB0aGUgSFNSIHRhZyAqL1xcbkBAIC0zNzcsMTcgKzQwMiwyMyBAQCBzdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG4gXFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4gXFxuIFxcdGlmIChmcmFtZS1cXHUwMDNlc2tiX3BycCkge1xcbi1cXHRcXHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS1cXHUwMDNlc2tiX3BycCk7XFxuK1xcdFxcdHN0cnVjdCBwcnBfcmN0ICp0cmFpbGVyO1xcbitcXG4rXFx0XFx0c2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXFx1MDAzZXNrYl9wcnApO1xcbitcXHRcXHRpZiAoIXNrYilcXG4rXFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIFxcbitcXHRcXHR0cmFpbGVyID0gc2tiX2dldF9QUlBfcmN0KHNrYik7XFxuIFxcdFxcdGlmICh0cmFpbGVyKSB7XFxuIFxcdFxcdFxcdHBycF9zZXRfbGFuX2lkKHRyYWlsZXIsIHBvcnQpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHRXQVJOX09OQ0UoIXRyYWlsZXIsIFxcXCJlcnJvcmVkIFBSUCBza2JcXFwiKTtcXG4rXFx0XFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuIFxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXHRcXHR9XFxuLVxcdFxcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXFx1MDAzZXNrYl9wcnAsIEdGUF9BVE9NSUMpO1xcbitcXHRcXHRyZXR1cm4gc2tiO1xcbiBcXHR9IGVsc2UgaWYgKHBvcnQtXFx1MDAzZWRldi1cXHUwMDNlZmVhdHVyZXMgXFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XFxuLVxcdFxcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXFx1MDAzZXNrYl9zdGQsIEdGUF9BVE9NSUMpO1xcbitcXHRcXHRyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXFx1MDAzZXNrYl9zdGQpO1xcbiBcXHR9XFxuIFxcbiBcXHRza2IgPSBza2JfY29weV9leHBhbmQoZnJhbWUtXFx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cXHUwMDNlc2tiX3N0ZCksXFxuQEAgLTQyMCw2ICs0NTEsMjIgQEAgc3RhdGljIHZvaWQgaHNyX2RlbGl2ZXJfbWFzdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxcbiBcXHRcXHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcXG4ge1xcbitcXHQvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzXFxuK1xcdCAqIGFub3RoZXIgbGl2ZSBjb25zdW1lcjogZm9yIG1hc3Rlci1vcmlnaW5hdGVkIGZyYW1lcyB0aGUgY2xvbmVcXG4rXFx0ICogc2hhcmVzIHRoZSBvcmlnaW5hbCBUWCBza2IgKHdoaWNoIHRhcHMgb3IgdGhlIFRYIHBhdGggbWF5IHN0aWxsXFxuK1xcdCAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5XFxuK1xcdCAqIGFyZSBkZXN0aW5lZCB0byB0aGUgbG9jYWwgbm9kZSB3aXRob3V0IGJlaW5nIGV4Y2x1c2l2ZSB0byBpdC5cXG4rXFx0ICogUHJpdmF0aXplIGJlZm9yZSBhbnkgYWRkcmVzcyBtdXRhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGlmIChwb3J0LVxcdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChmcmFtZS1cXHUwMDNlcG9ydF9yY3YtXFx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUiB8fFxcbitcXHQgICAgIChmcmFtZS1cXHUwMDNlaXNfbG9jYWxfZGVzdCBcXHUwMDI2XFx1MDAyNiAhZnJhbWUtXFx1MDAzZWlzX2xvY2FsX2V4Y2x1c2l2ZSkpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBza2JfY293KHNrYiwgMCkpIHtcXG4rXFx0XFx0ZnJhbWUtXFx1MDAzZXBvcnRfcmN2LVxcdTAwM2VkZXYtXFx1MDAzZXN0YXRzLnJ4X2Ryb3BwZWQrKztcXG4rXFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuK1xcdFxcdHJldHVybiBORVRfWE1JVF9EUk9QO1xcbitcXHR9XFxuK1xcbiBcXHRpZiAoZnJhbWUtXFx1MDAzZXBvcnRfcmN2LVxcdTAwM2V0eXBlID09IEhTUl9QVF9NQVNURVIpIHtcXG4gXFx0XFx0aHNyX2FkZHJfc3Vic3RfZGVzdChmcmFtZS1cXHUwMDNlbm9kZV9zcmMsIHNrYiwgcG9ydCk7XFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxcbmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGVcXG5AQCAtNSw2ICs1LDcgQEAgdG9wX3NyY2RpciA9IC4uLy4uLy4uLy4uLy4uXFxuIFRFU1RfUFJPR1MgOj0gXFxcXFxcbiBcXHRoc3JfcGluZy5zaCBcXFxcXFxuIFxcdGhzcl9yZWRib3guc2ggXFxcXFxcbitcXHRoc3Jfc2hhcmVkX211dGF0aW9uLnNoIFxcXFxcXG4gXFx0bGlua19mYXVsdHMuc2ggXFxcXFxcbiBcXHRwcnBfcGluZy5zaCBcXFxcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoXFxubmV3IGZpbGUgbW9kZSAxMDA3NTVcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvaHNyX3NoYXJlZF9tdXRhdGlvbi5zaFxcbkBAIC0wLDAgKzEsMjQyIEBAXFxuKyMhL2Jpbi9iYXNoXFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI1xcbisjIFZlcmlmeSB0aGF0IHBlci1lZ3Jlc3MgbXV0YXRpb25zIG9mIHNoYXJlZCBza2IgZGF0YSBhcmUgcHJpdmF0ZTpcXG4rI1xcbisjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJ3MgTEFOLUlEIHdyaXRlXFxuKyMgbGFuZHMgaW4gdGhlIGZpcnN0IHNsYXZlJ3Mgc3RpbGwtcXVldWVkIGNsb25lOyB3aXRoIGEgbmV0ZW0gZGVsYXkgb25cXG4rIyBzbGF2ZSBBLCBpbmplY3RlZCBmcmFtZXMgbGVhdmUgQSBjYXJyeWluZyBCJ3MgTEFOIElELlxcbisjXFxuKyMgRjEgKFJlZEJveCBzb3VyY2UgTUFDKTogb24gYW4gYWZmZWN0ZWQga2VybmVsIGFuIEhTUi10YWdnZWQgbXVsdGljYXN0XFxuKyMgZnJhbWUgcmVjZWl2ZWQgb24gYSBSZWRCb3ggc2xhdmUgaXMgY2xvbmVkIGZvciBtYXN0ZXIgYW5kIGludGVybGluayxcXG4rIyBhbmQgdGhlIGludGVybGluaydzIFJlZEJveC1NQUMgcmV3cml0ZSBsYW5kcyBpbiB0aGUgbWFzdGVyIGNsb25lJ3NcXG4rIyBidWZmZXIsIHNvIHRoZSBsb2NhbCBzdGFjayByZWNlaXZlcyB0aGUgUmVkQm94IE1BQyBpbnN0ZWFkIG9mIHRoZVxcbisjIG9yaWdpbmF0aW5nIG5vZGUncyBNQUMuXFxuK1xcbitpcHY2PWZhbHNlXFxuK1xcbitzb3VyY2UgLi9oc3JfY29tbW9uLnNoXFxuK1xcbitEVVI9NVxcbitcXG4rcmVxdWlyZSgpXFxuK3tcXG4rXFx0Y29tbWFuZCAtdiBcXFwiJDFcXFwiIFxcdTAwM2UvZGV2L251bGwgMlxcdTAwM2VcXHUwMDI2MSBcXHUwMDI2XFx1MDAyNiByZXR1cm4gMFxcbitcXHRlY2hvIFxcXCJTS0lQOiAkMSBub3QgYXZhaWxhYmxlXFxcIlxcbitcXHRleGl0ICRrc2Z0X3NraXBcXG4rfVxcbitcXG4rcmVxdWlyZSBpcFxcbityZXF1aXJlIHRjXFxuK3JlcXVpcmUgcHl0aG9uM1xcbitcXG4rdHJhcCBjbGVhbnVwX2FsbF9ucyBFWElUXFxuK1xcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb25cXG4rIyBQUlAgREFOUCAocHJvdG8gMSksIEFGX1BBQ0tFVCBwcmUtdGFnZ2VkIGluamVjdGlvbiwgbmV0ZW0gb24gc2xhdmUgQS5cXG4rcnVuX2YyKClcXG4re1xcbitcXHRzZXR1cF9ucyBucyAyXFx1MDAzZS9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcFxcbitcXHRuc3goKSB7IGlwIG5ldG5zIGV4ZWMgXFxcIiRuc1xcXCIgXFxcIiRAXFxcIjsgfVxcbitcXG4rXFx0IyBQcm9iZSBzY2hfbmV0ZW0gaW5zaWRlIHRoZSBkaXNwb3NhYmxlIG5hbWVzcGFjZSBvbmx5LlxcbitcXHRpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDJcXHUwMDNlL2Rldi9udWxsOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIlNLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXFxcIlxcbitcXHRcXHRyZXR1cm4gJGtzZnRfc2tpcFxcbitcXHRmaVxcbitcXHRuc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDJcXHUwMDNlL2Rldi9udWxsXFxuK1xcbitcXHQjIENhcGFiaWxpdHkgcHJvYmVzIGVuZCBoZXJlOyBzZXR1cCBvciBydW50aW1lIGZhaWx1cmUgYmVsb3cgaXMgRkFJTC5cXG4rXFx0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XFxuK1xcdFxcdHsgZWNobyBcXFwiRkFJTDogdmV0aCBBXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XFxuK1xcdFxcdHsgZWNobyBcXFwiRkFJTDogdmV0aCBCXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cXG4rXFx0XFx0bnN4IGlwIGxpbmsgc2V0IFxcXCIkaVxcXCIgdXAgfHwgeyBlY2hvIFxcXCJGQUlMOiAkaSB1cFxcXCI7IHJldHVybiAxOyB9XFxuK1xcdGRvbmVcXG4rXFx0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBwcnAwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcXFxcbitcXHRcXHRzdXBlcnZpc2lvbiA0NSBwcm90byAxIDJcXHUwMDNlL2Rldi9udWxsOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIlNLSVA6IEhTUi9QUlAgbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFxcXCJcXG4rXFx0XFx0cmV0dXJuICRrc2Z0X3NraXBcXG4rXFx0ZmlcXG4rXFx0bnN4IGlwIGxpbmsgc2V0IHBycDAgdXAgfHwgeyBlY2hvIFxcXCJGQUlMOiBwcnAwIHVwXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0bnN4IHRjIHFkaXNjIGFkZCBkZXYgdkEgcm9vdCBuZXRlbSBkZWxheSAyMDBtcyB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IG5ldGVtXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFxuK1xcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXFxcIiREVVJcXFwiIFxcdTAwM2NcXHUwMDNjJ1BZRjInXFxuK2ltcG9ydCBzb2NrZXQsIHN0cnVjdCwgc2VsZWN0LCBzeXMsIHRpbWVcXG4rXFxuK2R1ciA9IGludChzeXMuYXJndlsxXSlcXG4rZGVmIGxhbmlkKHBrdCk6XFxuKyAgICBpZiBsZW4ocGt0KSBcXHUwMDNjIDIwIG9yIHBrdFstMjpdICE9IGJcXFwiXFxcXHg4OFxcXFx4ZmJcXFwiOlxcbisgICAgICAgIHJldHVybiBOb25lXFxuKyAgICByZXR1cm4gKHBrdFstNF0gXFx1MDAzZVxcdTAwM2UgNCkgXFx1MDAyNiAweEZcXG4rXFxuK1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbihcXFwiL3N5cy9jbGFzcy9uZXQvcHJwMC9hZGRyZXNzXFxcIikucmVhZCgpLnJlcGxhY2UoXFxcIjpcXFwiLCBcXFwiXFxcIikpXFxuK0RTVCA9IGJ5dGVzLmZyb21oZXgoXFxcIjAyYWFiYmNjZGQwMVxcXCIpXFxuK1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSlcXG4rcmN0MCA9IHN0cnVjdC5wYWNrKFxcXCJcXHUwMDNlSFxcXCIsIDApICsgc3RydWN0LnBhY2soXFxcIlxcdTAwM2VIXFxcIiwgNTIgXFx1MDAyNiAweDBGRkYpICsgYlxcXCJcXFxceDg4XFxcXHhmYlxcXCJcXG4rZnJhbWUgPSBEU1QgKyBTUkMgKyBiXFxcIlxcXFx4MDhcXFxceDAwXFxcIiArIFBBWSArIHJjdDBcXG4rXFxuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcXFwicHJwMFxcXCIsIDApKVxcbitzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxcbisgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKVxcbitzQS5iaW5kKChcXFwidkFwXFxcIiwgMCkpXFxuK3NCID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXFxuK3NCLmJpbmQoKFxcXCJ2QnBcXFwiLCAwKSlcXG4rc0Euc2V0YmxvY2tpbmcoRmFsc2UpOyBzQi5zZXRibG9ja2luZyhGYWxzZSlcXG4rXFxuK2EsIGIgPSBbXSwgW11cXG4rXFxuK2RlZiBtYXRjaChwa3QpOlxcbisgICAgcmV0dXJuIChwa3RbOjZdID09IERTVCBhbmQgcGt0WzY6MTJdID09IFNSQ1xcbisgICAgICAgICAgICBhbmQgcGt0WzEyOjE0XSA9PSBiXFxcIlxcXFx4MDhcXFxceDAwXFxcIiBhbmQgcGt0WzE0OjE0ICsgbGVuKFBBWSldID09IFBBWSlcXG4rXFxuK2RlZiBkcmFpbih0aW1lb3V0KTpcXG4rICAgIHdhaXQgPSB0aW1lb3V0XFxuKyAgICB3aGlsZSBUcnVlOlxcbisgICAgICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzQSwgc0JdLCBbXSwgW10sIHdhaXQpXFxuKyAgICAgICAgaWYgbm90IHI6XFxuKyAgICAgICAgICAgIHJldHVyblxcbisgICAgICAgIGZvciBzIGluIHI6XFxuKyAgICAgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSlcXG4rICAgICAgICAgICAgaWYgbm90IG1hdGNoKHBrdCk6XFxuKyAgICAgICAgICAgICAgICBjb250aW51ZVxcbisgICAgICAgICAgICBsaWQgPSBsYW5pZChwa3QpXFxuKyAgICAgICAgICAgIGlmIGxpZCBpcyBub3QgTm9uZTpcXG4rICAgICAgICAgICAgICAgIChhIGlmIHMgaXMgc0EgZWxzZSBiKS5hcHBlbmQobGlkKVxcbisgICAgICAgIHdhaXQgPSAwXFxuK1xcbisjIERyYWluIHdoaWxlIHNlbmRpbmcgc28gdGhlIGJ1cnN0IGNhbm5vdCBvdmVyZmxvdyB0aGUgY2FwdHVyZSBzb2NrZXRzJ1xcbisjIHJlY2VpdmUgYnVmZmVyczsgdGhlIG5ldGVtLWRlbGF5ZWQgQS1zaWRlIGZyYW1lcyBhcnJpdmUgYWZ0ZXJ3YXJkcyBhbmRcXG4rIyBhcmUgY29sbGVjdGVkIGJlbG93Llxcbitmb3IgXyBpbiByYW5nZSgyMDApOlxcbisgICAgdHguc2VuZChmcmFtZSlcXG4rICAgIGRyYWluKDApXFxuKyAgICB0aW1lLnNsZWVwKDAuMDAxKVxcbitcXG4rZW5kID0gdGltZS50aW1lKCkgKyBkdXJcXG4rd2hpbGUgdGltZS50aW1lKCkgXFx1MDAzYyBlbmQ6XFxuKyAgICBkcmFpbigwLjMpXFxuK1xcbitwcmludChcXFwiQS1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcXFwiICUgKGxlbihhKSwgc29ydGVkKHNldChhKSkpKVxcbitwcmludChcXFwiQi1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcXFwiICUgKGxlbihiKSwgc29ydGVkKHNldChiKSkpKVxcbitpZiBsZW4oYSkgXFx1MDAzYyAxNTAgb3IgbGVuKGIpIFxcdTAwM2MgMTUwOlxcbisgICAgcHJpbnQoXFxcIkZBSUw6IHRvbyBmZXcgaW5qZWN0ZWQgZnJhbWVzIGNhcHR1cmVkIChBPSVkIEI9JWQsIHNlbnQgMjAwKVxcXCJcXG4rICAgICAgICAgICUgKGxlbihhKSwgbGVuKGIpKSlcXG4rICAgIHN5cy5leGl0KDEpXFxuK2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCBcXHUwMDI2IDEpICE9IDBdXFxuK2JhZF9iID0gW3ggZm9yIHggaW4gYiBpZiAoeCBcXHUwMDI2IDEpICE9IDFdXFxuK2lmIGJhZF9hIG9yIGJhZF9iOlxcbisgICAgcHJpbnQoXFxcIkZBSUw6IHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uIC0gQTogJWQvJWQgd3JvbmctbGFuLFxcXCJcXG4rICAgICAgICAgIFxcXCIgQjogJWQvJWQgd3JvbmctbGFuXFxcIlxcbisgICAgICAgICAgJSAobGVuKGJhZF9hKSwgbGVuKGEpLCBsZW4oYmFkX2IpLCBsZW4oYikpKVxcbisgICAgc3lzLmV4aXQoMSlcXG4rcHJpbnQoXFxcIlBBU1M6IHBlci1lZ3Jlc3MgTEFOIElEcyBpc29sYXRlZCAoQSBhbGwgYml0MD0wLCBCIGFsbCBiaXQwPTEpXFxcIilcXG4rc3lzLmV4aXQoMClcXG4rUFlGMlxcbit9XFxuK1xcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGMTogUmVkQm94IHNvdXJjZS1NQUMgcHJpdmFjeVxcbisjIEhTUiBSZWRCb3ggKHByb3RvIDApLCB0YWdnZWQgbXVsdGljYXN0IGZyb20gYSBzbGF2ZTogbWFzdGVyIG11c3Qga2VlcFxcbisjIHRoZSBub2RlIE1BQywgaW50ZXJsaW5rIG11c3QgY2FycnkgdGhlIFJlZEJveCBNQUMuXFxuK3J1bl9mMSgpXFxuK3tcXG4rXFx0c2V0dXBfbnMgbnMgMlxcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcXG4rXFx0bnN4KCkgeyBpcCBuZXRucyBleGVjIFxcXCIkbnNcXFwiIFxcXCIkQFxcXCI7IH1cXG4rXFxuK1xcdG5zeCBpcCBsaW5rIGFkZCB2QSB0eXBlIHZldGggcGVlciBuYW1lIHZBcCB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IHZldGggQVxcXCI7IHJldHVybiAxOyB9XFxuK1xcdG5zeCBpcCBsaW5rIGFkZCB2QiB0eXBlIHZldGggcGVlciBuYW1lIHZCcCB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IHZldGggQlxcXCI7IHJldHVybiAxOyB9XFxuK1xcdG5zeCBpcCBsaW5rIGFkZCB2SSB0eXBlIHZldGggcGVlciBuYW1lIHZJcCB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IHZldGggSVxcXCI7IHJldHVybiAxOyB9XFxuK1xcdGZvciBpIGluIHZBIHZCIHZJIHZBcCB2QnAgdklwOyBkb1xcbitcXHRcXHRuc3ggaXAgbGluayBzZXQgXFxcIiRpXFxcIiB1cCB8fCB7IGVjaG8gXFxcIkZBSUw6ICRpIHVwXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0ZG9uZVxcbitcXHRpZiAhIG5zeCBpcCBsaW5rIGFkZCBuYW1lIGhzcjAgdHlwZSBoc3Igc2xhdmUxIHZBIHNsYXZlMiB2QiBcXFxcXFxuK1xcdFxcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcXHUwMDNlL2Rldi9udWxsOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIlNLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFxcXCJcXG4rXFx0XFx0cmV0dXJuICRrc2Z0X3NraXBcXG4rXFx0ZmlcXG4rXFx0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFxcXCJGQUlMOiBoc3IwIHVwXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFxuK1xcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXFx1MDAzY1xcdTAwM2MnUFlGMSdcXG4raW1wb3J0IHNvY2tldCwgc2VsZWN0LCBzeXMsIHRpbWVcXG4rXFxuK05PREUgID0gYnl0ZXMuZnJvbWhleChcXFwiMDIxMTIyMzM0NDU1XFxcIilcXG4rTUNBU1QgPSBieXRlcy5mcm9taGV4KFxcXCIwMTAwNWUwMDAwMDFcXFwiKVxcbitSQiAgICA9IGJ5dGVzLmZyb21oZXgob3BlbihcXFwiL3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzc1xcXCIpLnJlYWQoKS5yZXBsYWNlKFxcXCI6XFxcIiwgXFxcIlxcXCIpKVxcbitQQVkgICA9IGJ5dGVzKHJhbmdlKDQ2KSlcXG4rXFxuK2RlZiBmcmFtZShzZXEpOlxcbisgICAgIyBMU0RVIHNpemUgPSBwYXlsb2FkICsgSFNSIHRhZyAoSFNSX0hMRU4pLCBhcyBoc3JfZmlsbF90YWcoKSBjb21wdXRlcyBpdFxcbisgICAgdGFnID0gKCgoMSBcXHUwMDNjXFx1MDAzYyAxMikgfCAobGVuKFBBWSkgKyA2KSkudG9fYnl0ZXMoMiwgXFxcImJpZ1xcXCIpXFxuKyAgICAgICAgICAgKyBzZXEudG9fYnl0ZXMoMiwgXFxcImJpZ1xcXCIpICsgYlxcXCJcXFxceDA4XFxcXHgwMFxcXCIpXFxuKyAgICByZXR1cm4gTUNBU1QgKyBOT0RFICsgYlxcXCJcXFxceDg5XFxcXHgyZlxcXCIgKyB0YWcgKyBQQVlcXG4rXFxuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcXFwidkFwXFxcIiwgMCkpXFxuK3NtID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXFxuK3NtLmJpbmQoKFxcXCJoc3IwXFxcIiwgMCkpXFxuK3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXFxuK3NpLmJpbmQoKFxcXCJ2SXBcXFwiLCAwKSlcXG4rc20uc2V0YmxvY2tpbmcoRmFsc2UpOyBzaS5zZXRibG9ja2luZyhGYWxzZSlcXG4rXFxuK2ZvciBpIGluIHJhbmdlKDMpOlxcbisgICAgdHguc2VuZChmcmFtZShpICsgMSkpOyB0aW1lLnNsZWVwKDAuMDUpXFxuK1xcbittX3NyYyA9IGlfc3JjID0gTm9uZVxcbitlbmQgPSB0aW1lLnRpbWUoKSArIDRcXG4rd2hpbGUgdGltZS50aW1lKCkgXFx1MDAzYyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOlxcbisgICAgciwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3NtLCBzaV0sIFtdLCBbXSwgMC4zKVxcbisgICAgZm9yIHMgaW4gcjpcXG4rICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpXFxuKyAgICAgICAgIyBleGFjdCBmbG93OiBkc3QsIHBvc3Qtc3RyaXAgRXRoZXJUeXBlLCBleGFjdCBwYXlsb2FkLCBtaW4gbGVuZ3RoO1xcbisgICAgICAgICMgaF9zb3VyY2UgaXMgdGhlIGFzc2VydGVkIHZhbHVlIGFuZCBtdXN0IE5PVCBiZSBmaWx0ZXJlZCBvblxcbisgICAgICAgIGlmIChsZW4ocGt0KSBcXHUwMDNjIDYwIG9yIHBrdFs6Nl0gIT0gTUNBU1Qgb3IgcGt0WzEyOjE0XSAhPSBiXFxcIlxcXFx4MDhcXFxceDAwXFxcIlxcbisgICAgICAgICAgICAgICAgb3IgcGt0WzE0OjE0ICsgbGVuKFBBWSldICE9IFBBWSk6XFxuKyAgICAgICAgICAgIGNvbnRpbnVlXFxuKyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZTpcXG4rICAgICAgICAgICAgbV9zcmMgPSBwa3RbNjoxMl1cXG4rICAgICAgICBlbGlmIHMgaXMgc2kgYW5kIGlfc3JjIGlzIE5vbmU6XFxuKyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdXFxuK1xcbitwcmludChcXFwibWFzdGVyIGhfc291cmNlICAgID1cXFwiLCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXFxuK3ByaW50KFxcXCJub2RlIE1BQyAgICAgICAgICAgPVxcXCIsIE5PREUuaGV4KCkpXFxuK3ByaW50KFxcXCJpbnRlcmxpbmsgaF9zb3VyY2UgPVxcXCIsIGlfc3JjLmhleCgpIGlmIGlfc3JjIGVsc2UgTm9uZSlcXG4rcHJpbnQoXFxcInJlZGJveCBNQUMgICAgICAgICA9XFxcIiwgUkIuaGV4KCkpXFxuK2lmIGlfc3JjICE9IFJCOlxcbisgICAgcHJpbnQoXFxcIkZBSUw6IGludGVybGluayBkaWQgbm90IGNhcnJ5IHRoZSBSZWRCb3ggTUFDXFxcIilcXG4rICAgIHN5cy5leGl0KDEpXFxuK2lmIG1fc3JjICE9IE5PREU6XFxuKyAgICBwcmludChcXFwiRkFJTDogbWFzdGVyIHJlY2VpdmVkICVzIGluc3RlYWQgb2YgdGhlIG5vZGUgTUFDIFxcXCJcXG4rICAgICAgICAgIFxcXCIoc2hhcmVkLW11dGF0aW9uIGNvcnJ1cHRpb24pXFxcIlxcbisgICAgICAgICAgJSAobV9zcmMuaGV4KCkgaWYgbV9zcmMgZWxzZSBcXFwibm90aGluZ1xcXCIpKVxcbisgICAgc3lzLmV4aXQoMSlcXG4rcHJpbnQoXFxcIlBBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXFxcIilcXG4rc3lzLmV4aXQoMClcXG4rUFlGMVxcbit9XFxuK1xcbityYz0wXFxuK1xcbitydW5fZjJcXG4rcmV0PSQ/XFxuK3JjPSQoa3NmdF9zdGF0dXNfbWVyZ2UgXFxcIiRyY1xcXCIgXFxcIiRyZXRcXFwiKVxcbitcXG4rcnVuX2YxXFxuK3JldD0kP1xcbityYz0kKGtzZnRfc3RhdHVzX21lcmdlIFxcXCIkcmNcXFwiIFxcXCIkcmV0XFxcIilcXG4rXFxuK2lmIFsgXFxcIiRyY1xcXCIgLWVxIDAgXTsgdGhlblxcbitcXHRlY2hvIFxcXCJoc3Jfc2hhcmVkX211dGF0aW9uOiBwZXItZWdyZXNzIG11dGF0aW9uIGlzb2xhdGlvbiAoRjErRjIpIFsgT0sgXVxcXCJcXG4rZWxpZiBbIFxcXCIkcmNcXFwiIC1lcSBcXFwiJGtzZnRfc2tpcFxcXCIgXTsgdGhlblxcbitcXHRlY2hvIFxcXCJoc3Jfc2hhcmVkX211dGF0aW9uOiBzdWJ0ZXN0cyBza2lwcGVkIChjYXBhYmlsaXRpZXMgbWlzc2luZylcXFwiXFxuK2Vsc2VcXG4rXFx0ZWNobyBcXFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF1cXFwiIFxcXFxcXG4rXFx0XFx0XFxcInJjPSRyY1xcXCIgMVxcdTAwM2VcXHUwMDI2MlxcbitmaVxcbitleGl0IFxcXCIkcmNcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUxOjU4LjgyNTY1MDYwNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjQ1MDc1NDE3MjI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkhTUlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImhzcl9mb3J3YXJkX3NrYlwiLFxuICAgIFwiaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVcIixcbiAgICBcInBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxYzg2MGI0NDU0NmQ0NDI5NmVkOTFiY2M1ZDg3Nzk1ODlkNWUwYzgwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9oc3IvaHNyX2ZvcndhcmQuYyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuaW5kZXggMDc3NDk4MWE2NWMxNi4uZWZjYmYzY2YyNmY5YiAxMDA2NDRcbi0tLSBhL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuKysrIGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG5AQCAtMzI1LDggKzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHNrYjtcbiB9XG4gXG4tLyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCBqdXN0IGNsb25lIGl0IHRvIGJlIHNlbnRcbi0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJ3BvcnQnLlxuKy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUncyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzc1xuKyAqIHdyaXRlcyBjYW5ub3QgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC5cbisgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuKyAqL1xuK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7XG4rXG4rXHRjbG9uZSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpO1xuK1x0aWYgKCFjbG9uZSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHtcbitcdFx0a2ZyZWVfc2tiKGNsb25lKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXG4rXHRyZXR1cm4gY2xvbmU7XG4rfVxuK1xuKy8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwgcmV0dXJuIGEgcHJpdmF0ZSBjbG9uZVxuKyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJ3BvcnQnLiBPdGhlcndpc2UsIHJldHVybiBhIHByaXZhdGVcbisgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XG4rICogdGFnZ2VkIGZvciAncG9ydCcuXG4gICovXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbkBAIC0zMzYsMTQgKzM1NywxOCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdGludCBtb3ZlbGVuO1xuIFxuIFx0aWYgKGZyYW1lLVx1MDAzZXNrYl9oc3IpIHtcbi1cdFx0c3RydWN0IGhzcl9ldGhoZHIgKmhzcl9ldGhoZHIgPVxuLVx0XHRcdChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKGZyYW1lLVx1MDAzZXNrYl9oc3IpO1xuK1x0XHRzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjtcbitcbitcdFx0c2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXHUwMDNlc2tiX2hzcik7XG4rXHRcdGlmICghc2tiKVxuK1x0XHRcdHJldHVybiBOVUxMO1xuIFxuIFx0XHQvKiBzZXQgdGhlIGxhbmUgaWQgcHJvcGVybHkgKi9cbitcdFx0aHNyX2V0aGhkciA9IChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7XG4gXHRcdGhzcl9zZXRfcGF0aF9pZChmcmFtZSwgaHNyX2V0aGhkciwgcG9ydCk7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX2hzciwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBza2I7XG4gXHR9IGVsc2UgaWYgKHBvcnQtXHUwMDNlZGV2LVx1MDAzZWZlYXR1cmVzIFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX3N0ZCwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbiBcdH1cbiBcbiBcdC8qIENyZWF0ZSB0aGUgbmV3IHNrYiB3aXRoIGVub3VnaCBoZWFkcm9vbSB0byBmaXQgdGhlIEhTUiB0YWcgKi9cbkBAIC0zNzcsMTcgKzQwMiwyMyBAQCBzdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdHN0cnVjdCBza19idWZmICpza2I7XG4gXG4gXHRpZiAoZnJhbWUtXHUwMDNlc2tiX3BycCkge1xuLVx0XHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS1cdTAwM2Vza2JfcHJwKTtcbitcdFx0c3RydWN0IHBycF9yY3QgKnRyYWlsZXI7XG4rXG4rXHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9wcnApO1xuK1x0XHRpZiAoIXNrYilcbitcdFx0XHRyZXR1cm4gTlVMTDtcbiBcbitcdFx0dHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChza2IpO1xuIFx0XHRpZiAodHJhaWxlcikge1xuIFx0XHRcdHBycF9zZXRfbGFuX2lkKHRyYWlsZXIsIHBvcnQpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdFdBUk5fT05DRSghdHJhaWxlciwgXCJlcnJvcmVkIFBSUCBza2JcIik7XG4rXHRcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2JfcHJwLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIHNrYjtcbiBcdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9zdGQpO1xuIFx0fVxuIFxuIFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKGZyYW1lLVx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cdTAwM2Vza2Jfc3RkKSxcbkBAIC00MjAsNiArNDUxLDIyIEBAIHN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxuIFx0XHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcbiB7XG4rXHQvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzXG4rXHQgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lXG4rXHQgKiBzaGFyZXMgdGhlIG9yaWdpbmFsIFRYIHNrYiAod2hpY2ggdGFwcyBvciB0aGUgVFggcGF0aCBtYXkgc3RpbGxcbitcdCAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5XG4rXHQgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuXG4rXHQgKiBQcml2YXRpemUgYmVmb3JlIGFueSBhZGRyZXNzIG11dGF0aW9uLlxuK1x0ICovXG4rXHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGZyYW1lLVx1MDAzZXBvcnRfcmN2LVx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUiB8fFxuK1x0ICAgICAoZnJhbWUtXHUwMDNlaXNfbG9jYWxfZGVzdCBcdTAwMjZcdTAwMjYgIWZyYW1lLVx1MDAzZWlzX2xvY2FsX2V4Y2x1c2l2ZSkpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHNrYl9jb3coc2tiLCAwKSkge1xuK1x0XHRmcmFtZS1cdTAwM2Vwb3J0X3Jjdi1cdTAwM2VkZXYtXHUwMDNlc3RhdHMucnhfZHJvcHBlZCsrO1xuK1x0XHRrZnJlZV9za2Ioc2tiKTtcbitcdFx0cmV0dXJuIE5FVF9YTUlUX0RST1A7XG4rXHR9XG4rXG4gXHRpZiAoZnJhbWUtXHUwMDNlcG9ydF9yY3YtXHUwMDNldHlwZSA9PSBIU1JfUFRfTUFTVEVSKSB7XG4gXHRcdGhzcl9hZGRyX3N1YnN0X2Rlc3QoZnJhbWUtXHUwMDNlbm9kZV9zcmMsIHNrYiwgcG9ydCk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGVcbmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG5AQCAtNSw2ICs1LDcgQEAgdG9wX3NyY2RpciA9IC4uLy4uLy4uLy4uLy4uXG4gVEVTVF9QUk9HUyA6PSBcXFxuIFx0aHNyX3Bpbmcuc2ggXFxcbiBcdGhzcl9yZWRib3guc2ggXFxcbitcdGhzcl9zaGFyZWRfbXV0YXRpb24uc2ggXFxcbiBcdGxpbmtfZmF1bHRzLnNoIFxcXG4gXHRwcnBfcGluZy5zaCBcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbm5ldyBmaWxlIG1vZGUgMTAwNzU1XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbkBAIC0wLDAgKzEsMjQyIEBAXG4rIyEvYmluL2Jhc2hcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI1xuKyMgVmVyaWZ5IHRoYXQgcGVyLWVncmVzcyBtdXRhdGlvbnMgb2Ygc2hhcmVkIHNrYiBkYXRhIGFyZSBwcml2YXRlOlxuKyNcbisjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJ3MgTEFOLUlEIHdyaXRlXG4rIyBsYW5kcyBpbiB0aGUgZmlyc3Qgc2xhdmUncyBzdGlsbC1xdWV1ZWQgY2xvbmU7IHdpdGggYSBuZXRlbSBkZWxheSBvblxuKyMgc2xhdmUgQSwgaW5qZWN0ZWQgZnJhbWVzIGxlYXZlIEEgY2FycnlpbmcgQidzIExBTiBJRC5cbisjXG4rIyBGMSAoUmVkQm94IHNvdXJjZSBNQUMpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgYW4gSFNSLXRhZ2dlZCBtdWx0aWNhc3RcbisjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssXG4rIyBhbmQgdGhlIGludGVybGluaydzIFJlZEJveC1NQUMgcmV3cml0ZSBsYW5kcyBpbiB0aGUgbWFzdGVyIGNsb25lJ3NcbisjIGJ1ZmZlciwgc28gdGhlIGxvY2FsIHN0YWNrIHJlY2VpdmVzIHRoZSBSZWRCb3ggTUFDIGluc3RlYWQgb2YgdGhlXG4rIyBvcmlnaW5hdGluZyBub2RlJ3MgTUFDLlxuK1xuK2lwdjY9ZmFsc2Vcbitcbitzb3VyY2UgLi9oc3JfY29tbW9uLnNoXG4rXG4rRFVSPTVcbitcbityZXF1aXJlKClcbit7XG4rXHRjb21tYW5kIC12IFwiJDFcIiBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjEgXHUwMDI2XHUwMDI2IHJldHVybiAwXG4rXHRlY2hvIFwiU0tJUDogJDEgbm90IGF2YWlsYWJsZVwiXG4rXHRleGl0ICRrc2Z0X3NraXBcbit9XG4rXG4rcmVxdWlyZSBpcFxuK3JlcXVpcmUgdGNcbityZXF1aXJlIHB5dGhvbjNcbitcbit0cmFwIGNsZWFudXBfYWxsX25zIEVYSVRcbitcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb25cbisjIFBSUCBEQU5QIChwcm90byAxKSwgQUZfUEFDS0VUIHByZS10YWdnZWQgaW5qZWN0aW9uLCBuZXRlbSBvbiBzbGF2ZSBBLlxuK3J1bl9mMigpXG4re1xuK1x0c2V0dXBfbnMgbnMgMlx1MDAzZS9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcFxuK1x0bnN4KCkgeyBpcCBuZXRucyBleGVjIFwiJG5zXCIgXCIkQFwiOyB9XG4rXG4rXHQjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuXG4rXHRpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXCJcbitcdFx0cmV0dXJuICRrc2Z0X3NraXBcbitcdGZpXG4rXHRuc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDJcdTAwM2UvZGV2L251bGxcbitcbitcdCMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLlxuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cbitcdFx0bnN4IGlwIGxpbmsgc2V0IFwiJGlcIiB1cCB8fCB7IGVjaG8gXCJGQUlMOiAkaSB1cFwiOyByZXR1cm4gMTsgfVxuK1x0ZG9uZVxuK1x0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBwcnAwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcbitcdFx0c3VwZXJ2aXNpb24gNDUgcHJvdG8gMSAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4rXHRcdGVjaG8gXCJTS0lQOiBIU1IvUFJQIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWxcIlxuK1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuK1x0ZmlcbitcdG5zeCBpcCBsaW5rIHNldCBwcnAwIHVwIHx8IHsgZWNobyBcIkZBSUw6IHBycDAgdXBcIjsgcmV0dXJuIDE7IH1cbitcdG5zeCB0YyBxZGlzYyBhZGQgZGV2IHZBIHJvb3QgbmV0ZW0gZGVsYXkgMjAwbXMgfHxcbitcdFx0eyBlY2hvIFwiRkFJTDogbmV0ZW1cIjsgcmV0dXJuIDE7IH1cbitcbitcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXCIkRFVSXCIgXHUwMDNjXHUwMDNjJ1BZRjInXG4raW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK2R1ciA9IGludChzeXMuYXJndlsxXSlcbitkZWYgbGFuaWQocGt0KTpcbisgICAgaWYgbGVuKHBrdCkgXHUwMDNjIDIwIG9yIHBrdFstMjpdICE9IGJcIlxceDg4XFx4ZmJcIjpcbisgICAgICAgIHJldHVybiBOb25lXG4rICAgIHJldHVybiAocGt0Wy00XSBcdTAwM2VcdTAwM2UgNCkgXHUwMDI2IDB4RlxuK1xuK1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbihcIi9zeXMvY2xhc3MvbmV0L3BycDAvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rRFNUID0gYnl0ZXMuZnJvbWhleChcIjAyYWFiYmNjZGQwMVwiKVxuK1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSlcbityY3QwID0gc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDApICsgc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDUyIFx1MDAyNiAweDBGRkYpICsgYlwiXFx4ODhcXHhmYlwiXG4rZnJhbWUgPSBEU1QgKyBTUkMgKyBiXCJcXHgwOFxceDAwXCIgKyBQQVkgKyByY3QwXG4rXG4rdHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKFwicHJwMFwiLCAwKSlcbitzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc0EuYmluZCgoXCJ2QXBcIiwgMCkpXG4rc0IgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyxcbisgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKVxuK3NCLmJpbmQoKFwidkJwXCIsIDApKVxuK3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpXG4rXG4rYSwgYiA9IFtdLCBbXVxuK1xuK2RlZiBtYXRjaChwa3QpOlxuKyAgICByZXR1cm4gKHBrdFs6Nl0gPT0gRFNUIGFuZCBwa3RbNjoxMl0gPT0gU1JDXG4rICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYlwiXFx4MDhcXHgwMFwiIGFuZCBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gPT0gUEFZKVxuK1xuK2RlZiBkcmFpbih0aW1lb3V0KTpcbisgICAgd2FpdCA9IHRpbWVvdXRcbisgICAgd2hpbGUgVHJ1ZTpcbisgICAgICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzQSwgc0JdLCBbXSwgW10sIHdhaXQpXG4rICAgICAgICBpZiBub3QgcjpcbisgICAgICAgICAgICByZXR1cm5cbisgICAgICAgIGZvciBzIGluIHI6XG4rICAgICAgICAgICAgcGt0ID0gcy5yZWN2KDY1NTM1KVxuKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaChwa3QpOlxuKyAgICAgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgICAgIGxpZCA9IGxhbmlkKHBrdClcbisgICAgICAgICAgICBpZiBsaWQgaXMgbm90IE5vbmU6XG4rICAgICAgICAgICAgICAgIChhIGlmIHMgaXMgc0EgZWxzZSBiKS5hcHBlbmQobGlkKVxuKyAgICAgICAgd2FpdCA9IDBcbitcbisjIERyYWluIHdoaWxlIHNlbmRpbmcgc28gdGhlIGJ1cnN0IGNhbm5vdCBvdmVyZmxvdyB0aGUgY2FwdHVyZSBzb2NrZXRzJ1xuKyMgcmVjZWl2ZSBidWZmZXJzOyB0aGUgbmV0ZW0tZGVsYXllZCBBLXNpZGUgZnJhbWVzIGFycml2ZSBhZnRlcndhcmRzIGFuZFxuKyMgYXJlIGNvbGxlY3RlZCBiZWxvdy5cbitmb3IgXyBpbiByYW5nZSgyMDApOlxuKyAgICB0eC5zZW5kKGZyYW1lKVxuKyAgICBkcmFpbigwKVxuKyAgICB0aW1lLnNsZWVwKDAuMDAxKVxuK1xuK2VuZCA9IHRpbWUudGltZSgpICsgZHVyXG4rd2hpbGUgdGltZS50aW1lKCkgXHUwMDNjIGVuZDpcbisgICAgZHJhaW4oMC4zKVxuK1xuK3ByaW50KFwiQS1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcIiAlIChsZW4oYSksIHNvcnRlZChzZXQoYSkpKSlcbitwcmludChcIkItc2lkZSBjb3VudD0lZCBsYW4gaWRzPSVzXCIgJSAobGVuKGIpLCBzb3J0ZWQoc2V0KGIpKSkpXG4raWYgbGVuKGEpIFx1MDAzYyAxNTAgb3IgbGVuKGIpIFx1MDAzYyAxNTA6XG4rICAgIHByaW50KFwiRkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApXCJcbisgICAgICAgICAgJSAobGVuKGEpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCBcdTAwMjYgMSkgIT0gMF1cbitiYWRfYiA9IFt4IGZvciB4IGluIGIgaWYgKHggXHUwMDI2IDEpICE9IDFdXG4raWYgYmFkX2Egb3IgYmFkX2I6XG4rICAgIHByaW50KFwiRkFJTDogc2hhcmVkLW11dGF0aW9uIGNvcnJ1cHRpb24gLSBBOiAlZC8lZCB3cm9uZy1sYW4sXCJcbisgICAgICAgICAgXCIgQjogJWQvJWQgd3JvbmctbGFuXCJcbisgICAgICAgICAgJSAobGVuKGJhZF9hKSwgbGVuKGEpLCBsZW4oYmFkX2IpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK3ByaW50KFwiUEFTUzogcGVyLWVncmVzcyBMQU4gSURzIGlzb2xhdGVkIChBIGFsbCBiaXQwPTAsIEIgYWxsIGJpdDA9MSlcIilcbitzeXMuZXhpdCgwKVxuK1BZRjJcbit9XG4rXG4rIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjE6IFJlZEJveCBzb3VyY2UtTUFDIHByaXZhY3lcbisjIEhTUiBSZWRCb3ggKHByb3RvIDApLCB0YWdnZWQgbXVsdGljYXN0IGZyb20gYSBzbGF2ZTogbWFzdGVyIG11c3Qga2VlcFxuKyMgdGhlIG5vZGUgTUFDLCBpbnRlcmxpbmsgbXVzdCBjYXJyeSB0aGUgUmVkQm94IE1BQy5cbitydW5fZjEoKVxuK3tcbitcdHNldHVwX25zIG5zIDJcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcbitcdG5zeCgpIHsgaXAgbmV0bnMgZXhlYyBcIiRuc1wiIFwiJEBcIjsgfVxuK1xuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggSVwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkkgdkFwIHZCcCB2SXA7IGRvXG4rXHRcdG5zeCBpcCBsaW5rIHNldCBcIiRpXCIgdXAgfHwgeyBlY2hvIFwiRkFJTDogJGkgdXBcIjsgcmV0dXJuIDE7IH1cbitcdGRvbmVcbitcdGlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgaHNyMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFxcXG4rXHRcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFwiXG4rXHRcdHJldHVybiAka3NmdF9za2lwXG4rXHRmaVxuK1x0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFwiRkFJTDogaHNyMCB1cFwiOyByZXR1cm4gMTsgfVxuK1xuK1x0bnN4IHB5dGhvbjMgL2Rldi9zdGRpbiBcdTAwM2NcdTAwM2MnUFlGMSdcbitpbXBvcnQgc29ja2V0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK05PREUgID0gYnl0ZXMuZnJvbWhleChcIjAyMTEyMjMzNDQ1NVwiKVxuK01DQVNUID0gYnl0ZXMuZnJvbWhleChcIjAxMDA1ZTAwMDAwMVwiKVxuK1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKFwiL3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rUEFZICAgPSBieXRlcyhyYW5nZSg0NikpXG4rXG4rZGVmIGZyYW1lKHNlcSk6XG4rICAgICMgTFNEVSBzaXplID0gcGF5bG9hZCArIEhTUiB0YWcgKEhTUl9ITEVOKSwgYXMgaHNyX2ZpbGxfdGFnKCkgY29tcHV0ZXMgaXRcbisgICAgdGFnID0gKCgoMSBcdTAwM2NcdTAwM2MgMTIpIHwgKGxlbihQQVkpICsgNikpLnRvX2J5dGVzKDIsIFwiYmlnXCIpXG4rICAgICAgICAgICArIHNlcS50b19ieXRlcygyLCBcImJpZ1wiKSArIGJcIlxceDA4XFx4MDBcIilcbisgICAgcmV0dXJuIE1DQVNUICsgTk9ERSArIGJcIlxceDg5XFx4MmZcIiArIHRhZyArIFBBWVxuK1xuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcInZBcFwiLCAwKSlcbitzbSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc20uYmluZCgoXCJoc3IwXCIsIDApKVxuK3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4rICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSlcbitzaS5iaW5kKChcInZJcFwiLCAwKSlcbitzbS5zZXRibG9ja2luZyhGYWxzZSk7IHNpLnNldGJsb2NraW5nKEZhbHNlKVxuK1xuK2ZvciBpIGluIHJhbmdlKDMpOlxuKyAgICB0eC5zZW5kKGZyYW1lKGkgKyAxKSk7IHRpbWUuc2xlZXAoMC4wNSlcbitcbittX3NyYyA9IGlfc3JjID0gTm9uZVxuK2VuZCA9IHRpbWUudGltZSgpICsgNFxuK3doaWxlIHRpbWUudGltZSgpIFx1MDAzYyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOlxuKyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpXG4rICAgIGZvciBzIGluIHI6XG4rICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpXG4rICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7XG4rICAgICAgICAjIGhfc291cmNlIGlzIHRoZSBhc3NlcnRlZCB2YWx1ZSBhbmQgbXVzdCBOT1QgYmUgZmlsdGVyZWQgb25cbisgICAgICAgIGlmIChsZW4ocGt0KSBcdTAwM2MgNjAgb3IgcGt0Wzo2XSAhPSBNQ0FTVCBvciBwa3RbMTI6MTRdICE9IGJcIlxceDA4XFx4MDBcIlxuKyAgICAgICAgICAgICAgICBvciBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gIT0gUEFZKTpcbisgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZTpcbisgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXVxuKyAgICAgICAgZWxpZiBzIGlzIHNpIGFuZCBpX3NyYyBpcyBOb25lOlxuKyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdXG4rXG4rcHJpbnQoXCJtYXN0ZXIgaF9zb3VyY2UgICAgPVwiLCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXG4rcHJpbnQoXCJub2RlIE1BQyAgICAgICAgICAgPVwiLCBOT0RFLmhleCgpKVxuK3ByaW50KFwiaW50ZXJsaW5rIGhfc291cmNlID1cIiwgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKVxuK3ByaW50KFwicmVkYm94IE1BQyAgICAgICAgID1cIiwgUkIuaGV4KCkpXG4raWYgaV9zcmMgIT0gUkI6XG4rICAgIHByaW50KFwiRkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUNcIilcbisgICAgc3lzLmV4aXQoMSlcbitpZiBtX3NyYyAhPSBOT0RFOlxuKyAgICBwcmludChcIkZBSUw6IG1hc3RlciByZWNlaXZlZCAlcyBpbnN0ZWFkIG9mIHRoZSBub2RlIE1BQyBcIlxuKyAgICAgICAgICBcIihzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbilcIlxuKyAgICAgICAgICAlIChtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIFwibm90aGluZ1wiKSlcbisgICAgc3lzLmV4aXQoMSlcbitwcmludChcIlBBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXCIpXG4rc3lzLmV4aXQoMClcbitQWUYxXG4rfVxuK1xuK3JjPTBcbitcbitydW5fZjJcbityZXQ9JD9cbityYz0kKGtzZnRfc3RhdHVzX21lcmdlIFwiJHJjXCIgXCIkcmV0XCIpXG4rXG4rcnVuX2YxXG4rcmV0PSQ/XG4rcmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcIiRyY1wiIFwiJHJldFwiKVxuK1xuK2lmIFsgXCIkcmNcIiAtZXEgMCBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gKEYxK0YyKSBbIE9LIF1cIlxuK2VsaWYgWyBcIiRyY1wiIC1lcSBcIiRrc2Z0X3NraXBcIiBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogc3VidGVzdHMgc2tpcHBlZCAoY2FwYWJpbGl0aWVzIG1pc3NpbmcpXCJcbitlbHNlXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF1cIiBcXFxuK1x0XHRcInJjPSRyY1wiIDFcdTAwM2VcdTAwMjYyXG4rZmlcbitleGl0IFwiJHJjXCJcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUxOjU4LjgyNTY1MTY4NVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ4MTI5Mjg3NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBIU1IgRHJpdmVyIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgdGhlIEhTUiBkcml2ZXIsIHNwZWNpZmljYWxseSBpbiBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gSXQncyBpbnRyb2R1Y2luZyBhIGNyaXRpY2FsIGNoYW5nZTsgaXQncyB1c2luZyBhIG5ldyBmdW5jdGlvbiwgYGhzcl9jbG9uZV9wcml2YXRlKClgLCB3aGljaCBkb2VzIGEgY29weS1vbi13cml0ZSAoYHNrYl9jb3coKWApIG9mIHRoZSBTS0IsIGVmZmVjdGl2ZWx5IG1ha2luZyB0aGUgZGF0YSBwcml2YXRlLiAgVGhlIGltcGxpY2F0aW9ucyBoZXJlIGFyZSBzaWduaWZpY2FudC4gSXQncyByZXBsYWNpbmcgdGhlIHN0YW5kYXJkIGBza2JfY2xvbmUoKWAgY2FsbHMgaW4gYGhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoKWAgd2l0aCB0aGlzIGNvcHktb24td3JpdGUgdmVyc2lvbi5cblxuVGhlIHJhdGlvbmFsZSBpcyBjbGVhciDigJMgYW5kIGNydWNpYWwuIFRoaXMgaXMgYWJvdXQgcHJldmVudGluZyBkYXRhIGNvcnJ1cHRpb24uIFdpdGggYHNrYl9jbG9uZSgpYCwgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlIGNsb25lZCBTS0Igd291bGQgYWZmZWN0IHRoZSBvcmlnaW5hbCBhbmQgYW55IG90aGVyIGNsb25lcywgcGFydGljdWxhcmx5IGR1cmluZyBwZXItZWdyZXNzIHdyaXRlcywgYW5kIHRoYXQncyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIgaW4gYSBoaWdoLWF2YWlsYWJpbGl0eSBzeXN0ZW0uIFRoaXMgdXBkYXRlIGluIGBoc3JfeG1pdCgpYCBpcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcuIFRoZSBwYXRjaCBpcyBlbnN1cmluZyB0aGUgU0tCIGlzIHByaXZhdGl6ZWQgKmJlZm9yZSogYW55IGFkZHJlc3MgbW9kaWZpY2F0aW9uIGZvciBpbnRlcmxpbmstYm91bmQgU0tCcy4gVGhhdCBtZWFucyB0aGUgY29weS1vbi13cml0ZSBoYXBwZW5zIHVwZnJvbnQgdG8gZ3VhcmQgYWdhaW5zdCBleGFjdGx5IHRoaXMgdHlwZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBpc3N1ZS5cblxuRXNzZW50aWFsbHksIHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIHJhY2UgY29uZGl0aW9uLCBhIGNsYXNzaWMgcHJvYmxlbSBpbiBuZXR3b3JrIGRyaXZlcnMgd2hlcmUgbXVsdGlwbGUgcGFydHMgb2YgdGhlIHN5c3RlbSBhcmUgdHJ5aW5nIHRvIHdyaXRlIHRvIHRoZSBzYW1lIGJ1ZmZlci4gVGhpcyBpcyBhIHNvbGlkIGFwcHJvYWNoIHRvIGZpeGluZyB0aGF0LiBOb3csIEkgbmVlZCB0byBkaXZlIGludG8gdGhlIGNvZGUgaXRzZWxmLCBhbmFseXplIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMsIGFuZCBhbHNvIG1ha2Ugc3VyZSB0aGUgS2NvbmZpZyBtYWtlcyBzZW5zZSwgY29uZmlybWluZyB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHNldC4gIExldCdzIHNlZSB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwMywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4NSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjAzLjYzODU4MzU3M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTc3MjAxMzY5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhzcl9jbG9uZV9wcml2YXRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9oc3IvaHNyX2ZvcndhcmQuYz0yODg9c3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfZmlsbF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zMzEtICovXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjMzMjpzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTMzMy17XFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzUyPXN0cnVjdCBza19idWZmICpoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLFxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTM2MS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6MzYyOlxcdFxcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2JfaHNyKTtcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzYzLVxcdFxcdGlmICghc2tiKVxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTM3MC1cXHR9IGVsc2UgaWYgKHBvcnQtXFx1MDAzZWRldi1cXHUwMDNlZmVhdHVyZXMgXFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjM3MTpcXHRcXHRyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXFx1MDAzZXNrYl9zdGQpO1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNzItXFx0fVxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jPTM5OT1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00MDYtXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjQwNzpcXHRcXHRza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cXHUwMDNlc2tiX3BycCk7XFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQwOC1cXHRcXHRpZiAoIXNrYilcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00MjAtXFx0fSBlbHNlIGlmIChwb3J0LVxcdTAwM2VkZXYtXFx1MDAzZWZlYXR1cmVzIFxcdTAwMjYgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykge1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0MjE6XFx0XFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2Jfc3RkKTtcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNDIyLVxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MDUuMjE1Nzg5NDgxWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjk5MzY4MTAzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGNoYW5nZXMgYW5kIHdoZXJlIEkgc2hvdWxkIGZvY3VzIG15IGF0dGVudGlvbjpcblxuKipOYXZpZ2F0aW5nIHRoZSBIU1IgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyB0aGUgbW9kaWZpY2F0aW9ucyBhcmUgZGVmaW5pdGVseSB3aXRoaW4gYG5ldC9oc3IvaHNyX2ZvcndhcmQuY2AuIFRoYXQncyB0aGUgY29yZSBmb3J3YXJkaW5nIGxvZ2ljIGZvciBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IpLCBzbyBpdCdzIHRoZSByaWdodCBwbGFjZSB0byBiZWdpbi4gQmVmb3JlIGRpdmluZyBkZWVwIGludG8gdGhlIGNvZGUgaXRzZWxmLCBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgS2NvbmZpZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIEhTUi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBwb3RlbnRpYWxseSB3aGF0IGRlcGVuZGVuY2llcyBpdCBoYXMsIGFuZCBob3cgSSBjYW4gY29udHJvbCBpdCBpbiB0aGUgYnVpbGQuIEtub3dpbmcgdGhlIEtjb25maWcgb3B0aW9ucyB3aWxsIHF1aWNrbHkgaWxsdW1pbmF0ZSB0aGUgYmlnZ2VyIHBpY3R1cmUuIFRoaXMgd2lsbCBoZWxwIGZyYW1lIHRoZSBjaGFuZ2VzIHdpdGhpbiB0aGUgb3ZlcmFsbCBzeXN0ZW0gZGVzaWduLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTE3LCJPdXRwdXRUb2tlbnMiOjE3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MDguMjA5NDcyNDg3WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NDQxNzc4MjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEhTUlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaHNyL0tjb25maWctNS1cXG5uZXQvaHNyL0tjb25maWc6Njpjb25maWcgSFNSXFxubmV0L2hzci9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIkhpZ2gtYXZhaWxhYmlsaXR5IFNlYW1sZXNzIFJlZHVuZGFuY3kgKEhTUiBcXHUwMDI2IFBSUClcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjA5Ljg1MzY1NjExMVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5MDczODk2ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKkZ1enppbmcgRm9jdXM6IEluaXRpYWwgQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgYEhTUmAuIFRoYXQncyB0aGUgYmFzZWxpbmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyBuYWlsIGRvd24gd2hlcmUgd2UncmUgZ29pbmcgdG8gZGlyZWN0IG91ciBmdXp6aW5nIGVmZm9ydHMuIFRoZSBzeXN0ZW0ncyB0ZWxsaW5nIG1lIGFib3V0IHRoZXNlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCwgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCwgYW5kIGBoc3JfeG1pdGAuIFJpZ2h0LCB0aG9zZSBhcmUgb3VyIHRhcmdldHMuIE5vdywgYmVmb3JlIEkgZGl2ZSBkZWVwIGludG8gY3JhZnRpbmcgdGVzdCBjYXNlcywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBwb3RlbnRpYWwgZm9yIHRoaXMuIEFyZSB0aGVzZSBnbG9iYWwsIG9yIGFyZSB0aGV5IHN0YXRpYyB3aXRoaW4gYSBzcGVjaWZpYyBtb2R1bGU/IFRoZSBzdGF0aWMvbm9uLXN0YXRpYyBuYXR1cmUgb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgaW5mbHVlbmNlIGhvdyBJIGFwcHJvYWNoIHZ1bG5lcmFiaWxpdHkgZGlzY292ZXJ5IGFuZCBleHBsb2l0IGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODE3NywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjEzLjc2MTA0ODcyNFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDg2MDI5Mjg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9oc3IvaHNyX2RldmljZS5jPTYyMT1zdGF0aWMgY29uc3Qgc3RydWN0IGhzcl9wcm90b19vcHMgaHNyX29wcyA9IHtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy02MjItXFx0LnNlbmRfc3ZfZnJhbWUgPSBzZW5kX2hzcl9zdXBlcnZpc2lvbl9mcmFtZSxcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYzo2MjM6XFx0LmNyZWF0ZV90YWdnZWRfZnJhbWUgPSBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSxcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy02MjQtXFx0LmdldF91bnRhZ2dlZF9mcmFtZSA9IGhzcl9nZXRfdW50YWdnZWRfZnJhbWUsXFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzMyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNTEtICovXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjM1MjpzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzUzLVxcdFxcdFxcdFxcdFxcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaD0xNz1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMTgtXFx0XFx0XFx0XFx0XFx0c3RydWN0IGhzcl9wb3J0ICpwb3J0KTtcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg6MTk6c3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXFxubmV0L2hzci9oc3JfZm9yd2FyZC5oLTIwLVxcdFxcdFxcdFxcdFxcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjE1LjI0NzA4Mzg1OVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2NjM2MTg2NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSBjb2RlIHNuaXBwZXRzLCBzdW1tYXJpemVkIGluIHRoZSBmaXJzdCBwZXJzb24sIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqQXNzZXNzaW5nIEZ1bmN0aW9uIFNjb3BlKipcblxuQWxyaWdodCwgbGV0IG1lIHF1aWNrbHkgYW5hbHl6ZSB0aGVzZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuIEl0J3MgaW1tZWRpYXRlbHkgYXBwYXJlbnQgdGhhdCBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVgIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVgIGFyZSBkZWNsYXJlZCBhcyBub24tc3RhdGljLiBUaGlzIGxpa2VseSBpbmRpY2F0ZXMgdGhhdCB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSBhY2Nlc3NpYmxlIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCwgcHJvYmFibHkgd2l0aGluIGEgbGFyZ2VyIG1vZHVsZSBvciBwcm9qZWN0LiBUaGV5IGFyZSBkZXNpZ25lZCB0byBiZSBjYWxsYWJsZSBmcm9tIGVsc2V3aGVyZSwgbGlrZWx5IGFzIHBhcnQgb2Ygc29tZSBwdWJsaWMgQVBJIG9yIGludGVyZmFjZS4gSG93ZXZlciwgdGhlIHVzZSBjYXNlIG9mIGBoc3JfeG1pdGAgaXMgc2xpZ2h0bHkgZGlmZmVyZW50LiBUaGUgYHN0YXRpY2Aga2V5d29yZCBzdWdnZXN0cyBpdCdzIHNjb3BlZCB0byB0aGUgY3VycmVudCBmaWxlIG9yIHRyYW5zbGF0aW9uIHVuaXQuIFNvLCBgaHNyX3htaXRgIGlzIGNsZWFybHkgYW4gaW50ZXJuYWwgZnVuY3Rpb24sIHByb2JhYmx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbm90IG1lYW50IGZvciBleHRlcm5hbCB1c2UuIEl0J3MgbGlrZWx5IGludm9sdmVkIGluIGhhbmRsaW5nIHNvbWUgZGF0YSB0cmFuc21pc3Npb24gcHJvY2VzcywgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBrZXB0IGhpZGRlbiwgcG90ZW50aWFsbHkgdG8gYWxsb3cgZm9yIGZ1dHVyZSBpbnRlcm5hbCBjaGFuZ2VzIHdpdGhvdXQgYnJlYWtpbmcgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiBVbmRlcnN0YW5kaW5nIHRoZSBzdGF0aWMvbm9uLXN0YXRpYyBkaXN0aW5jdGlvbiBpcyBjcnVjaWFsIGZvciBwcm9wZXIgbW9kdWxlIGRlc2lnbiBhbmQgY29kZSBtYWludGFpbmFiaWxpdHksIGVzcGVjaWFsbHkgZm9yIGFuIGV4cGVyaWVuY2VkIGRldmVsb3BlciBsaWtlIG15c2VsZi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODg0MiwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjE4LjkxMDcwNTM5OFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ0Nzc5NDI3OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJoc3JfeG1pdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaHNyL2hzcl9mb3J3YXJkLmM9NDMwPXN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQ1MC1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6NDUxOnN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00NTItXFx0XFx0ICAgIHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9NTY2PXN0YXRpYyB2b2lkIGhzcl9mb3J3YXJkX2RvKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNjI3LVxcdFxcdH0gZWxzZSB7XFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjYyODpcXHRcXHRcXHRpZiAoIWhzcl94bWl0KHNrYiwgcG9ydCwgZnJhbWUpKVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy02MjktXFx0XFx0XFx0XFx0aWYgKHBvcnQtXFx1MDAzZXR5cGUgPT0gSFNSX1BUX1NMQVZFX0EgfHxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MjAuMzU4NTA2NDk3WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYyNzYyNDk2MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IGNvZGUgc3RydWN0dXJlLCBwcmVzZW50ZWQgYXMgaWYgaXQgd2VyZSBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEhTUiBUcmFuc21pc3Npb24gTG9naWMqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJJ20gc2VlaW5nLCBgaHNyX3htaXRgIGlzIGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0IG1lYW5zIGl0J3MgaW50ZXJuYWwgdG8gdGhpcyBjb21waWxhdGlvbiB1bml0LCBub3QgbWVhbnQgZm9yIGV4dGVybmFsIHVzZS4gSXQncyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGZ1bmN0aW9uIHdpdGhpbiB0aGUgc2FtZSBmaWxlLCB3aGljaCBpcyBgaHNyX2ZvcndhcmRfZG9gLiBPa2F5LCB0aGF0IGdpdmVzIG1lIGEgY2xlYXIgaWRlYSBvZiBpdHMgcHVycG9zZTogaXQncyBsaWtlbHkgcmVzcG9uc2libGUgZm9yIHRoZSBhY3R1YWwgKnRyYW5zbWlzc2lvbiogb2YgYSBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IpIGZyYW1lLCBsaWtlbHkgdGhlIGxvd2VyLWxldmVsIHNlbmRpbmcgZnVuY3Rpb24uXG5cbk5vdywgYGhzcl9mb3J3YXJkX2RvYCBpdHNlbGYgaXMgYWxzbyBzdGF0aWMuIFNvIGl0J3Mgc2ltaWxhcjsgYWxzbyBoaWRkZW4gYXdheSBmcm9tIGV4dGVybmFsIGNhbGxzLiBJdCBzZWVtcyBsaWtlIGl0J3MgdGhlIG5leHQgbGV2ZWwgdXAsIHRoZSBmdW5jdGlvbiB0aGF0ICpkb2VzKiB0aGUgSFNSIGZvcndhcmRpbmcsIGFuZCBJJ20gZ3Vlc3Npbmcgc29tZSBzb3J0IG9mIHByZS1wcm9jZXNzaW5nIGJlZm9yZSBpdCBoYW5kcyBpdCBvZmYgdG8gdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gZnVuY3Rpb24uIEFuZCB0aGUga2V5IGlzIHRoYXQgaXQncyBjYWxsZWQgZnJvbSBgaHNyX2ZvcndhcmRfc2tiYCwgc28gdGhpcyBtZWFucyB0aGF0IGFuIGluY29taW5nIFNLQiBpcyBnb2luZyB0byBnZXQgaGFuZGxlZCBoZXJlLlxuT2theSwgc28gdGhlIHdvcmtmbG93IGFwcGVhcnMgdG8gYmU6IGFuIGluY29taW5nIHBhY2tldCAoYHNrYmApIGdvZXMgdG8gYGhzcl9mb3J3YXJkX3NrYmAsIHdoaWNoIHRoZW4gdHJpZ2dlcnMgYGhzcl9mb3J3YXJkX2RvYCwgd2hpY2ggcHJlcHMgdGhlIGZyYW1lLCBhbmQgZmluYWxseSBjYWxscyBgaHNyX3htaXRgIHRvIHNlbmQgaXQgb3V0LiBUaGF0IHNldHVwIGluZGljYXRlcyBhIGRlbGliZXJhdGUgZW5jYXBzdWxhdGlvbiBvZiB0aGUgSFNSIGZvcndhcmRpbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHBvdGVudGlhbCBpbnRlcm5hbCBvcHRpbWl6YXRpb25zIG9yIGNoYW5nZXMgdG8gdGhlIGZvcndhcmRpbmcgbG9naWMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGV4dGVybmFsIGludGVyZmFjZS4gSXQncyBhIGNsZWFuIHdheSB0byBtYW5hZ2UgdGhlIHRyYW5zbWlzc2lvbiBwYXRoLlxuXG5TbywgaW4gc2hvcnQsIEknbSBpbmZlcnJpbmcgdGhpcyBmbG93OiBgaHNyX2ZvcndhcmRfc2tiYCAtXHUwMDNlIGBoc3JfZm9yd2FyZF9kb2AgLVx1MDAzZSBgaHNyX3htaXRgLiBFYWNoIHBpZWNlIGlzIG5lYXRseSB0dWNrZWQgYXdheSwgbGlrZWx5IGZvciBnb29kIGNvZGUgc3RydWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDExLCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MjYuNjM0NzU3OTU5WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDY4Njc5MDk2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhzcl9mb3J3YXJkX3NrYlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaHNyL2hzcl9kZXZpY2UuYz0yMjQ9c3RhdGljIG5ldGRldl90eF90IGhzcl9kZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbi0tXFxubmV0L2hzci9oc3JfZGV2aWNlLmMtMjM1LVxcdFxcdHNwaW5fbG9ja19iaChcXHUwMDI2aHNyLVxcdTAwM2VzZXFucl9sb2NrKTtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYzoyMzY6XFx0XFx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgbWFzdGVyKTtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy0yMzctXFx0XFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmhzci1cXHUwMDNlc2VxbnJfbG9jayk7XFxuLS1cXG5uZXQvaHNyL2hzcl9kZXZpY2UuYz0yOTM9c3RhdGljIHZvaWQgc2VuZF9oc3Jfc3VwZXJ2aXNpb25fZnJhbWUoc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxcbi0tXFxubmV0L2hzci9oc3JfZGV2aWNlLmMtMzYzLVxcbm5ldC9oc3IvaHNyX2RldmljZS5jOjM2NDpcXHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBwb3J0KTtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy0zNjUtXFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmhzci1cXHUwMDNlc2VxbnJfbG9jayk7XFxuLS1cXG5uZXQvaHNyL2hzcl9kZXZpY2UuYz0zNjk9c3RhdGljIHZvaWQgc2VuZF9wcnBfc3VwZXJ2aXNpb25fZnJhbWUoc3RydWN0IGhzcl9wb3J0ICptYXN0ZXIsXFxuLS1cXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy00MDQtXFxubmV0L2hzci9oc3JfZGV2aWNlLmM6NDA1OlxcdGhzcl9mb3J3YXJkX3NrYihza2IsIG1hc3Rlcik7XFxubmV0L2hzci9oc3JfZGV2aWNlLmMtNDA2LVxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZoc3ItXFx1MDAzZXNlcW5yX2xvY2spO1xcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jPTcyMz1zdGF0aWMgaW50IGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLFxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTc4MC0vKiBNdXN0IGJlIGNhbGxlZCBob2xkaW5nIHJjdSByZWFkIGxvY2sgKGJlY2F1c2Ugb2YgdGhlIHBvcnQgcGFyYW1ldGVyKSAqL1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo3ODE6dm9pZCBoc3JfZm9yd2FyZF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0KVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy03ODIte1xcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5oLTE1LVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaDoxNjp2b2lkIGhzcl9mb3J3YXJkX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQpO1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaC0xNy1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG4tLVxcbm5ldC9oc3IvaHNyX3NsYXZlLmM9MjQ9c3RhdGljIHJ4X2hhbmRsZXJfcmVzdWx0X3QgaHNyX2hhbmRsZV9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpXFxuLS1cXG5uZXQvaHNyL2hzcl9zbGF2ZS5jLTgwLVxcdFxcdHNwaW5fbG9ja19iaChcXHUwMDI2aHNyLVxcdTAwM2VzZXFucl9sb2NrKTtcXG5uZXQvaHNyL2hzcl9zbGF2ZS5jOjgxOlxcdFxcdGhzcl9mb3J3YXJkX3NrYihza2IsIHBvcnQpO1xcbm5ldC9oc3IvaHNyX3NsYXZlLmMtODItXFx0XFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmhzci1cXHUwMDNlc2VxbnJfbG9jayk7XFxubmV0L2hzci9oc3Jfc2xhdmUuYy04My1cXHR9IGVsc2Uge1xcbm5ldC9oc3IvaHNyX3NsYXZlLmM6ODQ6XFx0XFx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgcG9ydCk7XFxubmV0L2hzci9oc3Jfc2xhdmUuYy04NS1cXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjI4LjEwMzQ0NDAzNVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDI4NjE4NjAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OlxuXG4qKkZvY3VzaW5nIEluIG9uIHRoZSBIU1IgQ29kZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBIU1IgaW1wbGVtZW50YXRpb24uIFRoZSBgaHNyX2ZvcndhcmRfc2tiYCBmdW5jdGlvbiBpcyBub24tc3RhdGljLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gVGhhdCBtZWFucyBpdCdzIGxpa2VseSBjYWxsZWQgZnJvbSBzb21ld2hlcmUgb3V0c2lkZSB0aGUgaW1tZWRpYXRlIEhTUiBtb2R1bGUgaXRzZWxmLCBtYWtpbmcgaXQgYSBnb29kIGp1bXBpbmctb2ZmIHBvaW50IGZvciBhbmFseXNpcy4gSXQsIGFsb25nIHdpdGggYGhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCwgc2VlbSBsaWtlIGtleSBzeW1ib2xzIHRvIGNvbmNlbnRyYXRlIG9uLiBUaGV5J3JlIHByb2JhYmx5IGNvcmUgdG8gdGhlIHBhY2tldCBwcm9jZXNzaW5nIGFuZCB0YWdnaW5nLiBNeSBuZXh0IHN0ZXAgd2lsbCBiZSB0byBmaWd1cmUgb3V0IGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMgZm9yIEhTUi4gVW5kZXJzdGFuZGluZyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBvciBjb25kaXRpb25hbCBvbiBzb21lIG90aGVyIGZlYXR1cmUgYmVpbmcgZW5hYmxlZC4gVGhpcyBnaXZlcyBtZSBjb250ZXh0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDcxOCwiT3V0cHV0VG9rZW5zIjoxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjMyLjEzMjA2NTA4N1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUxNTYzMTc2MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgSFNSXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9oc3IvS2NvbmZpZy01LVxcbm5ldC9oc3IvS2NvbmZpZzo2OmNvbmZpZyBIU1JcXG5uZXQvaHNyL0tjb25maWctNy1cXHR0cmlzdGF0ZSBcXFwiSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3MgUmVkdW5kYW5jeSAoSFNSIFxcdTAwMjYgUFJQKVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MzMuNjQ3NzAxNThaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzMxNzkxMDkxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKkFzc2Vzc2luZyB0aGUgTGFuZHNjYXBlKipcblxuT2theSwgaG9sZCBvbiBhIHNlY29uZC4gQmVmb3JlIEkgZGl2ZSB0b28gZGVlcCwgSSBuZWVkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIGRlcGVuZGVuY2llcyBpbnZvbHZlZCB3aXRoIEhTUi4gSSBjYW4ndCBqdXN0IGp1bXAgaW47IEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgb3RoZXIgY29tcG9uZW50cywgc3lzdGVtcywgb3IgZGF0YSBzb3VyY2VzIEhTUiByZWxpZXMgb24uIFdoYXQgYXJlIHRoZSBpbnB1dHM/IFdoYXQgb3RoZXIgc3lzdGVtcyBkb2VzIGl0IGludGVyZmFjZSB3aXRoPyBJZGVudGlmeWluZyB0aGVzZSBkZXBlbmRlbmNpZXMgaXMgY3J1Y2lhbCBmb3IgYW55IG1lYW5pbmdmdWwgYW5hbHlzaXMgb3IgdW5kZXJzdGFuZGluZy4gSXQgd2lsbCBkaWN0YXRlIHRoZSBzY29wZSBvZiBteSBpbnZlc3RpZ2F0aW9uIGFuZCBpbmZvcm0gdGhlIGRpcmVjdGlvbiBvZiBteSByZXNlYXJjaC4gVW5kZXJzdGFuZGluZyB0aGUgY29ubmVjdGlvbnMgaXMgZnVuZGFtZW50YWwgdG8gYXZvaWQgbWlzc2luZyBhbnkgcGllY2Ugb2YgdGhlIHB1enpsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEwNDQsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wOFQwMDo1MjozNi45NjU2MTU3MDVaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU4NTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9oc3IvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0I1xcbiAgIDM6XFx0IyBJRUMgNjI0MzktMyBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5XFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdGNvbmZpZyBIU1JcXG4gICA3OlxcdFxcdHRyaXN0YXRlIFxcXCJIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXFx1MDAyNiBQUlApXFxcIlxcbiAgIDg6XFx0XFx0aGVscFxcbiAgIDk6XFx0XFx0ICBUaGlzIGVuYWJsZXMgSUVDIDYyNDM5IGRlZmluZWQgSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3NcXG4gIDEwOlxcdFxcdCAgUmVkdW5kYW5jeSAoSFNSKSBhbmQgUGFyYWxsZWwgUmVkdW5kYW5jeSBQcm90b2NvbCAoUFJQKS5cXG4gIDExOlxcdFxcbiAgMTI6XFx0XFx0ICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlbiB5b3VyIExpbnV4IGJveCB3aWxsIGJlIGFibGUgdG8gYWN0IGFzIGFcXG4gIDEzOlxcdFxcdCAgREFOSCAoXFxcIkRvdWJseSBhdHRhY2hlZCBub2RlIGltcGxlbWVudGluZyBIU1JcXFwiKSBvciBEQU5QIChcXFwiRG91Ymx5XFxuICAxNDpcXHRcXHQgIGF0dGFjaGVkIG5vZGUgaW1wbGVtZW50aW5nIFBSUFxcXCIpLiBGb3IgdGhpcyB0byB3b3JrLCB5b3VyIExpbnV4IGJveFxcbiAgMTU6XFx0XFx0ICBuZWVkcyAoYXQgbGVhc3QpIHR3byBwaHlzaWNhbCBFdGhlcm5ldCBpbnRlcmZhY2VzLlxcbiAgMTY6XFx0XFxuICAxNzpcXHRcXHQgIEZvciBEQU5ILCBpdCBtdXN0IGJlIGNvbm5lY3RlZCBhcyBhIG5vZGUgaW4gYSByaW5nIG5ldHdvcmsgdG9nZXRoZXJcXG4gIDE4OlxcdFxcdCAgd2l0aCBvdGhlciBIU1IgY2FwYWJsZSBub2Rlcy4gQWxsIEV0aGVybmV0IGZyYW1lcyBzZW50IG92ZXIgdGhlIEhTUlxcbiAgMTk6XFx0XFx0ICBkZXZpY2Ugd2lsbCBiZSBzZW50IGluIGJvdGggZGlyZWN0aW9ucyBvbiB0aGUgcmluZyAob3ZlciBib3RoIHNsYXZlXFxuICAyMDpcXHRcXHQgIHBvcnRzKSwgZ2l2aW5nIGEgcmVkdW5kYW50LCBpbnN0YW50IGZhaWwtb3ZlciBuZXR3b3JrLiBFYWNoIEhTUiBub2RlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjM2Ljk2NTc3NzMyNVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2ODU4NTU4MDkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBIU1IgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCB0aGlzIHBhdGNoIGZvciB0aGUgSFNSIGRyaXZlci4gVGhlIGZpcnN0IHRoaW5nIEkgbm90ZSBpcyB0aGF0IGl0IGRvZXNuJ3Qgc2VlbSB0byBpbnRyb2R1Y2UgYW55IG5ldyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzIGdvb2QuIEkgbmVlZCB0byBiZSBlZmZpY2llbnQgaGVyZS5cblxuUmlnaHQsIGxldCdzIHNlZSB3aGF0IGVsc2Ugd2UncmUgZGVhbGluZyB3aXRoLiBUaGUgYWN0dWFsIGNvZGUgY2hhbmdlIGlzIGluIGBuZXQvaHNyL2hzcl9mb3J3YXJkLmNgLiBJIGFsc28gc2VlIGEgdGVzdCBzY3JpcHQsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hgLCB3aGljaCBzZWVtcyB0byBiZSB1c2luZyBgaXAgbGlua2AgdG8gc2V0IHVwIEhTUiBhbmQgUFJQIGludGVyZmFjZXMuIEludGVyZXN0aW5nLiBUaGUgY29uZmlnIHVzZWQgaW4gdGhlIHRlc3QgaXMganVzdCBgSFNSYCwgd2hpY2ggc2ltcGxpZmllcyB0aGluZ3MgYSBiaXQuXG5cbkkgaGFkIGEgcXVpY2sgbG9vayBhdCBgTkVUX0ZfSFdfSFNSX1RBR19JTlNgLCBidXQgaXQgbG9va3MgbGlrZSBqdXN0IGEgbmV0ZGV2IGZlYXR1cmUgZmxhZyBhbmQgZG9lc24ndCBhcHBlYXIgdG8gYmUgdGllZCB0byBhIHNwZWNpZmljIGNvbmZpZy4gU28sIHRoZSBvbmx5IHJlbGV2YW50IGNvbmZpZyBoZXJlIGlzIGluZGVlZCBgSFNSYC5cblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHRoZSByZWFzb25pbmcuIFRoaXMgcGF0Y2ggZml4ZXMgYSBidWcuIFRoZSBkcml2ZXIgY291bGQgY29ycnVwdCBTS0JzIG9yIHRoZWlyIGNsb25lcyBkdXJpbmcgcGVyLWVncmVzcyB3cml0ZXMsIGFuZCB0aGF0J3Mgbm90IGdvb2QsIG9mIGNvdXJzZS4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG1vZGlmaWNhdGlvbi4gVGhhdCdzIGEgZ29vZCBhcHByb2FjaCB0byBhZGRyZXNzIHRoZSBzaGFyZWQgZGF0YSBpc3N1ZXMuIFRoZSBjaGFuZ2VzIGFyZSB3aXRoaW4gdGhlIGNvcmUgcGFja2V0IGZvcndhcmRpbmcgbG9naWMsIHNvIHRoZSBpbXBhY3QgaXMgcG90ZW50aWFsbHkgc2lnbmlmaWNhbnQuIFRoaXMgaXMgZGVmaW5pdGVseSByZWFjaGFibGUgY29kZSBhbmQgd29ydGggZnV6emluZy5cblxuSSd2ZSB0YWtlbiBhIHF1aWNrIGdsYW5jZSBhdCB0aGUgc3ltYm9scyBpbiBxdWVzdGlvbjogYGhzcl9mb3J3YXJkX3NrYmAsIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZWAsIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVgLiBKdXN0IG1ha2luZyBzdXJlLCBsZXQncyBxdWlja2x5IGNoZWNrIHdoZXRoZXIgYGhzcl9jbG9uZV9wcml2YXRlYCBpcyBzdGF0aWMgYW5kIGl0IGlzLiBBbmQgdGhlIG90aGVyIHR3byBhcmUgbm9uLXN0YXRpYy5cblxuT2theSwgSSdtIHNhdGlzZmllZC4gSSdsbCB1c2Ugc2V0LXJlc3VsdHMgdG8gcmV0dXJuIHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTU2MSwiT3V0cHV0VG9rZW5zIjoxMzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNTUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wOFQwMDo1Mjo0My44MjQzMzkxMTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjcyNTMxNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFNSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHNyX2ZvcndhcmRfc2tiXCIsXG4gICAgXCJoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZVwiLFxuICAgIFwicHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFNSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHNyX2ZvcndhcmRfc2tiXCIsXG4gICAgXCJoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZVwiLFxuICAgIFwicHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjQzLjkwMTA3MTk3MloiLCJTZXEiOjE5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM0MjAwMTI2MDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wOFQwMDo1Mjo0My45MDE2OTE4NjJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTM0MTkzODkwNzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxYzg2MGI0NDU0NmQ0NDI5NmVkOTFiY2M1ZDg3Nzk1ODlkNWUwYzgwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9oc3IvaHNyX2ZvcndhcmQuYyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuaW5kZXggMDc3NDk4MWE2NWMxNi4uZWZjYmYzY2YyNmY5YiAxMDA2NDRcbi0tLSBhL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuKysrIGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG5AQCAtMzI1LDggKzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHNrYjtcbiB9XG4gXG4tLyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCBqdXN0IGNsb25lIGl0IHRvIGJlIHNlbnRcbi0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJ3BvcnQnLlxuKy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUncyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzc1xuKyAqIHdyaXRlcyBjYW5ub3QgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC5cbisgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuKyAqL1xuK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7XG4rXG4rXHRjbG9uZSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpO1xuK1x0aWYgKCFjbG9uZSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHtcbitcdFx0a2ZyZWVfc2tiKGNsb25lKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXG4rXHRyZXR1cm4gY2xvbmU7XG4rfVxuK1xuKy8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwgcmV0dXJuIGEgcHJpdmF0ZSBjbG9uZVxuKyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJ3BvcnQnLiBPdGhlcndpc2UsIHJldHVybiBhIHByaXZhdGVcbisgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XG4rICogdGFnZ2VkIGZvciAncG9ydCcuXG4gICovXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbkBAIC0zMzYsMTQgKzM1NywxOCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdGludCBtb3ZlbGVuO1xuIFxuIFx0aWYgKGZyYW1lLVx1MDAzZXNrYl9oc3IpIHtcbi1cdFx0c3RydWN0IGhzcl9ldGhoZHIgKmhzcl9ldGhoZHIgPVxuLVx0XHRcdChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKGZyYW1lLVx1MDAzZXNrYl9oc3IpO1xuK1x0XHRzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjtcbitcbitcdFx0c2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXHUwMDNlc2tiX2hzcik7XG4rXHRcdGlmICghc2tiKVxuK1x0XHRcdHJldHVybiBOVUxMO1xuIFxuIFx0XHQvKiBzZXQgdGhlIGxhbmUgaWQgcHJvcGVybHkgKi9cbitcdFx0aHNyX2V0aGhkciA9IChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7XG4gXHRcdGhzcl9zZXRfcGF0aF9pZChmcmFtZSwgaHNyX2V0aGhkciwgcG9ydCk7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX2hzciwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBza2I7XG4gXHR9IGVsc2UgaWYgKHBvcnQtXHUwMDNlZGV2LVx1MDAzZWZlYXR1cmVzIFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX3N0ZCwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbiBcdH1cbiBcbiBcdC8qIENyZWF0ZSB0aGUgbmV3IHNrYiB3aXRoIGVub3VnaCBoZWFkcm9vbSB0byBmaXQgdGhlIEhTUiB0YWcgKi9cbkBAIC0zNzcsMTcgKzQwMiwyMyBAQCBzdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdHN0cnVjdCBza19idWZmICpza2I7XG4gXG4gXHRpZiAoZnJhbWUtXHUwMDNlc2tiX3BycCkge1xuLVx0XHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS1cdTAwM2Vza2JfcHJwKTtcbitcdFx0c3RydWN0IHBycF9yY3QgKnRyYWlsZXI7XG4rXG4rXHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9wcnApO1xuK1x0XHRpZiAoIXNrYilcbitcdFx0XHRyZXR1cm4gTlVMTDtcbiBcbitcdFx0dHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChza2IpO1xuIFx0XHRpZiAodHJhaWxlcikge1xuIFx0XHRcdHBycF9zZXRfbGFuX2lkKHRyYWlsZXIsIHBvcnQpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdFdBUk5fT05DRSghdHJhaWxlciwgXCJlcnJvcmVkIFBSUCBza2JcIik7XG4rXHRcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2JfcHJwLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIHNrYjtcbiBcdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9zdGQpO1xuIFx0fVxuIFxuIFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKGZyYW1lLVx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cdTAwM2Vza2Jfc3RkKSxcbkBAIC00MjAsNiArNDUxLDIyIEBAIHN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxuIFx0XHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcbiB7XG4rXHQvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzXG4rXHQgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lXG4rXHQgKiBzaGFyZXMgdGhlIG9yaWdpbmFsIFRYIHNrYiAod2hpY2ggdGFwcyBvciB0aGUgVFggcGF0aCBtYXkgc3RpbGxcbitcdCAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5XG4rXHQgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuXG4rXHQgKiBQcml2YXRpemUgYmVmb3JlIGFueSBhZGRyZXNzIG11dGF0aW9uLlxuK1x0ICovXG4rXHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGZyYW1lLVx1MDAzZXBvcnRfcmN2LVx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUiB8fFxuK1x0ICAgICAoZnJhbWUtXHUwMDNlaXNfbG9jYWxfZGVzdCBcdTAwMjZcdTAwMjYgIWZyYW1lLVx1MDAzZWlzX2xvY2FsX2V4Y2x1c2l2ZSkpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHNrYl9jb3coc2tiLCAwKSkge1xuK1x0XHRmcmFtZS1cdTAwM2Vwb3J0X3Jjdi1cdTAwM2VkZXYtXHUwMDNlc3RhdHMucnhfZHJvcHBlZCsrO1xuK1x0XHRrZnJlZV9za2Ioc2tiKTtcbitcdFx0cmV0dXJuIE5FVF9YTUlUX0RST1A7XG4rXHR9XG4rXG4gXHRpZiAoZnJhbWUtXHUwMDNlcG9ydF9yY3YtXHUwMDNldHlwZSA9PSBIU1JfUFRfTUFTVEVSKSB7XG4gXHRcdGhzcl9hZGRyX3N1YnN0X2Rlc3QoZnJhbWUtXHUwMDNlbm9kZV9zcmMsIHNrYiwgcG9ydCk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGVcbmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG5AQCAtNSw2ICs1LDcgQEAgdG9wX3NyY2RpciA9IC4uLy4uLy4uLy4uLy4uXG4gVEVTVF9QUk9HUyA6PSBcXFxuIFx0aHNyX3Bpbmcuc2ggXFxcbiBcdGhzcl9yZWRib3guc2ggXFxcbitcdGhzcl9zaGFyZWRfbXV0YXRpb24uc2ggXFxcbiBcdGxpbmtfZmF1bHRzLnNoIFxcXG4gXHRwcnBfcGluZy5zaCBcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbm5ldyBmaWxlIG1vZGUgMTAwNzU1XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbkBAIC0wLDAgKzEsMjQyIEBAXG4rIyEvYmluL2Jhc2hcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI1xuKyMgVmVyaWZ5IHRoYXQgcGVyLWVncmVzcyBtdXRhdGlvbnMgb2Ygc2hhcmVkIHNrYiBkYXRhIGFyZSBwcml2YXRlOlxuKyNcbisjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJ3MgTEFOLUlEIHdyaXRlXG4rIyBsYW5kcyBpbiB0aGUgZmlyc3Qgc2xhdmUncyBzdGlsbC1xdWV1ZWQgY2xvbmU7IHdpdGggYSBuZXRlbSBkZWxheSBvblxuKyMgc2xhdmUgQSwgaW5qZWN0ZWQgZnJhbWVzIGxlYXZlIEEgY2FycnlpbmcgQidzIExBTiBJRC5cbisjXG4rIyBGMSAoUmVkQm94IHNvdXJjZSBNQUMpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgYW4gSFNSLXRhZ2dlZCBtdWx0aWNhc3RcbisjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssXG4rIyBhbmQgdGhlIGludGVybGluaydzIFJlZEJveC1NQUMgcmV3cml0ZSBsYW5kcyBpbiB0aGUgbWFzdGVyIGNsb25lJ3NcbisjIGJ1ZmZlciwgc28gdGhlIGxvY2FsIHN0YWNrIHJlY2VpdmVzIHRoZSBSZWRCb3ggTUFDIGluc3RlYWQgb2YgdGhlXG4rIyBvcmlnaW5hdGluZyBub2RlJ3MgTUFDLlxuK1xuK2lwdjY9ZmFsc2Vcbitcbitzb3VyY2UgLi9oc3JfY29tbW9uLnNoXG4rXG4rRFVSPTVcbitcbityZXF1aXJlKClcbit7XG4rXHRjb21tYW5kIC12IFwiJDFcIiBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjEgXHUwMDI2XHUwMDI2IHJldHVybiAwXG4rXHRlY2hvIFwiU0tJUDogJDEgbm90IGF2YWlsYWJsZVwiXG4rXHRleGl0ICRrc2Z0X3NraXBcbit9XG4rXG4rcmVxdWlyZSBpcFxuK3JlcXVpcmUgdGNcbityZXF1aXJlIHB5dGhvbjNcbitcbit0cmFwIGNsZWFudXBfYWxsX25zIEVYSVRcbitcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb25cbisjIFBSUCBEQU5QIChwcm90byAxKSwgQUZfUEFDS0VUIHByZS10YWdnZWQgaW5qZWN0aW9uLCBuZXRlbSBvbiBzbGF2ZSBBLlxuK3J1bl9mMigpXG4re1xuK1x0c2V0dXBfbnMgbnMgMlx1MDAzZS9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcFxuK1x0bnN4KCkgeyBpcCBuZXRucyBleGVjIFwiJG5zXCIgXCIkQFwiOyB9XG4rXG4rXHQjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuXG4rXHRpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXCJcbitcdFx0cmV0dXJuICRrc2Z0X3NraXBcbitcdGZpXG4rXHRuc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDJcdTAwM2UvZGV2L251bGxcbitcbitcdCMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLlxuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cbitcdFx0bnN4IGlwIGxpbmsgc2V0IFwiJGlcIiB1cCB8fCB7IGVjaG8gXCJGQUlMOiAkaSB1cFwiOyByZXR1cm4gMTsgfVxuK1x0ZG9uZVxuK1x0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBwcnAwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcbitcdFx0c3VwZXJ2aXNpb24gNDUgcHJvdG8gMSAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4rXHRcdGVjaG8gXCJTS0lQOiBIU1IvUFJQIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWxcIlxuK1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuK1x0ZmlcbitcdG5zeCBpcCBsaW5rIHNldCBwcnAwIHVwIHx8IHsgZWNobyBcIkZBSUw6IHBycDAgdXBcIjsgcmV0dXJuIDE7IH1cbitcdG5zeCB0YyBxZGlzYyBhZGQgZGV2IHZBIHJvb3QgbmV0ZW0gZGVsYXkgMjAwbXMgfHxcbitcdFx0eyBlY2hvIFwiRkFJTDogbmV0ZW1cIjsgcmV0dXJuIDE7IH1cbitcbitcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXCIkRFVSXCIgXHUwMDNjXHUwMDNjJ1BZRjInXG4raW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK2R1ciA9IGludChzeXMuYXJndlsxXSlcbitkZWYgbGFuaWQocGt0KTpcbisgICAgaWYgbGVuKHBrdCkgXHUwMDNjIDIwIG9yIHBrdFstMjpdICE9IGJcIlxceDg4XFx4ZmJcIjpcbisgICAgICAgIHJldHVybiBOb25lXG4rICAgIHJldHVybiAocGt0Wy00XSBcdTAwM2VcdTAwM2UgNCkgXHUwMDI2IDB4RlxuK1xuK1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbihcIi9zeXMvY2xhc3MvbmV0L3BycDAvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rRFNUID0gYnl0ZXMuZnJvbWhleChcIjAyYWFiYmNjZGQwMVwiKVxuK1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSlcbityY3QwID0gc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDApICsgc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDUyIFx1MDAyNiAweDBGRkYpICsgYlwiXFx4ODhcXHhmYlwiXG4rZnJhbWUgPSBEU1QgKyBTUkMgKyBiXCJcXHgwOFxceDAwXCIgKyBQQVkgKyByY3QwXG4rXG4rdHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKFwicHJwMFwiLCAwKSlcbitzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc0EuYmluZCgoXCJ2QXBcIiwgMCkpXG4rc0IgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyxcbisgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKVxuK3NCLmJpbmQoKFwidkJwXCIsIDApKVxuK3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpXG4rXG4rYSwgYiA9IFtdLCBbXVxuK1xuK2RlZiBtYXRjaChwa3QpOlxuKyAgICByZXR1cm4gKHBrdFs6Nl0gPT0gRFNUIGFuZCBwa3RbNjoxMl0gPT0gU1JDXG4rICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYlwiXFx4MDhcXHgwMFwiIGFuZCBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gPT0gUEFZKVxuK1xuK2RlZiBkcmFpbih0aW1lb3V0KTpcbisgICAgd2FpdCA9IHRpbWVvdXRcbisgICAgd2hpbGUgVHJ1ZTpcbisgICAgICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzQSwgc0JdLCBbXSwgW10sIHdhaXQpXG4rICAgICAgICBpZiBub3QgcjpcbisgICAgICAgICAgICByZXR1cm5cbisgICAgICAgIGZvciBzIGluIHI6XG4rICAgICAgICAgICAgcGt0ID0gcy5yZWN2KDY1NTM1KVxuKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaChwa3QpOlxuKyAgICAgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgICAgIGxpZCA9IGxhbmlkKHBrdClcbisgICAgICAgICAgICBpZiBsaWQgaXMgbm90IE5vbmU6XG4rICAgICAgICAgICAgICAgIChhIGlmIHMgaXMgc0EgZWxzZSBiKS5hcHBlbmQobGlkKVxuKyAgICAgICAgd2FpdCA9IDBcbitcbisjIERyYWluIHdoaWxlIHNlbmRpbmcgc28gdGhlIGJ1cnN0IGNhbm5vdCBvdmVyZmxvdyB0aGUgY2FwdHVyZSBzb2NrZXRzJ1xuKyMgcmVjZWl2ZSBidWZmZXJzOyB0aGUgbmV0ZW0tZGVsYXllZCBBLXNpZGUgZnJhbWVzIGFycml2ZSBhZnRlcndhcmRzIGFuZFxuKyMgYXJlIGNvbGxlY3RlZCBiZWxvdy5cbitmb3IgXyBpbiByYW5nZSgyMDApOlxuKyAgICB0eC5zZW5kKGZyYW1lKVxuKyAgICBkcmFpbigwKVxuKyAgICB0aW1lLnNsZWVwKDAuMDAxKVxuK1xuK2VuZCA9IHRpbWUudGltZSgpICsgZHVyXG4rd2hpbGUgdGltZS50aW1lKCkgXHUwMDNjIGVuZDpcbisgICAgZHJhaW4oMC4zKVxuK1xuK3ByaW50KFwiQS1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcIiAlIChsZW4oYSksIHNvcnRlZChzZXQoYSkpKSlcbitwcmludChcIkItc2lkZSBjb3VudD0lZCBsYW4gaWRzPSVzXCIgJSAobGVuKGIpLCBzb3J0ZWQoc2V0KGIpKSkpXG4raWYgbGVuKGEpIFx1MDAzYyAxNTAgb3IgbGVuKGIpIFx1MDAzYyAxNTA6XG4rICAgIHByaW50KFwiRkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApXCJcbisgICAgICAgICAgJSAobGVuKGEpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCBcdTAwMjYgMSkgIT0gMF1cbitiYWRfYiA9IFt4IGZvciB4IGluIGIgaWYgKHggXHUwMDI2IDEpICE9IDFdXG4raWYgYmFkX2Egb3IgYmFkX2I6XG4rICAgIHByaW50KFwiRkFJTDogc2hhcmVkLW11dGF0aW9uIGNvcnJ1cHRpb24gLSBBOiAlZC8lZCB3cm9uZy1sYW4sXCJcbisgICAgICAgICAgXCIgQjogJWQvJWQgd3JvbmctbGFuXCJcbisgICAgICAgICAgJSAobGVuKGJhZF9hKSwgbGVuKGEpLCBsZW4oYmFkX2IpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK3ByaW50KFwiUEFTUzogcGVyLWVncmVzcyBMQU4gSURzIGlzb2xhdGVkIChBIGFsbCBiaXQwPTAsIEIgYWxsIGJpdDA9MSlcIilcbitzeXMuZXhpdCgwKVxuK1BZRjJcbit9XG4rXG4rIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjE6IFJlZEJveCBzb3VyY2UtTUFDIHByaXZhY3lcbisjIEhTUiBSZWRCb3ggKHByb3RvIDApLCB0YWdnZWQgbXVsdGljYXN0IGZyb20gYSBzbGF2ZTogbWFzdGVyIG11c3Qga2VlcFxuKyMgdGhlIG5vZGUgTUFDLCBpbnRlcmxpbmsgbXVzdCBjYXJyeSB0aGUgUmVkQm94IE1BQy5cbitydW5fZjEoKVxuK3tcbitcdHNldHVwX25zIG5zIDJcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcbitcdG5zeCgpIHsgaXAgbmV0bnMgZXhlYyBcIiRuc1wiIFwiJEBcIjsgfVxuK1xuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggSVwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkkgdkFwIHZCcCB2SXA7IGRvXG4rXHRcdG5zeCBpcCBsaW5rIHNldCBcIiRpXCIgdXAgfHwgeyBlY2hvIFwiRkFJTDogJGkgdXBcIjsgcmV0dXJuIDE7IH1cbitcdGRvbmVcbitcdGlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgaHNyMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFxcXG4rXHRcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFwiXG4rXHRcdHJldHVybiAka3NmdF9za2lwXG4rXHRmaVxuK1x0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFwiRkFJTDogaHNyMCB1cFwiOyByZXR1cm4gMTsgfVxuK1xuK1x0bnN4IHB5dGhvbjMgL2Rldi9zdGRpbiBcdTAwM2NcdTAwM2MnUFlGMSdcbitpbXBvcnQgc29ja2V0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK05PREUgID0gYnl0ZXMuZnJvbWhleChcIjAyMTEyMjMzNDQ1NVwiKVxuK01DQVNUID0gYnl0ZXMuZnJvbWhleChcIjAxMDA1ZTAwMDAwMVwiKVxuK1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKFwiL3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rUEFZICAgPSBieXRlcyhyYW5nZSg0NikpXG4rXG4rZGVmIGZyYW1lKHNlcSk6XG4rICAgICMgTFNEVSBzaXplID0gcGF5bG9hZCArIEhTUiB0YWcgKEhTUl9ITEVOKSwgYXMgaHNyX2ZpbGxfdGFnKCkgY29tcHV0ZXMgaXRcbisgICAgdGFnID0gKCgoMSBcdTAwM2NcdTAwM2MgMTIpIHwgKGxlbihQQVkpICsgNikpLnRvX2J5dGVzKDIsIFwiYmlnXCIpXG4rICAgICAgICAgICArIHNlcS50b19ieXRlcygyLCBcImJpZ1wiKSArIGJcIlxceDA4XFx4MDBcIilcbisgICAgcmV0dXJuIE1DQVNUICsgTk9ERSArIGJcIlxceDg5XFx4MmZcIiArIHRhZyArIFBBWVxuK1xuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcInZBcFwiLCAwKSlcbitzbSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc20uYmluZCgoXCJoc3IwXCIsIDApKVxuK3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4rICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSlcbitzaS5iaW5kKChcInZJcFwiLCAwKSlcbitzbS5zZXRibG9ja2luZyhGYWxzZSk7IHNpLnNldGJsb2NraW5nKEZhbHNlKVxuK1xuK2ZvciBpIGluIHJhbmdlKDMpOlxuKyAgICB0eC5zZW5kKGZyYW1lKGkgKyAxKSk7IHRpbWUuc2xlZXAoMC4wNSlcbitcbittX3NyYyA9IGlfc3JjID0gTm9uZVxuK2VuZCA9IHRpbWUudGltZSgpICsgNFxuK3doaWxlIHRpbWUudGltZSgpIFx1MDAzYyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOlxuKyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpXG4rICAgIGZvciBzIGluIHI6XG4rICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpXG4rICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7XG4rICAgICAgICAjIGhfc291cmNlIGlzIHRoZSBhc3NlcnRlZCB2YWx1ZSBhbmQgbXVzdCBOT1QgYmUgZmlsdGVyZWQgb25cbisgICAgICAgIGlmIChsZW4ocGt0KSBcdTAwM2MgNjAgb3IgcGt0Wzo2XSAhPSBNQ0FTVCBvciBwa3RbMTI6MTRdICE9IGJcIlxceDA4XFx4MDBcIlxuKyAgICAgICAgICAgICAgICBvciBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gIT0gUEFZKTpcbisgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZTpcbisgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXVxuKyAgICAgICAgZWxpZiBzIGlzIHNpIGFuZCBpX3NyYyBpcyBOb25lOlxuKyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdXG4rXG4rcHJpbnQoXCJtYXN0ZXIgaF9zb3VyY2UgICAgPVwiLCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXG4rcHJpbnQoXCJub2RlIE1BQyAgICAgICAgICAgPVwiLCBOT0RFLmhleCgpKVxuK3ByaW50KFwiaW50ZXJsaW5rIGhfc291cmNlID1cIiwgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKVxuK3ByaW50KFwicmVkYm94IE1BQyAgICAgICAgID1cIiwgUkIuaGV4KCkpXG4raWYgaV9zcmMgIT0gUkI6XG4rICAgIHByaW50KFwiRkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUNcIilcbisgICAgc3lzLmV4aXQoMSlcbitpZiBtX3NyYyAhPSBOT0RFOlxuKyAgICBwcmludChcIkZBSUw6IG1hc3RlciByZWNlaXZlZCAlcyBpbnN0ZWFkIG9mIHRoZSBub2RlIE1BQyBcIlxuKyAgICAgICAgICBcIihzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbilcIlxuKyAgICAgICAgICAlIChtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIFwibm90aGluZ1wiKSlcbisgICAgc3lzLmV4aXQoMSlcbitwcmludChcIlBBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXCIpXG4rc3lzLmV4aXQoMClcbitQWUYxXG4rfVxuK1xuK3JjPTBcbitcbitydW5fZjJcbityZXQ9JD9cbityYz0kKGtzZnRfc3RhdHVzX21lcmdlIFwiJHJjXCIgXCIkcmV0XCIpXG4rXG4rcnVuX2YxXG4rcmV0PSQ/XG4rcmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcIiRyY1wiIFwiJHJldFwiKVxuK1xuK2lmIFsgXCIkcmNcIiAtZXEgMCBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gKEYxK0YyKSBbIE9LIF1cIlxuK2VsaWYgWyBcIiRyY1wiIC1lcSBcIiRrc2Z0X3NraXBcIiBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogc3VidGVzdHMgc2tpcHBlZCAoY2FwYWJpbGl0aWVzIG1pc3NpbmcpXCJcbitlbHNlXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF1cIiBcXFxuK1x0XHRcInJjPSRyY1wiIDFcdTAwM2VcdTAwMjYyXG4rZmlcbitleGl0IFwiJHJjXCJcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjQzLjkwMTY5Mjk2MloiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzQxOTM3MDEwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEhTUiBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBvdmVyIHRoaXMgcGF0Y2ggdGhhdCBtb2RpZmllcyBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQncyBkZXNpZ25lZCB0byBmaXggZGF0YSBjb3JydXB0aW9uIHN0ZW1taW5nIGZyb20gc2hhcmVkIGBza2JgIGRhdGEgaW4gdGhlIEhTUiBtb2R1bGUsIHNwZWNpZmljYWxseSB3aGVuIGhhbmRsaW5nIG11bHRpcGxlIGVncmVzcyBwYXRocy4gVGhlIGNvcmUgb2YgdGhlIGZpeCByZXZvbHZlcyBhcm91bmQgcHJpdmF0aXppbmcgdGhlIGBza2JgIGRhdGEgYmVmb3JlIG1vZGlmaWNhdGlvbiB0byBhdm9pZCBjcm9zcy10YWxrIGJldHdlZW4gZGlmZmVyZW50IGNsb25lcywgd2hpY2ggbWFrZXMgc2Vuc2UuXG5cblRoZSBwcmltYXJ5IGNoYW5nZXMgaW52b2x2ZSB0aGUgaW50cm9kdWN0aW9uIG9mIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCwgd2hpY2ggY29tYmluZXMgYHNrYl9jbG9uZSgpYCBhbmQgYHNrYl9jb3coKWAuIFRoaXMgbmV3IGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSByYXcgYHNrYl9jbG9uZSgpYCBjYWxscyBpbiBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoKWAgYW5kIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYC4gQWRkaXRpb25hbGx5LCBhIGNoZWNrIGhhcyBiZWVuIGFkZGVkIGluIGBoc3JfeG1pdCgpYCB0byB1c2UgYHNrYl9jb3coKWAgZm9yIGludGVybGluay1ib3VuZCBTS0JzLlxuXG5NeSBwcmltYXJ5IGNvbmNlcm4sIGdpdmVuIHRoZSBjb250ZXh0LCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBleHBvc2VzIG9yIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBFc3NlbnRpYWxseSwgd2UncmUgdHJ5aW5nIHRvIHByZXZlbnQgZGF0YSBjb3JydXB0aW9uLiBUaGUgc2hhcmVkIGRhdGEgaXNzdWUgaXMgdGhlIHByb2JsZW0uIFdoZW4gbXVsdGlwbGUgZWdyZXNzIHBhdGhzIG11dGF0ZSBza2IgZGF0YSwgdGhleSBjaGFuZ2Ugc2hhcmVkIGRhdGEsIHdoaWNoLCBpZiBub3QgZG9uZSBjb3JyZWN0bHksIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBvdGhlciBjbG9uZXMuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhhdCB0aGUgc2tiIGhhcyBwcml2YXRlIGRhdGEuXG5cbk15IGFuYWx5c2lzIGZvY3VzZXMgb24gdGhpcyBwb2ludC4gYHNrYl9jb3coc2tiLCAwKWAgaXMgY3JpdGljYWwgaGVyZS4gSXQgZW5zdXJlcyB0aGF0IHRoZSBTS0IgZWl0aGVyIGFscmVhZHkgaGFzIGEgcHJpdmF0ZSBoZWFkIChhbmQgZGF0YSksIG9yIHdpbGwgcmVhbGxvY2F0ZSB0aGVtLiBJbXBvcnRhbnRseSwgdGhpcyByZWFsbG9jYXRpb24gKmNvcGllcyogZXhpc3RpbmcgZGF0YSwgaXQgZG9lc24ndCBsZWF2ZSBhbnkgcGFydCBvZiB0aGUgYnVmZmVyIHVuaW5pdGlhbGl6ZWQuIFdlJ3JlIGRlYWxpbmcgd2l0aCBhIGxvZ2ljYWwgYnVnIOKAkyBkYXRhIGNvcnJ1cHRpb24gZHVlIHRvIGluY29ycmVjdCBzaGFyaW5nIOKAkyBub3QgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCBvciBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhay4gVGhlIFwiY29ycnVwdGVkXCIgZGF0YSBpcyB2YWxpZCBwYWNrZXQgZGF0YS4gSXQncyBqdXN0ICppbmNvcnJlY3QqIGZvciBhIHNwZWNpZmljIGNsb25lLiBUaGVyZSdzIG5vIHNjZW5hcmlvIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy5cblxuSSd2ZSBkb3VibGUtY2hlY2tlZCB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgYHNrYl9jb3coKWAuIEl0IHVsdGltYXRlbHkgY2FsbHMgYF9fc2tiX2NvdygpYCwgd2hpY2ggdGhlbiB1c2VzIGBwc2tiX2V4cGFuZF9oZWFkYCBpZiBhIHJlYWxsb2NhdGlvbiBpcyBuZWVkZWQuIFdoaWxlIHRoZSBuZXdseSBhbGxvY2F0ZWQgaGVhZHJvb20vdGFpbHJvb20gaW4gYHBza2JfZXhwYW5kX2hlYWRgICppcyogdW5pbml0aWFsaXplZCwgaXQgaXMgKm91dHNpZGUqIHRoZSBgc2tiLVx1MDAzZWRhdGFgIHRvIGBza2ItXHUwMDNldGFpbGAgcmFuZ2UuIFRodXMsIGl0J3Mgbm90IHJlYWQgdW5sZXNzIGV4cGxpY2l0bHkgcHVzaGVkL3B1dCwgd2hpY2ggaXMgc3RhbmRhcmQgc2tiIGJlaGF2aW9yLlxuXG5UaGUgcGF0Y2gncyBjaGFuZ2VzIGNhbiBiZSBzdW1tYXJpemVkIGFzOlxuXG4xLiAgYGhzcl9jbG9uZV9wcml2YXRlKClgOiBDbG9uZXMgYW5kIHByaXZhdGl6ZXMgYW4gc2tiLlxuMi4gIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgOiBSZXBsYWNlIGNsb25lIHdpdGggcHJpdmF0ZSBjbG9uZS5cbjMuICBgaHNyX3htaXQoKWA6ICBQcml2YXRpemVzIGZvciBpbnRlcmxpbmsgcG9ydHMgYmVmb3JlIG11dGF0aW9uLlxuXG5Ob25lIG9mIHRoZXNlIGNoYW5nZXMgKmludHJvZHVjZSogdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGV5IGFyZSBhbGwgYWJvdXQgcHJvcGVybHkgcHJpdmF0aXppbmcgdGhlIHNrYiBkYXRhIHRvIHByZXZlbnQgdW5pbnRlbmRlZCBkYXRhIHNoYXJpbmcgYW5kIG1vZGlmaWNhdGlvbiwgYSBjbGFzc2ljIHNoYXJlZC1tdXRhYmxlLXN0YXRlIGJ1Zy4gVGhlIHBhdGNoIGRvZXNuJ3QgaW52b2x2ZSBhbnkgY29tcGxleCBzdHJ1Y3R1cmUgYWxsb2NhdGlvbnMgdGhhdCBtaWdodCBsZWF2ZSBmaWVsZHMgdW5pbml0aWFsaXplZC4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZS4gS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlcmVmb3JlLCB0aGUgXCJOZWVkc0tNU0FOXCIgZmxhZyBzaG91bGQgYmUgYGZhbHNlYC4gVGhlIHJlYXNvbmluZyBpcyB0aGF0IHRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljYWwgYnVnIHJlbGF0ZWQgdG8gc2hhcmVkIGRhdGEgY29ycnVwdGlvbiB3aXRoIGBza2JfY293KClgIGFuZCB0aGlzIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlza3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeS4gSSdtIGNvbmZpZGVudCBhYm91dCB0aGlzLiBJJ2xsIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNhbGwgYW5kIG1hcmsgaXQgYXMgc3VjaC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwMCwiT3V0cHV0VG9rZW5zIjoxNjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDI3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6NTcuMzIxMDY2MDMzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM2MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljYWwgYnVnIHdoZXJlIHNoYXJlZCBgc2tiYCBkYXRhIGlzIG11dGF0ZWQgYnkgb25lIGVncmVzcyBwYXRoLCBjb3JydXB0aW5nIHRoZSBkYXRhIGZvciBvdGhlciBjbG9uZXMgKGUuZy4sIGluY29ycmVjdCBMQU4gSUQgb3IgTUFDIGFkZHJlc3MpLiBUaGUgZml4IHVzZXMgYHNrYl9jb3coKWAgdG8gZW5zdXJlIHRoZSBgc2tiYCBkYXRhIGJ1ZmZlciBpcyBwcml2YXRlIGJlZm9yZSBhbnkgbW9kaWZpY2F0aW9ucyBhcmUgbWFkZS4gVGhpcyBkb2VzIG5vdCBpbnZvbHZlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciBjb21wbGV4IHN0cnVjdHVyZSBhbGxvY2F0aW9ucyB0aGF0IG1pZ2h0IGxlYXZlIGZpZWxkcyB1bmluaXRpYWxpemVkLiBUaGUgYnVnIGlzIGEgc2hhcmVkIG11dGFibGUgc3RhdGUgaXNzdWUsIGFuZCB0aGUgZml4IGNvcnJlY3RseSBwcml2YXRpemVzIHRoZSBidWZmZXIuIFN0YW5kYXJkIHRlc3RpbmcgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50IGZvciBtZW1vcnkgc2FmZXR5IGhlcmU7IEtNU0FOIGlzIG5vdCBhcHBsaWNhYmxlIGFzIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpY2FsIGJ1ZyB3aGVyZSBzaGFyZWQgYHNrYmAgZGF0YSBpcyBtdXRhdGVkIGJ5IG9uZSBlZ3Jlc3MgcGF0aCwgY29ycnVwdGluZyB0aGUgZGF0YSBmb3Igb3RoZXIgY2xvbmVzIChlLmcuLCBpbmNvcnJlY3QgTEFOIElEIG9yIE1BQyBhZGRyZXNzKS4gVGhlIGZpeCB1c2VzIGBza2JfY293KClgIHRvIGVuc3VyZSB0aGUgYHNrYmAgZGF0YSBidWZmZXIgaXMgcHJpdmF0ZSBiZWZvcmUgYW55IG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUuIFRoaXMgZG9lcyBub3QgaW52b2x2ZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgY29tcGxleCBzdHJ1Y3R1cmUgYWxsb2NhdGlvbnMgdGhhdCBtaWdodCBsZWF2ZSBmaWVsZHMgdW5pbml0aWFsaXplZC4gVGhlIGJ1ZyBpcyBhIHNoYXJlZCBtdXRhYmxlIHN0YXRlIGlzc3VlLCBhbmQgdGhlIGZpeCBjb3JyZWN0bHkgcHJpdmF0aXplcyB0aGUgYnVmZmVyLiBTdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCBmb3IgbWVtb3J5IHNhZmV0eSBoZXJlOyBLTVNBTiBpcyBub3QgYXBwbGljYWJsZSBhcyB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-08 00:48:45 +0000 UTC FinishedAt: 2026-08-08 00:52:58 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HSR" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HSR" ], "series_id": "7702a22c-a562-4665-a5a8-5bcef03032b2" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "hsr_forward_skb", "hsr_create_tagged_frame", "prp_create_tagged_frame" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hTUiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2hzcl9mb3J3YXJkX3NrYiYjMzQ7LAogICAgJiMzNDtoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7LAogICAgJiMzNDtwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMWM4NjBiNDQ1NDZkNDQyOTZlZDkxYmNjNWQ4Nzc5NTg5ZDVlMGM4MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDggMDA6NTE6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2hzci9oc3JfZm9yd2FyZC5jIGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG5pbmRleCAwNzc0OTgxYTY1YzE2Li5lZmNiZjNjZjI2ZjliIDEwMDY0NFxuLS0tIGEvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvaHNyL2hzcl9mb3J3YXJkLmNcbkBAIC0zMjUsOCAmIzQzOzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHNrYjtcbiB9XG4gXG4tLyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCBqdXN0IGNsb25lIGl0IHRvIGJlIHNlbnRcbi0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJiMzOTtwb3J0JiMzOTsuXG4mIzQzOy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUmIzM5O3MgZGF0YSBwcml2YXRlLCBzbyB0aGF0IHBlci1lZ3Jlc3NcbiYjNDM7ICogd3JpdGVzIGNhbm5vdCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LlxuJiM0MzsgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfY2xvbmVfcHJpdmF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNrX2J1ZmYgKmNsb25lO1xuJiM0MztcbiYjNDM7XHRjbG9uZSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpO1xuJiM0MztcdGlmICghY2xvbmUpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHtcbiYjNDM7XHRcdGtmcmVlX3NrYihjbG9uZSk7XG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBjbG9uZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCByZXR1cm4gYSBwcml2YXRlIGNsb25lXG4mIzQzOyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJiMzOTtwb3J0JiMzOTsuIE90aGVyd2lzZSwgcmV0dXJuIGEgcHJpdmF0ZVxuJiM0MzsgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XG4mIzQzOyAqIHRhZ2dlZCBmb3IgJiMzOTtwb3J0JiMzOTsuXG4gICovXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbkBAIC0zMzYsMTQgJiM0MzszNTcsMTggQEAgc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRpbnQgbW92ZWxlbjtcbiBcbiBcdGlmIChmcmFtZS1cdTAwM2Vza2JfaHNyKSB7XG4tXHRcdHN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyID1cbi1cdFx0XHQoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihmcmFtZS1cdTAwM2Vza2JfaHNyKTtcbiYjNDM7XHRcdHN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyO1xuJiM0MztcbiYjNDM7XHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9oc3IpO1xuJiM0MztcdFx0aWYgKCFza2IpXG4mIzQzO1x0XHRcdHJldHVybiBOVUxMO1xuIFxuIFx0XHQvKiBzZXQgdGhlIGxhbmUgaWQgcHJvcGVybHkgKi9cbiYjNDM7XHRcdGhzcl9ldGhoZHIgPSAoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpO1xuIFx0XHRoc3Jfc2V0X3BhdGhfaWQoZnJhbWUsIGhzcl9ldGhoZHIsIHBvcnQpO1xuLVx0XHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVx1MDAzZXNrYl9oc3IsIEdGUF9BVE9NSUMpO1xuJiM0MztcdFx0cmV0dXJuIHNrYjtcbiBcdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcbiYjNDM7XHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbiBcdH1cbiBcbiBcdC8qIENyZWF0ZSB0aGUgbmV3IHNrYiB3aXRoIGVub3VnaCBoZWFkcm9vbSB0byBmaXQgdGhlIEhTUiB0YWcgKi9cbkBAIC0zNzcsMTcgJiM0Mzs0MDIsMjMgQEAgc3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuIFxuIFx0aWYgKGZyYW1lLVx1MDAzZXNrYl9wcnApIHtcbi1cdFx0c3RydWN0IHBycF9yY3QgKnRyYWlsZXIgPSBza2JfZ2V0X1BSUF9yY3QoZnJhbWUtXHUwMDNlc2tiX3BycCk7XG4mIzQzO1x0XHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlcjtcbiYjNDM7XG4mIzQzO1x0XHRza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2JfcHJwKTtcbiYjNDM7XHRcdGlmICghc2tiKVxuJiM0MztcdFx0XHRyZXR1cm4gTlVMTDtcbiBcbiYjNDM7XHRcdHRyYWlsZXIgPSBza2JfZ2V0X1BSUF9yY3Qoc2tiKTtcbiBcdFx0aWYgKHRyYWlsZXIpIHtcbiBcdFx0XHRwcnBfc2V0X2xhbl9pZCh0cmFpbGVyLCBwb3J0KTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRXQVJOX09OQ0UoIXRyYWlsZXIsIFwmIzM0O2Vycm9yZWQgUFJQIHNrYlwmIzM0Oyk7XG4mIzQzO1x0XHRcdGtmcmVlX3NrYihza2IpO1xuIFx0XHRcdHJldHVybiBOVUxMO1xuIFx0XHR9XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX3BycCwgR0ZQX0FUT01JQyk7XG4mIzQzO1x0XHRyZXR1cm4gc2tiO1xuIFx0fSBlbHNlIGlmIChwb3J0LVx1MDAzZWRldi1cdTAwM2VmZWF0dXJlcyBcdTAwMjYgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykge1xuLVx0XHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVx1MDAzZXNrYl9zdGQsIEdGUF9BVE9NSUMpO1xuJiM0MztcdFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9zdGQpO1xuIFx0fVxuIFxuIFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKGZyYW1lLVx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cdTAwM2Vza2Jfc3RkKSxcbkBAIC00MjAsNiAmIzQzOzQ1MSwyMiBAQCBzdGF0aWMgdm9pZCBoc3JfZGVsaXZlcl9tYXN0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiBzdGF0aWMgaW50IGhzcl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoc3JfcG9ydCAqcG9ydCxcbiBcdFx0ICAgIHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXG4ge1xuJiM0MztcdC8qIEFuIGludGVybGluay1ib3VuZCBza2IgZnJvbSBnZXRfdW50YWdnZWRfZnJhbWUoKSBjYW4gc3RpbGwgYWxpYXNcbiYjNDM7XHQgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lXG4mIzQzO1x0ICogc2hhcmVzIHRoZSBvcmlnaW5hbCBUWCBza2IgKHdoaWNoIHRhcHMgb3IgdGhlIFRYIHBhdGggbWF5IHN0aWxsXG4mIzQzO1x0ICogaG9sZCk7IGZvciByaW5nIGZyYW1lcyB0aGUgbWFzdGVyIGFsc28gY29uc3VtZXMgdGhlbSB3aGVuIHRoZXlcbiYjNDM7XHQgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuXG4mIzQzO1x0ICogUHJpdmF0aXplIGJlZm9yZSBhbnkgYWRkcmVzcyBtdXRhdGlvbi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChmcmFtZS1cdTAwM2Vwb3J0X3Jjdi1cdTAwM2V0eXBlID09IEhTUl9QVF9NQVNURVIgfHxcbiYjNDM7XHQgICAgIChmcmFtZS1cdTAwM2Vpc19sb2NhbF9kZXN0IFx1MDAyNlx1MDAyNiAhZnJhbWUtXHUwMDNlaXNfbG9jYWxfZXhjbHVzaXZlKSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHNrYl9jb3coc2tiLCAwKSkge1xuJiM0MztcdFx0ZnJhbWUtXHUwMDNlcG9ydF9yY3YtXHUwMDNlZGV2LVx1MDAzZXN0YXRzLnJ4X2Ryb3BwZWQmIzQzOyYjNDM7O1xuJiM0MztcdFx0a2ZyZWVfc2tiKHNrYik7XG4mIzQzO1x0XHRyZXR1cm4gTkVUX1hNSVRfRFJPUDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGZyYW1lLVx1MDAzZXBvcnRfcmN2LVx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUikge1xuIFx0XHRoc3JfYWRkcl9zdWJzdF9kZXN0KGZyYW1lLVx1MDAzZW5vZGVfc3JjLCBza2IsIHBvcnQpO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG5pbmRleCAzMWZiOTMyNmNmNTMzLi44N2ZlMzQ5NTFiOGIwIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxuQEAgLTUsNiAmIzQzOzUsNyBAQCB0b3Bfc3JjZGlyID0gLi4vLi4vLi4vLi4vLi5cbiBURVNUX1BST0dTIDo9IFxcXG4gXHRoc3JfcGluZy5zaCBcXFxuIFx0aHNyX3JlZGJveC5zaCBcXFxuJiM0MztcdGhzcl9zaGFyZWRfbXV0YXRpb24uc2ggXFxcbiBcdGxpbmtfZmF1bHRzLnNoIFxcXG4gXHRwcnBfcGluZy5zaCBcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbm5ldyBmaWxlIG1vZGUgMTAwNzU1XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbkBAIC0wLDAgJiM0MzsxLDI0MiBAQFxuJiM0MzsjIS9iaW4vYmFzaFxuJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNcbiYjNDM7IyBWZXJpZnkgdGhhdCBwZXItZWdyZXNzIG11dGF0aW9ucyBvZiBzaGFyZWQgc2tiIGRhdGEgYXJlIHByaXZhdGU6XG4mIzQzOyNcbiYjNDM7IyBGMiAocGF0aC9MQU4gSUQpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgdGhlIHNlY29uZCBzbGF2ZSYjMzk7cyBMQU4tSUQgd3JpdGVcbiYjNDM7IyBsYW5kcyBpbiB0aGUgZmlyc3Qgc2xhdmUmIzM5O3Mgc3RpbGwtcXVldWVkIGNsb25lOyB3aXRoIGEgbmV0ZW0gZGVsYXkgb25cbiYjNDM7IyBzbGF2ZSBBLCBpbmplY3RlZCBmcmFtZXMgbGVhdmUgQSBjYXJyeWluZyBCJiMzOTtzIExBTiBJRC5cbiYjNDM7I1xuJiM0MzsjIEYxIChSZWRCb3ggc291cmNlIE1BQyk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCBhbiBIU1ItdGFnZ2VkIG11bHRpY2FzdFxuJiM0MzsjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssXG4mIzQzOyMgYW5kIHRoZSBpbnRlcmxpbmsmIzM5O3MgUmVkQm94LU1BQyByZXdyaXRlIGxhbmRzIGluIHRoZSBtYXN0ZXIgY2xvbmUmIzM5O3NcbiYjNDM7IyBidWZmZXIsIHNvIHRoZSBsb2NhbCBzdGFjayByZWNlaXZlcyB0aGUgUmVkQm94IE1BQyBpbnN0ZWFkIG9mIHRoZVxuJiM0MzsjIG9yaWdpbmF0aW5nIG5vZGUmIzM5O3MgTUFDLlxuJiM0MztcbiYjNDM7aXB2Nj1mYWxzZVxuJiM0MztcbiYjNDM7c291cmNlIC4vaHNyX2NvbW1vbi5zaFxuJiM0MztcbiYjNDM7RFVSPTVcbiYjNDM7XG4mIzQzO3JlcXVpcmUoKVxuJiM0Mzt7XG4mIzQzO1x0Y29tbWFuZCAtdiBcJiMzNDskMVwmIzM0OyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjEgXHUwMDI2XHUwMDI2IHJldHVybiAwXG4mIzQzO1x0ZWNobyBcJiMzNDtTS0lQOiAkMSBub3QgYXZhaWxhYmxlXCYjMzQ7XG4mIzQzO1x0ZXhpdCAka3NmdF9za2lwXG4mIzQzO31cbiYjNDM7XG4mIzQzO3JlcXVpcmUgaXBcbiYjNDM7cmVxdWlyZSB0Y1xuJiM0MztyZXF1aXJlIHB5dGhvbjNcbiYjNDM7XG4mIzQzO3RyYXAgY2xlYW51cF9hbGxfbnMgRVhJVFxuJiM0MztcbiYjNDM7IyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEYyOiBMQU4tSUQgaXNvbGF0aW9uXG4mIzQzOyMgUFJQIERBTlAgKHByb3RvIDEpLCBBRl9QQUNLRVQgcHJlLXRhZ2dlZCBpbmplY3Rpb24sIG5ldGVtIG9uIHNsYXZlIEEuXG4mIzQzO3J1bl9mMigpXG4mIzQzO3tcbiYjNDM7XHRzZXR1cF9ucyBucyAyXHUwMDNlL2Rldi9udWxsIHx8IHJldHVybiAka3NmdF9za2lwXG4mIzQzO1x0bnN4KCkgeyBpcCBuZXRucyBleGVjIFwmIzM0OyRuc1wmIzM0OyBcJiMzNDskQFwmIzM0OzsgfVxuJiM0MztcbiYjNDM7XHQjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuXG4mIzQzO1x0aWYgISBuc3ggdGMgcWRpc2MgYWRkIGRldiBsbyByb290IG5ldGVtIGRlbGF5IDFtcyAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4mIzQzO1x0XHRlY2hvIFwmIzM0O1NLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXCYjMzQ7XG4mIzQzO1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuJiM0MztcdGZpXG4mIzQzO1x0bnN4IHRjIHFkaXNjIGRlbCBkZXYgbG8gcm9vdCAyXHUwMDNlL2Rldi9udWxsXG4mIzQzO1xuJiM0MztcdCMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLlxuJiM0MztcdG5zeCBpcCBsaW5rIGFkZCB2QSB0eXBlIHZldGggcGVlciBuYW1lIHZBcCB8fFxuJiM0MztcdFx0eyBlY2hvIFwmIzM0O0ZBSUw6IHZldGggQVwmIzM0OzsgcmV0dXJuIDE7IH1cbiYjNDM7XHRuc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHxcbiYjNDM7XHRcdHsgZWNobyBcJiMzNDtGQUlMOiB2ZXRoIEJcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cbiYjNDM7XHRcdG5zeCBpcCBsaW5rIHNldCBcJiMzNDskaVwmIzM0OyB1cCB8fCB7IGVjaG8gXCYjMzQ7RkFJTDogJGkgdXBcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0ZG9uZVxuJiM0MztcdGlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgcHJwMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFxcXG4mIzQzO1x0XHRzdXBlcnZpc2lvbiA0NSBwcm90byAxIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbiYjNDM7XHRcdGVjaG8gXCYjMzQ7U0tJUDogSFNSL1BSUCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsXCYjMzQ7XG4mIzQzO1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuJiM0MztcdGZpXG4mIzQzO1x0bnN4IGlwIGxpbmsgc2V0IHBycDAgdXAgfHwgeyBlY2hvIFwmIzM0O0ZBSUw6IHBycDAgdXBcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0bnN4IHRjIHFkaXNjIGFkZCBkZXYgdkEgcm9vdCBuZXRlbSBkZWxheSAyMDBtcyB8fFxuJiM0MztcdFx0eyBlY2hvIFwmIzM0O0ZBSUw6IG5ldGVtXCYjMzQ7OyByZXR1cm4gMTsgfVxuJiM0MztcbiYjNDM7XHRuc3ggcHl0aG9uMyAvZGV2L3N0ZGluIFwmIzM0OyREVVJcJiMzNDsgXHUwMDNjXHUwMDNjJiMzOTtQWUYyJiMzOTtcbiYjNDM7aW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZVxuJiM0MztcbiYjNDM7ZHVyID0gaW50KHN5cy5hcmd2WzFdKVxuJiM0MztkZWYgbGFuaWQocGt0KTpcbiYjNDM7ICAgIGlmIGxlbihwa3QpIFx1MDAzYyAyMCBvciBwa3RbLTI6XSAhPSBiXCYjMzQ7XFx4ODhcXHhmYlwmIzM0OzpcbiYjNDM7ICAgICAgICByZXR1cm4gTm9uZVxuJiM0MzsgICAgcmV0dXJuIChwa3RbLTRdIFx1MDAzZVx1MDAzZSA0KSBcdTAwMjYgMHhGXG4mIzQzO1xuJiM0MztTUkMgPSBieXRlcy5mcm9taGV4KG9wZW4oXCYjMzQ7L3N5cy9jbGFzcy9uZXQvcHJwMC9hZGRyZXNzXCYjMzQ7KS5yZWFkKCkucmVwbGFjZShcJiMzNDs6XCYjMzQ7LCBcJiMzNDtcJiMzNDspKVxuJiM0MztEU1QgPSBieXRlcy5mcm9taGV4KFwmIzM0OzAyYWFiYmNjZGQwMVwmIzM0OylcbiYjNDM7UEFZID0gYnl0ZXMocmFuZ2UoNDYpKVxuJiM0MztyY3QwID0gc3RydWN0LnBhY2soXCYjMzQ7XHUwMDNlSFwmIzM0OywgMCkgJiM0Mzsgc3RydWN0LnBhY2soXCYjMzQ7XHUwMDNlSFwmIzM0OywgNTIgXHUwMDI2IDB4MEZGRikgJiM0MzsgYlwmIzM0O1xceDg4XFx4ZmJcJiMzNDtcbiYjNDM7ZnJhbWUgPSBEU1QgJiM0MzsgU1JDICYjNDM7IGJcJiMzNDtcXHgwOFxceDAwXCYjMzQ7ICYjNDM7IFBBWSAmIzQzOyByY3QwXG4mIzQzO1xuJiM0Mzt0eCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXKTsgdHguYmluZCgoXCYjMzQ7cHJwMFwmIzM0OywgMCkpXG4mIzQzO3NBID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4mIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4mIzQzO3NBLmJpbmQoKFwmIzM0O3ZBcFwmIzM0OywgMCkpXG4mIzQzO3NCID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4mIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4mIzQzO3NCLmJpbmQoKFwmIzM0O3ZCcFwmIzM0OywgMCkpXG4mIzQzO3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpXG4mIzQzO1xuJiM0MzthLCBiID0gW10sIFtdXG4mIzQzO1xuJiM0MztkZWYgbWF0Y2gocGt0KTpcbiYjNDM7ICAgIHJldHVybiAocGt0Wzo2XSA9PSBEU1QgYW5kIHBrdFs2OjEyXSA9PSBTUkNcbiYjNDM7ICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYlwmIzM0O1xceDA4XFx4MDBcJiMzNDsgYW5kIHBrdFsxNDoxNCAmIzQzOyBsZW4oUEFZKV0gPT0gUEFZKVxuJiM0MztcbiYjNDM7ZGVmIGRyYWluKHRpbWVvdXQpOlxuJiM0MzsgICAgd2FpdCA9IHRpbWVvdXRcbiYjNDM7ICAgIHdoaWxlIFRydWU6XG4mIzQzOyAgICAgICAgciwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3NBLCBzQl0sIFtdLCBbXSwgd2FpdClcbiYjNDM7ICAgICAgICBpZiBub3QgcjpcbiYjNDM7ICAgICAgICAgICAgcmV0dXJuXG4mIzQzOyAgICAgICAgZm9yIHMgaW4gcjpcbiYjNDM7ICAgICAgICAgICAgcGt0ID0gcy5yZWN2KDY1NTM1KVxuJiM0MzsgICAgICAgICAgICBpZiBub3QgbWF0Y2gocGt0KTpcbiYjNDM7ICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4mIzQzOyAgICAgICAgICAgIGxpZCA9IGxhbmlkKHBrdClcbiYjNDM7ICAgICAgICAgICAgaWYgbGlkIGlzIG5vdCBOb25lOlxuJiM0MzsgICAgICAgICAgICAgICAgKGEgaWYgcyBpcyBzQSBlbHNlIGIpLmFwcGVuZChsaWQpXG4mIzQzOyAgICAgICAgd2FpdCA9IDBcbiYjNDM7XG4mIzQzOyMgRHJhaW4gd2hpbGUgc2VuZGluZyBzbyB0aGUgYnVyc3QgY2Fubm90IG92ZXJmbG93IHRoZSBjYXB0dXJlIHNvY2tldHMmIzM5O1xuJiM0MzsjIHJlY2VpdmUgYnVmZmVyczsgdGhlIG5ldGVtLWRlbGF5ZWQgQS1zaWRlIGZyYW1lcyBhcnJpdmUgYWZ0ZXJ3YXJkcyBhbmRcbiYjNDM7IyBhcmUgY29sbGVjdGVkIGJlbG93LlxuJiM0Mztmb3IgXyBpbiByYW5nZSgyMDApOlxuJiM0MzsgICAgdHguc2VuZChmcmFtZSlcbiYjNDM7ICAgIGRyYWluKDApXG4mIzQzOyAgICB0aW1lLnNsZWVwKDAuMDAxKVxuJiM0MztcbiYjNDM7ZW5kID0gdGltZS50aW1lKCkgJiM0MzsgZHVyXG4mIzQzO3doaWxlIHRpbWUudGltZSgpIFx1MDAzYyBlbmQ6XG4mIzQzOyAgICBkcmFpbigwLjMpXG4mIzQzO1xuJiM0MztwcmludChcJiMzNDtBLXNpZGUgY291bnQ9JWQgbGFuIGlkcz0lc1wmIzM0OyAlIChsZW4oYSksIHNvcnRlZChzZXQoYSkpKSlcbiYjNDM7cHJpbnQoXCYjMzQ7Qi1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcJiMzNDsgJSAobGVuKGIpLCBzb3J0ZWQoc2V0KGIpKSkpXG4mIzQzO2lmIGxlbihhKSBcdTAwM2MgMTUwIG9yIGxlbihiKSBcdTAwM2MgMTUwOlxuJiM0MzsgICAgcHJpbnQoXCYjMzQ7RkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApXCYjMzQ7XG4mIzQzOyAgICAgICAgICAlIChsZW4oYSksIGxlbihiKSkpXG4mIzQzOyAgICBzeXMuZXhpdCgxKVxuJiM0MztiYWRfYSA9IFt4IGZvciB4IGluIGEgaWYgKHggXHUwMDI2IDEpICE9IDBdXG4mIzQzO2JhZF9iID0gW3ggZm9yIHggaW4gYiBpZiAoeCBcdTAwMjYgMSkgIT0gMV1cbiYjNDM7aWYgYmFkX2Egb3IgYmFkX2I6XG4mIzQzOyAgICBwcmludChcJiMzNDtGQUlMOiBzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbiAtIEE6ICVkLyVkIHdyb25nLWxhbixcJiMzNDtcbiYjNDM7ICAgICAgICAgIFwmIzM0OyBCOiAlZC8lZCB3cm9uZy1sYW5cJiMzNDtcbiYjNDM7ICAgICAgICAgICUgKGxlbihiYWRfYSksIGxlbihhKSwgbGVuKGJhZF9iKSwgbGVuKGIpKSlcbiYjNDM7ICAgIHN5cy5leGl0KDEpXG4mIzQzO3ByaW50KFwmIzM0O1BBU1M6IHBlci1lZ3Jlc3MgTEFOIElEcyBpc29sYXRlZCAoQSBhbGwgYml0MD0wLCBCIGFsbCBiaXQwPTEpXCYjMzQ7KVxuJiM0MztzeXMuZXhpdCgwKVxuJiM0MztQWUYyXG4mIzQzO31cbiYjNDM7XG4mIzQzOyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEYxOiBSZWRCb3ggc291cmNlLU1BQyBwcml2YWN5XG4mIzQzOyMgSFNSIFJlZEJveCAocHJvdG8gMCksIHRhZ2dlZCBtdWx0aWNhc3QgZnJvbSBhIHNsYXZlOiBtYXN0ZXIgbXVzdCBrZWVwXG4mIzQzOyMgdGhlIG5vZGUgTUFDLCBpbnRlcmxpbmsgbXVzdCBjYXJyeSB0aGUgUmVkQm94IE1BQy5cbiYjNDM7cnVuX2YxKClcbiYjNDM7e1xuJiM0MztcdHNldHVwX25zIG5zIDJcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcbiYjNDM7XHRuc3goKSB7IGlwIG5ldG5zIGV4ZWMgXCYjMzQ7JG5zXCYjMzQ7IFwmIzM0OyRAXCYjMzQ7OyB9XG4mIzQzO1xuJiM0MztcdG5zeCBpcCBsaW5rIGFkZCB2QSB0eXBlIHZldGggcGVlciBuYW1lIHZBcCB8fFxuJiM0MztcdFx0eyBlY2hvIFwmIzM0O0ZBSUw6IHZldGggQVwmIzM0OzsgcmV0dXJuIDE7IH1cbiYjNDM7XHRuc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHxcbiYjNDM7XHRcdHsgZWNobyBcJiMzNDtGQUlMOiB2ZXRoIEJcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1x0bnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8XG4mIzQzO1x0XHR7IGVjaG8gXCYjMzQ7RkFJTDogdmV0aCBJXCYjMzQ7OyByZXR1cm4gMTsgfVxuJiM0MztcdGZvciBpIGluIHZBIHZCIHZJIHZBcCB2QnAgdklwOyBkb1xuJiM0MztcdFx0bnN4IGlwIGxpbmsgc2V0IFwmIzM0OyRpXCYjMzQ7IHVwIHx8IHsgZWNobyBcJiMzNDtGQUlMOiAkaSB1cFwmIzM0OzsgcmV0dXJuIDE7IH1cbiYjNDM7XHRkb25lXG4mIzQzO1x0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBoc3IwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcbiYjNDM7XHRcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbiYjNDM7XHRcdGVjaG8gXCYjMzQ7U0tJUDogSFNSIFJlZEJveCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsXCYjMzQ7XG4mIzQzO1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuJiM0MztcdGZpXG4mIzQzO1x0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFwmIzM0O0ZBSUw6IGhzcjAgdXBcJiMzNDs7IHJldHVybiAxOyB9XG4mIzQzO1xuJiM0MztcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXHUwMDNjXHUwMDNjJiMzOTtQWUYxJiMzOTtcbiYjNDM7aW1wb3J0IHNvY2tldCwgc2VsZWN0LCBzeXMsIHRpbWVcbiYjNDM7XG4mIzQzO05PREUgID0gYnl0ZXMuZnJvbWhleChcJiMzNDswMjExMjIzMzQ0NTVcJiMzNDspXG4mIzQzO01DQVNUID0gYnl0ZXMuZnJvbWhleChcJiMzNDswMTAwNWUwMDAwMDFcJiMzNDspXG4mIzQzO1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKFwmIzM0Oy9zeXMvY2xhc3MvbmV0L3ZJL2FkZHJlc3NcJiMzNDspLnJlYWQoKS5yZXBsYWNlKFwmIzM0OzpcJiMzNDssIFwmIzM0O1wmIzM0OykpXG4mIzQzO1BBWSAgID0gYnl0ZXMocmFuZ2UoNDYpKVxuJiM0MztcbiYjNDM7ZGVmIGZyYW1lKHNlcSk6XG4mIzQzOyAgICAjIExTRFUgc2l6ZSA9IHBheWxvYWQgJiM0MzsgSFNSIHRhZyAoSFNSX0hMRU4pLCBhcyBoc3JfZmlsbF90YWcoKSBjb21wdXRlcyBpdFxuJiM0MzsgICAgdGFnID0gKCgoMSBcdTAwM2NcdTAwM2MgMTIpIHwgKGxlbihQQVkpICYjNDM7IDYpKS50b19ieXRlcygyLCBcJiMzNDtiaWdcJiMzNDspXG4mIzQzOyAgICAgICAgICAgJiM0Mzsgc2VxLnRvX2J5dGVzKDIsIFwmIzM0O2JpZ1wmIzM0OykgJiM0MzsgYlwmIzM0O1xceDA4XFx4MDBcJiMzNDspXG4mIzQzOyAgICByZXR1cm4gTUNBU1QgJiM0MzsgTk9ERSAmIzQzOyBiXCYjMzQ7XFx4ODlcXHgyZlwmIzM0OyAmIzQzOyB0YWcgJiM0MzsgUEFZXG4mIzQzO1xuJiM0Mzt0eCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXKTsgdHguYmluZCgoXCYjMzQ7dkFwXCYjMzQ7LCAwKSlcbiYjNDM7c20gPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyxcbiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSlcbiYjNDM7c20uYmluZCgoXCYjMzQ7aHNyMFwmIzM0OywgMCkpXG4mIzQzO3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4mIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4mIzQzO3NpLmJpbmQoKFwmIzM0O3ZJcFwmIzM0OywgMCkpXG4mIzQzO3NtLnNldGJsb2NraW5nKEZhbHNlKTsgc2kuc2V0YmxvY2tpbmcoRmFsc2UpXG4mIzQzO1xuJiM0Mztmb3IgaSBpbiByYW5nZSgzKTpcbiYjNDM7ICAgIHR4LnNlbmQoZnJhbWUoaSAmIzQzOyAxKSk7IHRpbWUuc2xlZXAoMC4wNSlcbiYjNDM7XG4mIzQzO21fc3JjID0gaV9zcmMgPSBOb25lXG4mIzQzO2VuZCA9IHRpbWUudGltZSgpICYjNDM7IDRcbiYjNDM7d2hpbGUgdGltZS50aW1lKCkgXHUwMDNjIGVuZCBhbmQgKG1fc3JjIGlzIE5vbmUgb3IgaV9zcmMgaXMgTm9uZSk6XG4mIzQzOyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpXG4mIzQzOyAgICBmb3IgcyBpbiByOlxuJiM0MzsgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSlcbiYjNDM7ICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7XG4mIzQzOyAgICAgICAgIyBoX3NvdXJjZSBpcyB0aGUgYXNzZXJ0ZWQgdmFsdWUgYW5kIG11c3QgTk9UIGJlIGZpbHRlcmVkIG9uXG4mIzQzOyAgICAgICAgaWYgKGxlbihwa3QpIFx1MDAzYyA2MCBvciBwa3RbOjZdICE9IE1DQVNUIG9yIHBrdFsxMjoxNF0gIT0gYlwmIzM0O1xceDA4XFx4MDBcJiMzNDtcbiYjNDM7ICAgICAgICAgICAgICAgIG9yIHBrdFsxNDoxNCAmIzQzOyBsZW4oUEFZKV0gIT0gUEFZKTpcbiYjNDM7ICAgICAgICAgICAgY29udGludWVcbiYjNDM7ICAgICAgICBpZiBzIGlzIHNtIGFuZCBtX3NyYyBpcyBOb25lOlxuJiM0MzsgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXVxuJiM0MzsgICAgICAgIGVsaWYgcyBpcyBzaSBhbmQgaV9zcmMgaXMgTm9uZTpcbiYjNDM7ICAgICAgICAgICAgaV9zcmMgPSBwa3RbNjoxMl1cbiYjNDM7XG4mIzQzO3ByaW50KFwmIzM0O21hc3RlciBoX3NvdXJjZSAgICA9XCYjMzQ7LCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXG4mIzQzO3ByaW50KFwmIzM0O25vZGUgTUFDICAgICAgICAgICA9XCYjMzQ7LCBOT0RFLmhleCgpKVxuJiM0MztwcmludChcJiMzNDtpbnRlcmxpbmsgaF9zb3VyY2UgPVwmIzM0OywgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKVxuJiM0MztwcmludChcJiMzNDtyZWRib3ggTUFDICAgICAgICAgPVwmIzM0OywgUkIuaGV4KCkpXG4mIzQzO2lmIGlfc3JjICE9IFJCOlxuJiM0MzsgICAgcHJpbnQoXCYjMzQ7RkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUNcJiMzNDspXG4mIzQzOyAgICBzeXMuZXhpdCgxKVxuJiM0MztpZiBtX3NyYyAhPSBOT0RFOlxuJiM0MzsgICAgcHJpbnQoXCYjMzQ7RkFJTDogbWFzdGVyIHJlY2VpdmVkICVzIGluc3RlYWQgb2YgdGhlIG5vZGUgTUFDIFwmIzM0O1xuJiM0MzsgICAgICAgICAgXCYjMzQ7KHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uKVwmIzM0O1xuJiM0MzsgICAgICAgICAgJSAobV9zcmMuaGV4KCkgaWYgbV9zcmMgZWxzZSBcJiMzNDtub3RoaW5nXCYjMzQ7KSlcbiYjNDM7ICAgIHN5cy5leGl0KDEpXG4mIzQzO3ByaW50KFwmIzM0O1BBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXCYjMzQ7KVxuJiM0MztzeXMuZXhpdCgwKVxuJiM0MztQWUYxXG4mIzQzO31cbiYjNDM7XG4mIzQzO3JjPTBcbiYjNDM7XG4mIzQzO3J1bl9mMlxuJiM0MztyZXQ9JD9cbiYjNDM7cmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcJiMzNDskcmNcJiMzNDsgXCYjMzQ7JHJldFwmIzM0OylcbiYjNDM7XG4mIzQzO3J1bl9mMVxuJiM0MztyZXQ9JD9cbiYjNDM7cmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcJiMzNDskcmNcJiMzNDsgXCYjMzQ7JHJldFwmIzM0OylcbiYjNDM7XG4mIzQzO2lmIFsgXCYjMzQ7JHJjXCYjMzQ7IC1lcSAwIF07IHRoZW5cbiYjNDM7XHRlY2hvIFwmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHBlci1lZ3Jlc3MgbXV0YXRpb24gaXNvbGF0aW9uIChGMSYjNDM7RjIpIFsgT0sgXVwmIzM0O1xuJiM0MztlbGlmIFsgXCYjMzQ7JHJjXCYjMzQ7IC1lcSBcJiMzNDska3NmdF9za2lwXCYjMzQ7IF07IHRoZW5cbiYjNDM7XHRlY2hvIFwmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHN1YnRlc3RzIHNraXBwZWQgKGNhcGFiaWxpdGllcyBtaXNzaW5nKVwmIzM0O1xuJiM0MztlbHNlXG4mIzQzO1x0ZWNobyBcJiMzNDtoc3Jfc2hhcmVkX211dGF0aW9uOiBwZXItZWdyZXNzIG11dGF0aW9uIGlzb2xhdGlvbiBbIEZBSUwgXVwmIzM0OyBcXFxuJiM0MztcdFx0XCYjMzQ7cmM9JHJjXCYjMzQ7IDFcdTAwM2VcdTAwMjYyXG4mIzQzO2ZpXG4mIzQzO2V4aXQgXCYjMzQ7JHJjXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hTUiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2hzcl9mb3J3YXJkX3NrYiYjMzQ7LAogICAgJiMzNDtoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7LAogICAgJiMzNDtwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAxYzg2MGI0NDU0NmQ0NDI5NmVkOTFiY2M1ZDg3Nzk1ODlkNWUwYzgwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL25ldC9oc3IvaHNyX2ZvcndhcmQuYyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuYwppbmRleCAwNzc0OTgxYTY1YzE2Li5lZmNiZjNjZjI2ZjliIDEwMDY0NAotLS0gYS9uZXQvaHNyL2hzcl9mb3J3YXJkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jCkBAIC0zMjUsOCAmIzQzOzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCXJldHVybiBza2I7CiB9CiAKLS8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwganVzdCBjbG9uZSBpdCB0byBiZSBzZW50Ci0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJiMzOTtwb3J0JiMzOTsuCiYjNDM7LyogQ2xvbmUgYW4gc2tiIGFuZCBtYWtlIHRoZSBjbG9uZSYjMzk7cyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzcwomIzQzOyAqIHdyaXRlcyBjYW5ub3QgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4KJiM0MzsgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBza19idWZmICpjbG9uZTsKJiM0MzsKJiM0MzsJY2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKJiM0MzsJaWYgKCFjbG9uZSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHsKJiM0MzsJCWtmcmVlX3NrYihjbG9uZSk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gY2xvbmU7CiYjNDM7fQomIzQzOwomIzQzOy8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwgcmV0dXJuIGEgcHJpdmF0ZSBjbG9uZQomIzQzOyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJiMzOTtwb3J0JiMzOTsuIE90aGVyd2lzZSwgcmV0dXJuIGEgcHJpdmF0ZQomIzQzOyAqIGNsb25lIGZvciBoYXJkd2FyZSB0YWcgaW5zZXJ0aW9uLCBvciBjcmVhdGUgYSBwcml2YXRlIGZyYW1lIGVzcGVjaWFsbHkKJiM0MzsgKiB0YWdnZWQgZm9yICYjMzk7cG9ydCYjMzk7LgogICovCiBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSwKIAkJCQkJc3RydWN0IGhzcl9wb3J0ICpwb3J0KQpAQCAtMzM2LDE0ICYjNDM7MzU3LDE4IEBAIHN0cnVjdCBza19idWZmICpoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLAogCWludCBtb3ZlbGVuOwogCiAJaWYgKGZyYW1lLSZndDtza2JfaHNyKSB7Ci0JCXN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyID0KLQkJCShzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKGZyYW1lLSZndDtza2JfaHNyKTsKJiM0MzsJCXN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyOwomIzQzOwomIzQzOwkJc2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtJmd0O3NrYl9oc3IpOwomIzQzOwkJaWYgKCFza2IpCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiAKIAkJLyogc2V0IHRoZSBsYW5lIGlkIHByb3Blcmx5ICovCiYjNDM7CQloc3JfZXRoaGRyID0gKHN0cnVjdCBoc3JfZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIAkJaHNyX3NldF9wYXRoX2lkKGZyYW1lLCBoc3JfZXRoaGRyLCBwb3J0KTsKLQkJcmV0dXJuIHNrYl9jbG9uZShmcmFtZS0mZ3Q7c2tiX2hzciwgR0ZQX0FUT01JQyk7CiYjNDM7CQlyZXR1cm4gc2tiOwogCX0gZWxzZSBpZiAocG9ydC0mZ3Q7ZGV2LSZndDtmZWF0dXJlcyAmYW1wOyBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7Ci0JCXJldHVybiBza2JfY2xvbmUoZnJhbWUtJmd0O3NrYl9zdGQsIEdGUF9BVE9NSUMpOwomIzQzOwkJcmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2Jfc3RkKTsKIAl9CiAKIAkvKiBDcmVhdGUgdGhlIG5ldyBza2Igd2l0aCBlbm91Z2ggaGVhZHJvb20gdG8gZml0IHRoZSBIU1IgdGFnICovCkBAIC0zNzcsMTcgJiM0Mzs0MDIsMjMgQEAgc3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsCiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWlmIChmcmFtZS0mZ3Q7c2tiX3BycCkgewotCQlzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS0mZ3Q7c2tiX3BycCk7CiYjNDM7CQlzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlcjsKJiM0MzsKJiM0MzsJCXNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2JfcHJwKTsKJiM0MzsJCWlmICghc2tiKQomIzQzOwkJCXJldHVybiBOVUxMOwogCiYjNDM7CQl0cmFpbGVyID0gc2tiX2dldF9QUlBfcmN0KHNrYik7CiAJCWlmICh0cmFpbGVyKSB7CiAJCQlwcnBfc2V0X2xhbl9pZCh0cmFpbGVyLCBwb3J0KTsKIAkJfSBlbHNlIHsKIAkJCVdBUk5fT05DRSghdHJhaWxlciwgJiMzNDtlcnJvcmVkIFBSUCBza2ImIzM0Oyk7CiYjNDM7CQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLSZndDtza2JfcHJwLCBHRlBfQVRPTUlDKTsKJiM0MzsJCXJldHVybiBza2I7CiAJfSBlbHNlIGlmIChwb3J0LSZndDtkZXYtJmd0O2ZlYXR1cmVzICZhbXA7IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHsKLQkJcmV0dXJuIHNrYl9jbG9uZShmcmFtZS0mZ3Q7c2tiX3N0ZCwgR0ZQX0FUT01JQyk7CiYjNDM7CQlyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtJmd0O3NrYl9zdGQpOwogCX0KIAogCXNrYiA9IHNrYl9jb3B5X2V4cGFuZChmcmFtZS0mZ3Q7c2tiX3N0ZCwgc2tiX2hlYWRyb29tKGZyYW1lLSZndDtza2Jfc3RkKSwKQEAgLTQyMCw2ICYjNDM7NDUxLDIyIEBAIHN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogc3RhdGljIGludCBoc3JfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQsCiAJCSAgICBzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lKQogewomIzQzOwkvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzCiYjNDM7CSAqIGFub3RoZXIgbGl2ZSBjb25zdW1lcjogZm9yIG1hc3Rlci1vcmlnaW5hdGVkIGZyYW1lcyB0aGUgY2xvbmUKJiM0MzsJICogc2hhcmVzIHRoZSBvcmlnaW5hbCBUWCBza2IgKHdoaWNoIHRhcHMgb3IgdGhlIFRYIHBhdGggbWF5IHN0aWxsCiYjNDM7CSAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5CiYjNDM7CSAqIGFyZSBkZXN0aW5lZCB0byB0aGUgbG9jYWwgbm9kZSB3aXRob3V0IGJlaW5nIGV4Y2x1c2l2ZSB0byBpdC4KJiM0MzsJICogUHJpdmF0aXplIGJlZm9yZSBhbnkgYWRkcmVzcyBtdXRhdGlvbi4KJiM0MzsJICovCiYjNDM7CWlmIChwb3J0LSZndDt0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgJmFtcDsmYW1wOwomIzQzOwkgICAgKGZyYW1lLSZndDtwb3J0X3Jjdi0mZ3Q7dHlwZSA9PSBIU1JfUFRfTUFTVEVSIHx8CiYjNDM7CSAgICAgKGZyYW1lLSZndDtpc19sb2NhbF9kZXN0ICZhbXA7JmFtcDsgIWZyYW1lLSZndDtpc19sb2NhbF9leGNsdXNpdmUpKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBza2JfY293KHNrYiwgMCkpIHsKJiM0MzsJCWZyYW1lLSZndDtwb3J0X3Jjdi0mZ3Q7ZGV2LSZndDtzdGF0cy5yeF9kcm9wcGVkJiM0MzsmIzQzOzsKJiM0MzsJCWtmcmVlX3NrYihza2IpOwomIzQzOwkJcmV0dXJuIE5FVF9YTUlUX0RST1A7CiYjNDM7CX0KJiM0MzsKIAlpZiAoZnJhbWUtJmd0O3BvcnRfcmN2LSZndDt0eXBlID09IEhTUl9QVF9NQVNURVIpIHsKIAkJaHNyX2FkZHJfc3Vic3RfZGVzdChmcmFtZS0mZ3Q7bm9kZV9zcmMsIHNrYiwgcG9ydCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlCmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZQpAQCAtNSw2ICYjNDM7NSw3IEBAIHRvcF9zcmNkaXIgPSAuLi8uLi8uLi8uLi8uLgogVEVTVF9QUk9HUyA6PSBcCiAJaHNyX3Bpbmcuc2ggXAogCWhzcl9yZWRib3guc2ggXAomIzQzOwloc3Jfc2hhcmVkX211dGF0aW9uLnNoIFwKIAlsaW5rX2ZhdWx0cy5zaCBcCiAJcHJwX3Bpbmcuc2ggXAogIyBlbmQgb2YgVEVTVF9QUk9HUwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAwMDAwMDAuLjBiOGI4NzkxMTkwZDEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2gKQEAgLTAsMCAmIzQzOzEsMjQyIEBACiYjNDM7IyEvYmluL2Jhc2gKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7IwomIzQzOyMgVmVyaWZ5IHRoYXQgcGVyLWVncmVzcyBtdXRhdGlvbnMgb2Ygc2hhcmVkIHNrYiBkYXRhIGFyZSBwcml2YXRlOgomIzQzOyMKJiM0MzsjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJiMzOTtzIExBTi1JRCB3cml0ZQomIzQzOyMgbGFuZHMgaW4gdGhlIGZpcnN0IHNsYXZlJiMzOTtzIHN0aWxsLXF1ZXVlZCBjbG9uZTsgd2l0aCBhIG5ldGVtIGRlbGF5IG9uCiYjNDM7IyBzbGF2ZSBBLCBpbmplY3RlZCBmcmFtZXMgbGVhdmUgQSBjYXJyeWluZyBCJiMzOTtzIExBTiBJRC4KJiM0MzsjCiYjNDM7IyBGMSAoUmVkQm94IHNvdXJjZSBNQUMpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgYW4gSFNSLXRhZ2dlZCBtdWx0aWNhc3QKJiM0MzsjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssCiYjNDM7IyBhbmQgdGhlIGludGVybGluayYjMzk7cyBSZWRCb3gtTUFDIHJld3JpdGUgbGFuZHMgaW4gdGhlIG1hc3RlciBjbG9uZSYjMzk7cwomIzQzOyMgYnVmZmVyLCBzbyB0aGUgbG9jYWwgc3RhY2sgcmVjZWl2ZXMgdGhlIFJlZEJveCBNQUMgaW5zdGVhZCBvZiB0aGUKJiM0MzsjIG9yaWdpbmF0aW5nIG5vZGUmIzM5O3MgTUFDLgomIzQzOwomIzQzO2lwdjY9ZmFsc2UKJiM0MzsKJiM0Mztzb3VyY2UgLi9oc3JfY29tbW9uLnNoCiYjNDM7CiYjNDM7RFVSPTUKJiM0MzsKJiM0MztyZXF1aXJlKCkKJiM0Mzt7CiYjNDM7CWNvbW1hbmQgLXYgJiMzNDskMSYjMzQ7ICZndDsvZGV2L251bGwgMiZndDsmYW1wOzEgJmFtcDsmYW1wOyByZXR1cm4gMAomIzQzOwllY2hvICYjMzQ7U0tJUDogJDEgbm90IGF2YWlsYWJsZSYjMzQ7CiYjNDM7CWV4aXQgJGtzZnRfc2tpcAomIzQzO30KJiM0MzsKJiM0MztyZXF1aXJlIGlwCiYjNDM7cmVxdWlyZSB0YwomIzQzO3JlcXVpcmUgcHl0aG9uMwomIzQzOwomIzQzO3RyYXAgY2xlYW51cF9hbGxfbnMgRVhJVAomIzQzOwomIzQzOyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGMjogTEFOLUlEIGlzb2xhdGlvbgomIzQzOyMgUFJQIERBTlAgKHByb3RvIDEpLCBBRl9QQUNLRVQgcHJlLXRhZ2dlZCBpbmplY3Rpb24sIG5ldGVtIG9uIHNsYXZlIEEuCiYjNDM7cnVuX2YyKCkKJiM0Mzt7CiYjNDM7CXNldHVwX25zIG5zIDImZ3Q7L2Rldi9udWxsIHx8IHJldHVybiAka3NmdF9za2lwCiYjNDM7CW5zeCgpIHsgaXAgbmV0bnMgZXhlYyAmIzM0OyRucyYjMzQ7ICYjMzQ7JEAmIzM0OzsgfQomIzQzOwomIzQzOwkjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuCiYjNDM7CWlmICEgbnN4IHRjIHFkaXNjIGFkZCBkZXYgbG8gcm9vdCBuZXRlbSBkZWxheSAxbXMgMiZndDsvZGV2L251bGw7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtTS0lQOiBzY2hfbmV0ZW0gbm90IGF2YWlsYWJsZSYjMzQ7CiYjNDM7CQlyZXR1cm4gJGtzZnRfc2tpcAomIzQzOwlmaQomIzQzOwluc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDImZ3Q7L2Rldi9udWxsCiYjNDM7CiYjNDM7CSMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLgomIzQzOwluc3ggaXAgbGluayBhZGQgdkEgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QXAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQiYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwlmb3IgaSBpbiB2QSB2QiB2QXAgdkJwOyBkbwomIzQzOwkJbnN4IGlwIGxpbmsgc2V0ICYjMzQ7JGkmIzM0OyB1cCB8fCB7IGVjaG8gJiMzNDtGQUlMOiAkaSB1cCYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwlkb25lCiYjNDM7CWlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgcHJwMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFwKJiM0MzsJCXN1cGVydmlzaW9uIDQ1IHByb3RvIDEgMiZndDsvZGV2L251bGw7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtTS0lQOiBIU1IvUFJQIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWwmIzM0OwomIzQzOwkJcmV0dXJuICRrc2Z0X3NraXAKJiM0MzsJZmkKJiM0MzsJbnN4IGlwIGxpbmsgc2V0IHBycDAgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogcHJwMCB1cCYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggdGMgcWRpc2MgYWRkIGRldiB2QSByb290IG5ldGVtIGRlbGF5IDIwMG1zIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiBuZXRlbSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwomIzQzOwluc3ggcHl0aG9uMyAvZGV2L3N0ZGluICYjMzQ7JERVUiYjMzQ7ICZsdDsmbHQ7JiMzOTtQWUYyJiMzOTsKJiM0MztpbXBvcnQgc29ja2V0LCBzdHJ1Y3QsIHNlbGVjdCwgc3lzLCB0aW1lCiYjNDM7CiYjNDM7ZHVyID0gaW50KHN5cy5hcmd2WzFdKQomIzQzO2RlZiBsYW5pZChwa3QpOgomIzQzOyAgICBpZiBsZW4ocGt0KSAmbHQ7IDIwIG9yIHBrdFstMjpdICE9IGImIzM0O1x4ODhceGZiJiMzNDs6CiYjNDM7ICAgICAgICByZXR1cm4gTm9uZQomIzQzOyAgICByZXR1cm4gKHBrdFstNF0gJmd0OyZndDsgNCkgJmFtcDsgMHhGCiYjNDM7CiYjNDM7U1JDID0gYnl0ZXMuZnJvbWhleChvcGVuKCYjMzQ7L3N5cy9jbGFzcy9uZXQvcHJwMC9hZGRyZXNzJiMzNDspLnJlYWQoKS5yZXBsYWNlKCYjMzQ7OiYjMzQ7LCAmIzM0OyYjMzQ7KSkKJiM0MztEU1QgPSBieXRlcy5mcm9taGV4KCYjMzQ7MDJhYWJiY2NkZDAxJiMzNDspCiYjNDM7UEFZID0gYnl0ZXMocmFuZ2UoNDYpKQomIzQzO3JjdDAgPSBzdHJ1Y3QucGFjaygmIzM0OyZndDtIJiMzNDssIDApICYjNDM7IHN0cnVjdC5wYWNrKCYjMzQ7Jmd0O0gmIzM0OywgNTIgJmFtcDsgMHgwRkZGKSAmIzQzOyBiJiMzNDtceDg4XHhmYiYjMzQ7CiYjNDM7ZnJhbWUgPSBEU1QgJiM0MzsgU1JDICYjNDM7IGImIzM0O1x4MDhceDAwJiMzNDsgJiM0MzsgUEFZICYjNDM7IHJjdDAKJiM0MzsKJiM0Mzt0eCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXKTsgdHguYmluZCgoJiMzNDtwcnAwJiMzNDssIDApKQomIzQzO3NBID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsCiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSkKJiM0MztzQS5iaW5kKCgmIzM0O3ZBcCYjMzQ7LCAwKSkKJiM0MztzQiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLAomIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpCiYjNDM7c0IuYmluZCgoJiMzNDt2QnAmIzM0OywgMCkpCiYjNDM7c0Euc2V0YmxvY2tpbmcoRmFsc2UpOyBzQi5zZXRibG9ja2luZyhGYWxzZSkKJiM0MzsKJiM0MzthLCBiID0gW10sIFtdCiYjNDM7CiYjNDM7ZGVmIG1hdGNoKHBrdCk6CiYjNDM7ICAgIHJldHVybiAocGt0Wzo2XSA9PSBEU1QgYW5kIHBrdFs2OjEyXSA9PSBTUkMKJiM0MzsgICAgICAgICAgICBhbmQgcGt0WzEyOjE0XSA9PSBiJiMzNDtceDA4XHgwMCYjMzQ7IGFuZCBwa3RbMTQ6MTQgJiM0MzsgbGVuKFBBWSldID09IFBBWSkKJiM0MzsKJiM0MztkZWYgZHJhaW4odGltZW91dCk6CiYjNDM7ICAgIHdhaXQgPSB0aW1lb3V0CiYjNDM7ICAgIHdoaWxlIFRydWU6CiYjNDM7ICAgICAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc0EsIHNCXSwgW10sIFtdLCB3YWl0KQomIzQzOyAgICAgICAgaWYgbm90IHI6CiYjNDM7ICAgICAgICAgICAgcmV0dXJuCiYjNDM7ICAgICAgICBmb3IgcyBpbiByOgomIzQzOyAgICAgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSkKJiM0MzsgICAgICAgICAgICBpZiBub3QgbWF0Y2gocGt0KToKJiM0MzsgICAgICAgICAgICAgICAgY29udGludWUKJiM0MzsgICAgICAgICAgICBsaWQgPSBsYW5pZChwa3QpCiYjNDM7ICAgICAgICAgICAgaWYgbGlkIGlzIG5vdCBOb25lOgomIzQzOyAgICAgICAgICAgICAgICAoYSBpZiBzIGlzIHNBIGVsc2UgYikuYXBwZW5kKGxpZCkKJiM0MzsgICAgICAgIHdhaXQgPSAwCiYjNDM7CiYjNDM7IyBEcmFpbiB3aGlsZSBzZW5kaW5nIHNvIHRoZSBidXJzdCBjYW5ub3Qgb3ZlcmZsb3cgdGhlIGNhcHR1cmUgc29ja2V0cyYjMzk7CiYjNDM7IyByZWNlaXZlIGJ1ZmZlcnM7IHRoZSBuZXRlbS1kZWxheWVkIEEtc2lkZSBmcmFtZXMgYXJyaXZlIGFmdGVyd2FyZHMgYW5kCiYjNDM7IyBhcmUgY29sbGVjdGVkIGJlbG93LgomIzQzO2ZvciBfIGluIHJhbmdlKDIwMCk6CiYjNDM7ICAgIHR4LnNlbmQoZnJhbWUpCiYjNDM7ICAgIGRyYWluKDApCiYjNDM7ICAgIHRpbWUuc2xlZXAoMC4wMDEpCiYjNDM7CiYjNDM7ZW5kID0gdGltZS50aW1lKCkgJiM0MzsgZHVyCiYjNDM7d2hpbGUgdGltZS50aW1lKCkgJmx0OyBlbmQ6CiYjNDM7ICAgIGRyYWluKDAuMykKJiM0MzsKJiM0MztwcmludCgmIzM0O0Etc2lkZSBjb3VudD0lZCBsYW4gaWRzPSVzJiMzNDsgJSAobGVuKGEpLCBzb3J0ZWQoc2V0KGEpKSkpCiYjNDM7cHJpbnQoJiMzNDtCLXNpZGUgY291bnQ9JWQgbGFuIGlkcz0lcyYjMzQ7ICUgKGxlbihiKSwgc29ydGVkKHNldChiKSkpKQomIzQzO2lmIGxlbihhKSAmbHQ7IDE1MCBvciBsZW4oYikgJmx0OyAxNTA6CiYjNDM7ICAgIHByaW50KCYjMzQ7RkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApJiMzNDsKJiM0MzsgICAgICAgICAgJSAobGVuKGEpLCBsZW4oYikpKQomIzQzOyAgICBzeXMuZXhpdCgxKQomIzQzO2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCAmYW1wOyAxKSAhPSAwXQomIzQzO2JhZF9iID0gW3ggZm9yIHggaW4gYiBpZiAoeCAmYW1wOyAxKSAhPSAxXQomIzQzO2lmIGJhZF9hIG9yIGJhZF9iOgomIzQzOyAgICBwcmludCgmIzM0O0ZBSUw6IHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uIC0gQTogJWQvJWQgd3JvbmctbGFuLCYjMzQ7CiYjNDM7ICAgICAgICAgICYjMzQ7IEI6ICVkLyVkIHdyb25nLWxhbiYjMzQ7CiYjNDM7ICAgICAgICAgICUgKGxlbihiYWRfYSksIGxlbihhKSwgbGVuKGJhZF9iKSwgbGVuKGIpKSkKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztwcmludCgmIzM0O1BBU1M6IHBlci1lZ3Jlc3MgTEFOIElEcyBpc29sYXRlZCAoQSBhbGwgYml0MD0wLCBCIGFsbCBiaXQwPTEpJiMzNDspCiYjNDM7c3lzLmV4aXQoMCkKJiM0MztQWUYyCiYjNDM7fQomIzQzOwomIzQzOyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEYxOiBSZWRCb3ggc291cmNlLU1BQyBwcml2YWN5CiYjNDM7IyBIU1IgUmVkQm94IChwcm90byAwKSwgdGFnZ2VkIG11bHRpY2FzdCBmcm9tIGEgc2xhdmU6IG1hc3RlciBtdXN0IGtlZXAKJiM0MzsjIHRoZSBub2RlIE1BQywgaW50ZXJsaW5rIG11c3QgY2FycnkgdGhlIFJlZEJveCBNQUMuCiYjNDM7cnVuX2YxKCkKJiM0Mzt7CiYjNDM7CXNldHVwX25zIG5zIDImZ3Q7L2Rldi9udWxsIHx8IHJldHVybiAka3NmdF9za2lwCiYjNDM7CW5zeCgpIHsgaXAgbmV0bnMgZXhlYyAmIzM0OyRucyYjMzQ7ICYjMzQ7JEAmIzM0OzsgfQomIzQzOwomIzQzOwluc3ggaXAgbGluayBhZGQgdkEgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QXAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggaXAgbGluayBhZGQgdkIgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2QnAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggQiYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwluc3ggaXAgbGluayBhZGQgdkkgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2SXAgfHwKJiM0MzsJCXsgZWNobyAmIzM0O0ZBSUw6IHZldGggSSYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwlmb3IgaSBpbiB2QSB2QiB2SSB2QXAgdkJwIHZJcDsgZG8KJiM0MzsJCW5zeCBpcCBsaW5rIHNldCAmIzM0OyRpJiMzNDsgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogJGkgdXAmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZG9uZQomIzQzOwlpZiAhIG5zeCBpcCBsaW5rIGFkZCBuYW1lIGhzcjAgdHlwZSBoc3Igc2xhdmUxIHZBIHNsYXZlMiB2QiBcCiYjNDM7CQlpbnRlcmxpbmsgdkkgc3VwZXJ2aXNpb24gNDUgcHJvdG8gMCAyJmd0Oy9kZXYvbnVsbDsgdGhlbgomIzQzOwkJZWNobyAmIzM0O1NLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbCYjMzQ7CiYjNDM7CQlyZXR1cm4gJGtzZnRfc2tpcAomIzQzOwlmaQomIzQzOwluc3ggaXAgbGluayBzZXQgaHNyMCB1cCB8fCB7IGVjaG8gJiMzNDtGQUlMOiBoc3IwIHVwJiMzNDs7IHJldHVybiAxOyB9CiYjNDM7CiYjNDM7CW5zeCBweXRob24zIC9kZXYvc3RkaW4gJmx0OyZsdDsmIzM5O1BZRjEmIzM5OwomIzQzO2ltcG9ydCBzb2NrZXQsIHNlbGVjdCwgc3lzLCB0aW1lCiYjNDM7CiYjNDM7Tk9ERSAgPSBieXRlcy5mcm9taGV4KCYjMzQ7MDIxMTIyMzM0NDU1JiMzNDspCiYjNDM7TUNBU1QgPSBieXRlcy5mcm9taGV4KCYjMzQ7MDEwMDVlMDAwMDAxJiMzNDspCiYjNDM7UkIgICAgPSBieXRlcy5mcm9taGV4KG9wZW4oJiMzNDsvc3lzL2NsYXNzL25ldC92SS9hZGRyZXNzJiMzNDspLnJlYWQoKS5yZXBsYWNlKCYjMzQ7OiYjMzQ7LCAmIzM0OyYjMzQ7KSkKJiM0MztQQVkgICA9IGJ5dGVzKHJhbmdlKDQ2KSkKJiM0MzsKJiM0MztkZWYgZnJhbWUoc2VxKToKJiM0MzsgICAgIyBMU0RVIHNpemUgPSBwYXlsb2FkICYjNDM7IEhTUiB0YWcgKEhTUl9ITEVOKSwgYXMgaHNyX2ZpbGxfdGFnKCkgY29tcHV0ZXMgaXQKJiM0MzsgICAgdGFnID0gKCgoMSAmbHQ7Jmx0OyAxMikgfCAobGVuKFBBWSkgJiM0MzsgNikpLnRvX2J5dGVzKDIsICYjMzQ7YmlnJiMzNDspCiYjNDM7ICAgICAgICAgICAmIzQzOyBzZXEudG9fYnl0ZXMoMiwgJiMzNDtiaWcmIzM0OykgJiM0MzsgYiYjMzQ7XHgwOFx4MDAmIzM0OykKJiM0MzsgICAgcmV0dXJuIE1DQVNUICYjNDM7IE5PREUgJiM0MzsgYiYjMzQ7XHg4OVx4MmYmIzM0OyAmIzQzOyB0YWcgJiM0MzsgUEFZCiYjNDM7CiYjNDM7dHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKCYjMzQ7dkFwJiMzNDssIDApKQomIzQzO3NtID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsCiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSkKJiM0MztzbS5iaW5kKCgmIzM0O2hzcjAmIzM0OywgMCkpCiYjNDM7c2kgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVywKJiM0MzsgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKQomIzQzO3NpLmJpbmQoKCYjMzQ7dklwJiMzNDssIDApKQomIzQzO3NtLnNldGJsb2NraW5nKEZhbHNlKTsgc2kuc2V0YmxvY2tpbmcoRmFsc2UpCiYjNDM7CiYjNDM7Zm9yIGkgaW4gcmFuZ2UoMyk6CiYjNDM7ICAgIHR4LnNlbmQoZnJhbWUoaSAmIzQzOyAxKSk7IHRpbWUuc2xlZXAoMC4wNSkKJiM0MzsKJiM0MzttX3NyYyA9IGlfc3JjID0gTm9uZQomIzQzO2VuZCA9IHRpbWUudGltZSgpICYjNDM7IDQKJiM0Mzt3aGlsZSB0aW1lLnRpbWUoKSAmbHQ7IGVuZCBhbmQgKG1fc3JjIGlzIE5vbmUgb3IgaV9zcmMgaXMgTm9uZSk6CiYjNDM7ICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzbSwgc2ldLCBbXSwgW10sIDAuMykKJiM0MzsgICAgZm9yIHMgaW4gcjoKJiM0MzsgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSkKJiM0MzsgICAgICAgICMgZXhhY3QgZmxvdzogZHN0LCBwb3N0LXN0cmlwIEV0aGVyVHlwZSwgZXhhY3QgcGF5bG9hZCwgbWluIGxlbmd0aDsKJiM0MzsgICAgICAgICMgaF9zb3VyY2UgaXMgdGhlIGFzc2VydGVkIHZhbHVlIGFuZCBtdXN0IE5PVCBiZSBmaWx0ZXJlZCBvbgomIzQzOyAgICAgICAgaWYgKGxlbihwa3QpICZsdDsgNjAgb3IgcGt0Wzo2XSAhPSBNQ0FTVCBvciBwa3RbMTI6MTRdICE9IGImIzM0O1x4MDhceDAwJiMzNDsKJiM0MzsgICAgICAgICAgICAgICAgb3IgcGt0WzE0OjE0ICYjNDM7IGxlbihQQVkpXSAhPSBQQVkpOgomIzQzOyAgICAgICAgICAgIGNvbnRpbnVlCiYjNDM7ICAgICAgICBpZiBzIGlzIHNtIGFuZCBtX3NyYyBpcyBOb25lOgomIzQzOyAgICAgICAgICAgIG1fc3JjID0gcGt0WzY6MTJdCiYjNDM7ICAgICAgICBlbGlmIHMgaXMgc2kgYW5kIGlfc3JjIGlzIE5vbmU6CiYjNDM7ICAgICAgICAgICAgaV9zcmMgPSBwa3RbNjoxMl0KJiM0MzsKJiM0MztwcmludCgmIzM0O21hc3RlciBoX3NvdXJjZSAgICA9JiMzNDssIG1fc3JjLmhleCgpIGlmIG1fc3JjIGVsc2UgTm9uZSkKJiM0MztwcmludCgmIzM0O25vZGUgTUFDICAgICAgICAgICA9JiMzNDssIE5PREUuaGV4KCkpCiYjNDM7cHJpbnQoJiMzNDtpbnRlcmxpbmsgaF9zb3VyY2UgPSYjMzQ7LCBpX3NyYy5oZXgoKSBpZiBpX3NyYyBlbHNlIE5vbmUpCiYjNDM7cHJpbnQoJiMzNDtyZWRib3ggTUFDICAgICAgICAgPSYjMzQ7LCBSQi5oZXgoKSkKJiM0MztpZiBpX3NyYyAhPSBSQjoKJiM0MzsgICAgcHJpbnQoJiMzNDtGQUlMOiBpbnRlcmxpbmsgZGlkIG5vdCBjYXJyeSB0aGUgUmVkQm94IE1BQyYjMzQ7KQomIzQzOyAgICBzeXMuZXhpdCgxKQomIzQzO2lmIG1fc3JjICE9IE5PREU6CiYjNDM7ICAgIHByaW50KCYjMzQ7RkFJTDogbWFzdGVyIHJlY2VpdmVkICVzIGluc3RlYWQgb2YgdGhlIG5vZGUgTUFDICYjMzQ7CiYjNDM7ICAgICAgICAgICYjMzQ7KHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uKSYjMzQ7CiYjNDM7ICAgICAgICAgICUgKG1fc3JjLmhleCgpIGlmIG1fc3JjIGVsc2UgJiMzNDtub3RoaW5nJiMzNDspKQomIzQzOyAgICBzeXMuZXhpdCgxKQomIzQzO3ByaW50KCYjMzQ7UEFTUzogbWFzdGVyIGtlcHQgbm9kZSBNQUMsIGludGVybGluayBrZXB0IFJlZEJveCBNQUMmIzM0OykKJiM0MztzeXMuZXhpdCgwKQomIzQzO1BZRjEKJiM0Mzt9CiYjNDM7CiYjNDM7cmM9MAomIzQzOwomIzQzO3J1bl9mMgomIzQzO3JldD0kPwomIzQzO3JjPSQoa3NmdF9zdGF0dXNfbWVyZ2UgJiMzNDskcmMmIzM0OyAmIzM0OyRyZXQmIzM0OykKJiM0MzsKJiM0MztydW5fZjEKJiM0MztyZXQ9JD8KJiM0MztyYz0kKGtzZnRfc3RhdHVzX21lcmdlICYjMzQ7JHJjJiMzNDsgJiMzNDskcmV0JiMzNDspCiYjNDM7CiYjNDM7aWYgWyAmIzM0OyRyYyYjMzQ7IC1lcSAwIF07IHRoZW4KJiM0MzsJZWNobyAmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHBlci1lZ3Jlc3MgbXV0YXRpb24gaXNvbGF0aW9uIChGMSYjNDM7RjIpIFsgT0sgXSYjMzQ7CiYjNDM7ZWxpZiBbICYjMzQ7JHJjJiMzNDsgLWVxICYjMzQ7JGtzZnRfc2tpcCYjMzQ7IF07IHRoZW4KJiM0MzsJZWNobyAmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHN1YnRlc3RzIHNraXBwZWQgKGNhcGFiaWxpdGllcyBtaXNzaW5nKSYjMzQ7CiYjNDM7ZWxzZQomIzQzOwllY2hvICYjMzQ7aHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF0mIzM0OyBcCiYjNDM7CQkmIzM0O3JjPSRyYyYjMzQ7IDEmZ3Q7JmFtcDsyCiYjNDM7ZmkKJiM0MztleGl0ICYjMzQ7JHJjJiMzNDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjgwMwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDE4NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEhTUiBEcml2ZXIgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIHRoZSBIU1IgZHJpdmVyLCBzcGVjaWZpY2FsbHkgaW4gYG5ldC9oc3IvaHNyX2ZvcndhcmQuY2AuIEl0JiMzOTtzIGludHJvZHVjaW5nIGEgY3JpdGljYWwgY2hhbmdlOyBpdCYjMzk7cyB1c2luZyBhIG5ldyBmdW5jdGlvbiwgYGhzcl9jbG9uZV9wcml2YXRlKClgLCB3aGljaCBkb2VzIGEgY29weS1vbi13cml0ZSAoYHNrYl9jb3coKWApIG9mIHRoZSBTS0IsIGVmZmVjdGl2ZWx5IG1ha2luZyB0aGUgZGF0YSBwcml2YXRlLiAgVGhlIGltcGxpY2F0aW9ucyBoZXJlIGFyZSBzaWduaWZpY2FudC4gSXQmIzM5O3MgcmVwbGFjaW5nIHRoZSBzdGFuZGFyZCBgc2tiX2Nsb25lKClgIGNhbGxzIGluIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgIHdpdGggdGhpcyBjb3B5LW9uLXdyaXRlIHZlcnNpb24uCgpUaGUgcmF0aW9uYWxlIGlzIGNsZWFyIOKAkyBhbmQgY3J1Y2lhbC4gVGhpcyBpcyBhYm91dCBwcmV2ZW50aW5nIGRhdGEgY29ycnVwdGlvbi4gV2l0aCBgc2tiX2Nsb25lKClgLCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgY2xvbmVkIFNLQiB3b3VsZCBhZmZlY3QgdGhlIG9yaWdpbmFsIGFuZCBhbnkgb3RoZXIgY2xvbmVzLCBwYXJ0aWN1bGFybHkgZHVyaW5nIHBlci1lZ3Jlc3Mgd3JpdGVzLCBhbmQgdGhhdCYjMzk7cyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIgaW4gYSBoaWdoLWF2YWlsYWJpbGl0eSBzeXN0ZW0uIFRoaXMgdXBkYXRlIGluIGBoc3JfeG1pdCgpYCBpcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcuIFRoZSBwYXRjaCBpcyBlbnN1cmluZyB0aGUgU0tCIGlzIHByaXZhdGl6ZWQgKmJlZm9yZSogYW55IGFkZHJlc3MgbW9kaWZpY2F0aW9uIGZvciBpbnRlcmxpbmstYm91bmQgU0tCcy4gVGhhdCBtZWFucyB0aGUgY29weS1vbi13cml0ZSBoYXBwZW5zIHVwZnJvbnQgdG8gZ3VhcmQgYWdhaW5zdCBleGFjdGx5IHRoaXMgdHlwZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBpc3N1ZS4KCkVzc2VudGlhbGx5LCB0aGlzIHBhdGNoIGlzIGFkZHJlc3NpbmcgYSByYWNlIGNvbmRpdGlvbiwgYSBjbGFzc2ljIHByb2JsZW0gaW4gbmV0d29yayBkcml2ZXJzIHdoZXJlIG11bHRpcGxlIHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXJlIHRyeWluZyB0byB3cml0ZSB0byB0aGUgc2FtZSBidWZmZXIuIFRoaXMgaXMgYSBzb2xpZCBhcHByb2FjaCB0byBmaXhpbmcgdGhhdC4gTm93LCBJIG5lZWQgdG8gZGl2ZSBpbnRvIHRoZSBjb2RlIGl0c2VsZiwgYW5hbHl6ZSB0aGUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zLCBhbmQgYWxzbyBtYWtlIHN1cmUgdGhlIEtjb25maWcgbWFrZXMgc2Vuc2UsIGNvbmZpcm1pbmcgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBzZXQuICBMZXQmIzM5O3Mgc2VlIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2hzcl9jbG9uZV9wcml2YXRlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvaHNyX2ZvcndhcmQuYz0yODg9c3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfZmlsbF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzMxLSAqL1xubmV0L2hzci9oc3JfZm9yd2FyZC5jOjMzMjpzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzMzLXtcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzUyPXN0cnVjdCBza19idWZmICpoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLFxuLS1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNjEtXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6MzYyOlx0XHRza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2JfaHNyKTtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNjMtXHRcdGlmICghc2tiKVxuLS1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNzAtXHR9IGVsc2UgaWYgKHBvcnQtXHUwMDNlZGV2LVx1MDAzZWZlYXR1cmVzIFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6MzcxOlx0XHRyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXHUwMDNlc2tiX3N0ZCk7XG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzcyLVx0fVxuLS1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYz0zOTk9c3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQwNi1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0MDc6XHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9wcnApO1xubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQwOC1cdFx0aWYgKCFza2IpXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQyMC1cdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0MjE6XHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00MjItXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzkxNwoJCQkJCQkJb3V0cHV0OiAxNwoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIGNoYW5nZXMgYW5kIHdoZXJlIEkgc2hvdWxkIGZvY3VzIG15IGF0dGVudGlvbjoKCioqTmF2aWdhdGluZyB0aGUgSFNSIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIHRoZSBtb2RpZmljYXRpb25zIGFyZSBkZWZpbml0ZWx5IHdpdGhpbiBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gVGhhdCYjMzk7cyB0aGUgY29yZSBmb3J3YXJkaW5nIGxvZ2ljIGZvciBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IpLCBzbyBpdCYjMzk7cyB0aGUgcmlnaHQgcGxhY2UgdG8gYmVnaW4uIEJlZm9yZSBkaXZpbmcgZGVlcCBpbnRvIHRoZSBjb2RlIGl0c2VsZiwgSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIEtjb25maWcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBIU1IuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgcG90ZW50aWFsbHkgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgaG93IEkgY2FuIGNvbnRyb2wgaXQgaW4gdGhlIGJ1aWxkLiBLbm93aW5nIHRoZSBLY29uZmlnIG9wdGlvbnMgd2lsbCBxdWlja2x5IGlsbHVtaW5hdGUgdGhlIGJpZ2dlciBwaWN0dXJlLiBUaGlzIHdpbGwgaGVscCBmcmFtZSB0aGUgY2hhbmdlcyB3aXRoaW4gdGhlIG92ZXJhbGwgc3lzdGVtIGRlc2lnbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgSFNSJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvS2NvbmZpZy01LVxubmV0L2hzci9LY29uZmlnOjY6Y29uZmlnIEhTUlxubmV0L2hzci9LY29uZmlnLTctXHR0cmlzdGF0ZSBcJiMzNDtIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXHUwMDI2IFBSUClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MTc3CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjoKCioqRnV6emluZyBGb2N1czogSW5pdGlhbCBBc3Nlc3NtZW50KioKCk9rYXksIHNvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgYEhTUmAuIFRoYXQmIzM5O3MgdGhlIGJhc2VsaW5lLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgbGV0JiMzOTtzIG5haWwgZG93biB3aGVyZSB3ZSYjMzk7cmUgZ29pbmcgdG8gZGlyZWN0IG91ciBmdXp6aW5nIGVmZm9ydHMuIFRoZSBzeXN0ZW0mIzM5O3MgdGVsbGluZyBtZSBhYm91dCB0aGVzZSBtb2RpZmllZCBmdW5jdGlvbnM6IGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZWAsIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZWAsIGFuZCBgaHNyX3htaXRgLiBSaWdodCwgdGhvc2UgYXJlIG91ciB0YXJnZXRzLiBOb3csIGJlZm9yZSBJIGRpdmUgZGVlcCBpbnRvIGNyYWZ0aW5nIHRlc3QgY2FzZXMsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgcG90ZW50aWFsIGZvciB0aGlzLiBBcmUgdGhlc2UgZ2xvYmFsLCBvciBhcmUgdGhleSBzdGF0aWMgd2l0aGluIGEgc3BlY2lmaWMgbW9kdWxlPyBUaGUgc3RhdGljL25vbi1zdGF0aWMgbmF0dXJlIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIGluZmx1ZW5jZSBob3cgSSBhcHByb2FjaCB2dWxuZXJhYmlsaXR5IGRpc2NvdmVyeSBhbmQgZXhwbG9pdCBkZXNpZ24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2hzci9oc3JfZGV2aWNlLmM9NjIxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHNyX3Byb3RvX29wcyBoc3Jfb3BzID0ge1xubmV0L2hzci9oc3JfZGV2aWNlLmMtNjIyLVx0LnNlbmRfc3ZfZnJhbWUgPSBzZW5kX2hzcl9zdXBlcnZpc2lvbl9mcmFtZSxcbm5ldC9oc3IvaHNyX2RldmljZS5jOjYyMzpcdC5jcmVhdGVfdGFnZ2VkX2ZyYW1lID0gaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUsXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy02MjQtXHQuZ2V0X3VudGFnZ2VkX2ZyYW1lID0gaHNyX2dldF91bnRhZ2dlZF9mcmFtZSxcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzMyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzUxLSAqL1xubmV0L2hzci9oc3JfZm9yd2FyZC5jOjM1MjpzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNTMtXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg9MTc9c3RydWN0IHNrX2J1ZmYgKnBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMTgtXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydCk7XG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg6MTk6c3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMjAtXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODg0MgoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIGNvZGUgc25pcHBldHMsIHN1bW1hcml6ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXMgeW91IHJlcXVlc3RlZDoKCioqQXNzZXNzaW5nIEZ1bmN0aW9uIFNjb3BlKioKCkFscmlnaHQsIGxldCBtZSBxdWlja2x5IGFuYWx5emUgdGhlc2UgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiBJdCYjMzk7cyBpbW1lZGlhdGVseSBhcHBhcmVudCB0aGF0IGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZWAgYW5kIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZWAgYXJlIGRlY2xhcmVkIGFzIG5vbi1zdGF0aWMuIFRoaXMgbGlrZWx5IGluZGljYXRlcyB0aGF0IHRoZXkgYXJlIGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LCBwcm9iYWJseSB3aXRoaW4gYSBsYXJnZXIgbW9kdWxlIG9yIHByb2plY3QuIFRoZXkgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxhYmxlIGZyb20gZWxzZXdoZXJlLCBsaWtlbHkgYXMgcGFydCBvZiBzb21lIHB1YmxpYyBBUEkgb3IgaW50ZXJmYWNlLiBIb3dldmVyLCB0aGUgdXNlIGNhc2Ugb2YgYGhzcl94bWl0YCBpcyBzbGlnaHRseSBkaWZmZXJlbnQuIFRoZSBgc3RhdGljYCBrZXl3b3JkIHN1Z2dlc3RzIGl0JiMzOTtzIHNjb3BlZCB0byB0aGUgY3VycmVudCBmaWxlIG9yIHRyYW5zbGF0aW9uIHVuaXQuIFNvLCBgaHNyX3htaXRgIGlzIGNsZWFybHkgYW4gaW50ZXJuYWwgZnVuY3Rpb24sIHByb2JhYmx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbm90IG1lYW50IGZvciBleHRlcm5hbCB1c2UuIEl0JiMzOTtzIGxpa2VseSBpbnZvbHZlZCBpbiBoYW5kbGluZyBzb21lIGRhdGEgdHJhbnNtaXNzaW9uIHByb2Nlc3MsIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMga2VwdCBoaWRkZW4sIHBvdGVudGlhbGx5IHRvIGFsbG93IGZvciBmdXR1cmUgaW50ZXJuYWwgY2hhbmdlcyB3aXRob3V0IGJyZWFraW5nIGV4dGVybmFsIGRlcGVuZGVuY2llcy4gVW5kZXJzdGFuZGluZyB0aGUgc3RhdGljL25vbi1zdGF0aWMgZGlzdGluY3Rpb24gaXMgY3J1Y2lhbCBmb3IgcHJvcGVyIG1vZHVsZSBkZXNpZ24gYW5kIGNvZGUgbWFpbnRhaW5hYmlsaXR5LCBlc3BlY2lhbGx5IGZvciBhbiBleHBlcmllbmNlZCBkZXZlbG9wZXIgbGlrZSBteXNlbGYuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2hzcl94bWl0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvaHNyX2ZvcndhcmQuYz00MzA9c3RhdGljIHZvaWQgaHNyX2RlbGl2ZXJfbWFzdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQ1MC1cbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0NTE6c3RhdGljIGludCBoc3JfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQsXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNDUyLVx0XHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9NTY2PXN0YXRpYyB2b2lkIGhzcl9mb3J3YXJkX2RvKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTYyNy1cdFx0fSBlbHNlIHtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo2Mjg6XHRcdFx0aWYgKCFoc3JfeG1pdChza2IsIHBvcnQsIGZyYW1lKSlcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy02MjktXHRcdFx0XHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9TTEFWRV9BIHx8XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0MTEKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IGNvZGUgc3RydWN0dXJlLCBwcmVzZW50ZWQgYXMgaWYgaXQgd2VyZSBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBIU1IgVHJhbnNtaXNzaW9uIExvZ2ljKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJJiMzOTttIHNlZWluZywgYGhzcl94bWl0YCBpcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCBtZWFucyBpdCYjMzk7cyBpbnRlcm5hbCB0byB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIG5vdCBtZWFudCBmb3IgZXh0ZXJuYWwgdXNlLiBJdCYjMzk7cyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGZ1bmN0aW9uIHdpdGhpbiB0aGUgc2FtZSBmaWxlLCB3aGljaCBpcyBgaHNyX2ZvcndhcmRfZG9gLiBPa2F5LCB0aGF0IGdpdmVzIG1lIGEgY2xlYXIgaWRlYSBvZiBpdHMgcHVycG9zZTogaXQmIzM5O3MgbGlrZWx5IHJlc3BvbnNpYmxlIGZvciB0aGUgYWN0dWFsICp0cmFuc21pc3Npb24qIG9mIGEgSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3MgUmVkdW5kYW5jeSAoSFNSKSBmcmFtZSwgbGlrZWx5IHRoZSBsb3dlci1sZXZlbCBzZW5kaW5nIGZ1bmN0aW9uLgoKTm93LCBgaHNyX2ZvcndhcmRfZG9gIGl0c2VsZiBpcyBhbHNvIHN0YXRpYy4gU28gaXQmIzM5O3Mgc2ltaWxhcjsgYWxzbyBoaWRkZW4gYXdheSBmcm9tIGV4dGVybmFsIGNhbGxzLiBJdCBzZWVtcyBsaWtlIGl0JiMzOTtzIHRoZSBuZXh0IGxldmVsIHVwLCB0aGUgZnVuY3Rpb24gdGhhdCAqZG9lcyogdGhlIEhTUiBmb3J3YXJkaW5nLCBhbmQgSSYjMzk7bSBndWVzc2luZyBzb21lIHNvcnQgb2YgcHJlLXByb2Nlc3NpbmcgYmVmb3JlIGl0IGhhbmRzIGl0IG9mZiB0byB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiBmdW5jdGlvbi4gQW5kIHRoZSBrZXkgaXMgdGhhdCBpdCYjMzk7cyBjYWxsZWQgZnJvbSBgaHNyX2ZvcndhcmRfc2tiYCwgc28gdGhpcyBtZWFucyB0aGF0IGFuIGluY29taW5nIFNLQiBpcyBnb2luZyB0byBnZXQgaGFuZGxlZCBoZXJlLgpPa2F5LCBzbyB0aGUgd29ya2Zsb3cgYXBwZWFycyB0byBiZTogYW4gaW5jb21pbmcgcGFja2V0IChgc2tiYCkgZ29lcyB0byBgaHNyX2ZvcndhcmRfc2tiYCwgd2hpY2ggdGhlbiB0cmlnZ2VycyBgaHNyX2ZvcndhcmRfZG9gLCB3aGljaCBwcmVwcyB0aGUgZnJhbWUsIGFuZCBmaW5hbGx5IGNhbGxzIGBoc3JfeG1pdGAgdG8gc2VuZCBpdCBvdXQuIFRoYXQgc2V0dXAgaW5kaWNhdGVzIGEgZGVsaWJlcmF0ZSBlbmNhcHN1bGF0aW9uIG9mIHRoZSBIU1IgZm9yd2FyZGluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcG90ZW50aWFsIGludGVybmFsIG9wdGltaXphdGlvbnMgb3IgY2hhbmdlcyB0byB0aGUgZm9yd2FyZGluZyBsb2dpYyB3aXRob3V0IGFmZmVjdGluZyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiBJdCYjMzk7cyBhIGNsZWFuIHdheSB0byBtYW5hZ2UgdGhlIHRyYW5zbWlzc2lvbiBwYXRoLgoKU28sIGluIHNob3J0LCBJJiMzOTttIGluZmVycmluZyB0aGlzIGZsb3c6IGBoc3JfZm9yd2FyZF9za2JgIC0mZ3Q7IGBoc3JfZm9yd2FyZF9kb2AgLSZndDsgYGhzcl94bWl0YC4gRWFjaCBwaWVjZSBpcyBuZWF0bHkgdHVja2VkIGF3YXksIGxpa2VseSBmb3IgZ29vZCBjb2RlIHN0cnVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aHNyX2ZvcndhcmRfc2tiJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvaHNyX2RldmljZS5jPTIyND1zdGF0aWMgbmV0ZGV2X3R4X3QgaHNyX2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4tLVxubmV0L2hzci9oc3JfZGV2aWNlLmMtMjM1LVx0XHRzcGluX2xvY2tfYmgoXHUwMDI2aHNyLVx1MDAzZXNlcW5yX2xvY2spO1xubmV0L2hzci9oc3JfZGV2aWNlLmM6MjM2Olx0XHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBtYXN0ZXIpO1xubmV0L2hzci9oc3JfZGV2aWNlLmMtMjM3LVx0XHRzcGluX3VubG9ja19iaChcdTAwMjZoc3ItXHUwMDNlc2VxbnJfbG9jayk7XG4tLVxubmV0L2hzci9oc3JfZGV2aWNlLmM9MjkzPXN0YXRpYyB2b2lkIHNlbmRfaHNyX3N1cGVydmlzaW9uX2ZyYW1lKHN0cnVjdCBoc3JfcG9ydCAqcG9ydCxcbi0tXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy0zNjMtXG5uZXQvaHNyL2hzcl9kZXZpY2UuYzozNjQ6XHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBwb3J0KTtcbm5ldC9oc3IvaHNyX2RldmljZS5jLTM2NS1cdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmhzci1cdTAwM2VzZXFucl9sb2NrKTtcbi0tXG5uZXQvaHNyL2hzcl9kZXZpY2UuYz0zNjk9c3RhdGljIHZvaWQgc2VuZF9wcnBfc3VwZXJ2aXNpb25fZnJhbWUoc3RydWN0IGhzcl9wb3J0ICptYXN0ZXIsXG4tLVxubmV0L2hzci9oc3JfZGV2aWNlLmMtNDA0LVxubmV0L2hzci9oc3JfZGV2aWNlLmM6NDA1Olx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgbWFzdGVyKTtcbm5ldC9oc3IvaHNyX2RldmljZS5jLTQwNi1cdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmhzci1cdTAwM2VzZXFucl9sb2NrKTtcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9NzIzPXN0YXRpYyBpbnQgZmlsbF9mcmFtZV9pbmZvKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4tLVxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTc4MC0vKiBNdXN0IGJlIGNhbGxlZCBob2xkaW5nIHJjdSByZWFkIGxvY2sgKGJlY2F1c2Ugb2YgdGhlIHBvcnQgcGFyYW1ldGVyKSAqL1xubmV0L2hzci9oc3JfZm9yd2FyZC5jOjc4MTp2b2lkIGhzcl9mb3J3YXJkX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQpXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNzgyLXtcbi0tXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMTUtXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg6MTY6dm9pZCBoc3JfZm9yd2FyZF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0KTtcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaC0xNy1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbi0tXG5uZXQvaHNyL2hzcl9zbGF2ZS5jPTI0PXN0YXRpYyByeF9oYW5kbGVyX3Jlc3VsdF90IGhzcl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKVxuLS1cbm5ldC9oc3IvaHNyX3NsYXZlLmMtODAtXHRcdHNwaW5fbG9ja19iaChcdTAwMjZoc3ItXHUwMDNlc2VxbnJfbG9jayk7XG5uZXQvaHNyL2hzcl9zbGF2ZS5jOjgxOlx0XHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBwb3J0KTtcbm5ldC9oc3IvaHNyX3NsYXZlLmMtODItXHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmhzci1cdTAwM2VzZXFucl9sb2NrKTtcbm5ldC9oc3IvaHNyX3NsYXZlLmMtODMtXHR9IGVsc2Uge1xubmV0L2hzci9oc3Jfc2xhdmUuYzo4NDpcdFx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgcG9ydCk7XG5uZXQvaHNyL2hzcl9zbGF2ZS5jLTg1LVx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDcxOAoJCQkJCQkJb3V0cHV0OiAxNwoJCQkJCQkJdGhvdWdodHM6IDY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDoKCioqRm9jdXNpbmcgSW4gb24gdGhlIEhTUiBDb2RlKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgSFNSIGltcGxlbWVudGF0aW9uLiBUaGUgYGhzcl9mb3J3YXJkX3NrYmAgZnVuY3Rpb24gaXMgbm9uLXN0YXRpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFRoYXQgbWVhbnMgaXQmIzM5O3MgbGlrZWx5IGNhbGxlZCBmcm9tIHNvbWV3aGVyZSBvdXRzaWRlIHRoZSBpbW1lZGlhdGUgSFNSIG1vZHVsZSBpdHNlbGYsIG1ha2luZyBpdCBhIGdvb2QganVtcGluZy1vZmYgcG9pbnQgZm9yIGFuYWx5c2lzLiBJdCwgYWxvbmcgd2l0aCBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVgIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVgLCBzZWVtIGxpa2Uga2V5IHN5bWJvbHMgdG8gY29uY2VudHJhdGUgb24uIFRoZXkmIzM5O3JlIHByb2JhYmx5IGNvcmUgdG8gdGhlIHBhY2tldCBwcm9jZXNzaW5nIGFuZCB0YWdnaW5nLiBNeSBuZXh0IHN0ZXAgd2lsbCBiZSB0byBmaWd1cmUgb3V0IGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMgZm9yIEhTUi4gVW5kZXJzdGFuZGluZyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBvciBjb25kaXRpb25hbCBvbiBzb21lIG90aGVyIGZlYXR1cmUgYmVpbmcgZW5hYmxlZC4gVGhpcyBnaXZlcyBtZSBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgSFNSJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9oc3IvS2NvbmZpZy01LVxubmV0L2hzci9LY29uZmlnOjY6Y29uZmlnIEhTUlxubmV0L2hzci9LY29uZmlnLTctXHR0cmlzdGF0ZSBcJiMzNDtIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXHUwMDI2IFBSUClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEwNDQKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqQXNzZXNzaW5nIHRoZSBMYW5kc2NhcGUqKgoKT2theSwgaG9sZCBvbiBhIHNlY29uZC4gQmVmb3JlIEkgZGl2ZSB0b28gZGVlcCwgSSBuZWVkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIGRlcGVuZGVuY2llcyBpbnZvbHZlZCB3aXRoIEhTUi4gSSBjYW4mIzM5O3QganVzdCBqdW1wIGluOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIGNvbXBvbmVudHMsIHN5c3RlbXMsIG9yIGRhdGEgc291cmNlcyBIU1IgcmVsaWVzIG9uLiBXaGF0IGFyZSB0aGUgaW5wdXRzPyBXaGF0IG90aGVyIHN5c3RlbXMgZG9lcyBpdCBpbnRlcmZhY2Ugd2l0aD8gSWRlbnRpZnlpbmcgdGhlc2UgZGVwZW5kZW5jaWVzIGlzIGNydWNpYWwgZm9yIGFueSBtZWFuaW5nZnVsIGFuYWx5c2lzIG9yIHVuZGVyc3RhbmRpbmcuIEl0IHdpbGwgZGljdGF0ZSB0aGUgc2NvcGUgb2YgbXkgaW52ZXN0aWdhdGlvbiBhbmQgaW5mb3JtIHRoZSBkaXJlY3Rpb24gb2YgbXkgcmVzZWFyY2guIFVuZGVyc3RhbmRpbmcgdGhlIGNvbm5lY3Rpb25zIGlzIGZ1bmRhbWVudGFsIHRvIGF2b2lkIG1pc3NpbmcgYW55IHBpZWNlIG9mIHRoZSBwdXp6bGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2hzci9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0I1xuICAgMzpcdCMgSUVDIDYyNDM5LTMgSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3MgUmVkdW5kYW5jeVxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRjb25maWcgSFNSXG4gICA3Olx0XHR0cmlzdGF0ZSBcJiMzNDtIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXHUwMDI2IFBSUClcJiMzNDtcbiAgIDg6XHRcdGhlbHBcbiAgIDk6XHRcdCAgVGhpcyBlbmFibGVzIElFQyA2MjQzOSBkZWZpbmVkIEhpZ2gtYXZhaWxhYmlsaXR5IFNlYW1sZXNzXG4gIDEwOlx0XHQgIFJlZHVuZGFuY3kgKEhTUikgYW5kIFBhcmFsbGVsIFJlZHVuZGFuY3kgUHJvdG9jb2wgKFBSUCkuXG4gIDExOlx0XG4gIDEyOlx0XHQgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHlvdXIgTGludXggYm94IHdpbGwgYmUgYWJsZSB0byBhY3QgYXMgYVxuICAxMzpcdFx0ICBEQU5IIChcJiMzNDtEb3VibHkgYXR0YWNoZWQgbm9kZSBpbXBsZW1lbnRpbmcgSFNSXCYjMzQ7KSBvciBEQU5QIChcJiMzNDtEb3VibHlcbiAgMTQ6XHRcdCAgYXR0YWNoZWQgbm9kZSBpbXBsZW1lbnRpbmcgUFJQXCYjMzQ7KS4gRm9yIHRoaXMgdG8gd29yaywgeW91ciBMaW51eCBib3hcbiAgMTU6XHRcdCAgbmVlZHMgKGF0IGxlYXN0KSB0d28gcGh5c2ljYWwgRXRoZXJuZXQgaW50ZXJmYWNlcy5cbiAgMTY6XHRcbiAgMTc6XHRcdCAgRm9yIERBTkgsIGl0IG11c3QgYmUgY29ubmVjdGVkIGFzIGEgbm9kZSBpbiBhIHJpbmcgbmV0d29yayB0b2dldGhlclxuICAxODpcdFx0ICB3aXRoIG90aGVyIEhTUiBjYXBhYmxlIG5vZGVzLiBBbGwgRXRoZXJuZXQgZnJhbWVzIHNlbnQgb3ZlciB0aGUgSFNSXG4gIDE5Olx0XHQgIGRldmljZSB3aWxsIGJlIHNlbnQgaW4gYm90aCBkaXJlY3Rpb25zIG9uIHRoZSByaW5nIChvdmVyIGJvdGggc2xhdmVcbiAgMjA6XHRcdCAgcG9ydHMpLCBnaXZpbmcgYSByZWR1bmRhbnQsIGluc3RhbnQgZmFpbC1vdmVyIG5ldHdvcmsuIEVhY2ggSFNSIG5vZGVcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDggMDA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE1NjEKCQkJCQkJCW91dHB1dDogMTM1CgkJCQkJCQl0aG91Z2h0czogMzU1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBIU1IgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggZm9yIHRoZSBIU1IgZHJpdmVyLiBUaGUgZmlyc3QgdGhpbmcgSSBub3RlIGlzIHRoYXQgaXQgZG9lc24mIzM5O3Qgc2VlbSB0byBpbnRyb2R1Y2UgYW55IG5ldyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzIGdvb2QuIEkgbmVlZCB0byBiZSBlZmZpY2llbnQgaGVyZS4KClJpZ2h0LCBsZXQmIzM5O3Mgc2VlIHdoYXQgZWxzZSB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoLiBUaGUgYWN0dWFsIGNvZGUgY2hhbmdlIGlzIGluIGBuZXQvaHNyL2hzcl9mb3J3YXJkLmNgLiBJIGFsc28gc2VlIGEgdGVzdCBzY3JpcHQsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hgLCB3aGljaCBzZWVtcyB0byBiZSB1c2luZyBgaXAgbGlua2AgdG8gc2V0IHVwIEhTUiBhbmQgUFJQIGludGVyZmFjZXMuIEludGVyZXN0aW5nLiBUaGUgY29uZmlnIHVzZWQgaW4gdGhlIHRlc3QgaXMganVzdCBgSFNSYCwgd2hpY2ggc2ltcGxpZmllcyB0aGluZ3MgYSBiaXQuCgpJIGhhZCBhIHF1aWNrIGxvb2sgYXQgYE5FVF9GX0hXX0hTUl9UQUdfSU5TYCwgYnV0IGl0IGxvb2tzIGxpa2UganVzdCBhIG5ldGRldiBmZWF0dXJlIGZsYWcgYW5kIGRvZXNuJiMzOTt0IGFwcGVhciB0byBiZSB0aWVkIHRvIGEgc3BlY2lmaWMgY29uZmlnLiBTbywgdGhlIG9ubHkgcmVsZXZhbnQgY29uZmlnIGhlcmUgaXMgaW5kZWVkIGBIU1JgLgoKTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHRoZSByZWFzb25pbmcuIFRoaXMgcGF0Y2ggZml4ZXMgYSBidWcuIFRoZSBkcml2ZXIgY291bGQgY29ycnVwdCBTS0JzIG9yIHRoZWlyIGNsb25lcyBkdXJpbmcgcGVyLWVncmVzcyB3cml0ZXMsIGFuZCB0aGF0JiMzOTtzIG5vdCBnb29kLCBvZiBjb3Vyc2UuIEl0IGludHJvZHVjZXMgYGhzcl9jbG9uZV9wcml2YXRlKClgIHRvIGVuc3VyZSBza2IgZGF0YSBpcyBwcml2YXRlIGJlZm9yZSBtb2RpZmljYXRpb24uIFRoYXQmIzM5O3MgYSBnb29kIGFwcHJvYWNoIHRvIGFkZHJlc3MgdGhlIHNoYXJlZCBkYXRhIGlzc3Vlcy4gVGhlIGNoYW5nZXMgYXJlIHdpdGhpbiB0aGUgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYywgc28gdGhlIGltcGFjdCBpcyBwb3RlbnRpYWxseSBzaWduaWZpY2FudC4gVGhpcyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBjb2RlIGFuZCB3b3J0aCBmdXp6aW5nLgoKSSYjMzk7dmUgdGFrZW4gYSBxdWljayBnbGFuY2UgYXQgdGhlIHN5bWJvbHMgaW4gcXVlc3Rpb246IGBoc3JfZm9yd2FyZF9za2JgLCBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVgLCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lYC4gSnVzdCBtYWtpbmcgc3VyZSwgbGV0JiMzOTtzIHF1aWNrbHkgY2hlY2sgd2hldGhlciBgaHNyX2Nsb25lX3ByaXZhdGVgIGlzIHN0YXRpYyBhbmQgaXQgaXMuIEFuZCB0aGUgb3RoZXIgdHdvIGFyZSBub24tc3RhdGljLgoKT2theSwgSSYjMzk7bSBzYXRpc2ZpZWQuIEkmIzM5O2xsIHVzZSBzZXQtcmVzdWx0cyB0byByZXR1cm4gdGhlIHJlc3VsdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtIU1ImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtoc3JfZm9yd2FyZF9za2ImIzM0OywKICAgICYjMzQ7aHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OywKICAgICYjMzQ7cHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtIU1ImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtoc3JfZm9yd2FyZF9za2ImIzM0OywKICAgICYjMzQ7aHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OywKICAgICYjMzQ7cHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMWM4NjBiNDQ1NDZkNDQyOTZlZDkxYmNjNWQ4Nzc5NTg5ZDVlMGM4MApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgQXVnIDggMDA6NTE6NTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvaHNyL2hzcl9mb3J3YXJkLmMgYi9uZXQvaHNyL2hzcl9mb3J3YXJkLmMKaW5kZXggMDc3NDk4MWE2NWMxNi4uZWZjYmYzY2YyNmY5YiAxMDA2NDQKLS0tIGEvbmV0L2hzci9oc3JfZm9yd2FyZC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuYwpAQCAtMzI1LDggJiM0MzszMjUsMjkgQEAgc3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfZmlsbF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAlyZXR1cm4gc2tiOwogfQogCi0vKiBJZiB0aGUgb3JpZ2luYWwgZnJhbWUgd2FzIGFuIEhTUiB0YWdnZWQgZnJhbWUsIGp1c3QgY2xvbmUgaXQgdG8gYmUgc2VudAotICogdW5jaGFuZ2VkLiBPdGhlcndpc2UsIGNyZWF0ZSBhIHByaXZhdGUgZnJhbWUgZXNwZWNpYWxseSB0YWdnZWQgZm9yICYjMzk7cG9ydCYjMzk7LgomIzQzOy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUmIzM5O3MgZGF0YSBwcml2YXRlLCBzbyB0aGF0IHBlci1lZ3Jlc3MKJiM0MzsgKiB3cml0ZXMgY2Fubm90IGNvcnJ1cHQgdGhlIG9yaWdpbmFsIHNrYiBvciBvdGhlciBjbG9uZXMgb2YgaXQuCiYjNDM7ICogUmV0dXJucyBOVUxMIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7CiYjNDM7CiYjNDM7CWNsb25lID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiYjNDM7CWlmICghY2xvbmUpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKHNrYl9jb3coY2xvbmUsIDApKSB7CiYjNDM7CQlrZnJlZV9za2IoY2xvbmUpOwomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIGNsb25lOwomIzQzO30KJiM0MzsKJiM0MzsvKiBJZiB0aGUgb3JpZ2luYWwgZnJhbWUgd2FzIGFuIEhTUiB0YWdnZWQgZnJhbWUsIHJldHVybiBhIHByaXZhdGUgY2xvbmUKJiM0MzsgKiBvZiBpdCB3aXRoIHRoZSBwYXRoIGlkIHVwZGF0ZWQgZm9yICYjMzk7cG9ydCYjMzk7LiBPdGhlcndpc2UsIHJldHVybiBhIHByaXZhdGUKJiM0MzsgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5CiYjNDM7ICogdGFnZ2VkIGZvciAmIzM5O3BvcnQmIzM5Oy4KICAqLwogc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsCiAJCQkJCXN0cnVjdCBoc3JfcG9ydCAqcG9ydCkKQEAgLTMzNiwxNCAmIzQzOzM1NywxOCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSwKIAlpbnQgbW92ZWxlbjsKIAogCWlmIChmcmFtZS0mZ3Q7c2tiX2hzcikgewotCQlzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkciA9Ci0JCQkoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihmcmFtZS0mZ3Q7c2tiX2hzcik7CiYjNDM7CQlzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjsKJiM0MzsKJiM0MzsJCXNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2JfaHNyKTsKJiM0MzsJCWlmICghc2tiKQomIzQzOwkJCXJldHVybiBOVUxMOwogCiAJCS8qIHNldCB0aGUgbGFuZSBpZCBwcm9wZXJseSAqLwomIzQzOwkJaHNyX2V0aGhkciA9IChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiAJCWhzcl9zZXRfcGF0aF9pZChmcmFtZSwgaHNyX2V0aGhkciwgcG9ydCk7Ci0JCXJldHVybiBza2JfY2xvbmUoZnJhbWUtJmd0O3NrYl9oc3IsIEdGUF9BVE9NSUMpOwomIzQzOwkJcmV0dXJuIHNrYjsKIAl9IGVsc2UgaWYgKHBvcnQtJmd0O2Rldi0mZ3Q7ZmVhdHVyZXMgJmFtcDsgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykgewotCQlyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLSZndDtza2Jfc3RkLCBHRlBfQVRPTUlDKTsKJiM0MzsJCXJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS0mZ3Q7c2tiX3N0ZCk7CiAJfQogCiAJLyogQ3JlYXRlIHRoZSBuZXcgc2tiIHdpdGggZW5vdWdoIGhlYWRyb29tIHRvIGZpdCB0aGUgSFNSIHRhZyAqLwpAQCAtMzc3LDE3ICYjNDM7NDAyLDIzIEBAIHN0cnVjdCBza19idWZmICpwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlpZiAoZnJhbWUtJmd0O3NrYl9wcnApIHsKLQkJc3RydWN0IHBycF9yY3QgKnRyYWlsZXIgPSBza2JfZ2V0X1BSUF9yY3QoZnJhbWUtJmd0O3NrYl9wcnApOwomIzQzOwkJc3RydWN0IHBycF9yY3QgKnRyYWlsZXI7CiYjNDM7CiYjNDM7CQlza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS0mZ3Q7c2tiX3BycCk7CiYjNDM7CQlpZiAoIXNrYikKJiM0MzsJCQlyZXR1cm4gTlVMTDsKIAomIzQzOwkJdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChza2IpOwogCQlpZiAodHJhaWxlcikgewogCQkJcHJwX3NldF9sYW5faWQodHJhaWxlciwgcG9ydCk7CiAJCX0gZWxzZSB7CiAJCQlXQVJOX09OQ0UoIXRyYWlsZXIsICYjMzQ7ZXJyb3JlZCBQUlAgc2tiJiMzNDspOwomIzQzOwkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJcmV0dXJuIHNrYl9jbG9uZShmcmFtZS0mZ3Q7c2tiX3BycCwgR0ZQX0FUT01JQyk7CiYjNDM7CQlyZXR1cm4gc2tiOwogCX0gZWxzZSBpZiAocG9ydC0mZ3Q7ZGV2LSZndDtmZWF0dXJlcyAmYW1wOyBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7Ci0JCXJldHVybiBza2JfY2xvbmUoZnJhbWUtJmd0O3NrYl9zdGQsIEdGUF9BVE9NSUMpOwomIzQzOwkJcmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLSZndDtza2Jfc3RkKTsKIAl9CiAKIAlza2IgPSBza2JfY29weV9leHBhbmQoZnJhbWUtJmd0O3NrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS0mZ3Q7c2tiX3N0ZCksCkBAIC00MjAsNiAmIzQzOzQ1MSwyMiBAQCBzdGF0aWMgdm9pZCBoc3JfZGVsaXZlcl9tYXN0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LAogCQkgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSkKIHsKJiM0MzsJLyogQW4gaW50ZXJsaW5rLWJvdW5kIHNrYiBmcm9tIGdldF91bnRhZ2dlZF9mcmFtZSgpIGNhbiBzdGlsbCBhbGlhcwomIzQzOwkgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lCiYjNDM7CSAqIHNoYXJlcyB0aGUgb3JpZ2luYWwgVFggc2tiICh3aGljaCB0YXBzIG9yIHRoZSBUWCBwYXRoIG1heSBzdGlsbAomIzQzOwkgKiBob2xkKTsgZm9yIHJpbmcgZnJhbWVzIHRoZSBtYXN0ZXIgYWxzbyBjb25zdW1lcyB0aGVtIHdoZW4gdGhleQomIzQzOwkgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuCiYjNDM7CSAqIFByaXZhdGl6ZSBiZWZvcmUgYW55IGFkZHJlc3MgbXV0YXRpb24uCiYjNDM7CSAqLwomIzQzOwlpZiAocG9ydC0mZ3Q7dHlwZSA9PSBIU1JfUFRfSU5URVJMSU5LICZhbXA7JmFtcDsKJiM0MzsJICAgIChmcmFtZS0mZ3Q7cG9ydF9yY3YtJmd0O3R5cGUgPT0gSFNSX1BUX01BU1RFUiB8fAomIzQzOwkgICAgIChmcmFtZS0mZ3Q7aXNfbG9jYWxfZGVzdCAmYW1wOyZhbXA7ICFmcmFtZS0mZ3Q7aXNfbG9jYWxfZXhjbHVzaXZlKSkgJmFtcDsmYW1wOwomIzQzOwkgICAgc2tiX2Nvdyhza2IsIDApKSB7CiYjNDM7CQlmcmFtZS0mZ3Q7cG9ydF9yY3YtJmd0O2Rldi0mZ3Q7c3RhdHMucnhfZHJvcHBlZCYjNDM7JiM0Mzs7CiYjNDM7CQlrZnJlZV9za2Ioc2tiKTsKJiM0MzsJCXJldHVybiBORVRfWE1JVF9EUk9QOwomIzQzOwl9CiYjNDM7CiAJaWYgKGZyYW1lLSZndDtwb3J0X3Jjdi0mZ3Q7dHlwZSA9PSBIU1JfUFRfTUFTVEVSKSB7CiAJCWhzcl9hZGRyX3N1YnN0X2Rlc3QoZnJhbWUtJmd0O25vZGVfc3JjLCBza2IsIHBvcnQpOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZQppbmRleCAzMWZiOTMyNmNmNTMzLi44N2ZlMzQ5NTFiOGIwIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGUKQEAgLTUsNiAmIzQzOzUsNyBAQCB0b3Bfc3JjZGlyID0gLi4vLi4vLi4vLi4vLi4KIFRFU1RfUFJPR1MgOj0gXAogCWhzcl9waW5nLnNoIFwKIAloc3JfcmVkYm94LnNoIFwKJiM0MzsJaHNyX3NoYXJlZF9tdXRhdGlvbi5zaCBcCiAJbGlua19mYXVsdHMuc2ggXAogCXBycF9waW5nLnNoIFwKICMgZW5kIG9mIFRFU1RfUFJPR1MKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvaHNyX3NoYXJlZF9tdXRhdGlvbi5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvaHNyX3NoYXJlZF9tdXRhdGlvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoCkBAIC0wLDAgJiM0MzsxLDI0MiBAQAomIzQzOyMhL2Jpbi9iYXNoCiYjNDM7IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyMKJiM0MzsjIFZlcmlmeSB0aGF0IHBlci1lZ3Jlc3MgbXV0YXRpb25zIG9mIHNoYXJlZCBza2IgZGF0YSBhcmUgcHJpdmF0ZToKJiM0MzsjCiYjNDM7IyBGMiAocGF0aC9MQU4gSUQpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgdGhlIHNlY29uZCBzbGF2ZSYjMzk7cyBMQU4tSUQgd3JpdGUKJiM0MzsjIGxhbmRzIGluIHRoZSBmaXJzdCBzbGF2ZSYjMzk7cyBzdGlsbC1xdWV1ZWQgY2xvbmU7IHdpdGggYSBuZXRlbSBkZWxheSBvbgomIzQzOyMgc2xhdmUgQSwgaW5qZWN0ZWQgZnJhbWVzIGxlYXZlIEEgY2FycnlpbmcgQiYjMzk7cyBMQU4gSUQuCiYjNDM7IwomIzQzOyMgRjEgKFJlZEJveCBzb3VyY2UgTUFDKTogb24gYW4gYWZmZWN0ZWQga2VybmVsIGFuIEhTUi10YWdnZWQgbXVsdGljYXN0CiYjNDM7IyBmcmFtZSByZWNlaXZlZCBvbiBhIFJlZEJveCBzbGF2ZSBpcyBjbG9uZWQgZm9yIG1hc3RlciBhbmQgaW50ZXJsaW5rLAomIzQzOyMgYW5kIHRoZSBpbnRlcmxpbmsmIzM5O3MgUmVkQm94LU1BQyByZXdyaXRlIGxhbmRzIGluIHRoZSBtYXN0ZXIgY2xvbmUmIzM5O3MKJiM0MzsjIGJ1ZmZlciwgc28gdGhlIGxvY2FsIHN0YWNrIHJlY2VpdmVzIHRoZSBSZWRCb3ggTUFDIGluc3RlYWQgb2YgdGhlCiYjNDM7IyBvcmlnaW5hdGluZyBub2RlJiMzOTtzIE1BQy4KJiM0MzsKJiM0MztpcHY2PWZhbHNlCiYjNDM7CiYjNDM7c291cmNlIC4vaHNyX2NvbW1vbi5zaAomIzQzOwomIzQzO0RVUj01CiYjNDM7CiYjNDM7cmVxdWlyZSgpCiYjNDM7ewomIzQzOwljb21tYW5kIC12ICYjMzQ7JDEmIzM0OyAmZ3Q7L2Rldi9udWxsIDImZ3Q7JmFtcDsxICZhbXA7JmFtcDsgcmV0dXJuIDAKJiM0MzsJZWNobyAmIzM0O1NLSVA6ICQxIG5vdCBhdmFpbGFibGUmIzM0OwomIzQzOwlleGl0ICRrc2Z0X3NraXAKJiM0Mzt9CiYjNDM7CiYjNDM7cmVxdWlyZSBpcAomIzQzO3JlcXVpcmUgdGMKJiM0MztyZXF1aXJlIHB5dGhvbjMKJiM0MzsKJiM0Mzt0cmFwIGNsZWFudXBfYWxsX25zIEVYSVQKJiM0MzsKJiM0MzsjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb24KJiM0MzsjIFBSUCBEQU5QIChwcm90byAxKSwgQUZfUEFDS0VUIHByZS10YWdnZWQgaW5qZWN0aW9uLCBuZXRlbSBvbiBzbGF2ZSBBLgomIzQzO3J1bl9mMigpCiYjNDM7ewomIzQzOwlzZXR1cF9ucyBucyAyJmd0Oy9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcAomIzQzOwluc3goKSB7IGlwIG5ldG5zIGV4ZWMgJiMzNDskbnMmIzM0OyAmIzM0OyRAJiMzNDs7IH0KJiM0MzsKJiM0MzsJIyBQcm9iZSBzY2hfbmV0ZW0gaW5zaWRlIHRoZSBkaXNwb3NhYmxlIG5hbWVzcGFjZSBvbmx5LgomIzQzOwlpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDImZ3Q7L2Rldi9udWxsOyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7U0tJUDogc2NoX25ldGVtIG5vdCBhdmFpbGFibGUmIzM0OwomIzQzOwkJcmV0dXJuICRrc2Z0X3NraXAKJiM0MzsJZmkKJiM0MzsJbnN4IHRjIHFkaXNjIGRlbCBkZXYgbG8gcm9vdCAyJmd0Oy9kZXYvbnVsbAomIzQzOwomIzQzOwkjIENhcGFiaWxpdHkgcHJvYmVzIGVuZCBoZXJlOyBzZXR1cCBvciBydW50aW1lIGZhaWx1cmUgYmVsb3cgaXMgRkFJTC4KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEEmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEImIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG8KJiM0MzsJCW5zeCBpcCBsaW5rIHNldCAmIzM0OyRpJiMzNDsgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogJGkgdXAmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZG9uZQomIzQzOwlpZiAhIG5zeCBpcCBsaW5rIGFkZCBuYW1lIHBycDAgdHlwZSBoc3Igc2xhdmUxIHZBIHNsYXZlMiB2QiBcCiYjNDM7CQlzdXBlcnZpc2lvbiA0NSBwcm90byAxIDImZ3Q7L2Rldi9udWxsOyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7U0tJUDogSFNSL1BSUCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsJiMzNDsKJiM0MzsJCXJldHVybiAka3NmdF9za2lwCiYjNDM7CWZpCiYjNDM7CW5zeCBpcCBsaW5rIHNldCBwcnAwIHVwIHx8IHsgZWNobyAmIzM0O0ZBSUw6IHBycDAgdXAmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IHRjIHFkaXNjIGFkZCBkZXYgdkEgcm9vdCBuZXRlbSBkZWxheSAyMDBtcyB8fAomIzQzOwkJeyBlY2hvICYjMzQ7RkFJTDogbmV0ZW0mIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsKJiM0MzsJbnN4IHB5dGhvbjMgL2Rldi9zdGRpbiAmIzM0OyREVVImIzM0OyAmbHQ7Jmx0OyYjMzk7UFlGMiYjMzk7CiYjNDM7aW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZQomIzQzOwomIzQzO2R1ciA9IGludChzeXMuYXJndlsxXSkKJiM0MztkZWYgbGFuaWQocGt0KToKJiM0MzsgICAgaWYgbGVuKHBrdCkgJmx0OyAyMCBvciBwa3RbLTI6XSAhPSBiJiMzNDtceDg4XHhmYiYjMzQ7OgomIzQzOyAgICAgICAgcmV0dXJuIE5vbmUKJiM0MzsgICAgcmV0dXJuIChwa3RbLTRdICZndDsmZ3Q7IDQpICZhbXA7IDB4RgomIzQzOwomIzQzO1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbigmIzM0Oy9zeXMvY2xhc3MvbmV0L3BycDAvYWRkcmVzcyYjMzQ7KS5yZWFkKCkucmVwbGFjZSgmIzM0OzomIzM0OywgJiMzNDsmIzM0OykpCiYjNDM7RFNUID0gYnl0ZXMuZnJvbWhleCgmIzM0OzAyYWFiYmNjZGQwMSYjMzQ7KQomIzQzO1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSkKJiM0MztyY3QwID0gc3RydWN0LnBhY2soJiMzNDsmZ3Q7SCYjMzQ7LCAwKSAmIzQzOyBzdHJ1Y3QucGFjaygmIzM0OyZndDtIJiMzNDssIDUyICZhbXA7IDB4MEZGRikgJiM0MzsgYiYjMzQ7XHg4OFx4ZmImIzM0OwomIzQzO2ZyYW1lID0gRFNUICYjNDM7IFNSQyAmIzQzOyBiJiMzNDtceDA4XHgwMCYjMzQ7ICYjNDM7IFBBWSAmIzQzOyByY3QwCiYjNDM7CiYjNDM7dHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKCYjMzQ7cHJwMCYjMzQ7LCAwKSkKJiM0MztzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLAomIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpCiYjNDM7c0EuYmluZCgoJiMzNDt2QXAmIzM0OywgMCkpCiYjNDM7c0IgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVywKJiM0MzsgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKQomIzQzO3NCLmJpbmQoKCYjMzQ7dkJwJiMzNDssIDApKQomIzQzO3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpCiYjNDM7CiYjNDM7YSwgYiA9IFtdLCBbXQomIzQzOwomIzQzO2RlZiBtYXRjaChwa3QpOgomIzQzOyAgICByZXR1cm4gKHBrdFs6Nl0gPT0gRFNUIGFuZCBwa3RbNjoxMl0gPT0gU1JDCiYjNDM7ICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYiYjMzQ7XHgwOFx4MDAmIzM0OyBhbmQgcGt0WzE0OjE0ICYjNDM7IGxlbihQQVkpXSA9PSBQQVkpCiYjNDM7CiYjNDM7ZGVmIGRyYWluKHRpbWVvdXQpOgomIzQzOyAgICB3YWl0ID0gdGltZW91dAomIzQzOyAgICB3aGlsZSBUcnVlOgomIzQzOyAgICAgICAgciwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3NBLCBzQl0sIFtdLCBbXSwgd2FpdCkKJiM0MzsgICAgICAgIGlmIG5vdCByOgomIzQzOyAgICAgICAgICAgIHJldHVybgomIzQzOyAgICAgICAgZm9yIHMgaW4gcjoKJiM0MzsgICAgICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpCiYjNDM7ICAgICAgICAgICAgaWYgbm90IG1hdGNoKHBrdCk6CiYjNDM7ICAgICAgICAgICAgICAgIGNvbnRpbnVlCiYjNDM7ICAgICAgICAgICAgbGlkID0gbGFuaWQocGt0KQomIzQzOyAgICAgICAgICAgIGlmIGxpZCBpcyBub3QgTm9uZToKJiM0MzsgICAgICAgICAgICAgICAgKGEgaWYgcyBpcyBzQSBlbHNlIGIpLmFwcGVuZChsaWQpCiYjNDM7ICAgICAgICB3YWl0ID0gMAomIzQzOwomIzQzOyMgRHJhaW4gd2hpbGUgc2VuZGluZyBzbyB0aGUgYnVyc3QgY2Fubm90IG92ZXJmbG93IHRoZSBjYXB0dXJlIHNvY2tldHMmIzM5OwomIzQzOyMgcmVjZWl2ZSBidWZmZXJzOyB0aGUgbmV0ZW0tZGVsYXllZCBBLXNpZGUgZnJhbWVzIGFycml2ZSBhZnRlcndhcmRzIGFuZAomIzQzOyMgYXJlIGNvbGxlY3RlZCBiZWxvdy4KJiM0Mztmb3IgXyBpbiByYW5nZSgyMDApOgomIzQzOyAgICB0eC5zZW5kKGZyYW1lKQomIzQzOyAgICBkcmFpbigwKQomIzQzOyAgICB0aW1lLnNsZWVwKDAuMDAxKQomIzQzOwomIzQzO2VuZCA9IHRpbWUudGltZSgpICYjNDM7IGR1cgomIzQzO3doaWxlIHRpbWUudGltZSgpICZsdDsgZW5kOgomIzQzOyAgICBkcmFpbigwLjMpCiYjNDM7CiYjNDM7cHJpbnQoJiMzNDtBLXNpZGUgY291bnQ9JWQgbGFuIGlkcz0lcyYjMzQ7ICUgKGxlbihhKSwgc29ydGVkKHNldChhKSkpKQomIzQzO3ByaW50KCYjMzQ7Qi1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXMmIzM0OyAlIChsZW4oYiksIHNvcnRlZChzZXQoYikpKSkKJiM0MztpZiBsZW4oYSkgJmx0OyAxNTAgb3IgbGVuKGIpICZsdDsgMTUwOgomIzQzOyAgICBwcmludCgmIzM0O0ZBSUw6IHRvbyBmZXcgaW5qZWN0ZWQgZnJhbWVzIGNhcHR1cmVkIChBPSVkIEI9JWQsIHNlbnQgMjAwKSYjMzQ7CiYjNDM7ICAgICAgICAgICUgKGxlbihhKSwgbGVuKGIpKSkKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztiYWRfYSA9IFt4IGZvciB4IGluIGEgaWYgKHggJmFtcDsgMSkgIT0gMF0KJiM0MztiYWRfYiA9IFt4IGZvciB4IGluIGIgaWYgKHggJmFtcDsgMSkgIT0gMV0KJiM0MztpZiBiYWRfYSBvciBiYWRfYjoKJiM0MzsgICAgcHJpbnQoJiMzNDtGQUlMOiBzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbiAtIEE6ICVkLyVkIHdyb25nLWxhbiwmIzM0OwomIzQzOyAgICAgICAgICAmIzM0OyBCOiAlZC8lZCB3cm9uZy1sYW4mIzM0OwomIzQzOyAgICAgICAgICAlIChsZW4oYmFkX2EpLCBsZW4oYSksIGxlbihiYWRfYiksIGxlbihiKSkpCiYjNDM7ICAgIHN5cy5leGl0KDEpCiYjNDM7cHJpbnQoJiMzNDtQQVNTOiBwZXItZWdyZXNzIExBTiBJRHMgaXNvbGF0ZWQgKEEgYWxsIGJpdDA9MCwgQiBhbGwgYml0MD0xKSYjMzQ7KQomIzQzO3N5cy5leGl0KDApCiYjNDM7UFlGMgomIzQzO30KJiM0MzsKJiM0MzsjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGMTogUmVkQm94IHNvdXJjZS1NQUMgcHJpdmFjeQomIzQzOyMgSFNSIFJlZEJveCAocHJvdG8gMCksIHRhZ2dlZCBtdWx0aWNhc3QgZnJvbSBhIHNsYXZlOiBtYXN0ZXIgbXVzdCBrZWVwCiYjNDM7IyB0aGUgbm9kZSBNQUMsIGludGVybGluayBtdXN0IGNhcnJ5IHRoZSBSZWRCb3ggTUFDLgomIzQzO3J1bl9mMSgpCiYjNDM7ewomIzQzOwlzZXR1cF9ucyBucyAyJmd0Oy9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcAomIzQzOwluc3goKSB7IGlwIG5ldG5zIGV4ZWMgJiMzNDskbnMmIzM0OyAmIzM0OyRAJiMzNDs7IH0KJiM0MzsKJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEEmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEImIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJbnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8CiYjNDM7CQl7IGVjaG8gJiMzNDtGQUlMOiB2ZXRoIEkmIzM0OzsgcmV0dXJuIDE7IH0KJiM0MzsJZm9yIGkgaW4gdkEgdkIgdkkgdkFwIHZCcCB2SXA7IGRvCiYjNDM7CQluc3ggaXAgbGluayBzZXQgJiMzNDskaSYjMzQ7IHVwIHx8IHsgZWNobyAmIzM0O0ZBSUw6ICRpIHVwJiMzNDs7IHJldHVybiAxOyB9CiYjNDM7CWRvbmUKJiM0MzsJaWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBoc3IwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXAomIzQzOwkJaW50ZXJsaW5rIHZJIHN1cGVydmlzaW9uIDQ1IHByb3RvIDAgMiZndDsvZGV2L251bGw7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtTS0lQOiBIU1IgUmVkQm94IG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWwmIzM0OwomIzQzOwkJcmV0dXJuICRrc2Z0X3NraXAKJiM0MzsJZmkKJiM0MzsJbnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvICYjMzQ7RkFJTDogaHNyMCB1cCYjMzQ7OyByZXR1cm4gMTsgfQomIzQzOwomIzQzOwluc3ggcHl0aG9uMyAvZGV2L3N0ZGluICZsdDsmbHQ7JiMzOTtQWUYxJiMzOTsKJiM0MztpbXBvcnQgc29ja2V0LCBzZWxlY3QsIHN5cywgdGltZQomIzQzOwomIzQzO05PREUgID0gYnl0ZXMuZnJvbWhleCgmIzM0OzAyMTEyMjMzNDQ1NSYjMzQ7KQomIzQzO01DQVNUID0gYnl0ZXMuZnJvbWhleCgmIzM0OzAxMDA1ZTAwMDAwMSYjMzQ7KQomIzQzO1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKCYjMzQ7L3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzcyYjMzQ7KS5yZWFkKCkucmVwbGFjZSgmIzM0OzomIzM0OywgJiMzNDsmIzM0OykpCiYjNDM7UEFZICAgPSBieXRlcyhyYW5nZSg0NikpCiYjNDM7CiYjNDM7ZGVmIGZyYW1lKHNlcSk6CiYjNDM7ICAgICMgTFNEVSBzaXplID0gcGF5bG9hZCAmIzQzOyBIU1IgdGFnIChIU1JfSExFTiksIGFzIGhzcl9maWxsX3RhZygpIGNvbXB1dGVzIGl0CiYjNDM7ICAgIHRhZyA9ICgoKDEgJmx0OyZsdDsgMTIpIHwgKGxlbihQQVkpICYjNDM7IDYpKS50b19ieXRlcygyLCAmIzM0O2JpZyYjMzQ7KQomIzQzOyAgICAgICAgICAgJiM0Mzsgc2VxLnRvX2J5dGVzKDIsICYjMzQ7YmlnJiMzNDspICYjNDM7IGImIzM0O1x4MDhceDAwJiMzNDspCiYjNDM7ICAgIHJldHVybiBNQ0FTVCAmIzQzOyBOT0RFICYjNDM7IGImIzM0O1x4ODlceDJmJiMzNDsgJiM0MzsgdGFnICYjNDM7IFBBWQomIzQzOwomIzQzO3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKCgmIzM0O3ZBcCYjMzQ7LCAwKSkKJiM0MztzbSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLAomIzQzOyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpCiYjNDM7c20uYmluZCgoJiMzNDtoc3IwJiMzNDssIDApKQomIzQzO3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsCiYjNDM7ICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSkKJiM0MztzaS5iaW5kKCgmIzM0O3ZJcCYjMzQ7LCAwKSkKJiM0MztzbS5zZXRibG9ja2luZyhGYWxzZSk7IHNpLnNldGJsb2NraW5nKEZhbHNlKQomIzQzOwomIzQzO2ZvciBpIGluIHJhbmdlKDMpOgomIzQzOyAgICB0eC5zZW5kKGZyYW1lKGkgJiM0MzsgMSkpOyB0aW1lLnNsZWVwKDAuMDUpCiYjNDM7CiYjNDM7bV9zcmMgPSBpX3NyYyA9IE5vbmUKJiM0MztlbmQgPSB0aW1lLnRpbWUoKSAmIzQzOyA0CiYjNDM7d2hpbGUgdGltZS50aW1lKCkgJmx0OyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOgomIzQzOyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpCiYjNDM7ICAgIGZvciBzIGluIHI6CiYjNDM7ICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpCiYjNDM7ICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7CiYjNDM7ICAgICAgICAjIGhfc291cmNlIGlzIHRoZSBhc3NlcnRlZCB2YWx1ZSBhbmQgbXVzdCBOT1QgYmUgZmlsdGVyZWQgb24KJiM0MzsgICAgICAgIGlmIChsZW4ocGt0KSAmbHQ7IDYwIG9yIHBrdFs6Nl0gIT0gTUNBU1Qgb3IgcGt0WzEyOjE0XSAhPSBiJiMzNDtceDA4XHgwMCYjMzQ7CiYjNDM7ICAgICAgICAgICAgICAgIG9yIHBrdFsxNDoxNCAmIzQzOyBsZW4oUEFZKV0gIT0gUEFZKToKJiM0MzsgICAgICAgICAgICBjb250aW51ZQomIzQzOyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZToKJiM0MzsgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXQomIzQzOyAgICAgICAgZWxpZiBzIGlzIHNpIGFuZCBpX3NyYyBpcyBOb25lOgomIzQzOyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdCiYjNDM7CiYjNDM7cHJpbnQoJiMzNDttYXN0ZXIgaF9zb3VyY2UgICAgPSYjMzQ7LCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpCiYjNDM7cHJpbnQoJiMzNDtub2RlIE1BQyAgICAgICAgICAgPSYjMzQ7LCBOT0RFLmhleCgpKQomIzQzO3ByaW50KCYjMzQ7aW50ZXJsaW5rIGhfc291cmNlID0mIzM0OywgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKQomIzQzO3ByaW50KCYjMzQ7cmVkYm94IE1BQyAgICAgICAgID0mIzM0OywgUkIuaGV4KCkpCiYjNDM7aWYgaV9zcmMgIT0gUkI6CiYjNDM7ICAgIHByaW50KCYjMzQ7RkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUMmIzM0OykKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztpZiBtX3NyYyAhPSBOT0RFOgomIzQzOyAgICBwcmludCgmIzM0O0ZBSUw6IG1hc3RlciByZWNlaXZlZCAlcyBpbnN0ZWFkIG9mIHRoZSBub2RlIE1BQyAmIzM0OwomIzQzOyAgICAgICAgICAmIzM0OyhzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbikmIzM0OwomIzQzOyAgICAgICAgICAlIChtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlICYjMzQ7bm90aGluZyYjMzQ7KSkKJiM0MzsgICAgc3lzLmV4aXQoMSkKJiM0MztwcmludCgmIzM0O1BBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDJiMzNDspCiYjNDM7c3lzLmV4aXQoMCkKJiM0MztQWUYxCiYjNDM7fQomIzQzOwomIzQzO3JjPTAKJiM0MzsKJiM0MztydW5fZjIKJiM0MztyZXQ9JD8KJiM0MztyYz0kKGtzZnRfc3RhdHVzX21lcmdlICYjMzQ7JHJjJiMzNDsgJiMzNDskcmV0JiMzNDspCiYjNDM7CiYjNDM7cnVuX2YxCiYjNDM7cmV0PSQ/CiYjNDM7cmM9JChrc2Z0X3N0YXR1c19tZXJnZSAmIzM0OyRyYyYjMzQ7ICYjMzQ7JHJldCYjMzQ7KQomIzQzOwomIzQzO2lmIFsgJiMzNDskcmMmIzM0OyAtZXEgMCBdOyB0aGVuCiYjNDM7CWVjaG8gJiMzNDtoc3Jfc2hhcmVkX211dGF0aW9uOiBwZXItZWdyZXNzIG11dGF0aW9uIGlzb2xhdGlvbiAoRjEmIzQzO0YyKSBbIE9LIF0mIzM0OwomIzQzO2VsaWYgWyAmIzM0OyRyYyYjMzQ7IC1lcSAmIzM0OyRrc2Z0X3NraXAmIzM0OyBdOyB0aGVuCiYjNDM7CWVjaG8gJiMzNDtoc3Jfc2hhcmVkX211dGF0aW9uOiBzdWJ0ZXN0cyBza2lwcGVkIChjYXBhYmlsaXRpZXMgbWlzc2luZykmIzM0OwomIzQzO2Vsc2UKJiM0MzsJZWNobyAmIzM0O2hzcl9zaGFyZWRfbXV0YXRpb246IHBlci1lZ3Jlc3MgbXV0YXRpb24gaXNvbGF0aW9uIFsgRkFJTCBdJiMzNDsgXAomIzQzOwkJJiMzNDtyYz0kcmMmIzM0OyAxJmd0OyZhbXA7MgomIzQzO2ZpCiYjNDM7ZXhpdCAmIzM0OyRyYyYjMzQ7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wOCAwMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODAwCgkJCQkJCQlvdXRwdXQ6IDE2MgoJCQkJCQkJdGhvdWdodHM6IDEwMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBIU1IgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5KioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gbG9va2luZyBvdmVyIHRoaXMgcGF0Y2ggdGhhdCBtb2RpZmllcyBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQmIzM5O3MgZGVzaWduZWQgdG8gZml4IGRhdGEgY29ycnVwdGlvbiBzdGVtbWluZyBmcm9tIHNoYXJlZCBgc2tiYCBkYXRhIGluIHRoZSBIU1IgbW9kdWxlLCBzcGVjaWZpY2FsbHkgd2hlbiBoYW5kbGluZyBtdWx0aXBsZSBlZ3Jlc3MgcGF0aHMuIFRoZSBjb3JlIG9mIHRoZSBmaXggcmV2b2x2ZXMgYXJvdW5kIHByaXZhdGl6aW5nIHRoZSBgc2tiYCBkYXRhIGJlZm9yZSBtb2RpZmljYXRpb24gdG8gYXZvaWQgY3Jvc3MtdGFsayBiZXR3ZWVuIGRpZmZlcmVudCBjbG9uZXMsIHdoaWNoIG1ha2VzIHNlbnNlLgoKVGhlIHByaW1hcnkgY2hhbmdlcyBpbnZvbHZlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYGhzcl9jbG9uZV9wcml2YXRlKClgLCB3aGljaCBjb21iaW5lcyBgc2tiX2Nsb25lKClgIGFuZCBgc2tiX2NvdygpYC4gVGhpcyBuZXcgZnVuY3Rpb24gcmVwbGFjZXMgdGhlIHJhdyBgc2tiX2Nsb25lKClgIGNhbGxzIGluIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgLiBBZGRpdGlvbmFsbHksIGEgY2hlY2sgaGFzIGJlZW4gYWRkZWQgaW4gYGhzcl94bWl0KClgIHRvIHVzZSBgc2tiX2NvdygpYCBmb3IgaW50ZXJsaW5rLWJvdW5kIFNLQnMuCgpNeSBwcmltYXJ5IGNvbmNlcm4sIGdpdmVuIHRoZSBjb250ZXh0LCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBleHBvc2VzIG9yIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBFc3NlbnRpYWxseSwgd2UmIzM5O3JlIHRyeWluZyB0byBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbi4gVGhlIHNoYXJlZCBkYXRhIGlzc3VlIGlzIHRoZSBwcm9ibGVtLiBXaGVuIG11bHRpcGxlIGVncmVzcyBwYXRocyBtdXRhdGUgc2tiIGRhdGEsIHRoZXkgY2hhbmdlIHNoYXJlZCBkYXRhLCB3aGljaCwgaWYgbm90IGRvbmUgY29ycmVjdGx5LCBjYW4gY2F1c2UgaXNzdWVzIHdpdGggb3RoZXIgY2xvbmVzLiBUaGUgZml4IHVzZXMgYHNrYl9jb3coKWAgdG8gZW5zdXJlIHRoYXQgdGhlIHNrYiBoYXMgcHJpdmF0ZSBkYXRhLgoKTXkgYW5hbHlzaXMgZm9jdXNlcyBvbiB0aGlzIHBvaW50LiBgc2tiX2Nvdyhza2IsIDApYCBpcyBjcml0aWNhbCBoZXJlLiBJdCBlbnN1cmVzIHRoYXQgdGhlIFNLQiBlaXRoZXIgYWxyZWFkeSBoYXMgYSBwcml2YXRlIGhlYWQgKGFuZCBkYXRhKSwgb3Igd2lsbCByZWFsbG9jYXRlIHRoZW0uIEltcG9ydGFudGx5LCB0aGlzIHJlYWxsb2NhdGlvbiAqY29waWVzKiBleGlzdGluZyBkYXRhLCBpdCBkb2VzbiYjMzk7dCBsZWF2ZSBhbnkgcGFydCBvZiB0aGUgYnVmZmVyIHVuaW5pdGlhbGl6ZWQuIFdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBsb2dpY2FsIGJ1ZyDigJMgZGF0YSBjb3JydXB0aW9uIGR1ZSB0byBpbmNvcnJlY3Qgc2hhcmluZyDigJMgbm90IGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgb3IgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWsuIFRoZSAmIzM0O2NvcnJ1cHRlZCYjMzQ7IGRhdGEgaXMgdmFsaWQgcGFja2V0IGRhdGEuIEl0JiMzOTtzIGp1c3QgKmluY29ycmVjdCogZm9yIGEgc3BlY2lmaWMgY2xvbmUuIFRoZXJlJiMzOTtzIG5vIHNjZW5hcmlvIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4KCkkmIzM5O3ZlIGRvdWJsZS1jaGVja2VkIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBgc2tiX2NvdygpYC4gSXQgdWx0aW1hdGVseSBjYWxscyBgX19za2JfY293KClgLCB3aGljaCB0aGVuIHVzZXMgYHBza2JfZXhwYW5kX2hlYWRgIGlmIGEgcmVhbGxvY2F0aW9uIGlzIG5lZWRlZC4gV2hpbGUgdGhlIG5ld2x5IGFsbG9jYXRlZCBoZWFkcm9vbS90YWlscm9vbSBpbiBgcHNrYl9leHBhbmRfaGVhZGAgKmlzKiB1bmluaXRpYWxpemVkLCBpdCBpcyAqb3V0c2lkZSogdGhlIGBza2ItJmd0O2RhdGFgIHRvIGBza2ItJmd0O3RhaWxgIHJhbmdlLiBUaHVzLCBpdCYjMzk7cyBub3QgcmVhZCB1bmxlc3MgZXhwbGljaXRseSBwdXNoZWQvcHV0LCB3aGljaCBpcyBzdGFuZGFyZCBza2IgYmVoYXZpb3IuCgpUaGUgcGF0Y2gmIzM5O3MgY2hhbmdlcyBjYW4gYmUgc3VtbWFyaXplZCBhczoKCjEuICBgaHNyX2Nsb25lX3ByaXZhdGUoKWA6IENsb25lcyBhbmQgcHJpdmF0aXplcyBhbiBza2IuCjIuICBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoKWAgYW5kIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYDogUmVwbGFjZSBjbG9uZSB3aXRoIHByaXZhdGUgY2xvbmUuCjMuICBgaHNyX3htaXQoKWA6ICBQcml2YXRpemVzIGZvciBpbnRlcmxpbmsgcG9ydHMgYmVmb3JlIG11dGF0aW9uLgoKTm9uZSBvZiB0aGVzZSBjaGFuZ2VzICppbnRyb2R1Y2UqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gVGhleSBhcmUgYWxsIGFib3V0IHByb3Blcmx5IHByaXZhdGl6aW5nIHRoZSBza2IgZGF0YSB0byBwcmV2ZW50IHVuaW50ZW5kZWQgZGF0YSBzaGFyaW5nIGFuZCBtb2RpZmljYXRpb24sIGEgY2xhc3NpYyBzaGFyZWQtbXV0YWJsZS1zdGF0ZSBidWcuIFRoZSBwYXRjaCBkb2VzbiYjMzk7dCBpbnZvbHZlIGFueSBjb21wbGV4IHN0cnVjdHVyZSBhbGxvY2F0aW9ucyB0aGF0IG1pZ2h0IGxlYXZlIGZpZWxkcyB1bmluaXRpYWxpemVkLiBTdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgbWVtb3J5IHNhZmV0eSBoZXJlLiBLTVNBTiBpcyBub3QgYXBwbGljYWJsZSBhcyB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBUaGVyZWZvcmUsIHRoZSAmIzM0O05lZWRzS01TQU4mIzM0OyBmbGFnIHNob3VsZCBiZSBgZmFsc2VgLiBUaGUgcmVhc29uaW5nIGlzIHRoYXQgdGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgcmVsYXRlZCB0byBzaGFyZWQgZGF0YSBjb3JydXB0aW9uIHdpdGggYHNrYl9jb3coKWAgYW5kIHRoaXMgZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrcyByZWxhdGVkIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJJiMzOTttIGNvbmZpZGVudCBhYm91dCB0aGlzLiBJJiMzOTtsbCBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjYWxsIGFuZCBtYXJrIGl0IGFzIHN1Y2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA4IDAwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTE6NTcuNjQ0Mzg2MjA4WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTk2NzY3MDcwNjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFNSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHNyX2ZvcndhcmRfc2tiXCIsXG4gICAgXCJoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZVwiLFxuICAgIFwicHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUxOjU3LjY0NDM5MjE5OFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE4MDU0NTU3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDFjODYwYjQ0NTQ2ZDQ0Mjk2ZWQ5MWJjYzVkODc3OTU4OWQ1ZTBjODBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9uZXQvaHNyL2hzcl9mb3J3YXJkLmMgYi9uZXQvaHNyL2hzcl9mb3J3YXJkLmNcXG5pbmRleCAwNzc0OTgxYTY1YzE2Li5lZmNiZjNjZjI2ZjliIDEwMDY0NFxcbi0tLSBhL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xcbisrKyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xcbkBAIC0zMjUsOCArMzI1LDI5IEBAIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2ZpbGxfdGFnKHN0cnVjdCBza19idWZmICpza2IsXFxuIFxcdHJldHVybiBza2I7XFxuIH1cXG4gXFxuLS8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwganVzdCBjbG9uZSBpdCB0byBiZSBzZW50XFxuLSAqIHVuY2hhbmdlZC4gT3RoZXJ3aXNlLCBjcmVhdGUgYSBwcml2YXRlIGZyYW1lIGVzcGVjaWFsbHkgdGFnZ2VkIGZvciAncG9ydCcuXFxuKy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUncyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzc1xcbisgKiB3cml0ZXMgY2Fubm90IGNvcnJ1cHQgdGhlIG9yaWdpbmFsIHNrYiBvciBvdGhlciBjbG9uZXMgb2YgaXQuXFxuKyAqIFJldHVybnMgTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuKyAqL1xcbitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpXFxuK3tcXG4rXFx0c3RydWN0IHNrX2J1ZmYgKmNsb25lO1xcbitcXG4rXFx0Y2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTtcXG4rXFx0aWYgKCFjbG9uZSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChza2JfY293KGNsb25lLCAwKSkge1xcbitcXHRcXHRrZnJlZV9za2IoY2xvbmUpO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIGNsb25lO1xcbit9XFxuK1xcbisvKiBJZiB0aGUgb3JpZ2luYWwgZnJhbWUgd2FzIGFuIEhTUiB0YWdnZWQgZnJhbWUsIHJldHVybiBhIHByaXZhdGUgY2xvbmVcXG4rICogb2YgaXQgd2l0aCB0aGUgcGF0aCBpZCB1cGRhdGVkIGZvciAncG9ydCcuIE90aGVyd2lzZSwgcmV0dXJuIGEgcHJpdmF0ZVxcbisgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XFxuKyAqIHRhZ2dlZCBmb3IgJ3BvcnQnLlxcbiAgKi9cXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXFxuIFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcXG5AQCAtMzM2LDE0ICszNTcsMTggQEAgc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXFxuIFxcdGludCBtb3ZlbGVuO1xcbiBcXG4gXFx0aWYgKGZyYW1lLVxcdTAwM2Vza2JfaHNyKSB7XFxuLVxcdFxcdHN0cnVjdCBoc3JfZXRoaGRyICpoc3JfZXRoaGRyID1cXG4tXFx0XFx0XFx0KHN0cnVjdCBoc3JfZXRoaGRyICopc2tiX21hY19oZWFkZXIoZnJhbWUtXFx1MDAzZXNrYl9oc3IpO1xcbitcXHRcXHRzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjtcXG4rXFxuK1xcdFxcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2JfaHNyKTtcXG4rXFx0XFx0aWYgKCFza2IpXFxuK1xcdFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4gXFx0XFx0Lyogc2V0IHRoZSBsYW5lIGlkIHByb3Blcmx5ICovXFxuK1xcdFxcdGhzcl9ldGhoZHIgPSAoc3RydWN0IGhzcl9ldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpO1xcbiBcXHRcXHRoc3Jfc2V0X3BhdGhfaWQoZnJhbWUsIGhzcl9ldGhoZHIsIHBvcnQpO1xcbi1cXHRcXHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVxcdTAwM2Vza2JfaHNyLCBHRlBfQVRPTUlDKTtcXG4rXFx0XFx0cmV0dXJuIHNrYjtcXG4gXFx0fSBlbHNlIGlmIChwb3J0LVxcdTAwM2VkZXYtXFx1MDAzZWZlYXR1cmVzIFxcdTAwMjYgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykge1xcbi1cXHRcXHRyZXR1cm4gc2tiX2Nsb25lKGZyYW1lLVxcdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcXG4rXFx0XFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2Jfc3RkKTtcXG4gXFx0fVxcbiBcXG4gXFx0LyogQ3JlYXRlIHRoZSBuZXcgc2tiIHdpdGggZW5vdWdoIGhlYWRyb29tIHRvIGZpdCB0aGUgSFNSIHRhZyAqL1xcbkBAIC0zNzcsMTcgKzQwMiwyMyBAQCBzdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG4gXFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4gXFxuIFxcdGlmIChmcmFtZS1cXHUwMDNlc2tiX3BycCkge1xcbi1cXHRcXHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS1cXHUwMDNlc2tiX3BycCk7XFxuK1xcdFxcdHN0cnVjdCBwcnBfcmN0ICp0cmFpbGVyO1xcbitcXG4rXFx0XFx0c2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXFx1MDAzZXNrYl9wcnApO1xcbitcXHRcXHRpZiAoIXNrYilcXG4rXFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIFxcbitcXHRcXHR0cmFpbGVyID0gc2tiX2dldF9QUlBfcmN0KHNrYik7XFxuIFxcdFxcdGlmICh0cmFpbGVyKSB7XFxuIFxcdFxcdFxcdHBycF9zZXRfbGFuX2lkKHRyYWlsZXIsIHBvcnQpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHRXQVJOX09OQ0UoIXRyYWlsZXIsIFxcXCJlcnJvcmVkIFBSUCBza2JcXFwiKTtcXG4rXFx0XFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuIFxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXHRcXHR9XFxuLVxcdFxcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXFx1MDAzZXNrYl9wcnAsIEdGUF9BVE9NSUMpO1xcbitcXHRcXHRyZXR1cm4gc2tiO1xcbiBcXHR9IGVsc2UgaWYgKHBvcnQtXFx1MDAzZWRldi1cXHUwMDNlZmVhdHVyZXMgXFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XFxuLVxcdFxcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXFx1MDAzZXNrYl9zdGQsIEdGUF9BVE9NSUMpO1xcbitcXHRcXHRyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXFx1MDAzZXNrYl9zdGQpO1xcbiBcXHR9XFxuIFxcbiBcXHRza2IgPSBza2JfY29weV9leHBhbmQoZnJhbWUtXFx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cXHUwMDNlc2tiX3N0ZCksXFxuQEAgLTQyMCw2ICs0NTEsMjIgQEAgc3RhdGljIHZvaWQgaHNyX2RlbGl2ZXJfbWFzdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxcbiBcXHRcXHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcXG4ge1xcbitcXHQvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzXFxuK1xcdCAqIGFub3RoZXIgbGl2ZSBjb25zdW1lcjogZm9yIG1hc3Rlci1vcmlnaW5hdGVkIGZyYW1lcyB0aGUgY2xvbmVcXG4rXFx0ICogc2hhcmVzIHRoZSBvcmlnaW5hbCBUWCBza2IgKHdoaWNoIHRhcHMgb3IgdGhlIFRYIHBhdGggbWF5IHN0aWxsXFxuK1xcdCAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5XFxuK1xcdCAqIGFyZSBkZXN0aW5lZCB0byB0aGUgbG9jYWwgbm9kZSB3aXRob3V0IGJlaW5nIGV4Y2x1c2l2ZSB0byBpdC5cXG4rXFx0ICogUHJpdmF0aXplIGJlZm9yZSBhbnkgYWRkcmVzcyBtdXRhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGlmIChwb3J0LVxcdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChmcmFtZS1cXHUwMDNlcG9ydF9yY3YtXFx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUiB8fFxcbitcXHQgICAgIChmcmFtZS1cXHUwMDNlaXNfbG9jYWxfZGVzdCBcXHUwMDI2XFx1MDAyNiAhZnJhbWUtXFx1MDAzZWlzX2xvY2FsX2V4Y2x1c2l2ZSkpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBza2JfY293KHNrYiwgMCkpIHtcXG4rXFx0XFx0ZnJhbWUtXFx1MDAzZXBvcnRfcmN2LVxcdTAwM2VkZXYtXFx1MDAzZXN0YXRzLnJ4X2Ryb3BwZWQrKztcXG4rXFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuK1xcdFxcdHJldHVybiBORVRfWE1JVF9EUk9QO1xcbitcXHR9XFxuK1xcbiBcXHRpZiAoZnJhbWUtXFx1MDAzZXBvcnRfcmN2LVxcdTAwM2V0eXBlID09IEhTUl9QVF9NQVNURVIpIHtcXG4gXFx0XFx0aHNyX2FkZHJfc3Vic3RfZGVzdChmcmFtZS1cXHUwMDNlbm9kZV9zcmMsIHNrYiwgcG9ydCk7XFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxcbmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGVcXG5AQCAtNSw2ICs1LDcgQEAgdG9wX3NyY2RpciA9IC4uLy4uLy4uLy4uLy4uXFxuIFRFU1RfUFJPR1MgOj0gXFxcXFxcbiBcXHRoc3JfcGluZy5zaCBcXFxcXFxuIFxcdGhzcl9yZWRib3guc2ggXFxcXFxcbitcXHRoc3Jfc2hhcmVkX211dGF0aW9uLnNoIFxcXFxcXG4gXFx0bGlua19mYXVsdHMuc2ggXFxcXFxcbiBcXHRwcnBfcGluZy5zaCBcXFxcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9oc3Jfc2hhcmVkX211dGF0aW9uLnNoXFxubmV3IGZpbGUgbW9kZSAxMDA3NTVcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvaHNyX3NoYXJlZF9tdXRhdGlvbi5zaFxcbkBAIC0wLDAgKzEsMjQyIEBAXFxuKyMhL2Jpbi9iYXNoXFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI1xcbisjIFZlcmlmeSB0aGF0IHBlci1lZ3Jlc3MgbXV0YXRpb25zIG9mIHNoYXJlZCBza2IgZGF0YSBhcmUgcHJpdmF0ZTpcXG4rI1xcbisjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJ3MgTEFOLUlEIHdyaXRlXFxuKyMgbGFuZHMgaW4gdGhlIGZpcnN0IHNsYXZlJ3Mgc3RpbGwtcXVldWVkIGNsb25lOyB3aXRoIGEgbmV0ZW0gZGVsYXkgb25cXG4rIyBzbGF2ZSBBLCBpbmplY3RlZCBmcmFtZXMgbGVhdmUgQSBjYXJyeWluZyBCJ3MgTEFOIElELlxcbisjXFxuKyMgRjEgKFJlZEJveCBzb3VyY2UgTUFDKTogb24gYW4gYWZmZWN0ZWQga2VybmVsIGFuIEhTUi10YWdnZWQgbXVsdGljYXN0XFxuKyMgZnJhbWUgcmVjZWl2ZWQgb24gYSBSZWRCb3ggc2xhdmUgaXMgY2xvbmVkIGZvciBtYXN0ZXIgYW5kIGludGVybGluayxcXG4rIyBhbmQgdGhlIGludGVybGluaydzIFJlZEJveC1NQUMgcmV3cml0ZSBsYW5kcyBpbiB0aGUgbWFzdGVyIGNsb25lJ3NcXG4rIyBidWZmZXIsIHNvIHRoZSBsb2NhbCBzdGFjayByZWNlaXZlcyB0aGUgUmVkQm94IE1BQyBpbnN0ZWFkIG9mIHRoZVxcbisjIG9yaWdpbmF0aW5nIG5vZGUncyBNQUMuXFxuK1xcbitpcHY2PWZhbHNlXFxuK1xcbitzb3VyY2UgLi9oc3JfY29tbW9uLnNoXFxuK1xcbitEVVI9NVxcbitcXG4rcmVxdWlyZSgpXFxuK3tcXG4rXFx0Y29tbWFuZCAtdiBcXFwiJDFcXFwiIFxcdTAwM2UvZGV2L251bGwgMlxcdTAwM2VcXHUwMDI2MSBcXHUwMDI2XFx1MDAyNiByZXR1cm4gMFxcbitcXHRlY2hvIFxcXCJTS0lQOiAkMSBub3QgYXZhaWxhYmxlXFxcIlxcbitcXHRleGl0ICRrc2Z0X3NraXBcXG4rfVxcbitcXG4rcmVxdWlyZSBpcFxcbityZXF1aXJlIHRjXFxuK3JlcXVpcmUgcHl0aG9uM1xcbitcXG4rdHJhcCBjbGVhbnVwX2FsbF9ucyBFWElUXFxuK1xcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb25cXG4rIyBQUlAgREFOUCAocHJvdG8gMSksIEFGX1BBQ0tFVCBwcmUtdGFnZ2VkIGluamVjdGlvbiwgbmV0ZW0gb24gc2xhdmUgQS5cXG4rcnVuX2YyKClcXG4re1xcbitcXHRzZXR1cF9ucyBucyAyXFx1MDAzZS9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcFxcbitcXHRuc3goKSB7IGlwIG5ldG5zIGV4ZWMgXFxcIiRuc1xcXCIgXFxcIiRAXFxcIjsgfVxcbitcXG4rXFx0IyBQcm9iZSBzY2hfbmV0ZW0gaW5zaWRlIHRoZSBkaXNwb3NhYmxlIG5hbWVzcGFjZSBvbmx5LlxcbitcXHRpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDJcXHUwMDNlL2Rldi9udWxsOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIlNLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXFxcIlxcbitcXHRcXHRyZXR1cm4gJGtzZnRfc2tpcFxcbitcXHRmaVxcbitcXHRuc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDJcXHUwMDNlL2Rldi9udWxsXFxuK1xcbitcXHQjIENhcGFiaWxpdHkgcHJvYmVzIGVuZCBoZXJlOyBzZXR1cCBvciBydW50aW1lIGZhaWx1cmUgYmVsb3cgaXMgRkFJTC5cXG4rXFx0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XFxuK1xcdFxcdHsgZWNobyBcXFwiRkFJTDogdmV0aCBBXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XFxuK1xcdFxcdHsgZWNobyBcXFwiRkFJTDogdmV0aCBCXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cXG4rXFx0XFx0bnN4IGlwIGxpbmsgc2V0IFxcXCIkaVxcXCIgdXAgfHwgeyBlY2hvIFxcXCJGQUlMOiAkaSB1cFxcXCI7IHJldHVybiAxOyB9XFxuK1xcdGRvbmVcXG4rXFx0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBwcnAwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcXFxcbitcXHRcXHRzdXBlcnZpc2lvbiA0NSBwcm90byAxIDJcXHUwMDNlL2Rldi9udWxsOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIlNLSVA6IEhTUi9QUlAgbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFxcXCJcXG4rXFx0XFx0cmV0dXJuICRrc2Z0X3NraXBcXG4rXFx0ZmlcXG4rXFx0bnN4IGlwIGxpbmsgc2V0IHBycDAgdXAgfHwgeyBlY2hvIFxcXCJGQUlMOiBwcnAwIHVwXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0bnN4IHRjIHFkaXNjIGFkZCBkZXYgdkEgcm9vdCBuZXRlbSBkZWxheSAyMDBtcyB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IG5ldGVtXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFxuK1xcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXFxcIiREVVJcXFwiIFxcdTAwM2NcXHUwMDNjJ1BZRjInXFxuK2ltcG9ydCBzb2NrZXQsIHN0cnVjdCwgc2VsZWN0LCBzeXMsIHRpbWVcXG4rXFxuK2R1ciA9IGludChzeXMuYXJndlsxXSlcXG4rZGVmIGxhbmlkKHBrdCk6XFxuKyAgICBpZiBsZW4ocGt0KSBcXHUwMDNjIDIwIG9yIHBrdFstMjpdICE9IGJcXFwiXFxcXHg4OFxcXFx4ZmJcXFwiOlxcbisgICAgICAgIHJldHVybiBOb25lXFxuKyAgICByZXR1cm4gKHBrdFstNF0gXFx1MDAzZVxcdTAwM2UgNCkgXFx1MDAyNiAweEZcXG4rXFxuK1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbihcXFwiL3N5cy9jbGFzcy9uZXQvcHJwMC9hZGRyZXNzXFxcIikucmVhZCgpLnJlcGxhY2UoXFxcIjpcXFwiLCBcXFwiXFxcIikpXFxuK0RTVCA9IGJ5dGVzLmZyb21oZXgoXFxcIjAyYWFiYmNjZGQwMVxcXCIpXFxuK1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSlcXG4rcmN0MCA9IHN0cnVjdC5wYWNrKFxcXCJcXHUwMDNlSFxcXCIsIDApICsgc3RydWN0LnBhY2soXFxcIlxcdTAwM2VIXFxcIiwgNTIgXFx1MDAyNiAweDBGRkYpICsgYlxcXCJcXFxceDg4XFxcXHhmYlxcXCJcXG4rZnJhbWUgPSBEU1QgKyBTUkMgKyBiXFxcIlxcXFx4MDhcXFxceDAwXFxcIiArIFBBWSArIHJjdDBcXG4rXFxuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcXFwicHJwMFxcXCIsIDApKVxcbitzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxcbisgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKVxcbitzQS5iaW5kKChcXFwidkFwXFxcIiwgMCkpXFxuK3NCID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXFxuK3NCLmJpbmQoKFxcXCJ2QnBcXFwiLCAwKSlcXG4rc0Euc2V0YmxvY2tpbmcoRmFsc2UpOyBzQi5zZXRibG9ja2luZyhGYWxzZSlcXG4rXFxuK2EsIGIgPSBbXSwgW11cXG4rXFxuK2RlZiBtYXRjaChwa3QpOlxcbisgICAgcmV0dXJuIChwa3RbOjZdID09IERTVCBhbmQgcGt0WzY6MTJdID09IFNSQ1xcbisgICAgICAgICAgICBhbmQgcGt0WzEyOjE0XSA9PSBiXFxcIlxcXFx4MDhcXFxceDAwXFxcIiBhbmQgcGt0WzE0OjE0ICsgbGVuKFBBWSldID09IFBBWSlcXG4rXFxuK2RlZiBkcmFpbih0aW1lb3V0KTpcXG4rICAgIHdhaXQgPSB0aW1lb3V0XFxuKyAgICB3aGlsZSBUcnVlOlxcbisgICAgICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzQSwgc0JdLCBbXSwgW10sIHdhaXQpXFxuKyAgICAgICAgaWYgbm90IHI6XFxuKyAgICAgICAgICAgIHJldHVyblxcbisgICAgICAgIGZvciBzIGluIHI6XFxuKyAgICAgICAgICAgIHBrdCA9IHMucmVjdig2NTUzNSlcXG4rICAgICAgICAgICAgaWYgbm90IG1hdGNoKHBrdCk6XFxuKyAgICAgICAgICAgICAgICBjb250aW51ZVxcbisgICAgICAgICAgICBsaWQgPSBsYW5pZChwa3QpXFxuKyAgICAgICAgICAgIGlmIGxpZCBpcyBub3QgTm9uZTpcXG4rICAgICAgICAgICAgICAgIChhIGlmIHMgaXMgc0EgZWxzZSBiKS5hcHBlbmQobGlkKVxcbisgICAgICAgIHdhaXQgPSAwXFxuK1xcbisjIERyYWluIHdoaWxlIHNlbmRpbmcgc28gdGhlIGJ1cnN0IGNhbm5vdCBvdmVyZmxvdyB0aGUgY2FwdHVyZSBzb2NrZXRzJ1xcbisjIHJlY2VpdmUgYnVmZmVyczsgdGhlIG5ldGVtLWRlbGF5ZWQgQS1zaWRlIGZyYW1lcyBhcnJpdmUgYWZ0ZXJ3YXJkcyBhbmRcXG4rIyBhcmUgY29sbGVjdGVkIGJlbG93Llxcbitmb3IgXyBpbiByYW5nZSgyMDApOlxcbisgICAgdHguc2VuZChmcmFtZSlcXG4rICAgIGRyYWluKDApXFxuKyAgICB0aW1lLnNsZWVwKDAuMDAxKVxcbitcXG4rZW5kID0gdGltZS50aW1lKCkgKyBkdXJcXG4rd2hpbGUgdGltZS50aW1lKCkgXFx1MDAzYyBlbmQ6XFxuKyAgICBkcmFpbigwLjMpXFxuK1xcbitwcmludChcXFwiQS1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcXFwiICUgKGxlbihhKSwgc29ydGVkKHNldChhKSkpKVxcbitwcmludChcXFwiQi1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcXFwiICUgKGxlbihiKSwgc29ydGVkKHNldChiKSkpKVxcbitpZiBsZW4oYSkgXFx1MDAzYyAxNTAgb3IgbGVuKGIpIFxcdTAwM2MgMTUwOlxcbisgICAgcHJpbnQoXFxcIkZBSUw6IHRvbyBmZXcgaW5qZWN0ZWQgZnJhbWVzIGNhcHR1cmVkIChBPSVkIEI9JWQsIHNlbnQgMjAwKVxcXCJcXG4rICAgICAgICAgICUgKGxlbihhKSwgbGVuKGIpKSlcXG4rICAgIHN5cy5leGl0KDEpXFxuK2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCBcXHUwMDI2IDEpICE9IDBdXFxuK2JhZF9iID0gW3ggZm9yIHggaW4gYiBpZiAoeCBcXHUwMDI2IDEpICE9IDFdXFxuK2lmIGJhZF9hIG9yIGJhZF9iOlxcbisgICAgcHJpbnQoXFxcIkZBSUw6IHNoYXJlZC1tdXRhdGlvbiBjb3JydXB0aW9uIC0gQTogJWQvJWQgd3JvbmctbGFuLFxcXCJcXG4rICAgICAgICAgIFxcXCIgQjogJWQvJWQgd3JvbmctbGFuXFxcIlxcbisgICAgICAgICAgJSAobGVuKGJhZF9hKSwgbGVuKGEpLCBsZW4oYmFkX2IpLCBsZW4oYikpKVxcbisgICAgc3lzLmV4aXQoMSlcXG4rcHJpbnQoXFxcIlBBU1M6IHBlci1lZ3Jlc3MgTEFOIElEcyBpc29sYXRlZCAoQSBhbGwgYml0MD0wLCBCIGFsbCBiaXQwPTEpXFxcIilcXG4rc3lzLmV4aXQoMClcXG4rUFlGMlxcbit9XFxuK1xcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGMTogUmVkQm94IHNvdXJjZS1NQUMgcHJpdmFjeVxcbisjIEhTUiBSZWRCb3ggKHByb3RvIDApLCB0YWdnZWQgbXVsdGljYXN0IGZyb20gYSBzbGF2ZTogbWFzdGVyIG11c3Qga2VlcFxcbisjIHRoZSBub2RlIE1BQywgaW50ZXJsaW5rIG11c3QgY2FycnkgdGhlIFJlZEJveCBNQUMuXFxuK3J1bl9mMSgpXFxuK3tcXG4rXFx0c2V0dXBfbnMgbnMgMlxcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcXG4rXFx0bnN4KCkgeyBpcCBuZXRucyBleGVjIFxcXCIkbnNcXFwiIFxcXCIkQFxcXCI7IH1cXG4rXFxuK1xcdG5zeCBpcCBsaW5rIGFkZCB2QSB0eXBlIHZldGggcGVlciBuYW1lIHZBcCB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IHZldGggQVxcXCI7IHJldHVybiAxOyB9XFxuK1xcdG5zeCBpcCBsaW5rIGFkZCB2QiB0eXBlIHZldGggcGVlciBuYW1lIHZCcCB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IHZldGggQlxcXCI7IHJldHVybiAxOyB9XFxuK1xcdG5zeCBpcCBsaW5rIGFkZCB2SSB0eXBlIHZldGggcGVlciBuYW1lIHZJcCB8fFxcbitcXHRcXHR7IGVjaG8gXFxcIkZBSUw6IHZldGggSVxcXCI7IHJldHVybiAxOyB9XFxuK1xcdGZvciBpIGluIHZBIHZCIHZJIHZBcCB2QnAgdklwOyBkb1xcbitcXHRcXHRuc3ggaXAgbGluayBzZXQgXFxcIiRpXFxcIiB1cCB8fCB7IGVjaG8gXFxcIkZBSUw6ICRpIHVwXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFx0ZG9uZVxcbitcXHRpZiAhIG5zeCBpcCBsaW5rIGFkZCBuYW1lIGhzcjAgdHlwZSBoc3Igc2xhdmUxIHZBIHNsYXZlMiB2QiBcXFxcXFxuK1xcdFxcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcXHUwMDNlL2Rldi9udWxsOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIlNLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFxcXCJcXG4rXFx0XFx0cmV0dXJuICRrc2Z0X3NraXBcXG4rXFx0ZmlcXG4rXFx0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFxcXCJGQUlMOiBoc3IwIHVwXFxcIjsgcmV0dXJuIDE7IH1cXG4rXFxuK1xcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXFx1MDAzY1xcdTAwM2MnUFlGMSdcXG4raW1wb3J0IHNvY2tldCwgc2VsZWN0LCBzeXMsIHRpbWVcXG4rXFxuK05PREUgID0gYnl0ZXMuZnJvbWhleChcXFwiMDIxMTIyMzM0NDU1XFxcIilcXG4rTUNBU1QgPSBieXRlcy5mcm9taGV4KFxcXCIwMTAwNWUwMDAwMDFcXFwiKVxcbitSQiAgICA9IGJ5dGVzLmZyb21oZXgob3BlbihcXFwiL3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzc1xcXCIpLnJlYWQoKS5yZXBsYWNlKFxcXCI6XFxcIiwgXFxcIlxcXCIpKVxcbitQQVkgICA9IGJ5dGVzKHJhbmdlKDQ2KSlcXG4rXFxuK2RlZiBmcmFtZShzZXEpOlxcbisgICAgIyBMU0RVIHNpemUgPSBwYXlsb2FkICsgSFNSIHRhZyAoSFNSX0hMRU4pLCBhcyBoc3JfZmlsbF90YWcoKSBjb21wdXRlcyBpdFxcbisgICAgdGFnID0gKCgoMSBcXHUwMDNjXFx1MDAzYyAxMikgfCAobGVuKFBBWSkgKyA2KSkudG9fYnl0ZXMoMiwgXFxcImJpZ1xcXCIpXFxuKyAgICAgICAgICAgKyBzZXEudG9fYnl0ZXMoMiwgXFxcImJpZ1xcXCIpICsgYlxcXCJcXFxceDA4XFxcXHgwMFxcXCIpXFxuKyAgICByZXR1cm4gTUNBU1QgKyBOT0RFICsgYlxcXCJcXFxceDg5XFxcXHgyZlxcXCIgKyB0YWcgKyBQQVlcXG4rXFxuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcXFwidkFwXFxcIiwgMCkpXFxuK3NtID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXFxuK3NtLmJpbmQoKFxcXCJoc3IwXFxcIiwgMCkpXFxuK3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXFxuK3NpLmJpbmQoKFxcXCJ2SXBcXFwiLCAwKSlcXG4rc20uc2V0YmxvY2tpbmcoRmFsc2UpOyBzaS5zZXRibG9ja2luZyhGYWxzZSlcXG4rXFxuK2ZvciBpIGluIHJhbmdlKDMpOlxcbisgICAgdHguc2VuZChmcmFtZShpICsgMSkpOyB0aW1lLnNsZWVwKDAuMDUpXFxuK1xcbittX3NyYyA9IGlfc3JjID0gTm9uZVxcbitlbmQgPSB0aW1lLnRpbWUoKSArIDRcXG4rd2hpbGUgdGltZS50aW1lKCkgXFx1MDAzYyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOlxcbisgICAgciwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3NtLCBzaV0sIFtdLCBbXSwgMC4zKVxcbisgICAgZm9yIHMgaW4gcjpcXG4rICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpXFxuKyAgICAgICAgIyBleGFjdCBmbG93OiBkc3QsIHBvc3Qtc3RyaXAgRXRoZXJUeXBlLCBleGFjdCBwYXlsb2FkLCBtaW4gbGVuZ3RoO1xcbisgICAgICAgICMgaF9zb3VyY2UgaXMgdGhlIGFzc2VydGVkIHZhbHVlIGFuZCBtdXN0IE5PVCBiZSBmaWx0ZXJlZCBvblxcbisgICAgICAgIGlmIChsZW4ocGt0KSBcXHUwMDNjIDYwIG9yIHBrdFs6Nl0gIT0gTUNBU1Qgb3IgcGt0WzEyOjE0XSAhPSBiXFxcIlxcXFx4MDhcXFxceDAwXFxcIlxcbisgICAgICAgICAgICAgICAgb3IgcGt0WzE0OjE0ICsgbGVuKFBBWSldICE9IFBBWSk6XFxuKyAgICAgICAgICAgIGNvbnRpbnVlXFxuKyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZTpcXG4rICAgICAgICAgICAgbV9zcmMgPSBwa3RbNjoxMl1cXG4rICAgICAgICBlbGlmIHMgaXMgc2kgYW5kIGlfc3JjIGlzIE5vbmU6XFxuKyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdXFxuK1xcbitwcmludChcXFwibWFzdGVyIGhfc291cmNlICAgID1cXFwiLCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXFxuK3ByaW50KFxcXCJub2RlIE1BQyAgICAgICAgICAgPVxcXCIsIE5PREUuaGV4KCkpXFxuK3ByaW50KFxcXCJpbnRlcmxpbmsgaF9zb3VyY2UgPVxcXCIsIGlfc3JjLmhleCgpIGlmIGlfc3JjIGVsc2UgTm9uZSlcXG4rcHJpbnQoXFxcInJlZGJveCBNQUMgICAgICAgICA9XFxcIiwgUkIuaGV4KCkpXFxuK2lmIGlfc3JjICE9IFJCOlxcbisgICAgcHJpbnQoXFxcIkZBSUw6IGludGVybGluayBkaWQgbm90IGNhcnJ5IHRoZSBSZWRCb3ggTUFDXFxcIilcXG4rICAgIHN5cy5leGl0KDEpXFxuK2lmIG1fc3JjICE9IE5PREU6XFxuKyAgICBwcmludChcXFwiRkFJTDogbWFzdGVyIHJlY2VpdmVkICVzIGluc3RlYWQgb2YgdGhlIG5vZGUgTUFDIFxcXCJcXG4rICAgICAgICAgIFxcXCIoc2hhcmVkLW11dGF0aW9uIGNvcnJ1cHRpb24pXFxcIlxcbisgICAgICAgICAgJSAobV9zcmMuaGV4KCkgaWYgbV9zcmMgZWxzZSBcXFwibm90aGluZ1xcXCIpKVxcbisgICAgc3lzLmV4aXQoMSlcXG4rcHJpbnQoXFxcIlBBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXFxcIilcXG4rc3lzLmV4aXQoMClcXG4rUFlGMVxcbit9XFxuK1xcbityYz0wXFxuK1xcbitydW5fZjJcXG4rcmV0PSQ/XFxuK3JjPSQoa3NmdF9zdGF0dXNfbWVyZ2UgXFxcIiRyY1xcXCIgXFxcIiRyZXRcXFwiKVxcbitcXG4rcnVuX2YxXFxuK3JldD0kP1xcbityYz0kKGtzZnRfc3RhdHVzX21lcmdlIFxcXCIkcmNcXFwiIFxcXCIkcmV0XFxcIilcXG4rXFxuK2lmIFsgXFxcIiRyY1xcXCIgLWVxIDAgXTsgdGhlblxcbitcXHRlY2hvIFxcXCJoc3Jfc2hhcmVkX211dGF0aW9uOiBwZXItZWdyZXNzIG11dGF0aW9uIGlzb2xhdGlvbiAoRjErRjIpIFsgT0sgXVxcXCJcXG4rZWxpZiBbIFxcXCIkcmNcXFwiIC1lcSBcXFwiJGtzZnRfc2tpcFxcXCIgXTsgdGhlblxcbitcXHRlY2hvIFxcXCJoc3Jfc2hhcmVkX211dGF0aW9uOiBzdWJ0ZXN0cyBza2lwcGVkIChjYXBhYmlsaXRpZXMgbWlzc2luZylcXFwiXFxuK2Vsc2VcXG4rXFx0ZWNobyBcXFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF1cXFwiIFxcXFxcXG4rXFx0XFx0XFxcInJjPSRyY1xcXCIgMVxcdTAwM2VcXHUwMDI2MlxcbitmaVxcbitleGl0IFxcXCIkcmNcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUxOjU4LjgyNTY1MDYwNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjQ1MDc1NDE3MjI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkhTUlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImhzcl9mb3J3YXJkX3NrYlwiLFxuICAgIFwiaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVcIixcbiAgICBcInBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIEhTUiBkcml2ZXIgd2hlcmUgcGVyLWVncmVzcyB3cml0ZXMgY291bGQgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG11dGF0aW9uLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBwYWNrZXQgZm9yd2FyZGluZyBsb2dpYyBpbiB0aGUgSFNSIGRyaXZlciwgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxYzg2MGI0NDU0NmQ0NDI5NmVkOTFiY2M1ZDg3Nzk1ODlkNWUwYzgwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9oc3IvaHNyX2ZvcndhcmQuYyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuaW5kZXggMDc3NDk4MWE2NWMxNi4uZWZjYmYzY2YyNmY5YiAxMDA2NDRcbi0tLSBhL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuKysrIGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG5AQCAtMzI1LDggKzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHNrYjtcbiB9XG4gXG4tLyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCBqdXN0IGNsb25lIGl0IHRvIGJlIHNlbnRcbi0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJ3BvcnQnLlxuKy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUncyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzc1xuKyAqIHdyaXRlcyBjYW5ub3QgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC5cbisgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuKyAqL1xuK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7XG4rXG4rXHRjbG9uZSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpO1xuK1x0aWYgKCFjbG9uZSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHtcbitcdFx0a2ZyZWVfc2tiKGNsb25lKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXG4rXHRyZXR1cm4gY2xvbmU7XG4rfVxuK1xuKy8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwgcmV0dXJuIGEgcHJpdmF0ZSBjbG9uZVxuKyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJ3BvcnQnLiBPdGhlcndpc2UsIHJldHVybiBhIHByaXZhdGVcbisgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XG4rICogdGFnZ2VkIGZvciAncG9ydCcuXG4gICovXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbkBAIC0zMzYsMTQgKzM1NywxOCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdGludCBtb3ZlbGVuO1xuIFxuIFx0aWYgKGZyYW1lLVx1MDAzZXNrYl9oc3IpIHtcbi1cdFx0c3RydWN0IGhzcl9ldGhoZHIgKmhzcl9ldGhoZHIgPVxuLVx0XHRcdChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKGZyYW1lLVx1MDAzZXNrYl9oc3IpO1xuK1x0XHRzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjtcbitcbitcdFx0c2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXHUwMDNlc2tiX2hzcik7XG4rXHRcdGlmICghc2tiKVxuK1x0XHRcdHJldHVybiBOVUxMO1xuIFxuIFx0XHQvKiBzZXQgdGhlIGxhbmUgaWQgcHJvcGVybHkgKi9cbitcdFx0aHNyX2V0aGhkciA9IChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7XG4gXHRcdGhzcl9zZXRfcGF0aF9pZChmcmFtZSwgaHNyX2V0aGhkciwgcG9ydCk7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX2hzciwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBza2I7XG4gXHR9IGVsc2UgaWYgKHBvcnQtXHUwMDNlZGV2LVx1MDAzZWZlYXR1cmVzIFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX3N0ZCwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbiBcdH1cbiBcbiBcdC8qIENyZWF0ZSB0aGUgbmV3IHNrYiB3aXRoIGVub3VnaCBoZWFkcm9vbSB0byBmaXQgdGhlIEhTUiB0YWcgKi9cbkBAIC0zNzcsMTcgKzQwMiwyMyBAQCBzdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdHN0cnVjdCBza19idWZmICpza2I7XG4gXG4gXHRpZiAoZnJhbWUtXHUwMDNlc2tiX3BycCkge1xuLVx0XHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS1cdTAwM2Vza2JfcHJwKTtcbitcdFx0c3RydWN0IHBycF9yY3QgKnRyYWlsZXI7XG4rXG4rXHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9wcnApO1xuK1x0XHRpZiAoIXNrYilcbitcdFx0XHRyZXR1cm4gTlVMTDtcbiBcbitcdFx0dHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChza2IpO1xuIFx0XHRpZiAodHJhaWxlcikge1xuIFx0XHRcdHBycF9zZXRfbGFuX2lkKHRyYWlsZXIsIHBvcnQpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdFdBUk5fT05DRSghdHJhaWxlciwgXCJlcnJvcmVkIFBSUCBza2JcIik7XG4rXHRcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2JfcHJwLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIHNrYjtcbiBcdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9zdGQpO1xuIFx0fVxuIFxuIFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKGZyYW1lLVx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cdTAwM2Vza2Jfc3RkKSxcbkBAIC00MjAsNiArNDUxLDIyIEBAIHN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxuIFx0XHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcbiB7XG4rXHQvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzXG4rXHQgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lXG4rXHQgKiBzaGFyZXMgdGhlIG9yaWdpbmFsIFRYIHNrYiAod2hpY2ggdGFwcyBvciB0aGUgVFggcGF0aCBtYXkgc3RpbGxcbitcdCAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5XG4rXHQgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuXG4rXHQgKiBQcml2YXRpemUgYmVmb3JlIGFueSBhZGRyZXNzIG11dGF0aW9uLlxuK1x0ICovXG4rXHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGZyYW1lLVx1MDAzZXBvcnRfcmN2LVx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUiB8fFxuK1x0ICAgICAoZnJhbWUtXHUwMDNlaXNfbG9jYWxfZGVzdCBcdTAwMjZcdTAwMjYgIWZyYW1lLVx1MDAzZWlzX2xvY2FsX2V4Y2x1c2l2ZSkpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHNrYl9jb3coc2tiLCAwKSkge1xuK1x0XHRmcmFtZS1cdTAwM2Vwb3J0X3Jjdi1cdTAwM2VkZXYtXHUwMDNlc3RhdHMucnhfZHJvcHBlZCsrO1xuK1x0XHRrZnJlZV9za2Ioc2tiKTtcbitcdFx0cmV0dXJuIE5FVF9YTUlUX0RST1A7XG4rXHR9XG4rXG4gXHRpZiAoZnJhbWUtXHUwMDNlcG9ydF9yY3YtXHUwMDNldHlwZSA9PSBIU1JfUFRfTUFTVEVSKSB7XG4gXHRcdGhzcl9hZGRyX3N1YnN0X2Rlc3QoZnJhbWUtXHUwMDNlbm9kZV9zcmMsIHNrYiwgcG9ydCk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGVcbmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG5AQCAtNSw2ICs1LDcgQEAgdG9wX3NyY2RpciA9IC4uLy4uLy4uLy4uLy4uXG4gVEVTVF9QUk9HUyA6PSBcXFxuIFx0aHNyX3Bpbmcuc2ggXFxcbiBcdGhzcl9yZWRib3guc2ggXFxcbitcdGhzcl9zaGFyZWRfbXV0YXRpb24uc2ggXFxcbiBcdGxpbmtfZmF1bHRzLnNoIFxcXG4gXHRwcnBfcGluZy5zaCBcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbm5ldyBmaWxlIG1vZGUgMTAwNzU1XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbkBAIC0wLDAgKzEsMjQyIEBAXG4rIyEvYmluL2Jhc2hcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI1xuKyMgVmVyaWZ5IHRoYXQgcGVyLWVncmVzcyBtdXRhdGlvbnMgb2Ygc2hhcmVkIHNrYiBkYXRhIGFyZSBwcml2YXRlOlxuKyNcbisjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJ3MgTEFOLUlEIHdyaXRlXG4rIyBsYW5kcyBpbiB0aGUgZmlyc3Qgc2xhdmUncyBzdGlsbC1xdWV1ZWQgY2xvbmU7IHdpdGggYSBuZXRlbSBkZWxheSBvblxuKyMgc2xhdmUgQSwgaW5qZWN0ZWQgZnJhbWVzIGxlYXZlIEEgY2FycnlpbmcgQidzIExBTiBJRC5cbisjXG4rIyBGMSAoUmVkQm94IHNvdXJjZSBNQUMpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgYW4gSFNSLXRhZ2dlZCBtdWx0aWNhc3RcbisjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssXG4rIyBhbmQgdGhlIGludGVybGluaydzIFJlZEJveC1NQUMgcmV3cml0ZSBsYW5kcyBpbiB0aGUgbWFzdGVyIGNsb25lJ3NcbisjIGJ1ZmZlciwgc28gdGhlIGxvY2FsIHN0YWNrIHJlY2VpdmVzIHRoZSBSZWRCb3ggTUFDIGluc3RlYWQgb2YgdGhlXG4rIyBvcmlnaW5hdGluZyBub2RlJ3MgTUFDLlxuK1xuK2lwdjY9ZmFsc2Vcbitcbitzb3VyY2UgLi9oc3JfY29tbW9uLnNoXG4rXG4rRFVSPTVcbitcbityZXF1aXJlKClcbit7XG4rXHRjb21tYW5kIC12IFwiJDFcIiBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjEgXHUwMDI2XHUwMDI2IHJldHVybiAwXG4rXHRlY2hvIFwiU0tJUDogJDEgbm90IGF2YWlsYWJsZVwiXG4rXHRleGl0ICRrc2Z0X3NraXBcbit9XG4rXG4rcmVxdWlyZSBpcFxuK3JlcXVpcmUgdGNcbityZXF1aXJlIHB5dGhvbjNcbitcbit0cmFwIGNsZWFudXBfYWxsX25zIEVYSVRcbitcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb25cbisjIFBSUCBEQU5QIChwcm90byAxKSwgQUZfUEFDS0VUIHByZS10YWdnZWQgaW5qZWN0aW9uLCBuZXRlbSBvbiBzbGF2ZSBBLlxuK3J1bl9mMigpXG4re1xuK1x0c2V0dXBfbnMgbnMgMlx1MDAzZS9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcFxuK1x0bnN4KCkgeyBpcCBuZXRucyBleGVjIFwiJG5zXCIgXCIkQFwiOyB9XG4rXG4rXHQjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuXG4rXHRpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXCJcbitcdFx0cmV0dXJuICRrc2Z0X3NraXBcbitcdGZpXG4rXHRuc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDJcdTAwM2UvZGV2L251bGxcbitcbitcdCMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLlxuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cbitcdFx0bnN4IGlwIGxpbmsgc2V0IFwiJGlcIiB1cCB8fCB7IGVjaG8gXCJGQUlMOiAkaSB1cFwiOyByZXR1cm4gMTsgfVxuK1x0ZG9uZVxuK1x0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBwcnAwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcbitcdFx0c3VwZXJ2aXNpb24gNDUgcHJvdG8gMSAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4rXHRcdGVjaG8gXCJTS0lQOiBIU1IvUFJQIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWxcIlxuK1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuK1x0ZmlcbitcdG5zeCBpcCBsaW5rIHNldCBwcnAwIHVwIHx8IHsgZWNobyBcIkZBSUw6IHBycDAgdXBcIjsgcmV0dXJuIDE7IH1cbitcdG5zeCB0YyBxZGlzYyBhZGQgZGV2IHZBIHJvb3QgbmV0ZW0gZGVsYXkgMjAwbXMgfHxcbitcdFx0eyBlY2hvIFwiRkFJTDogbmV0ZW1cIjsgcmV0dXJuIDE7IH1cbitcbitcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXCIkRFVSXCIgXHUwMDNjXHUwMDNjJ1BZRjInXG4raW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK2R1ciA9IGludChzeXMuYXJndlsxXSlcbitkZWYgbGFuaWQocGt0KTpcbisgICAgaWYgbGVuKHBrdCkgXHUwMDNjIDIwIG9yIHBrdFstMjpdICE9IGJcIlxceDg4XFx4ZmJcIjpcbisgICAgICAgIHJldHVybiBOb25lXG4rICAgIHJldHVybiAocGt0Wy00XSBcdTAwM2VcdTAwM2UgNCkgXHUwMDI2IDB4RlxuK1xuK1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbihcIi9zeXMvY2xhc3MvbmV0L3BycDAvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rRFNUID0gYnl0ZXMuZnJvbWhleChcIjAyYWFiYmNjZGQwMVwiKVxuK1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSlcbityY3QwID0gc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDApICsgc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDUyIFx1MDAyNiAweDBGRkYpICsgYlwiXFx4ODhcXHhmYlwiXG4rZnJhbWUgPSBEU1QgKyBTUkMgKyBiXCJcXHgwOFxceDAwXCIgKyBQQVkgKyByY3QwXG4rXG4rdHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKFwicHJwMFwiLCAwKSlcbitzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc0EuYmluZCgoXCJ2QXBcIiwgMCkpXG4rc0IgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyxcbisgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKVxuK3NCLmJpbmQoKFwidkJwXCIsIDApKVxuK3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpXG4rXG4rYSwgYiA9IFtdLCBbXVxuK1xuK2RlZiBtYXRjaChwa3QpOlxuKyAgICByZXR1cm4gKHBrdFs6Nl0gPT0gRFNUIGFuZCBwa3RbNjoxMl0gPT0gU1JDXG4rICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYlwiXFx4MDhcXHgwMFwiIGFuZCBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gPT0gUEFZKVxuK1xuK2RlZiBkcmFpbih0aW1lb3V0KTpcbisgICAgd2FpdCA9IHRpbWVvdXRcbisgICAgd2hpbGUgVHJ1ZTpcbisgICAgICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzQSwgc0JdLCBbXSwgW10sIHdhaXQpXG4rICAgICAgICBpZiBub3QgcjpcbisgICAgICAgICAgICByZXR1cm5cbisgICAgICAgIGZvciBzIGluIHI6XG4rICAgICAgICAgICAgcGt0ID0gcy5yZWN2KDY1NTM1KVxuKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaChwa3QpOlxuKyAgICAgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgICAgIGxpZCA9IGxhbmlkKHBrdClcbisgICAgICAgICAgICBpZiBsaWQgaXMgbm90IE5vbmU6XG4rICAgICAgICAgICAgICAgIChhIGlmIHMgaXMgc0EgZWxzZSBiKS5hcHBlbmQobGlkKVxuKyAgICAgICAgd2FpdCA9IDBcbitcbisjIERyYWluIHdoaWxlIHNlbmRpbmcgc28gdGhlIGJ1cnN0IGNhbm5vdCBvdmVyZmxvdyB0aGUgY2FwdHVyZSBzb2NrZXRzJ1xuKyMgcmVjZWl2ZSBidWZmZXJzOyB0aGUgbmV0ZW0tZGVsYXllZCBBLXNpZGUgZnJhbWVzIGFycml2ZSBhZnRlcndhcmRzIGFuZFxuKyMgYXJlIGNvbGxlY3RlZCBiZWxvdy5cbitmb3IgXyBpbiByYW5nZSgyMDApOlxuKyAgICB0eC5zZW5kKGZyYW1lKVxuKyAgICBkcmFpbigwKVxuKyAgICB0aW1lLnNsZWVwKDAuMDAxKVxuK1xuK2VuZCA9IHRpbWUudGltZSgpICsgZHVyXG4rd2hpbGUgdGltZS50aW1lKCkgXHUwMDNjIGVuZDpcbisgICAgZHJhaW4oMC4zKVxuK1xuK3ByaW50KFwiQS1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcIiAlIChsZW4oYSksIHNvcnRlZChzZXQoYSkpKSlcbitwcmludChcIkItc2lkZSBjb3VudD0lZCBsYW4gaWRzPSVzXCIgJSAobGVuKGIpLCBzb3J0ZWQoc2V0KGIpKSkpXG4raWYgbGVuKGEpIFx1MDAzYyAxNTAgb3IgbGVuKGIpIFx1MDAzYyAxNTA6XG4rICAgIHByaW50KFwiRkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApXCJcbisgICAgICAgICAgJSAobGVuKGEpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCBcdTAwMjYgMSkgIT0gMF1cbitiYWRfYiA9IFt4IGZvciB4IGluIGIgaWYgKHggXHUwMDI2IDEpICE9IDFdXG4raWYgYmFkX2Egb3IgYmFkX2I6XG4rICAgIHByaW50KFwiRkFJTDogc2hhcmVkLW11dGF0aW9uIGNvcnJ1cHRpb24gLSBBOiAlZC8lZCB3cm9uZy1sYW4sXCJcbisgICAgICAgICAgXCIgQjogJWQvJWQgd3JvbmctbGFuXCJcbisgICAgICAgICAgJSAobGVuKGJhZF9hKSwgbGVuKGEpLCBsZW4oYmFkX2IpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK3ByaW50KFwiUEFTUzogcGVyLWVncmVzcyBMQU4gSURzIGlzb2xhdGVkIChBIGFsbCBiaXQwPTAsIEIgYWxsIGJpdDA9MSlcIilcbitzeXMuZXhpdCgwKVxuK1BZRjJcbit9XG4rXG4rIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjE6IFJlZEJveCBzb3VyY2UtTUFDIHByaXZhY3lcbisjIEhTUiBSZWRCb3ggKHByb3RvIDApLCB0YWdnZWQgbXVsdGljYXN0IGZyb20gYSBzbGF2ZTogbWFzdGVyIG11c3Qga2VlcFxuKyMgdGhlIG5vZGUgTUFDLCBpbnRlcmxpbmsgbXVzdCBjYXJyeSB0aGUgUmVkQm94IE1BQy5cbitydW5fZjEoKVxuK3tcbitcdHNldHVwX25zIG5zIDJcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcbitcdG5zeCgpIHsgaXAgbmV0bnMgZXhlYyBcIiRuc1wiIFwiJEBcIjsgfVxuK1xuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggSVwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkkgdkFwIHZCcCB2SXA7IGRvXG4rXHRcdG5zeCBpcCBsaW5rIHNldCBcIiRpXCIgdXAgfHwgeyBlY2hvIFwiRkFJTDogJGkgdXBcIjsgcmV0dXJuIDE7IH1cbitcdGRvbmVcbitcdGlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgaHNyMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFxcXG4rXHRcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFwiXG4rXHRcdHJldHVybiAka3NmdF9za2lwXG4rXHRmaVxuK1x0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFwiRkFJTDogaHNyMCB1cFwiOyByZXR1cm4gMTsgfVxuK1xuK1x0bnN4IHB5dGhvbjMgL2Rldi9zdGRpbiBcdTAwM2NcdTAwM2MnUFlGMSdcbitpbXBvcnQgc29ja2V0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK05PREUgID0gYnl0ZXMuZnJvbWhleChcIjAyMTEyMjMzNDQ1NVwiKVxuK01DQVNUID0gYnl0ZXMuZnJvbWhleChcIjAxMDA1ZTAwMDAwMVwiKVxuK1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKFwiL3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rUEFZICAgPSBieXRlcyhyYW5nZSg0NikpXG4rXG4rZGVmIGZyYW1lKHNlcSk6XG4rICAgICMgTFNEVSBzaXplID0gcGF5bG9hZCArIEhTUiB0YWcgKEhTUl9ITEVOKSwgYXMgaHNyX2ZpbGxfdGFnKCkgY29tcHV0ZXMgaXRcbisgICAgdGFnID0gKCgoMSBcdTAwM2NcdTAwM2MgMTIpIHwgKGxlbihQQVkpICsgNikpLnRvX2J5dGVzKDIsIFwiYmlnXCIpXG4rICAgICAgICAgICArIHNlcS50b19ieXRlcygyLCBcImJpZ1wiKSArIGJcIlxceDA4XFx4MDBcIilcbisgICAgcmV0dXJuIE1DQVNUICsgTk9ERSArIGJcIlxceDg5XFx4MmZcIiArIHRhZyArIFBBWVxuK1xuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcInZBcFwiLCAwKSlcbitzbSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc20uYmluZCgoXCJoc3IwXCIsIDApKVxuK3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4rICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSlcbitzaS5iaW5kKChcInZJcFwiLCAwKSlcbitzbS5zZXRibG9ja2luZyhGYWxzZSk7IHNpLnNldGJsb2NraW5nKEZhbHNlKVxuK1xuK2ZvciBpIGluIHJhbmdlKDMpOlxuKyAgICB0eC5zZW5kKGZyYW1lKGkgKyAxKSk7IHRpbWUuc2xlZXAoMC4wNSlcbitcbittX3NyYyA9IGlfc3JjID0gTm9uZVxuK2VuZCA9IHRpbWUudGltZSgpICsgNFxuK3doaWxlIHRpbWUudGltZSgpIFx1MDAzYyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOlxuKyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpXG4rICAgIGZvciBzIGluIHI6XG4rICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpXG4rICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7XG4rICAgICAgICAjIGhfc291cmNlIGlzIHRoZSBhc3NlcnRlZCB2YWx1ZSBhbmQgbXVzdCBOT1QgYmUgZmlsdGVyZWQgb25cbisgICAgICAgIGlmIChsZW4ocGt0KSBcdTAwM2MgNjAgb3IgcGt0Wzo2XSAhPSBNQ0FTVCBvciBwa3RbMTI6MTRdICE9IGJcIlxceDA4XFx4MDBcIlxuKyAgICAgICAgICAgICAgICBvciBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gIT0gUEFZKTpcbisgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZTpcbisgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXVxuKyAgICAgICAgZWxpZiBzIGlzIHNpIGFuZCBpX3NyYyBpcyBOb25lOlxuKyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdXG4rXG4rcHJpbnQoXCJtYXN0ZXIgaF9zb3VyY2UgICAgPVwiLCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXG4rcHJpbnQoXCJub2RlIE1BQyAgICAgICAgICAgPVwiLCBOT0RFLmhleCgpKVxuK3ByaW50KFwiaW50ZXJsaW5rIGhfc291cmNlID1cIiwgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKVxuK3ByaW50KFwicmVkYm94IE1BQyAgICAgICAgID1cIiwgUkIuaGV4KCkpXG4raWYgaV9zcmMgIT0gUkI6XG4rICAgIHByaW50KFwiRkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUNcIilcbisgICAgc3lzLmV4aXQoMSlcbitpZiBtX3NyYyAhPSBOT0RFOlxuKyAgICBwcmludChcIkZBSUw6IG1hc3RlciByZWNlaXZlZCAlcyBpbnN0ZWFkIG9mIHRoZSBub2RlIE1BQyBcIlxuKyAgICAgICAgICBcIihzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbilcIlxuKyAgICAgICAgICAlIChtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIFwibm90aGluZ1wiKSlcbisgICAgc3lzLmV4aXQoMSlcbitwcmludChcIlBBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXCIpXG4rc3lzLmV4aXQoMClcbitQWUYxXG4rfVxuK1xuK3JjPTBcbitcbitydW5fZjJcbityZXQ9JD9cbityYz0kKGtzZnRfc3RhdHVzX21lcmdlIFwiJHJjXCIgXCIkcmV0XCIpXG4rXG4rcnVuX2YxXG4rcmV0PSQ/XG4rcmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcIiRyY1wiIFwiJHJldFwiKVxuK1xuK2lmIFsgXCIkcmNcIiAtZXEgMCBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gKEYxK0YyKSBbIE9LIF1cIlxuK2VsaWYgWyBcIiRyY1wiIC1lcSBcIiRrc2Z0X3NraXBcIiBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogc3VidGVzdHMgc2tpcHBlZCAoY2FwYWJpbGl0aWVzIG1pc3NpbmcpXCJcbitlbHNlXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF1cIiBcXFxuK1x0XHRcInJjPSRyY1wiIDFcdTAwM2VcdTAwMjYyXG4rZmlcbitleGl0IFwiJHJjXCJcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUxOjU4LjgyNTY1MTY4NVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ4MTI5Mjg3NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBIU1IgRHJpdmVyIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgdGhlIEhTUiBkcml2ZXIsIHNwZWNpZmljYWxseSBpbiBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gSXQncyBpbnRyb2R1Y2luZyBhIGNyaXRpY2FsIGNoYW5nZTsgaXQncyB1c2luZyBhIG5ldyBmdW5jdGlvbiwgYGhzcl9jbG9uZV9wcml2YXRlKClgLCB3aGljaCBkb2VzIGEgY29weS1vbi13cml0ZSAoYHNrYl9jb3coKWApIG9mIHRoZSBTS0IsIGVmZmVjdGl2ZWx5IG1ha2luZyB0aGUgZGF0YSBwcml2YXRlLiAgVGhlIGltcGxpY2F0aW9ucyBoZXJlIGFyZSBzaWduaWZpY2FudC4gSXQncyByZXBsYWNpbmcgdGhlIHN0YW5kYXJkIGBza2JfY2xvbmUoKWAgY2FsbHMgaW4gYGhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoKWAgd2l0aCB0aGlzIGNvcHktb24td3JpdGUgdmVyc2lvbi5cblxuVGhlIHJhdGlvbmFsZSBpcyBjbGVhciDigJMgYW5kIGNydWNpYWwuIFRoaXMgaXMgYWJvdXQgcHJldmVudGluZyBkYXRhIGNvcnJ1cHRpb24uIFdpdGggYHNrYl9jbG9uZSgpYCwgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlIGNsb25lZCBTS0Igd291bGQgYWZmZWN0IHRoZSBvcmlnaW5hbCBhbmQgYW55IG90aGVyIGNsb25lcywgcGFydGljdWxhcmx5IGR1cmluZyBwZXItZWdyZXNzIHdyaXRlcywgYW5kIHRoYXQncyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIgaW4gYSBoaWdoLWF2YWlsYWJpbGl0eSBzeXN0ZW0uIFRoaXMgdXBkYXRlIGluIGBoc3JfeG1pdCgpYCBpcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcuIFRoZSBwYXRjaCBpcyBlbnN1cmluZyB0aGUgU0tCIGlzIHByaXZhdGl6ZWQgKmJlZm9yZSogYW55IGFkZHJlc3MgbW9kaWZpY2F0aW9uIGZvciBpbnRlcmxpbmstYm91bmQgU0tCcy4gVGhhdCBtZWFucyB0aGUgY29weS1vbi13cml0ZSBoYXBwZW5zIHVwZnJvbnQgdG8gZ3VhcmQgYWdhaW5zdCBleGFjdGx5IHRoaXMgdHlwZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBpc3N1ZS5cblxuRXNzZW50aWFsbHksIHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIHJhY2UgY29uZGl0aW9uLCBhIGNsYXNzaWMgcHJvYmxlbSBpbiBuZXR3b3JrIGRyaXZlcnMgd2hlcmUgbXVsdGlwbGUgcGFydHMgb2YgdGhlIHN5c3RlbSBhcmUgdHJ5aW5nIHRvIHdyaXRlIHRvIHRoZSBzYW1lIGJ1ZmZlci4gVGhpcyBpcyBhIHNvbGlkIGFwcHJvYWNoIHRvIGZpeGluZyB0aGF0LiBOb3csIEkgbmVlZCB0byBkaXZlIGludG8gdGhlIGNvZGUgaXRzZWxmLCBhbmFseXplIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMsIGFuZCBhbHNvIG1ha2Ugc3VyZSB0aGUgS2NvbmZpZyBtYWtlcyBzZW5zZSwgY29uZmlybWluZyB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHNldC4gIExldCdzIHNlZSB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwMywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4NSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjAzLjYzODU4MzU3M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTc3MjAxMzY5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhzcl9jbG9uZV9wcml2YXRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9oc3IvaHNyX2ZvcndhcmQuYz0yODg9c3RhdGljIHN0cnVjdCBza19idWZmICpoc3JfZmlsbF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zMzEtICovXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjMzMjpzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9jbG9uZV9wcml2YXRlKHN0cnVjdCBza19idWZmICpza2IpXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTMzMy17XFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzUyPXN0cnVjdCBza19idWZmICpoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZShzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLFxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTM2MS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6MzYyOlxcdFxcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2JfaHNyKTtcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzYzLVxcdFxcdGlmICghc2tiKVxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTM3MC1cXHR9IGVsc2UgaWYgKHBvcnQtXFx1MDAzZWRldi1cXHUwMDNlZmVhdHVyZXMgXFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjM3MTpcXHRcXHRyZXR1cm4gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXFx1MDAzZXNrYl9zdGQpO1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNzItXFx0fVxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jPTM5OT1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00MDYtXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjQwNzpcXHRcXHRza2IgPSBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cXHUwMDNlc2tiX3BycCk7XFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQwOC1cXHRcXHRpZiAoIXNrYilcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00MjAtXFx0fSBlbHNlIGlmIChwb3J0LVxcdTAwM2VkZXYtXFx1MDAzZWZlYXR1cmVzIFxcdTAwMjYgTkVUSUZfRl9IV19IU1JfVEFHX0lOUykge1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo0MjE6XFx0XFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVxcdTAwM2Vza2Jfc3RkKTtcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNDIyLVxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MDUuMjE1Nzg5NDgxWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjk5MzY4MTAzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGNoYW5nZXMgYW5kIHdoZXJlIEkgc2hvdWxkIGZvY3VzIG15IGF0dGVudGlvbjpcblxuKipOYXZpZ2F0aW5nIHRoZSBIU1IgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyB0aGUgbW9kaWZpY2F0aW9ucyBhcmUgZGVmaW5pdGVseSB3aXRoaW4gYG5ldC9oc3IvaHNyX2ZvcndhcmQuY2AuIFRoYXQncyB0aGUgY29yZSBmb3J3YXJkaW5nIGxvZ2ljIGZvciBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IpLCBzbyBpdCdzIHRoZSByaWdodCBwbGFjZSB0byBiZWdpbi4gQmVmb3JlIGRpdmluZyBkZWVwIGludG8gdGhlIGNvZGUgaXRzZWxmLCBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgS2NvbmZpZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIEhTUi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBwb3RlbnRpYWxseSB3aGF0IGRlcGVuZGVuY2llcyBpdCBoYXMsIGFuZCBob3cgSSBjYW4gY29udHJvbCBpdCBpbiB0aGUgYnVpbGQuIEtub3dpbmcgdGhlIEtjb25maWcgb3B0aW9ucyB3aWxsIHF1aWNrbHkgaWxsdW1pbmF0ZSB0aGUgYmlnZ2VyIHBpY3R1cmUuIFRoaXMgd2lsbCBoZWxwIGZyYW1lIHRoZSBjaGFuZ2VzIHdpdGhpbiB0aGUgb3ZlcmFsbCBzeXN0ZW0gZGVzaWduLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTE3LCJPdXRwdXRUb2tlbnMiOjE3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MDguMjA5NDcyNDg3WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NDQxNzc4MjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEhTUlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaHNyL0tjb25maWctNS1cXG5uZXQvaHNyL0tjb25maWc6Njpjb25maWcgSFNSXFxubmV0L2hzci9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIkhpZ2gtYXZhaWxhYmlsaXR5IFNlYW1sZXNzIFJlZHVuZGFuY3kgKEhTUiBcXHUwMDI2IFBSUClcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjA5Ljg1MzY1NjExMVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5MDczODk2ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKkZ1enppbmcgRm9jdXM6IEluaXRpYWwgQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgYEhTUmAuIFRoYXQncyB0aGUgYmFzZWxpbmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyBuYWlsIGRvd24gd2hlcmUgd2UncmUgZ29pbmcgdG8gZGlyZWN0IG91ciBmdXp6aW5nIGVmZm9ydHMuIFRoZSBzeXN0ZW0ncyB0ZWxsaW5nIG1lIGFib3V0IHRoZXNlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCwgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCwgYW5kIGBoc3JfeG1pdGAuIFJpZ2h0LCB0aG9zZSBhcmUgb3VyIHRhcmdldHMuIE5vdywgYmVmb3JlIEkgZGl2ZSBkZWVwIGludG8gY3JhZnRpbmcgdGVzdCBjYXNlcywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBwb3RlbnRpYWwgZm9yIHRoaXMuIEFyZSB0aGVzZSBnbG9iYWwsIG9yIGFyZSB0aGV5IHN0YXRpYyB3aXRoaW4gYSBzcGVjaWZpYyBtb2R1bGU/IFRoZSBzdGF0aWMvbm9uLXN0YXRpYyBuYXR1cmUgb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgaW5mbHVlbmNlIGhvdyBJIGFwcHJvYWNoIHZ1bG5lcmFiaWxpdHkgZGlzY292ZXJ5IGFuZCBleHBsb2l0IGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODE3NywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjEzLjc2MTA0ODcyNFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDg2MDI5Mjg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9oc3IvaHNyX2RldmljZS5jPTYyMT1zdGF0aWMgY29uc3Qgc3RydWN0IGhzcl9wcm90b19vcHMgaHNyX29wcyA9IHtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy02MjItXFx0LnNlbmRfc3ZfZnJhbWUgPSBzZW5kX2hzcl9zdXBlcnZpc2lvbl9mcmFtZSxcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYzo2MjM6XFx0LmNyZWF0ZV90YWdnZWRfZnJhbWUgPSBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSxcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy02MjQtXFx0LmdldF91bnRhZ2dlZF9mcmFtZSA9IGhzcl9nZXRfdW50YWdnZWRfZnJhbWUsXFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9MzMyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy0zNTEtICovXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjM1MjpzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtMzUzLVxcdFxcdFxcdFxcdFxcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcXG4tLVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaD0xNz1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmgtMTgtXFx0XFx0XFx0XFx0XFx0c3RydWN0IGhzcl9wb3J0ICpwb3J0KTtcXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmg6MTk6c3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXFxubmV0L2hzci9oc3JfZm9yd2FyZC5oLTIwLVxcdFxcdFxcdFxcdFxcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjE1LjI0NzA4Mzg1OVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2NjM2MTg2NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSBjb2RlIHNuaXBwZXRzLCBzdW1tYXJpemVkIGluIHRoZSBmaXJzdCBwZXJzb24sIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqQXNzZXNzaW5nIEZ1bmN0aW9uIFNjb3BlKipcblxuQWxyaWdodCwgbGV0IG1lIHF1aWNrbHkgYW5hbHl6ZSB0aGVzZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuIEl0J3MgaW1tZWRpYXRlbHkgYXBwYXJlbnQgdGhhdCBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWVgIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVgIGFyZSBkZWNsYXJlZCBhcyBub24tc3RhdGljLiBUaGlzIGxpa2VseSBpbmRpY2F0ZXMgdGhhdCB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSBhY2Nlc3NpYmxlIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCwgcHJvYmFibHkgd2l0aGluIGEgbGFyZ2VyIG1vZHVsZSBvciBwcm9qZWN0LiBUaGV5IGFyZSBkZXNpZ25lZCB0byBiZSBjYWxsYWJsZSBmcm9tIGVsc2V3aGVyZSwgbGlrZWx5IGFzIHBhcnQgb2Ygc29tZSBwdWJsaWMgQVBJIG9yIGludGVyZmFjZS4gSG93ZXZlciwgdGhlIHVzZSBjYXNlIG9mIGBoc3JfeG1pdGAgaXMgc2xpZ2h0bHkgZGlmZmVyZW50LiBUaGUgYHN0YXRpY2Aga2V5d29yZCBzdWdnZXN0cyBpdCdzIHNjb3BlZCB0byB0aGUgY3VycmVudCBmaWxlIG9yIHRyYW5zbGF0aW9uIHVuaXQuIFNvLCBgaHNyX3htaXRgIGlzIGNsZWFybHkgYW4gaW50ZXJuYWwgZnVuY3Rpb24sIHByb2JhYmx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbm90IG1lYW50IGZvciBleHRlcm5hbCB1c2UuIEl0J3MgbGlrZWx5IGludm9sdmVkIGluIGhhbmRsaW5nIHNvbWUgZGF0YSB0cmFuc21pc3Npb24gcHJvY2VzcywgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBrZXB0IGhpZGRlbiwgcG90ZW50aWFsbHkgdG8gYWxsb3cgZm9yIGZ1dHVyZSBpbnRlcm5hbCBjaGFuZ2VzIHdpdGhvdXQgYnJlYWtpbmcgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiBVbmRlcnN0YW5kaW5nIHRoZSBzdGF0aWMvbm9uLXN0YXRpYyBkaXN0aW5jdGlvbiBpcyBjcnVjaWFsIGZvciBwcm9wZXIgbW9kdWxlIGRlc2lnbiBhbmQgY29kZSBtYWludGFpbmFiaWxpdHksIGVzcGVjaWFsbHkgZm9yIGFuIGV4cGVyaWVuY2VkIGRldmVsb3BlciBsaWtlIG15c2VsZi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODg0MiwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjE4LjkxMDcwNTM5OFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ0Nzc5NDI3OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJoc3JfeG1pdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaHNyL2hzcl9mb3J3YXJkLmM9NDMwPXN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTQ1MC1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM6NDUxOnN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy00NTItXFx0XFx0ICAgIHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmM9NTY2PXN0YXRpYyB2b2lkIGhzcl9mb3J3YXJkX2RvKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUpXFxuLS1cXG5uZXQvaHNyL2hzcl9mb3J3YXJkLmMtNjI3LVxcdFxcdH0gZWxzZSB7XFxubmV0L2hzci9oc3JfZm9yd2FyZC5jOjYyODpcXHRcXHRcXHRpZiAoIWhzcl94bWl0KHNrYiwgcG9ydCwgZnJhbWUpKVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy02MjktXFx0XFx0XFx0XFx0aWYgKHBvcnQtXFx1MDAzZXR5cGUgPT0gSFNSX1BUX1NMQVZFX0EgfHxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MjAuMzU4NTA2NDk3WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYyNzYyNDk2MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IGNvZGUgc3RydWN0dXJlLCBwcmVzZW50ZWQgYXMgaWYgaXQgd2VyZSBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEhTUiBUcmFuc21pc3Npb24gTG9naWMqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJJ20gc2VlaW5nLCBgaHNyX3htaXRgIGlzIGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0IG1lYW5zIGl0J3MgaW50ZXJuYWwgdG8gdGhpcyBjb21waWxhdGlvbiB1bml0LCBub3QgbWVhbnQgZm9yIGV4dGVybmFsIHVzZS4gSXQncyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGZ1bmN0aW9uIHdpdGhpbiB0aGUgc2FtZSBmaWxlLCB3aGljaCBpcyBgaHNyX2ZvcndhcmRfZG9gLiBPa2F5LCB0aGF0IGdpdmVzIG1lIGEgY2xlYXIgaWRlYSBvZiBpdHMgcHVycG9zZTogaXQncyBsaWtlbHkgcmVzcG9uc2libGUgZm9yIHRoZSBhY3R1YWwgKnRyYW5zbWlzc2lvbiogb2YgYSBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IpIGZyYW1lLCBsaWtlbHkgdGhlIGxvd2VyLWxldmVsIHNlbmRpbmcgZnVuY3Rpb24uXG5cbk5vdywgYGhzcl9mb3J3YXJkX2RvYCBpdHNlbGYgaXMgYWxzbyBzdGF0aWMuIFNvIGl0J3Mgc2ltaWxhcjsgYWxzbyBoaWRkZW4gYXdheSBmcm9tIGV4dGVybmFsIGNhbGxzLiBJdCBzZWVtcyBsaWtlIGl0J3MgdGhlIG5leHQgbGV2ZWwgdXAsIHRoZSBmdW5jdGlvbiB0aGF0ICpkb2VzKiB0aGUgSFNSIGZvcndhcmRpbmcsIGFuZCBJJ20gZ3Vlc3Npbmcgc29tZSBzb3J0IG9mIHByZS1wcm9jZXNzaW5nIGJlZm9yZSBpdCBoYW5kcyBpdCBvZmYgdG8gdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gZnVuY3Rpb24uIEFuZCB0aGUga2V5IGlzIHRoYXQgaXQncyBjYWxsZWQgZnJvbSBgaHNyX2ZvcndhcmRfc2tiYCwgc28gdGhpcyBtZWFucyB0aGF0IGFuIGluY29taW5nIFNLQiBpcyBnb2luZyB0byBnZXQgaGFuZGxlZCBoZXJlLlxuT2theSwgc28gdGhlIHdvcmtmbG93IGFwcGVhcnMgdG8gYmU6IGFuIGluY29taW5nIHBhY2tldCAoYHNrYmApIGdvZXMgdG8gYGhzcl9mb3J3YXJkX3NrYmAsIHdoaWNoIHRoZW4gdHJpZ2dlcnMgYGhzcl9mb3J3YXJkX2RvYCwgd2hpY2ggcHJlcHMgdGhlIGZyYW1lLCBhbmQgZmluYWxseSBjYWxscyBgaHNyX3htaXRgIHRvIHNlbmQgaXQgb3V0LiBUaGF0IHNldHVwIGluZGljYXRlcyBhIGRlbGliZXJhdGUgZW5jYXBzdWxhdGlvbiBvZiB0aGUgSFNSIGZvcndhcmRpbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHBvdGVudGlhbCBpbnRlcm5hbCBvcHRpbWl6YXRpb25zIG9yIGNoYW5nZXMgdG8gdGhlIGZvcndhcmRpbmcgbG9naWMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGV4dGVybmFsIGludGVyZmFjZS4gSXQncyBhIGNsZWFuIHdheSB0byBtYW5hZ2UgdGhlIHRyYW5zbWlzc2lvbiBwYXRoLlxuXG5TbywgaW4gc2hvcnQsIEknbSBpbmZlcnJpbmcgdGhpcyBmbG93OiBgaHNyX2ZvcndhcmRfc2tiYCAtXHUwMDNlIGBoc3JfZm9yd2FyZF9kb2AgLVx1MDAzZSBgaHNyX3htaXRgLiBFYWNoIHBpZWNlIGlzIG5lYXRseSB0dWNrZWQgYXdheSwgbGlrZWx5IGZvciBnb29kIGNvZGUgc3RydWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDExLCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MjYuNjM0NzU3OTU5WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDY4Njc5MDk2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhzcl9mb3J3YXJkX3NrYlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaHNyL2hzcl9kZXZpY2UuYz0yMjQ9c3RhdGljIG5ldGRldl90eF90IGhzcl9kZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbi0tXFxubmV0L2hzci9oc3JfZGV2aWNlLmMtMjM1LVxcdFxcdHNwaW5fbG9ja19iaChcXHUwMDI2aHNyLVxcdTAwM2VzZXFucl9sb2NrKTtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYzoyMzY6XFx0XFx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgbWFzdGVyKTtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy0yMzctXFx0XFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmhzci1cXHUwMDNlc2VxbnJfbG9jayk7XFxuLS1cXG5uZXQvaHNyL2hzcl9kZXZpY2UuYz0yOTM9c3RhdGljIHZvaWQgc2VuZF9oc3Jfc3VwZXJ2aXNpb25fZnJhbWUoc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxcbi0tXFxubmV0L2hzci9oc3JfZGV2aWNlLmMtMzYzLVxcbm5ldC9oc3IvaHNyX2RldmljZS5jOjM2NDpcXHRoc3JfZm9yd2FyZF9za2Ioc2tiLCBwb3J0KTtcXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy0zNjUtXFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmhzci1cXHUwMDNlc2VxbnJfbG9jayk7XFxuLS1cXG5uZXQvaHNyL2hzcl9kZXZpY2UuYz0zNjk9c3RhdGljIHZvaWQgc2VuZF9wcnBfc3VwZXJ2aXNpb25fZnJhbWUoc3RydWN0IGhzcl9wb3J0ICptYXN0ZXIsXFxuLS1cXG5uZXQvaHNyL2hzcl9kZXZpY2UuYy00MDQtXFxubmV0L2hzci9oc3JfZGV2aWNlLmM6NDA1OlxcdGhzcl9mb3J3YXJkX3NrYihza2IsIG1hc3Rlcik7XFxubmV0L2hzci9oc3JfZGV2aWNlLmMtNDA2LVxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZoc3ItXFx1MDAzZXNlcW5yX2xvY2spO1xcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jPTcyMz1zdGF0aWMgaW50IGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgaHNyX2ZyYW1lX2luZm8gKmZyYW1lLFxcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5jLTc4MC0vKiBNdXN0IGJlIGNhbGxlZCBob2xkaW5nIHJjdSByZWFkIGxvY2sgKGJlY2F1c2Ugb2YgdGhlIHBvcnQgcGFyYW1ldGVyKSAqL1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYzo3ODE6dm9pZCBoc3JfZm9yd2FyZF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0KVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuYy03ODIte1xcbi0tXFxubmV0L2hzci9oc3JfZm9yd2FyZC5oLTE1LVxcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaDoxNjp2b2lkIGhzcl9mb3J3YXJkX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaHNyX3BvcnQgKnBvcnQpO1xcbm5ldC9oc3IvaHNyX2ZvcndhcmQuaC0xNy1zdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcXG4tLVxcbm5ldC9oc3IvaHNyX3NsYXZlLmM9MjQ9c3RhdGljIHJ4X2hhbmRsZXJfcmVzdWx0X3QgaHNyX2hhbmRsZV9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpXFxuLS1cXG5uZXQvaHNyL2hzcl9zbGF2ZS5jLTgwLVxcdFxcdHNwaW5fbG9ja19iaChcXHUwMDI2aHNyLVxcdTAwM2VzZXFucl9sb2NrKTtcXG5uZXQvaHNyL2hzcl9zbGF2ZS5jOjgxOlxcdFxcdGhzcl9mb3J3YXJkX3NrYihza2IsIHBvcnQpO1xcbm5ldC9oc3IvaHNyX3NsYXZlLmMtODItXFx0XFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmhzci1cXHUwMDNlc2VxbnJfbG9jayk7XFxubmV0L2hzci9oc3Jfc2xhdmUuYy04My1cXHR9IGVsc2Uge1xcbm5ldC9oc3IvaHNyX3NsYXZlLmM6ODQ6XFx0XFx0aHNyX2ZvcndhcmRfc2tiKHNrYiwgcG9ydCk7XFxubmV0L2hzci9oc3Jfc2xhdmUuYy04NS1cXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjI4LjEwMzQ0NDAzNVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDI4NjE4NjAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OlxuXG4qKkZvY3VzaW5nIEluIG9uIHRoZSBIU1IgQ29kZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBIU1IgaW1wbGVtZW50YXRpb24uIFRoZSBgaHNyX2ZvcndhcmRfc2tiYCBmdW5jdGlvbiBpcyBub24tc3RhdGljLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gVGhhdCBtZWFucyBpdCdzIGxpa2VseSBjYWxsZWQgZnJvbSBzb21ld2hlcmUgb3V0c2lkZSB0aGUgaW1tZWRpYXRlIEhTUiBtb2R1bGUgaXRzZWxmLCBtYWtpbmcgaXQgYSBnb29kIGp1bXBpbmctb2ZmIHBvaW50IGZvciBhbmFseXNpcy4gSXQsIGFsb25nIHdpdGggYGhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lYCwgc2VlbSBsaWtlIGtleSBzeW1ib2xzIHRvIGNvbmNlbnRyYXRlIG9uLiBUaGV5J3JlIHByb2JhYmx5IGNvcmUgdG8gdGhlIHBhY2tldCBwcm9jZXNzaW5nIGFuZCB0YWdnaW5nLiBNeSBuZXh0IHN0ZXAgd2lsbCBiZSB0byBmaWd1cmUgb3V0IGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMgZm9yIEhTUi4gVW5kZXJzdGFuZGluZyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBvciBjb25kaXRpb25hbCBvbiBzb21lIG90aGVyIGZlYXR1cmUgYmVpbmcgZW5hYmxlZC4gVGhpcyBnaXZlcyBtZSBjb250ZXh0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDcxOCwiT3V0cHV0VG9rZW5zIjoxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjMyLjEzMjA2NTA4N1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUxNTYzMTc2MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgSFNSXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9oc3IvS2NvbmZpZy01LVxcbm5ldC9oc3IvS2NvbmZpZzo2OmNvbmZpZyBIU1JcXG5uZXQvaHNyL0tjb25maWctNy1cXHR0cmlzdGF0ZSBcXFwiSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3MgUmVkdW5kYW5jeSAoSFNSIFxcdTAwMjYgUFJQKVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6MzMuNjQ3NzAxNThaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzMxNzkxMDkxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKkFzc2Vzc2luZyB0aGUgTGFuZHNjYXBlKipcblxuT2theSwgaG9sZCBvbiBhIHNlY29uZC4gQmVmb3JlIEkgZGl2ZSB0b28gZGVlcCwgSSBuZWVkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIGRlcGVuZGVuY2llcyBpbnZvbHZlZCB3aXRoIEhTUi4gSSBjYW4ndCBqdXN0IGp1bXAgaW47IEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgb3RoZXIgY29tcG9uZW50cywgc3lzdGVtcywgb3IgZGF0YSBzb3VyY2VzIEhTUiByZWxpZXMgb24uIFdoYXQgYXJlIHRoZSBpbnB1dHM/IFdoYXQgb3RoZXIgc3lzdGVtcyBkb2VzIGl0IGludGVyZmFjZSB3aXRoPyBJZGVudGlmeWluZyB0aGVzZSBkZXBlbmRlbmNpZXMgaXMgY3J1Y2lhbCBmb3IgYW55IG1lYW5pbmdmdWwgYW5hbHlzaXMgb3IgdW5kZXJzdGFuZGluZy4gSXQgd2lsbCBkaWN0YXRlIHRoZSBzY29wZSBvZiBteSBpbnZlc3RpZ2F0aW9uIGFuZCBpbmZvcm0gdGhlIGRpcmVjdGlvbiBvZiBteSByZXNlYXJjaC4gVW5kZXJzdGFuZGluZyB0aGUgY29ubmVjdGlvbnMgaXMgZnVuZGFtZW50YWwgdG8gYXZvaWQgbWlzc2luZyBhbnkgcGllY2Ugb2YgdGhlIHB1enpsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEwNDQsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wOFQwMDo1MjozNi45NjU2MTU3MDVaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU4NTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9oc3IvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0I1xcbiAgIDM6XFx0IyBJRUMgNjI0MzktMyBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5XFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdGNvbmZpZyBIU1JcXG4gICA3OlxcdFxcdHRyaXN0YXRlIFxcXCJIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IChIU1IgXFx1MDAyNiBQUlApXFxcIlxcbiAgIDg6XFx0XFx0aGVscFxcbiAgIDk6XFx0XFx0ICBUaGlzIGVuYWJsZXMgSUVDIDYyNDM5IGRlZmluZWQgSGlnaC1hdmFpbGFiaWxpdHkgU2VhbWxlc3NcXG4gIDEwOlxcdFxcdCAgUmVkdW5kYW5jeSAoSFNSKSBhbmQgUGFyYWxsZWwgUmVkdW5kYW5jeSBQcm90b2NvbCAoUFJQKS5cXG4gIDExOlxcdFxcbiAgMTI6XFx0XFx0ICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlbiB5b3VyIExpbnV4IGJveCB3aWxsIGJlIGFibGUgdG8gYWN0IGFzIGFcXG4gIDEzOlxcdFxcdCAgREFOSCAoXFxcIkRvdWJseSBhdHRhY2hlZCBub2RlIGltcGxlbWVudGluZyBIU1JcXFwiKSBvciBEQU5QIChcXFwiRG91Ymx5XFxuICAxNDpcXHRcXHQgIGF0dGFjaGVkIG5vZGUgaW1wbGVtZW50aW5nIFBSUFxcXCIpLiBGb3IgdGhpcyB0byB3b3JrLCB5b3VyIExpbnV4IGJveFxcbiAgMTU6XFx0XFx0ICBuZWVkcyAoYXQgbGVhc3QpIHR3byBwaHlzaWNhbCBFdGhlcm5ldCBpbnRlcmZhY2VzLlxcbiAgMTY6XFx0XFxuICAxNzpcXHRcXHQgIEZvciBEQU5ILCBpdCBtdXN0IGJlIGNvbm5lY3RlZCBhcyBhIG5vZGUgaW4gYSByaW5nIG5ldHdvcmsgdG9nZXRoZXJcXG4gIDE4OlxcdFxcdCAgd2l0aCBvdGhlciBIU1IgY2FwYWJsZSBub2Rlcy4gQWxsIEV0aGVybmV0IGZyYW1lcyBzZW50IG92ZXIgdGhlIEhTUlxcbiAgMTk6XFx0XFx0ICBkZXZpY2Ugd2lsbCBiZSBzZW50IGluIGJvdGggZGlyZWN0aW9ucyBvbiB0aGUgcmluZyAob3ZlciBib3RoIHNsYXZlXFxuICAyMDpcXHRcXHQgIHBvcnRzKSwgZ2l2aW5nIGEgcmVkdW5kYW50LCBpbnN0YW50IGZhaWwtb3ZlciBuZXR3b3JrLiBFYWNoIEhTUiBub2RlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjM2Ljk2NTc3NzMyNVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2ODU4NTU4MDkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBIU1IgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCB0aGlzIHBhdGNoIGZvciB0aGUgSFNSIGRyaXZlci4gVGhlIGZpcnN0IHRoaW5nIEkgbm90ZSBpcyB0aGF0IGl0IGRvZXNuJ3Qgc2VlbSB0byBpbnRyb2R1Y2UgYW55IG5ldyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzIGdvb2QuIEkgbmVlZCB0byBiZSBlZmZpY2llbnQgaGVyZS5cblxuUmlnaHQsIGxldCdzIHNlZSB3aGF0IGVsc2Ugd2UncmUgZGVhbGluZyB3aXRoLiBUaGUgYWN0dWFsIGNvZGUgY2hhbmdlIGlzIGluIGBuZXQvaHNyL2hzcl9mb3J3YXJkLmNgLiBJIGFsc28gc2VlIGEgdGVzdCBzY3JpcHQsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hgLCB3aGljaCBzZWVtcyB0byBiZSB1c2luZyBgaXAgbGlua2AgdG8gc2V0IHVwIEhTUiBhbmQgUFJQIGludGVyZmFjZXMuIEludGVyZXN0aW5nLiBUaGUgY29uZmlnIHVzZWQgaW4gdGhlIHRlc3QgaXMganVzdCBgSFNSYCwgd2hpY2ggc2ltcGxpZmllcyB0aGluZ3MgYSBiaXQuXG5cbkkgaGFkIGEgcXVpY2sgbG9vayBhdCBgTkVUX0ZfSFdfSFNSX1RBR19JTlNgLCBidXQgaXQgbG9va3MgbGlrZSBqdXN0IGEgbmV0ZGV2IGZlYXR1cmUgZmxhZyBhbmQgZG9lc24ndCBhcHBlYXIgdG8gYmUgdGllZCB0byBhIHNwZWNpZmljIGNvbmZpZy4gU28sIHRoZSBvbmx5IHJlbGV2YW50IGNvbmZpZyBoZXJlIGlzIGluZGVlZCBgSFNSYC5cblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHRoZSByZWFzb25pbmcuIFRoaXMgcGF0Y2ggZml4ZXMgYSBidWcuIFRoZSBkcml2ZXIgY291bGQgY29ycnVwdCBTS0JzIG9yIHRoZWlyIGNsb25lcyBkdXJpbmcgcGVyLWVncmVzcyB3cml0ZXMsIGFuZCB0aGF0J3Mgbm90IGdvb2QsIG9mIGNvdXJzZS4gSXQgaW50cm9kdWNlcyBgaHNyX2Nsb25lX3ByaXZhdGUoKWAgdG8gZW5zdXJlIHNrYiBkYXRhIGlzIHByaXZhdGUgYmVmb3JlIG1vZGlmaWNhdGlvbi4gVGhhdCdzIGEgZ29vZCBhcHByb2FjaCB0byBhZGRyZXNzIHRoZSBzaGFyZWQgZGF0YSBpc3N1ZXMuIFRoZSBjaGFuZ2VzIGFyZSB3aXRoaW4gdGhlIGNvcmUgcGFja2V0IGZvcndhcmRpbmcgbG9naWMsIHNvIHRoZSBpbXBhY3QgaXMgcG90ZW50aWFsbHkgc2lnbmlmaWNhbnQuIFRoaXMgaXMgZGVmaW5pdGVseSByZWFjaGFibGUgY29kZSBhbmQgd29ydGggZnV6emluZy5cblxuSSd2ZSB0YWtlbiBhIHF1aWNrIGdsYW5jZSBhdCB0aGUgc3ltYm9scyBpbiBxdWVzdGlvbjogYGhzcl9mb3J3YXJkX3NrYmAsIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZWAsIGFuZCBgcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVgLiBKdXN0IG1ha2luZyBzdXJlLCBsZXQncyBxdWlja2x5IGNoZWNrIHdoZXRoZXIgYGhzcl9jbG9uZV9wcml2YXRlYCBpcyBzdGF0aWMgYW5kIGl0IGlzLiBBbmQgdGhlIG90aGVyIHR3byBhcmUgbm9uLXN0YXRpYy5cblxuT2theSwgSSdtIHNhdGlzZmllZC4gSSdsbCB1c2Ugc2V0LXJlc3VsdHMgdG8gcmV0dXJuIHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTU2MSwiT3V0cHV0VG9rZW5zIjoxMzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNTUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wOFQwMDo1Mjo0My44MjQzMzkxMTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjcyNTMxNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFNSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHNyX2ZvcndhcmRfc2tiXCIsXG4gICAgXCJoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZVwiLFxuICAgIFwicHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFNSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHNyX2ZvcndhcmRfc2tiXCIsXG4gICAgXCJoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZVwiLFxuICAgIFwicHJwX2NyZWF0ZV90YWdnZWRfZnJhbWVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgSFNSIGRyaXZlciB3aGVyZSBwZXItZWdyZXNzIHdyaXRlcyBjb3VsZCBjb3JydXB0IHRoZSBvcmlnaW5hbCBza2Igb3Igb3RoZXIgY2xvbmVzIG9mIGl0LiBJdCBpbnRyb2R1Y2VzIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCB0byBlbnN1cmUgc2tiIGRhdGEgaXMgcHJpdmF0ZSBiZWZvcmUgbXV0YXRpb24uIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHBhY2tldCBmb3J3YXJkaW5nIGxvZ2ljIGluIHRoZSBIU1IgZHJpdmVyLCB3aGljaCBpcyByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjQzLjkwMTA3MTk3MloiLCJTZXEiOjE5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM0MjAwMTI2MDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wOFQwMDo1Mjo0My45MDE2OTE4NjJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTM0MTkzODkwNzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWNhbCBidWcgd2hlcmUgc2hhcmVkIGBza2JgIGRhdGEgaXMgbXV0YXRlZCBieSBvbmUgZWdyZXNzIHBhdGgsIGNvcnJ1cHRpbmcgdGhlIGRhdGEgZm9yIG90aGVyIGNsb25lcyAoZS5nLiwgaW5jb3JyZWN0IExBTiBJRCBvciBNQUMgYWRkcmVzcykuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhlIGBza2JgIGRhdGEgYnVmZmVyIGlzIHByaXZhdGUgYmVmb3JlIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbXBsZXggc3RydWN0dXJlIGFsbG9jYXRpb25zIHRoYXQgbWlnaHQgbGVhdmUgZmllbGRzIHVuaW5pdGlhbGl6ZWQuIFRoZSBidWcgaXMgYSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBpc3N1ZSwgYW5kIHRoZSBmaXggY29ycmVjdGx5IHByaXZhdGl6ZXMgdGhlIGJ1ZmZlci4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZTsgS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxYzg2MGI0NDU0NmQ0NDI5NmVkOTFiY2M1ZDg3Nzk1ODlkNWUwYzgwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgOCAwMDo1MTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9oc3IvaHNyX2ZvcndhcmQuYyBiL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuaW5kZXggMDc3NDk4MWE2NWMxNi4uZWZjYmYzY2YyNmY5YiAxMDA2NDRcbi0tLSBhL25ldC9oc3IvaHNyX2ZvcndhcmQuY1xuKysrIGIvbmV0L2hzci9oc3JfZm9yd2FyZC5jXG5AQCAtMzI1LDggKzMyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmhzcl9maWxsX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHNrYjtcbiB9XG4gXG4tLyogSWYgdGhlIG9yaWdpbmFsIGZyYW1lIHdhcyBhbiBIU1IgdGFnZ2VkIGZyYW1lLCBqdXN0IGNsb25lIGl0IHRvIGJlIHNlbnRcbi0gKiB1bmNoYW5nZWQuIE90aGVyd2lzZSwgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5IHRhZ2dlZCBmb3IgJ3BvcnQnLlxuKy8qIENsb25lIGFuIHNrYiBhbmQgbWFrZSB0aGUgY2xvbmUncyBkYXRhIHByaXZhdGUsIHNvIHRoYXQgcGVyLWVncmVzc1xuKyAqIHdyaXRlcyBjYW5ub3QgY29ycnVwdCB0aGUgb3JpZ2luYWwgc2tiIG9yIG90aGVyIGNsb25lcyBvZiBpdC5cbisgKiBSZXR1cm5zIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuKyAqL1xuK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2Nsb25lX3ByaXZhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7XG4rXG4rXHRjbG9uZSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpO1xuK1x0aWYgKCFjbG9uZSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZiAoc2tiX2NvdyhjbG9uZSwgMCkpIHtcbitcdFx0a2ZyZWVfc2tiKGNsb25lKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXG4rXHRyZXR1cm4gY2xvbmU7XG4rfVxuK1xuKy8qIElmIHRoZSBvcmlnaW5hbCBmcmFtZSB3YXMgYW4gSFNSIHRhZ2dlZCBmcmFtZSwgcmV0dXJuIGEgcHJpdmF0ZSBjbG9uZVxuKyAqIG9mIGl0IHdpdGggdGhlIHBhdGggaWQgdXBkYXRlZCBmb3IgJ3BvcnQnLiBPdGhlcndpc2UsIHJldHVybiBhIHByaXZhdGVcbisgKiBjbG9uZSBmb3IgaGFyZHdhcmUgdGFnIGluc2VydGlvbiwgb3IgY3JlYXRlIGEgcHJpdmF0ZSBmcmFtZSBlc3BlY2lhbGx5XG4rICogdGFnZ2VkIGZvciAncG9ydCcuXG4gICovXG4gc3RydWN0IHNrX2J1ZmYgKmhzcl9jcmVhdGVfdGFnZ2VkX2ZyYW1lKHN0cnVjdCBoc3JfZnJhbWVfaW5mbyAqZnJhbWUsXG4gXHRcdFx0XHRcdHN0cnVjdCBoc3JfcG9ydCAqcG9ydClcbkBAIC0zMzYsMTQgKzM1NywxOCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdGludCBtb3ZlbGVuO1xuIFxuIFx0aWYgKGZyYW1lLVx1MDAzZXNrYl9oc3IpIHtcbi1cdFx0c3RydWN0IGhzcl9ldGhoZHIgKmhzcl9ldGhoZHIgPVxuLVx0XHRcdChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKGZyYW1lLVx1MDAzZXNrYl9oc3IpO1xuK1x0XHRzdHJ1Y3QgaHNyX2V0aGhkciAqaHNyX2V0aGhkcjtcbitcbitcdFx0c2tiID0gaHNyX2Nsb25lX3ByaXZhdGUoZnJhbWUtXHUwMDNlc2tiX2hzcik7XG4rXHRcdGlmICghc2tiKVxuK1x0XHRcdHJldHVybiBOVUxMO1xuIFxuIFx0XHQvKiBzZXQgdGhlIGxhbmUgaWQgcHJvcGVybHkgKi9cbitcdFx0aHNyX2V0aGhkciA9IChzdHJ1Y3QgaHNyX2V0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7XG4gXHRcdGhzcl9zZXRfcGF0aF9pZChmcmFtZSwgaHNyX2V0aGhkciwgcG9ydCk7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX2hzciwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBza2I7XG4gXHR9IGVsc2UgaWYgKHBvcnQtXHUwMDNlZGV2LVx1MDAzZWZlYXR1cmVzIFx1MDAyNiBORVRJRl9GX0hXX0hTUl9UQUdfSU5TKSB7XG4tXHRcdHJldHVybiBza2JfY2xvbmUoZnJhbWUtXHUwMDNlc2tiX3N0ZCwgR0ZQX0FUT01JQyk7XG4rXHRcdHJldHVybiBoc3JfY2xvbmVfcHJpdmF0ZShmcmFtZS1cdTAwM2Vza2Jfc3RkKTtcbiBcdH1cbiBcbiBcdC8qIENyZWF0ZSB0aGUgbmV3IHNrYiB3aXRoIGVub3VnaCBoZWFkcm9vbSB0byBmaXQgdGhlIEhTUiB0YWcgKi9cbkBAIC0zNzcsMTcgKzQwMiwyMyBAQCBzdHJ1Y3Qgc2tfYnVmZiAqcHJwX2NyZWF0ZV90YWdnZWRfZnJhbWUoc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSxcbiBcdHN0cnVjdCBza19idWZmICpza2I7XG4gXG4gXHRpZiAoZnJhbWUtXHUwMDNlc2tiX3BycCkge1xuLVx0XHRzdHJ1Y3QgcHJwX3JjdCAqdHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChmcmFtZS1cdTAwM2Vza2JfcHJwKTtcbitcdFx0c3RydWN0IHBycF9yY3QgKnRyYWlsZXI7XG4rXG4rXHRcdHNrYiA9IGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9wcnApO1xuK1x0XHRpZiAoIXNrYilcbitcdFx0XHRyZXR1cm4gTlVMTDtcbiBcbitcdFx0dHJhaWxlciA9IHNrYl9nZXRfUFJQX3JjdChza2IpO1xuIFx0XHRpZiAodHJhaWxlcikge1xuIFx0XHRcdHBycF9zZXRfbGFuX2lkKHRyYWlsZXIsIHBvcnQpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdFdBUk5fT05DRSghdHJhaWxlciwgXCJlcnJvcmVkIFBSUCBza2JcIik7XG4rXHRcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2JfcHJwLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIHNrYjtcbiBcdH0gZWxzZSBpZiAocG9ydC1cdTAwM2VkZXYtXHUwMDNlZmVhdHVyZXMgXHUwMDI2IE5FVElGX0ZfSFdfSFNSX1RBR19JTlMpIHtcbi1cdFx0cmV0dXJuIHNrYl9jbG9uZShmcmFtZS1cdTAwM2Vza2Jfc3RkLCBHRlBfQVRPTUlDKTtcbitcdFx0cmV0dXJuIGhzcl9jbG9uZV9wcml2YXRlKGZyYW1lLVx1MDAzZXNrYl9zdGQpO1xuIFx0fVxuIFxuIFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKGZyYW1lLVx1MDAzZXNrYl9zdGQsIHNrYl9oZWFkcm9vbShmcmFtZS1cdTAwM2Vza2Jfc3RkKSxcbkBAIC00MjAsNiArNDUxLDIyIEBAIHN0YXRpYyB2b2lkIGhzcl9kZWxpdmVyX21hc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuIHN0YXRpYyBpbnQgaHNyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhzcl9wb3J0ICpwb3J0LFxuIFx0XHQgICAgc3RydWN0IGhzcl9mcmFtZV9pbmZvICpmcmFtZSlcbiB7XG4rXHQvKiBBbiBpbnRlcmxpbmstYm91bmQgc2tiIGZyb20gZ2V0X3VudGFnZ2VkX2ZyYW1lKCkgY2FuIHN0aWxsIGFsaWFzXG4rXHQgKiBhbm90aGVyIGxpdmUgY29uc3VtZXI6IGZvciBtYXN0ZXItb3JpZ2luYXRlZCBmcmFtZXMgdGhlIGNsb25lXG4rXHQgKiBzaGFyZXMgdGhlIG9yaWdpbmFsIFRYIHNrYiAod2hpY2ggdGFwcyBvciB0aGUgVFggcGF0aCBtYXkgc3RpbGxcbitcdCAqIGhvbGQpOyBmb3IgcmluZyBmcmFtZXMgdGhlIG1hc3RlciBhbHNvIGNvbnN1bWVzIHRoZW0gd2hlbiB0aGV5XG4rXHQgKiBhcmUgZGVzdGluZWQgdG8gdGhlIGxvY2FsIG5vZGUgd2l0aG91dCBiZWluZyBleGNsdXNpdmUgdG8gaXQuXG4rXHQgKiBQcml2YXRpemUgYmVmb3JlIGFueSBhZGRyZXNzIG11dGF0aW9uLlxuK1x0ICovXG4rXHRpZiAocG9ydC1cdTAwM2V0eXBlID09IEhTUl9QVF9JTlRFUkxJTksgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGZyYW1lLVx1MDAzZXBvcnRfcmN2LVx1MDAzZXR5cGUgPT0gSFNSX1BUX01BU1RFUiB8fFxuK1x0ICAgICAoZnJhbWUtXHUwMDNlaXNfbG9jYWxfZGVzdCBcdTAwMjZcdTAwMjYgIWZyYW1lLVx1MDAzZWlzX2xvY2FsX2V4Y2x1c2l2ZSkpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHNrYl9jb3coc2tiLCAwKSkge1xuK1x0XHRmcmFtZS1cdTAwM2Vwb3J0X3Jjdi1cdTAwM2VkZXYtXHUwMDNlc3RhdHMucnhfZHJvcHBlZCsrO1xuK1x0XHRrZnJlZV9za2Ioc2tiKTtcbitcdFx0cmV0dXJuIE5FVF9YTUlUX0RST1A7XG4rXHR9XG4rXG4gXHRpZiAoZnJhbWUtXHUwMDNlcG9ydF9yY3YtXHUwMDNldHlwZSA9PSBIU1JfUFRfTUFTVEVSKSB7XG4gXHRcdGhzcl9hZGRyX3N1YnN0X2Rlc3QoZnJhbWUtXHUwMDNlbm9kZV9zcmMsIHNrYiwgcG9ydCk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2hzci9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9oc3IvTWFrZWZpbGVcbmluZGV4IDMxZmI5MzI2Y2Y1MzMuLjg3ZmUzNDk1MWI4YjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL01ha2VmaWxlXG5AQCAtNSw2ICs1LDcgQEAgdG9wX3NyY2RpciA9IC4uLy4uLy4uLy4uLy4uXG4gVEVTVF9QUk9HUyA6PSBcXFxuIFx0aHNyX3Bpbmcuc2ggXFxcbiBcdGhzcl9yZWRib3guc2ggXFxcbitcdGhzcl9zaGFyZWRfbXV0YXRpb24uc2ggXFxcbiBcdGxpbmtfZmF1bHRzLnNoIFxcXG4gXHRwcnBfcGluZy5zaCBcXFxuICMgZW5kIG9mIFRFU1RfUFJPR1NcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbm5ldyBmaWxlIG1vZGUgMTAwNzU1XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4wYjhiODc5MTE5MGQxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvaHNyL2hzcl9zaGFyZWRfbXV0YXRpb24uc2hcbkBAIC0wLDAgKzEsMjQyIEBAXG4rIyEvYmluL2Jhc2hcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI1xuKyMgVmVyaWZ5IHRoYXQgcGVyLWVncmVzcyBtdXRhdGlvbnMgb2Ygc2hhcmVkIHNrYiBkYXRhIGFyZSBwcml2YXRlOlxuKyNcbisjIEYyIChwYXRoL0xBTiBJRCk6IG9uIGFuIGFmZmVjdGVkIGtlcm5lbCB0aGUgc2Vjb25kIHNsYXZlJ3MgTEFOLUlEIHdyaXRlXG4rIyBsYW5kcyBpbiB0aGUgZmlyc3Qgc2xhdmUncyBzdGlsbC1xdWV1ZWQgY2xvbmU7IHdpdGggYSBuZXRlbSBkZWxheSBvblxuKyMgc2xhdmUgQSwgaW5qZWN0ZWQgZnJhbWVzIGxlYXZlIEEgY2FycnlpbmcgQidzIExBTiBJRC5cbisjXG4rIyBGMSAoUmVkQm94IHNvdXJjZSBNQUMpOiBvbiBhbiBhZmZlY3RlZCBrZXJuZWwgYW4gSFNSLXRhZ2dlZCBtdWx0aWNhc3RcbisjIGZyYW1lIHJlY2VpdmVkIG9uIGEgUmVkQm94IHNsYXZlIGlzIGNsb25lZCBmb3IgbWFzdGVyIGFuZCBpbnRlcmxpbmssXG4rIyBhbmQgdGhlIGludGVybGluaydzIFJlZEJveC1NQUMgcmV3cml0ZSBsYW5kcyBpbiB0aGUgbWFzdGVyIGNsb25lJ3NcbisjIGJ1ZmZlciwgc28gdGhlIGxvY2FsIHN0YWNrIHJlY2VpdmVzIHRoZSBSZWRCb3ggTUFDIGluc3RlYWQgb2YgdGhlXG4rIyBvcmlnaW5hdGluZyBub2RlJ3MgTUFDLlxuK1xuK2lwdjY9ZmFsc2Vcbitcbitzb3VyY2UgLi9oc3JfY29tbW9uLnNoXG4rXG4rRFVSPTVcbitcbityZXF1aXJlKClcbit7XG4rXHRjb21tYW5kIC12IFwiJDFcIiBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjEgXHUwMDI2XHUwMDI2IHJldHVybiAwXG4rXHRlY2hvIFwiU0tJUDogJDEgbm90IGF2YWlsYWJsZVwiXG4rXHRleGl0ICRrc2Z0X3NraXBcbit9XG4rXG4rcmVxdWlyZSBpcFxuK3JlcXVpcmUgdGNcbityZXF1aXJlIHB5dGhvbjNcbitcbit0cmFwIGNsZWFudXBfYWxsX25zIEVYSVRcbitcbisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjI6IExBTi1JRCBpc29sYXRpb25cbisjIFBSUCBEQU5QIChwcm90byAxKSwgQUZfUEFDS0VUIHByZS10YWdnZWQgaW5qZWN0aW9uLCBuZXRlbSBvbiBzbGF2ZSBBLlxuK3J1bl9mMigpXG4re1xuK1x0c2V0dXBfbnMgbnMgMlx1MDAzZS9kZXYvbnVsbCB8fCByZXR1cm4gJGtzZnRfc2tpcFxuK1x0bnN4KCkgeyBpcCBuZXRucyBleGVjIFwiJG5zXCIgXCIkQFwiOyB9XG4rXG4rXHQjIFByb2JlIHNjaF9uZXRlbSBpbnNpZGUgdGhlIGRpc3Bvc2FibGUgbmFtZXNwYWNlIG9ubHkuXG4rXHRpZiAhIG5zeCB0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgMW1zIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IHNjaF9uZXRlbSBub3QgYXZhaWxhYmxlXCJcbitcdFx0cmV0dXJuICRrc2Z0X3NraXBcbitcdGZpXG4rXHRuc3ggdGMgcWRpc2MgZGVsIGRldiBsbyByb290IDJcdTAwM2UvZGV2L251bGxcbitcbitcdCMgQ2FwYWJpbGl0eSBwcm9iZXMgZW5kIGhlcmU7IHNldHVwIG9yIHJ1bnRpbWUgZmFpbHVyZSBiZWxvdyBpcyBGQUlMLlxuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkFwIHZCcDsgZG9cbitcdFx0bnN4IGlwIGxpbmsgc2V0IFwiJGlcIiB1cCB8fCB7IGVjaG8gXCJGQUlMOiAkaSB1cFwiOyByZXR1cm4gMTsgfVxuK1x0ZG9uZVxuK1x0aWYgISBuc3ggaXAgbGluayBhZGQgbmFtZSBwcnAwIHR5cGUgaHNyIHNsYXZlMSB2QSBzbGF2ZTIgdkIgXFxcbitcdFx0c3VwZXJ2aXNpb24gNDUgcHJvdG8gMSAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4rXHRcdGVjaG8gXCJTS0lQOiBIU1IvUFJQIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWxcIlxuK1x0XHRyZXR1cm4gJGtzZnRfc2tpcFxuK1x0ZmlcbitcdG5zeCBpcCBsaW5rIHNldCBwcnAwIHVwIHx8IHsgZWNobyBcIkZBSUw6IHBycDAgdXBcIjsgcmV0dXJuIDE7IH1cbitcdG5zeCB0YyBxZGlzYyBhZGQgZGV2IHZBIHJvb3QgbmV0ZW0gZGVsYXkgMjAwbXMgfHxcbitcdFx0eyBlY2hvIFwiRkFJTDogbmV0ZW1cIjsgcmV0dXJuIDE7IH1cbitcbitcdG5zeCBweXRob24zIC9kZXYvc3RkaW4gXCIkRFVSXCIgXHUwMDNjXHUwMDNjJ1BZRjInXG4raW1wb3J0IHNvY2tldCwgc3RydWN0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK2R1ciA9IGludChzeXMuYXJndlsxXSlcbitkZWYgbGFuaWQocGt0KTpcbisgICAgaWYgbGVuKHBrdCkgXHUwMDNjIDIwIG9yIHBrdFstMjpdICE9IGJcIlxceDg4XFx4ZmJcIjpcbisgICAgICAgIHJldHVybiBOb25lXG4rICAgIHJldHVybiAocGt0Wy00XSBcdTAwM2VcdTAwM2UgNCkgXHUwMDI2IDB4RlxuK1xuK1NSQyA9IGJ5dGVzLmZyb21oZXgob3BlbihcIi9zeXMvY2xhc3MvbmV0L3BycDAvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rRFNUID0gYnl0ZXMuZnJvbWhleChcIjAyYWFiYmNjZGQwMVwiKVxuK1BBWSA9IGJ5dGVzKHJhbmdlKDQ2KSlcbityY3QwID0gc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDApICsgc3RydWN0LnBhY2soXCJcdTAwM2VIXCIsIDUyIFx1MDAyNiAweDBGRkYpICsgYlwiXFx4ODhcXHhmYlwiXG4rZnJhbWUgPSBEU1QgKyBTUkMgKyBiXCJcXHgwOFxceDAwXCIgKyBQQVkgKyByY3QwXG4rXG4rdHggPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyk7IHR4LmJpbmQoKFwicHJwMFwiLCAwKSlcbitzQSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc0EuYmluZCgoXCJ2QXBcIiwgMCkpXG4rc0IgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9QQUNLRVQsIHNvY2tldC5TT0NLX1JBVyxcbisgICAgICAgIHNvY2tldC5udG9ocygweDAwMDMpKVxuK3NCLmJpbmQoKFwidkJwXCIsIDApKVxuK3NBLnNldGJsb2NraW5nKEZhbHNlKTsgc0Iuc2V0YmxvY2tpbmcoRmFsc2UpXG4rXG4rYSwgYiA9IFtdLCBbXVxuK1xuK2RlZiBtYXRjaChwa3QpOlxuKyAgICByZXR1cm4gKHBrdFs6Nl0gPT0gRFNUIGFuZCBwa3RbNjoxMl0gPT0gU1JDXG4rICAgICAgICAgICAgYW5kIHBrdFsxMjoxNF0gPT0gYlwiXFx4MDhcXHgwMFwiIGFuZCBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gPT0gUEFZKVxuK1xuK2RlZiBkcmFpbih0aW1lb3V0KTpcbisgICAgd2FpdCA9IHRpbWVvdXRcbisgICAgd2hpbGUgVHJ1ZTpcbisgICAgICAgIHIsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzQSwgc0JdLCBbXSwgW10sIHdhaXQpXG4rICAgICAgICBpZiBub3QgcjpcbisgICAgICAgICAgICByZXR1cm5cbisgICAgICAgIGZvciBzIGluIHI6XG4rICAgICAgICAgICAgcGt0ID0gcy5yZWN2KDY1NTM1KVxuKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaChwa3QpOlxuKyAgICAgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgICAgIGxpZCA9IGxhbmlkKHBrdClcbisgICAgICAgICAgICBpZiBsaWQgaXMgbm90IE5vbmU6XG4rICAgICAgICAgICAgICAgIChhIGlmIHMgaXMgc0EgZWxzZSBiKS5hcHBlbmQobGlkKVxuKyAgICAgICAgd2FpdCA9IDBcbitcbisjIERyYWluIHdoaWxlIHNlbmRpbmcgc28gdGhlIGJ1cnN0IGNhbm5vdCBvdmVyZmxvdyB0aGUgY2FwdHVyZSBzb2NrZXRzJ1xuKyMgcmVjZWl2ZSBidWZmZXJzOyB0aGUgbmV0ZW0tZGVsYXllZCBBLXNpZGUgZnJhbWVzIGFycml2ZSBhZnRlcndhcmRzIGFuZFxuKyMgYXJlIGNvbGxlY3RlZCBiZWxvdy5cbitmb3IgXyBpbiByYW5nZSgyMDApOlxuKyAgICB0eC5zZW5kKGZyYW1lKVxuKyAgICBkcmFpbigwKVxuKyAgICB0aW1lLnNsZWVwKDAuMDAxKVxuK1xuK2VuZCA9IHRpbWUudGltZSgpICsgZHVyXG4rd2hpbGUgdGltZS50aW1lKCkgXHUwMDNjIGVuZDpcbisgICAgZHJhaW4oMC4zKVxuK1xuK3ByaW50KFwiQS1zaWRlIGNvdW50PSVkIGxhbiBpZHM9JXNcIiAlIChsZW4oYSksIHNvcnRlZChzZXQoYSkpKSlcbitwcmludChcIkItc2lkZSBjb3VudD0lZCBsYW4gaWRzPSVzXCIgJSAobGVuKGIpLCBzb3J0ZWQoc2V0KGIpKSkpXG4raWYgbGVuKGEpIFx1MDAzYyAxNTAgb3IgbGVuKGIpIFx1MDAzYyAxNTA6XG4rICAgIHByaW50KFwiRkFJTDogdG9vIGZldyBpbmplY3RlZCBmcmFtZXMgY2FwdHVyZWQgKEE9JWQgQj0lZCwgc2VudCAyMDApXCJcbisgICAgICAgICAgJSAobGVuKGEpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK2JhZF9hID0gW3ggZm9yIHggaW4gYSBpZiAoeCBcdTAwMjYgMSkgIT0gMF1cbitiYWRfYiA9IFt4IGZvciB4IGluIGIgaWYgKHggXHUwMDI2IDEpICE9IDFdXG4raWYgYmFkX2Egb3IgYmFkX2I6XG4rICAgIHByaW50KFwiRkFJTDogc2hhcmVkLW11dGF0aW9uIGNvcnJ1cHRpb24gLSBBOiAlZC8lZCB3cm9uZy1sYW4sXCJcbisgICAgICAgICAgXCIgQjogJWQvJWQgd3JvbmctbGFuXCJcbisgICAgICAgICAgJSAobGVuKGJhZF9hKSwgbGVuKGEpLCBsZW4oYmFkX2IpLCBsZW4oYikpKVxuKyAgICBzeXMuZXhpdCgxKVxuK3ByaW50KFwiUEFTUzogcGVyLWVncmVzcyBMQU4gSURzIGlzb2xhdGVkIChBIGFsbCBiaXQwPTAsIEIgYWxsIGJpdDA9MSlcIilcbitzeXMuZXhpdCgwKVxuK1BZRjJcbit9XG4rXG4rIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRjE6IFJlZEJveCBzb3VyY2UtTUFDIHByaXZhY3lcbisjIEhTUiBSZWRCb3ggKHByb3RvIDApLCB0YWdnZWQgbXVsdGljYXN0IGZyb20gYSBzbGF2ZTogbWFzdGVyIG11c3Qga2VlcFxuKyMgdGhlIG5vZGUgTUFDLCBpbnRlcmxpbmsgbXVzdCBjYXJyeSB0aGUgUmVkQm94IE1BQy5cbitydW5fZjEoKVxuK3tcbitcdHNldHVwX25zIG5zIDJcdTAwM2UvZGV2L251bGwgfHwgcmV0dXJuICRrc2Z0X3NraXBcbitcdG5zeCgpIHsgaXAgbmV0bnMgZXhlYyBcIiRuc1wiIFwiJEBcIjsgfVxuK1xuK1x0bnN4IGlwIGxpbmsgYWRkIHZBIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkFwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQVwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZCIHR5cGUgdmV0aCBwZWVyIG5hbWUgdkJwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggQlwiOyByZXR1cm4gMTsgfVxuK1x0bnN4IGlwIGxpbmsgYWRkIHZJIHR5cGUgdmV0aCBwZWVyIG5hbWUgdklwIHx8XG4rXHRcdHsgZWNobyBcIkZBSUw6IHZldGggSVwiOyByZXR1cm4gMTsgfVxuK1x0Zm9yIGkgaW4gdkEgdkIgdkkgdkFwIHZCcCB2SXA7IGRvXG4rXHRcdG5zeCBpcCBsaW5rIHNldCBcIiRpXCIgdXAgfHwgeyBlY2hvIFwiRkFJTDogJGkgdXBcIjsgcmV0dXJuIDE7IH1cbitcdGRvbmVcbitcdGlmICEgbnN4IGlwIGxpbmsgYWRkIG5hbWUgaHNyMCB0eXBlIGhzciBzbGF2ZTEgdkEgc2xhdmUyIHZCIFxcXG4rXHRcdGludGVybGluayB2SSBzdXBlcnZpc2lvbiA0NSBwcm90byAwIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbitcdFx0ZWNobyBcIlNLSVA6IEhTUiBSZWRCb3ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFwiXG4rXHRcdHJldHVybiAka3NmdF9za2lwXG4rXHRmaVxuK1x0bnN4IGlwIGxpbmsgc2V0IGhzcjAgdXAgfHwgeyBlY2hvIFwiRkFJTDogaHNyMCB1cFwiOyByZXR1cm4gMTsgfVxuK1xuK1x0bnN4IHB5dGhvbjMgL2Rldi9zdGRpbiBcdTAwM2NcdTAwM2MnUFlGMSdcbitpbXBvcnQgc29ja2V0LCBzZWxlY3QsIHN5cywgdGltZVxuK1xuK05PREUgID0gYnl0ZXMuZnJvbWhleChcIjAyMTEyMjMzNDQ1NVwiKVxuK01DQVNUID0gYnl0ZXMuZnJvbWhleChcIjAxMDA1ZTAwMDAwMVwiKVxuK1JCICAgID0gYnl0ZXMuZnJvbWhleChvcGVuKFwiL3N5cy9jbGFzcy9uZXQvdkkvYWRkcmVzc1wiKS5yZWFkKCkucmVwbGFjZShcIjpcIiwgXCJcIikpXG4rUEFZICAgPSBieXRlcyhyYW5nZSg0NikpXG4rXG4rZGVmIGZyYW1lKHNlcSk6XG4rICAgICMgTFNEVSBzaXplID0gcGF5bG9hZCArIEhTUiB0YWcgKEhTUl9ITEVOKSwgYXMgaHNyX2ZpbGxfdGFnKCkgY29tcHV0ZXMgaXRcbisgICAgdGFnID0gKCgoMSBcdTAwM2NcdTAwM2MgMTIpIHwgKGxlbihQQVkpICsgNikpLnRvX2J5dGVzKDIsIFwiYmlnXCIpXG4rICAgICAgICAgICArIHNlcS50b19ieXRlcygyLCBcImJpZ1wiKSArIGJcIlxceDA4XFx4MDBcIilcbisgICAgcmV0dXJuIE1DQVNUICsgTk9ERSArIGJcIlxceDg5XFx4MmZcIiArIHRhZyArIFBBWVxuK1xuK3R4ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcpOyB0eC5iaW5kKChcInZBcFwiLCAwKSlcbitzbSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1BBQ0tFVCwgc29ja2V0LlNPQ0tfUkFXLFxuKyAgICAgICAgc29ja2V0Lm50b2hzKDB4MDAwMykpXG4rc20uYmluZCgoXCJoc3IwXCIsIDApKVxuK3NpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfUEFDS0VULCBzb2NrZXQuU09DS19SQVcsXG4rICAgICAgICBzb2NrZXQubnRvaHMoMHgwMDAzKSlcbitzaS5iaW5kKChcInZJcFwiLCAwKSlcbitzbS5zZXRibG9ja2luZyhGYWxzZSk7IHNpLnNldGJsb2NraW5nKEZhbHNlKVxuK1xuK2ZvciBpIGluIHJhbmdlKDMpOlxuKyAgICB0eC5zZW5kKGZyYW1lKGkgKyAxKSk7IHRpbWUuc2xlZXAoMC4wNSlcbitcbittX3NyYyA9IGlfc3JjID0gTm9uZVxuK2VuZCA9IHRpbWUudGltZSgpICsgNFxuK3doaWxlIHRpbWUudGltZSgpIFx1MDAzYyBlbmQgYW5kIChtX3NyYyBpcyBOb25lIG9yIGlfc3JjIGlzIE5vbmUpOlxuKyAgICByLCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc20sIHNpXSwgW10sIFtdLCAwLjMpXG4rICAgIGZvciBzIGluIHI6XG4rICAgICAgICBwa3QgPSBzLnJlY3YoNjU1MzUpXG4rICAgICAgICAjIGV4YWN0IGZsb3c6IGRzdCwgcG9zdC1zdHJpcCBFdGhlclR5cGUsIGV4YWN0IHBheWxvYWQsIG1pbiBsZW5ndGg7XG4rICAgICAgICAjIGhfc291cmNlIGlzIHRoZSBhc3NlcnRlZCB2YWx1ZSBhbmQgbXVzdCBOT1QgYmUgZmlsdGVyZWQgb25cbisgICAgICAgIGlmIChsZW4ocGt0KSBcdTAwM2MgNjAgb3IgcGt0Wzo2XSAhPSBNQ0FTVCBvciBwa3RbMTI6MTRdICE9IGJcIlxceDA4XFx4MDBcIlxuKyAgICAgICAgICAgICAgICBvciBwa3RbMTQ6MTQgKyBsZW4oUEFZKV0gIT0gUEFZKTpcbisgICAgICAgICAgICBjb250aW51ZVxuKyAgICAgICAgaWYgcyBpcyBzbSBhbmQgbV9zcmMgaXMgTm9uZTpcbisgICAgICAgICAgICBtX3NyYyA9IHBrdFs2OjEyXVxuKyAgICAgICAgZWxpZiBzIGlzIHNpIGFuZCBpX3NyYyBpcyBOb25lOlxuKyAgICAgICAgICAgIGlfc3JjID0gcGt0WzY6MTJdXG4rXG4rcHJpbnQoXCJtYXN0ZXIgaF9zb3VyY2UgICAgPVwiLCBtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIE5vbmUpXG4rcHJpbnQoXCJub2RlIE1BQyAgICAgICAgICAgPVwiLCBOT0RFLmhleCgpKVxuK3ByaW50KFwiaW50ZXJsaW5rIGhfc291cmNlID1cIiwgaV9zcmMuaGV4KCkgaWYgaV9zcmMgZWxzZSBOb25lKVxuK3ByaW50KFwicmVkYm94IE1BQyAgICAgICAgID1cIiwgUkIuaGV4KCkpXG4raWYgaV9zcmMgIT0gUkI6XG4rICAgIHByaW50KFwiRkFJTDogaW50ZXJsaW5rIGRpZCBub3QgY2FycnkgdGhlIFJlZEJveCBNQUNcIilcbisgICAgc3lzLmV4aXQoMSlcbitpZiBtX3NyYyAhPSBOT0RFOlxuKyAgICBwcmludChcIkZBSUw6IG1hc3RlciByZWNlaXZlZCAlcyBpbnN0ZWFkIG9mIHRoZSBub2RlIE1BQyBcIlxuKyAgICAgICAgICBcIihzaGFyZWQtbXV0YXRpb24gY29ycnVwdGlvbilcIlxuKyAgICAgICAgICAlIChtX3NyYy5oZXgoKSBpZiBtX3NyYyBlbHNlIFwibm90aGluZ1wiKSlcbisgICAgc3lzLmV4aXQoMSlcbitwcmludChcIlBBU1M6IG1hc3RlciBrZXB0IG5vZGUgTUFDLCBpbnRlcmxpbmsga2VwdCBSZWRCb3ggTUFDXCIpXG4rc3lzLmV4aXQoMClcbitQWUYxXG4rfVxuK1xuK3JjPTBcbitcbitydW5fZjJcbityZXQ9JD9cbityYz0kKGtzZnRfc3RhdHVzX21lcmdlIFwiJHJjXCIgXCIkcmV0XCIpXG4rXG4rcnVuX2YxXG4rcmV0PSQ/XG4rcmM9JChrc2Z0X3N0YXR1c19tZXJnZSBcIiRyY1wiIFwiJHJldFwiKVxuK1xuK2lmIFsgXCIkcmNcIiAtZXEgMCBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gKEYxK0YyKSBbIE9LIF1cIlxuK2VsaWYgWyBcIiRyY1wiIC1lcSBcIiRrc2Z0X3NraXBcIiBdOyB0aGVuXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogc3VidGVzdHMgc2tpcHBlZCAoY2FwYWJpbGl0aWVzIG1pc3NpbmcpXCJcbitlbHNlXG4rXHRlY2hvIFwiaHNyX3NoYXJlZF9tdXRhdGlvbjogcGVyLWVncmVzcyBtdXRhdGlvbiBpc29sYXRpb24gWyBGQUlMIF1cIiBcXFxuK1x0XHRcInJjPSRyY1wiIDFcdTAwM2VcdTAwMjYyXG4rZmlcbitleGl0IFwiJHJjXCJcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA4VDAwOjUyOjQzLjkwMTY5Mjk2MloiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzQxOTM3MDEwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEhTUiBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBvdmVyIHRoaXMgcGF0Y2ggdGhhdCBtb2RpZmllcyBgbmV0L2hzci9oc3JfZm9yd2FyZC5jYC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQncyBkZXNpZ25lZCB0byBmaXggZGF0YSBjb3JydXB0aW9uIHN0ZW1taW5nIGZyb20gc2hhcmVkIGBza2JgIGRhdGEgaW4gdGhlIEhTUiBtb2R1bGUsIHNwZWNpZmljYWxseSB3aGVuIGhhbmRsaW5nIG11bHRpcGxlIGVncmVzcyBwYXRocy4gVGhlIGNvcmUgb2YgdGhlIGZpeCByZXZvbHZlcyBhcm91bmQgcHJpdmF0aXppbmcgdGhlIGBza2JgIGRhdGEgYmVmb3JlIG1vZGlmaWNhdGlvbiB0byBhdm9pZCBjcm9zcy10YWxrIGJldHdlZW4gZGlmZmVyZW50IGNsb25lcywgd2hpY2ggbWFrZXMgc2Vuc2UuXG5cblRoZSBwcmltYXJ5IGNoYW5nZXMgaW52b2x2ZSB0aGUgaW50cm9kdWN0aW9uIG9mIGBoc3JfY2xvbmVfcHJpdmF0ZSgpYCwgd2hpY2ggY29tYmluZXMgYHNrYl9jbG9uZSgpYCBhbmQgYHNrYl9jb3coKWAuIFRoaXMgbmV3IGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSByYXcgYHNrYl9jbG9uZSgpYCBjYWxscyBpbiBgaHNyX2NyZWF0ZV90YWdnZWRfZnJhbWUoKWAgYW5kIGBwcnBfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYC4gQWRkaXRpb25hbGx5LCBhIGNoZWNrIGhhcyBiZWVuIGFkZGVkIGluIGBoc3JfeG1pdCgpYCB0byB1c2UgYHNrYl9jb3coKWAgZm9yIGludGVybGluay1ib3VuZCBTS0JzLlxuXG5NeSBwcmltYXJ5IGNvbmNlcm4sIGdpdmVuIHRoZSBjb250ZXh0LCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBleHBvc2VzIG9yIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBFc3NlbnRpYWxseSwgd2UncmUgdHJ5aW5nIHRvIHByZXZlbnQgZGF0YSBjb3JydXB0aW9uLiBUaGUgc2hhcmVkIGRhdGEgaXNzdWUgaXMgdGhlIHByb2JsZW0uIFdoZW4gbXVsdGlwbGUgZWdyZXNzIHBhdGhzIG11dGF0ZSBza2IgZGF0YSwgdGhleSBjaGFuZ2Ugc2hhcmVkIGRhdGEsIHdoaWNoLCBpZiBub3QgZG9uZSBjb3JyZWN0bHksIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBvdGhlciBjbG9uZXMuIFRoZSBmaXggdXNlcyBgc2tiX2NvdygpYCB0byBlbnN1cmUgdGhhdCB0aGUgc2tiIGhhcyBwcml2YXRlIGRhdGEuXG5cbk15IGFuYWx5c2lzIGZvY3VzZXMgb24gdGhpcyBwb2ludC4gYHNrYl9jb3coc2tiLCAwKWAgaXMgY3JpdGljYWwgaGVyZS4gSXQgZW5zdXJlcyB0aGF0IHRoZSBTS0IgZWl0aGVyIGFscmVhZHkgaGFzIGEgcHJpdmF0ZSBoZWFkIChhbmQgZGF0YSksIG9yIHdpbGwgcmVhbGxvY2F0ZSB0aGVtLiBJbXBvcnRhbnRseSwgdGhpcyByZWFsbG9jYXRpb24gKmNvcGllcyogZXhpc3RpbmcgZGF0YSwgaXQgZG9lc24ndCBsZWF2ZSBhbnkgcGFydCBvZiB0aGUgYnVmZmVyIHVuaW5pdGlhbGl6ZWQuIFdlJ3JlIGRlYWxpbmcgd2l0aCBhIGxvZ2ljYWwgYnVnIOKAkyBkYXRhIGNvcnJ1cHRpb24gZHVlIHRvIGluY29ycmVjdCBzaGFyaW5nIOKAkyBub3QgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCBvciBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhay4gVGhlIFwiY29ycnVwdGVkXCIgZGF0YSBpcyB2YWxpZCBwYWNrZXQgZGF0YS4gSXQncyBqdXN0ICppbmNvcnJlY3QqIGZvciBhIHNwZWNpZmljIGNsb25lLiBUaGVyZSdzIG5vIHNjZW5hcmlvIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy5cblxuSSd2ZSBkb3VibGUtY2hlY2tlZCB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgYHNrYl9jb3coKWAuIEl0IHVsdGltYXRlbHkgY2FsbHMgYF9fc2tiX2NvdygpYCwgd2hpY2ggdGhlbiB1c2VzIGBwc2tiX2V4cGFuZF9oZWFkYCBpZiBhIHJlYWxsb2NhdGlvbiBpcyBuZWVkZWQuIFdoaWxlIHRoZSBuZXdseSBhbGxvY2F0ZWQgaGVhZHJvb20vdGFpbHJvb20gaW4gYHBza2JfZXhwYW5kX2hlYWRgICppcyogdW5pbml0aWFsaXplZCwgaXQgaXMgKm91dHNpZGUqIHRoZSBgc2tiLVx1MDAzZWRhdGFgIHRvIGBza2ItXHUwMDNldGFpbGAgcmFuZ2UuIFRodXMsIGl0J3Mgbm90IHJlYWQgdW5sZXNzIGV4cGxpY2l0bHkgcHVzaGVkL3B1dCwgd2hpY2ggaXMgc3RhbmRhcmQgc2tiIGJlaGF2aW9yLlxuXG5UaGUgcGF0Y2gncyBjaGFuZ2VzIGNhbiBiZSBzdW1tYXJpemVkIGFzOlxuXG4xLiAgYGhzcl9jbG9uZV9wcml2YXRlKClgOiBDbG9uZXMgYW5kIHByaXZhdGl6ZXMgYW4gc2tiLlxuMi4gIGBoc3JfY3JlYXRlX3RhZ2dlZF9mcmFtZSgpYCBhbmQgYHBycF9jcmVhdGVfdGFnZ2VkX2ZyYW1lKClgOiBSZXBsYWNlIGNsb25lIHdpdGggcHJpdmF0ZSBjbG9uZS5cbjMuICBgaHNyX3htaXQoKWA6ICBQcml2YXRpemVzIGZvciBpbnRlcmxpbmsgcG9ydHMgYmVmb3JlIG11dGF0aW9uLlxuXG5Ob25lIG9mIHRoZXNlIGNoYW5nZXMgKmludHJvZHVjZSogdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGV5IGFyZSBhbGwgYWJvdXQgcHJvcGVybHkgcHJpdmF0aXppbmcgdGhlIHNrYiBkYXRhIHRvIHByZXZlbnQgdW5pbnRlbmRlZCBkYXRhIHNoYXJpbmcgYW5kIG1vZGlmaWNhdGlvbiwgYSBjbGFzc2ljIHNoYXJlZC1tdXRhYmxlLXN0YXRlIGJ1Zy4gVGhlIHBhdGNoIGRvZXNuJ3QgaW52b2x2ZSBhbnkgY29tcGxleCBzdHJ1Y3R1cmUgYWxsb2NhdGlvbnMgdGhhdCBtaWdodCBsZWF2ZSBmaWVsZHMgdW5pbml0aWFsaXplZC4gU3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIG1lbW9yeSBzYWZldHkgaGVyZS4gS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYXMgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlcmVmb3JlLCB0aGUgXCJOZWVkc0tNU0FOXCIgZmxhZyBzaG91bGQgYmUgYGZhbHNlYC4gVGhlIHJlYXNvbmluZyBpcyB0aGF0IHRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljYWwgYnVnIHJlbGF0ZWQgdG8gc2hhcmVkIGRhdGEgY29ycnVwdGlvbiB3aXRoIGBza2JfY293KClgIGFuZCB0aGlzIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlza3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeS4gSSdtIGNvbmZpZGVudCBhYm91dCB0aGlzLiBJJ2xsIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNhbGwgYW5kIG1hcmsgaXQgYXMgc3VjaC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwMCwiT3V0cHV0VG9rZW5zIjoxNjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDI3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDhUMDA6NTI6NTcuMzIxMDY2MDMzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM2MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljYWwgYnVnIHdoZXJlIHNoYXJlZCBgc2tiYCBkYXRhIGlzIG11dGF0ZWQgYnkgb25lIGVncmVzcyBwYXRoLCBjb3JydXB0aW5nIHRoZSBkYXRhIGZvciBvdGhlciBjbG9uZXMgKGUuZy4sIGluY29ycmVjdCBMQU4gSUQgb3IgTUFDIGFkZHJlc3MpLiBUaGUgZml4IHVzZXMgYHNrYl9jb3coKWAgdG8gZW5zdXJlIHRoZSBgc2tiYCBkYXRhIGJ1ZmZlciBpcyBwcml2YXRlIGJlZm9yZSBhbnkgbW9kaWZpY2F0aW9ucyBhcmUgbWFkZS4gVGhpcyBkb2VzIG5vdCBpbnZvbHZlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciBjb21wbGV4IHN0cnVjdHVyZSBhbGxvY2F0aW9ucyB0aGF0IG1pZ2h0IGxlYXZlIGZpZWxkcyB1bmluaXRpYWxpemVkLiBUaGUgYnVnIGlzIGEgc2hhcmVkIG11dGFibGUgc3RhdGUgaXNzdWUsIGFuZCB0aGUgZml4IGNvcnJlY3RseSBwcml2YXRpemVzIHRoZSBidWZmZXIuIFN0YW5kYXJkIHRlc3RpbmcgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50IGZvciBtZW1vcnkgc2FmZXR5IGhlcmU7IEtNU0FOIGlzIG5vdCBhcHBsaWNhYmxlIGFzIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpY2FsIGJ1ZyB3aGVyZSBzaGFyZWQgYHNrYmAgZGF0YSBpcyBtdXRhdGVkIGJ5IG9uZSBlZ3Jlc3MgcGF0aCwgY29ycnVwdGluZyB0aGUgZGF0YSBmb3Igb3RoZXIgY2xvbmVzIChlLmcuLCBpbmNvcnJlY3QgTEFOIElEIG9yIE1BQyBhZGRyZXNzKS4gVGhlIGZpeCB1c2VzIGBza2JfY293KClgIHRvIGVuc3VyZSB0aGUgYHNrYmAgZGF0YSBidWZmZXIgaXMgcHJpdmF0ZSBiZWZvcmUgYW55IG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUuIFRoaXMgZG9lcyBub3QgaW52b2x2ZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgY29tcGxleCBzdHJ1Y3R1cmUgYWxsb2NhdGlvbnMgdGhhdCBtaWdodCBsZWF2ZSBmaWVsZHMgdW5pbml0aWFsaXplZC4gVGhlIGJ1ZyBpcyBhIHNoYXJlZCBtdXRhYmxlIHN0YXRlIGlzc3VlLCBhbmQgdGhlIGZpeCBjb3JyZWN0bHkgcHJpdmF0aXplcyB0aGUgYnVmZmVyLiBTdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCBmb3IgbWVtb3J5IHNhZmV0eSBoZXJlOyBLTVNBTiBpcyBub3QgYXBwbGljYWJsZSBhcyB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[1] Phase: Succeeded StartedAt: 2026-08-08 00:53:08 +0000 UTC FinishedAt: 2026-08-08 00:53:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-08 00:53:08 +0000 UTC FinishedAt: 2026-08-08 00:53:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2] Phase: Succeeded StartedAt: 2026-08-08 00:53:08 +0000 UTC FinishedAt: 2026-08-08 04:36:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-08 00:53:08 +0000 UTC FinishedAt: 2026-08-08 04:36:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-08 00:53:08 +0000 UTC FinishedAt: 2026-08-08 00:53:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-08 00:53:08 +0000 UTC FinishedAt: 2026-08-08 00:53:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowmcc9v/series-workflowmcc9v-convert-artifact-1469503179/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-08 00:53:18 +0000 UTC FinishedAt: 2026-08-08 01:09:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-08 00:53:18 +0000 UTC FinishedAt: 2026-08-08 01:09:53 +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:*7efb3ce4-2ee7-4cf6-baae-fa3ed6c5cb52,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-workflowmcc9v/series-workflowmcc9v-convert-artifact-1469503179/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": "b13f48e6-05b1-4a2d-8877-626efd7396c5", "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-workflowmcc9v/series-workflowmcc9v-build-action-945442249/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-08 00:53:18 +0000 UTC FinishedAt: 2026-08-08 01:09:41 +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:*7efb3ce4-2ee7-4cf6-baae-fa3ed6c5cb52,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-workflowmcc9v/series-workflowmcc9v-convert-artifact-1469503179/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": "b13f48e6-05b1-4a2d-8877-626efd7396c5", "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-workflowmcc9v/series-workflowmcc9v-build-action-945442249/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-08 01:09:53 +0000 UTC FinishedAt: 2026-08-08 01:09:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-08 01:09:53 +0000 UTC FinishedAt: 2026-08-08 01:09:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-08 01:09:53 +0000 UTC FinishedAt: 2026-08-08 01:10:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-08 01:09:53 +0000 UTC FinishedAt: 2026-08-08 01:09:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowmcc9v/series-workflowmcc9v-convert-artifact-3515163938/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-08 01:10:04 +0000 UTC FinishedAt: 2026-08-08 01:12:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-08 01:10:04 +0000 UTC FinishedAt: 2026-08-08 01:12:20 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*b13f48e6-05b1-4a2d-8877-626efd7396c5,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-workflowmcc9v/series-workflowmcc9v-build-action-945442249/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-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-08 01:12:30 +0000 UTC FinishedAt: 2026-08-08 01:12:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-08 01:12:30 +0000 UTC FinishedAt: 2026-08-08 01:12:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-08 01:12:30 +0000 UTC FinishedAt: 2026-08-08 01:31:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-08 01:12:30 +0000 UTC FinishedAt: 2026-08-08 01:31:19 +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:*7efb3ce4-2ee7-4cf6-baae-fa3ed6c5cb52,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-workflowmcc9v/series-workflowmcc9v-convert-artifact-3515163938/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": "21011faa-0b30-4764-adf0-57357a56998c", "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-workflowmcc9v/series-workflowmcc9v-build-action-1600021878/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-08 01:12:30 +0000 UTC FinishedAt: 2026-08-08 01:31:09 +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:*7efb3ce4-2ee7-4cf6-baae-fa3ed6c5cb52,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-workflowmcc9v/series-workflowmcc9v-convert-artifact-3515163938/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": "21011faa-0b30-4764-adf0-57357a56998c", "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-workflowmcc9v/series-workflowmcc9v-build-action-1600021878/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-08 01:31:19 +0000 UTC FinishedAt: 2026-08-08 01:31:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-08 01:31:19 +0000 UTC FinishedAt: 2026-08-08 01:31:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-08 01:31:19 +0000 UTC FinishedAt: 2026-08-08 01:33:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-08 01:31:19 +0000 UTC FinishedAt: 2026-08-08 01:32:55 +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:*21011faa-0b30-4764-adf0-57357a56998c,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-workflowmcc9v/series-workflowmcc9v-build-action-1600021878/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-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-08 01:33:05 +0000 UTC FinishedAt: 2026-08-08 04:36:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-08 01:33:05 +0000 UTC FinishedAt: 2026-08-08 04:36:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*b13f48e6-05b1-4a2d-8877-626efd7396c5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*21011faa-0b30-4764-adf0-57357a56998c,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-workflowmcc9v/series-workflowmcc9v-build-action-945442249/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-workflowmcc9v/series-workflowmcc9v-build-action-1600021878/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-08 01:33:05 +0000 UTC FinishedAt: 2026-08-08 01:33:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-08 01:33:05 +0000 UTC FinishedAt: 2026-08-08 01:33:11 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowmcc9v/series-workflowmcc9v-convert-artifact-4272491351/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-08 01:33:05 +0000 UTC FinishedAt: 2026-08-08 01:33:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-08 01:33:05 +0000 UTC FinishedAt: 2026-08-08 01:33:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-08 01:33:05 +0000 UTC FinishedAt: 2026-08-08 01:33:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-08 01:33:15 +0000 UTC FinishedAt: 2026-08-08 04:36:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmcc9v[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["hsr_forward_skb","hsr_create_tagged_frame","prp_create_tagged_frame"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["HSR"],"series_id":"7702a22c-a562-4665-a5a8-5bcef03032b2","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-08 01:33:15 +0000 UTC FinishedAt: 2026-08-08 04:36:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*b13f48e6-05b1-4a2d-8877-626efd7396c5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*21011faa-0b30-4764-adf0-57357a56998c,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-workflowmcc9v/series-workflowmcc9v-build-action-945442249/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-workflowmcc9v/series-workflowmcc9v-build-action-1600021878/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-workflowmcc9v/series-workflowmcc9v-convert-artifact-4272491351/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,}