Name: series-workfloww7lzt Phase: Succeeded StartedAt: 2026-08-14 14:19:59 +0000 UTC FinishedAt: 2026-08-14 18:47:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[0] Phase: Succeeded StartedAt: 2026-08-14 14:19:59 +0000 UTC FinishedAt: 2026-08-14 14:54:44 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[0].run-triage Phase: Succeeded StartedAt: 2026-08-14 14:19:59 +0000 UTC FinishedAt: 2026-08-14 14:54:44 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "c4f6916a99cf105c3ff340b6210fcbba3fa66b35", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BRIDGE", "BRIDGE_VLAN_FILTERING", "VLAN_8021Q" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "c4f6916a99cf105c3ff340b6210fcbba3fa66b35", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BRIDGE", "BRIDGE_VLAN_FILTERING", "VLAN_8021Q" ], "series_id": "4f5e1571-6e90-43e8-b792-a5a9d8e36f8d" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "br_process_vlan_tunnel_info", "br_vlan_tunnel_info", "br_parse_vlan_tunnel_info" ], "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+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTltPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUklER0UmIzM0OywKICAgICYjMzQ7QlJJREdFX1ZMQU5fRklMVEVSSU5HJiMzNDssCiAgICAmIzM0O1ZMQU5fODAyMVEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAgICYjMzQ7YnJfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICAgJiMzNDticl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgS01TQU4gdW5pbml0LXZhbHVlIGJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gV2hlbiBwcm9jZXNzaW5nIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUsIGlmIGEgdXNlciBwcm92aWRlcyBhIFZMQU4gdHVubmVsIHJhbmdlIHdoZXJlIHRoZSBlbmQgYHZpZGAgaXMgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgbWF0Y2hlcyB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSAod2hpY2ggaXMgcG9zc2libGUgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bnNpZ25lZCAzMi1iaXQgYXJpdGhtZXRpYyB3cmFwLWFyb3VuZCksIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGlzIGJ5cGFzc2VkLiBDb25zZXF1ZW50bHksIHRoZSBwcm9jZXNzaW5nIGxvb3AgZXhlY3V0ZXMgemVybyB0aW1lcywgbGVhdmluZyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzIGxhdGVyIGV2YWx1YXRlZCBhbmQgcG90ZW50aWFsbHkgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSwgY2F1c2luZyBhbiBpbmZvcm1hdGlvbiBsZWFrLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMTQgMTQ6MzU6MjcgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG5pbmRleCA3MWExMmRhMzAwMDRjLi4wNWY1NjBlZWI3ODljIDEwMDY0NFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcbkBAIC0zMDEsNyAmIzQzOzMwMSw4IEBAIGludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuIFxuIFx0XHRpZiAoISh0aW5mb19sYXN0LVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0aWYgKCh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuJiM0MztcdFx0aWYgKHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZCB8fFxuJiM0MztcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTNtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUklER0UmIzM0OywKICAgICYjMzQ7QlJJREdFX1ZMQU5fRklMVEVSSU5HJiMzNDssCiAgICAmIzM0O1ZMQU5fODAyMVEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAgICYjMzQ7YnJfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICAgJiMzNDticl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgS01TQU4gdW5pbml0LXZhbHVlIGJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gV2hlbiBwcm9jZXNzaW5nIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUsIGlmIGEgdXNlciBwcm92aWRlcyBhIFZMQU4gdHVubmVsIHJhbmdlIHdoZXJlIHRoZSBlbmQgYHZpZGAgaXMgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgbWF0Y2hlcyB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSAod2hpY2ggaXMgcG9zc2libGUgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bnNpZ25lZCAzMi1iaXQgYXJpdGhtZXRpYyB3cmFwLWFyb3VuZCksIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGlzIGJ5cGFzc2VkLiBDb25zZXF1ZW50bHksIHRoZSBwcm9jZXNzaW5nIGxvb3AgZXhlY3V0ZXMgemVybyB0aW1lcywgbGVhdmluZyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzIGxhdGVyIGV2YWx1YXRlZCBhbmQgcG90ZW50aWFsbHkgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSwgY2F1c2luZyBhbiBpbmZvcm1hdGlvbiBsZWFrLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMTQgMTQ6MzU6MjcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMKaW5kZXggNzFhMTJkYTMwMDA0Yy4uMDVmNTYwZWViNzg5YyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYwpAQCAtMzAxLDcgJiM0MzszMDEsOCBAQCBpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAogCQlpZiAoISh0aW5mb19sYXN0LSZndDtmbGFncyAmYW1wOyBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0KJiM0MzsJCWlmICh0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWQgfHwKJiM0MzsJCSAgICAodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKSAhPQogCQkgICAgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXQgPSB0aW5mb19sYXN0LSZndDt0dW5pZDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA0OAoJCQkJCQkJb3V0cHV0OiA0MgoJCQkJCQkJdGhvdWdodHM6IDEwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgdG8gbW9kaWZ5IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCB3aHkgdGhpcyBjaGFuZ2Ugd2FzIG5lZWRlZC4gVGhlIGRlc2NyaXB0aW9uIG1lbnRpb25zIGEgY2hlY2ssIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgLCBiZWluZyBhZGRlZC4gQWgsIGl0JiMzOTtzIHRvIHByZXZlbnQgdW5kZXJmbG93IG9yIGludmFsaWQgcmFuZ2VzIHdoZW4gcHJvY2Vzc2luZyBWTEFOIHR1bm5lbCBpbmZvcm1hdGlvbi4gVGhhdCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBXZSB3YW50IHRvIGVuc3VyZSB0aGUgVkxBTiBJRCAoVklEKSB2YWx1ZXMgYXJlIHByb2Nlc3NlZCBpbiBhIGxvZ2ljYWxseSBjb25zaXN0ZW50IGFuZCB2YWxpZCBzZXF1ZW5jZSwgcHJldmVudGluZyBwb3RlbnRpYWwgZXJyb3JzIG9yIHNlY3VyaXR5IGlzc3VlcyB0aGF0IGNvdWxkIGFyaXNlIGZyb20gdW5leHBlY3RlZCBWSUQgb3JkZXIuIEkmIzM5O2xsIG5lZWQgdG8gZGlnIGludG8gdGhlIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGZ1bmN0aW9uIGl0c2VsZiB0byBmdWxseSBncmFzcCB0aGUgY29udGV4dCBhbmQgdGhlIHBvdGVudGlhbCBpbXBhY3Qgb2YgdGhpcyBhZGRpdGlvbi4gVGltZSB0byBkaXZlIGludG8gdGhlIGNvZGUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4Ny1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjUyMwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBWTEFOIFR1bm5lbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IHJlbGF0ZWQgdG8gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIGEgY2xlYXIgcGljdHVyZSBvZiBpdHMgY2FsbCBncmFwaC4gV2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSBpbnZva2VkIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0gYXJjaGl0ZWN0dXJlPyBJIG5lZWQgdG8gdHJhY2UgaXRzIG9yaWdpbnMuIEkmIzM5O2xsIG5lZWQgdG8gaWRlbnRpZnkgYWxsIHRoZSBjYWxsIHNpdGVzIHRvIGZ1bGx5IGdyYXNwIGl0cyByb2xlIGFuZCBjb250ZXh0LiBVbmRlcnN0YW5kaW5nIHRoZSB1cHN0cmVhbSBkYXRhIGZsb3cgaXMga2V5IGhlcmUgdG8gaWRlbnRpZnkgcG90ZW50aWFsIHBvaW50cyBmb3Igb3B0aW1pemF0aW9uIG9yIGRlYnVnZ2luZyBsYXRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMC1cdFx0XHRcdHJldHVybiBlcnI7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MzE6XHRcdFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGJyLCBwLCBjbWQsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MzItXHRcdFx0XHRcdFx0XHQgIFx1MDAyNnRpbmZvX2N1cnIsXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4Ny1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG4tLVxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oPTE5PWludCBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvKHN0cnVjdCBubGF0dHIgKmF0dHIsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjAtXHRcdFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjIxOmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTIyLVx0XHRcdFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDc5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTA1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIHBpbnBvaW50ZWQgYSBwcm9taXNpbmcgdGFyZ2V0LiBUaGUgY29kZSBwYXRoIG9yaWdpbmF0ZXMgZnJvbSBgYnJfYWZzcGVjYCB3aXRoaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYC4gVGhhdCBmdW5jdGlvbiBoYW5kbGVzIGJyaWRnZSBuZXRsaW5rIG1lc3NhZ2Vz4oCUdGhpbmdzIGxpa2UgYFJUTV9TRVRMSU5LYCwgYFJUTV9ORVdMSU5LYCwgdGhhdCBraW5kIG9mIHN0dWZmLiBXaGljaCwgZm9yIG15IHB1cnBvc2VzLCBtYWtlcyBpdCBkZWZpbml0ZWx5IHJlYWNoYWJsZSBhbmQgd29ydGggbXkgdGltZS4gTXkgbWFpbiBpbnRlcmVzdCBsaWVzIGluIHRoZSBmdW5jdGlvbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoLCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBHb3R0YSBtYWtlIHN1cmUgZXZlcnl0aGluZyYjMzk7cyBpbiBwbGFjZSB0byBleHBsb2l0IHRoaXMgcHJvcGVybHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfbmV0bGlua190dW5uZWwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvTWFrZWZpbGU9OD1icmlkZ2UteVx0Oj0gYnIubyBicl9kZXZpY2UubyBicl9mZGIubyBicl9mb3J3YXJkLm8gYnJfaWYubyBicl9pbnB1dC5vIFxcXG4tLVxubmV0L2JyaWRnZS9NYWtlZmlsZS0xMC1cdFx0XHRicl9zdHBfaWYubyBicl9zdHBfdGltZXIubyBicl9uZXRsaW5rLm8gXFxcbm5ldC9icmlkZ2UvTWFrZWZpbGU6MTE6XHRcdFx0YnJfbmV0bGlua190dW5uZWwubyBicl9hcnBfbmRfcHJveHkub1xubmV0L2JyaWRnZS9NYWtlZmlsZS0xMi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDk2CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIG15c2VsZjoKCioqQnJpZGdlIE1vZHVsZSBCdWlsZCBEZXBlbmRlbmN5IElucXVpcnkqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYnVpbGQgcHJvY2VzcyBhbmQgaXQgc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaCAtIHRoZSBtb2R1bGUgYnVpbGRzICppZiogYENPTkZJR19CUklER0VgIGlzIGVuYWJsZWQuIEJ1dCwgaG9sZCBvbiBhIHNlY29uZOKApiBpc24mIzM5O3QgdGhlcmUgc29tZXRoaW5nIGVsc2UgaW5mbHVlbmNpbmcgdGhpcz8gSSBoYXZlIGEgZmVlbGluZyBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgbWlnaHQgYmUgaW4gcGxheSB0b28uIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUuIEJlc3QgdG8gY2hlY2sgdGhlIE1ha2VmaWxlIGZvciBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbGFncywgb3IgbWF5YmUgYGJyX25ldGxpbmtfdHVubmVsLmNgIHdvdWxkIGhhdmUgdGhlIGAjaWZkZWZgIGRpcmVjdGl2ZXMgSSBuZWVkLiBHb3R0YSB0cmFjayBkb3duIHdoZXJlIHRoaXMgbW9kdWxlJiMzOTtzIHRydWx5IGRlZmluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9NYWtlZmlsZSYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAgIDI6XHQjXG4gICAzOlx0IyBNYWtlZmlsZSBmb3IgdGhlIElFRUUgODAyLjFkIGV0aGVybmV0IGJyaWRnaW5nIGxheWVyLlxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRvYmotJChDT05GSUdfQlJJREdFKSAmIzQzOz0gYnJpZGdlLm9cbiAgIDc6XHRcbiAgIDg6XHRicmlkZ2UteVx0Oj0gYnIubyBicl9kZXZpY2UubyBicl9mZGIubyBicl9mb3J3YXJkLm8gYnJfaWYubyBicl9pbnB1dC5vIFxcXG4gICA5Olx0XHRcdFx0YnJfaW9jdGwubyBicl9zdHAubyBicl9zdHBfYnBkdS5vIFxcXG4gIDEwOlx0XHRcdFx0YnJfc3RwX2lmLm8gYnJfc3RwX3RpbWVyLm8gYnJfbmV0bGluay5vIFxcXG4gIDExOlx0XHRcdFx0YnJfbmV0bGlua190dW5uZWwubyBicl9hcnBfbmRfcHJveHkub1xuICAxMjpcdFxuICAxMzpcdGJyaWRnZS0kKENPTkZJR19TWVNGUykgJiM0Mzs9IGJyX3N5c2ZzX2lmLm8gYnJfc3lzZnNfYnIub1xuICAxNDpcdFxuICAxNTpcdGJyaWRnZS0kKHN1YnN0IG0seSwkKENPTkZJR19CUklER0VfTkVURklMVEVSKSkgJiM0Mzs9IGJyX25mX2NvcmUub1xuICAxNjpcdFxuICAxNzpcdGJyX25ldGZpbHRlci15IDo9IGJyX25ldGZpbHRlcl9ob29rcy5vXG4gIDE4Olx0YnJfbmV0ZmlsdGVyLSQoc3Vic3QgbSx5LCQoQ09ORklHX0lQVjYpKSAmIzQzOz0gYnJfbmV0ZmlsdGVyX2lwdjYub1xuICAxOTpcdG9iai0kKENPTkZJR19CUklER0VfTkVURklMVEVSKSAmIzQzOz0gYnJfbmV0ZmlsdGVyLm9cbiAgMjA6XHRcbiAgMjE6XHRicmlkZ2UtJChDT05GSUdfQlJJREdFX0lHTVBfU05PT1BJTkcpICYjNDM7PSBicl9tdWx0aWNhc3QubyBicl9tZGIubyBicl9tdWx0aWNhc3RfZWh0Lm9cbiAgMjI6XHRcbiAgMjM6XHRicmlkZ2UtJChDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HKSAmIzQzOz0gYnJfdmxhbi5vIGJyX3ZsYW5fdHVubmVsLm8gYnJfdmxhbl9vcHRpb25zLm8gYnJfbXN0Lm9cbiAgMjQ6XHRcbiAgMjU6XHRicmlkZ2UtJChDT05GSUdfTkVUX1NXSVRDSERFVikgJiM0Mzs9IGJyX3N3aXRjaGRldi5vXG4gIDI2Olx0XG4gIDI3Olx0b2JqLSQoQ09ORklHX05FVEZJTFRFUikgJiM0Mzs9IG5ldGZpbHRlci9cbiAgMjg6XHRcbiAgMjk6XHRicmlkZ2UtJChDT05GSUdfQlJJREdFX01SUClcdCYjNDM7PSBicl9tcnBfc3dpdGNoZGV2Lm8gYnJfbXJwLm8gYnJfbXJwX25ldGxpbmsub1xuICAzMDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MzAyCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogOTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6CgoqKkV4YW1pbmluZyBCcmlkZ2UgVHVubmVsIE1vZHVsZSBEZXBlbmRlbmNpZXMqKgoKUmlnaHQsIHNvIGBicl9uZXRsaW5rX3R1bm5lbC5vYCBpcyBwcmVkaWN0YWJseSBiYWtlZCBpbiB3aGVuZXZlciBgQ09ORklHX0JSSURHRWAgaXMgc2V0LiBTdGFuZGFyZCBzdHVmZi4gQnV0IGhhbmcgb24sIEkgc2VlbSB0byByZWNhbGwgdGhhdCBgYnJfdmxhbl90dW5uZWwub2AgZ2V0cyBidWlsdCBiYXNlZCBvbiB0aGUgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIG9wdGlvbi4gVGhhdCByaW5ncyBhIGJlbGwuIE5vdywgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHR3byBtb2R1bGVzLiBUaGUgZWFzaWVzdCB3YXkgaXMgYWx3YXlzIHRvIGp1c3QgZGl2ZSBpbnRvIHRoZSBjb2RlLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIHNvdXJjZSBmb3IgYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AgdG8gbG9vayBmb3IgYW55IGAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgZGlyZWN0aXZlcy4gVGhhdCBzaG91bGQgaW1tZWRpYXRlbHkgY2xhcmlmeSBpZiB0aGVyZSYjMzk7cyBhbnkgY29uZGl0aW9uYWwgaW5jbHVzaW9uIG9yIGZ1bmN0aW9uYWxpdHkgdGllZCB0byB0aGUgVkxBTiBmaWx0ZXJpbmcgZmVhdHVyZSB3aXRoaW4gdGhpcyBuZXRsaW5rIHR1bm5lbCBtb2R1bGUuIEl0JiMzOTtzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4gICAyOlx0LypcbiAgIDM6XHQgKlx0QnJpZGdlIHBlciB2bGFuIHR1bm5lbCBwb3J0IGRzdF9tZXRhZGF0YSBuZXRsaW5rIGNvbnRyb2wgaW50ZXJmYWNlXG4gICA0Olx0ICpcbiAgIDU6XHQgKlx0QXV0aG9yczpcbiAgIDY6XHQgKlx0Um9vcGEgUHJhYmh1XHRcdFx1MDAzY3Jvb3BhQGN1bXVsdXNuZXR3b3Jrcy5jb21cdTAwM2VcbiAgIDc6XHQgKi9cbiAgIDg6XHRcbiAgIDk6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuICAxMDpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAxMTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2V0aGVyZGV2aWNlLmhcdTAwM2VcbiAgMTI6XHQjaW5jbHVkZSBcdTAwM2NuZXQvcnRuZXRsaW5rLmhcdTAwM2VcbiAgMTM6XHQjaW5jbHVkZSBcdTAwM2NuZXQvbmV0X25hbWVzcGFjZS5oXHUwMDNlXG4gIDE0Olx0I2luY2x1ZGUgXHUwMDNjbmV0L3NvY2suaFx1MDAzZVxuICAxNTpcdCNpbmNsdWRlIFx1MDAzY3VhcGkvbGludXgvaWZfYnJpZGdlLmhcdTAwM2VcbiAgMTY6XHQjaW5jbHVkZSBcdTAwM2NuZXQvZHN0X21ldGFkYXRhLmhcdTAwM2VcbiAgMTc6XHRcbiAgMTg6XHQjaW5jbHVkZSBcJiMzNDticl9wcml2YXRlLmhcJiMzNDtcbiAgMTk6XHQjaW5jbHVkZSBcJiMzNDticl9wcml2YXRlX3R1bm5lbC5oXCYjMzQ7XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIHNpemVfdCBfX2dldF92bGFuX3RpbmZvX3NpemUodm9pZClcbiAgMjI6XHR7XG4gIDIzOlx0XHRyZXR1cm4gbmxhX3RvdGFsX3NpemUoMCkgJiM0MzsgLyogbmVzdCBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPICovXG4gIDI0Olx0XHRcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpICYjNDM7IC8qIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lEICovXG4gIDI1Olx0XHRcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUxNikpICYjNDM7IC8qIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX1ZJRCAqL1xuICAyNjpcdFx0XHQgIG5sYV90b3RhbF9zaXplKHNpemVvZih1MTYpKTsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1MgKi9cbiAgMjc6XHR9XG4gIDI4Olx0XG4gIDI5Olx0Ym9vbCB2bGFuX3R1bmlkX2lucmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9jdXJyLFxuICAzMDpcdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfbGFzdClcbiAgMzE6XHR7XG4gIDMyOlx0XHRfX2JlMzIgdHVuaWRfY3VyciA9IHR1bm5lbF9pZF90b19rZXkzMih2X2N1cnItXHUwMDNldGluZm8udHVubmVsX2lkKTtcbiAgMzM6XHRcdF9fYmUzMiB0dW5pZF9sYXN0ID0gdHVubmVsX2lkX3RvX2tleTMyKHZfbGFzdC1cdTAwM2V0aW5mby50dW5uZWxfaWQpO1xuICAzNDpcdFxuICAzNTpcdFx0cmV0dXJuIChiZTMyX3RvX2NwdSh0dW5pZF9jdXJyKSAtIGJlMzJfdG9fY3B1KHR1bmlkX2xhc3QpKSA9PSAxO1xuICAzNjpcdH1cbiAgMzc6XHRcbiAgMzg6XHRzdGF0aWMgaW50IF9fZ2V0X251bV92bGFuX3R1bm5lbF9pbmZvcyhzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZylcbiAgMzk6XHR7XG4gIDQwOlx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2LCAqdnRiZWdpbiA9IE5VTEwsICp2dGVuZCA9IE5VTEw7XG4gIDQxOlx0XHRpbnQgbnVtX3RpbmZvcyA9IDA7XG4gIDQyOlx0XG4gIDQzOlx0XHQvKiBDb3VudCBudW1iZXIgb2YgdmxhbiBpbmZvcyAqL1xuICA0NDpcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodiwgXHUwMDI2dmctXHUwMDNldmxhbl9saXN0LCB2bGlzdCkge1xuICA0NTpcdFx0XHQvKiBvbmx5IGEgY29udGV4dCwgYnJpZGdlIHZsYW4gbm90IGFjdGl2YXRlZCAqL1xuICA0NjpcdFx0XHRpZiAoIWJyX3ZsYW5fc2hvdWxkX3VzZSh2KSB8fCAhdi1cdTAwM2V0aW5mby50dW5uZWxfaWQpXG4gIDQ3Olx0XHRcdFx0Y29udGludWU7XG4gIDQ4Olx0XG4gIDQ5Olx0XHRcdGlmICghdnRiZWdpbikge1xuICA1MDpcdFx0XHRcdGdvdG8gaW5pdHZhcnM7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU1MDEKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiA1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIFRob3VnaHRzIG9uIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24uIFRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBhdCBtZSBpcyB0aGF0IGl0JiMzOTtzIGxvY2F0ZWQgd2l0aGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBUaGF0JiMzOTtzIGltcG9ydGFudCBjb250ZXh0LiBHaXZlbiB0aGUgZmlsZSBuYW1lLCBJJiMzOTttIGFscmVhZHkgYXNzdW1pbmcgdGhpcyBmdW5jdGlvbiBpcyBoZWF2aWx5IGludm9sdmVkIGluIGhhbmRsaW5nIFZMQU4tcmVsYXRlZCBjb25maWd1cmF0aW9ucywgcG90ZW50aWFsbHkgZm9yIHR1bm5lbGluZyBzY2VuYXJpb3Mgd2l0aGluIGEgTGludXggYnJpZGdlLiBIb3dldmVyLCBJIG5lZWQgdG8gY29uZmlybSB0aGlzIGFzc3VtcHRpb24uIE15IG5leHQgc3RlcCwgd2l0aG91dCBhIGRvdWJ0LCBpcyB0byBpbW1lZGlhdGVseSBjaGVjayBhbmQgc2VlIGlmIHRoaXMgZnVuY3Rpb24gaXMgY29uZGl0aW9uYWxseSBjb21waWxlZC4gSSBzdHJvbmdseSBzdXNwZWN0IGl0JiMzOTtzIGdvaW5nIHRvIGJlIGd1YXJkZWQgYnkgYSBgI2lmZGVmIENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIHByZXByb2Nlc3NvciBkaXJlY3RpdmUsIG9yIHNvbWV0aGluZyBzaW1pbGFyLiBUaGlzIGlzIGtleSBiZWNhdXNlIHRoYXQgd291bGQgdGVsbCBtZSB3aGV0aGVyIGl0cyBpbmNsdXNpb24gZGVwZW5kcyBvbiB3aGV0aGVyIFZMQU4gZmlsdGVyaW5nIHN1cHBvcnQgaGFzIGJlZW4gc3BlY2lmaWNhbGx5IGVuYWJsZWQgZHVyaW5nIHRoZSBrZXJuZWwgYnVpbGQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU4MDYKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBWTEFOIEludGVyYWN0aW9uKioKCkhtbSwgbm8sIHRoYXQgaW5pdGlhbCBhc3N1bXB0aW9uIGFib3V0IHRoZSBmdW5jdGlvbmFsaXR5IGlzIGluY29ycmVjdC4gSG93ZXZlciwgSSBjYW4gc2VlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBoZWF2aWx5IHJlbGllcyBvbiBgc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cGAgYW5kIG90aGVyIFZMQU4tc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzLiBUaGF0JiMzOTtzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTGV0IG1lIHRoaW5rLi4uIHBlcmhhcHMgZGlnZ2luZyBpbnRvIGBuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmhgIHdpbGwgcmV2ZWFsIGZ1cnRoZXIgaW5zaWdodHMuIEl0IG9mdGVuIGhvbGRzIG1vcmUgZGV0YWlscyBhYm91dCBpbnRlcm5hbCBicmlkZ2Ugd29ya2luZ3MsIGFuZCB0aGVyZSBpcyBhIGRlY2VudCBjaGFuY2UgdGhlcmUgYXJlIHByaXZhdGUgdHVubmVsIGltcGxlbWVudGF0aW9ucyBkZWZpbmVkIGluIHRoYXQgaGVhZGVyLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aG9zZSBzdHJ1Y3R1cmVzIHRvIGdldCBhIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MzI9aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMzQtXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MzU6I2lmZGVmIENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zNi0vKiBicl92bGFuX3R1bm5lbC5jICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDYxNTgKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBkaXZlIGludG8gaG93IFZMQU4gdHVubmVsaW5nIGlzIGhhbmRsZWQgd2l0aGluIHRoZSBicmlkZ2UuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgbGlrZWx5IHNvdXJjZSwgZ2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGJyaWRnZSBpbnRlcm5hbHMuIEkmIzM5O20gdGhpbmtpbmcgdGhhdCB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMgc2hvdWxkIGJlIGRlZmluZWQgb3IgZGVjbGFyZWQgaW4gYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAuIExldCYjMzk7cyBjb25maXJtIHRoYXQgaHlwb3RoZXNpcyBhbmQgc2VlIHdoYXQgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgYWxsIGFib3V0LiBUaGlzIGZ1bmN0aW9uIG5hbWUgc3Ryb25nbHkgc3VnZ2VzdHMgaXQmIzM5O3MgaW52b2x2ZWQgaW4gcHJvY2Vzc2luZyBvciBleHRyYWN0aW5nIHR1bm5lbC1yZWxhdGVkIFZMQU4gaW5mb3JtYXRpb24sIGJ1dCB0aGUgZXhhY3QgZGV0YWlscyBJJiMzOTtsbCBoYXZlIHRvIGFzY2VydGFpbiBieSByZWFkaW5nIHRoZSBjb2RlIHdpdGhpbiB0aGlzIGhlYWRlci4gTXkgZXhwZXJ0aXNlIGd1aWRlcyBtZSB0byB0aGUgbGlrZWx5IGxvY2F0aW9uLCBub3cgSSBqdXN0IGhhdmUgdG8gbG9vay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0xOT1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTIwLVx0XHRcdCAgICAgIHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvKTtcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyMTppbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMi1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY1MzkKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBhIFN5c3RlbSBEZWNsYXJhdGlvbioqCgpSaWdodCwgc28gdGhpcyB0aGluZyBpcyBkZWNsYXJlZCB1bmNvbmRpdGlvbmFsbHkuIFRoYXQmIzM5O3MgYSBzdGFydGluZyBwb2ludCwgbm90IHBhcnRpY3VsYXJseSBoZWxwZnVsIGluIGl0c2VsZi4gVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIGFsd2F5cyB0byB0cmFjZSBpdHMgdXNhZ2UuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0LCBzZWUgd2hlcmUgaXQmIzM5O3MgYmVpbmcgKmNhbGxlZCogdG8gZ3Jhc3AgaXRzIHNpZ25pZmljYW5jZS4gTGV0JiMzOTtzIGRpZyBpbnRvIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AuIFRoYXQmIzM5O3Mgd2hlcmUgSSYjMzk7ZCBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgY29kZSBpZiBpdCYjMzk7cyByZWxhdGVkIHRvIHRoZSBicmlkZ2UgbmV0bGluayBpbnRlcmZhY2UsIHdoaWNoLCBnaXZlbiB0aGUgZmlsZW5hbWUsIHNlZW1zIGhpZ2hseSBsaWtlbHkuIFRpbWUgdG8gc2VlIGhvdyB0aGlzIHRoaW5nIGlzIGJlaW5nICp1c2VkKiB3aXRoaW4gdGhhdCBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMC1cdFx0XHRcdHJldHVybiBlcnI7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MzE6XHRcdFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGJyLCBwLCBjbWQsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MzItXHRcdFx0XHRcdFx0XHQgIFx1MDAyNnRpbmZvX2N1cnIsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4ODIKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gYnJfYWZzcGVjKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcy4gSSYjMzk7bSBnb2luZyB0byBmb2N1cyBvbiBgYnJfYWZzcGVjYCB3aXRoaW4gdGhlIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AgZmlsZS4gVGhpcyBsaWtlbHkgcmVsYXRlcyB0byBob3cgdGhlIGJyaWRnaW5nIGNvZGUgaW50ZXJhY3RzIHdpdGggc3BlY2lmaWMgYWRkcmVzcyBmYW1pbHkgc3BlY2lmaWNhdGlvbnMsIHByb2JhYmx5IHRocm91Z2ggdGhlIE5ldGxpbmsgaW50ZXJmYWNlLiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBoYW5kbGluZyBmb3Igc29tZSBjdXN0b20gb3Igc3BlY2lmaWMgQUYgKEFkZHJlc3MgRmFtaWx5KSByZWxhdGVkIG9wZXJhdGlvbnMgb3IgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBicmlkZ2UuIEdpdmVuIHRoZSBjb250ZXh0LCBJJiMzOTttIGFudGljaXBhdGluZyB0aGlzIHdpbGwgaW52b2x2ZSBpbnRlcmFjdGlvbnMgd2l0aCBOZXRsaW5rIG1lc3NhZ2VzLCBwYXJzaW5nIHNwZWNpZmljIGF0dHJpYnV0ZXMsIGFuZCBwcm9iYWJseSBzb21lIGxvZ2ljIHJlbGF0ZWQgdG8gc2V0dGluZyBvciBxdWVyeWluZyBicmlkZ2Utc3BlY2lmaWMgcGFyYW1ldGVycyBiYXNlZCBvbiB0aGF0IGFkZHJlc3MgZmFtaWx5LiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciB0aGUgZW50cnkgcG9pbnQgb3IgcHJpbWFyeSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlc2UgYWRkcmVzcyBmYW1pbHkgc3BlY2lmaWMgcmVxdWVzdHMsIGFuZCBob3cgdGhleSBpbnRlZ3JhdGUgd2l0aGluIHRoZSBicm9hZGVyIGJyaWRnZSBtYW5hZ2VtZW50IHNjaGVtZS4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODAwOlx0XHR9XG4gODAxOlx0XG4gODAyOlx0XHRlcnIgPSBicl92bGFuX2luZm8oYnIsIHAsIGNtZCwgdmluZm9fY3VyciwgY2hhbmdlZCwgZXh0YWNrKTtcbiA4MDM6XHRcdGlmICgqY2hhbmdlZClcbiA4MDQ6XHRcdFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZpbmZvX2N1cnItXHUwMDNldmlkLCAwLCBydG1fY21kKTtcbiA4MDU6XHRcbiA4MDY6XHRcdHJldHVybiBlcnI7XG4gODA3Olx0fVxuIDgwODpcdFxuIDgwOTpcdHN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbiA4MTA6XHRcdFx0ICAgICBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuIDgxMTpcdFx0XHQgICAgIHN0cnVjdCBubGF0dHIgKmFmX3NwZWMsXG4gODEyOlx0XHRcdCAgICAgaW50IGNtZCwgYm9vbCAqY2hhbmdlZCxcbiA4MTM6XHRcdFx0ICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gODE0Olx0e1xuIDgxNTpcdFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2N1cnIgPSBOVUxMO1xuIDgxNjpcdFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2xhc3QgPSBOVUxMO1xuIDgxNzpcdFx0c3RydWN0IG5sYXR0ciAqYXR0cjtcbiA4MTg6XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gdGluZm9fbGFzdCA9IHt9O1xuIDgxOTpcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19jdXJyID0ge307XG4gODIwOlx0XHRpbnQgZXJyID0gMCwgcmVtO1xuIDgyMTpcdFxuIDgyMjpcdFx0bmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBhZl9zcGVjLCByZW0pIHtcbiA4MjM6XHRcdFx0ZXJyID0gMDtcbiA4MjQ6XHRcdFx0c3dpdGNoIChubGFfdHlwZShhdHRyKSkge1xuIDgyNTpcdFx0XHRjYXNlIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lORk86XG4gODI2Olx0XHRcdFx0aWYgKCFwIHx8ICF0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKVxuIDgyNzpcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gODI4Olx0XHRcdFx0ZXJyID0gYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhhdHRyLCBcdTAwMjZ0aW5mb19jdXJyKTtcbiA4Mjk6XHRcdFx0XHRpZiAoZXJyKVxuIDgzMDpcdFx0XHRcdFx0cmV0dXJuIGVycjtcbiA4MzE6XHRcdFx0XHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oYnIsIHAsIGNtZCxcbiA4MzI6XHRcdFx0XHRcdFx0XHRcdCAgXHUwMDI2dGluZm9fY3VycixcbiA4MzM6XHRcdFx0XHRcdFx0XHRcdCAgXHUwMDI2dGluZm9fbGFzdCxcbiA4MzQ6XHRcdFx0XHRcdFx0XHRcdCAgY2hhbmdlZCk7XG4gODM1Olx0XHRcdFx0aWYgKGVycilcbiA4MzY6XHRcdFx0XHRcdHJldHVybiBlcnI7XG4gODM3Olx0XHRcdFx0YnJlYWs7XG4gODM4Olx0XHRcdGNhc2UgSUZMQV9CUklER0VfVkxBTl9JTkZPOlxuIDgzOTpcdFx0XHRcdGlmIChubGFfbGVuKGF0dHIpICE9IHNpemVvZihzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbykpXG4gODQwOlx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA4NDE6XHRcdFx0XHR2aW5mb19jdXJyID0gbmxhX2RhdGEoYXR0cik7XG4gODQyOlx0XHRcdFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX2luZm8oYnIsIHAsIGNtZCwgdmluZm9fY3VycixcbiA4NDM6XHRcdFx0XHRcdFx0XHQgICBcdTAwMjZ2aW5mb19sYXN0LCBjaGFuZ2VkLFxuIDg0NDpcdFx0XHRcdFx0XHRcdCAgIGV4dGFjayk7XG4gODQ1Olx0XHRcdFx0aWYgKGVycilcbiA4NDY6XHRcdFx0XHRcdHJldHVybiBlcnI7XG4gODQ3Olx0XHRcdFx0YnJlYWs7XG4gODQ4Olx0XHRcdGNhc2UgSUZMQV9CUklER0VfTVJQOlxuIDg0OTpcdFx0XHRcdGVyciA9IGJyX21ycF9wYXJzZShiciwgcCwgYXR0ciwgY21kLCBleHRhY2spO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3OTUzCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogODgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlOgoKKipEaXZpbmcgaW50byBWTEFOIFR1bm5lbGluZyB3aXRoIEJyaWRnZSBQb3J0cyoqCgpBbHJpZ2h0LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBob3cgVkxBTiB0dW5uZWxpbmcgd29ya3Mgd2l0aGluIHRoZSBicmlkZ2UgZnJhbWV3b3JrLiBJJiMzOTt2ZSByZWFsaXplZCB0aGF0IHRoZSBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBmdW5jdGlvbiBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggYElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lORk9gIHdpdGhpbiBgSUZMQV9BRl9TUEVDYCwgd2hpY2ggaXMsIG9mIGNvdXJzZSwgYXNzb2NpYXRlZCB3aXRoIGEgYnJpZGdlIHBvcnQuIFRoZSBrZXkgaGVyZSwgYXMgYWx3YXlzLCBpcyB0aGF0IHRoZSBwb3J0IGl0c2VsZiBuZWVkcyB0byBoYXZlIHRoZSBgQlJfVkxBTl9UVU5ORUxfQklUYCBmbGFnIHNldCB3aXRoaW4gaXRzIGZsYWdzIChgcC0mZ3Q7ZmxhZ3NgLCBzcGVjaWZpY2FsbHkpLiBOb3csIHRoZSBtaWxsaW9uIGRvbGxhciBxdWVzdGlvbiwgb3IgcmF0aGVyLCB0aGUga2V5IHRvIHVubG9ja2luZyB0aGlzIHdob2xlIGZlYXR1cmUsIGlzICpob3cqIGV4YWN0bHkgZG9lcyB0aGF0IGBCUl9WTEFOX1RVTk5FTF9CSVRgIGdldCBzZXQgaW4gdGhlIGZpcnN0IHBsYWNlPyBUaW1lIHRvIGdvIGh1bnRpbmcgdGhyb3VnaCB0aGUgY29kZWJhc2UgYW5kIHNlZSB3aGVyZSB0aGF0IGZsYWcgaXMgYmVpbmcgbWFuaXB1bGF0ZWQuIFRoYXQmIzM5O3MgdGhlIGNyaXRpY2FsIHBpZWNlIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRvIGZ1bGx5IGdyYXNwIHRoZSBpbXBsZW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QlJfVkxBTl9UVU5ORUxfQklUJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9pbnB1dC5jPTMzOT1zdGF0aWMgcnhfaGFuZGxlcl9yZXN1bHRfdCBicl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKVxuLS1cbm5ldC9icmlkZ2UvYnJfaW5wdXQuYy0zNjEtXHRwID0gYnJfcG9ydF9nZXRfcmN1KHNrYi1cdTAwM2VkZXYpO1xubmV0L2JyaWRnZS9icl9pbnB1dC5jOjM2MjpcdGlmICh0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9pbnB1dC5jLTM2My1cdFx0YnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc2tiLCBwLCBuYnBfdmxhbl9ncm91cF9yY3UocCkpO1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTkzPXN0YXRpYyBzaXplX3QgYnJfZ2V0X2xpbmtfYWZfc2l6ZV9maWx0ZXJlZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjExNjpcdGlmIChwIFx1MDAyNlx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTE3LVx0XHR2aW5mb19zeiAmIzQzOz0gYnJfZ2V0X3ZsYW5fdHVubmVsX2luZm9fc2l6ZSh2Zyk7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9NDU4PXN0YXRpYyBpbnQgYnJfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy01NDItXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo1NDM6XHRcdGlmIChwb3J0IFx1MDAyNlx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnBvcnQtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQ0LVx0XHRcdGVyciA9IGJyX2ZpbGxfdmxhbl90dW5uZWxfaW5mbyhza2IsIHZnKTtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNS1cdFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPOlxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODI2Olx0XHRcdGlmICghcCB8fCAhdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNy1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLS1cbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM9MTYwPXN0YXRpYyBpbnQgYnJfdmxhbl9tb2RpZnlfdHVubmVsKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXG4tLVxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYy0xNzQtXHR9XG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjE3NTpcdGlmICghdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSkge1xubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYy0xNzYtXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O1BvcnQgZG9lc24mIzM5O3QgaGF2ZSB0dW5uZWwgZmxhZyBzZXRcJiMzNDspO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTk5CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIGBCUl9WTEFOX1RVTk5FTF9CSVRgKioKCk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIEkgc2VlIGBCUl9WTEFOX1RVTk5FTF9CSVRgLiBJdCBzdHJpa2VzIG1lIGFzIGEgYml0IGZsYWcsIGVpdGhlciBhbiBlbnVtIG9yIGEgc2ltcGxlICNkZWZpbmUuIFRoZSBuYW1lJiMzOTtzIHN1Z2dlc3RpdmUgZW5vdWdoLCBidXQgSSBuZWVkIHRvIGNvbmZpcm0gaXRzIGV4YWN0IGRlZmluaXRpb24uIExldCYjMzk7cyB0cmFjZSB0aGlzIGFuZCBxdWlja2x5IHBpbnBvaW50IHdoZXJlIGBCUl9WTEFOX1RVTk5FTF9CSVRgIGlzIGFjdHVhbGx5IGRlY2xhcmVkLiBUaGF0JiMzOTtsbCB0ZWxsIG1lIGl0cyBzY29wZSwgaXRzIHR5cGUsIGFuZCB1bHRpbWF0ZWx5LCBob3cgaXQmIzM5O3MgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGxhcmdlciBjb250ZXh0IG9mIHRoaXMgVkxBTiB0dW5uZWxpbmcgaW1wbGVtZW50YXRpb24uIEdvdHRhIGZpZ3VyZSBvdXQgd2hhdCYjMzk7cyBnb2luZyBvbiB1bmRlciB0aGUgaG9vZCBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtCUl9WTEFOX1RVTk5FTF9CSVQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oPTM5PWVudW0gYnJpZGdlX2ZsYWdzX2JpdCB7XG4tLVxuaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaC01Mi1cdEJSX01VTFRJQ0FTVF9UT19VTklDQVNUX0JJVCxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg6NTM6XHRCUl9WTEFOX1RVTk5FTF9CSVQsXG5pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oLTU0LVx0QlJfQkNBU1RfRkxPT0RfQklULFxuLS1cbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtODAtI2RlZmluZSBCUl9NVUxUSUNBU1RfVE9fVU5JQ0FTVFx0QklUKEJSX01VTFRJQ0FTVF9UT19VTklDQVNUX0JJVClcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg6ODE6I2RlZmluZSBCUl9WTEFOX1RVTk5FTFx0XHRCSVQoQlJfVkxBTl9UVU5ORUxfQklUKVxuaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaC04Mi0jZGVmaW5lIEJSX0JDQVNUX0ZMT09EXHRcdEJJVChCUl9CQ0FTVF9GTE9PRF9CSVQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0NDgKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipCUl9WTEFOX1RVTk5FTCBJbnZlc3RpZ2F0aW9uKioKCkFscmlnaHQsIGl0JiMzOTtzIGp1bXBpbmcgb3V0IGF0IG1lIGFzIGBCUl9WTEFOX1RVTk5FTGAuIFRpbWUgdG8gZGlnIGluLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB0cmFjZSBpdHMgdXNhZ2UuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0cyBpbiB3aGljaCB0aGlzIGJyaWRnZSBWTEFOIHR1bm5lbCBpcyBlbXBsb3llZC4gSSBuZWVkIHRvIGtub3cgdGhlIGNhbGxpbmcgZnVuY3Rpb25zLCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaW4gZWFjaCBzY2VuYXJpby4gS25vd2luZyB3aGVyZSBpdCYjMzk7cyB1c2VkIHdpbGwgYmUgY3JpdGljYWwgZm9yIGZvcm1pbmcgYSBjb2hlc2l2ZSBtZW50YWwgbW9kZWwuIEkmIzM5O2xsIG5lZWQgdG8gcmFwaWRseSBpZGVudGlmeSBrZXkgZGVwZW5kZW5jaWVzIGFuZCBhbnkgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4gYmFzZWQgb24gdGhlIHN1cnJvdW5kaW5nIGNvZGUuIE15IGZvY3VzIHdpbGwgYmUgb24gdGhlIGVkZ2UgY2FzZXMgYW5kIGhvdyB0aGlzIHR1bm5lbCBpbnRlcmFjdHMgd2l0aCB0aGUgb3ZlcmFsbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlLiBOb3csIGxldCYjMzk7cyBnZXQgdG8gd29yayBhbmQgZmluZCB0aGUgY2FsbHNpdGVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtCUl9WTEFOX1RVTk5FTCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfaW5wdXQuYz0zMzk9c3RhdGljIHJ4X2hhbmRsZXJfcmVzdWx0X3QgYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBza19idWZmICoqcHNrYilcbi0tXG5uZXQvYnJpZGdlL2JyX2lucHV0LmMtMzYxLVx0cCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItXHUwMDNlZGV2KTtcbm5ldC9icmlkZ2UvYnJfaW5wdXQuYzozNjI6XHRpZiAodGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfaW5wdXQuYy0zNjMtXHRcdGJyX2hhbmRsZV9pbmdyZXNzX3ZsYW5fdHVubmVsKHNrYiwgcCwgbmJwX3ZsYW5fZ3JvdXBfcmN1KHApKTtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz05Mz1zdGF0aWMgc2l6ZV90IGJyX2dldF9saW5rX2FmX3NpemVfZmlsdGVyZWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy0xMTUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoxMTY6XHRpZiAocCBcdTAwMjZcdTAwMjYgdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNy1cdFx0dmluZm9fc3ogJiM0Mzs9IGJyX2dldF92bGFuX3R1bm5lbF9pbmZvX3NpemUodmcpO1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTIzND1zdGF0aWMgaW50IGJyX3BvcnRfZmlsbF9hdHRycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTI3Ni1cdCAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfVkxBTl9UVU5ORUwsICEhKGZsYWdzIFx1MDAyNlxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6Mjc3Olx0XHRcdFx0XHRcdFx0QlJfVkxBTl9UVU5ORUwpKSB8fFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMjc4LVx0ICAgIG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9CUlBPUlRfR1JPVVBfRldEX01BU0ssIHAtXHUwMDNlZ3JvdXBfZndkX21hc2spIHx8XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9NDU4PXN0YXRpYyBpbnQgYnJfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy01NDItXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo1NDM6XHRcdGlmIChwb3J0IFx1MDAyNlx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnBvcnQtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQ0LVx0XHRcdGVyciA9IGJyX2ZpbGxfdmxhbl90dW5uZWxfaW5mbyhza2IsIHZnKTtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNS1cdFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPOlxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODI2Olx0XHRcdGlmICghcCB8fCAhdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNy1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTk1MT1zdGF0aWMgaW50IGJyX3NldHBvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IG5sYXR0ciAqdGJbXSxcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NTktXHRvbGRfZmxhZ3MgPSBSRUFEX09OQ0UocC1cdTAwM2VmbGFncyk7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5NjA6XHRicl92bGFuX3R1bm5lbF9vbGQgPSAob2xkX2ZsYWdzIFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkgPyB0cnVlIDogZmFsc2U7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NjEtXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtOTc4LVx0YnJfc2V0X3BvcnRfZmxhZyhcdTAwMjZzZXQsIFx1MDAyNmNsZWFyLCB0YiwgSUZMQV9CUlBPUlRfVkxBTl9UVU5ORUwsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5Nzk6XHRcdFx0IEJSX1ZMQU5fVFVOTkVMKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTk4MC1cdGJyX3NldF9wb3J0X2ZsYWcoXHUwMDI2c2V0LCBcdTAwMjZjbGVhciwgdGIsIElGTEFfQlJQT1JUX05FSUdIX1NVUFBSRVNTLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTEwMTYtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoxMDE3Olx0aWYgKGJyX3ZsYW5fdHVubmVsX29sZCBcdTAwMjZcdTAwMjYgIShmbGFncyBcdTAwMjYgQlJfVkxBTl9UVU5ORUwpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTAxOC1cdFx0bmJwX3ZsYW5fdHVubmVsX2luZm9fZmx1c2gocCk7XG4tLVxubmV0L2JyaWRnZS9icl92bGFuLmM9NDgwPXN0cnVjdCBza19idWZmICpicl9oYW5kbGVfdmxhbihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4tLVxubmV0L2JyaWRnZS9icl92bGFuLmMtNTMwLVxubmV0L2JyaWRnZS9icl92bGFuLmM6NTMxOlx0aWYgKHAgXHUwMDI2XHUwMDI2IChwLVx1MDAzZWZsYWdzIFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkgXHUwMDI2XHUwMDI2XG5uZXQvYnJpZGdlL2JyX3ZsYW4uYy01MzItXHQgICAgYnJfaGFuZGxlX2VncmVzc192bGFuX3R1bm5lbChza2IsIHYpKSB7XG4tLVxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTE3NC1cdH1cbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM6MTc1Olx0aWYgKCF0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKSB7XG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTE3Ni1cdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXCYjMzQ7UG9ydCBkb2VzbiYjMzk7dCBoYXZlIHR1bm5lbCBmbGFnIHNldFwmIzM0Oyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMDA4CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogMTc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgdGhlIFZMQU4gVHVubmVsIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcywgYW5kIGl0IGxvb2tzIGxpa2UgSSBjYW4gbWFuaXB1bGF0ZSBgQlJfVkxBTl9UVU5ORUxgIHRocm91Z2ggYElGTEFfQlJQT1JUX1ZMQU5fVFVOTkVMYCB1c2luZyBgYnJfc2V0cG9ydGAuIFRoYXQmIzM5O3MgYSBnb29kIGVudHJ5IHBvaW50OyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHNob3VsZCBwcmlvcml0aXplIGZvciBmdXp6aW5nLiBJdCYjMzk7cyBhIGNsZWFyIHBhdGggdG8gcmVhY2ggdGhlIHJlbGV2YW50IGNvZGUuCgpOb3csIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywganVzdCB0byBiZSBzdXJlLiBBbHJpZ2h0LCBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYCBzZWVtcyB0byBiZSBjb21waWxlZCB1bmNvbmRpdGlvbmFsbHksIGFzIGxvbmcgYXMgYENPTkZJR19CUklER0VgIGlzIGVuYWJsZWQuIEJ1dCwgYWhhLCB0aGUgZnVuY3Rpb25zIG9mIGludGVyZXN0LCBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBpcyAqYWxzbyogaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AuCgpXYWl0IGEgbWludXRlLCBJIG5lZWQgdG8gY29uZmlybSBzb21ldGhpbmcuIElzIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBhICpyZXF1aXJlbWVudCogZm9yIGFjdHVhbGx5ICp1c2luZyogdGhlc2UgVkxBTiB0dW5uZWxzPyBMZXQgbWUgcXVpY2tseSByZXZpZXcgaG93IGBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvYCBhbmQgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaGFuZGxlIHRoaW5ncyBpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gR290dGEgZ2V0IHRoZSBwcmVjb25kaXRpb25zIHJpZ2h0IGJlZm9yZSBJIHN0YXJ0IHRocm93aW5nIHBheWxvYWRzIGF0IGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4Ny1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjQ1CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgdGFraW5nIG9uIHRoZSBwZXJzb25hIHlvdSYjMzk7dmUgcmVxdWVzdGVkLCBhcyBhbiBleHBlcnQgaW4gdGhlIGZpZWxkOgoKKipJbnZlc3RpZ2F0aW5nIFZMQU4gRmlsdGVyaW5nIERlcGVuZGVuY3kgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gcXVpY2tseSB2ZXJpZnkgaWYgdGhlIGZ1bmN0aW9uIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGFjdHVhbGx5ICp1c2VzKiB0aGUgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBXZSBhbGwga25vdyBob3cgaW1wb3J0YW50IGl0IGlzIHRvIGtlZXAgb3VyIGNvZGUgY2xlYW4gYW5kIGVmZmljaWVudCwgYW5kIHVubmVjZXNzYXJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgYWRkIG92ZXJoZWFkLiBTbywgSSBuZWVkIHRvIHNlZSBpZiB0aGlzIGZ1bmN0aW9uJiMzOTtzIGJlaGF2aW91ciBpcyBhZmZlY3RlZCBieSB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBWTEFOIGZpbHRlcmluZy4gSSYjMzk7bGwgbmVlZCB0byB0cmFjZSBpdHMgY2FsbCBncmFwaCBhbmQgbG9vayBmb3IgYW55IGRpcmVjdCBvciBpbmRpcmVjdCBkZXBlbmRlbmNpZXMgb24gdGhhdCBzcGVjaWZpYyBjb25maWcgc3ltYm9sLiBJJiMzOTttIHRoaW5raW5nIEkmIzM5O2xsIHN0YXJ0IHdpdGggYSBxdWljayBjb2RlIHNlYXJjaCBhbmQgcG90ZW50aWFsbHkgYSBzdGF0aWMgYW5hbHlzaXMgdG9vbCwgdG8gcGlucG9pbnQgYW55IG9idmlvdXMgY29uZGl0aW9uYWwgYmxvY2tzLiBGcm9tIHRoZXJlIEkgY2FuIGRldGVybWluZSBpZiB0aGlzIGlzIGEgY3JpdGljYWwgZGVwZW5kZW5jeSwgYSBtaW5vciBvcHRpbWl6YXRpb24sIG9yIHBvc3NpYmx5IGV2ZW4gYSBjb21wbGV0ZWx5IGlycmVsZXZhbnQgY2hlY2suIExldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSB3aGF0IHdlIGZpbmQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyODA6XHRvdXRfaW5pdDpcbiAyODE6XHRcdC8qIHdlIHN0YXJ0IGEgcmFuZ2Ugb25seSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgdG8gbm90aWZ5IGFib3V0ICovXG4gMjgyOlx0XHQqdl9zdGFydCA9IGN1cnJfY2hhbmdlID8gdiA6IE5VTEw7XG4gMjgzOlx0XHQqdl9lbmQgPSAqdl9zdGFydDtcbiAyODQ6XHR9XG4gMjg1Olx0XG4gMjg2Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gMjg3Olx0XHRcdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuIDI4ODpcdFx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcbiAyODk6XHRcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG4gMjkwOlx0XHRcdFx0XHRib29sICpjaGFuZ2VkKVxuIDI5MTpcdHtcbiAyOTI6XHRcdGludCBlcnI7XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDI5NTpcdFx0XHRpZiAodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcbiAyOTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyOTc6XHRcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiAzMTg6XHRcdFx0XHRcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XG4gMzE5Olx0XHRcdFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXHUwMDI2dl9zdGFydCwgXHUwMDI2dl9lbmQsIHYsXG4gMzIwOlx0XHRcdFx0XHRcdFx0ICAgY3Vycl9jaGFuZ2UpO1xuIDMyMTpcdFx0XHR9XG4gMzIyOlx0XHRcdGlmICh2X3N0YXJ0IFx1MDAyNlx1MDAyNiB2X2VuZClcbiAzMjM6XHRcdFx0XHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cdTAwM2V2aWQsIHZfZW5kLVx1MDAzZXZpZCxcbiAzMjQ6XHRcdFx0XHRcdCAgICAgICBSVE1fTkVXVkxBTik7XG4gMzI1Olx0XHRcdGlmIChlcnIpXG4gMzI2Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAzMjc6XHRcbiAzMjg6XHRcdFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMzI5Olx0XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjgxMQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXAgaW4gdGhlIHdlZWRzIG9mIG5ldHdvcmsgYnJpZGdlIGNvZGUsIGFuZCBzcGVha2luZyBhcyBhbiBleHBlcnQ6CgoqKlRyYWNpbmcgRG93biBhIFZMQU4gVHVubmVsIEZ1bmN0aW9uKioKClJpZ2h0LCBpdCYjMzk7cyBjYWxsaW5nIGBicl92bGFuX3R1bm5lbF9pbmZvYC4gVGhhdCYjMzk7cyBpbnRlcmVzdGluZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGRvaW5nLiBUaGUgbmFtZSBzdWdnZXN0cyBpdCYjMzk7cyByZWxhdGVkIHRvIFZMQU4gdHVubmVscywgd2hpY2gsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCwgY291bGQgYmUgdXNpbmcgVlhMQU4sIEdSRSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHkuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIGtub3cgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIExldCBtZSBxdWlja2x5IGZpbmQgdGhlIGRlZmluaXRpb24gb2YgYGJyX3ZsYW5fdHVubmVsX2luZm9gLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgaW5wdXRzLCB3aGF0IGl0JiMzOTtzIGRvaW5nIHdpdGggdGhlbSwgYW5kIHdoYXQgaXQmIzM5O3MgcmV0dXJuaW5nLiBJcyBpdCByZXR1cm5pbmcgYSBzdHJ1Y3R1cmUsIHNldHRpbmcgYSBiaXQsIG9yIGRvaW5nIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IFRoZSBnb2FsIGlzIHRvIGRldGVybWluZSBpdHMgZXhhY3Qgcm9sZSBpbiB0aGlzIGJyaWRnZSYjMzk7cyBWTEFOIGhhbmRsaW5nLiBJJiMzOTtsbCBzdGFydCB3aXRoIGEgc3RyYWlnaHRmb3J3YXJkIHNlYXJjaCBhbmQgc2VlIHdoYXQgSSBmaW5kLiBUaGVuIEkgY2FuIGZpZ3VyZSBvdXQgaG93IHRoYXQgaXMgcmVsYXRpbmcgdG8gdGhlIHdob2xlIHN5c3RlbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYz0xOTA9c3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHZsYW5fdHVubmVsX3BvbGljeVtJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9NQVggJiM0MzsgMV0gPSB7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTE5OC1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoxOTk6aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMDAtXHRcdFx0dTE2IHZpZCwgdTMyIHR1bl9pZCwgYm9vbCAqY2hhbmdlZClcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9Mjg2PWludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMTEtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzEyOlx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMzEzLVx0XHRcdGlmIChlcnIpXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzMi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMzM6XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB0aW5mb19jdXJyLVx1MDAzZXZpZCxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMzQtXHRcdFx0XHRcdCAgdGluZm9fY3Vyci1cdTAwM2V0dW5pZCwgY2hhbmdlZCk7XG4tLVxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oPTMwPWJvb2wgdmxhbl90dW5pZF9pbnJhbmdlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfY3Vycixcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zMS1cdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2X2xhc3QpO1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjMyOmludCBicl92bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMzMtXHRcdFx0dTE2IHZpZCwgdTMyIHR1bl9pZCwgYm9vbCAqY2hhbmdlZCk7XG4tLVxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTIxMy1cbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM6MjE0Olx0cmV0dXJuIGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LVx1MDAzZXZpZCwgdHVuX2lkLCBjaGFuZ2VkKTtcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMjE1LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM3MzQKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBicl92bGFuX3R1bm5lbF9pbmZvKioKCkFscmlnaHQsIHNvIGBicl92bGFuX3R1bm5lbF9pbmZvYCBpcyBhbHNvIGRlZmluZWQgd2l0aGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBJbnRlcmVzdGluZy4gR2l2ZW4gdGhlIGNvbnRleHQsIHRoYXQgZmlsZSBpcyB0aGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gc3RhcnQgZGlnZ2luZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IHN0cnVjdHVyZSBhbmQgaXRzIHVzYWdlLiBJdCBtYWtlcyBzZW5zZSwgZ2l2ZW4gdGhlIG5hbWUsIHRoYXQgaXQgd291bGQgZGVhbCB3aXRoIHR1bm5lbGluZyBhbmQgVkxBTiBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGJyaWRnaW5nIGNvbnRleHQuIExldCYjMzk7cyBkaXZlIGludG8gdGhlIGNvZGUgaW4gdGhhdCBmaWxlIGFuZCBzZWUgaG93IHRoaXMgYGJyX3ZsYW5fdHVubmVsX2luZm9gIHN0cnVjdCBpcyBhY3R1YWxseSB1dGlsaXplZC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgaG93IGl0JiMzOTtzIGluaXRpYWxpemVkLCBtb2RpZmllZCwgYW5kIGNvbnN1bWVkIHdpdGhpbiB0aGUgbmV0bGluayBmcmFtZXdvcmssIHBheWluZyBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBpdHMgcmVsYXRpb25zaGlwIHdpdGggdGhlIHR1bm5lbCBpbmZyYXN0cnVjdHVyZSBhbmQgVkxBTiBjb25maWd1cmF0aW9uLiBJIGV4cGVjdCB0byBmaW5kIHNvbWUga2V5IGluc2lnaHRzIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5OSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTk5Olx0aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbiAyMDA6XHRcdFx0XHR1MTYgdmlkLCB1MzIgdHVuX2lkLCBib29sICpjaGFuZ2VkKVxuIDIwMTpcdHtcbiAyMDI6XHRcdGludCBlcnIgPSAwO1xuIDIwMzpcdFxuIDIwNDpcdFx0aWYgKCFwKVxuIDIwNTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyMDY6XHRcbiAyMDc6XHRcdHN3aXRjaCAoY21kKSB7XG4gMjA4Olx0XHRjYXNlIFJUTV9TRVRMSU5LOlxuIDIwOTpcdFx0XHRlcnIgPSBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQocCwgdmlkLCB0dW5faWQpO1xuIDIxMDpcdFx0XHRpZiAoIWVycilcbiAyMTE6XHRcdFx0XHQqY2hhbmdlZCA9IHRydWU7XG4gMjEyOlx0XHRcdGJyZWFrO1xuIDIxMzpcdFx0Y2FzZSBSVE1fREVMTElOSzpcbiAyMTQ6XHRcdFx0aWYgKCFuYnBfdmxhbl90dW5uZWxfaW5mb19kZWxldGUocCwgdmlkKSlcbiAyMTU6XHRcdFx0XHQqY2hhbmdlZCA9IHRydWU7XG4gMjE2Olx0XHRcdGJyZWFrO1xuIDIxNzpcdFx0fVxuIDIxODpcdFxuIDIxOTpcdFx0cmV0dXJuIGVycjtcbiAyMjA6XHR9XG4gMjIxOlx0XG4gMjIyOlx0aW50IGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8oc3RydWN0IG5sYXR0ciAqYXR0cixcbiAyMjM6XHRcdFx0XHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbylcbiAyMjQ6XHR7XG4gMjI1Olx0XHRzdHJ1Y3QgbmxhdHRyICp0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9NQVggJiM0MzsgMV07XG4gMjI2Olx0XHR1MzIgdHVuX2lkO1xuIDIyNzpcdFx0dTE2IHZpZCwgZmxhZ3MgPSAwO1xuIDIyODpcdFx0aW50IGVycjtcbiAyMjk6XHRcbiAyMzA6XHRcdG1lbXNldCh0aW5mbywgMCwgc2l6ZW9mKCp0aW5mbykpO1xuIDIzMTpcdFxuIDIzMjpcdFx0ZXJyID0gbmxhX3BhcnNlX25lc3RlZF9kZXByZWNhdGVkKHRiLCBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9NQVgsXG4gMjMzOlx0XHRcdFx0XHRcdCAgYXR0ciwgdmxhbl90dW5uZWxfcG9saWN5LCBOVUxMKTtcbiAyMzQ6XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gMjM1Olx0XHRcdHJldHVybiBlcnI7XG4gMjM2Olx0XG4gMjM3Olx0XHRpZiAoIXRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lEXSB8fFxuIDIzODpcdFx0ICAgICF0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9WSURdKVxuIDIzOTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyNDA6XHRcbiAyNDE6XHRcdHR1bl9pZCA9IG5sYV9nZXRfdTMyKHRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lEXSk7XG4gMjQyOlx0XHR2aWQgPSBubGFfZ2V0X3UxNih0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9WSURdKTtcbiAyNDM6XHRcdGlmICh2aWQgXHUwMDNlPSBWTEFOX1ZJRF9NQVNLKVxuIDI0NDpcdFx0XHRyZXR1cm4gLUVSQU5HRTtcbiAyNDU6XHRcbiAyNDY6XHRcdGlmICh0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9GTEFHU10pXG4gMjQ3Olx0XHRcdGZsYWdzID0gbmxhX2dldF91MTYodGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1NdKTtcbiAyNDg6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ3OTIKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKlRyYWNpbmcgdGhlIFZMQU4gVHVubmVsIEFkZGl0aW9uIEZ1bmN0aW9uKioKCk9rYXksIHNvIHRoZSBjb2RlJiMzOTtzIGludm9raW5nIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gcGlucG9pbnQgd2hlcmUgKnRoYXQqIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGRlZmluZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzaWduYXR1cmUsIHdoYXQgaXQgZXhwZWN0cyBhcyBpbnB1dHMsIGFuZCBtb3N0IGltcG9ydGFudGx5LCB3aGF0IGl0JiMzOTtzIGFjdHVhbGx5ICpkb2luZyogdW5kZXIgdGhlIGhvb2QgdG8gaGFuZGxlIFZMQU4gdHVubmVsIGluZm9ybWF0aW9uLiBLbm93aW5nIHRoZSBkZWZpbml0aW9uIGlzIHRoZSBjcml0aWNhbCBmaXJzdCBzdGVwIHRvIHVucGFja2luZyB0aGUgbG9naWMgZmxvdyBhbmQgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2FsbCB3aXRoaW4gdGhlIGxhcmdlciBzeXN0ZW0uIExldCYjMzk7cyBzZWUgaWYgSSBjYW4gcXVpY2tseSBqdW1wIHRvIHRoZSBkZWNsYXJhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTE5OT1pbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMDgtXHRjYXNlIFJUTV9TRVRMSU5LOlxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjIwOTpcdFx0ZXJyID0gbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKHAsIHZpZCwgdHVuX2lkKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMTAtXHRcdGlmICghZXJyKVxuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0zOT1pbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZGVsZXRlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQpO1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjQwOmludCBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwgdTE2IHZpZCxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC00MS1cdFx0XHQgICAgIHUzMiB0dW5faWQpO1xuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD01Nj1zdGF0aWMgaW5saW5lIGludCBuYnBfdmxhbl90dW5uZWxfaW5mb19kZWxldGUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtNjEtXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6NjI6c3RhdGljIGlubGluZSBpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtNjMtXHRcdFx0XHRcdCAgIHUxNiB2aWQsIHUzMiB0dW5faWQpXG4tLVxubmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jPTYzPXN0YXRpYyBpbnQgX192bGFuX3R1bm5lbF9pbmZvX2FkZChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyxcbi0tXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmMtOTctICovXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmM6OTg6aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLFxubmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jLTk5LVx0XHRcdCAgICAgdTMyIHR1bl9pZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1MTUKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyB0aGUgVkxBTiBUdW5uZWxpbmcgRnVuY3Rpb25hbGl0eSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgIGZ1bmN0aW9uLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIGRlZmluZWQgaW4gYG5ldC9icmlkZ2UvYnJfdmxhbl90dW5uZWwuY2AsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIHRoZSBmdW5jdGlvbiBuYW1lLiBOb3csIGxldCYjMzk7cyBzZWUsIHRoYXQgZmlsZSwgYGJyX3ZsYW5fdHVubmVsLmNgLCBpcyBjb21waWxlZCBjb25kaXRpb25hbGx5LCBzcGVjaWZpY2FsbHksIGlmIHRoZSBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2Aga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIGVuYWJsZWQuIFRoYXQmIzM5O3MgZ29vZCB0byBrbm93OyBpdCBoZWxwcyBtZSB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IGhhcHBlbnMgaWYgZmlsdGVyaW5nIGlzbiYjMzk7dCBlbmFibGVkLiBUaGVyZWZvcmUsIEkgc2hvdWxkIGNoZWNrIGBuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmhgIHRvIHNlZSBob3cgdGhhdCBmdW5jdGlvbiBpcyBoYW5kbGVkIGluIHNjZW5hcmlvcyB3aGVyZSBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgZGlzYWJsZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IgaW4gdGhhdCBzaXR1YXRpb24uIFRoYXQgd2lsbCB0ZWxsIG1lIGlmIHRoZXJlJiMzOTtzIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9yIGlmIHRoZSBmdW5jdGlvbiBpcyBzdHViYmVkIG91dCBzb21laG93LiBUaGlzIGNvbnRleHR1YWwgdW5kZXJzdGFuZGluZyBpcyBjcnVjaWFsIGZvciBhIGNvbXBsZXRlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAzNTpcdCNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HXG4gIDM2Olx0LyogYnJfdmxhbl90dW5uZWwuYyAqL1xuICAzNzpcdGludCB2bGFuX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKTtcbiAgMzg6XHR2b2lkIHZsYW5fdHVubmVsX2RlaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XG4gIDM5Olx0aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkKTtcbiAgNDA6XHRpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQsXG4gIDQxOlx0XHRcdFx0ICAgICB1MzIgdHVuX2lkKTtcbiAgNDI6XHR2b2lkIG5icF92bGFuX3R1bm5lbF9pbmZvX2ZsdXNoKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQpO1xuICA0MzpcdHZvaWQgdmxhbl90dW5uZWxfaW5mb19kZWwoc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcsXG4gIDQ0Olx0XHRcdFx0ICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2bGFuKTtcbiAgNDU6XHR2b2lkIGJyX2hhbmRsZV9pbmdyZXNzX3ZsYW5fdHVubmVsKHN0cnVjdCBza19idWZmICpza2IsXG4gIDQ2Olx0XHRcdFx0XHQgICBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuICA0NzpcdFx0XHRcdFx0ICAgc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcpO1xuICA0ODpcdGludCBicl9oYW5kbGVfZWdyZXNzX3ZsYW5fdHVubmVsKHN0cnVjdCBza19idWZmICpza2IsXG4gIDQ5Olx0XHRcdFx0XHQgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdmxhbik7XG4gIDUwOlx0I2Vsc2VcbiAgNTE6XHRzdGF0aWMgaW5saW5lIGludCB2bGFuX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKVxuICA1MjpcdHtcbiAgNTM6XHRcdHJldHVybiAwO1xuICA1NDpcdH1cbiAgNTU6XHRcbiAgNTY6XHRzdGF0aWMgaW5saW5lIGludCBuYnBfdmxhbl90dW5uZWxfaW5mb19kZWxldGUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCxcbiAgNTc6XHRcdFx0XHRcdFx0ICAgICAgdTE2IHZpZClcbiAgNTg6XHR7XG4gIDU5Olx0XHRyZXR1cm4gMDtcbiAgNjA6XHR9XG4gIDYxOlx0XG4gIDYyOlx0c3RhdGljIGlubGluZSBpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsXG4gIDYzOlx0XHRcdFx0XHRcdCAgIHUxNiB2aWQsIHUzMiB0dW5faWQpXG4gIDY0Olx0e1xuICA2NTpcdFx0cmV0dXJuIDA7XG4gIDY2Olx0fVxuICA2NzpcdFxuICA2ODpcdHN0YXRpYyBpbmxpbmUgdm9pZCBuYnBfdmxhbl90dW5uZWxfaW5mb19mbHVzaChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0KVxuICA2OTpcdHtcbiAgNzA6XHR9XG4gIDcxOlx0XG4gIDcyOlx0c3RhdGljIGlubGluZSB2b2lkIHZsYW5fdHVubmVsX2luZm9fZGVsKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnLFxuICA3MzpcdFx0XHRcdFx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2bGFuKVxuICA3NDpcdHtcbiAgNzU6XHR9XG4gIDc2Olx0XG4gIDc3Olx0c3RhdGljIGlubGluZSBpbnQgYnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAgNzg6XHRcdFx0XHRcdFx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuICA3OTpcdFx0XHRcdFx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKVxuICA4MDpcdHtcbiAgODE6XHRcdHJldHVybiAwO1xuICA4MjpcdH1cbiAgODM6XHQjZW5kaWZcbiAgODQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY2NzgKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxNjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBWTEFOIFR1bm5lbGluZyBMb2dpYyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgIGZ1bmN0aW9uLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIGdvaW5nIHRvIHJldHVybiAwIHdoZW4gYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGlzIGRpc2FibGVkLiBUaGF0IHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2guIEJ1dCwgSSYjMzk7bSBzdGFydGluZyB0byBzZWUgdGhlIHBvdGVudGlhbCBwcm9ibGVtIG5vdy4uLiB0aGUgYnVnLCBJIGJlbGlldmUsIGlzIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBBbmQgdGhhdCYjMzk7cyBpbiBgYnJfbmV0bGlua190dW5uZWwuY2AsIHdoaWNoLCBhcyBmYXIgYXMgSSBjYW4gc2VlLCBpcyAqYWx3YXlzKiBjb21waWxlZCBpZiBgQ09ORklHX0JSSURHRWAgaXMgZW5hYmxlZC4KClJpZ2h0LCBsZXQgbWUgdGhpbmsgdGhpcyB0aHJvdWdoLiBJZiBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgZGlzYWJsZWQsIHRoZSBmdW5jdGlvbiBgYnJfdmxhbl90dW5uZWxfaW5mb2AsIHdoaWNoIGlzIHRoZSBvbmUgY2FsbGluZyBgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkYCwgd2lsbCBqdXN0IGVuZCB1cCByZXR1cm5pbmcgMC4gVGhhdCYjMzk7cyBmaW5lLCBidXQuLi4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgKnN0aWxsKiBnb2luZyB0byBleGVjdXRlIGl0cyBsb2dpYyEgVGhhdCYjMzk7cyB0aGUgY3J1eCBvZiBpdCwgaXNuJiMzOTt0IGl0PyBFdmVuIHRob3VnaCB3ZSYjMzk7cmUgbm90IGFjdHVhbGx5IGZpbHRlcmluZywgdGhhdCBmdW5jdGlvbiBpcyBzdGlsbCBnb2luZyB0byBiZSBkb2luZyBzb21ldGhpbmcuCgpMZXQgbWUgZ28gYmFjayBhbmQgcmUtZXhhbWluZSBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBtb3JlIGNsb3NlbHkgbm93LiBJIG5lZWQgdG8gc2VlIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHRoZXJlLCBldmVuIHdoZW4gdGhlIFZMQU4gZmlsdGVyaW5nIHBhcnQgaXMgYnlwYXNzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjkwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyOTA6XHRcdFx0XHRcdGJvb2wgKmNoYW5nZWQpXG4gMjkxOlx0e1xuIDI5MjpcdFx0aW50IGVycjtcbiAyOTM6XHRcbiAyOTQ6XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XG4gMjk1Olx0XHRcdGlmICh0aW5mb19sYXN0LVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKVxuIDI5NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDI5NzpcdFx0XHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbiAyOTg6XHRcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcbiAyOTk6XHRcdFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9zdGFydCA9IE5VTEwsICp2X2VuZCA9IE5VTEw7XG4gMzAwOlx0XHRcdGludCB0LCB2O1xuIDMwMTpcdFxuIDMwMjpcdFx0XHRpZiAoISh0aW5mb19sYXN0LVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcbiAzMDM6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDQ6XHRcdFx0aWYgKHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZCB8fFxuIDMwNTpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4gMzA2Olx0XHRcdCAgICAodGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWQpKVxuIDMwNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDMwODpcdFx0XHR0ID0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZDtcbiAzMDk6XHRcdFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cdTAwM2V2aWQ7IHYgXHUwMDNjPSB0aW5mb19jdXJyLVx1MDAzZXZpZDsgdiYjNDM7JiM0MzspIHtcbiAzMTA6XHRcdFx0XHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XG4gMzExOlx0XG4gMzEyOlx0XHRcdFx0ZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYsIHQsIFx1MDAyNmN1cnJfY2hhbmdlKTtcbiAzMTM6XHRcdFx0XHRpZiAoZXJyKVxuIDMxNDpcdFx0XHRcdFx0YnJlYWs7XG4gMzE1Olx0XHRcdFx0dCYjNDM7JiM0Mzs7XG4gMzE2Olx0XG4gMzE3Olx0XHRcdFx0aWYgKGN1cnJfY2hhbmdlKVxuIDMxODpcdFx0XHRcdFx0KmNoYW5nZWQgPSBjdXJyX2NoYW5nZTtcbiAzMTk6XHRcdFx0XHRfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShwLCBcdTAwMjZ2X3N0YXJ0LCBcdTAwMjZ2X2VuZCwgdixcbiAzMjA6XHRcdFx0XHRcdFx0XHQgICBjdXJyX2NoYW5nZSk7XG4gMzIxOlx0XHRcdH1cbiAzMjI6XHRcdFx0aWYgKHZfc3RhcnQgXHUwMDI2XHUwMDI2IHZfZW5kKVxuIDMyMzpcdFx0XHRcdGJyX3ZsYW5fbm90aWZ5KGJyLCBwLCB2X3N0YXJ0LVx1MDAzZXZpZCwgdl9lbmQtXHUwMDNldmlkLFxuIDMyNDpcdFx0XHRcdFx0ICAgICAgIFJUTV9ORVdWTEFOKTtcbiAzMjU6XHRcdFx0aWYgKGVycilcbiAzMjY6XHRcdFx0XHRyZXR1cm4gZXJyO1xuIDMyNzpcdFxuIDMyODpcdFx0XHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbiAzMjk6XHRcdFx0bWVtc2V0KHRpbmZvX2N1cnIsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3ODc5CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNTI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRlYnVnZ2luZyBhIFN1YnRsZSBMb29wIENvbmRpdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCB0aGUgbG9vcCBgZm9yICh2ID0gdGluZm9fbGFzdC0mZ3Q7dmlkOyB2ICZsdDs9IHRpbmZvX2N1cnItJmd0O3ZpZDsgdiYjNDM7JiM0MzspYCBzaW1wbHkgd291bGRuJiMzOTt0IHJ1bi4gYHZgIGlzIGFuIGBpbnRgLCBzbyBhIHNpbXBsZSBjb21wYXJpc29uIHNob3VsZCBwcmV2ZW50IHRoZSBsb29wIGZyb20gc3RhcnRpbmcgaWYgdGhhdCYjMzk7cyB0aGUgY2FzZS4gSXQgd291bGRuJiMzOTt0IHdhaXQgZWl0aGVyLgoKVGhlbiBJIHJlbWVtYmVyZWQgdGhlcmUgd2FzIGEgYnVnIHJlbGF0ZWQgdG8gYSBzdWJ0cmFjdGlvbi4gVGhlIGNvcmUgcHJvYmxlbSBsaWVzIGluIHRoaXMgY29tcGFyaXNvbjogYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpYCB2ZXJzdXMgYCh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIEkgbmVlZCB0byB0aGluayBjYXJlZnVsbHkgYWJvdXQgdGhlIHR5cGVzIGludm9sdmVkLgoKYHZpZGAgaXMgYSBgdTE2YCBhbmQgYHR1bmlkYCBpcyBhIGB1MzJgLiBUaGlzIGRpZmZlcmVuY2UgaXMgdGhlIGtleSEgIFdoZW4gc3VidHJhY3RpbmcgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgZnJvbSBgdGluZm9fY3Vyci0mZ3Q7dmlkYCwgdGhlIGB1MTZgIHR5cGVzIGdldCBwcm9tb3RlZCB0byBgaW50YCBiZWNhdXNlIGB1MTZgIHZhbHVlcyBjYW4gYmUgc3RvcmVkIGluIGFuIGBpbnRgIHNhZmVseSwgYWxsb3dpbmcgZm9yIG5lZ2F0aXZlIHJlc3VsdHMuIEJ1dCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgaXMgYSBgdTMyIC0gdTMyYCBvcGVyYXRpb24sIHdoaWNoIHJlc3VsdHMgaW4gYW4gdW5zaWduZWQgYHUzMmAuCgpTbywgd2UgaGF2ZSBhIG5lZ2F0aXZlIGBpbnRgIGJlaW5nIGNvbXBhcmVkIHRvIGFuIHVuc2lnbmVkIGB1MzJgLiAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCB0aGUgYGludGAgdG8gYSBgdTMyYCBmb3IgdGhlIGNvbXBhcmlzb24uIElmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlIHN1YnRyYWN0aW9uIHdpbGwgcmVzdWx0IGluIGEgbmVnYXRpdmUgYGludGAgd2hpY2gsIHdoZW4gY29udmVydGVkIHRvIGEgYHUzMmAsIGJlY29tZXMgYSAqdmVyeSogbGFyZ2UgdW5zaWduZWQgbnVtYmVyISBJZiB0aGUgYHR1bmlkYCB2YWx1ZXMgYWxzbyB3cmFwIGFyb3VuZCBpbiBhIHNpbWlsYXIgd2F5LCB0aGUgYHUzMmAgY29tcGFyaXNvbiBjYW4gc3RpbGwgcGFzcyBiZWNhdXNlIHRoZSBsYXJnZSBgdTMyYCB2YWx1ZSBjYW4gZXF1YWwgdGhlIHJlc3VsdCBvZiBgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpYC4KClRoYXQgbWVhbnMgdGhlIGxvb3AgdGhlbiBleGVjdXRlcy4gQnV0IHdhaXQuLi4gaWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoZSBsb29wIGNvbmRpdGlvbiBgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWRgIHdvdWxkIGJlIGluaXRpYWxseSBmYWxzZSwgc28gdGhlIGxvb3Agd291bGQgZXhlY3V0ZSB6ZXJvIHRpbWVzISBUaGF0IGRvZXNuJiMzOTt0IG1ha2Ugc2Vuc2UgYXMgYSBidWcuCgpJZiB0aGUgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCB3aGVyZSYjMzk7cyB0aGUgYnVnPwoKSSBuZWVkIHRvIHJlLWV4YW1pbmUgbXkgYXNzdW1wdGlvbiBvZiB3aGVyZSB0aGUgYnVnIGxpZXMuCgpPaCEgSSYjMzk7bSBiYWNrIG9uIHRyYWNrLgoKSWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIGFuZCB0aGUgbG9vcCBpcyBzdHJ1Y3R1cmVkIGFzIGBmb3IgKHYgPSB0aW5mb19sYXN0LSZndDt2aWQ7IHYgJmx0Oz0gdGluZm9fY3Vyci0mZ3Q7dmlkOyB2JiM0MzsmIzQzOylgLCB0aGUgbG9vcCBleGVjdXRlcy4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoZW4gdGhlIGxvb3AgaXMgZW50ZXJlZCBvbmx5IGlmIHRoZSB1bnNpZ25lZCB2YWx1ZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UsIG1lYW5pbmcgdGhhdCBgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGZhbHNlIG9uIHRoZSBmaXJzdCBleGVjdXRpb24sIHNvIHRoZSBsb29wIGV4ZWN1dGVzIDAgdGltZXMuIFRoZSB0eXBlcyBhcmUgY3JpdGljYWwgaGVyZS4gQW5kIGluIHRoaXMgY2FzZSBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyBhIGB1MTZgIGJ1dCBgdmAgaXMgYW4gYGludGAuCgpTbywgbGV0IG1lIGNoZWNrIHRoZSB0eXBlcyBvZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBhbmQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgdG8gZWxpbWluYXRlIGFsbCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBidWdzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgdnR1bm5lbF9pbmZvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9ODA5PXN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MTctXHRzdHJ1Y3QgbmxhdHRyICphdHRyO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODE4Olx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19sYXN0ID0ge307XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MTk6XHRzdHJ1Y3QgdnR1bm5lbF9pbmZvIHRpbmZvX2N1cnIgPSB7fTtcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyMC1cdGludCBlcnIgPSAwLCByZW07XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTIyMj1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjIyMzpcdFx0XHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbylcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMjQte1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYz0yODY9aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjg3LVx0XHRcdFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoyODg6XHRcdFx0XHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19jdXJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI4OTpcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjkwLVx0XHRcdFx0Ym9vbCAqY2hhbmdlZClcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjk2LVx0XHRcdHJldHVybiAtRUlOVkFMO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI5NzpcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjk4LVx0fSBlbHNlIGlmICh0aW5mb19jdXJyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMjctXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzI4Olx0XHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMjk6XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzMC1cdH0gZWxzZSB7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzNy1cdFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHRpbmZvX2N1cnItXHUwMDNldmlkLCAwLCBSVE1fTkVXVkxBTik7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzM4Olx0XHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMzk6XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTM0MC1cdH1cbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMTEtXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MTI6c3RydWN0IHZ0dW5uZWxfaW5mbyB7XG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMTMtXHR1MzJcdHR1bmlkO1xuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0xOT1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjIwOlx0XHRcdCAgICAgIHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvKTtcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMS1pbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjMtXHRcdFx0XHRpbnQgY21kLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjI0Olx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3Vycixcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyNTpcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjYtXHRcdFx0XHRib29sICpjaGFuZ2VkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAxNzgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipEaXZpbmcgaW50byB0aGUgVHVubmVsIERldGFpbHMqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgZ3JhbnVsYXIuIFRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgaW4gdGhlIGJyaWRnaW5nIGNvZGUgcmVsYXRlZCB0byB0dW5uZWxzLCBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhlIGRhdGEgaXMgYmVpbmcgc3RydWN0dXJlZC4gVGhlIG5hdHVyYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHRoYXQgaXMgdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB2dHVubmVsX2luZm9gLiBTbywgbGV0JiMzOTtzIHB1bGwgdXAgYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAgYW5kIHRha2UgYSBsb29rLiBJJiMzOTtsbCBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgZmllbGRzIGFyZSBkZWZpbmVkLCB3aGF0IHRoZXkgcmVwcmVzZW50LCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBvdmVyYWxsIGJyaWRnaW5nIGFuZCB0dW5uZWxpbmcgYXJjaGl0ZWN0dXJlLiBUaGlzIHNob3VsZCBnaXZlIG1lIHRoZSBmb3VuZGF0aW9uIEkgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGFjdHVhbCBwYWNrZXQgcHJvY2Vzc2luZyBsb2dpYy4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBzdHJ1Y3QgdG8gaG9sZCB0aGUgcmVsZXZhbnQgdHVubmVsIGlkZW50aWZpZXJzLCBwZXJoYXBzIHNvbWUgZW5jYXBzdWxhdGlvbiBkZXRhaWxzLCBhbmQgZGVmaW5pdGVseSBzb21lIHNvcnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgdHVubmVsLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgaW4gdGhlcmUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xuICAgMjpcdC8qXG4gICAzOlx0ICpcdEJyaWRnZSBwZXIgdmxhbiB0dW5uZWxzXG4gICA0Olx0ICpcbiAgIDU6XHQgKlx0QXV0aG9yczpcbiAgIDY6XHQgKlx0Um9vcGEgUHJhYmh1XHRcdFx1MDAzY3Jvb3BhQGN1bXVsdXNuZXR3b3Jrcy5jb21cdTAwM2VcbiAgIDc6XHQgKi9cbiAgIDg6XHRcbiAgIDk6XHQjaWZuZGVmIF9CUl9QUklWQVRFX1RVTk5FTF9IXG4gIDEwOlx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxuICAxMTpcdFxuICAxMjpcdHN0cnVjdCB2dHVubmVsX2luZm8ge1xuICAxMzpcdFx0dTMyXHR0dW5pZDtcbiAgMTQ6XHRcdHUxNlx0dmlkO1xuICAxNTpcdFx0dTE2XHRmbGFncztcbiAgMTY6XHR9O1xuICAxNzpcdFxuICAxODpcdC8qIGJyX25ldGxpbmtfdHVubmVsLmMgKi9cbiAgMTk6XHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxuICAyMDpcdFx0XHRcdCAgICAgIHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2OTIKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxMzc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBJbnRlZ2VyIE92ZXJmbG93IGFuZCBJdHMgRml4KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBpcyB0aGF0IGB2aWRgIGlzIGEgYHUxNmAuIElmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlaXIgZGlmZmVyZW5jZSBpcyBuZWdhdGl2ZSwgcmlnaHQ/IFRoZSBpc3N1ZSBpcywgdGhpcyBzdWJ0cmFjdGlvbiBgdGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkYCBpcyBldmFsdWF0ZWQgYXMgYW4gYGludGAgYmVjYXVzZSBvZiB0aGUgdXN1YWwgaW50ZWdlciBwcm9tb3Rpb24gcnVsZXMuIElmLCBzYXksIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIDAgYW5kIGB0aW5mb19sYXN0LSZndDt2aWRgIGlzIDEwLCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIHdpbGwgYmUgLTEwLgoKTm93LCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGFyZSBib3RoIGB1MzJgLiBUaGlzIGRpZmZlcmVuY2UsIGB0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkYCwgaXMgZXZhbHVhdGVkIGFzIGB1MzJgLiBTbywgaGVyZSYjMzk7cyB3aGVyZSB0aGUgcG90ZW50aWFsIHByb2JsZW0gbGllczogYC0xMGAgKGFzIGFuIGBpbnRgKSBnZXRzIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgdmVyeSBsYXJnZSBgdTMyYCwgc3BlY2lmaWNhbGx5IDQyOTQ5NjcyODYuIE5vdyB0aGUgY29tcGFyaXNvbiBgKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0gKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpYCBjb3VsZCBiZWNvbWUgRkFMU0UuCgpJZiB0aGF0IGNvbXBhcmlzb24gaXMgZmFsc2UsIHRoZSBjb2RlIHByb2NlZWRzIHRvIGxvb3AuICBIb3dldmVyLCB0aGUgbG9vcCBpdHNlbGYgbG9va3Mgc3VzcGljaW91cy4gSWYgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgMTAgYW5kIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIDAsIHRoZSBsb29wIGNvbmRpdGlvbiBgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWRgIHdvdWxkIGJlIGZhbHNlIGZyb20gdGhlIHN0YXJ0LiAgVGhlIGxvb3Agd29uJiMzOTt0IGV4ZWN1dGUuIFRoZSBjb2RlIHNraXBzIHRoZSByYW5nZSBwcm9jZXNzaW5nIGFuZCB0aGUgYGJyX3ZsYW5fbm90aWZ5YCBjYWxsIGFuZCBqdXN0IHJldHVybnMgYW4gZXJyb3IgY29kZSAwLiBFc3NlbnRpYWxseSwgdGhlIGNvZGUgc2lsZW50bHkgaWdub3JlcyB0aGUgaW52YWxpZCByYW5nZSwgd2hpY2ggc2VlbXMgbGlrZSBhIGJ1Zy4gSWYgdGhlIGxvb3AgKmRpZCogZXhlY3V0ZSwgdGhlIGNvbXBhcmlzb24gaW4gdGhlIGxvb3AsIHRoYXQgd291bGQgcHJldmVudCB0aGUgbG9vcCBmcm9tIGl0ZXJhdGluZyBpbiBhbiBvdXQtb2YtYm91bmRzIHNjZW5hcmlvLgoKSSB3YXMgdHJ5aW5nIHRvIGNvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dmlkYCBpcyAweEZGRkYuIFRoYXQgbWFrZXMgdGhlIGRpZmZlcmVuY2UgYDAgLSA2NTUzNSA9IC02NTUzNWAuCgpOb3csIGxvb2tpbmcgYXQgdGhlIGZpeCwgaXQgaW50cm9kdWNlcyBhbiBlYXJseSByZXR1cm4gd2l0aCBgLUVJTlZBTGAgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAuIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdvdWxkIHNpbXBseSBza2lwIHRoZSBsb29wIGFuZCByZXR1cm4gMCAoc3VjY2VzcykuIFRoaXMgZWFybHkgcmV0dXJuIHNlZW1zIHJpZ2h0IGJlY2F1c2UgaXQgc2lnbmFscyB0aGUgZXJyb3IuIFJldHVybmluZyAwIHdoZW4gdGhlIHJhbmdlIGlzIGludmFsaWQgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yLiBUaGUgcHJvZ3JhbSBjYW4gbGVhdmUgYHRpbmZvX2xhc3RgIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4gVGhlbiwgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGB0aW5mb19sYXN0YCBhbmQgYHRpbmZvX2N1cnJgIGFyZSB6ZXJvZWQgb3V0IGFueXdheS4KClRoZSBrZXkgY2hhbmdlLCB0aGUgcGF0Y2gsIGp1c3QgYmxvY2tzIHRoZSBjb2RlIGZyb20gZG9pbmcgYW55dGhpbmcgd2hlbiB0aGUgbmV3IGB2aWRgIGlzIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZS4gVGhlIGNvZGUgZGlkIG5vdGhpbmcgYW55d2F5LCBidXQgbm93IGl0IHJldHVybnMgYW4gZXJyb3IuIFRoaXMgYXZvaWRzIHRoZSBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb24gaXNzdWUgd2hlcmUgYSBuZWdhdGl2ZSBgaW50YCBkaWZmZXJlbmNlIGJlY29tZXMgYSBsYXJnZSBgdTMyYCB2YWx1ZSwgcG90ZW50aWFsbHkgYnlwYXNzaW5nIHRoZSBpbmVxdWFsaXR5IGNoZWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5OCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjMxNTIKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA4NDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBJc3N1ZXMgd2l0aCB0aGUgVHVubmVsIElEIGFuZCBWTEFOIElEIENvbXBhcmlzb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkgSSBzZWUgYHZgIGlzIGFuIGludGVnZXIsIGFuZCBpdCYjMzk7cyBiZWluZyBjb21wYXJlZCB0byBgdGluZm9fY3Vyci0mZ3Q7dmlkYCwgd2hpY2ggaXMgYSBgdTE2YC4gUmlnaHQgYXdheSwgdGhlIGNvbXBhcmlzb24gaXMgZ29pbmcgdG8gcHJvbW90ZSB0aGUgYHUxNmAgdG8gYW4gYGludGAuIE5vdywgaWYgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgZ3JlYXRlciB0aGFuIGB0aW5mb19jdXJyLSZndDt2aWRgLCB0aGUgbG9vcCBjb25kaXRpb24gYHYgJmx0Oz0gdGluZm9fY3Vyci0mZ3Q7dmlkYCBiZWNvbWVzIGZhbHNlIGZyb20gdGhlIGdldC1nby4gTm8gZXhlY3V0aW9uLiBObyBiaWcgZGVhbCwgcmlnaHQ/CgpCdXQgd2FpdC4gVGhpcyBtZWFucyB0aGUgbG9vcCAqZG9lc24mIzM5O3QqIGV4ZWN1dGUuIElmIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIGV2YWx1YXRlZCBhcyBhbiBgaW50YCwgYW5kIGB0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkYCBpcyBhIGB1MzJgLCBhbmQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCBpdCByZXR1cm5zIDAuIFJldHVybmluZyAwIHVzdWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MsIHdoaWNoIG1lYW5zIHRoZSBjb2RlIGlzICpzdXBwb3NlZCogdG8gc3VjY2VlZC4gQnV0IGl0IGRpZG4mIzM5O3QgKmRvKiBhbnl0aGluZy4gSXQmIzM5O3MganVzdCBjb25zdW1lZCBgUkFOR0VfQkVHSU5gIGFuZCBgUkFOR0VfRU5EYCB3aXRob3V0IGFkZGluZyB0aGUgdHVubmVscywgdGhlbiBpdCBjbGVhcnMgYHRpbmZvX2xhc3RgIGFuZCBgdGluZm9fY3VycmAuIFRoaXMgY291bGQgYmUgY29uc2lkZXJlZCBhIHNpbGVudCBmYWlsdXJlIHRvIGFkZCBhIHJhbmdlISBJIHRoaW5rIHRoaXMgaXMgYSBwb3RlbnRpYWwgYnVnLiBJdCYjMzk7cyBub3QgYSBjcmFzaCwgYnV0IGl0JiMzOTtzIG5vdCB3b3JraW5nIGFzIGludGVuZGVkLgoKQnV0IGhvbGQgb24sIGxldCYjMzk7cyBleHBsb3JlIGFub3RoZXIgcG9zc2liaWxpdHkuIFdoYXQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgYW5kIGB0aW5mb19sYXN0LSZndDt2aWRgIGFyZSBzdWNoIHRoYXQgdGhlIGRpZmZlcmVuY2UgaXMgcG9zaXRpdmUgYXMgYW4gaW50ZWdlciwgYnV0IGB0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkYCBpcyBuZWdhdGl2ZT8gSWYgYHRpbmZvX2N1cnItJmd0O3R1bmlkYCBpcyBzbWFsbGVyIHRoYW4gYHRpbmZvX2xhc3QtJmd0O3R1bmlkYCwgdGhlbiB0aGUgYHUzMmAgc3VidHJhY3Rpb24gZ2l2ZXMgdXMgYSBodWdlIHZhbHVlLCBiZWNhdXNlIGl0IHVuZGVyZmxvd3MuIEluIHRoaXMgY2FzZSwgY29tcGFyaW5nIGAodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKWAgdG8gYCh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAgd291bGQgYmUgdHJ1ZSBhbmQgaXQgcmV0dXJucyBgLUVJTlZBTGAuIE9rYXksIHNvIHRoYXQmIzM5O3MgaGFuZGxlZCBjb3JyZWN0bHkuIEdvb2QuCgpOb3csIEkgbmVlZCB0byBjb25zaWRlciBwb3RlbnRpYWwgdW5kZWZpbmVkIGJlaGF2aW9yLiBMZXQmIzM5O3Mgc2VlLi4uIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIGBpbnRgLCBhbmQgYHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGlzIGB1MzJgLiBJbiBDLCB0aGUgYGludGAgZ2V0cyBjb252ZXJ0ZWQgdG8gYHUzMmAgZHVyaW5nIHRoZSBjb21wYXJpc29uLiBJZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoZSBsZWZ0IHNpZGUgYmVjb21lcyBhIG5lZ2F0aXZlIGBpbnRgLCB3aGljaCBiZWNvbWVzIGEgdmVyeSBsYXJnZSBgdTMyYCBhZnRlciBjb252ZXJzaW9uLiBCZWNhdXNlIGB0aW5mb19jdXJyLSZndDt2aWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dmlkYCBhcmUgYHUxNmBzLCB0aGUgbWF4aW11bSBkaWZmZXJlbmNlIGlzIGAwIC0gNjU1MzUgPSAtNjU1MzVgLiBDb252ZXJ0ZWQgdG8gYHUzMmAsIHRoaXMgaXMgYDQyOTQ5MDE3NjFgLiBJZiBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgKmFsc28qIGVxdWFscyBgNDI5NDkwMTc2MWAsIHRoZSBsb29wICpzdGlsbCogZG9lc24mIzM5O3QgcnVuLgoKSXMgdGhlcmUgYSBtZW1vcnkgbGVhayBoZXJlPyBOb3BlLiBBbnkgb3V0LW9mLWJvdW5kcyBhY2Nlc3M/IERvZXNuJiMzOTt0IGxvb2sgbGlrZSBpdC4gU28sIG5vIFVCLCBubyBtZW1vcnkgcHJvYmxlbXMuLi4gYnV0IHRoYXQgc2lsZW50IGZhaWx1cmUgc3RpbGwgYnVncyBtZS4gSSBuZWVkIHRvIGJlIHN1cmUuIEkmIzM5O20gZ29pbmcgdG8gbG9vayBtb3JlIGNsb3NlbHkgYXQgdGhlIGBicl9wcm9jZXNzX3ZsYW5faW5mb2AgZnVuY3Rpb24gaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYCBhcyB0aGlzIHNlZW1zIGxpa2UgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciB0aGlzIHRvIGhhdmUga25vY2stb24gZWZmZWN0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfcHJvY2Vzc192bGFuX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz02OTg9c3RhdGljIGludCBicl92bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTczOC1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjczOTppbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzQwLVx0XHRcdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTgwOT1zdGF0aWMgaW50IGJyX2Fmc3BlYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODQxLVx0XHRcdHZpbmZvX2N1cnIgPSBubGFfZGF0YShhdHRyKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjg0MjpcdFx0XHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5faW5mbyhiciwgcCwgY21kLCB2aW5mb19jdXJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODQzLVx0XHRcdFx0XHRcdCAgIFx1MDAyNnZpbmZvX2xhc3QsIGNoYW5nZWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1MTExCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgYnJfcHJvY2Vzc192bGFuX2luZm9gIGZ1bmN0aW9uLgoKKipBbmFseXppbmcgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCoqCgpBbHJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCBoZXJlLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGV5ZSBzY2FucyBmb3IgaXRzIHByaW1hcnkgcHVycG9zZSDigJMgaXQgc2VlbXMgdG8gYmUgaGFuZGxpbmcgVkxBTi1yZWxhdGVkIGNvbmZpZ3VyYXRpb25zIHdpdGhpbiBhIGJyaWRnZSBjb250ZXh0LCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIEkmIzM5O2QgZXhwZWN0IGl0IHRvIGRlYWwgd2l0aCB0YWdnaW5nL3VudGFnZ2luZywgZm9yd2FyZGluZyBkZWNpc2lvbnMgYmFzZWQgb24gVkxBTiBJRHMsIGFuZCBwb3RlbnRpYWxseSBWTEFOIHRydW5raW5nIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHNvbWUgb2YgdGhlIGxpa2VseSBkYXRhIHN0cnVjdHVyZXMgaXQmIzM5O3MgaW50ZXJhY3Rpbmcgd2l0aDogcHJvYmFibHkgYnJpZGdlIHBvcnQgc3RydWN0dXJlcywgVkxBTiBtZW1iZXJzaGlwIHRhYmxlcyAob3IgZXF1aXZhbGVudCksIGFuZCBtYXliZSBzb21lIGxvdy1sZXZlbCBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmVzLgoKSSB3YW50IHRvIGtub3cgaG93IGVmZmljaWVudCBpdCBpcyBhdCBsb29raW5nIHVwIHZsYW4gaW5mb3JtYXRpb24uIElzIGl0IGEgaGFzaCB0YWJsZT8gSXMgaXQgYW4gYXJyYXk/IEhvdyBpcyBpdCBvcmdhbml6ZWQ/CgpGcm9tIGhlcmUsIEkmIzM5O2xsIHF1aWNrbHkgbG9vayBmb3IgYXJlYXMgb2YgcG90ZW50aWFsIGNvbXBsZXhpdHkuIEFyZSB0aGVyZSBhbnkgY29uZGl0aW9uYWwgYnJhbmNoZXMgdGhhdCBtaWdodCBpbmRpY2F0ZSBkaWZmZXJlbnQgVkxBTiBtb2RlcyAoZS5nLiwgYWNjZXNzLCB0cnVuaywgaHlicmlkKT8gRG9lcyBpdCBoYW5kbGUgVkxBTiB0cmFuc2xhdGlvbiBvciBRLWluLVE/IEFyZSB0aGVyZSBhbnkgb2J2aW91cyBhcmVhcyB3aGVyZSBsb2NraW5nIG1pZ2h0IGJlIG5lZWRlZCB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBhY3Jvc3MgbXVsdGlwbGUgdGhyZWFkcyBvciBicmlkZ2UgcG9ydHM/CgpJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIHNlZWluZyBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgbmV0d29yayBkZXZpY2UgZHJpdmVycy4gRG9lcyBpdCB1c2Ugc3RhbmRhcmQgbmV0bGluayBtZXNzYWdlcywgb3IgaXMgaXQgcmVhY2hpbmcgZG93biBpbnRvIHRoZSBkcml2ZXImIzM5O3MgaW50ZXJuYWxzPyBUaGF0IGNhbiBzb21ldGltZXMgYmUgYSBzb3VyY2Ugb2YgcG9ydGFiaWxpdHkgaXNzdWVzLiBJJiMzOTtsbCBhbHNvIGNoZWNrIGZvciBlcnJvciBoYW5kbGluZyDigJMgd2hhdCBoYXBwZW5zIGlmIGEgVkxBTiBJRCBpcyBpbnZhbGlkIG9yIGEgcGFydGljdWxhciBvcGVyYXRpb24gZmFpbHM/IFJvYnVzdCBlcnJvciBoYW5kbGluZyBpcyBrZXksIGVzcGVjaWFsbHkgaW4gYSBuZXR3b3JrIGZ1bmN0aW9uLgoKRXNzZW50aWFsbHksIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gYmUgYSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlLCBhbmQgSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGl0IHRob3JvdWdobHkgdG8gZW5zdXJlIHRoZSBicmlkZ2UmIzM5O3MgVkxBTiBmdW5jdGlvbmFsaXR5IGlzIHBlcmZvcm1pbmcgb3B0aW1hbGx5LCBzZWN1cmVseSwgYW5kIGluIGxpbmUgd2l0aCBteSBvdmVyYWxsIG5ldHdvcmsgYXJjaGl0ZWN0dXJlIGRlc2lnbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDczOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNzM5Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl9pbmZvKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbiA3NDA6XHRcdFx0XHQgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbiA3NDE6XHRcdFx0XHQgc3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2N1cnIsXG4gNzQyOlx0XHRcdFx0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICoqdmluZm9fbGFzdCxcbiA3NDM6XHRcdFx0XHQgYm9vbCAqY2hhbmdlZCxcbiA3NDQ6XHRcdFx0XHQgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIDc0NTpcdHtcbiA3NDY6XHRcdGludCBlcnIsIHJ0bV9jbWQ7XG4gNzQ3Olx0XG4gNzQ4Olx0XHRpZiAoIWJyX3ZsYW5fdmFsaWRfaWQodmluZm9fY3Vyci1cdTAwM2V2aWQsIGV4dGFjaykpXG4gNzQ5Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDc1MDpcdFxuIDc1MTpcdFx0LyogbmVlZGVkIGZvciB2bGFuLW9ubHkgTkVXVkxBTi9ERUxWTEFOIG5vdGlmaWNhdGlvbnMgKi9cbiA3NTI6XHRcdHJ0bV9jbWQgPSBicl9hZnNwZWNfY21kX3RvX3J0bShjbWQpO1xuIDc1MzpcdFxuIDc1NDpcdFx0aWYgKHZpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcbiA3NTU6XHRcdFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxuIDc1NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDc1NzpcdFx0XHQqdmluZm9fbGFzdCA9IHZpbmZvX2N1cnI7XG4gNzU4Olx0XHRcdHJldHVybiAwO1xuIDc1OTpcdFx0fVxuIDc2MDpcdFxuIDc2MTpcdFx0aWYgKCp2aW5mb19sYXN0KSB7XG4gNzYyOlx0XHRcdHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvIHRtcF92aW5mbztcbiA3NjM6XHRcdFx0aW50IHYsIHZfY2hhbmdlX3N0YXJ0ID0gMDtcbiA3NjQ6XHRcbiA3NjU6XHRcdFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxuIDc2NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDc2NzpcdFxuIDc2ODpcdFx0XHRtZW1jcHkoXHUwMDI2dG1wX3ZpbmZvLCAqdmluZm9fbGFzdCxcbiA3Njk6XHRcdFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbykpO1xuIDc3MDpcdFx0XHRmb3IgKHYgPSAoKnZpbmZvX2xhc3QpLVx1MDAzZXZpZDsgdiBcdTAwM2M9IHZpbmZvX2N1cnItXHUwMDNldmlkOyB2JiM0MzsmIzQzOykge1xuIDc3MTpcdFx0XHRcdGJvb2wgY3Vycl9jaGFuZ2UgPSBmYWxzZTtcbiA3NzI6XHRcbiA3NzM6XHRcdFx0XHR0bXBfdmluZm8udmlkID0gdjtcbiA3NzQ6XHRcdFx0XHRlcnIgPSBicl92bGFuX2luZm8oYnIsIHAsIGNtZCwgXHUwMDI2dG1wX3ZpbmZvLCBcdTAwMjZjdXJyX2NoYW5nZSxcbiA3NzU6XHRcdFx0XHRcdFx0ICAgZXh0YWNrKTtcbiA3NzY6XHRcdFx0XHRpZiAoZXJyKVxuIDc3NzpcdFx0XHRcdFx0YnJlYWs7XG4gNzc4Olx0XHRcdFx0aWYgKGN1cnJfY2hhbmdlKSB7XG4gNzc5Olx0XHRcdFx0XHQqY2hhbmdlZCA9IGN1cnJfY2hhbmdlO1xuIDc4MDpcdFx0XHRcdFx0aWYgKCF2X2NoYW5nZV9zdGFydClcbiA3ODE6XHRcdFx0XHRcdFx0dl9jaGFuZ2Vfc3RhcnQgPSB2O1xuIDc4MjpcdFx0XHRcdH0gZWxzZSB7XG4gNzgzOlx0XHRcdFx0XHQvKiBub3RoaW5nIHRvIG5vdGlmeSB5ZXQgKi9cbiA3ODQ6XHRcdFx0XHRcdGlmICghdl9jaGFuZ2Vfc3RhcnQpXG4gNzg1Olx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuIDc4NjpcdFx0XHRcdFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfY2hhbmdlX3N0YXJ0LFxuIDc4NzpcdFx0XHRcdFx0XHQgICAgICAgdiAtIDEsIHJ0bV9jbWQpO1xuIDc4ODpcdFx0XHRcdFx0dl9jaGFuZ2Vfc3RhcnQgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjM3MAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIFZMQU4gVmFsaWRhdGlvbioqCgpPa2F5LCBJJiMzOTttIHRyYWNpbmcgdGhyb3VnaCB0aGlzIGBicl9wcm9jZXNzX3ZsYW5faW5mb2AgZnVuY3Rpb24gbm93LiBJdCYjMzk7cyBjYWxsaW5nIGBicl92bGFuX3ZhbGlkX3JhbmdlYCwgYW5kIHRoYXQgaW1tZWRpYXRlbHkgZmxhZ3MgbXkgaW50ZXJlc3QuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgVkxBTiByYW5nZSBpcyBiZWluZyB2YWxpZGF0ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgZnVuY3Rpb24uIExldCYjMzk7cyBkaWcgaW50byBgYnJfdmxhbl92YWxpZF9yYW5nZWAgYW5kIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIHRoZXJlLiBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgcmFuZ2UgdmFsaWRhdGlvbiBpcyBiZWluZyBjb3JyZWN0bHkgaW1wbGVtZW50ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JyX3ZsYW5fdmFsaWRfcmFuZ2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz03Mzk9aW50IGJyX3Byb2Nlc3Nfdmxhbl9pbmZvKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NTQtXHRpZiAodmluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6NzU1Olx0XHRpZiAoIWJyX3ZsYW5fdmFsaWRfcmFuZ2UodmluZm9fY3VyciwgKnZpbmZvX2xhc3QsIGV4dGFjaykpXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NTYtXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzY0LVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6NzY1Olx0XHRpZiAoIWJyX3ZsYW5fdmFsaWRfcmFuZ2UodmluZm9fY3VyciwgKnZpbmZvX2xhc3QsIGV4dGFjaykpXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NjYtXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT40bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NzkyCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipIdW50aW5nIERvd24gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaW5kIHRoZSBkZWZpbml0aW9uIG9yIHVzYWdlIG9mIGBicl92bGFuX3ZhbGlkX3JhbmdlYC4gSW1tZWRpYXRlbHksIG15IG1lbnRhbCBwcm9jZXNzIGp1bXBzIHRvIHRoaW5raW5nIGFib3V0IHdoZXJlIEkgd291bGQgdHlwaWNhbGx5IGZpbmQgc3VjaCBhIHZhcmlhYmxlLiBHaXZlbiB0aGUgbmFtZSwgYW5kIG15IGV4cGVyaWVuY2Ugd2l0aCBicmlkZ2luZyBhbmQgVkxBTnMsIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgdG8gYmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8gdmFsaWRhdGluZyBWTEFOIElEcyB3aXRoaW4gYSBicmlkZ2UgY29udGV4dC4gSXQgY291bGQgYmUgYSBtYWNybywgYSBjb25zdGFudCwgYSBmdW5jdGlvbiwgb3IgZXZlbiBhIGdsb2JhbCB2YXJpYWJsZSwgcHJvYmFibHkgZGVmaW5lZCB3aXRoaW4gYSBoZWFkZXIgZmlsZSBvciBwZXJoYXBzIHJlbGF0ZWQgdG8gdGhlIGJyaWRnZSBkcml2ZXIgY29kZSBpdHNlbGYuIE15IGluaXRpYWwgc2VhcmNoIHdvdWxkIGxpa2VseSBpbnZvbHZlIGdyZXBwaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IGNvZGViYXNlLCBzdGFydGluZyB3aXRoIHRoZSBicmlkZ2UgdXRpbGl0aWVzLCBuZXR3b3JraW5nIGxpYnJhcmllcywgb3IgYW55IGtlcm5lbCBtb2R1bGVzIHJlbGF0ZWQgdG8gYnJpZGdpbmcuIEkmIzM5O2QgYmUgbG9va2luZyBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIHRoYXQgc2VlbSByZWxldmFudCwgYW5kIEkmIzM5O2QgZXhwYW5kIGZyb20gdGhlcmUuIFRoaXMgd2lsbCBwcm9iYWJseSBsZWFkIHRvIHJlYWRpbmcgc29tZSBkb2N1bWVudGF0aW9uIGFuZCBsb29raW5nIGF0IGNvbW1vbiBwbGFjZXMgZm9yIFZMQU4gY29uZmlndXJhdGlvbiBjb2RlLiBJJiMzOTtsbCBuZWVkIHRvIGNvbnNpZGVyIGhvdyBkaWZmZXJlbnQgYnJpZGdlIGltcGxlbWVudGF0aW9ucyBtaWdodCBoYW5kbGUgVkxBTiB2YWxpZGF0aW9uLiBJcyBpdCBhIGdlbmVyaWMgcmFuZ2UsIG9yIGltcGxlbWVudGF0aW9uLXNwZWNpZmljPyBJcyBpdCBoYXJkY29kZWQsIG9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyYWJsZT8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfdmxhbl92YWxpZF9yYW5nZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGluay5jPTczOT1pbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1NC1cdGlmICh2aW5mb19jdXJyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NTU6XHRcdGlmICghYnJfdmxhbl92YWxpZF9yYW5nZSh2aW5mb19jdXJyLCAqdmluZm9fbGFzdCwgZXh0YWNrKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1Ni1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NjQtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NjU6XHRcdGlmICghYnJfdmxhbl92YWxpZF9yYW5nZSh2aW5mb19jdXJyLCAqdmluZm9fbGFzdCwgZXh0YWNrKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2Ni1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaD02OTE9c3RhdGljIGlubGluZSBib29sIGJyX3ZsYW5fdmFsaWRfaWQodTE2IHZpZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oLTcwMC1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oOjcwMTpzdGF0aWMgaW5saW5lIGJvb2wgYnJfdmxhbl92YWxpZF9yYW5nZShjb25zdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqY3VyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlLmgtNzAyLVx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICpsYXN0LFxuLS1cbm5ldC9icmlkZ2UvYnJfdmxhbi5jPTIxODI9c3RhdGljIGludCBicl92bGFuX3J0bV9wcm9jZXNzX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9icmlkZ2UvYnJfdmxhbi5jLTIyMzgtXHRcdGlmICghYnJfdmxhbl92YWxpZF9pZCh2aW5mby1cdTAwM2V2aWQsIGV4dGFjaykgfHxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jOjIyMzk6XHRcdCAgICAhYnJfdmxhbl92YWxpZF9yYW5nZSh2aW5mbywgdmluZm9fbGFzdCwgZXh0YWNrKSlcbm5ldC9icmlkZ2UvYnJfdmxhbi5jLTIyNDAtXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NTgyCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgVkxBTiBWYWxpZGF0aW9uIFJhbmdlKioKCk9rYXksIHNvIEkgbmVlZCB0byBjaGVjayBvdXQgYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgLiBJJiMzOTttIGdvaW5nIHRvIGp1bXAgaW50byBgbmV0L2JyaWRnZS9icl9wcml2YXRlLmhgLiBJJiMzOTttIGFzc3VtaW5nIGl0JiMzOTtzIGRlZmluaW5nIHRoZSB2YWxpZCBWTEFOIElEIHJhbmdlIGZvciB0aGUgYnJpZGdlIGRyaXZlci4gUHJvYmFibHkgc29tZSBjb25zdGFudHMgb3IgbWFjcm9zLiBJJiMzOTttIGN1cmlvdXMgaWYgdGhleSYjMzk7dmUgdXNlZCBiaXQgbWFza3MsIGVudW1zLCBvciBqdXN0IHN0cmFpZ2h0IGludGVnZXIgcmFuZ2VzLiBLbm93aW5nIHRoZSB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIGhvdyB0aGUgZHJpdmVyIGhhbmRsZXMgVkxBTiBmaWx0ZXJpbmcgYW5kIHBvdGVudGlhbCBjb25mbGljdHMuIEkmIzM5O20gaW50ZXJlc3RlZCBpbiB0aGUgaW5jbHVzaXZlL2V4Y2x1c2l2ZSBuYXR1cmUgb2YgdGhlIHJhbmdlLCB0b28uIEdvdHRhIG1ha2Ugc3VyZSBJJiMzOTttIGNyeXN0YWwgY2xlYXIgb24gdGhhdCBhc3BlY3QgYmVmb3JlIEkgc3RhcnQgdGlua2VyaW5nIHdpdGggYW55IFZMQU4gc2V0dGluZ3Mgb3IgZGVidWdnaW5nIHJlbGF0ZWQgaXNzdWVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlIHRvIHVuZGVyc3RhbmQgY29ycmVjdCBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNzAwOlx0XG4gNzAxOlx0c3RhdGljIGlubGluZSBib29sIGJyX3ZsYW5fdmFsaWRfcmFuZ2UoY29uc3Qgc3RydWN0IGJyaWRnZV92bGFuX2luZm8gKmN1cixcbiA3MDI6XHRcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqbGFzdCxcbiA3MDM6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gNzA0Olx0e1xuIDcwNTpcdFx0LyogcHZpZCBmbGFnIGlzIG5vdCBhbGxvd2VkIGluIHJhbmdlcyAqL1xuIDcwNjpcdFx0aWYgKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19QVklEKSB7XG4gNzA3Olx0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O1B2aWQgaXNuJiMzOTt0IGFsbG93ZWQgaW4gYSByYW5nZVwmIzM0Oyk7XG4gNzA4Olx0XHRcdHJldHVybiBmYWxzZTtcbiA3MDk6XHRcdH1cbiA3MTA6XHRcbiA3MTE6XHRcdC8qIHdoZW4gY3VyIGlzIHRoZSByYW5nZSBlbmQsIGNoZWNrIGlmOlxuIDcxMjpcdFx0ICogIC0gaXQgaGFzIHJhbmdlIHN0YXJ0IGZsYWdcbiA3MTM6XHRcdCAqICAtIHJhbmdlIGlkcyBhcmUgaW52YWxpZCAoZW5kIGlzIGVxdWFsIHRvIG9yIGJlZm9yZSBzdGFydClcbiA3MTQ6XHRcdCAqL1xuIDcxNTpcdFx0aWYgKGxhc3QpIHtcbiA3MTY6XHRcdFx0aWYgKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDcxNzpcdFx0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O0ZvdW5kIGEgbmV3IHZsYW4gcmFuZ2Ugc3RhcnQgd2hpbGUgcHJvY2Vzc2luZyBvbmVcJiMzNDspO1xuIDcxODpcdFx0XHRcdHJldHVybiBmYWxzZTtcbiA3MTk6XHRcdFx0fSBlbHNlIGlmICghKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MTkwCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBwcmVzZW50ZWQgYXMgaWYgaXQgd2VyZSBteSBvd24gaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipEaXZpbmcgRGVlcGVyIGludG8gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKioKCkFscmlnaHQsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGBicl92bGFuX3ZhbGlkX3JhbmdlYCBhZ2Fpbi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQgbmVlZHMgYSBjbG9zZXIgbG9vay4gSSYjMzk7bSBhbHJlYWR5IHByZXR0eSBmYW1pbGlhciB3aXRoIHRoZSBicm9hZGVyIFZMQU4gY29uY2VwdHMsIGFuZCBob3cgdGhleSByZWxhdGUgdG8gYnJpZGdpbmcsIGJ1dCB0aGVyZSYjMzk7cyBhbHdheXMgdGhlIHBvdGVudGlhbCBmb3IgZWRnZSBjYXNlcyBvciBzdWJ0bGUgaW50ZXJhY3Rpb25zIHRoYXQgYXJlbiYjMzk7dCBpbW1lZGlhdGVseSBvYnZpb3VzLCBlc3BlY2lhbGx5IHdpdGhpbiBhIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGxpa2UgdGhpcy4gVGhpcyBmdW5jdGlvbiBvciBzdHJ1Y3R1cmUgaXMgY2xlYXJseSBwaXZvdGFsIGluIGRlZmluaW5nIHdoYXQgY29uc3RpdHV0ZXMgYSB2YWxpZCBWTEFOIHJhbmdlIGZvciB0aGUgYnJpZGdlLiBHaXZlbiB0aGUgcG90ZW50aWFsIGZvciBjb25mbGljdCBvciBtaXNjb25maWd1cmF0aW9uLCBpdCYjMzk7cyB3b3J0aCByZXZpc2l0aW5nIHRvIHNvbGlkaWZ5IG91ciB1bmRlcnN0YW5kaW5nLiBXZSBuZWVkIGEgY2xlYXIgbWVudGFsIG1vZGVsIG9mIGhvdyBpdCYjMzk7cyB1c2VkIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgYnJpZGdlIGNvZGUuIEFyZSB0aGVyZSBhbnkgYXNzdW1wdGlvbnMgb3IgaW1wbGljaXQgYmVoYXZpb3JzIEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQXJlIHRoZXJlIGFyZWFzIGZvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9uIG9yIHBvdGVudGlhbCByaXNrcyBpbiB0aGUgdmFsaWRhdGlvbiBsb2dpYyBpdCBpbXBsZW1lbnRzPyBSaWdodCBub3csIEkgdGhpbmsgdGhhdCBhIGJpdCBtb3JlIHRpbWUgc3BlbnQgZXhhbWluaW5nIGl0IHdvdWxkIGJlIGJlbmVmaWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlIGJldHRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNzE1Olx0XHRpZiAobGFzdCkge1xuIDcxNjpcdFx0XHRpZiAoY3VyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XG4gNzE3Olx0XHRcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXCYjMzQ7Rm91bmQgYSBuZXcgdmxhbiByYW5nZSBzdGFydCB3aGlsZSBwcm9jZXNzaW5nIG9uZVwmIzM0Oyk7XG4gNzE4Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDcxOTpcdFx0XHR9IGVsc2UgaWYgKCEoY3VyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkpIHtcbiA3MjA6XHRcdFx0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcJiMzNDtWbGFuIHJhbmdlIGVuZCBmbGFnIGlzIG1pc3NpbmdcJiMzNDspO1xuIDcyMTpcdFx0XHRcdHJldHVybiBmYWxzZTtcbiA3MjI6XHRcdFx0fSBlbHNlIGlmIChjdXItXHUwMDNldmlkIFx1MDAzYz0gbGFzdC1cdTAwM2V2aWQpIHtcbiA3MjM6XHRcdFx0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcJiMzNDtFbmQgdmxhbiBpZCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gc3RhcnQgdmxhbiBpZFwmIzM0Oyk7XG4gNzI0Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDcyNTpcdFx0XHR9XG4gNzI2Olx0XHR9XG4gNzI3Olx0XG4gNzI4Olx0XHQvKiBjaGVjayBmb3IgcmVxdWlyZWQgcmFuZ2UgZmxhZ3MgKi9cbiA3Mjk6XHRcdGlmICghKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgKEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4gfFxuIDczMDpcdFx0XHRcdCAgICBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkpKSB7XG4gNzMxOlx0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O0JvdGggdmxhbiByYW5nZSBmbGFncyBhcmUgbWlzc2luZ1wmIzM0Oyk7XG4gNzMyOlx0XHRcdHJldHVybiBmYWxzZTtcbiA3MzM6XHRcdH1cbiA3MzQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42MS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg4NDAKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxNDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24uIFRoZSBrZXkgaXMgdG8gdW5kZXJzdGFuZCBob3cgaXQgaGFuZGxlcyBWTEFOIHJhbmdlcyBhbmQgdHVubmVsIElEcywgYW5kIHdoeSB0aGUgc3l6Ym90IHJlcG9ydCBmbGFnZ2VkIHRoaXMuIE15IGluaXRpYWwgdGhvdWdodCBpcywgdGhlIGBicl92bGFuX3ZhbGlkX3JhbmdlYCBjaGVjayBlbnN1cmVzIGBjdXItJmd0O3ZpZCAmbHQ7PSBsYXN0LSZndDt2aWRgLCBhbmQgaXQgc2VlbXMgdGhhdCB0aGlzIGNydWNpYWwgY2hlY2sgaXMgKm1pc3NpbmcqIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBJbnRlcmVzdGluZy4gVGhpcyBhYnNlbmNlIG1pZ2h0IGJlIHRoZSBjb3JlIG9mIHRoZSBpc3N1ZS4KClRoZSBmdW5jdGlvbiBjb21wYXJlcyBgKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZClgIHdpdGggYCh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIFRoZSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eSBpcyBpZiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlIHN1YnRyYWN0aW9uIHlpZWxkcyBhIG5lZ2F0aXZlIHJlc3VsdC4gSWYgdGhpcyBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICpzb21laG93KiBtYXRjaGVzIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgKGNvbnZlcnRlZCB0byBgdTMyYCksIHdlIGJ5cGFzcyB0aGUgaW50ZW5kZWQgdmFsaWRhdGlvbiEKCkJ1dCB3YWl0IGEgbWludXRlLi4uIGV2ZW4gaWYgdGhlIGNoZWNrIGlzIGJ5cGFzc2VkLCB0aGUgbG9vcCBgZm9yICh2ID0gdGluZm9fbGFzdC0mZ3Q7dmlkOyB2ICZsdDs9IHRpbmZvX2N1cnItJmd0O3ZpZDsgdiYjNDM7JiM0MzspYCBzdGlsbCAqd291bGRuJiMzOTt0KiBleGVjdXRlLiBJdCYjMzk7cyBiZWNhdXNlIGB2YCBzdGFydHMgYXQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCwgc28gdGhlIGxvb3AgaXMgZWZmZWN0aXZlbHkgc2tpcHBlZCwgcmV0dXJuaW5nIDAuIFdoeSBpcyB0aGlzIGEgcHJvYmxlbT8gIEl0IHNlZW1zIHRoZSBwcmltYXJ5IGlzc3VlIGlzIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgKHN1Y2Nlc3MpIGJ1dCBpdCBoYXMgZWZmZWN0aXZlbHkgZG9uZSBub3RoaW5nIGJlY2F1c2Ugbm8gdmFsaWQgVkxBTnMgYXJlIHByb2Nlc3NlZCBhbmQgbm8gdHVubmVscyB3ZXJlIGFkZGVkLCB5ZXQgdGhlIHVzZXIgaXMgbGVkIHRvIGJlbGlldmUgdGhlIHJhbmdlIHdhcyB2YWxpZC4gSXQgY2xlYXJzIHRoZSBsYXN0IGFuZCBjdXJyZW50IGluZm8gc3RydWN0dXJlcy4gIEVzc2VudGlhbGx5LCB0aGUgcmFuZ2UgaXMgKmlnbm9yZWQqLgoKU28sIGlmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIDAgYW5kIGB0aW5mb19sYXN0LSZndDt2aWRgIGlzIDY1NTM1LCBgdmAgc3RhcnRzIGF0IDY1NTM1LCB3aGljaCBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAsIHdoaWNoIGFsc28gcmVzdWx0cyBpbiBubyBpdGVyYXRpb24gaW4gdGhlIGxvb3AuIFRoZSBgdmAgdmFyaWFibGUgaXMgYW4gYGludGAsIG5vdCBgdTE2YCBvciBgdTMyYC4gVGhpcyBtYWtlcyB0aGUgY29tcGFyaXNvbiBsZXNzIHRyaWNreS4gSSYjMzk7bSBub3Qgc2VlaW5nIGEgbWVtb3J5IGxlYWsgb3IgYSBjcmFzaCBoZXJlLgoKTm93LCBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgdGhlIGRpZmZlcmVuY2VzICpkb24mIzM5O3QqIG1hdGNoLCB3aGVuIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIG5lZ2F0aXZlIGFuZCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgaXMgcG9zaXRpdmUuICBJbiB0aGlzIHNjZW5hcmlvLCB3ZSBnZXQgYW4gYC1FSU5WQUxgIGVycm9yIGFuZCB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaXMgb2JzZXJ2ZWQuCgpUaGVyZWZvcmUsIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgaWYgdGhlIGRpZmZlcmVuY2VzIGRvIG1hdGNoOiB3ZSBnZXQgMCBpbnN0ZWFkIG9mIGAtRUlOVkFMYC4gTm8gbG9vcCBpcyBleGVjdXRlZCwgc28gdGhlIHJlc3VsdCBpcyB0aGUgc2FtZS4gIElzIHRoaXMgYSBidWcgd29ydGggZnV6emluZz8KCkkgdGhpbmsgSSBzZWUgd2hhdCYjMzk7cyBoYXBwZW5pbmcuIFJldHVybmluZyAwIGlzIG1pc2xlYWRpbmcgYmVjYXVzZSBpdCBpbXBsaWVzIHN1Y2Nlc3Mgd2hlbiBhIHJhbmdlIHdhcyBub3QgcHJvY2Vzc2VkLiBJdCBtZWFucyB0aGUgTmV0bGluayBtZXNzYWdlIHByb2Nlc3NpbmcgY29udGludWVzLiBJZiB3ZSByZXR1cm4gYC1FSU5WQUxgLCBpdCBhYm9ydHMuICBUaGUgbWFpbiBpbXBhY3QgaXMgdGhhdCB0aGUgaW50ZXJuYWwgc3RhdGUgKGB0aW5mb19sYXN0YCBhbmQgYHRpbmZvX2N1cnJgKSBpcyAqY2xlYXJlZCouIEFzIGlmIHRoZSByYW5nZSB3YXMgc3VjY2Vzc2Z1bC4KCkdvaW5nIHRocm91Z2ggdGhlIG90aGVyIGxvZ2ljLCBgdGluZm9fY3Vyci0mZ3Q7ZmxhZ3MgJmFtcDsgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTmAgYW5kIGBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORGAsIGlmIHRoZSByYW5nZSBpcyBza2lwcGVkLCB0aGUgZmxhZ3MgYXJlIGNsZWFyZWQuIElmIHRoZSAqbmV4dCogYXR0cmlidXRlIGlzIGFub3RoZXIgYFJBTkdFX0VORGAsIHRoZSBsb2dpYyB3aWxsIGZhaWwuIElmIHRoZSBuZXh0IGF0dHJpYnV0ZSBpcyBhIGBSQU5HRV9CRUdJTmAsIGl0IHdpbGwgc3VjY2VlZCAoYW5kIG92ZXJ3cml0ZSB0aGUgY2xlYXJlZCBgdGluZm9fbGFzdGApLgoKU28sIHdoZW4gdGhlIGRpZmZlcmVuY2VzIG1hdGNoLCB0aGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLCB3aGljaCBtaWdodCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgbGF0ZXIgb24gaW4gdGhlIG5ldGxpbmsgbWVzc2FnZSBwcm9jZXNzaW5nLiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGlzc3VlLgoKTm93IGxldCBtZSBnbyBkZWVwZXIgaW50byBgX192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjU3Olx0c3RhdGljIHZvaWQgX192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbiAyNTg6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICoqdl9zdGFydCxcbiAyNTk6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICoqdl9lbmQsXG4gMjYwOlx0XHRcdFx0XHQgICAgICAgaW50IHZfY3VyciwgYm9vbCBjdXJyX2NoYW5nZSlcbiAyNjE6XHR7XG4gMjYyOlx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZztcbiAyNjM6XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnY7XG4gMjY0Olx0XG4gMjY1Olx0XHR2ZyA9IG5icF92bGFuX2dyb3VwKHApO1xuIDI2NjpcdFx0aWYgKCF2ZylcbiAyNjc6XHRcdFx0cmV0dXJuO1xuIDI2ODpcdFxuIDI2OTpcdFx0diA9IGJyX3ZsYW5fZmluZCh2Zywgdl9jdXJyKTtcbiAyNzA6XHRcbiAyNzE6XHRcdGlmICghKnZfc3RhcnQpXG4gMjcyOlx0XHRcdGdvdG8gb3V0X2luaXQ7XG4gMjczOlx0XG4gMjc0Olx0XHRpZiAodiBcdTAwMjZcdTAwMjYgY3Vycl9jaGFuZ2UgXHUwMDI2XHUwMDI2IGJyX3ZsYW5fY2FuX2VudGVyX3JhbmdlKHYsICp2X2VuZCkpIHtcbiAyNzU6XHRcdFx0KnZfZW5kID0gdjtcbiAyNzY6XHRcdFx0cmV0dXJuO1xuIDI3NzpcdFx0fVxuIDI3ODpcdFxuIDI3OTpcdFx0YnJfdmxhbl9ub3RpZnkocC1cdTAwM2ViciwgcCwgKCp2X3N0YXJ0KS1cdTAwM2V2aWQsICgqdl9lbmQpLVx1MDAzZXZpZCwgUlRNX05FV1ZMQU4pO1xuIDI4MDpcdG91dF9pbml0OlxuIDI4MTpcdFx0Lyogd2Ugc3RhcnQgYSByYW5nZSBvbmx5IGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyB0byBub3RpZnkgYWJvdXQgKi9cbiAyODI6XHRcdCp2X3N0YXJ0ID0gY3Vycl9jaGFuZ2UgPyB2IDogTlVMTDtcbiAyODM6XHRcdCp2X2VuZCA9ICp2X3N0YXJ0O1xuIDI4NDpcdH1cbiAyODU6XHRcbiAyODY6XHRpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzE2MzcKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA1MjAyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIGEgUG90ZW50aWFsIEJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpZiB0aGUgbG9vcCBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBkb2VzbiYjMzk7dCBleGVjdXRlLCBhbmQgaXQmIzM5O3MgY29uZGl0aW9uYWwgb24gYHZfc3RhcnRgIGFuZCBgdl9lbmRgIGJlaW5nIG5vbi1OVUxMLCB0aGVuIGBicl92bGFuX25vdGlmeWAgd29uJiMzOTt0IGJlIGNhbGxlZCwgd2hpY2ggaXMgZXhwZWN0ZWQuIFRoZSBxdWVzdGlvbiB0aGVuIGJlY29tZXMsIHdoYXQgdHJpZ2dlcnMgdGhlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbG9vcCBpc24mIzM5O3QgZW50ZXJlZCBhbmQgdGhlIGZ1bmN0aW9uJiMzOTtzIHJldHVybiB2YWx1ZSBvZiB6ZXJvIGlzIHdyb25nPwoKVGhlIGtleSBoZXJlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIHRoZSBjb21wYXJpc29uOiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYC4gSWYgdGhpcyBpcyB0cnVlLCB0aGUgbG9vcCAqc2hvdWxkbiYjMzk7dCogZXhlY3V0ZS4gSWYgdGhlIGxvb3AgZXhlY3V0ZXMgd2l0aCB0aG9zZSBjb25mbGljdGluZyB2YWx1ZXMsIHdlIGFyZSBpbiB0cm91YmxlIGFuZCBpdCBuZWVkcyB0byBiZSB1bmRlcnN0b29kLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2aWRzIGFsc28gZXF1YWxzIHRoZSBkaWZmZXJlbmNlIGluIGB0dW5pZGAsIHRoZW4gdGhlIG9yaWdpbmFsIGNvZGUgd291bGQgbm90IGhhdmUgZmxhZ2dlZCB0aGUgZXJyb3IuCgpMZXQmIzM5O3MgYXNzdW1lIHRoZSBjb25kaXRpb24gYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAgKmlzKiBtZXQsIGFuZCB0aGUgbG9vcCBpcyBza2lwcGVkLiBUaGlzIGlzIG5vdyB0aGUgJiMzNDtidWcmIzM0OyB0aGF0IFN5emJvdCBtaWdodCBoYXZlIGZsYWdnZWQuIElzIGl0IGEgYnVnPyBOb3QgaW4gdGhlIHRyYWRpdGlvbmFsIHNlbnNlLCBiZWNhdXNlLCBpdCYjMzk7cyBhIHNpbGVudCBmYWlsdXJlLiBXZSYjMzk7cmUgKm5vdCogY2F1c2luZyBhIGNyYXNoIG9yIG1lbW9yeSBjb3JydXB0aW9uLiBUaGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLiBCdXQgdGhpcyBkb2VzbiYjMzk7dCB2YWxpZGF0ZSB0aGUgbmV0d29yayB0dW5uZWwsIHdoaWNoIGlzIGEgZmxhdy4KCkxldCYjMzk7cyBjaGVjayB0aGUgcGF0Y2g6CgpgYGBjCi0JCWlmICgodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKSAhPQomIzQzOwkJaWYgKHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZCB8fAomIzQzOwkJICAgICh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9CiAJCSAgICAodGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKYGBgCgpUaGUgcGF0Y2ggc3BlY2lmaWNhbGx5IGFkZHJlc3NlcyB0aGUgY2FzZSBvZiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCB0aGF0IGhhZCB0byByZXR1cm4gYC1FSU5WQUxgIGFuZCBhZGRlZCBhbiBpbnZhbGlkIG5ldHdvcmsgdHVubmVsLiBCZWZvcmUgdGhlIHBhdGNoLCBhIGNvbmRpdGlvbiB3aXRoIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGFuZCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgd2FzIG1pc3NpbmcgdmFsaWRhdGlvbiwgYW5kIG5vdyB3ZSBjYXRjaCB0aGF0IGNvbmRpdGlvbi4KCklmIHRoZSByZXR1cm5lZCAwIHNraXBzIHRoZSBsb29wLCBkb2VzIHRoZSBzdGF0ZSBwZXJzaXN0PyBObywgYHRpbmZvX2xhc3RgIGlzIGNsZWFyZWQgd2l0aCBgbWVtc2V0YCwgc28gdGhlIHN0YXRlIGlzIHZhbGlkLiBJZiBpdCByZXR1cm5zIDAsIHRoZSBjb2RlIGNvbnRpbnVlcyB0byB0aGUgbmV4dCBhdHRyaWJ1dGUsIG9yIGl0IHJldHVybnMgdG8gdXNlciBzcGFjZSBpbiBhIGJyb2tlbiBzdGF0ZS4KCldoZXJlIGNvdWxkIHRoaXMgaGF2ZSB0cmlnZ2VyZWQgYSBwcm9ibGVtPyBJJiMzOTttIG5vdCBzZWVpbmcgYW55IG92ZXJmbG93IG9mIGBpbnRgLCBiYXNlZCBvbiB0aGUgdHlwZXMgYW5kIHRoZSBsb29wIGNvbmRpdGlvbi4gSSYjMzk7bSBhbHNvIG5vdCBzZWVpbmcgYW55IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXNzdWVzLiBVQlNBTiBzaG91bGQgbm90IGhhdmUgdHJpZ2dlcmVkIGEgd2FybmluZywgc2luY2UgYSAzMi1iaXQgYGludGAgY2Fubm90IG92ZXJmbG93LiAKClRoZSBtb3N0IGxpa2VseSBpc3N1ZSBpcyB0aGF0IFN5emJvdCBjb3JyZWN0bHkgaWRlbnRpZmllZCB0aGF0IHRoZSBmdW5jdGlvbiBjb3VsZCBzaWxlbnRseSBmYWlsIHZhbGlkYXRpb24gYW5kIHJldHVybiAwLCBpbnN0ZWFkIG9mIGAtRUlOVkFMYCwgaWYgdGhlIGludmFsaWQgYHZpZGAgcmFuZ2UgYWxzbyBtYXRjaGVkIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UuIFRoZSB1c2VyIHdvdWxkIGhhdmUgc2VudCBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgc3lzdGVtIHdvdWxkIGFjY2VwdCBpdCwgYnV0IGRvIG5vdGhpbmcuIFRoaXMgaXMgbm90IGEgc2VjdXJpdHkgZmxhdywgb3IgZXZlbiBhIGNyYXNoLCBidXQgaXMgYW4gdW5kZXNpcmFibGUgYmVoYXZpb3IgdGhhdCBtdXN0IGJlIHZhbGlkYXRlZC4KCkl0JiMzOTtzIGxpa2VseSB0aGF0IGEgcHJldmlvdXMgbG9naWMgZXJyb3IgZXhpc3RzIHdoZXJlIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgIGNvdWxkIHJlc3VsdCBpbiBhbiBpbXByb3BlciByZXR1cm4gb2YgMCBpbnN0ZWFkIG9mIGAtRUlOVkFMYC4gVGhlIHBhdGNoIGZpeGVzIHRoYXQsIGVuc3VyaW5nIGAtRUlOVkFMYCBpcyByZXR1cm5lZCBmb3IgaW52YWxpZCByYW5nZXMuIAoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI4NiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjg2Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gMjg3Olx0XHRcdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuIDI4ODpcdFx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcbiAyODk6XHRcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG4gMjkwOlx0XHRcdFx0XHRib29sICpjaGFuZ2VkKVxuIDI5MTpcdHtcbiAyOTI6XHRcdGludCBlcnI7XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDI5NTpcdFx0XHRpZiAodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcbiAyOTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyOTc6XHRcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiAzMTg6XHRcdFx0XHRcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XG4gMzE5Olx0XHRcdFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXHUwMDI2dl9zdGFydCwgXHUwMDI2dl9lbmQsIHYsXG4gMzIwOlx0XHRcdFx0XHRcdFx0ICAgY3Vycl9jaGFuZ2UpO1xuIDMyMTpcdFx0XHR9XG4gMzIyOlx0XHRcdGlmICh2X3N0YXJ0IFx1MDAyNlx1MDAyNiB2X2VuZClcbiAzMjM6XHRcdFx0XHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cdTAwM2V2aWQsIHZfZW5kLVx1MDAzZXZpZCxcbiAzMjQ6XHRcdFx0XHRcdCAgICAgICBSVE1fTkVXVkxBTik7XG4gMzI1Olx0XHRcdGlmIChlcnIpXG4gMzI2Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAzMjc6XHRcbiAzMjg6XHRcdFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMzI5Olx0XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xuIDMzMDpcdFx0fSBlbHNlIHtcbiAzMzE6XHRcdFx0aWYgKHRpbmZvX2xhc3QtXHUwMDNlZmxhZ3MpXG4gMzMyOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzMzOlx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB0aW5mb19jdXJyLVx1MDAzZXZpZCxcbiAzMzQ6XHRcdFx0XHRcdFx0ICB0aW5mb19jdXJyLVx1MDAzZXR1bmlkLCBjaGFuZ2VkKTtcbiAzMzU6XHRcdFx0aWYgKGVycilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzg1MzMKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA5MzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVW5pbml0aWFsaXplZCBWYXJpYWJsZSBCdWcgaW4gVkxBTiBUdW5uZWwgUHJvY2Vzc2luZyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUsIGFuZCBpbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBgZXJyYC4gVGhlIGNvZGUsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjb25kaXRpb25hbCBgaWYgKHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZClgLCBjYW4gbGVhZCB0byBhIHNpdHVhdGlvbiB3aGVyZSBgZXJyYCBpc24mIzM5O3QgYXNzaWduZWQgYSB2YWx1ZSBiZWZvcmUgaXQmIzM5O3MgdXNlZC4gU3BlY2lmaWNhbGx5LCBpZiB0aGUgbG9vcCBjb25kaXRpb24gYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgZmFsc2UsIGFuZCBpdCBlbmRzIHVwIGluIHRoZSBgZWxzZSBpZiAodGluZm9fY3Vyci0mZ3Q7ZmxhZ3MgJmFtcDsgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpYCBibG9jaywgYGVycmAgd2lsbCByZW1haW4gdW5pbml0aWFsaXplZC4gVGhhdCBtZWFucyB3aGVuIHRoZSBjb2RlIGhpdHMgYGlmIChlcnIpYCwgaXQmIzM5O3MgdXNpbmcgZ2FyYmFnZSwgbGVhZGluZyB0byB1bmRlZmluZWQgYmVoYXZpb3IuIFRoaXMgaXMgYSBjbGFzc2ljIEtNU0FOIGJ1ZywgYW5kIHllcywgS01TQU4gZGVmaW5pdGVseSB3b3VsZCBoYXZlIGNhdWdodCB0aGlzIHVuaW5pdC12YWx1ZSBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4KClRoZSBmaXggY2xldmVybHkgZW5zdXJlcyB0aGUgbG9vcCBleGVjdXRlcyBhdCBsZWFzdCBvbmNlIChieSByZXZlcnNpbmcgdGhlIGNvbXBhcmlzb24pLCBtYWtpbmcgc3VyZSBgZXJyYCBnZXRzIGluaXRpYWxpemVkIHZpYSBgZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyguLi4pYC4gQnJpbGxpYW50IGNhdGNoLCByZWFsbHkhCgpOb3csIHRoZSBmdW5jdGlvbmFsIGltcGFjdCBoZXJlIGlzIHdvcnRoIGNvbnNpZGVyaW5nLiBSZXR1cm5pbmcgYW4gdW5pbml0aWFsaXplZCBlcnJvciBjb2RlIGNvdWxkIGxlYWsga2VybmVsIG1lbW9yeSBvciBsZWFkIHRvIGFyYml0cmFyeSByZXR1cm4gY29kZXMgdG8gdXNlciBzcGFjZSwgd2hpY2ggaXMgZGVmaW5pdGVseSBhIHNlY3VyaXR5IGNvbmNlcm4uIFNvLCB0aGlzIGZpeCBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcgdG8gY29uZmlybSBpdCYjMzk7cyBjb3JyZWN0IGFuZCB0byBsb29rIGZvciBvdGhlciBwb3NzaWJsZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiByZWxhdGVkIGNvZGUgcGF0aHMuCgpJJiMzOTtsbCBiZSBmb2N1c2luZyBvbiBhIGZldyBrZXkgc3ltYm9sczogYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgdGhlIHByaW1hcnkgb25lLiBgYnJfdmxhbl90dW5uZWxfaW5mb2AgYW5kIHRoZSBgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb2AgYXMgd2VsbC4gQWxzbyBgYnJfYWZzcGVjYCBpcyBhIGNhbGxlciBidXQgaXQgaXMgdG9vIGdlbmVyaWMgdG8gYmUgdGhlIG1haW4gZm9jdXMuCgpBcyBmb3IgdGhlIGNvbmZpZ3MsIGBDT05GSUdfQlJJREdFYCBpcyB0aGUga2V5IHJlcXVpcmVtZW50LiBJdCBzZWVtcyB0aGF0IGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBtYXkgYmUgbmVlZGVkIHRvIGZ1bGx5IHRlc3QgZnVuY3Rpb25hbGl0eSwgZXZlbiBpZiB0aGUgdW5pbml0aWFsaXplZCBidWcgZXhpc3RzIHdpdGhvdXQgaXQuIExldCYjMzk7cyBzZWUgLSBgYnJfbmV0bGlua190dW5uZWwuY2AgZ2V0cyBjb21waWxlZCBpZiBgQ09ORklHX0JSSURHRWAgaXMgZW5hYmxlZC4gQnV0IHdoZW4gYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGlzIGRpc2FibGVkLCBgYnJfdmxhbl90dW5uZWxfaW5mb2Agc3RpbGwgZ2V0cyBjYWxsZWQsIGJ1dCBqdXN0IHJldHVybnMgMC4gVGhlIGJ1ZyBpcyBzdGlsbCB0cmlnZ2VyZWQgd2l0aCBgQ09ORklHX0JSSURHRWAgYWxvbmUuIFRoZXJlZm9yZSBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2Agd2lsbCBpbXByb3ZlIHRoZSB0ZXN0IGNvdmVyYWdlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlJJREdFX1ZMQU5fRklMVEVSSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9LY29uZmlnPTM2PWNvbmZpZyBCUklER0VfSUdNUF9TTk9PUElOR1xuLS1cbm5ldC9icmlkZ2UvS2NvbmZpZy00OS1cbm5ldC9icmlkZ2UvS2NvbmZpZzo1MDpjb25maWcgQlJJREdFX1ZMQU5fRklMVEVSSU5HXG5uZXQvYnJpZGdlL0tjb25maWctNTEtXHRib29sIFwmIzM0O1ZMQU4gZmlsdGVyaW5nXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwMTE0CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqSW52ZXN0aWdhdGluZyBWTEFOIEZpbHRlcmluZyBpbiB0aGUgTGludXggQnJpZGdlIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZm9yIGJyaWRnaW5nLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjayB0aGUgZGVwZW5kZW5jaWVzIGZvciBgQlJJREdFX1ZMQU5fRklMVEVSSU5HYC4gVGhhdCBvcHRpb24gaXMgY3JpdGljYWwsIHNvIEkmIzM5O20gYXNzdW1pbmcgaXQgaW5mbHVlbmNlcyBvciByZWxpZXMgb24gYSBmZXcgb3RoZXIgY29uZmlndXJhdGlvbnMgdG8gZnVuY3Rpb24gcHJvcGVybHkuIEkmIzM5O2xsIGhlYWQgb3ZlciB0byBgbmV0L2JyaWRnZS9LY29uZmlnYCB0byBzdGFydCB1bnRhbmdsaW5nIHRob3NlIGRlcGVuZGVuY2llcyBhbmQgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2UgdG8gZW5hYmxlIFZMQU4gZmlsdGVyaW5nIHN1Y2Nlc3NmdWxseS4gSXQmIzM5O3MgYSBrZXkgcGllY2UgaW4gYWxsb3dpbmcgbWUgdG8gbWFuYWdlIGFuZCBzZXBhcmF0ZSBuZXR3b3JrIHRyYWZmaWMgb24gdGhpcyBicmlkZ2UgYW5kIEkgbmVlZCB0byBtYWtlIGNlcnRhaW4gdGhhdCBhbGwgcmVsYXRlZCBzZXR0aW5ncyBhcmUgY29uZmlndXJlZCBwcm9wZXJseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDUwOlx0Y29uZmlnIEJSSURHRV9WTEFOX0ZJTFRFUklOR1xuICA1MTpcdFx0Ym9vbCBcJiMzNDtWTEFOIGZpbHRlcmluZ1wmIzM0O1xuICA1MjpcdFx0ZGVwZW5kcyBvbiBCUklER0VcbiAgNTM6XHRcdGRlcGVuZHMgb24gVkxBTl84MDIxUVxuICA1NDpcdFx0ZGVmYXVsdCBuXG4gIDU1Olx0XHRoZWxwXG4gIDU2Olx0XHQgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHRoZSBFdGhlcm5ldCBicmlkZ2Ugd2lsbCBiZSBhYmxlIHNlbGVjdGl2ZWx5XG4gIDU3Olx0XHQgIHJlY2VpdmUgYW5kIGZvcndhcmQgdHJhZmZpYyBiYXNlZCBvbiBWTEFOIGluZm9ybWF0aW9uIGluIHRoZSBwYWNrZXRcbiAgNTg6XHRcdCAgYW55IFZMQU4gaW5mb3JtYXRpb24gY29uZmlndXJlZCBvbiB0aGUgYnJpZGdlIHBvcnQgb3IgYnJpZGdlIGRldmljZS5cbiAgNTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA0NjEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA3NDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEJyaWRnZSBWTEFOIFR1bm5lbGluZyBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBoZXJlJiMzOTtzIG15IGJyZWFrZG93bi4gSXQgc2VlbXMgYEJSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgcmVsaWFudCBvbiBib3RoIGBCUklER0VgIGFuZCBgVkxBTl84MDIxUWAsIHNvIHRob3NlIHRocmVlIG5lZWQgdG8gYmUgZW5hYmxlZCBpbiBgRW5hYmxlQ29uZmlnc2AuIEkmIzM5O2xsIGFkZCB0aG9zZSByaWdodCBhd2F5LCBJJiMzOTtsbCBhbHNvIGFkZCB0aGUgb2J2aW91cyBvbmVzOiBgQ09ORklHX05FVGAgYW5kIGBDT05GSUdfTkVUX0NPUkVgLgoKTm93LCBsZXQmIzM5O3MgemVybyBpbiBvbiB0aGUga2V5IHN5bWJvbHMuIEkgbmVlZCB0byBrZWVwIGFuIGV5ZSBvbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCwgYGJyX3ZsYW5fdHVubmVsX2luZm9gLCBhbmQgYGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm9gLiBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBub25lIG9mIHRoZXNlIGFyZSBzdGF0aWMsIHdoaWNoIGlzIGdvb2QgdG8ga25vdyBmb3IgZnVydGhlciBhbmFseXNpcy4gVGhleSYjMzk7cmUgYWxsIGRlY2xhcmVkIGluIGBicl9wcml2YXRlX3R1bm5lbC5oYC4KClRoZSBjb3JlIGlzc3VlIGhlcmUgaXMgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSwgYGVycmAsIHdpdGhpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gRXNzZW50aWFsbHksIGlmIHNvbWVvbmUgY3JhZnRzIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUgd2l0aCBhbiBlbmQgYHZpZGAgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgaGFwcGVucyB0byBtYXRjaCB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24sIHRoZSBsb29wIGBmb3IgKHYgPSB0aW5mb19sYXN0LSZndDt2aWQ7IHYgJmx0Oz0gdGluZm9fY3Vyci0mZ3Q7dmlkOyB2JiM0MzsmIzQzOylgIGdldHMgc2tpcHBlZC4gVGhhdCBsZWF2ZXMgYGVycmAgdW50b3VjaGVkLCBidXQgdGhlIGNvZGUgbGF0ZXIgY2hlY2tzIGlmIGBlcnJgIGlzIHRydWUsIGxlYWRpbmcgdG8gYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGxlYWsgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RhY2sgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIHNvIHRoYXQmIzM5O3MgYSBkZWZpbml0ZSBzZWN1cml0eSBjb25jZXJuLiBUaGUgcGF0Y2ggZml4ZXMgdGhpcyBieSBkaXJlY3RseSBjaGVja2luZyBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCBhbmQgcmV0dXJuaW5nIGAtRUlOVkFMYC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIHdpdGggcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWssIHdoaWNoIG1lYW5zIGZ1enppbmcgaXMgd2FycmFudGVkLgoKTmV4dCwgSSBuZWVkIHRvIGNoZWNrIGhvdyByZWFjaGFibGUgdGhpcyBpcyBmcm9tIHVzZXIgc3BhY2UuIExvb2tzIGxpa2UgdGhpcyBpcyByZWFjaGFibGUgdmlhIGBydG5ldGxpbmtgLCBzcGVjaWZpY2FsbHkgYFJUTV9TRVRMSU5LYCBvbiBhIGJyaWRnZSBwb3J0LCBzbyBpdCYjMzk7cyBkaXJlY3RseSBleHBvc2VkLiBUbyBkbyB0aGF0IHlvdSBuZWVkIGBDQVBfTkVUX0FETUlOYCBpbiB0aGUgbmV0d29yayBuYW1lc3BhY2UsIHdoaWNoIGlzIGVhc3kgdG8gZ2V0IHdpdGggdXNlciBuYW1lc3BhY2VzLiBUaGlzIGlzIGZ1bGx5IHJlYWNoYWJsZSwgYW5kIEkmIzM5O2xsIGJlIGNlcnRhaW4gdG8gZG9jdW1lbnQgdGhhdCBpbiB0aGUgZm9ybWF0dGVkIG91dHB1dC4KCioqV29ydGhGdXp6aW5nOiB0cnVlKioKCioqUmVhc29uaW5nOioqIFRoZSBwYXRjaCBhZGRyZXNzZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIHdpdGhpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gSWYgdGhlIGVuZCBgdmlkYCBpbiBhIFZMQU4gdHVubmVsIHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnQgYHZpZGAsIGFuZCB0aGVpciBgdHVuaWRgIGRpZmZlcmVuY2VzIG1hdGNoIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiwgdGhlIHByb2Nlc3NpbmcgbG9vcCBpcyBza2lwcGVkLiBUaGlzIGxlYXZlcyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZCwgd2hpY2ggaXMgbGF0ZXIgZXZhbHVhdGVkIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5mb3JtYXRpb24gbGVhay4KCioqRm9jdXNTeW1ib2xzOioqIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLCBgYnJfdmxhbl90dW5uZWxfaW5mb2AsIGBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvYAoKKipFbmFibGVDb25maWdzOioqIGBCUklER0VgLCBgQlJJREdFX1ZMQU5fRklMVEVSSU5HYCwgYFZMQU5fODAyMVFgCgpPa2F5LCBqdXN0IGNvbmZpcm1pbmcgdGhlIGNvbmZpZyBuYW1lIGlzIGluZGVlZCBgVkxBTl84MDIxUWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBWTEFOXzgwMjFRJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0LzgwMjFxLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvODAyMXEvS2NvbmZpZy01LVxubmV0LzgwMjFxL0tjb25maWc6Njpjb25maWcgVkxBTl84MDIxUVxubmV0LzgwMjFxL0tjb25maWctNy1cdHRyaXN0YXRlIFwmIzM0OzgwMi4xUS84MDIuMWFkIFZMQU4gU3VwcG9ydFwmIzM0O1xuLS1cbm5ldC84MDIxcS9LY29uZmlnLTIxLVxubmV0LzgwMjFxL0tjb25maWc6MjI6Y29uZmlnIFZMQU5fODAyMVFfR1ZSUFxubmV0LzgwMjFxL0tjb25maWctMjMtXHRib29sIFwmIzM0O0dWUlAgKEdBUlAgVkxBTiBSZWdpc3RyYXRpb24gUHJvdG9jb2wpIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvODAyMXEvS2NvbmZpZy0zMS1cbm5ldC84MDIxcS9LY29uZmlnOjMyOmNvbmZpZyBWTEFOXzgwMjFRX01WUlBcbm5ldC84MDIxcS9LY29uZmlnLTMzLVx0Ym9vbCBcJiMzNDtNVlJQIChNdWx0aXBsZSBWTEFOIFJlZ2lzdHJhdGlvbiBQcm90b2NvbCkgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjEzNQoJCQkJCQkJb3V0cHV0OiAyNDgKCQkJCQkJCXRob3VnaHRzOiA1OTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBWTEFOIFR1bm5lbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nKioKCk9rYXksIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGBWTEFOXzgwMjFRYC4gTXkgaW5pdGlhbCBxdWVzdGlvbiBpcyBpZiB0aGlzIGludm9sdmVzIGFueSBvdGhlciBtb2RpZmllZCBmdW5jdGlvbnMsIGJ1dCBpdCYjMzk7cyBqdXN0IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBHb29kLCB0aGF0IG5hcnJvd3MgdGhlIHNjb3BlLgoKTm93LCBsZXQmIzM5O3MgY29uZmlybSBpZiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBpcyBpbmxpbmVkLiBJdCYjMzk7cyBkZWZpbmVkIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgIGFuZCBjYWxsZWQgZnJvbSBgbmV0L2JyaWRnZS9icl9uZXRsaW5rLmNgLCBpbiBzZXBhcmF0ZSB0cmFuc2xhdGlvbiB1bml0cy4gU2luY2UgaXQmIzM5O3Mgbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGlubGluZSBhbmQgd2UmIzM5O3JlIG5vdCB1c2luZyBMaW5rLVRpbWUgT3B0aW1pemF0aW9uIChMVE8pLCBJIGNhbiByZWFzb25hYmx5IGFzc3VtZSBpdCB3b24mIzM5O3QgYmUgaW5saW5lZC4gVGhpcyBtYWtlcyBpdCBhIGdvb2Qgc3ltYm9sIHRvIGZvY3VzIG9uIGZvciBhbmFseXNpcy4KClRpbWUgZm9yIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGludGVnZXIgcHJvbW90aW9uIHJ1bGVzLiBXZSBoYXZlIGB0aW5mb19jdXJyLSZndDt2aWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgYm90aCBgdTE2YC4gVGhlaXIgZGlmZmVyZW5jZSBpcyBwcm9tb3RlZCB0byBgaW50YC4gU2ltaWxhcmx5LCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dHVuaWRgLCBib3RoIGB1MzJgLCBhbmQgdGhlaXIgZGlmZmVyZW5jZSByZW1haW5zIGB1MzJgLiBUaGUgY29tcGFyaXNvbiB1c2VzIGAhPWAgYmV0d2VlbiB0aGUgYGludGAgcmVzdWx0IGZyb20gdGhlIGB2aWRgIGRpZmZlcmVuY2UgYW5kIHRoZSBgdTMyYCByZXN1bHQgZnJvbSB0aGUgYHR1bmlkYCBkaWZmZXJlbmNlOyB0aGlzIG1lYW5zIHRoZSBgaW50YCB3aWxsIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgYHUzMmAgZm9yIHRoZSBjb21wYXJpc29uLgoKTGV0JiMzOTtzIHRlc3QgdGhpcyB3aXRoIHNwZWNpZmljIHZhbHVlcy4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgMCBhbmQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgMTAsIHRoZSBgdmlkYCBkaWZmZXJlbmNlIGlzIC0xMC4gQXMgYSBgdTMyYCwgLTEwIGJlY29tZXMgNDI5NDk2NzI4Ni4gSWYgYHRpbmZvX2N1cnItJmd0O3R1bmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGlzIDEwLCB0aGUgYHR1bmlkYCBkaWZmZXJlbmNlIGlzIGFsc28gNDI5NDk2NzI4NiAoZHVlIHRvIHRoZSBgdTMyYCBhcml0aG1ldGljKS4gVGh1cywgYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9ICh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAgaXMgYDQyOTQ5NjcyODYgIT0gNDI5NDk2NzI4NmAsIHdoaWNoIHJlc29sdmVzIHRvIEZBTFNFLiBUaGF0JiMzOTtzIGdvb2QsIGJlY2F1c2UgaXQgbWVhbnMgdGhlIGNvZGUgYnlwYXNzZXMgdGhlIGAtRUlOVkFMYCByZXR1cm4uCgpUaGUgbmV4dCBzdGVwcyBzZXQgYHRgIHRvIGB0aW5mb19sYXN0LSZndDt0dW5pZGAgKHdoaWNoIGlzIDEwKSBhbmQgdGhlbiB0aGUgbG9vcCBgZm9yICh2ID0gMTA7IHYgJmx0Oz0gMDsgdiYjNDM7JiM0MzspYC4gVGhlIGxvb3AgY29uZGl0aW9uIGAxMCAmbHQ7PSAwYCBpcyBGQUxTRSwgc28gdGhlIGxvb3AgZG9lc24mIzM5O3QgZXhlY3V0ZSBhdCBhbGwuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYGVycmAgdmFyaWFibGUsIHdoaWNoIGlzIHVzZWQgbGF0ZXIsIGlzIG5ldmVyIGluaXRpYWxpemVkLiBUaHVzLCBgaWYgKGVycilgIHdpbGwgZXZhbHVhdGUgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSwgYW5kIHRoaXMgaXMgdGhlIGJ1ZyEgVGhhdCYjMzk7cyBpdCEKCk15IGV4cGxhbmF0aW9uIGlzIHJvY2sgc29saWQsIG5vdyBJJiMzOTtsbCB1c2UgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43Mi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JSSURHRSYjMzQ7LAogICAgJiMzNDtCUklER0VfVkxBTl9GSUxURVJJTkcmIzM0OywKICAgICYjMzQ7VkxBTl84MDIxUSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICAgJiMzNDticl92bGFuX3R1bm5lbF9pbmZvJiMzNDssCiAgICAmIzM0O2JyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlJJREdFJiMzNDssCiAgICAmIzM0O0JSSURHRV9WTEFOX0ZJTFRFUklORyYjMzQ7LAogICAgJiMzNDtWTEFOXzgwMjFRJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvJiMzNDssCiAgICAmIzM0O2JyX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAgICYjMzQ7YnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIEtNU0FOIHVuaW5pdC12YWx1ZSBidWcgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AuIFdoZW4gcHJvY2Vzc2luZyBhIGBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORGAgYXR0cmlidXRlLCBpZiBhIHVzZXIgcHJvdmlkZXMgYSBWTEFOIHR1bm5lbCByYW5nZSB3aGVyZSB0aGUgZW5kIGB2aWRgIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnQgYHZpZGAsIGFuZCB0aGUgYHR1bmlkYCBkaWZmZXJlbmNlIG1hdGNoZXMgdGhlIG5lZ2F0aXZlIGB2aWRgIGRpZmZlcmVuY2UgKHdoaWNoIGlzIHBvc3NpYmxlIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiBhbmQgdW5zaWduZWQgMzItYml0IGFyaXRobWV0aWMgd3JhcC1hcm91bmQpLCB0aGUgdmFsaWRhdGlvbiBjaGVjayBpcyBieXBhc3NlZC4gQ29uc2VxdWVudGx5LCB0aGUgcHJvY2Vzc2luZyBsb29wIGV4ZWN1dGVzIHplcm8gdGltZXMsIGxlYXZpbmcgdGhlIGBlcnJgIHZhcmlhYmxlIHVuaW5pdGlhbGl6ZWQuIFRoaXMgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpcyBsYXRlciBldmFsdWF0ZWQgYW5kIHBvdGVudGlhbGx5IHJldHVybmVkIHRvIHVzZXIgc3BhY2UsIGNhdXNpbmcgYW4gaW5mb3JtYXRpb24gbGVhay4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIHdpdGggc2VjdXJpdHkgaW1wbGljYXRpb25zLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjczLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0OTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT41bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSB2YWxpZGF0aW9uIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBWTEFOIElEIG9mIHRoZSBjdXJyZW50IHR1bm5lbCBpbmZvIGlzIG5vdCBsZXNzIHRoYW4gdGhlIFZMQU4gSUQgb2YgdGhlIGxhc3QgdHVubmVsIGluZm8gKHByZXZlbnRpbmcgYSBuZWdhdGl2ZSByYW5nZSkuIFRoaXMgZml4ZXMgYSBsb2dpYyBidWcgd2hlcmUgYSBuZWdhdGl2ZSByYW5nZSBjb3VsZCBieXBhc3MgdGhlIHZhbGlkYXRpb24gY2hlY2sgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bmRlcmZsb3csIGxlYWRpbmcgdG8gaW5jb3JyZWN0IGhhbmRsaW5nIG9mIFZMQU4gdHVubmVsIHJhbmdlcy4gVGhpcyBpc3N1ZSBkb2VzIG5vdCBpbnZvbHZlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLCBvciB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgaW4gY29udHJvbCBmbG93LiBJdCBpcyBhIGxvZ2ljIGFuZCBib3VuZHMtY2hlY2tpbmcgaXNzdWUuIFRoZXJlZm9yZSwgS01TQU4gaXMgbm90IHJlcXVpcmVkLCBhcyBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMTQgMTQ6MzU6MjcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMKaW5kZXggNzFhMTJkYTMwMDA0Yy4uMDVmNTYwZWViNzg5YyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYwpAQCAtMzAxLDcgJiM0MzszMDEsOCBAQCBpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAogCQlpZiAoISh0aW5mb19sYXN0LSZndDtmbGFncyAmYW1wOyBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0KJiM0MzsJCWlmICh0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWQgfHwKJiM0MzsJCSAgICAodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKSAhPQogCQkgICAgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXQgPSB0aW5mb19sYXN0LSZndDt0dW5pZDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNDUKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA4NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgQnJpZGdlIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgYnJfbmV0bGlua190dW5uZWwuY2AsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBhIGZ1bmN0aW9uIGNhbGxlZCBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gVGhlIHBhdGNoIHNlZW1zIHRvIGJlIG1vZGlmeWluZyB0aGlzIGZ1bmN0aW9uLCBhbmQgdGhlIG1vc3Qgbm90YWJsZSBhZGRpdGlvbiBpcyBhIGNoZWNrOiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCBiZWZvcmUgZXZhbHVhdGluZyB0aGUgZGlmZmVyZW5jZS4gTXkgaW5pdGlhbCBpbXByZXNzaW9uLCBjb25zaWRlcmluZyB0aGUgc3Vycm91bmRpbmcgY29udGV4dCwgaXMgdGhhdCB0aGlzIGlzIGxpa2VseSBhbiBhdHRlbXB0IHRvIGd1YXJkIGFnYWluc3QgaW50ZWdlciB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIHZ1bG5lcmFiaWxpdHkgdHlwZSBpbiBrZXJuZWwgY29kZSwgc28gaXQgbWFrZXMgc2Vuc2UgdG8gc2NydXRpbml6ZSB0aGlzIGNoYW5nZS4gSSBzaG91bGQgcHJvYmFibHkgZGl2ZSBkZWVwZXIgaW50byB0aGUgY29kZSBvZiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBhbmQgdGhlIHN1cnJvdW5kaW5nIGxvZ2ljIHRvIHVuZGVyc3RhbmQgdGhlIHZ1bG5lcmFiaWxpdHkgdGhpcyBwYXRjaCBpcyBhZGRyZXNzaW5nIGFuZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZpeCBpcyBjb3JyZWN0IGFuZCBzdWZmaWNpZW50bHkgcm9idXN0LiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGF0IGZ1bmN0aW9uLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyODA6XHRvdXRfaW5pdDpcbiAyODE6XHRcdC8qIHdlIHN0YXJ0IGEgcmFuZ2Ugb25seSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgdG8gbm90aWZ5IGFib3V0ICovXG4gMjgyOlx0XHQqdl9zdGFydCA9IGN1cnJfY2hhbmdlID8gdiA6IE5VTEw7XG4gMjgzOlx0XHQqdl9lbmQgPSAqdl9zdGFydDtcbiAyODQ6XHR9XG4gMjg1Olx0XG4gMjg2Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gMjg3Olx0XHRcdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuIDI4ODpcdFx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcbiAyODk6XHRcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG4gMjkwOlx0XHRcdFx0XHRib29sICpjaGFuZ2VkKVxuIDI5MTpcdHtcbiAyOTI6XHRcdGludCBlcnI7XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDI5NTpcdFx0XHRpZiAodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcbiAyOTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyOTc6XHRcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiAzMTg6XHRcdFx0XHRcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XG4gMzE5Olx0XHRcdFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXHUwMDI2dl9zdGFydCwgXHUwMDI2dl9lbmQsIHYsXG4gMzIwOlx0XHRcdFx0XHRcdFx0ICAgY3Vycl9jaGFuZ2UpO1xuIDMyMTpcdFx0XHR9XG4gMzIyOlx0XHRcdGlmICh2X3N0YXJ0IFx1MDAyNlx1MDAyNiB2X2VuZClcbiAzMjM6XHRcdFx0XHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cdTAwM2V2aWQsIHZfZW5kLVx1MDAzZXZpZCxcbiAzMjQ6XHRcdFx0XHRcdCAgICAgICBSVE1fTkVXVkxBTik7XG4gMzI1Olx0XHRcdGlmIChlcnIpXG4gMzI2Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAzMjc6XHRcbiAzMjg6XHRcdFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMzI5Olx0XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjc3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTM0CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2gmIzM5O3MgSW50ZWdlciBPdmVyZmxvdyBQcmV2ZW50aW9uKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBjaGVjazogYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAgKmJlZm9yZSogdGhlIG1haW4gY29tcGFyaXNvbjogYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9ICh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgaXMgZGVzaWduZWQgdG8gaGVhZCBvZmYgYSBwb3RlbnRpYWwgaW50ZWdlciB1bmRlcmZsb3cuIElmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlIHN1YnRyYWN0aW9uIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIHdvdWxkIHJlc3VsdCBpbiBhIG5lZ2F0aXZlIHZhbHVlLiAgQnV0LCBhbmQgdGhpcyBpcyBjcnVjaWFsLCBpdCYjMzk7cyBoaWdobHkgcHJvYmFibGUgdGhhdCBgdmlkYCBpcyBhbiAqdW5zaWduZWQqIGludGVnZXIuIEdpdmVuIHRoYXQsIHRoYXQgJiMzNDtuZWdhdGl2ZSYjMzQ7IGRpZmZlcmVuY2Ugd291bGQgYWN0dWFsbHkgd3JhcCBhcm91bmQsIGxlYWRpbmcgdG8gYSBtdWNoIGxhcmdlciBwb3NpdGl2ZSB2YWx1ZSBkdWUgdG8gdGhlIHdheSB1bnNpZ25lZCBhcml0aG1ldGljIHdvcmtzLiBUaGUgbmV3IGNoZWNrIHNlZW1zIHRvIHByZXZlbnQgdGhhdCB3aG9sZSB3cmFwLWFyb3VuZCBzY2VuYXJpby4gSSYjMzk7bSBwcmV0dHkgc3VyZSBJJiMzOTt2ZSBzZWVuIGB2aWRgIGRlZmluZWQgYXMgc29tZXRoaW5nIGxpa2UgYSBgdTE2YCBiZWZvcmUsIHdoaWNoIHdvdWxkIGNvbmZpcm0gdGhhdCB1bnNpZ25lZCBiZWhhdmlvci4gSnVzdCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGxldCYjMzk7cyB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgYHN0cnVjdCB2dHVubmVsX2luZm9gIGRlZmluaXRpb24gdG8gY29uZmlybSB0aGUgYHZpZGAgdHlwZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3RydWN0IHZ0dW5uZWxfaW5mbyBcXHsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTExLVxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjEyOnN0cnVjdCB2dHVubmVsX2luZm8ge1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTEzLVx0dTMyXHR0dW5pZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQ5NQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW50cm9kdWNpbmcgYSBjaGVjayB3aXRoaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AsIHNwZWNpZmljYWxseSBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYC4gVGhlIGdvYWwgaXMgdG8gcHJldmVudCBhIHBvdGVudGlhbGx5IG5hc3R5IHNpdHVhdGlvbiB3aXRoaW4gdGhhdCBgZm9yYCBsb29wLiBMZXQgbWUgcmVmcmVzaCBteSBtZW1vcnk7IHRoZSByZWxldmFudCBjb2RlIGJsb2NrIGlzOgoKYGBgYwoJCWlmICh0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWQgfHwKCQkgICAgKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0KCQkgICAgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQl0ID0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQ7CgkJZm9yICh2ID0gdGluZm9fbGFzdC0mZ3Q7dmlkOyB2ICZsdDs9IHRpbmZvX2N1cnItJmd0O3ZpZDsgdiYjNDM7JiM0MzspIHsKYGBgCgpJbml0aWFsbHksIG15IHRob3VnaHQgd2FzLCBpZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoYXQgbG9vcCB3b3VsZCBlaXRoZXIgbm90IGV4ZWN1dGUgYXQgYWxsLCBvciBwb3NzaWJseSBjYXVzZSBpbnRlZ2VyIHVuZGVyZmxvdyBpZiBgdmAgd2VyZSB1bnNpZ25lZCwgYW5kIGVuZCB1cCBsb29waW5nIGFuIGV4Y2Vzc2l2ZSBudW1iZXIgb2YgdGltZXMuIEkgcmVtZW1iZXJlZCBgdmAgaXMgYW4gYGludGAsIHNvIHRoZSBsb29wIHdvdWxkIHNpbXBseSBub3QgZXhlY3V0ZSB3aGVuIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYC4gQnV0IHRoZW4gSSByZWFsaXplZCwgdGhpcyBjaGVjayBpcyBzdGlsbCBpbXBvcnRhbnQgYmVjYXVzZSBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBhbmQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgYXJlIGB1MTZgIHR5cGVzLCB3aGljaCBpcyByZWxldmFudCBpbiBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0uIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgSSYjMzk7bSB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIHR5cGVzIGNvcnJlY3RseSB0byBmdWxseSBncmFzcCB0aGUgcG90ZW50aWFsIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNvbmRpdGlvbi4gSSBuZWVkIHRvIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgdnR1bm5lbF9pbmZvYCB0byBjb25maXJtIHRob3NlIGRhdGEgdHlwZXMgYW5kIHRoZSBpbnRlbmRlZCBiZWhhdmlvci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDEwOlx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxuICAxMTpcdFxuICAxMjpcdHN0cnVjdCB2dHVubmVsX2luZm8ge1xuICAxMzpcdFx0dTMyXHR0dW5pZDtcbiAgMTQ6XHRcdHUxNlx0dmlkO1xuICAxNTpcdFx0dTE2XHRmbGFncztcbiAgMTY6XHR9O1xuICAxNzpcdFxuICAxODpcdC8qIGJyX25ldGxpbmtfdHVubmVsLmMgKi9cbiAgMTk6XHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDQzCgkJCQkJCQlvdXRwdXQ6IDE1MAoJCQkJCQkJdGhvdWdodHM6IDExNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIFZMQU4gVHVubmVsIEluZm8gUGF0Y2gqKgoKT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpcyBhZGRpbmcgYSBjaGVjayBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKClgIHNwZWNpZmljYWxseTogYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAuICBJIHNlZSB0aGF0IGl0JiMzOTtzIGRlc2lnbmVkIHRvIGZpeCBhIHN1YnRsZSBsb2dpYyBmbGF3LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgKndoeSogaXQmIzM5O3MgbmVlZGVkLgoKSW5pdGlhbGx5LCB0aGUgY29kZSB3YXMgY29tcGFyaW5nIHRoZSBkaWZmZXJlbmNlcyBvZiBgdmlkYCBhbmQgYHR1bmlkYDogYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9ICh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIGB2aWRgIGlzIGEgYHUxNmAsIGFuZCBgdHVuaWRgIGlzIGEgYHUzMmAuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHRoYXQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCB0aGUgc3VidHJhY3Rpb24gYHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZGAgd2lsbCAqdW5kZXJmbG93Ki4gSG93ZXZlciwgYmVjYXVzZSB0aGUgYHUxNmAgdHlwZXMgYXJlIHByb21vdGVkIHRvIGBpbnRgIGR1cmluZyB0aGUgc3VidHJhY3Rpb24sIHRoZSByZXN1bHQgd2lsbCBiZSBhIG5lZ2F0aXZlIGBpbnRgLiAgSSBrbm93IHRoYXQgY29tcGFyaXNvbiBgIT1gIHdpbGwgY29lcmNlIHRoYXQgYGludGAgdG8gYSBgdTMyYC4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBjYXVzZSBzb21lIGludGVyZXN0aW5nIGJlaGF2aW9yLgoKSWYgdGhpcyB1bmRlcmZsb3cgaGFwcGVucywgYW5kIHRoZSByZXN1bHQsIHRoZSBuZWdhdGl2ZSBgaW50YCwgYmVjb21lcyBhIHZlcnkgbGFyZ2UgYHUzMmAgdmFsdWUgZHVlIHRvIHRoZSBjb252ZXJzaW9uIHRvIHVuc2lnbmVkLiBBbmQgaWYsIHNvbWVob3csIHRoZSBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgY2FsY3VsYXRpb24gaGFwcGVucyB0byAqYWxzbyogeWllbGQgdGhhdCBzYW1lIGxhcmdlIGB1MzJgIHZhbHVlLCB0aGUgaW5lcXVhbGl0eSB3b3VsZCBiZSBmYWxzZWx5IGV2YWx1YXRlZCBhcyB0cnVlISBUaGlzIHRoZW4gbGVhZHMgdG8gYW4gaW50ZXJlc3RpbmcgY2FzZTogdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtJmd0O3ZpZDsgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWQ7IHYmIzQzOyYjNDM7KWAgbWlnaHQgc2tpcCBlbnRpcmVseSwgYmVjYXVzZSB0aGUgbG9vcCBjb25kaXRpb24gd291bGQgbm90IGJlIG1ldC4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCB0aGUgbG9vcCBpbW1lZGlhdGVseSB0ZXJtaW5hdGVzIGJlY2F1c2UgdGhlIHN0YXJ0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIHZhbHVlLgoKT2theSwgc28gSSB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93IGhlcmUuIE15IGNvbmNlcm4gcmlnaHQgbm93IGlzIGlzIHRoaXMgYSBjYXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBObywgYHRpbmZvX2N1cnJgIGFuZCBgdGluZm9fbGFzdGAgYXJlIHBvcHVsYXRlZCBmcm9tIG5ldGxpbmsgYXR0cmlidXRlcy4gVGhleSYjMzk7cmUgZWl0aGVyIGZ1bGx5IGluaXRpYWxpemVkIG9yIHZhbGlkYXRlZCBzbyB0aGVyZSYjMzk7cyBubyB3YXkgdGhlcmUmIzM5O3MgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIHdvcnJ5IGFib3V0LCBhbmQgdGhpcyBwYXRjaCBpc24mIzM5O3QgYWJvdXQgdGhhdC4KClRoZSBwYXRjaCBhcHBlYXJzIHRvIGZpeCBhIGxvZ2ljIGVycm9yLCB3aGVyZSB0aGlzIG5lZ2F0aXZlIHJhbmdlIGNvbmRpdGlvbiAoIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgICkgY291bGQgYmUgdHJ1ZSBhbmQgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yLiBTcGVjaWZpY2FsbHksIHRoZSBsb29wIGlzIHNraXBwZWQsIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIChzdWNjZXNzKSBldmVuIHRob3VnaCBpdCYjMzk7cyBlZmZlY3RpdmVseSBkb2luZyAqbm90aGluZyogd2l0aCBhbiBpbnZhbGlkIHJhbmdlLiAgSXQgc2hvdWxkIHJlYWxseSBiZSByZXR1cm5pbmcgYW4gZXJyb3IgY29kZS4gYEVJTlZBTGAgaXMgcHJvYmFibHkgdGhlIHJpZ2h0IGNob2ljZS4KClNvLCB0aGUgcGF0Y2ggaXMgYWRkaW5nIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgIHRvIGV4cGxpY2l0bHkgcmV0dXJuIGAtRUlOVkFMYC4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgbG9naWMgYnVnLCBub3QgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYnVnLgoKU28sIGxldCYjMzk7cyBuYWlsIHRoaXMgZG93bi4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIG5lZ2F0aXZlLiBBbmQgaWYgYHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGFsc28gaGFwcGVucyB0byBlcXVhbCB0aGUgc2FtZSBuZWdhdGl2ZSB2YWx1ZSwgdGhlIGluZXF1YWxpdHkgcGFzc2VzLiBUaGlzIHJlc3VsdHMgaW4gdGhlIGxvb3AgYmVpbmcgc2tpcHBlZCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5pbmcgMCwgZXZlbiB0aG91Z2ggaXQgKnNob3VsZG4mIzM5O3QqLiBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIHdoaWNoIGNvdWxkIGJ5cGFzcyBzb21lIGltcG9ydGFudCB2YWxpZGF0aW9uLiBJIHN0aWxsIGRvbiYjMzk7dCBzZWUgYW55IHNpZ24gb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBLQVNBTiBvciBzdGFuZGFyZCB0ZXN0aW5nIG1pZ2h0IG5vdCBjYXRjaCB0aGlzLCBidXQgaXTigJlzIGRlZmluaXRlbHkgbm90IGEgS01TQU4gaXNzdWUuIEtNU0FOIGlzIGZvciBkZXRlY3RpbmcgbWVtb3J5IGlzc3Vlcy4KClNpbmNlIHRoaXMgaXNuJiMzOTt0IGEgS01TQU4gaXNzdWUgSSBhbSBnb2luZyB0byBzZXQgYE5lZWRzS01TQU49ZmFsc2VgLgoKSSBhbSByZS1leGFtaW5pbmcgdGhlIHNpdHVhdGlvbiwgYW5kIEkgYW0gcmUtaXRlcmF0aW5nIHRoYXQgdGhlIGNoZWNrIGlzIGFkZGVkIHRvIHByZXZlbnQgbmVnYXRpdmUgcmFuZ2UgbG9vcHMgZnJvbSBydW5uaW5nLiBTbywgbm8sIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhpcyBwYXRjaCBwcmV2ZW50cyBuZWdhdGl2ZSByYW5nZXMuIFNvIGBOZWVkc0tNU0FOPWZhbHNlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgdmFsaWRhdGlvbiBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgVkxBTiBJRCBvZiB0aGUgY3VycmVudCB0dW5uZWwgaW5mbyBpcyBub3QgbGVzcyB0aGFuIHRoZSBWTEFOIElEIG9mIHRoZSBsYXN0IHR1bm5lbCBpbmZvIChwcmV2ZW50aW5nIGEgbmVnYXRpdmUgcmFuZ2UpLiBUaGlzIGZpeGVzIGEgbG9naWMgYnVnIHdoZXJlIGEgbmVnYXRpdmUgcmFuZ2UgY291bGQgYnlwYXNzIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiBhbmQgdW5kZXJmbG93LCBsZWFkaW5nIHRvIGluY29ycmVjdCBoYW5kbGluZyBvZiBWTEFOIHR1bm5lbCByYW5nZXMuIFRoaXMgaXNzdWUgZG9lcyBub3QgaW52b2x2ZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlciBzcGFjZSwgb3IgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGluIGNvbnRyb2wgZmxvdy4gSXQgaXMgYSBsb2dpYyBhbmQgYm91bmRzLWNoZWNraW5nIGlzc3VlLiBUaGVyZWZvcmUsIEtNU0FOIGlzIG5vdCByZXF1aXJlZCwgYXMgS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MjguMjMxMTYwNDIxWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE0NTU0OTI1MTA5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUklER0VcIixcbiAgICBcIkJSSURHRV9WTEFOX0ZJTFRFUklOR1wiLFxuICAgIFwiVkxBTl84MDIxUVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MjguMjMxMTY4MTIxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzYzNzgzMjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDE0IDE0OjM1OjI3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyBiL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY1xcbmluZGV4IDcxYTEyZGEzMDAwNGMuLjA1ZjU2MGVlYjc4OWMgMTAwNjQ0XFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXFxuKysrIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXFxuQEAgLTMwMSw3ICszMDEsOCBAQCBpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4gXFxuIFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRpZiAoKHRpbmZvX2N1cnItXFx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCkgIT1cXG4rXFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCBcXHUwMDNjIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCB8fFxcbitcXHRcXHQgICAgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCkgIT1cXG4gXFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcdFxcdHQgPSB0aW5mb19sYXN0LVxcdTAwM2V0dW5pZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MjguNjA5MjI1NjEyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6ODMxNjIxNTgyMjc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJSSURHRVwiLFxuICAgIFwiQlJJREdFX1ZMQU5fRklMVEVSSU5HXCIsXG4gICAgXCJWTEFOXzgwMjFRXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl92bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjAzOTc1NzBiMDczNDcxYjU5YjQ5NjJlY2JiYWU1NDAwNzA3MzJmMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDE0IDE0OjM1OjI3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG5pbmRleCA3MWExMmRhMzAwMDRjLi4wNWY1NjBlZWI3ODljIDEwMDY0NFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG4rKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcbkBAIC0zMDEsNyArMzAxLDggQEAgaW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gXG4gXHRcdGlmICghKHRpbmZvX2xhc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4rXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbitcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNToyOC42MDkyMjc0OTJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDg5Mzk0NjM2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIG1vZGlmeSBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgY2hhbmdlIHdhcyBuZWVkZWQuIFRoZSBkZXNjcmlwdGlvbiBtZW50aW9ucyBhIGNoZWNrLCBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgYmVpbmcgYWRkZWQuIEFoLCBpdCdzIHRvIHByZXZlbnQgdW5kZXJmbG93IG9yIGludmFsaWQgcmFuZ2VzIHdoZW4gcHJvY2Vzc2luZyBWTEFOIHR1bm5lbCBpbmZvcm1hdGlvbi4gVGhhdCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBXZSB3YW50IHRvIGVuc3VyZSB0aGUgVkxBTiBJRCAoVklEKSB2YWx1ZXMgYXJlIHByb2Nlc3NlZCBpbiBhIGxvZ2ljYWxseSBjb25zaXN0ZW50IGFuZCB2YWxpZCBzZXF1ZW5jZSwgcHJldmVudGluZyBwb3RlbnRpYWwgZXJyb3JzIG9yIHNlY3VyaXR5IGlzc3VlcyB0aGF0IGNvdWxkIGFyaXNlIGZyb20gdW5leHBlY3RlZCBWSUQgb3JkZXIuIEknbGwgbmVlZCB0byBkaWcgaW50byB0aGUgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24gaXRzZWxmIHRvIGZ1bGx5IGdyYXNwIHRoZSBjb250ZXh0IGFuZCB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGlzIGFkZGl0aW9uLiBUaW1lIHRvIGRpdmUgaW50byB0aGUgY29kZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDQ4LCJPdXRwdXRUb2tlbnMiOjQyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAxLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MzkuNTAzMTc3MTA4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODUzOTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4NS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODctXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MzkuNTQ5MDM2NDkzWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzI4MDQxNTQ3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdyByZWxhdGVkIHRvIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCBhIGNsZWFyIHBpY3R1cmUgb2YgaXRzIGNhbGwgZ3JhcGguIFdoZXJlIGlzIHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgaW52b2tlZCB3aXRoaW4gdGhlIGJyb2FkZXIgc3lzdGVtIGFyY2hpdGVjdHVyZT8gSSBuZWVkIHRvIHRyYWNlIGl0cyBvcmlnaW5zLiBJJ2xsIG5lZWQgdG8gaWRlbnRpZnkgYWxsIHRoZSBjYWxsIHNpdGVzIHRvIGZ1bGx5IGdyYXNwIGl0cyByb2xlIGFuZCBjb250ZXh0LiBVbmRlcnN0YW5kaW5nIHRoZSB1cHN0cmVhbSBkYXRhIGZsb3cgaXMga2V5IGhlcmUgdG8gaWRlbnRpZnkgcG90ZW50aWFsIHBvaW50cyBmb3Igb3B0aW1pemF0aW9uIG9yIGRlYnVnZ2luZyBsYXRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjUyMywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM1OjQyLjgyOTQ1NTgxNVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQxODc2NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9ODA5PXN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMC1cXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjgzMTpcXHRcXHRcXHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oYnIsIHAsIGNtZCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MzItXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBcXHUwMDI2dGluZm9fY3VycixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYz0yNTc9c3RhdGljIHZvaWQgX192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI4NjppbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjg3LVxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MTk9aW50IGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8oc3RydWN0IG5sYXR0ciAqYXR0cixcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjAtXFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyMTppbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjItXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6NDIuODc1ODgxMDNaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MjgyNzMwNTM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgc28gSSd2ZSBwaW5wb2ludGVkIGEgcHJvbWlzaW5nIHRhcmdldC4gVGhlIGNvZGUgcGF0aCBvcmlnaW5hdGVzIGZyb20gYGJyX2Fmc3BlY2Agd2l0aGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AuIFRoYXQgZnVuY3Rpb24gaGFuZGxlcyBicmlkZ2UgbmV0bGluayBtZXNzYWdlc+KAlHRoaW5ncyBsaWtlIGBSVE1fU0VUTElOS2AsIGBSVE1fTkVXTElOS2AsIHRoYXQga2luZCBvZiBzdHVmZi4gV2hpY2gsIGZvciBteSBwdXJwb3NlcywgbWFrZXMgaXQgZGVmaW5pdGVseSByZWFjaGFibGUgYW5kIHdvcnRoIG15IHRpbWUuIE15IG1haW4gaW50ZXJlc3QgbGllcyBpbiB0aGUgZnVuY3Rpb24gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AuIE5vdywganVzdCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gR290dGEgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBpbiBwbGFjZSB0byBleHBsb2l0IHRoaXMgcHJvcGVybHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNzksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6NDcuMTU4NjE0MzQ4WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NzE5MDM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX25ldGxpbmtfdHVubmVsLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9NYWtlZmlsZT04PWJyaWRnZS15XFx0Oj0gYnIubyBicl9kZXZpY2UubyBicl9mZGIubyBicl9mb3J3YXJkLm8gYnJfaWYubyBicl9pbnB1dC5vIFxcXFxcXG4tLVxcbm5ldC9icmlkZ2UvTWFrZWZpbGUtMTAtXFx0XFx0XFx0YnJfc3RwX2lmLm8gYnJfc3RwX3RpbWVyLm8gYnJfbmV0bGluay5vIFxcXFxcXG5uZXQvYnJpZGdlL01ha2VmaWxlOjExOlxcdFxcdFxcdGJyX25ldGxpbmtfdHVubmVsLm8gYnJfYXJwX25kX3Byb3h5Lm9cXG5uZXQvYnJpZGdlL01ha2VmaWxlLTEyLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNTo0Ny4yMDUzNDAzNDNaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTQ2MzkyMTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgbXlzZWxmOlxuXG4qKkJyaWRnZSBNb2R1bGUgQnVpbGQgRGVwZW5kZW5jeSBJbnF1aXJ5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBidWlsZCBwcm9jZXNzIGFuZCBpdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoIC0gdGhlIG1vZHVsZSBidWlsZHMgKmlmKiBgQ09ORklHX0JSSURHRWAgaXMgZW5hYmxlZC4gQnV0LCBob2xkIG9uIGEgc2Vjb25k4oCmIGlzbid0IHRoZXJlIHNvbWV0aGluZyBlbHNlIGluZmx1ZW5jaW5nIHRoaXM/IEkgaGF2ZSBhIGZlZWxpbmcgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIG1pZ2h0IGJlIGluIHBsYXkgdG9vLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlLiBCZXN0IHRvIGNoZWNrIHRoZSBNYWtlZmlsZSBmb3IgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZmxhZ3MsIG9yIG1heWJlIGBicl9uZXRsaW5rX3R1bm5lbC5jYCB3b3VsZCBoYXZlIHRoZSBgI2lmZGVmYCBkaXJlY3RpdmVzIEkgbmVlZC4gR290dGEgdHJhY2sgZG93biB3aGVyZSB0aGlzIG1vZHVsZSdzIHRydWx5IGRlZmluZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0OTYsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNTo1Mi4xNTE3MzQ5NjNaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9NYWtlZmlsZVwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTWFrZWZpbGUgZm9yIHRoZSBJRUVFIDgwMi4xZCBldGhlcm5ldCBicmlkZ2luZyBsYXllci5cXG4gICA0OlxcdCNcXG4gICA1OlxcdFxcbiAgIDY6XFx0b2JqLSQoQ09ORklHX0JSSURHRSkgKz0gYnJpZGdlLm9cXG4gICA3OlxcdFxcbiAgIDg6XFx0YnJpZGdlLXlcXHQ6PSBici5vIGJyX2RldmljZS5vIGJyX2ZkYi5vIGJyX2ZvcndhcmQubyBicl9pZi5vIGJyX2lucHV0Lm8gXFxcXFxcbiAgIDk6XFx0XFx0XFx0XFx0YnJfaW9jdGwubyBicl9zdHAubyBicl9zdHBfYnBkdS5vIFxcXFxcXG4gIDEwOlxcdFxcdFxcdFxcdGJyX3N0cF9pZi5vIGJyX3N0cF90aW1lci5vIGJyX25ldGxpbmsubyBcXFxcXFxuICAxMTpcXHRcXHRcXHRcXHRicl9uZXRsaW5rX3R1bm5lbC5vIGJyX2FycF9uZF9wcm94eS5vXFxuICAxMjpcXHRcXG4gIDEzOlxcdGJyaWRnZS0kKENPTkZJR19TWVNGUykgKz0gYnJfc3lzZnNfaWYubyBicl9zeXNmc19ici5vXFxuICAxNDpcXHRcXG4gIDE1OlxcdGJyaWRnZS0kKHN1YnN0IG0seSwkKENPTkZJR19CUklER0VfTkVURklMVEVSKSkgKz0gYnJfbmZfY29yZS5vXFxuICAxNjpcXHRcXG4gIDE3OlxcdGJyX25ldGZpbHRlci15IDo9IGJyX25ldGZpbHRlcl9ob29rcy5vXFxuICAxODpcXHRicl9uZXRmaWx0ZXItJChzdWJzdCBtLHksJChDT05GSUdfSVBWNikpICs9IGJyX25ldGZpbHRlcl9pcHY2Lm9cXG4gIDE5OlxcdG9iai0kKENPTkZJR19CUklER0VfTkVURklMVEVSKSArPSBicl9uZXRmaWx0ZXIub1xcbiAgMjA6XFx0XFxuICAyMTpcXHRicmlkZ2UtJChDT05GSUdfQlJJREdFX0lHTVBfU05PT1BJTkcpICs9IGJyX211bHRpY2FzdC5vIGJyX21kYi5vIGJyX211bHRpY2FzdF9laHQub1xcbiAgMjI6XFx0XFxuICAyMzpcXHRicmlkZ2UtJChDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HKSArPSBicl92bGFuLm8gYnJfdmxhbl90dW5uZWwubyBicl92bGFuX29wdGlvbnMubyBicl9tc3Qub1xcbiAgMjQ6XFx0XFxuICAyNTpcXHRicmlkZ2UtJChDT05GSUdfTkVUX1NXSVRDSERFVikgKz0gYnJfc3dpdGNoZGV2Lm9cXG4gIDI2OlxcdFxcbiAgMjc6XFx0b2JqLSQoQ09ORklHX05FVEZJTFRFUikgKz0gbmV0ZmlsdGVyL1xcbiAgMjg6XFx0XFxuICAyOTpcXHRicmlkZ2UtJChDT05GSUdfQlJJREdFX01SUClcXHQrPSBicl9tcnBfc3dpdGNoZGV2Lm8gYnJfbXJwLm8gYnJfbXJwX25ldGxpbmsub1xcbiAgMzA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM1OjUyLjE1MTgwMjEzM1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTk4NjA1NTI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6XG5cbioqRXhhbWluaW5nIEJyaWRnZSBUdW5uZWwgTW9kdWxlIERlcGVuZGVuY2llcyoqXG5cblJpZ2h0LCBzbyBgYnJfbmV0bGlua190dW5uZWwub2AgaXMgcHJlZGljdGFibHkgYmFrZWQgaW4gd2hlbmV2ZXIgYENPTkZJR19CUklER0VgIGlzIHNldC4gU3RhbmRhcmQgc3R1ZmYuIEJ1dCBoYW5nIG9uLCBJIHNlZW0gdG8gcmVjYWxsIHRoYXQgYGJyX3ZsYW5fdHVubmVsLm9gIGdldHMgYnVpbHQgYmFzZWQgb24gdGhlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBvcHRpb24uIFRoYXQgcmluZ3MgYSBiZWxsLiBOb3csIEkgbmVlZCB0byBjb25maXJtIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSB0d28gbW9kdWxlcy4gVGhlIGVhc2llc3Qgd2F5IGlzIGFsd2F5cyB0byBqdXN0IGRpdmUgaW50byB0aGUgY29kZS4gU3BlY2lmaWNhbGx5LCBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIHNvdXJjZSBmb3IgYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AgdG8gbG9vayBmb3IgYW55IGAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgZGlyZWN0aXZlcy4gVGhhdCBzaG91bGQgaW1tZWRpYXRlbHkgY2xhcmlmeSBpZiB0aGVyZSdzIGFueSBjb25kaXRpb25hbCBpbmNsdXNpb24gb3IgZnVuY3Rpb25hbGl0eSB0aWVkIHRvIHRoZSBWTEFOIGZpbHRlcmluZyBmZWF0dXJlIHdpdGhpbiB0aGlzIG5ldGxpbmsgdHVubmVsIG1vZHVsZS4gSXQncyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDMwMiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6NTcuMTUwNDEwMTA3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzNzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICpcXHRCcmlkZ2UgcGVyIHZsYW4gdHVubmVsIHBvcnQgZHN0X21ldGFkYXRhIG5ldGxpbmsgY29udHJvbCBpbnRlcmZhY2VcXG4gICA0OlxcdCAqXFxuICAgNTpcXHQgKlxcdEF1dGhvcnM6XFxuICAgNjpcXHQgKlxcdFJvb3BhIFByYWJodVxcdFxcdFxcdTAwM2Nyb29wYUBjdW11bHVzbmV0d29ya3MuY29tXFx1MDAzZVxcbiAgIDc6XFx0ICovXFxuICAgODpcXHRcXG4gICA5OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4gIDEwOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICAxMTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvZXRoZXJkZXZpY2UuaFxcdTAwM2VcXG4gIDEyOlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvcnRuZXRsaW5rLmhcXHUwMDNlXFxuICAxMzpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L25ldF9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gIDE0OlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvc29jay5oXFx1MDAzZVxcbiAgMTU6XFx0I2luY2x1ZGUgXFx1MDAzY3VhcGkvbGludXgvaWZfYnJpZGdlLmhcXHUwMDNlXFxuICAxNjpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L2RzdF9tZXRhZGF0YS5oXFx1MDAzZVxcbiAgMTc6XFx0XFxuICAxODpcXHQjaW5jbHVkZSBcXFwiYnJfcHJpdmF0ZS5oXFxcIlxcbiAgMTk6XFx0I2luY2x1ZGUgXFxcImJyX3ByaXZhdGVfdHVubmVsLmhcXFwiXFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0YXRpYyBzaXplX3QgX19nZXRfdmxhbl90aW5mb19zaXplKHZvaWQpXFxuICAyMjpcXHR7XFxuICAyMzpcXHRcXHRyZXR1cm4gbmxhX3RvdGFsX3NpemUoMCkgKyAvKiBuZXN0IElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lORk8gKi9cXG4gIDI0OlxcdFxcdFxcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpICsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfSUQgKi9cXG4gIDI1OlxcdFxcdFxcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUxNikpICsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfVklEICovXFxuICAyNjpcXHRcXHRcXHQgIG5sYV90b3RhbF9zaXplKHNpemVvZih1MTYpKTsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1MgKi9cXG4gIDI3OlxcdH1cXG4gIDI4OlxcdFxcbiAgMjk6XFx0Ym9vbCB2bGFuX3R1bmlkX2lucmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9jdXJyLFxcbiAgMzA6XFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9sYXN0KVxcbiAgMzE6XFx0e1xcbiAgMzI6XFx0XFx0X19iZTMyIHR1bmlkX2N1cnIgPSB0dW5uZWxfaWRfdG9fa2V5MzIodl9jdXJyLVxcdTAwM2V0aW5mby50dW5uZWxfaWQpO1xcbiAgMzM6XFx0XFx0X19iZTMyIHR1bmlkX2xhc3QgPSB0dW5uZWxfaWRfdG9fa2V5MzIodl9sYXN0LVxcdTAwM2V0aW5mby50dW5uZWxfaWQpO1xcbiAgMzQ6XFx0XFxuICAzNTpcXHRcXHRyZXR1cm4gKGJlMzJfdG9fY3B1KHR1bmlkX2N1cnIpIC0gYmUzMl90b19jcHUodHVuaWRfbGFzdCkpID09IDE7XFxuICAzNjpcXHR9XFxuICAzNzpcXHRcXG4gIDM4OlxcdHN0YXRpYyBpbnQgX19nZXRfbnVtX3ZsYW5fdHVubmVsX2luZm9zKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKVxcbiAgMzk6XFx0e1xcbiAgNDA6XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdiwgKnZ0YmVnaW4gPSBOVUxMLCAqdnRlbmQgPSBOVUxMO1xcbiAgNDE6XFx0XFx0aW50IG51bV90aW5mb3MgPSAwO1xcbiAgNDI6XFx0XFxuICA0MzpcXHRcXHQvKiBDb3VudCBudW1iZXIgb2YgdmxhbiBpbmZvcyAqL1xcbiAgNDQ6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodiwgXFx1MDAyNnZnLVxcdTAwM2V2bGFuX2xpc3QsIHZsaXN0KSB7XFxuICA0NTpcXHRcXHRcXHQvKiBvbmx5IGEgY29udGV4dCwgYnJpZGdlIHZsYW4gbm90IGFjdGl2YXRlZCAqL1xcbiAgNDY6XFx0XFx0XFx0aWYgKCFicl92bGFuX3Nob3VsZF91c2UodikgfHwgIXYtXFx1MDAzZXRpbmZvLnR1bm5lbF9pZClcXG4gIDQ3OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAgNDg6XFx0XFxuICA0OTpcXHRcXHRcXHRpZiAoIXZ0YmVnaW4pIHtcXG4gIDUwOlxcdFxcdFxcdFxcdGdvdG8gaW5pdHZhcnM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM1OjU3LjE1MDUwNTMxN1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0Mjg1NDUwODE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgVGhvdWdodHMgb24gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24uIFRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBhdCBtZSBpcyB0aGF0IGl0J3MgbG9jYXRlZCB3aXRoaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AuIFRoYXQncyBpbXBvcnRhbnQgY29udGV4dC4gR2l2ZW4gdGhlIGZpbGUgbmFtZSwgSSdtIGFscmVhZHkgYXNzdW1pbmcgdGhpcyBmdW5jdGlvbiBpcyBoZWF2aWx5IGludm9sdmVkIGluIGhhbmRsaW5nIFZMQU4tcmVsYXRlZCBjb25maWd1cmF0aW9ucywgcG90ZW50aWFsbHkgZm9yIHR1bm5lbGluZyBzY2VuYXJpb3Mgd2l0aGluIGEgTGludXggYnJpZGdlLiBIb3dldmVyLCBJIG5lZWQgdG8gY29uZmlybSB0aGlzIGFzc3VtcHRpb24uIE15IG5leHQgc3RlcCwgd2l0aG91dCBhIGRvdWJ0LCBpcyB0byBpbW1lZGlhdGVseSBjaGVjayBhbmQgc2VlIGlmIHRoaXMgZnVuY3Rpb24gaXMgY29uZGl0aW9uYWxseSBjb21waWxlZC4gSSBzdHJvbmdseSBzdXNwZWN0IGl0J3MgZ29pbmcgdG8gYmUgZ3VhcmRlZCBieSBhIGAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSwgb3Igc29tZXRoaW5nIHNpbWlsYXIuIFRoaXMgaXMga2V5IGJlY2F1c2UgdGhhdCB3b3VsZCB0ZWxsIG1lIHdoZXRoZXIgaXRzIGluY2x1c2lvbiBkZXBlbmRzIG9uIHdoZXRoZXIgVkxBTiBmaWx0ZXJpbmcgc3VwcG9ydCBoYXMgYmVlbiBzcGVjaWZpY2FsbHkgZW5hYmxlZCBkdXJpbmcgdGhlIGtlcm5lbCBidWlsZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTUwMSwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6MDEuNDM1OTU5MjI1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQwNjYwNSwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjAxLjQ4MjM3NDRaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzU3ODQ2NzU0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgVkxBTiBJbnRlcmFjdGlvbioqXG5cbkhtbSwgbm8sIHRoYXQgaW5pdGlhbCBhc3N1bXB0aW9uIGFib3V0IHRoZSBmdW5jdGlvbmFsaXR5IGlzIGluY29ycmVjdC4gSG93ZXZlciwgSSBjYW4gc2VlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBoZWF2aWx5IHJlbGllcyBvbiBgc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cGAgYW5kIG90aGVyIFZMQU4tc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBMZXQgbWUgdGhpbmsuLi4gcGVyaGFwcyBkaWdnaW5nIGludG8gYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAgd2lsbCByZXZlYWwgZnVydGhlciBpbnNpZ2h0cy4gSXQgb2Z0ZW4gaG9sZHMgbW9yZSBkZXRhaWxzIGFib3V0IGludGVybmFsIGJyaWRnZSB3b3JraW5ncywgYW5kIHRoZXJlIGlzIGEgZGVjZW50IGNoYW5jZSB0aGVyZSBhcmUgcHJpdmF0ZSB0dW5uZWwgaW1wbGVtZW50YXRpb25zIGRlZmluZWQgaW4gdGhhdCBoZWFkZXIuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhvc2Ugc3RydWN0dXJlcyB0byBnZXQgYSBmdWxsIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU4MDYsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjowNS4wNjA4NDQ2MjFaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTY5MTI1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0zMj1pbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTM0LVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDozNTojaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zNi0vKiBicl92bGFuX3R1bm5lbC5jICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjA1LjEwNjgxOTAxNloiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTUzMDc2MzkxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBWTEFOIFR1bm5lbCBJbmZvcm1hdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBkaXZlIGludG8gaG93IFZMQU4gdHVubmVsaW5nIGlzIGhhbmRsZWQgd2l0aGluIHRoZSBicmlkZ2UuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgbGlrZWx5IHNvdXJjZSwgZ2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGJyaWRnZSBpbnRlcm5hbHMuIEknbSB0aGlua2luZyB0aGF0IHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBzaG91bGQgYmUgZGVmaW5lZCBvciBkZWNsYXJlZCBpbiBgbmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oYC4gTGV0J3MgY29uZmlybSB0aGF0IGh5cG90aGVzaXMgYW5kIHNlZSB3aGF0IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGlzIGFsbCBhYm91dC4gVGhpcyBmdW5jdGlvbiBuYW1lIHN0cm9uZ2x5IHN1Z2dlc3RzIGl0J3MgaW52b2x2ZWQgaW4gcHJvY2Vzc2luZyBvciBleHRyYWN0aW5nIHR1bm5lbC1yZWxhdGVkIFZMQU4gaW5mb3JtYXRpb24sIGJ1dCB0aGUgZXhhY3QgZGV0YWlscyBJJ2xsIGhhdmUgdG8gYXNjZXJ0YWluIGJ5IHJlYWRpbmcgdGhlIGNvZGUgd2l0aGluIHRoaXMgaGVhZGVyLiBNeSBleHBlcnRpc2UgZ3VpZGVzIG1lIHRvIHRoZSBsaWtlbHkgbG9jYXRpb24sIG5vdyBJIGp1c3QgaGF2ZSB0byBsb29rLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MTU4LCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6MTYuNjM3NTg1MjI2WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDc4OTQwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0xOT1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMC1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbyk7XFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjIxOmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMi1cXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoxNi42ODIzODE0MzJaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDYwMjY4MzczNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBhIFN5c3RlbSBEZWNsYXJhdGlvbioqXG5cblJpZ2h0LCBzbyB0aGlzIHRoaW5nIGlzIGRlY2xhcmVkIHVuY29uZGl0aW9uYWxseS4gVGhhdCdzIGEgc3RhcnRpbmcgcG9pbnQsIG5vdCBwYXJ0aWN1bGFybHkgaGVscGZ1bCBpbiBpdHNlbGYuIFRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyBhbHdheXMgdG8gdHJhY2UgaXRzIHVzYWdlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCwgc2VlIHdoZXJlIGl0J3MgYmVpbmcgKmNhbGxlZCogdG8gZ3Jhc3AgaXRzIHNpZ25pZmljYW5jZS4gTGV0J3MgZGlnIGludG8gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYC4gVGhhdCdzIHdoZXJlIEknZCBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgY29kZSBpZiBpdCdzIHJlbGF0ZWQgdG8gdGhlIGJyaWRnZSBuZXRsaW5rIGludGVyZmFjZSwgd2hpY2gsIGdpdmVuIHRoZSBmaWxlbmFtZSwgc2VlbXMgaGlnaGx5IGxpa2VseS4gVGltZSB0byBzZWUgaG93IHRoaXMgdGhpbmcgaXMgYmVpbmcgKnVzZWQqIHdpdGhpbiB0aGF0IGNvbnRleHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY1MzksIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoyMS4yODUwNjc2MTdaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2ODk1OTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmsuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODMwLVxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODMxOlxcdFxcdFxcdGVyciA9IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhiciwgcCwgY21kLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMi1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgIFxcdTAwMjZ0aW5mb19jdXJyLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoyMS4zMzE5NjgzMTJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Nzk5NzYxNzU4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIGJyX2Fmc3BlYyoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcy4gSSdtIGdvaW5nIHRvIGZvY3VzIG9uIGBicl9hZnNwZWNgIHdpdGhpbiB0aGUgYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYCBmaWxlLiBUaGlzIGxpa2VseSByZWxhdGVzIHRvIGhvdyB0aGUgYnJpZGdpbmcgY29kZSBpbnRlcmFjdHMgd2l0aCBzcGVjaWZpYyBhZGRyZXNzIGZhbWlseSBzcGVjaWZpY2F0aW9ucywgcHJvYmFibHkgdGhyb3VnaCB0aGUgTmV0bGluayBpbnRlcmZhY2UuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgaGFuZGxpbmcgZm9yIHNvbWUgY3VzdG9tIG9yIHNwZWNpZmljIEFGIChBZGRyZXNzIEZhbWlseSkgcmVsYXRlZCBvcGVyYXRpb25zIG9yIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYnJpZGdlLiBHaXZlbiB0aGUgY29udGV4dCwgSSdtIGFudGljaXBhdGluZyB0aGlzIHdpbGwgaW52b2x2ZSBpbnRlcmFjdGlvbnMgd2l0aCBOZXRsaW5rIG1lc3NhZ2VzLCBwYXJzaW5nIHNwZWNpZmljIGF0dHJpYnV0ZXMsIGFuZCBwcm9iYWJseSBzb21lIGxvZ2ljIHJlbGF0ZWQgdG8gc2V0dGluZyBvciBxdWVyeWluZyBicmlkZ2Utc3BlY2lmaWMgcGFyYW1ldGVycyBiYXNlZCBvbiB0aGF0IGFkZHJlc3MgZmFtaWx5LiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBlbnRyeSBwb2ludCBvciBwcmltYXJ5IGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGVzZSBhZGRyZXNzIGZhbWlseSBzcGVjaWZpYyByZXF1ZXN0cywgYW5kIGhvdyB0aGV5IGludGVncmF0ZSB3aXRoaW4gdGhlIGJyb2FkZXIgYnJpZGdlIG1hbmFnZW1lbnQgc2NoZW1lLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY4ODIsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoyOS4zMjk1ODgyNjdaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc4NzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDgwMCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDgwMDpcXHRcXHR9XFxuIDgwMTpcXHRcXG4gODAyOlxcdFxcdGVyciA9IGJyX3ZsYW5faW5mbyhiciwgcCwgY21kLCB2aW5mb19jdXJyLCBjaGFuZ2VkLCBleHRhY2spO1xcbiA4MDM6XFx0XFx0aWYgKCpjaGFuZ2VkKVxcbiA4MDQ6XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZpbmZvX2N1cnItXFx1MDAzZXZpZCwgMCwgcnRtX2NtZCk7XFxuIDgwNTpcXHRcXG4gODA2OlxcdFxcdHJldHVybiBlcnI7XFxuIDgwNzpcXHR9XFxuIDgwODpcXHRcXG4gODA5OlxcdHN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4gODEwOlxcdFxcdFxcdCAgICAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4gODExOlxcdFxcdFxcdCAgICAgc3RydWN0IG5sYXR0ciAqYWZfc3BlYyxcXG4gODEyOlxcdFxcdFxcdCAgICAgaW50IGNtZCwgYm9vbCAqY2hhbmdlZCxcXG4gODEzOlxcdFxcdFxcdCAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiA4MTQ6XFx0e1xcbiA4MTU6XFx0XFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2N1cnIgPSBOVUxMO1xcbiA4MTY6XFx0XFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2xhc3QgPSBOVUxMO1xcbiA4MTc6XFx0XFx0c3RydWN0IG5sYXR0ciAqYXR0cjtcXG4gODE4OlxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gdGluZm9fbGFzdCA9IHt9O1xcbiA4MTk6XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19jdXJyID0ge307XFxuIDgyMDpcXHRcXHRpbnQgZXJyID0gMCwgcmVtO1xcbiA4MjE6XFx0XFxuIDgyMjpcXHRcXHRubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGFmX3NwZWMsIHJlbSkge1xcbiA4MjM6XFx0XFx0XFx0ZXJyID0gMDtcXG4gODI0OlxcdFxcdFxcdHN3aXRjaCAobmxhX3R5cGUoYXR0cikpIHtcXG4gODI1OlxcdFxcdFxcdGNhc2UgSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfSU5GTzpcXG4gODI2OlxcdFxcdFxcdFxcdGlmICghcCB8fCAhdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcXHUwMDI2cC1cXHUwMDNlZmxhZ3MpKVxcbiA4Mjc6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDgyODpcXHRcXHRcXHRcXHRlcnIgPSBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvKGF0dHIsIFxcdTAwMjZ0aW5mb19jdXJyKTtcXG4gODI5OlxcdFxcdFxcdFxcdGlmIChlcnIpXFxuIDgzMDpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiA4MzE6XFx0XFx0XFx0XFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGJyLCBwLCBjbWQsXFxuIDgzMjpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIFxcdTAwMjZ0aW5mb19jdXJyLFxcbiA4MzM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBcXHUwMDI2dGluZm9fbGFzdCxcXG4gODM0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgY2hhbmdlZCk7XFxuIDgzNTpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiA4MzY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gODM3OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiA4Mzg6XFx0XFx0XFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX0lORk86XFxuIDgzOTpcXHRcXHRcXHRcXHRpZiAobmxhX2xlbihhdHRyKSAhPSBzaXplb2Yoc3RydWN0IGJyaWRnZV92bGFuX2luZm8pKVxcbiA4NDA6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDg0MTpcXHRcXHRcXHRcXHR2aW5mb19jdXJyID0gbmxhX2RhdGEoYXR0cik7XFxuIDg0MjpcXHRcXHRcXHRcXHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5faW5mbyhiciwgcCwgY21kLCB2aW5mb19jdXJyLFxcbiA4NDM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNnZpbmZvX2xhc3QsIGNoYW5nZWQsXFxuIDg0NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBleHRhY2spO1xcbiA4NDU6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gODQ2OlxcdFxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDg0NzpcXHRcXHRcXHRcXHRicmVhaztcXG4gODQ4OlxcdFxcdFxcdGNhc2UgSUZMQV9CUklER0VfTVJQOlxcbiA4NDk6XFx0XFx0XFx0XFx0ZXJyID0gYnJfbXJwX3BhcnNlKGJyLCBwLCBhdHRyLCBjbWQsIGV4dGFjayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjI5LjMyOTg2ODc4N1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MTMzNTM3MTMxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqRGl2aW5nIGludG8gVkxBTiBUdW5uZWxpbmcgd2l0aCBCcmlkZ2UgUG9ydHMqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyBWTEFOIHR1bm5lbGluZyB3b3JrcyB3aXRoaW4gdGhlIGJyaWRnZSBmcmFtZXdvcmsuIEkndmUgcmVhbGl6ZWQgdGhhdCB0aGUgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24gaXMgYWNjZXNzaWJsZSB0aHJvdWdoIGBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPYCB3aXRoaW4gYElGTEFfQUZfU1BFQ2AsIHdoaWNoIGlzLCBvZiBjb3Vyc2UsIGFzc29jaWF0ZWQgd2l0aCBhIGJyaWRnZSBwb3J0LiBUaGUga2V5IGhlcmUsIGFzIGFsd2F5cywgaXMgdGhhdCB0aGUgcG9ydCBpdHNlbGYgbmVlZHMgdG8gaGF2ZSB0aGUgYEJSX1ZMQU5fVFVOTkVMX0JJVGAgZmxhZyBzZXQgd2l0aGluIGl0cyBmbGFncyAoYHAtXHUwMDNlZmxhZ3NgLCBzcGVjaWZpY2FsbHkpLiBOb3csIHRoZSBtaWxsaW9uIGRvbGxhciBxdWVzdGlvbiwgb3IgcmF0aGVyLCB0aGUga2V5IHRvIHVubG9ja2luZyB0aGlzIHdob2xlIGZlYXR1cmUsIGlzICpob3cqIGV4YWN0bHkgZG9lcyB0aGF0IGBCUl9WTEFOX1RVTk5FTF9CSVRgIGdldCBzZXQgaW4gdGhlIGZpcnN0IHBsYWNlPyBUaW1lIHRvIGdvIGh1bnRpbmcgdGhyb3VnaCB0aGUgY29kZWJhc2UgYW5kIHNlZSB3aGVyZSB0aGF0IGZsYWcgaXMgYmVpbmcgbWFuaXB1bGF0ZWQuIFRoYXQncyB0aGUgY3JpdGljYWwgcGllY2UgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdG8gZnVsbHkgZ3Jhc3AgdGhlIGltcGxlbWVudGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTUzLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjozNy40NjM0MDkzNTdaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MjM4NzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJSX1ZMQU5fVFVOTkVMX0JJVFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX2lucHV0LmM9MzM5PXN0YXRpYyByeF9oYW5kbGVyX3Jlc3VsdF90IGJyX2hhbmRsZV9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpXFxuLS1cXG5uZXQvYnJpZGdlL2JyX2lucHV0LmMtMzYxLVxcdHAgPSBicl9wb3J0X2dldF9yY3Uoc2tiLVxcdTAwM2VkZXYpO1xcbm5ldC9icmlkZ2UvYnJfaW5wdXQuYzozNjI6XFx0aWYgKHRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSlcXG5uZXQvYnJpZGdlL2JyX2lucHV0LmMtMzYzLVxcdFxcdGJyX2hhbmRsZV9pbmdyZXNzX3ZsYW5fdHVubmVsKHNrYiwgcCwgbmJwX3ZsYW5fZ3JvdXBfcmN1KHApKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTkzPXN0YXRpYyBzaXplX3QgYnJfZ2V0X2xpbmtfYWZfc2l6ZV9maWx0ZXJlZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTE1LVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjExNjpcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwLVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTE3LVxcdFxcdHZpbmZvX3N6ICs9IGJyX2dldF92bGFuX3R1bm5lbF9pbmZvX3NpemUodmcpO1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9NDU4PXN0YXRpYyBpbnQgYnJfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTU0Mi1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo1NDM6XFx0XFx0aWYgKHBvcnQgXFx1MDAyNlxcdTAwMjYgdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcXHUwMDI2cG9ydC1cXHUwMDNlZmxhZ3MpKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTU0NC1cXHRcXHRcXHRlcnIgPSBicl9maWxsX3ZsYW5fdHVubmVsX2luZm8oc2tiLCB2Zyk7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODI1LVxcdFxcdGNhc2UgSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfSU5GTzpcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MjY6XFx0XFx0XFx0aWYgKCFwIHx8ICF0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwLVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODI3LVxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc0LVxcdH1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjE3NTpcXHRpZiAoIXRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSkge1xcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc2LVxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJQb3J0IGRvZXNuJ3QgaGF2ZSB0dW5uZWwgZmxhZyBzZXRcXFwiKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6MzcuNTA5NjUzMDIzWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ5NTAzNDU2MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBgQlJfVkxBTl9UVU5ORUxfQklUYCoqXG5cbk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgSSBzZWUgYEJSX1ZMQU5fVFVOTkVMX0JJVGAuIEl0IHN0cmlrZXMgbWUgYXMgYSBiaXQgZmxhZywgZWl0aGVyIGFuIGVudW0gb3IgYSBzaW1wbGUgI2RlZmluZS4gVGhlIG5hbWUncyBzdWdnZXN0aXZlIGVub3VnaCwgYnV0IEkgbmVlZCB0byBjb25maXJtIGl0cyBleGFjdCBkZWZpbml0aW9uLiBMZXQncyB0cmFjZSB0aGlzIGFuZCBxdWlja2x5IHBpbnBvaW50IHdoZXJlIGBCUl9WTEFOX1RVTk5FTF9CSVRgIGlzIGFjdHVhbGx5IGRlY2xhcmVkLiBUaGF0J2xsIHRlbGwgbWUgaXRzIHNjb3BlLCBpdHMgdHlwZSwgYW5kIHVsdGltYXRlbHksIGhvdyBpdCdzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBsYXJnZXIgY29udGV4dCBvZiB0aGlzIFZMQU4gdHVubmVsaW5nIGltcGxlbWVudGF0aW9uLiBHb3R0YSBmaWd1cmUgb3V0IHdoYXQncyBnb2luZyBvbiB1bmRlciB0aGUgaG9vZCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4OTk5LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6NDIuNDYwMDAwNzUyWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjk0NDcxMDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQlJfVkxBTl9UVU5ORUxfQklUXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg9Mzk9ZW51bSBicmlkZ2VfZmxhZ3NfYml0IHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtNTItXFx0QlJfTVVMVElDQVNUX1RPX1VOSUNBU1RfQklULFxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg6NTM6XFx0QlJfVkxBTl9UVU5ORUxfQklULFxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtNTQtXFx0QlJfQkNBU1RfRkxPT0RfQklULFxcbi0tXFxuaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaC04MC0jZGVmaW5lIEJSX01VTFRJQ0FTVF9UT19VTklDQVNUXFx0QklUKEJSX01VTFRJQ0FTVF9UT19VTklDQVNUX0JJVClcXG5pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oOjgxOiNkZWZpbmUgQlJfVkxBTl9UVU5ORUxcXHRcXHRCSVQoQlJfVkxBTl9UVU5ORUxfQklUKVxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtODItI2RlZmluZSBCUl9CQ0FTVF9GTE9PRFxcdFxcdEJJVChCUl9CQ0FTVF9GTE9PRF9CSVQpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjQyLjU4OTQ1NDUwOVoiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NTc4MzQ5NDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipCUl9WTEFOX1RVTk5FTCBJbnZlc3RpZ2F0aW9uKipcblxuQWxyaWdodCwgaXQncyBqdW1waW5nIG91dCBhdCBtZSBhcyBgQlJfVkxBTl9UVU5ORUxgLiBUaW1lIHRvIGRpZyBpbi4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gdHJhY2UgaXRzIHVzYWdlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dHMgaW4gd2hpY2ggdGhpcyBicmlkZ2UgVkxBTiB0dW5uZWwgaXMgZW1wbG95ZWQuIEkgbmVlZCB0byBrbm93IHRoZSBjYWxsaW5nIGZ1bmN0aW9ucywgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgdGhlIGludGVuZGVkIGJlaGF2aW9yIGluIGVhY2ggc2NlbmFyaW8uIEtub3dpbmcgd2hlcmUgaXQncyB1c2VkIHdpbGwgYmUgY3JpdGljYWwgZm9yIGZvcm1pbmcgYSBjb2hlc2l2ZSBtZW50YWwgbW9kZWwuIEknbGwgbmVlZCB0byByYXBpZGx5IGlkZW50aWZ5IGtleSBkZXBlbmRlbmNpZXMgYW5kIGFueSBwb3RlbnRpYWwgYXJlYXMgb2YgY29uY2VybiBiYXNlZCBvbiB0aGUgc3Vycm91bmRpbmcgY29kZS4gTXkgZm9jdXMgd2lsbCBiZSBvbiB0aGUgZWRnZSBjYXNlcyBhbmQgaG93IHRoaXMgdHVubmVsIGludGVyYWN0cyB3aXRoIHRoZSBvdmVyYWxsIHN5c3RlbSBhcmNoaXRlY3R1cmUuIE5vdywgbGV0J3MgZ2V0IHRvIHdvcmsgYW5kIGZpbmQgdGhlIGNhbGxzaXRlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTQ0OCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjUwLjE2NzgwNjU3N1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDYxNzU5MzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQlJfVkxBTl9UVU5ORUxcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9pbnB1dC5jPTMzOT1zdGF0aWMgcnhfaGFuZGxlcl9yZXN1bHRfdCBicl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKVxcbi0tXFxubmV0L2JyaWRnZS9icl9pbnB1dC5jLTM2MS1cXHRwID0gYnJfcG9ydF9nZXRfcmN1KHNrYi1cXHUwMDNlZGV2KTtcXG5uZXQvYnJpZGdlL2JyX2lucHV0LmM6MzYyOlxcdGlmICh0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwLVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9pbnB1dC5jLTM2My1cXHRcXHRicl9oYW5kbGVfaW5ncmVzc192bGFuX3R1bm5lbChza2IsIHAsIG5icF92bGFuX2dyb3VwX3JjdShwKSk7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz05Mz1zdGF0aWMgc2l6ZV90IGJyX2dldF9saW5rX2FmX3NpemVfZmlsdGVyZWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoxMTY6XFx0aWYgKHAgXFx1MDAyNlxcdTAwMjYgdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcXHUwMDI2cC1cXHUwMDNlZmxhZ3MpKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNy1cXHRcXHR2aW5mb19zeiArPSBicl9nZXRfdmxhbl90dW5uZWxfaW5mb19zaXplKHZnKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTIzND1zdGF0aWMgaW50IGJyX3BvcnRfZmlsbF9hdHRycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMjc2LVxcdCAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfVkxBTl9UVU5ORUwsICEhKGZsYWdzIFxcdTAwMjZcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoyNzc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0QlJfVkxBTl9UVU5ORUwpKSB8fFxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTI3OC1cXHQgICAgbmxhX3B1dF91MTYoc2tiLCBJRkxBX0JSUE9SVF9HUk9VUF9GV0RfTUFTSywgcC1cXHUwMDNlZ3JvdXBfZndkX21hc2spIHx8XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz00NTg9c3RhdGljIGludCBicl9maWxsX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQyLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjU0MzpcXHRcXHRpZiAocG9ydCBcXHUwMDI2XFx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwb3J0LVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQ0LVxcdFxcdFxcdGVyciA9IGJyX2ZpbGxfdmxhbl90dW5uZWxfaW5mbyhza2IsIHZnKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTgwOT1zdGF0aWMgaW50IGJyX2Fmc3BlYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MjUtXFx0XFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPOlxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjgyNjpcXHRcXHRcXHRpZiAoIXAgfHwgIXRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSlcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MjctXFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz05NTE9c3RhdGljIGludCBicl9zZXRwb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBubGF0dHIgKnRiW10sXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NTktXFx0b2xkX2ZsYWdzID0gUkVBRF9PTkNFKHAtXFx1MDAzZWZsYWdzKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5NjA6XFx0YnJfdmxhbl90dW5uZWxfb2xkID0gKG9sZF9mbGFncyBcXHUwMDI2IEJSX1ZMQU5fVFVOTkVMKSA/IHRydWUgOiBmYWxzZTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NjEtXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NzgtXFx0YnJfc2V0X3BvcnRfZmxhZyhcXHUwMDI2c2V0LCBcXHUwMDI2Y2xlYXIsIHRiLCBJRkxBX0JSUE9SVF9WTEFOX1RVTk5FTCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5Nzk6XFx0XFx0XFx0IEJSX1ZMQU5fVFVOTkVMKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05ODAtXFx0YnJfc2V0X3BvcnRfZmxhZyhcXHUwMDI2c2V0LCBcXHUwMDI2Y2xlYXIsIHRiLCBJRkxBX0JSUE9SVF9ORUlHSF9TVVBQUkVTUyxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTEwMTYtXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6MTAxNzpcXHRpZiAoYnJfdmxhbl90dW5uZWxfb2xkIFxcdTAwMjZcXHUwMDI2ICEoZmxhZ3MgXFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTAxOC1cXHRcXHRuYnBfdmxhbl90dW5uZWxfaW5mb19mbHVzaChwKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jPTQ4MD1zdHJ1Y3Qgc2tfYnVmZiAqYnJfaGFuZGxlX3ZsYW4oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuLmMtNTMwLVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jOjUzMTpcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiAocC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkgXFx1MDAyNlxcdTAwMjZcXG5uZXQvYnJpZGdlL2JyX3ZsYW4uYy01MzItXFx0ICAgIGJyX2hhbmRsZV9lZ3Jlc3Nfdmxhbl90dW5uZWwoc2tiLCB2KSkge1xcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc0LVxcdH1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjE3NTpcXHRpZiAoIXRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSkge1xcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc2LVxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJQb3J0IGRvZXNuJ3QgaGF2ZSB0dW5uZWwgZmxhZyBzZXRcXFwiKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6NTAuMjEzOTg4MTcyWiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMjY5NTE1MjExLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgdGhlIFZMQU4gVHVubmVsIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMsIGFuZCBpdCBsb29rcyBsaWtlIEkgY2FuIG1hbmlwdWxhdGUgYEJSX1ZMQU5fVFVOTkVMYCB0aHJvdWdoIGBJRkxBX0JSUE9SVF9WTEFOX1RVTk5FTGAgdXNpbmcgYGJyX3NldHBvcnRgLiBUaGF0J3MgYSBnb29kIGVudHJ5IHBvaW50OyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHNob3VsZCBwcmlvcml0aXplIGZvciBmdXp6aW5nLiBJdCdzIGEgY2xlYXIgcGF0aCB0byByZWFjaCB0aGUgcmVsZXZhbnQgY29kZS5cblxuTm93LCBsZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGp1c3QgdG8gYmUgc3VyZS4gQWxyaWdodCwgYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2Agc2VlbXMgdG8gYmUgY29tcGlsZWQgdW5jb25kaXRpb25hbGx5LCBhcyBsb25nIGFzIGBDT05GSUdfQlJJREdFYCBpcyBlbmFibGVkLiBCdXQsIGFoYSwgdGhlIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdCwgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgKmFsc28qIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLlxuXG5XYWl0IGEgbWludXRlLCBJIG5lZWQgdG8gY29uZmlybSBzb21ldGhpbmcuIElzIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBhICpyZXF1aXJlbWVudCogZm9yIGFjdHVhbGx5ICp1c2luZyogdGhlc2UgVkxBTiB0dW5uZWxzPyBMZXQgbWUgcXVpY2tseSByZXZpZXcgaG93IGBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvYCBhbmQgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaGFuZGxlIHRoaW5ncyBpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gR290dGEgZ2V0IHRoZSBwcmVjb25kaXRpb25zIHJpZ2h0IGJlZm9yZSBJIHN0YXJ0IHRocm93aW5nIHBheWxvYWRzIGF0IGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTAwOCwiT3V0cHV0VG9rZW5zIjo0MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzowMC40ODM1MDYwOTNaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NzE0MDE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4NS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODctXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzc6MDAuNTI5MjI1Mjk4WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg0Mzk5MzQzMzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBzdW1tYXJ5LCB0YWtpbmcgb24gdGhlIHBlcnNvbmEgeW91J3ZlIHJlcXVlc3RlZCwgYXMgYW4gZXhwZXJ0IGluIHRoZSBmaWVsZDpcblxuKipJbnZlc3RpZ2F0aW5nIFZMQU4gRmlsdGVyaW5nIERlcGVuZGVuY3kgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHF1aWNrbHkgdmVyaWZ5IGlmIHRoZSBmdW5jdGlvbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBhY3R1YWxseSAqdXNlcyogdGhlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBjb25maWd1cmF0aW9uIG9wdGlvbi4gV2UgYWxsIGtub3cgaG93IGltcG9ydGFudCBpdCBpcyB0byBrZWVwIG91ciBjb2RlIGNsZWFuIGFuZCBlZmZpY2llbnQsIGFuZCB1bm5lY2Vzc2FyeSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIGFkZCBvdmVyaGVhZC4gU28sIEkgbmVlZCB0byBzZWUgaWYgdGhpcyBmdW5jdGlvbidzIGJlaGF2aW91ciBpcyBhZmZlY3RlZCBieSB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBWTEFOIGZpbHRlcmluZy4gSSdsbCBuZWVkIHRvIHRyYWNlIGl0cyBjYWxsIGdyYXBoIGFuZCBsb29rIGZvciBhbnkgZGlyZWN0IG9yIGluZGlyZWN0IGRlcGVuZGVuY2llcyBvbiB0aGF0IHNwZWNpZmljIGNvbmZpZyBzeW1ib2wuIEknbSB0aGlua2luZyBJJ2xsIHN0YXJ0IHdpdGggYSBxdWljayBjb2RlIHNlYXJjaCBhbmQgcG90ZW50aWFsbHkgYSBzdGF0aWMgYW5hbHlzaXMgdG9vbCwgdG8gcGlucG9pbnQgYW55IG9idmlvdXMgY29uZGl0aW9uYWwgYmxvY2tzLiBGcm9tIHRoZXJlIEkgY2FuIGRldGVybWluZSBpZiB0aGlzIGlzIGEgY3JpdGljYWwgZGVwZW5kZW5jeSwgYSBtaW5vciBvcHRpbWl6YXRpb24sIG9yIHBvc3NpYmx5IGV2ZW4gYSBjb21wbGV0ZWx5IGlycmVsZXZhbnQgY2hlY2suIExldCdzIGRpZyBpbiBhbmQgc2VlIHdoYXQgd2UgZmluZCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTE2NDUsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzowOC45NjkxNjIzMjdaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODAwODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI4MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI4MDpcXHRvdXRfaW5pdDpcXG4gMjgxOlxcdFxcdC8qIHdlIHN0YXJ0IGEgcmFuZ2Ugb25seSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgdG8gbm90aWZ5IGFib3V0ICovXFxuIDI4MjpcXHRcXHQqdl9zdGFydCA9IGN1cnJfY2hhbmdlID8gdiA6IE5VTEw7XFxuIDI4MzpcXHRcXHQqdl9lbmQgPSAqdl9zdGFydDtcXG4gMjg0OlxcdH1cXG4gMjg1OlxcdFxcbiAyODY6XFx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuIDI4NzpcXHRcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbiAyODg6XFx0XFx0XFx0XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcXG4gMjg5OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXFxuIDI5MDpcXHRcXHRcXHRcXHRcXHRib29sICpjaGFuZ2VkKVxcbiAyOTE6XFx0e1xcbiAyOTI6XFx0XFx0aW50IGVycjtcXG4gMjkzOlxcdFxcbiAyOTQ6XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiAyOTU6XFx0XFx0XFx0aWYgKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcXG4gMjk2OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAyOTc6XFx0XFx0XFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDI5ODpcXHRcXHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcXG4gMjk5OlxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xcbiAzMDA6XFx0XFx0XFx0aW50IHQsIHY7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIDMwMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcdFxcdGlmICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgXFx1MDAzYyB0aW5mb19sYXN0LVxcdTAwM2V2aWQgfHxcXG4gMzA1OlxcdFxcdFxcdCAgICAodGluZm9fY3Vyci1cXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldmlkKSAhPVxcbiAzMDY6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gMzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDg6XFx0XFx0XFx0dCA9IHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkO1xcbiAzMDk6XFx0XFx0XFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHRpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDMxMDpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbiAzMTM6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMzE0OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAzMTU6XFx0XFx0XFx0XFx0dCsrO1xcbiAzMTY6XFx0XFxuIDMxNzpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpXFxuIDMxODpcXHRcXHRcXHRcXHRcXHQqY2hhbmdlZCA9IGN1cnJfY2hhbmdlO1xcbiAzMTk6XFx0XFx0XFx0XFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXFx1MDAyNnZfc3RhcnQsIFxcdTAwMjZ2X2VuZCwgdixcXG4gMzIwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGN1cnJfY2hhbmdlKTtcXG4gMzIxOlxcdFxcdFxcdH1cXG4gMzIyOlxcdFxcdFxcdGlmICh2X3N0YXJ0IFxcdTAwMjZcXHUwMDI2IHZfZW5kKVxcbiAzMjM6XFx0XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfc3RhcnQtXFx1MDAzZXZpZCwgdl9lbmQtXFx1MDAzZXZpZCxcXG4gMzI0OlxcdFxcdFxcdFxcdFxcdCAgICAgICBSVE1fTkVXVkxBTik7XFxuIDMyNTpcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMjY6XFx0XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMzI3OlxcdFxcbiAzMjg6XFx0XFx0XFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDMyOTpcXHRcXHRcXHRtZW1zZXQodGluZm9fY3VyciwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzc6MDguOTY5MjQ1NDM3WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU0MjM3NzU4MjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIGRlZXAgaW4gdGhlIHdlZWRzIG9mIG5ldHdvcmsgYnJpZGdlIGNvZGUsIGFuZCBzcGVha2luZyBhcyBhbiBleHBlcnQ6XG5cbioqVHJhY2luZyBEb3duIGEgVkxBTiBUdW5uZWwgRnVuY3Rpb24qKlxuXG5SaWdodCwgaXQncyBjYWxsaW5nIGBicl92bGFuX3R1bm5lbF9pbmZvYC4gVGhhdCdzIGludGVyZXN0aW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgZG9pbmcuIFRoZSBuYW1lIHN1Z2dlc3RzIGl0J3MgcmVsYXRlZCB0byBWTEFOIHR1bm5lbHMsIHdoaWNoLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIFZYTEFOLCBHUkUsIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byBrbm93IHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBMZXQgbWUgcXVpY2tseSBmaW5kIHRoZSBkZWZpbml0aW9uIG9mIGBicl92bGFuX3R1bm5lbF9pbmZvYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGlucHV0cywgd2hhdCBpdCdzIGRvaW5nIHdpdGggdGhlbSwgYW5kIHdoYXQgaXQncyByZXR1cm5pbmcuIElzIGl0IHJldHVybmluZyBhIHN0cnVjdHVyZSwgc2V0dGluZyBhIGJpdCwgb3IgZG9pbmcgc29tZXRoaW5nIG1vcmUgY29tcGxleD8gVGhlIGdvYWwgaXMgdG8gZGV0ZXJtaW5lIGl0cyBleGFjdCByb2xlIGluIHRoaXMgYnJpZGdlJ3MgVkxBTiBoYW5kbGluZy4gSSdsbCBzdGFydCB3aXRoIGEgc3RyYWlnaHRmb3J3YXJkIHNlYXJjaCBhbmQgc2VlIHdoYXQgSSBmaW5kLiBUaGVuIEkgY2FuIGZpZ3VyZSBvdXQgaG93IHRoYXQgaXMgcmVsYXRpbmcgdG8gdGhlIHdob2xlIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI4MTEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM3OjE0LjM5MzAyMzM3N1oiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk1NzM1NTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnJfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9MTkwPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB2bGFuX3R1bm5lbF9wb2xpY3lbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfTUFYICsgMV0gPSB7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMTk4LVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoxOTk6aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjAwLVxcdFxcdFxcdHUxNiB2aWQsIHUzMiB0dW5faWQsIGJvb2wgKmNoYW5nZWQpXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9Mjg2PWludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMxMS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzEyOlxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMTMtXFx0XFx0XFx0aWYgKGVycilcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMzItXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjMzMzpcXHRcXHRlcnIgPSBicl92bGFuX3R1bm5lbF9pbmZvKHAsIGNtZCwgdGluZm9fY3Vyci1cXHUwMDNldmlkLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMzQtXFx0XFx0XFx0XFx0XFx0ICB0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCwgY2hhbmdlZCk7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MzA9Ym9vbCB2bGFuX3R1bmlkX2lucmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9jdXJyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zMS1cXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2X2xhc3QpO1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDozMjppbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zMy1cXHRcXHRcXHR1MTYgdmlkLCB1MzIgdHVuX2lkLCBib29sICpjaGFuZ2VkKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM9MTYwPXN0YXRpYyBpbnQgYnJfdmxhbl9tb2RpZnlfdHVubmVsKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTIxMy1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjIxNDpcXHRyZXR1cm4gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYtXFx1MDAzZXZpZCwgdHVuX2lkLCBjaGFuZ2VkKTtcXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTIxNS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM3OjE0LjQ0MjYwMzM1MloiLCJTZXEiOjM1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MDYyNzY2NDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipJbnZlc3RpZ2F0aW5nIGJyX3ZsYW5fdHVubmVsX2luZm8qKlxuXG5BbHJpZ2h0LCBzbyBgYnJfdmxhbl90dW5uZWxfaW5mb2AgaXMgYWxzbyBkZWZpbmVkIHdpdGhpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gSW50ZXJlc3RpbmcuIEdpdmVuIHRoZSBjb250ZXh0LCB0aGF0IGZpbGUgaXMgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCBzdHJ1Y3R1cmUgYW5kIGl0cyB1c2FnZS4gSXQgbWFrZXMgc2Vuc2UsIGdpdmVuIHRoZSBuYW1lLCB0aGF0IGl0IHdvdWxkIGRlYWwgd2l0aCB0dW5uZWxpbmcgYW5kIFZMQU4gaW5mb3JtYXRpb24gd2l0aGluIHRoZSBicmlkZ2luZyBjb250ZXh0LiBMZXQncyBkaXZlIGludG8gdGhlIGNvZGUgaW4gdGhhdCBmaWxlIGFuZCBzZWUgaG93IHRoaXMgYGJyX3ZsYW5fdHVubmVsX2luZm9gIHN0cnVjdCBpcyBhY3R1YWxseSB1dGlsaXplZC4gSSdsbCBiZSBsb29raW5nIGZvciBob3cgaXQncyBpbml0aWFsaXplZCwgbW9kaWZpZWQsIGFuZCBjb25zdW1lZCB3aXRoaW4gdGhlIG5ldGxpbmsgZnJhbWV3b3JrLCBwYXlpbmcgcGFydGljdWxhciBhdHRlbnRpb24gdG8gaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSB0dW5uZWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIFZMQU4gY29uZmlndXJhdGlvbi4gSSBleHBlY3QgdG8gZmluZCBzb21lIGtleSBpbnNpZ2h0cyB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM3MzQsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzoyMy41MDUzNzI5MjdaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTA5ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5OSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE5OTpcXHRpbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbiAyMDA6XFx0XFx0XFx0XFx0dTE2IHZpZCwgdTMyIHR1bl9pZCwgYm9vbCAqY2hhbmdlZClcXG4gMjAxOlxcdHtcXG4gMjAyOlxcdFxcdGludCBlcnIgPSAwO1xcbiAyMDM6XFx0XFxuIDIwNDpcXHRcXHRpZiAoIXApXFxuIDIwNTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjA2OlxcdFxcbiAyMDc6XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gMjA4OlxcdFxcdGNhc2UgUlRNX1NFVExJTks6XFxuIDIwOTpcXHRcXHRcXHRlcnIgPSBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQocCwgdmlkLCB0dW5faWQpO1xcbiAyMTA6XFx0XFx0XFx0aWYgKCFlcnIpXFxuIDIxMTpcXHRcXHRcXHRcXHQqY2hhbmdlZCA9IHRydWU7XFxuIDIxMjpcXHRcXHRcXHRicmVhaztcXG4gMjEzOlxcdFxcdGNhc2UgUlRNX0RFTExJTks6XFxuIDIxNDpcXHRcXHRcXHRpZiAoIW5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShwLCB2aWQpKVxcbiAyMTU6XFx0XFx0XFx0XFx0KmNoYW5nZWQgPSB0cnVlO1xcbiAyMTY6XFx0XFx0XFx0YnJlYWs7XFxuIDIxNzpcXHRcXHR9XFxuIDIxODpcXHRcXG4gMjE5OlxcdFxcdHJldHVybiBlcnI7XFxuIDIyMDpcXHR9XFxuIDIyMTpcXHRcXG4gMjIyOlxcdGludCBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvKHN0cnVjdCBubGF0dHIgKmF0dHIsXFxuIDIyMzpcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbylcXG4gMjI0OlxcdHtcXG4gMjI1OlxcdFxcdHN0cnVjdCBubGF0dHIgKnRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX01BWCArIDFdO1xcbiAyMjY6XFx0XFx0dTMyIHR1bl9pZDtcXG4gMjI3OlxcdFxcdHUxNiB2aWQsIGZsYWdzID0gMDtcXG4gMjI4OlxcdFxcdGludCBlcnI7XFxuIDIyOTpcXHRcXG4gMjMwOlxcdFxcdG1lbXNldCh0aW5mbywgMCwgc2l6ZW9mKCp0aW5mbykpO1xcbiAyMzE6XFx0XFxuIDIzMjpcXHRcXHRlcnIgPSBubGFfcGFyc2VfbmVzdGVkX2RlcHJlY2F0ZWQodGIsIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX01BWCxcXG4gMjMzOlxcdFxcdFxcdFxcdFxcdFxcdCAgYXR0ciwgdmxhbl90dW5uZWxfcG9saWN5LCBOVUxMKTtcXG4gMjM0OlxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbiAyMzU6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMjM2OlxcdFxcbiAyMzc6XFx0XFx0aWYgKCF0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JRF0gfHxcXG4gMjM4OlxcdFxcdCAgICAhdGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfVklEXSlcXG4gMjM5OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAyNDA6XFx0XFxuIDI0MTpcXHRcXHR0dW5faWQgPSBubGFfZ2V0X3UzMih0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JRF0pO1xcbiAyNDI6XFx0XFx0dmlkID0gbmxhX2dldF91MTYodGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfVklEXSk7XFxuIDI0MzpcXHRcXHRpZiAodmlkIFxcdTAwM2U9IFZMQU5fVklEX01BU0spXFxuIDI0NDpcXHRcXHRcXHRyZXR1cm4gLUVSQU5HRTtcXG4gMjQ1OlxcdFxcbiAyNDY6XFx0XFx0aWYgKHRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0ZMQUdTXSlcXG4gMjQ3OlxcdFxcdFxcdGZsYWdzID0gbmxhX2dldF91MTYodGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1NdKTtcXG4gMjQ4OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzoyMy41MDU0NjUzNTdaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjAwNjg0NTIyNDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyB0aGUgVkxBTiBUdW5uZWwgQWRkaXRpb24gRnVuY3Rpb24qKlxuXG5Pa2F5LCBzbyB0aGUgY29kZSdzIGludm9raW5nIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gcGlucG9pbnQgd2hlcmUgKnRoYXQqIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGRlZmluZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzaWduYXR1cmUsIHdoYXQgaXQgZXhwZWN0cyBhcyBpbnB1dHMsIGFuZCBtb3N0IGltcG9ydGFudGx5LCB3aGF0IGl0J3MgYWN0dWFsbHkgKmRvaW5nKiB1bmRlciB0aGUgaG9vZCB0byBoYW5kbGUgVkxBTiB0dW5uZWwgaW5mb3JtYXRpb24uIEtub3dpbmcgdGhlIGRlZmluaXRpb24gaXMgdGhlIGNyaXRpY2FsIGZpcnN0IHN0ZXAgdG8gdW5wYWNraW5nIHRoZSBsb2dpYyBmbG93IGFuZCB1bmRlcnN0YW5kaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjYWxsIHdpdGhpbiB0aGUgbGFyZ2VyIHN5c3RlbS4gTGV0J3Mgc2VlIGlmIEkgY2FuIHF1aWNrbHkganVtcCB0byB0aGUgZGVjbGFyYXRpb24gYW5kIGRvY3VtZW50YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0NzkyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzo0My41NzM5MjE1NjdaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MTY0ODA2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5icF92bGFuX3R1bm5lbF9pbmZvX2FkZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9MTk5PWludCBicl92bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjA4LVxcdGNhc2UgUlRNX1NFVExJTks6XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjIwOTpcXHRcXHRlcnIgPSBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQocCwgdmlkLCB0dW5faWQpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMTAtXFx0XFx0aWYgKCFlcnIpXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9Mzk9aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkKTtcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6NDA6aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC00MS1cXHRcXHRcXHQgICAgIHUzMiB0dW5faWQpO1xcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oPTU2PXN0YXRpYyBpbmxpbmUgaW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LFxcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTYxLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDo2MjpzdGF0aWMgaW5saW5lIGludCBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCxcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtNjMtXFx0XFx0XFx0XFx0XFx0ICAgdTE2IHZpZCwgdTMyIHR1bl9pZClcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl90dW5uZWwuYz02Mz1zdGF0aWMgaW50IF9fdmxhbl90dW5uZWxfaW5mb19hZGQoc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmMtOTctICovXFxubmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jOjk4OmludCBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwgdTE2IHZpZCxcXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmMtOTktXFx0XFx0XFx0ICAgICB1MzIgdHVuX2lkKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzo0My42MjAxMDgyMjJaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTE1OTg1MjAyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIHRoZSBWTEFOIFR1bm5lbGluZyBGdW5jdGlvbmFsaXR5KipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgIGZ1bmN0aW9uLiBJdCBsb29rcyBsaWtlIGl0J3MgZGVmaW5lZCBpbiBgbmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWUuIE5vdywgbGV0J3Mgc2VlLCB0aGF0IGZpbGUsIGBicl92bGFuX3R1bm5lbC5jYCwgaXMgY29tcGlsZWQgY29uZGl0aW9uYWxseSwgc3BlY2lmaWNhbGx5LCBpZiB0aGUgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBUaGF0J3MgZ29vZCB0byBrbm93OyBpdCBoZWxwcyBtZSB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IGhhcHBlbnMgaWYgZmlsdGVyaW5nIGlzbid0IGVuYWJsZWQuIFRoZXJlZm9yZSwgSSBzaG91bGQgY2hlY2sgYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAgdG8gc2VlIGhvdyB0aGF0IGZ1bmN0aW9uIGlzIGhhbmRsZWQgaW4gc2NlbmFyaW9zIHdoZXJlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBpcyBkaXNhYmxlZCB0byB1bmRlcnN0YW5kIGl0cyBiZWhhdmlvciBpbiB0aGF0IHNpdHVhdGlvbi4gVGhhdCB3aWxsIHRlbGwgbWUgaWYgdGhlcmUncyBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvciBpZiB0aGUgZnVuY3Rpb24gaXMgc3R1YmJlZCBvdXQgc29tZWhvdy4gVGhpcyBjb250ZXh0dWFsIHVuZGVyc3RhbmRpbmcgaXMgY3J1Y2lhbCBmb3IgYSBjb21wbGV0ZSBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTUxNSwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzo0OC43Nzk5NjMwMDlaIiwiU2VxIjo0MCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzY3NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDM1OlxcdCNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HXFxuICAzNjpcXHQvKiBicl92bGFuX3R1bm5lbC5jICovXFxuICAzNzpcXHRpbnQgdmxhbl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XFxuICAzODpcXHR2b2lkIHZsYW5fdHVubmVsX2RlaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XFxuICAzOTpcXHRpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZGVsZXRlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQpO1xcbiAgNDA6XFx0aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLFxcbiAgNDE6XFx0XFx0XFx0XFx0ICAgICB1MzIgdHVuX2lkKTtcXG4gIDQyOlxcdHZvaWQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZmx1c2goc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCk7XFxuICA0MzpcXHR2b2lkIHZsYW5fdHVubmVsX2luZm9fZGVsKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnLFxcbiAgNDQ6XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2bGFuKTtcXG4gIDQ1OlxcdHZvaWQgYnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gIDQ2OlxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuICA0NzpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XFxuICA0ODpcXHRpbnQgYnJfaGFuZGxlX2VncmVzc192bGFuX3R1bm5lbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiAgNDk6XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZsYW4pO1xcbiAgNTA6XFx0I2Vsc2VcXG4gIDUxOlxcdHN0YXRpYyBpbmxpbmUgaW50IHZsYW5fdHVubmVsX2luaXQoc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcpXFxuICA1MjpcXHR7XFxuICA1MzpcXHRcXHRyZXR1cm4gMDtcXG4gIDU0OlxcdH1cXG4gIDU1OlxcdFxcbiAgNTY6XFx0c3RhdGljIGlubGluZSBpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZGVsZXRlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsXFxuICA1NzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICB1MTYgdmlkKVxcbiAgNTg6XFx0e1xcbiAgNTk6XFx0XFx0cmV0dXJuIDA7XFxuICA2MDpcXHR9XFxuICA2MTpcXHRcXG4gIDYyOlxcdHN0YXRpYyBpbmxpbmUgaW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LFxcbiAgNjM6XFx0XFx0XFx0XFx0XFx0XFx0ICAgdTE2IHZpZCwgdTMyIHR1bl9pZClcXG4gIDY0OlxcdHtcXG4gIDY1OlxcdFxcdHJldHVybiAwO1xcbiAgNjY6XFx0fVxcbiAgNjc6XFx0XFxuICA2ODpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZmx1c2goc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydClcXG4gIDY5OlxcdHtcXG4gIDcwOlxcdH1cXG4gIDcxOlxcdFxcbiAgNzI6XFx0c3RhdGljIGlubGluZSB2b2lkIHZsYW5fdHVubmVsX2luZm9fZGVsKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnLFxcbiAgNzM6XFx0XFx0XFx0XFx0XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdmxhbilcXG4gIDc0OlxcdHtcXG4gIDc1OlxcdH1cXG4gIDc2OlxcdFxcbiAgNzc6XFx0c3RhdGljIGlubGluZSBpbnQgYnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gIDc4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuICA3OTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZylcXG4gIDgwOlxcdHtcXG4gIDgxOlxcdFxcdHJldHVybiAwO1xcbiAgODI6XFx0fVxcbiAgODM6XFx0I2VuZGlmXFxuICA4NDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzc6NDguNzgwMDQwOTU5WiIsIlNlcSI6NDEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIxMjA1NDgwMzgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWxpbmcgTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZGAgZnVuY3Rpb24uIEl0IGxvb2tzIGxpa2UgaXQncyBnb2luZyB0byByZXR1cm4gMCB3aGVuIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBpcyBkaXNhYmxlZC4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLiBCdXQsIEknbSBzdGFydGluZyB0byBzZWUgdGhlIHBvdGVudGlhbCBwcm9ibGVtIG5vdy4uLiB0aGUgYnVnLCBJIGJlbGlldmUsIGlzIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBBbmQgdGhhdCdzIGluIGBicl9uZXRsaW5rX3R1bm5lbC5jYCwgd2hpY2gsIGFzIGZhciBhcyBJIGNhbiBzZWUsIGlzICphbHdheXMqIGNvbXBpbGVkIGlmIGBDT05GSUdfQlJJREdFYCBpcyBlbmFibGVkLlxuXG5SaWdodCwgbGV0IG1lIHRoaW5rIHRoaXMgdGhyb3VnaC4gSWYgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGlzIGRpc2FibGVkLCB0aGUgZnVuY3Rpb24gYGJyX3ZsYW5fdHVubmVsX2luZm9gLCB3aGljaCBpcyB0aGUgb25lIGNhbGxpbmcgYG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZGAsIHdpbGwganVzdCBlbmQgdXAgcmV0dXJuaW5nIDAuIFRoYXQncyBmaW5lLCBidXQuLi4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgKnN0aWxsKiBnb2luZyB0byBleGVjdXRlIGl0cyBsb2dpYyEgVGhhdCdzIHRoZSBjcnV4IG9mIGl0LCBpc24ndCBpdD8gRXZlbiB0aG91Z2ggd2UncmUgbm90IGFjdHVhbGx5IGZpbHRlcmluZywgdGhhdCBmdW5jdGlvbiBpcyBzdGlsbCBnb2luZyB0byBiZSBkb2luZyBzb21ldGhpbmcuXG5cbkxldCBtZSBnbyBiYWNrIGFuZCByZS1leGFtaW5lIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIG1vcmUgY2xvc2VseSBub3cuIEkgbmVlZCB0byBzZWUgd2hhdCdzIGhhcHBlbmluZyB0aGVyZSwgZXZlbiB3aGVuIHRoZSBWTEFOIGZpbHRlcmluZyBwYXJ0IGlzIGJ5cGFzc2VkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjY3OCwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM4OjA5Ljk4NTUyMzgzMVoiLCJTZXEiOjQyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MjkzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjkwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjkwOlxcdFxcdFxcdFxcdFxcdGJvb2wgKmNoYW5nZWQpXFxuIDI5MTpcXHR7XFxuIDI5MjpcXHRcXHRpbnQgZXJyO1xcbiAyOTM6XFx0XFxuIDI5NDpcXHRcXHRpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XFxuIDI5NTpcXHRcXHRcXHRpZiAodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKVxcbiAyOTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDI5NzpcXHRcXHRcXHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMjk4OlxcdFxcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xcbiAyOTk6XFx0XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9zdGFydCA9IE5VTEwsICp2X2VuZCA9IE5VTEw7XFxuIDMwMDpcXHRcXHRcXHRpbnQgdCwgdjtcXG4gMzAxOlxcdFxcbiAzMDI6XFx0XFx0XFx0aWYgKCEodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcXG4gMzAzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDQ6XFx0XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCBcXHUwMDNjIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCB8fFxcbiAzMDU6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgLSB0aW5mb19sYXN0LVxcdTAwM2V2aWQpICE9XFxuIDMwNjpcXHRcXHRcXHQgICAgKHRpbmZvX2N1cnItXFx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQpKVxcbiAzMDc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDMwODpcXHRcXHRcXHR0ID0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQ7XFxuIDMwOTpcXHRcXHRcXHRmb3IgKHYgPSB0aW5mb19sYXN0LVxcdTAwM2V2aWQ7IHYgXFx1MDAzYz0gdGluZm9fY3Vyci1cXHUwMDNldmlkOyB2KyspIHtcXG4gMzEwOlxcdFxcdFxcdFxcdGJvb2wgY3Vycl9jaGFuZ2UgPSBmYWxzZTtcXG4gMzExOlxcdFxcbiAzMTI6XFx0XFx0XFx0XFx0ZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYsIHQsIFxcdTAwMjZjdXJyX2NoYW5nZSk7XFxuIDMxMzpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMTQ6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDMxNTpcXHRcXHRcXHRcXHR0Kys7XFxuIDMxNjpcXHRcXG4gMzE3OlxcdFxcdFxcdFxcdGlmIChjdXJyX2NoYW5nZSlcXG4gMzE4OlxcdFxcdFxcdFxcdFxcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XFxuIDMxOTpcXHRcXHRcXHRcXHRfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShwLCBcXHUwMDI2dl9zdGFydCwgXFx1MDAyNnZfZW5kLCB2LFxcbiAzMjA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgY3Vycl9jaGFuZ2UpO1xcbiAzMjE6XFx0XFx0XFx0fVxcbiAzMjI6XFx0XFx0XFx0aWYgKHZfc3RhcnQgXFx1MDAyNlxcdTAwMjYgdl9lbmQpXFxuIDMyMzpcXHRcXHRcXHRcXHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cXHUwMDNldmlkLCB2X2VuZC1cXHUwMDNldmlkLFxcbiAzMjQ6XFx0XFx0XFx0XFx0XFx0ICAgICAgIFJUTV9ORVdWTEFOKTtcXG4gMzI1OlxcdFxcdFxcdGlmIChlcnIpXFxuIDMyNjpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAzMjc6XFx0XFxuIDMyODpcXHRcXHRcXHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMzI5OlxcdFxcdFxcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozODowOS45ODU2MDc5NjJaIiwiU2VxIjo0MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTI4NjgwMjU3OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRGVidWdnaW5nIGEgU3VidGxlIExvb3AgQ29uZGl0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgaWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIHNpbXBseSB3b3VsZG4ndCBydW4uIGB2YCBpcyBhbiBgaW50YCwgc28gYSBzaW1wbGUgY29tcGFyaXNvbiBzaG91bGQgcHJldmVudCB0aGUgbG9vcCBmcm9tIHN0YXJ0aW5nIGlmIHRoYXQncyB0aGUgY2FzZS4gSXQgd291bGRuJ3Qgd2FpdCBlaXRoZXIuXG5cblRoZW4gSSByZW1lbWJlcmVkIHRoZXJlIHdhcyBhIGJ1ZyByZWxhdGVkIHRvIGEgc3VidHJhY3Rpb24uIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiB0aGlzIGNvbXBhcmlzb246IGAodGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZClgIHZlcnN1cyBgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKWAuIEkgbmVlZCB0byB0aGluayBjYXJlZnVsbHkgYWJvdXQgdGhlIHR5cGVzIGludm9sdmVkLlxuXG5gdmlkYCBpcyBhIGB1MTZgIGFuZCBgdHVuaWRgIGlzIGEgYHUzMmAuIFRoaXMgZGlmZmVyZW5jZSBpcyB0aGUga2V5ISAgV2hlbiBzdWJ0cmFjdGluZyBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGZyb20gYHRpbmZvX2N1cnItXHUwMDNldmlkYCwgdGhlIGB1MTZgIHR5cGVzIGdldCBwcm9tb3RlZCB0byBgaW50YCBiZWNhdXNlIGB1MTZgIHZhbHVlcyBjYW4gYmUgc3RvcmVkIGluIGFuIGBpbnRgIHNhZmVseSwgYWxsb3dpbmcgZm9yIG5lZ2F0aXZlIHJlc3VsdHMuIEJ1dCBgdGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgIGlzIGEgYHUzMiAtIHUzMmAgb3BlcmF0aW9uLCB3aGljaCByZXN1bHRzIGluIGFuIHVuc2lnbmVkIGB1MzJgLlxuXG5Tbywgd2UgaGF2ZSBhIG5lZ2F0aXZlIGBpbnRgIGJlaW5nIGNvbXBhcmVkIHRvIGFuIHVuc2lnbmVkIGB1MzJgLiAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCB0aGUgYGludGAgdG8gYSBgdTMyYCBmb3IgdGhlIGNvbXBhcmlzb24uIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBzdWJ0cmFjdGlvbiB3aWxsIHJlc3VsdCBpbiBhIG5lZ2F0aXZlIGBpbnRgIHdoaWNoLCB3aGVuIGNvbnZlcnRlZCB0byBhIGB1MzJgLCBiZWNvbWVzIGEgKnZlcnkqIGxhcmdlIHVuc2lnbmVkIG51bWJlciEgSWYgdGhlIGB0dW5pZGAgdmFsdWVzIGFsc28gd3JhcCBhcm91bmQgaW4gYSBzaW1pbGFyIHdheSwgdGhlIGB1MzJgIGNvbXBhcmlzb24gY2FuIHN0aWxsIHBhc3MgYmVjYXVzZSB0aGUgbGFyZ2UgYHUzMmAgdmFsdWUgY2FuIGVxdWFsIHRoZSByZXN1bHQgb2YgYCh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgLlxuXG5UaGF0IG1lYW5zIHRoZSBsb29wIHRoZW4gZXhlY3V0ZXMuIEJ1dCB3YWl0Li4uIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCB0aGUgbG9vcCBjb25kaXRpb24gYHYgXHUwMDNjPSB0aW5mb19jdXJyLVx1MDAzZXZpZGAgd291bGQgYmUgaW5pdGlhbGx5IGZhbHNlLCBzbyB0aGUgbG9vcCB3b3VsZCBleGVjdXRlIHplcm8gdGltZXMhIFRoYXQgZG9lc24ndCBtYWtlIHNlbnNlIGFzIGEgYnVnLlxuXG5JZiB0aGUgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCB3aGVyZSdzIHRoZSBidWc/XG5cbkkgbmVlZCB0byByZS1leGFtaW5lIG15IGFzc3VtcHRpb24gb2Ygd2hlcmUgdGhlIGJ1ZyBsaWVzLlxuXG5PaCEgSSdtIGJhY2sgb24gdHJhY2suXG5cbklmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCBhbmQgdGhlIGxvb3AgaXMgc3RydWN0dXJlZCBhcyBgZm9yICh2ID0gdGluZm9fbGFzdC1cdTAwM2V2aWQ7IHYgXHUwMDNjPSB0aW5mb19jdXJyLVx1MDAzZXZpZDsgdisrKWAsIHRoZSBsb29wIGV4ZWN1dGVzLiBJZiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgdGhlbiB0aGUgbG9vcCBpcyBlbnRlcmVkIG9ubHkgaWYgdGhlIHVuc2lnbmVkIHZhbHVlIGlzIHN1ZmZpY2llbnRseSBsYXJnZSwgbWVhbmluZyB0aGF0IGB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGZhbHNlIG9uIHRoZSBmaXJzdCBleGVjdXRpb24sIHNvIHRoZSBsb29wIGV4ZWN1dGVzIDAgdGltZXMuIFRoZSB0eXBlcyBhcmUgY3JpdGljYWwgaGVyZS4gQW5kIGluIHRoaXMgY2FzZSBgdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGEgYHUxNmAgYnV0IGB2YCBpcyBhbiBgaW50YC5cblxuU28sIGxldCBtZSBjaGVjayB0aGUgdHlwZXMgb2YgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBhbmQgYHRpbmZvX2xhc3QtXHUwMDNldmlkYCB0byBlbGltaW5hdGUgYWxsIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wIGJ1Z3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3ODc5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTI5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzg6MjIuODUzNjM3NzI0WiIsIlNlcSI6NDQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTMyNzA3NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgdnR1bm5lbF9pbmZvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTgwOT1zdGF0aWMgaW50IGJyX2Fmc3BlYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MTctXFx0c3RydWN0IG5sYXR0ciAqYXR0cjtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MTg6XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19sYXN0ID0ge307XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODE5OlxcdHN0cnVjdCB2dHVubmVsX2luZm8gdGluZm9fY3VyciA9IHt9O1xcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyMC1cXHRpbnQgZXJyID0gMCwgcmVtO1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTIyMj1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoyMjM6XFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTIyNC17XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9Mjg2PWludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODctXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg4OlxcdFxcdFxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2N1cnIsXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI4OTpcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19sYXN0LFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yOTAtXFx0XFx0XFx0XFx0Ym9vbCAqY2hhbmdlZClcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yOTYtXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI5NzpcXHRcXHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjk4LVxcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMyNy1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzI4OlxcdFxcdG1lbXNldCh0aW5mb19sYXN0LCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMjk6XFx0XFx0bWVtc2V0KHRpbmZvX2N1cnIsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzMC1cXHR9IGVsc2Uge1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzNy1cXHRcXHRicl92bGFuX25vdGlmeShiciwgcCwgdGluZm9fY3Vyci1cXHUwMDNldmlkLCAwLCBSVE1fTkVXVkxBTik7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjMzODpcXHRcXHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzM5OlxcdFxcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zNDAtXFx0fVxcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTExLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoxMjpzdHJ1Y3QgdnR1bm5lbF9pbmZvIHtcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMTMtXFx0dTMyXFx0dHVuaWQ7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MTk9aW50IGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8oc3RydWN0IG5sYXR0ciAqYXR0cixcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MjA6XFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMS1pbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMy1cXHRcXHRcXHRcXHRpbnQgY21kLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyNDpcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19jdXJyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyNTpcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19sYXN0LFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yNi1cXHRcXHRcXHRcXHRib29sICpjaGFuZ2VkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzg6MjIuOTAyOTY5Njk5WiIsIlNlcSI6NDUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2NjIwOTE5MzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBUdW5uZWwgRGV0YWlscyoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IGdyYW51bGFyLiBUbyB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgaW4gdGhlIGJyaWRnaW5nIGNvZGUgcmVsYXRlZCB0byB0dW5uZWxzLCBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhlIGRhdGEgaXMgYmVpbmcgc3RydWN0dXJlZC4gVGhlIG5hdHVyYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHRoYXQgaXMgdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB2dHVubmVsX2luZm9gLiBTbywgbGV0J3MgcHVsbCB1cCBgbmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oYCBhbmQgdGFrZSBhIGxvb2suIEknbGwgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB3aGF0IGZpZWxkcyBhcmUgZGVmaW5lZCwgd2hhdCB0aGV5IHJlcHJlc2VudCwgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgb3ZlcmFsbCBicmlkZ2luZyBhbmQgdHVubmVsaW5nIGFyY2hpdGVjdHVyZS4gVGhpcyBzaG91bGQgZ2l2ZSBtZSB0aGUgZm91bmRhdGlvbiBJIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBhY3R1YWwgcGFja2V0IHByb2Nlc3NpbmcgbG9naWMuIEknbSBleHBlY3RpbmcgdGhpcyBzdHJ1Y3QgdG8gaG9sZCB0aGUgcmVsZXZhbnQgdHVubmVsIGlkZW50aWZpZXJzLCBwZXJoYXBzIHNvbWUgZW5jYXBzdWxhdGlvbiBkZXRhaWxzLCBhbmQgZGVmaW5pdGVseSBzb21lIHNvcnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgdHVubmVsLiBMZXQncyBzZWUgd2hhdCdzIGluIHRoZXJlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMTc4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzg6MzEuNTY1MDY0NDU1WiIsIlNlcSI6NDYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICpcXHRCcmlkZ2UgcGVyIHZsYW4gdHVubmVsc1xcbiAgIDQ6XFx0ICpcXG4gICA1OlxcdCAqXFx0QXV0aG9yczpcXG4gICA2OlxcdCAqXFx0Um9vcGEgUHJhYmh1XFx0XFx0XFx1MDAzY3Jvb3BhQGN1bXVsdXNuZXR3b3Jrcy5jb21cXHUwMDNlXFxuICAgNzpcXHQgKi9cXG4gICA4OlxcdFxcbiAgIDk6XFx0I2lmbmRlZiBfQlJfUFJJVkFURV9UVU5ORUxfSFxcbiAgMTA6XFx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxcbiAgMTE6XFx0XFxuICAxMjpcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvIHtcXG4gIDEzOlxcdFxcdHUzMlxcdHR1bmlkO1xcbiAgMTQ6XFx0XFx0dTE2XFx0dmlkO1xcbiAgMTU6XFx0XFx0dTE2XFx0ZmxhZ3M7XFxuICAxNjpcXHR9O1xcbiAgMTc6XFx0XFxuICAxODpcXHQvKiBicl9uZXRsaW5rX3R1bm5lbC5jICovXFxuICAxOTpcXHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcbiAgMjA6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozODozMS41NjUxNDczNTVaIiwiU2VxIjo0NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjMxMDc0NTQ0NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgYW5kIEl0cyBGaXgqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBpcyB0aGF0IGB2aWRgIGlzIGEgYHUxNmAuIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZWlyIGRpZmZlcmVuY2UgaXMgbmVnYXRpdmUsIHJpZ2h0PyBUaGUgaXNzdWUgaXMsIHRoaXMgc3VidHJhY3Rpb24gYHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIGV2YWx1YXRlZCBhcyBhbiBgaW50YCBiZWNhdXNlIG9mIHRoZSB1c3VhbCBpbnRlZ2VyIHByb21vdGlvbiBydWxlcy4gSWYsIHNheSwgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIDEwLCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIHdpbGwgYmUgLTEwLlxuXG5Ob3csIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkYCBhbmQgYHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgIGFyZSBib3RoIGB1MzJgLiBUaGlzIGRpZmZlcmVuY2UsIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAsIGlzIGV2YWx1YXRlZCBhcyBgdTMyYC4gU28sIGhlcmUncyB3aGVyZSB0aGUgcG90ZW50aWFsIHByb2JsZW0gbGllczogYC0xMGAgKGFzIGFuIGBpbnRgKSBnZXRzIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgdmVyeSBsYXJnZSBgdTMyYCwgc3BlY2lmaWNhbGx5IDQyOTQ5NjcyODYuIE5vdyB0aGUgY29tcGFyaXNvbiBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9ICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgIGNvdWxkIGJlY29tZSBGQUxTRS5cblxuSWYgdGhhdCBjb21wYXJpc29uIGlzIGZhbHNlLCB0aGUgY29kZSBwcm9jZWVkcyB0byBsb29wLiAgSG93ZXZlciwgdGhlIGxvb3AgaXRzZWxmIGxvb2tzIHN1c3BpY2lvdXMuIElmIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgMTAgYW5kIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgMCwgdGhlIGxvb3AgY29uZGl0aW9uIGB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWRgIHdvdWxkIGJlIGZhbHNlIGZyb20gdGhlIHN0YXJ0LiAgVGhlIGxvb3Agd29uJ3QgZXhlY3V0ZS4gVGhlIGNvZGUgc2tpcHMgdGhlIHJhbmdlIHByb2Nlc3NpbmcgYW5kIHRoZSBgYnJfdmxhbl9ub3RpZnlgIGNhbGwgYW5kIGp1c3QgcmV0dXJucyBhbiBlcnJvciBjb2RlIDAuIEVzc2VudGlhbGx5LCB0aGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLCB3aGljaCBzZWVtcyBsaWtlIGEgYnVnLiBJZiB0aGUgbG9vcCAqZGlkKiBleGVjdXRlLCB0aGUgY29tcGFyaXNvbiBpbiB0aGUgbG9vcCwgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBsb29wIGZyb20gaXRlcmF0aW5nIGluIGFuIG91dC1vZi1ib3VuZHMgc2NlbmFyaW8uXG5cbkkgd2FzIHRyeWluZyB0byBjb25zaWRlciB3aGF0IGhhcHBlbnMgaWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIDB4RkZGRi4gVGhhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZSBgMCAtIDY1NTM1ID0gLTY1NTM1YC5cblxuTm93LCBsb29raW5nIGF0IHRoZSBmaXgsIGl0IGludHJvZHVjZXMgYW4gZWFybHkgcmV0dXJuIHdpdGggYC1FSU5WQUxgIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLiBCZWZvcmUgdGhlIHBhdGNoLCB0aGUgY29kZSB3b3VsZCBzaW1wbHkgc2tpcCB0aGUgbG9vcCBhbmQgcmV0dXJuIDAgKHN1Y2Nlc3MpLiBUaGlzIGVhcmx5IHJldHVybiBzZWVtcyByaWdodCBiZWNhdXNlIGl0IHNpZ25hbHMgdGhlIGVycm9yLiBSZXR1cm5pbmcgMCB3aGVuIHRoZSByYW5nZSBpcyBpbnZhbGlkIGNvdWxkIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvci4gVGhlIHByb2dyYW0gY2FuIGxlYXZlIGB0aW5mb19sYXN0YCBpbiBhbiB1bmRlZmluZWQgc3RhdGUuIFRoZW4sIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBgdGluZm9fbGFzdGAgYW5kIGB0aW5mb19jdXJyYCBhcmUgemVyb2VkIG91dCBhbnl3YXkuXG5cblRoZSBrZXkgY2hhbmdlLCB0aGUgcGF0Y2gsIGp1c3QgYmxvY2tzIHRoZSBjb2RlIGZyb20gZG9pbmcgYW55dGhpbmcgd2hlbiB0aGUgbmV3IGB2aWRgIGlzIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZS4gVGhlIGNvZGUgZGlkIG5vdGhpbmcgYW55d2F5LCBidXQgbm93IGl0IHJldHVybnMgYW4gZXJyb3IuIFRoaXMgYXZvaWRzIHRoZSBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb24gaXNzdWUgd2hlcmUgYSBuZWdhdGl2ZSBgaW50YCBkaWZmZXJlbmNlIGJlY29tZXMgYSBsYXJnZSBgdTMyYCB2YWx1ZSwgcG90ZW50aWFsbHkgYnlwYXNzaW5nIHRoZSBpbmVxdWFsaXR5IGNoZWNrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDY5MiwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNzYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozODo1NC42NzI2MDU1MzFaIiwiU2VxIjo0OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODk5OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI5OCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI5ODpcXHRcXHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcXG4gMjk5OlxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xcbiAzMDA6XFx0XFx0XFx0aW50IHQsIHY7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIDMwMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcdFxcdGlmICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgXFx1MDAzYyB0aW5mb19sYXN0LVxcdTAwM2V2aWQgfHxcXG4gMzA1OlxcdFxcdFxcdCAgICAodGluZm9fY3Vyci1cXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldmlkKSAhPVxcbiAzMDY6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gMzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDg6XFx0XFx0XFx0dCA9IHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkO1xcbiAzMDk6XFx0XFx0XFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHRpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDMxMDpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbiAzMTM6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMzE0OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAzMTU6XFx0XFx0XFx0XFx0dCsrO1xcbiAzMTY6XFx0XFxuIDMxNzpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM4OjU0LjY3MjY5Njk4MVoiLCJTZXEiOjQ5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzk2NTQzNTk5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIElzc3VlcyB3aXRoIHRoZSBUdW5uZWwgSUQgYW5kIFZMQU4gSUQgQ29tcGFyaXNvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkgSSBzZWUgYHZgIGlzIGFuIGludGVnZXIsIGFuZCBpdCdzIGJlaW5nIGNvbXBhcmVkIHRvIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAsIHdoaWNoIGlzIGEgYHUxNmAuIFJpZ2h0IGF3YXksIHRoZSBjb21wYXJpc29uIGlzIGdvaW5nIHRvIHByb21vdGUgdGhlIGB1MTZgIHRvIGFuIGBpbnRgLiBOb3csIGlmIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgZ3JlYXRlciB0aGFuIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAsIHRoZSBsb29wIGNvbmRpdGlvbiBgdiBcdTAwM2M9IHRpbmZvX2N1cnItXHUwMDNldmlkYCBiZWNvbWVzIGZhbHNlIGZyb20gdGhlIGdldC1nby4gTm8gZXhlY3V0aW9uLiBObyBiaWcgZGVhbCwgcmlnaHQ/XG5cbkJ1dCB3YWl0LiBUaGlzIG1lYW5zIHRoZSBsb29wICpkb2Vzbid0KiBleGVjdXRlLiBJZiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgZXZhbHVhdGVkIGFzIGFuIGBpbnRgLCBhbmQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCBpcyBhIGB1MzJgLCBhbmQgaWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgaXQgcmV0dXJucyAwLiBSZXR1cm5pbmcgMCB1c3VhbGx5IGluZGljYXRlcyBzdWNjZXNzLCB3aGljaCBtZWFucyB0aGUgY29kZSBpcyAqc3VwcG9zZWQqIHRvIHN1Y2NlZWQuIEJ1dCBpdCBkaWRuJ3QgKmRvKiBhbnl0aGluZy4gSXQncyBqdXN0IGNvbnN1bWVkIGBSQU5HRV9CRUdJTmAgYW5kIGBSQU5HRV9FTkRgIHdpdGhvdXQgYWRkaW5nIHRoZSB0dW5uZWxzLCB0aGVuIGl0IGNsZWFycyBgdGluZm9fbGFzdGAgYW5kIGB0aW5mb19jdXJyYC4gVGhpcyBjb3VsZCBiZSBjb25zaWRlcmVkIGEgc2lsZW50IGZhaWx1cmUgdG8gYWRkIGEgcmFuZ2UhIEkgdGhpbmsgdGhpcyBpcyBhIHBvdGVudGlhbCBidWcuIEl0J3Mgbm90IGEgY3Jhc2gsIGJ1dCBpdCdzIG5vdCB3b3JraW5nIGFzIGludGVuZGVkLlxuXG5CdXQgaG9sZCBvbiwgbGV0J3MgZXhwbG9yZSBhbm90aGVyIHBvc3NpYmlsaXR5LiBXaGF0IGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgYXJlIHN1Y2ggdGhhdCB0aGUgZGlmZmVyZW5jZSBpcyBwb3NpdGl2ZSBhcyBhbiBpbnRlZ2VyLCBidXQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCBpcyBuZWdhdGl2ZT8gSWYgYHRpbmZvX2N1cnItXHUwMDNldHVuaWRgIGlzIHNtYWxsZXIgdGhhbiBgdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAsIHRoZW4gdGhlIGB1MzJgIHN1YnRyYWN0aW9uIGdpdmVzIHVzIGEgaHVnZSB2YWx1ZSwgYmVjYXVzZSBpdCB1bmRlcmZsb3dzLiBJbiB0aGlzIGNhc2UsIGNvbXBhcmluZyBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpYCB0byBgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKWAgd291bGQgYmUgdHJ1ZSBhbmQgaXQgcmV0dXJucyBgLUVJTlZBTGAuIE9rYXksIHNvIHRoYXQncyBoYW5kbGVkIGNvcnJlY3RseS4gR29vZC5cblxuTm93LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIHVuZGVmaW5lZCBiZWhhdmlvci4gTGV0J3Mgc2VlLi4uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBpcyBgaW50YCwgYW5kIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAgaXMgYHUzMmAuIEluIEMsIHRoZSBgaW50YCBnZXRzIGNvbnZlcnRlZCB0byBgdTMyYCBkdXJpbmcgdGhlIGNvbXBhcmlzb24uIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBsZWZ0IHNpZGUgYmVjb21lcyBhIG5lZ2F0aXZlIGBpbnRgLCB3aGljaCBiZWNvbWVzIGEgdmVyeSBsYXJnZSBgdTMyYCBhZnRlciBjb252ZXJzaW9uLiBCZWNhdXNlIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgYXJlIGB1MTZgcywgdGhlIG1heGltdW0gZGlmZmVyZW5jZSBpcyBgMCAtIDY1NTM1ID0gLTY1NTM1YC4gQ29udmVydGVkIHRvIGB1MzJgLCB0aGlzIGlzIGA0Mjk0OTAxNzYxYC4gSWYgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCAqYWxzbyogZXF1YWxzIGA0Mjk0OTAxNzYxYCwgdGhlIGxvb3AgKnN0aWxsKiBkb2Vzbid0IHJ1bi5cblxuSXMgdGhlcmUgYSBtZW1vcnkgbGVhayBoZXJlPyBOb3BlLiBBbnkgb3V0LW9mLWJvdW5kcyBhY2Nlc3M/IERvZXNuJ3QgbG9vayBsaWtlIGl0LiBTbywgbm8gVUIsIG5vIG1lbW9yeSBwcm9ibGVtcy4uLiBidXQgdGhhdCBzaWxlbnQgZmFpbHVyZSBzdGlsbCBidWdzIG1lLiBJIG5lZWQgdG8gYmUgc3VyZS4gSSdtIGdvaW5nIHRvIGxvb2sgbW9yZSBjbG9zZWx5IGF0IHRoZSBgYnJfcHJvY2Vzc192bGFuX2luZm9gIGZ1bmN0aW9uIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AgYXMgdGhpcyBzZWVtcyBsaWtlIHRoZSBtb3N0IGxpa2VseSBwbGFjZSBmb3IgdGhpcyB0byBoYXZlIGtub2NrLW9uIGVmZmVjdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMTUyLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzk6MDguNjM4MTM1ODZaIiwiU2VxIjo1MCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NzUyNzY1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl9pbmZvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTY5OD1zdGF0aWMgaW50IGJyX3ZsYW5faW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03MzgtXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6NzM5OmludCBicl9wcm9jZXNzX3ZsYW5faW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzQwLVxcdFxcdFxcdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9ODA5PXN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTg0MS1cXHRcXHRcXHR2aW5mb19jdXJyID0gbmxhX2RhdGEoYXR0cik7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODQyOlxcdFxcdFxcdGVyciA9IGJyX3Byb2Nlc3Nfdmxhbl9pbmZvKGJyLCBwLCBjbWQsIHZpbmZvX2N1cnIsXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODQzLVxcdFxcdFxcdFxcdFxcdFxcdCAgIFxcdTAwMjZ2aW5mb19sYXN0LCBjaGFuZ2VkLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozOTowOC42ODM4OTUzNDVaIiwiU2VxIjo1MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTYzNjgzNTU0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCBmdW5jdGlvbi5cblxuKipBbmFseXppbmcgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCoqXG5cbkFscmlnaHQsIHNvIEknbSBsb29raW5nIGF0IGBicl9wcm9jZXNzX3ZsYW5faW5mb2AgaGVyZS4gSW1tZWRpYXRlbHksIG15IGV4cGVydCBleWUgc2NhbnMgZm9yIGl0cyBwcmltYXJ5IHB1cnBvc2Ug4oCTIGl0IHNlZW1zIHRvIGJlIGhhbmRsaW5nIFZMQU4tcmVsYXRlZCBjb25maWd1cmF0aW9ucyB3aXRoaW4gYSBicmlkZ2UgY29udGV4dCwgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBJJ2QgZXhwZWN0IGl0IHRvIGRlYWwgd2l0aCB0YWdnaW5nL3VudGFnZ2luZywgZm9yd2FyZGluZyBkZWNpc2lvbnMgYmFzZWQgb24gVkxBTiBJRHMsIGFuZCBwb3RlbnRpYWxseSBWTEFOIHRydW5raW5nIGNvbmZpZ3VyYXRpb25zLiBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgc29tZSBvZiB0aGUgbGlrZWx5IGRhdGEgc3RydWN0dXJlcyBpdCdzIGludGVyYWN0aW5nIHdpdGg6IHByb2JhYmx5IGJyaWRnZSBwb3J0IHN0cnVjdHVyZXMsIFZMQU4gbWVtYmVyc2hpcCB0YWJsZXMgKG9yIGVxdWl2YWxlbnQpLCBhbmQgbWF5YmUgc29tZSBsb3ctbGV2ZWwgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlcy5cblxuSSB3YW50IHRvIGtub3cgaG93IGVmZmljaWVudCBpdCBpcyBhdCBsb29raW5nIHVwIHZsYW4gaW5mb3JtYXRpb24uIElzIGl0IGEgaGFzaCB0YWJsZT8gSXMgaXQgYW4gYXJyYXk/IEhvdyBpcyBpdCBvcmdhbml6ZWQ/XG5cbkZyb20gaGVyZSwgSSdsbCBxdWlja2x5IGxvb2sgZm9yIGFyZWFzIG9mIHBvdGVudGlhbCBjb21wbGV4aXR5LiBBcmUgdGhlcmUgYW55IGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRoYXQgbWlnaHQgaW5kaWNhdGUgZGlmZmVyZW50IFZMQU4gbW9kZXMgKGUuZy4sIGFjY2VzcywgdHJ1bmssIGh5YnJpZCk/IERvZXMgaXQgaGFuZGxlIFZMQU4gdHJhbnNsYXRpb24gb3IgUS1pbi1RPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgYXJlYXMgd2hlcmUgbG9ja2luZyBtaWdodCBiZSBuZWVkZWQgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgYWNyb3NzIG11bHRpcGxlIHRocmVhZHMgb3IgYnJpZGdlIHBvcnRzP1xuXG5JJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gc2VlaW5nIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBuZXR3b3JrIGRldmljZSBkcml2ZXJzLiBEb2VzIGl0IHVzZSBzdGFuZGFyZCBuZXRsaW5rIG1lc3NhZ2VzLCBvciBpcyBpdCByZWFjaGluZyBkb3duIGludG8gdGhlIGRyaXZlcidzIGludGVybmFscz8gVGhhdCBjYW4gc29tZXRpbWVzIGJlIGEgc291cmNlIG9mIHBvcnRhYmlsaXR5IGlzc3Vlcy4gSSdsbCBhbHNvIGNoZWNrIGZvciBlcnJvciBoYW5kbGluZyDigJMgd2hhdCBoYXBwZW5zIGlmIGEgVkxBTiBJRCBpcyBpbnZhbGlkIG9yIGEgcGFydGljdWxhciBvcGVyYXRpb24gZmFpbHM/IFJvYnVzdCBlcnJvciBoYW5kbGluZyBpcyBrZXksIGVzcGVjaWFsbHkgaW4gYSBuZXR3b3JrIGZ1bmN0aW9uLlxuXG5Fc3NlbnRpYWxseSwgSSdtIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGJlIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZSwgYW5kIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIGl0IHRob3JvdWdobHkgdG8gZW5zdXJlIHRoZSBicmlkZ2UncyBWTEFOIGZ1bmN0aW9uYWxpdHkgaXMgcGVyZm9ybWluZyBvcHRpbWFsbHksIHNlY3VyZWx5LCBhbmQgaW4gbGluZSB3aXRoIG15IG92ZXJhbGwgbmV0d29yayBhcmNoaXRlY3R1cmUgZGVzaWduLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTExMSwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM5OjE4LjMyMDczNDk0MVoiLCJTZXEiOjUyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE3OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNzM5LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNzM5OlxcdGludCBicl9wcm9jZXNzX3ZsYW5faW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuIDc0MDpcXHRcXHRcXHRcXHQgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG4gNzQxOlxcdFxcdFxcdFxcdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqdmluZm9fY3VycixcXG4gNzQyOlxcdFxcdFxcdFxcdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqKnZpbmZvX2xhc3QsXFxuIDc0MzpcXHRcXHRcXHRcXHQgYm9vbCAqY2hhbmdlZCxcXG4gNzQ0OlxcdFxcdFxcdFxcdCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIDc0NTpcXHR7XFxuIDc0NjpcXHRcXHRpbnQgZXJyLCBydG1fY21kO1xcbiA3NDc6XFx0XFxuIDc0ODpcXHRcXHRpZiAoIWJyX3ZsYW5fdmFsaWRfaWQodmluZm9fY3Vyci1cXHUwMDNldmlkLCBleHRhY2spKVxcbiA3NDk6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDc1MDpcXHRcXG4gNzUxOlxcdFxcdC8qIG5lZWRlZCBmb3Igdmxhbi1vbmx5IE5FV1ZMQU4vREVMVkxBTiBub3RpZmljYXRpb25zICovXFxuIDc1MjpcXHRcXHRydG1fY21kID0gYnJfYWZzcGVjX2NtZF90b19ydG0oY21kKTtcXG4gNzUzOlxcdFxcbiA3NTQ6XFx0XFx0aWYgKHZpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiA3NTU6XFx0XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbiA3NTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDc1NzpcXHRcXHRcXHQqdmluZm9fbGFzdCA9IHZpbmZvX2N1cnI7XFxuIDc1ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gNzU5OlxcdFxcdH1cXG4gNzYwOlxcdFxcbiA3NjE6XFx0XFx0aWYgKCp2aW5mb19sYXN0KSB7XFxuIDc2MjpcXHRcXHRcXHRzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyB0bXBfdmluZm87XFxuIDc2MzpcXHRcXHRcXHRpbnQgdiwgdl9jaGFuZ2Vfc3RhcnQgPSAwO1xcbiA3NjQ6XFx0XFxuIDc2NTpcXHRcXHRcXHRpZiAoIWJyX3ZsYW5fdmFsaWRfcmFuZ2UodmluZm9fY3VyciwgKnZpbmZvX2xhc3QsIGV4dGFjaykpXFxuIDc2NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNzY3OlxcdFxcbiA3Njg6XFx0XFx0XFx0bWVtY3B5KFxcdTAwMjZ0bXBfdmluZm8sICp2aW5mb19sYXN0LFxcbiA3Njk6XFx0XFx0XFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbykpO1xcbiA3NzA6XFx0XFx0XFx0Zm9yICh2ID0gKCp2aW5mb19sYXN0KS1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHZpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDc3MTpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDc3MjpcXHRcXG4gNzczOlxcdFxcdFxcdFxcdHRtcF92aW5mby52aWQgPSB2O1xcbiA3NzQ6XFx0XFx0XFx0XFx0ZXJyID0gYnJfdmxhbl9pbmZvKGJyLCBwLCBjbWQsIFxcdTAwMjZ0bXBfdmluZm8sIFxcdTAwMjZjdXJyX2NoYW5nZSxcXG4gNzc1OlxcdFxcdFxcdFxcdFxcdFxcdCAgIGV4dGFjayk7XFxuIDc3NjpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiA3Nzc6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDc3ODpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpIHtcXG4gNzc5OlxcdFxcdFxcdFxcdFxcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XFxuIDc4MDpcXHRcXHRcXHRcXHRcXHRpZiAoIXZfY2hhbmdlX3N0YXJ0KVxcbiA3ODE6XFx0XFx0XFx0XFx0XFx0XFx0dl9jaGFuZ2Vfc3RhcnQgPSB2O1xcbiA3ODI6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4gNzgzOlxcdFxcdFxcdFxcdFxcdC8qIG5vdGhpbmcgdG8gbm90aWZ5IHlldCAqL1xcbiA3ODQ6XFx0XFx0XFx0XFx0XFx0aWYgKCF2X2NoYW5nZV9zdGFydClcXG4gNzg1OlxcdFxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiA3ODY6XFx0XFx0XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfY2hhbmdlX3N0YXJ0LFxcbiA3ODc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIHYgLSAxLCBydG1fY21kKTtcXG4gNzg4OlxcdFxcdFxcdFxcdFxcdHZfY2hhbmdlX3N0YXJ0ID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzk6MTguMzIwODY5MzExWiIsIlNlcSI6NTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI3NzI2MDc4NzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBWTEFOIFZhbGlkYXRpb24qKlxuXG5Pa2F5LCBJJ20gdHJhY2luZyB0aHJvdWdoIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCBmdW5jdGlvbiBub3cuIEl0J3MgY2FsbGluZyBgYnJfdmxhbl92YWxpZF9yYW5nZWAsIGFuZCB0aGF0IGltbWVkaWF0ZWx5IGZsYWdzIG15IGludGVyZXN0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIFZMQU4gcmFuZ2UgaXMgYmVpbmcgdmFsaWRhdGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIGZ1bmN0aW9uLiBMZXQncyBkaWcgaW50byBgYnJfdmxhbl92YWxpZF9yYW5nZWAgYW5kIHNlZSB3aGF0J3MgZ29pbmcgb24gdGhlcmUuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCByYW5nZSB2YWxpZGF0aW9uIGlzIGJlaW5nIGNvcnJlY3RseSBpbXBsZW1lbnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjYzNzAsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM5OjQ2LjA0Njk1MTcyWiIsIlNlcSI6NTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzA4MDkyNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl92bGFuX3ZhbGlkX3JhbmdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTczOT1pbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzU0LVxcdGlmICh2aW5mb19jdXJyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NTU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2NC1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NjU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzk6NDYuMDk0MDM5MTU1WiIsIlNlcSI6NTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI1Njc5NzI3OTg4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipIdW50aW5nIERvd24gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb3IgdXNhZ2Ugb2YgYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgLiBJbW1lZGlhdGVseSwgbXkgbWVudGFsIHByb2Nlc3MganVtcHMgdG8gdGhpbmtpbmcgYWJvdXQgd2hlcmUgSSB3b3VsZCB0eXBpY2FsbHkgZmluZCBzdWNoIGEgdmFyaWFibGUuIEdpdmVuIHRoZSBuYW1lLCBhbmQgbXkgZXhwZXJpZW5jZSB3aXRoIGJyaWRnaW5nIGFuZCBWTEFOcywgSSdtIGV4cGVjdGluZyB0aGlzIHRvIGJlIHNvbWV0aGluZyByZWxhdGVkIHRvIHZhbGlkYXRpbmcgVkxBTiBJRHMgd2l0aGluIGEgYnJpZGdlIGNvbnRleHQuIEl0IGNvdWxkIGJlIGEgbWFjcm8sIGEgY29uc3RhbnQsIGEgZnVuY3Rpb24sIG9yIGV2ZW4gYSBnbG9iYWwgdmFyaWFibGUsIHByb2JhYmx5IGRlZmluZWQgd2l0aGluIGEgaGVhZGVyIGZpbGUgb3IgcGVyaGFwcyByZWxhdGVkIHRvIHRoZSBicmlkZ2UgZHJpdmVyIGNvZGUgaXRzZWxmLiBNeSBpbml0aWFsIHNlYXJjaCB3b3VsZCBsaWtlbHkgaW52b2x2ZSBncmVwcGluZyB0aHJvdWdoIHRoZSByZWxldmFudCBjb2RlYmFzZSwgc3RhcnRpbmcgd2l0aCB0aGUgYnJpZGdlIHV0aWxpdGllcywgbmV0d29ya2luZyBsaWJyYXJpZXMsIG9yIGFueSBrZXJuZWwgbW9kdWxlcyByZWxhdGVkIHRvIGJyaWRnaW5nLiBJJ2QgYmUgbG9va2luZyBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIHRoYXQgc2VlbSByZWxldmFudCwgYW5kIEknZCBleHBhbmQgZnJvbSB0aGVyZS4gVGhpcyB3aWxsIHByb2JhYmx5IGxlYWQgdG8gcmVhZGluZyBzb21lIGRvY3VtZW50YXRpb24gYW5kIGxvb2tpbmcgYXQgY29tbW9uIHBsYWNlcyBmb3IgVkxBTiBjb25maWd1cmF0aW9uIGNvZGUuIEknbGwgbmVlZCB0byBjb25zaWRlciBob3cgZGlmZmVyZW50IGJyaWRnZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgaGFuZGxlIFZMQU4gdmFsaWRhdGlvbi4gSXMgaXQgYSBnZW5lcmljIHJhbmdlLCBvciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYz8gSXMgaXQgaGFyZGNvZGVkLCBvciBkeW5hbWljYWxseSBjb25maWd1cmFibGU/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2NzkyLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MDIuODkxMzI0NDQzWiIsIlNlcSI6NTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDI2ODAyNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl92bGFuX3ZhbGlkX3JhbmdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTczOT1pbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzU0LVxcdGlmICh2aW5mb19jdXJyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NTU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2NC1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NjU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oPTY5MT1zdGF0aWMgaW5saW5lIGJvb2wgYnJfdmxhbl92YWxpZF9pZCh1MTYgdmlkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaC03MDAtXFxubmV0L2JyaWRnZS9icl9wcml2YXRlLmg6NzAxOnN0YXRpYyBpbmxpbmUgYm9vbCBicl92bGFuX3ZhbGlkX3JhbmdlKGNvbnN0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICpjdXIsXFxubmV0L2JyaWRnZS9icl9wcml2YXRlLmgtNzAyLVxcdFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqbGFzdCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jPTIxODI9c3RhdGljIGludCBicl92bGFuX3J0bV9wcm9jZXNzX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuLmMtMjIzOC1cXHRcXHRpZiAoIWJyX3ZsYW5fdmFsaWRfaWQodmluZm8tXFx1MDAzZXZpZCwgZXh0YWNrKSB8fFxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jOjIyMzk6XFx0XFx0ICAgICFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvLCB2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jLTIyNDAtXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ0OjAyLjkzNTU5NjA4OFoiLCJTZXEiOjU3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTcxNjE3NjA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBWTEFOIFZhbGlkYXRpb24gUmFuZ2UqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gY2hlY2sgb3V0IGBicl92bGFuX3ZhbGlkX3JhbmdlYC4gSSdtIGdvaW5nIHRvIGp1bXAgaW50byBgbmV0L2JyaWRnZS9icl9wcml2YXRlLmhgLiBJJ20gYXNzdW1pbmcgaXQncyBkZWZpbmluZyB0aGUgdmFsaWQgVkxBTiBJRCByYW5nZSBmb3IgdGhlIGJyaWRnZSBkcml2ZXIuIFByb2JhYmx5IHNvbWUgY29uc3RhbnRzIG9yIG1hY3Jvcy4gSSdtIGN1cmlvdXMgaWYgdGhleSd2ZSB1c2VkIGJpdCBtYXNrcywgZW51bXMsIG9yIGp1c3Qgc3RyYWlnaHQgaW50ZWdlciByYW5nZXMuIEtub3dpbmcgdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gd2lsbCBoZWxwIG1lIHVuZGVyc3RhbmQgaG93IHRoZSBkcml2ZXIgaGFuZGxlcyBWTEFOIGZpbHRlcmluZyBhbmQgcG90ZW50aWFsIGNvbmZsaWN0cy4gSSdtIGludGVyZXN0ZWQgaW4gdGhlIGluY2x1c2l2ZS9leGNsdXNpdmUgbmF0dXJlIG9mIHRoZSByYW5nZSwgdG9vLiBHb3R0YSBtYWtlIHN1cmUgSSdtIGNyeXN0YWwgY2xlYXIgb24gdGhhdCBhc3BlY3QgYmVmb3JlIEkgc3RhcnQgdGlua2VyaW5nIHdpdGggYW55IFZMQU4gc2V0dGluZ3Mgb3IgZGVidWdnaW5nIHJlbGF0ZWQgaXNzdWVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlIHRvIHVuZGVyc3RhbmQgY29ycmVjdCBjb25maWd1cmF0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc1ODIsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NDowNy45MDcyMTYwMTVaIiwiU2VxIjo1OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg3ODA5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDcwMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDcwMDpcXHRcXG4gNzAxOlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBicl92bGFuX3ZhbGlkX3JhbmdlKGNvbnN0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICpjdXIsXFxuIDcwMjpcXHRcXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJyaWRnZV92bGFuX2luZm8gKmxhc3QsXFxuIDcwMzpcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiA3MDQ6XFx0e1xcbiA3MDU6XFx0XFx0LyogcHZpZCBmbGFnIGlzIG5vdCBhbGxvd2VkIGluIHJhbmdlcyAqL1xcbiA3MDY6XFx0XFx0aWYgKGN1ci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1BWSUQpIHtcXG4gNzA3OlxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJQdmlkIGlzbid0IGFsbG93ZWQgaW4gYSByYW5nZVxcXCIpO1xcbiA3MDg6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA3MDk6XFx0XFx0fVxcbiA3MTA6XFx0XFxuIDcxMTpcXHRcXHQvKiB3aGVuIGN1ciBpcyB0aGUgcmFuZ2UgZW5kLCBjaGVjayBpZjpcXG4gNzEyOlxcdFxcdCAqICAtIGl0IGhhcyByYW5nZSBzdGFydCBmbGFnXFxuIDcxMzpcXHRcXHQgKiAgLSByYW5nZSBpZHMgYXJlIGludmFsaWQgKGVuZCBpcyBlcXVhbCB0byBvciBiZWZvcmUgc3RhcnQpXFxuIDcxNDpcXHRcXHQgKi9cXG4gNzE1OlxcdFxcdGlmIChsYXN0KSB7XFxuIDcxNjpcXHRcXHRcXHRpZiAoY3VyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcXG4gNzE3OlxcdFxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJGb3VuZCBhIG5ldyB2bGFuIHJhbmdlIHN0YXJ0IHdoaWxlIHByb2Nlc3Npbmcgb25lXFxcIik7XFxuIDcxODpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDcxOTpcXHRcXHRcXHR9IGVsc2UgaWYgKCEoY3VyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NDowNy45MDc0MDUxNDZaIiwiU2VxIjo1OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY2NDk2NzM5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgcHJlc2VudGVkIGFzIGlmIGl0IHdlcmUgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKipcblxuQWxyaWdodCwgc28gd2UncmUgbG9va2luZyBhdCBgYnJfdmxhbl92YWxpZF9yYW5nZWAgYWdhaW4uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0IG5lZWRzIGEgY2xvc2VyIGxvb2suIEknbSBhbHJlYWR5IHByZXR0eSBmYW1pbGlhciB3aXRoIHRoZSBicm9hZGVyIFZMQU4gY29uY2VwdHMsIGFuZCBob3cgdGhleSByZWxhdGUgdG8gYnJpZGdpbmcsIGJ1dCB0aGVyZSdzIGFsd2F5cyB0aGUgcG90ZW50aWFsIGZvciBlZGdlIGNhc2VzIG9yIHN1YnRsZSBpbnRlcmFjdGlvbnMgdGhhdCBhcmVuJ3QgaW1tZWRpYXRlbHkgb2J2aW91cywgZXNwZWNpYWxseSB3aXRoaW4gYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBsaWtlIHRoaXMuIFRoaXMgZnVuY3Rpb24gb3Igc3RydWN0dXJlIGlzIGNsZWFybHkgcGl2b3RhbCBpbiBkZWZpbmluZyB3aGF0IGNvbnN0aXR1dGVzIGEgdmFsaWQgVkxBTiByYW5nZSBmb3IgdGhlIGJyaWRnZS4gR2l2ZW4gdGhlIHBvdGVudGlhbCBmb3IgY29uZmxpY3Qgb3IgbWlzY29uZmlndXJhdGlvbiwgaXQncyB3b3J0aCByZXZpc2l0aW5nIHRvIHNvbGlkaWZ5IG91ciB1bmRlcnN0YW5kaW5nLiBXZSBuZWVkIGEgY2xlYXIgbWVudGFsIG1vZGVsIG9mIGhvdyBpdCdzIHVzZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBicmlkZ2UgY29kZS4gQXJlIHRoZXJlIGFueSBhc3N1bXB0aW9ucyBvciBpbXBsaWNpdCBiZWhhdmlvcnMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgYXJlYXMgZm9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24gb3IgcG90ZW50aWFsIHJpc2tzIGluIHRoZSB2YWxpZGF0aW9uIGxvZ2ljIGl0IGltcGxlbWVudHM/IFJpZ2h0IG5vdywgSSB0aGluayB0aGF0IGEgYml0IG1vcmUgdGltZSBzcGVudCBleGFtaW5pbmcgaXQgd291bGQgYmUgYmVuZWZpY2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGlzIGNvZGUgYmV0dGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODE5MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MTIuNTcyMzc2MzM0WiIsIlNlcSI6NjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMDU0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX3ByaXZhdGUuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA3MTUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA3MTU6XFx0XFx0aWYgKGxhc3QpIHtcXG4gNzE2OlxcdFxcdFxcdGlmIChjdXItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiA3MTc6XFx0XFx0XFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXFxcIkZvdW5kIGEgbmV3IHZsYW4gcmFuZ2Ugc3RhcnQgd2hpbGUgcHJvY2Vzc2luZyBvbmVcXFwiKTtcXG4gNzE4OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNzE5OlxcdFxcdFxcdH0gZWxzZSBpZiAoIShjdXItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpKSB7XFxuIDcyMDpcXHRcXHRcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcXFwiVmxhbiByYW5nZSBlbmQgZmxhZyBpcyBtaXNzaW5nXFxcIik7XFxuIDcyMTpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDcyMjpcXHRcXHRcXHR9IGVsc2UgaWYgKGN1ci1cXHUwMDNldmlkIFxcdTAwM2M9IGxhc3QtXFx1MDAzZXZpZCkge1xcbiA3MjM6XFx0XFx0XFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXFxcIkVuZCB2bGFuIGlkIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBzdGFydCB2bGFuIGlkXFxcIik7XFxuIDcyNDpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDcyNTpcXHRcXHRcXHR9XFxuIDcyNjpcXHRcXHR9XFxuIDcyNzpcXHRcXG4gNzI4OlxcdFxcdC8qIGNoZWNrIGZvciByZXF1aXJlZCByYW5nZSBmbGFncyAqL1xcbiA3Mjk6XFx0XFx0aWYgKCEoY3VyLVxcdTAwM2VmbGFncyBcXHUwMDI2IChCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOIHxcXG4gNzMwOlxcdFxcdFxcdFxcdCAgICBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkpKSB7XFxuIDczMTpcXHRcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcXFwiQm90aCB2bGFuIHJhbmdlIGZsYWdzIGFyZSBtaXNzaW5nXFxcIik7XFxuIDczMjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDczMzpcXHRcXHR9XFxuIDczNDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MTIuNTcyNTc5MTM0WiIsIlNlcSI6NjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIzNzQ3OTQ2OTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyoqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byB0aGlzIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGZ1bmN0aW9uLiBUaGUga2V5IGlzIHRvIHVuZGVyc3RhbmQgaG93IGl0IGhhbmRsZXMgVkxBTiByYW5nZXMgYW5kIHR1bm5lbCBJRHMsIGFuZCB3aHkgdGhlIHN5emJvdCByZXBvcnQgZmxhZ2dlZCB0aGlzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMsIHRoZSBgYnJfdmxhbl92YWxpZF9yYW5nZWAgY2hlY2sgZW5zdXJlcyBgY3VyLVx1MDAzZXZpZCBcdTAwM2M9IGxhc3QtXHUwMDNldmlkYCwgYW5kIGl0IHNlZW1zIHRoYXQgdGhpcyBjcnVjaWFsIGNoZWNrIGlzICptaXNzaW5nKiBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gSW50ZXJlc3RpbmcuIFRoaXMgYWJzZW5jZSBtaWdodCBiZSB0aGUgY29yZSBvZiB0aGUgaXNzdWUuXG5cblRoZSBmdW5jdGlvbiBjb21wYXJlcyBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpYCB3aXRoIGAodGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWQpYC4gVGhlIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGlzIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCB0aGUgc3VidHJhY3Rpb24geWllbGRzIGEgbmVnYXRpdmUgcmVzdWx0LiBJZiB0aGlzIG5lZ2F0aXZlIGB2aWRgIGRpZmZlcmVuY2UgKnNvbWVob3cqIG1hdGNoZXMgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSAoY29udmVydGVkIHRvIGB1MzJgKSwgd2UgYnlwYXNzIHRoZSBpbnRlbmRlZCB2YWxpZGF0aW9uIVxuXG5CdXQgd2FpdCBhIG1pbnV0ZS4uLiBldmVuIGlmIHRoZSBjaGVjayBpcyBieXBhc3NlZCwgdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIHN0aWxsICp3b3VsZG4ndCogZXhlY3V0ZS4gSXQncyBiZWNhdXNlIGB2YCBzdGFydHMgYXQgYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAsIHNvIHRoZSBsb29wIGlzIGVmZmVjdGl2ZWx5IHNraXBwZWQsIHJldHVybmluZyAwLiBXaHkgaXMgdGhpcyBhIHByb2JsZW0/ICBJdCBzZWVtcyB0aGUgcHJpbWFyeSBpc3N1ZSBpcyB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIChzdWNjZXNzKSBidXQgaXQgaGFzIGVmZmVjdGl2ZWx5IGRvbmUgbm90aGluZyBiZWNhdXNlIG5vIHZhbGlkIFZMQU5zIGFyZSBwcm9jZXNzZWQgYW5kIG5vIHR1bm5lbHMgd2VyZSBhZGRlZCwgeWV0IHRoZSB1c2VyIGlzIGxlZCB0byBiZWxpZXZlIHRoZSByYW5nZSB3YXMgdmFsaWQuIEl0IGNsZWFycyB0aGUgbGFzdCBhbmQgY3VycmVudCBpbmZvIHN0cnVjdHVyZXMuICBFc3NlbnRpYWxseSwgdGhlIHJhbmdlIGlzICppZ25vcmVkKi5cblxuU28sIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgMCBhbmQgYHRpbmZvX2xhc3QtXHUwMDNldmlkYCBpcyA2NTUzNSwgYHZgIHN0YXJ0cyBhdCA2NTUzNSwgd2hpY2ggaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byAwLCB3aGljaCBhbHNvIHJlc3VsdHMgaW4gbm8gaXRlcmF0aW9uIGluIHRoZSBsb29wLiBUaGUgYHZgIHZhcmlhYmxlIGlzIGFuIGBpbnRgLCBub3QgYHUxNmAgb3IgYHUzMmAuIFRoaXMgbWFrZXMgdGhlIGNvbXBhcmlzb24gbGVzcyB0cmlja3kuIEknbSBub3Qgc2VlaW5nIGEgbWVtb3J5IGxlYWsgb3IgYSBjcmFzaCBoZXJlLlxuXG5Ob3csIGxldCdzIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyAqZG9uJ3QqIG1hdGNoLCB3aGVuIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBpcyBuZWdhdGl2ZSBhbmQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCBpcyBwb3NpdGl2ZS4gIEluIHRoaXMgc2NlbmFyaW8sIHdlIGdldCBhbiBgLUVJTlZBTGAgZXJyb3IgYW5kIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBpcyBvYnNlcnZlZC5cblxuVGhlcmVmb3JlLCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIGlmIHRoZSBkaWZmZXJlbmNlcyBkbyBtYXRjaDogd2UgZ2V0IDAgaW5zdGVhZCBvZiBgLUVJTlZBTGAuIE5vIGxvb3AgaXMgZXhlY3V0ZWQsIHNvIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUuICBJcyB0aGlzIGEgYnVnIHdvcnRoIGZ1enppbmc/XG5cbkkgdGhpbmsgSSBzZWUgd2hhdCdzIGhhcHBlbmluZy4gUmV0dXJuaW5nIDAgaXMgbWlzbGVhZGluZyBiZWNhdXNlIGl0IGltcGxpZXMgc3VjY2VzcyB3aGVuIGEgcmFuZ2Ugd2FzIG5vdCBwcm9jZXNzZWQuIEl0IG1lYW5zIHRoZSBOZXRsaW5rIG1lc3NhZ2UgcHJvY2Vzc2luZyBjb250aW51ZXMuIElmIHdlIHJldHVybiBgLUVJTlZBTGAsIGl0IGFib3J0cy4gIFRoZSBtYWluIGltcGFjdCBpcyB0aGF0IHRoZSBpbnRlcm5hbCBzdGF0ZSAoYHRpbmZvX2xhc3RgIGFuZCBgdGluZm9fY3VycmApIGlzICpjbGVhcmVkKi4gQXMgaWYgdGhlIHJhbmdlIHdhcyBzdWNjZXNzZnVsLlxuXG5Hb2luZyB0aHJvdWdoIHRoZSBvdGhlciBsb2dpYywgYHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU5gIGFuZCBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgLCBpZiB0aGUgcmFuZ2UgaXMgc2tpcHBlZCwgdGhlIGZsYWdzIGFyZSBjbGVhcmVkLiBJZiB0aGUgKm5leHQqIGF0dHJpYnV0ZSBpcyBhbm90aGVyIGBSQU5HRV9FTkRgLCB0aGUgbG9naWMgd2lsbCBmYWlsLiBJZiB0aGUgbmV4dCBhdHRyaWJ1dGUgaXMgYSBgUkFOR0VfQkVHSU5gLCBpdCB3aWxsIHN1Y2NlZWQgKGFuZCBvdmVyd3JpdGUgdGhlIGNsZWFyZWQgYHRpbmZvX2xhc3RgKS5cblxuU28sIHdoZW4gdGhlIGRpZmZlcmVuY2VzIG1hdGNoLCB0aGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLCB3aGljaCBtaWdodCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgbGF0ZXIgb24gaW4gdGhlIG5ldGxpbmsgbWVzc2FnZSBwcm9jZXNzaW5nLiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGlzc3VlLlxuXG5Ob3cgbGV0IG1lIGdvIGRlZXBlciBpbnRvIGBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4ODQwLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQzNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ0OjM2LjMyMDUyODcyNFoiLCJTZXEiOjYyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTYyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI1NyxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI1NzpcXHRzdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcbiAyNTg6XFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKip2X3N0YXJ0LFxcbiAyNTk6XFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKip2X2VuZCxcXG4gMjYwOlxcdFxcdFxcdFxcdFxcdCAgICAgICBpbnQgdl9jdXJyLCBib29sIGN1cnJfY2hhbmdlKVxcbiAyNjE6XFx0e1xcbiAyNjI6XFx0XFx0c3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmc7XFxuIDI2MzpcXHRcXHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2O1xcbiAyNjQ6XFx0XFxuIDI2NTpcXHRcXHR2ZyA9IG5icF92bGFuX2dyb3VwKHApO1xcbiAyNjY6XFx0XFx0aWYgKCF2ZylcXG4gMjY3OlxcdFxcdFxcdHJldHVybjtcXG4gMjY4OlxcdFxcbiAyNjk6XFx0XFx0diA9IGJyX3ZsYW5fZmluZCh2Zywgdl9jdXJyKTtcXG4gMjcwOlxcdFxcbiAyNzE6XFx0XFx0aWYgKCEqdl9zdGFydClcXG4gMjcyOlxcdFxcdFxcdGdvdG8gb3V0X2luaXQ7XFxuIDI3MzpcXHRcXG4gMjc0OlxcdFxcdGlmICh2IFxcdTAwMjZcXHUwMDI2IGN1cnJfY2hhbmdlIFxcdTAwMjZcXHUwMDI2IGJyX3ZsYW5fY2FuX2VudGVyX3JhbmdlKHYsICp2X2VuZCkpIHtcXG4gMjc1OlxcdFxcdFxcdCp2X2VuZCA9IHY7XFxuIDI3NjpcXHRcXHRcXHRyZXR1cm47XFxuIDI3NzpcXHRcXHR9XFxuIDI3ODpcXHRcXG4gMjc5OlxcdFxcdGJyX3ZsYW5fbm90aWZ5KHAtXFx1MDAzZWJyLCBwLCAoKnZfc3RhcnQpLVxcdTAwM2V2aWQsICgqdl9lbmQpLVxcdTAwM2V2aWQsIFJUTV9ORVdWTEFOKTtcXG4gMjgwOlxcdG91dF9pbml0OlxcbiAyODE6XFx0XFx0Lyogd2Ugc3RhcnQgYSByYW5nZSBvbmx5IGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyB0byBub3RpZnkgYWJvdXQgKi9cXG4gMjgyOlxcdFxcdCp2X3N0YXJ0ID0gY3Vycl9jaGFuZ2UgPyB2IDogTlVMTDtcXG4gMjgzOlxcdFxcdCp2X2VuZCA9ICp2X3N0YXJ0O1xcbiAyODQ6XFx0fVxcbiAyODU6XFx0XFxuIDI4NjpcXHRpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MzYuMzIwNjQ2NDQ0WiIsIlNlcSI6NjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ1OTM1MzExMDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIGEgUG90ZW50aWFsIEJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaWYgdGhlIGxvb3AgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZG9lc24ndCBleGVjdXRlLCBhbmQgaXQncyBjb25kaXRpb25hbCBvbiBgdl9zdGFydGAgYW5kIGB2X2VuZGAgYmVpbmcgbm9uLU5VTEwsIHRoZW4gYGJyX3ZsYW5fbm90aWZ5YCB3b24ndCBiZSBjYWxsZWQsIHdoaWNoIGlzIGV4cGVjdGVkLiBUaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzLCB3aGF0IHRyaWdnZXJzIHRoZSBjb25kaXRpb24gd2hlcmUgdGhlIGxvb3AgaXNuJ3QgZW50ZXJlZCBhbmQgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIG9mIHplcm8gaXMgd3Jvbmc/XG5cblRoZSBrZXkgaGVyZSBzZWVtcyB0byByZXZvbHZlIGFyb3VuZCB0aGUgY29tcGFyaXNvbjogYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAuIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGxvb3AgKnNob3VsZG4ndCogZXhlY3V0ZS4gSWYgdGhlIGxvb3AgZXhlY3V0ZXMgd2l0aCB0aG9zZSBjb25mbGljdGluZyB2YWx1ZXMsIHdlIGFyZSBpbiB0cm91YmxlIGFuZCBpdCBuZWVkcyB0byBiZSB1bmRlcnN0b29kLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2aWRzIGFsc28gZXF1YWxzIHRoZSBkaWZmZXJlbmNlIGluIGB0dW5pZGAsIHRoZW4gdGhlIG9yaWdpbmFsIGNvZGUgd291bGQgbm90IGhhdmUgZmxhZ2dlZCB0aGUgZXJyb3IuXG5cbkxldCdzIGFzc3VtZSB0aGUgY29uZGl0aW9uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgICppcyogbWV0LCBhbmQgdGhlIGxvb3AgaXMgc2tpcHBlZC4gVGhpcyBpcyBub3cgdGhlIFwiYnVnXCIgdGhhdCBTeXpib3QgbWlnaHQgaGF2ZSBmbGFnZ2VkLiBJcyBpdCBhIGJ1Zz8gTm90IGluIHRoZSB0cmFkaXRpb25hbCBzZW5zZSwgYmVjYXVzZSwgaXQncyBhIHNpbGVudCBmYWlsdXJlLiBXZSdyZSAqbm90KiBjYXVzaW5nIGEgY3Jhc2ggb3IgbWVtb3J5IGNvcnJ1cHRpb24uIFRoZSBjb2RlIHNpbGVudGx5IGlnbm9yZXMgdGhlIGludmFsaWQgcmFuZ2UuIEJ1dCB0aGlzIGRvZXNuJ3QgdmFsaWRhdGUgdGhlIG5ldHdvcmsgdHVubmVsLCB3aGljaCBpcyBhIGZsYXcuXG5cbkxldCdzIGNoZWNrIHRoZSBwYXRjaDpcblxuYGBgY1xuLVx0XHRpZiAoKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4rXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbitcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbmBgYFxuXG5UaGUgcGF0Y2ggc3BlY2lmaWNhbGx5IGFkZHJlc3NlcyB0aGUgY2FzZSBvZiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCB0aGF0IGhhZCB0byByZXR1cm4gYC1FSU5WQUxgIGFuZCBhZGRlZCBhbiBpbnZhbGlkIG5ldHdvcmsgdHVubmVsLiBCZWZvcmUgdGhlIHBhdGNoLCBhIGNvbmRpdGlvbiB3aXRoIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBhbmQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCB3YXMgbWlzc2luZyB2YWxpZGF0aW9uLCBhbmQgbm93IHdlIGNhdGNoIHRoYXQgY29uZGl0aW9uLlxuXG5JZiB0aGUgcmV0dXJuZWQgMCBza2lwcyB0aGUgbG9vcCwgZG9lcyB0aGUgc3RhdGUgcGVyc2lzdD8gTm8sIGB0aW5mb19sYXN0YCBpcyBjbGVhcmVkIHdpdGggYG1lbXNldGAsIHNvIHRoZSBzdGF0ZSBpcyB2YWxpZC4gSWYgaXQgcmV0dXJucyAwLCB0aGUgY29kZSBjb250aW51ZXMgdG8gdGhlIG5leHQgYXR0cmlidXRlLCBvciBpdCByZXR1cm5zIHRvIHVzZXIgc3BhY2UgaW4gYSBicm9rZW4gc3RhdGUuXG5cbldoZXJlIGNvdWxkIHRoaXMgaGF2ZSB0cmlnZ2VyZWQgYSBwcm9ibGVtPyBJJ20gbm90IHNlZWluZyBhbnkgb3ZlcmZsb3cgb2YgYGludGAsIGJhc2VkIG9uIHRoZSB0eXBlcyBhbmQgdGhlIGxvb3AgY29uZGl0aW9uLiBJJ20gYWxzbyBub3Qgc2VlaW5nIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzc3Vlcy4gVUJTQU4gc2hvdWxkIG5vdCBoYXZlIHRyaWdnZXJlZCBhIHdhcm5pbmcsIHNpbmNlIGEgMzItYml0IGBpbnRgIGNhbm5vdCBvdmVyZmxvdy4gXG5cblRoZSBtb3N0IGxpa2VseSBpc3N1ZSBpcyB0aGF0IFN5emJvdCBjb3JyZWN0bHkgaWRlbnRpZmllZCB0aGF0IHRoZSBmdW5jdGlvbiBjb3VsZCBzaWxlbnRseSBmYWlsIHZhbGlkYXRpb24gYW5kIHJldHVybiAwLCBpbnN0ZWFkIG9mIGAtRUlOVkFMYCwgaWYgdGhlIGludmFsaWQgYHZpZGAgcmFuZ2UgYWxzbyBtYXRjaGVkIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UuIFRoZSB1c2VyIHdvdWxkIGhhdmUgc2VudCBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgc3lzdGVtIHdvdWxkIGFjY2VwdCBpdCwgYnV0IGRvIG5vdGhpbmcuIFRoaXMgaXMgbm90IGEgc2VjdXJpdHkgZmxhdywgb3IgZXZlbiBhIGNyYXNoLCBidXQgaXMgYW4gdW5kZXNpcmFibGUgYmVoYXZpb3IgdGhhdCBtdXN0IGJlIHZhbGlkYXRlZC5cblxuSXQncyBsaWtlbHkgdGhhdCBhIHByZXZpb3VzIGxvZ2ljIGVycm9yIGV4aXN0cyB3aGVyZSBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBjb3VsZCByZXN1bHQgaW4gYW4gaW1wcm9wZXIgcmV0dXJuIG9mIDAgaW5zdGVhZCBvZiBgLUVJTlZBTGAuIFRoZSBwYXRjaCBmaXhlcyB0aGF0LCBlbnN1cmluZyBgLUVJTlZBTGAgaXMgcmV0dXJuZWQgZm9yIGludmFsaWQgcmFuZ2VzLiBcblxuXG4iLCJJbnB1dFRva2VucyI6MzE2MzcsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjAyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDU6MjIuMjU1OTYwNjg0WiIsIlNlcSI6NjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgyODg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyODYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyODY6XFx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuIDI4NzpcXHRcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbiAyODg6XFx0XFx0XFx0XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcXG4gMjg5OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXFxuIDI5MDpcXHRcXHRcXHRcXHRcXHRib29sICpjaGFuZ2VkKVxcbiAyOTE6XFx0e1xcbiAyOTI6XFx0XFx0aW50IGVycjtcXG4gMjkzOlxcdFxcbiAyOTQ6XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiAyOTU6XFx0XFx0XFx0aWYgKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcXG4gMjk2OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAyOTc6XFx0XFx0XFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDI5ODpcXHRcXHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcXG4gMjk5OlxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xcbiAzMDA6XFx0XFx0XFx0aW50IHQsIHY7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIDMwMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcdFxcdGlmICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgXFx1MDAzYyB0aW5mb19sYXN0LVxcdTAwM2V2aWQgfHxcXG4gMzA1OlxcdFxcdFxcdCAgICAodGluZm9fY3Vyci1cXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldmlkKSAhPVxcbiAzMDY6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gMzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDg6XFx0XFx0XFx0dCA9IHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkO1xcbiAzMDk6XFx0XFx0XFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHRpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDMxMDpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbiAzMTM6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMzE0OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAzMTU6XFx0XFx0XFx0XFx0dCsrO1xcbiAzMTY6XFx0XFxuIDMxNzpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpXFxuIDMxODpcXHRcXHRcXHRcXHRcXHQqY2hhbmdlZCA9IGN1cnJfY2hhbmdlO1xcbiAzMTk6XFx0XFx0XFx0XFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXFx1MDAyNnZfc3RhcnQsIFxcdTAwMjZ2X2VuZCwgdixcXG4gMzIwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGN1cnJfY2hhbmdlKTtcXG4gMzIxOlxcdFxcdFxcdH1cXG4gMzIyOlxcdFxcdFxcdGlmICh2X3N0YXJ0IFxcdTAwMjZcXHUwMDI2IHZfZW5kKVxcbiAzMjM6XFx0XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfc3RhcnQtXFx1MDAzZXZpZCwgdl9lbmQtXFx1MDAzZXZpZCxcXG4gMzI0OlxcdFxcdFxcdFxcdFxcdCAgICAgICBSVE1fTkVXVkxBTik7XFxuIDMyNTpcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMjY6XFx0XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMzI3OlxcdFxcbiAzMjg6XFx0XFx0XFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDMyOTpcXHRcXHRcXHRtZW1zZXQodGluZm9fY3VyciwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMzMwOlxcdFxcdH0gZWxzZSB7XFxuIDMzMTpcXHRcXHRcXHRpZiAodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MpXFxuIDMzMjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzMzOlxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB0aW5mb19jdXJyLVxcdTAwM2V2aWQsXFxuIDMzNDpcXHRcXHRcXHRcXHRcXHRcXHQgIHRpbmZvX2N1cnItXFx1MDAzZXR1bmlkLCBjaGFuZ2VkKTtcXG4gMzM1OlxcdFxcdFxcdGlmIChlcnIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ1OjIyLjI1NjA0NDg2NFoiLCJTZXEiOjY1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxODA3NzY4ODg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipVbmluaXRpYWxpemVkIFZhcmlhYmxlIEJ1ZyBpbiBWTEFOIFR1bm5lbCBQcm9jZXNzaW5nKipcblxuT2theSwgc28gSSd2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUsIGFuZCBpbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBgZXJyYC4gVGhlIGNvZGUsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjb25kaXRpb25hbCBgaWYgKHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZClgLCBjYW4gbGVhZCB0byBhIHNpdHVhdGlvbiB3aGVyZSBgZXJyYCBpc24ndCBhc3NpZ25lZCBhIHZhbHVlIGJlZm9yZSBpdCdzIHVzZWQuIFNwZWNpZmljYWxseSwgaWYgdGhlIGxvb3AgY29uZGl0aW9uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIGZhbHNlLCBhbmQgaXQgZW5kcyB1cCBpbiB0aGUgYGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKWAgYmxvY2ssIGBlcnJgIHdpbGwgcmVtYWluIHVuaW5pdGlhbGl6ZWQuIFRoYXQgbWVhbnMgd2hlbiB0aGUgY29kZSBoaXRzIGBpZiAoZXJyKWAsIGl0J3MgdXNpbmcgZ2FyYmFnZSwgbGVhZGluZyB0byB1bmRlZmluZWQgYmVoYXZpb3IuIFRoaXMgaXMgYSBjbGFzc2ljIEtNU0FOIGJ1ZywgYW5kIHllcywgS01TQU4gZGVmaW5pdGVseSB3b3VsZCBoYXZlIGNhdWdodCB0aGlzIHVuaW5pdC12YWx1ZSBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC5cblxuVGhlIGZpeCBjbGV2ZXJseSBlbnN1cmVzIHRoZSBsb29wIGV4ZWN1dGVzIGF0IGxlYXN0IG9uY2UgKGJ5IHJldmVyc2luZyB0aGUgY29tcGFyaXNvbiksIG1ha2luZyBzdXJlIGBlcnJgIGdldHMgaW5pdGlhbGl6ZWQgdmlhIGBlcnIgPSBicl92bGFuX3R1bm5lbF9pbmZvKC4uLilgLiBCcmlsbGlhbnQgY2F0Y2gsIHJlYWxseSFcblxuTm93LCB0aGUgZnVuY3Rpb25hbCBpbXBhY3QgaGVyZSBpcyB3b3J0aCBjb25zaWRlcmluZy4gUmV0dXJuaW5nIGFuIHVuaW5pdGlhbGl6ZWQgZXJyb3IgY29kZSBjb3VsZCBsZWFrIGtlcm5lbCBtZW1vcnkgb3IgbGVhZCB0byBhcmJpdHJhcnkgcmV0dXJuIGNvZGVzIHRvIHVzZXIgc3BhY2UsIHdoaWNoIGlzIGRlZmluaXRlbHkgYSBzZWN1cml0eSBjb25jZXJuLiBTbywgdGhpcyBmaXggaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nIHRvIGNvbmZpcm0gaXQncyBjb3JyZWN0IGFuZCB0byBsb29rIGZvciBvdGhlciBwb3NzaWJsZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiByZWxhdGVkIGNvZGUgcGF0aHMuXG5cbkknbGwgYmUgZm9jdXNpbmcgb24gYSBmZXcga2V5IHN5bWJvbHM6IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGlzIHRoZSBwcmltYXJ5IG9uZS4gYGJyX3ZsYW5fdHVubmVsX2luZm9gIGFuZCB0aGUgYGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm9gIGFzIHdlbGwuIEFsc28gYGJyX2Fmc3BlY2AgaXMgYSBjYWxsZXIgYnV0IGl0IGlzIHRvbyBnZW5lcmljIHRvIGJlIHRoZSBtYWluIGZvY3VzLlxuXG5BcyBmb3IgdGhlIGNvbmZpZ3MsIGBDT05GSUdfQlJJREdFYCBpcyB0aGUga2V5IHJlcXVpcmVtZW50LiBJdCBzZWVtcyB0aGF0IGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBtYXkgYmUgbmVlZGVkIHRvIGZ1bGx5IHRlc3QgZnVuY3Rpb25hbGl0eSwgZXZlbiBpZiB0aGUgdW5pbml0aWFsaXplZCBidWcgZXhpc3RzIHdpdGhvdXQgaXQuIExldCdzIHNlZSAtIGBicl9uZXRsaW5rX3R1bm5lbC5jYCBnZXRzIGNvbXBpbGVkIGlmIGBDT05GSUdfQlJJREdFYCBpcyBlbmFibGVkLiBCdXQgd2hlbiBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgZGlzYWJsZWQsIGBicl92bGFuX3R1bm5lbF9pbmZvYCBzdGlsbCBnZXRzIGNhbGxlZCwgYnV0IGp1c3QgcmV0dXJucyAwLiBUaGUgYnVnIGlzIHN0aWxsIHRyaWdnZXJlZCB3aXRoIGBDT05GSUdfQlJJREdFYCBhbG9uZS4gVGhlcmVmb3JlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCB3aWxsIGltcHJvdmUgdGhlIHRlc3QgY292ZXJhZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM4NTMzLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDU6NDAuMzMzNzM2NDk5WiIsIlNlcSI6NjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MTYxMDQ2MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlJJREdFX1ZMQU5fRklMVEVSSU5HXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvS2NvbmZpZz0zNj1jb25maWcgQlJJREdFX0lHTVBfU05PT1BJTkdcXG4tLVxcbm5ldC9icmlkZ2UvS2NvbmZpZy00OS1cXG5uZXQvYnJpZGdlL0tjb25maWc6NTA6Y29uZmlnIEJSSURHRV9WTEFOX0ZJTFRFUklOR1xcbm5ldC9icmlkZ2UvS2NvbmZpZy01MS1cXHRib29sIFxcXCJWTEFOIGZpbHRlcmluZ1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDU6NDAuNDE1MzU0NjIxWiIsIlNlcSI6NjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNTAxODUxNjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIFZMQU4gRmlsdGVyaW5nIGluIHRoZSBMaW51eCBCcmlkZ2UgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEknbSB0aGlua2luZywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBmb3IgYnJpZGdpbmcuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBCUklER0VfVkxBTl9GSUxURVJJTkdgLiBUaGF0IG9wdGlvbiBpcyBjcml0aWNhbCwgc28gSSdtIGFzc3VtaW5nIGl0IGluZmx1ZW5jZXMgb3IgcmVsaWVzIG9uIGEgZmV3IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBJJ2xsIGhlYWQgb3ZlciB0byBgbmV0L2JyaWRnZS9LY29uZmlnYCB0byBzdGFydCB1bnRhbmdsaW5nIHRob3NlIGRlcGVuZGVuY2llcyBhbmQgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2UgdG8gZW5hYmxlIFZMQU4gZmlsdGVyaW5nIHN1Y2Nlc3NmdWxseS4gSXQncyBhIGtleSBwaWVjZSBpbiBhbGxvd2luZyBtZSB0byBtYW5hZ2UgYW5kIHNlcGFyYXRlIG5ldHdvcmsgdHJhZmZpYyBvbiB0aGlzIGJyaWRnZSBhbmQgSSBuZWVkIHRvIG1ha2UgY2VydGFpbiB0aGF0IGFsbCByZWxhdGVkIHNldHRpbmdzIGFyZSBjb25maWd1cmVkIHByb3Blcmx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDExNCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ1OjUyLjkxNzIwOTYzMVoiLCJTZXEiOjY4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwLFxuICBcIkxpbmVDb3VudFwiOiAxMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDUwOlxcdGNvbmZpZyBCUklER0VfVkxBTl9GSUxURVJJTkdcXG4gIDUxOlxcdFxcdGJvb2wgXFxcIlZMQU4gZmlsdGVyaW5nXFxcIlxcbiAgNTI6XFx0XFx0ZGVwZW5kcyBvbiBCUklER0VcXG4gIDUzOlxcdFxcdGRlcGVuZHMgb24gVkxBTl84MDIxUVxcbiAgNTQ6XFx0XFx0ZGVmYXVsdCBuXFxuICA1NTpcXHRcXHRoZWxwXFxuICA1NjpcXHRcXHQgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHRoZSBFdGhlcm5ldCBicmlkZ2Ugd2lsbCBiZSBhYmxlIHNlbGVjdGl2ZWx5XFxuICA1NzpcXHRcXHQgIHJlY2VpdmUgYW5kIGZvcndhcmQgdHJhZmZpYyBiYXNlZCBvbiBWTEFOIGluZm9ybWF0aW9uIGluIHRoZSBwYWNrZXRcXG4gIDU4OlxcdFxcdCAgYW55IFZMQU4gaW5mb3JtYXRpb24gY29uZmlndXJlZCBvbiB0aGUgYnJpZGdlIHBvcnQgb3IgYnJpZGdlIGRldmljZS5cXG4gIDU5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NTo1Mi45MTczNDQzODFaIiwiU2VxIjo2OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjU3ODIyMDExNzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEJyaWRnZSBWTEFOIFR1bm5lbGluZyBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgaGVyZSdzIG15IGJyZWFrZG93bi4gSXQgc2VlbXMgYEJSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgcmVsaWFudCBvbiBib3RoIGBCUklER0VgIGFuZCBgVkxBTl84MDIxUWAsIHNvIHRob3NlIHRocmVlIG5lZWQgdG8gYmUgZW5hYmxlZCBpbiBgRW5hYmxlQ29uZmlnc2AuIEknbGwgYWRkIHRob3NlIHJpZ2h0IGF3YXksIEknbGwgYWxzbyBhZGQgdGhlIG9idmlvdXMgb25lczogYENPTkZJR19ORVRgIGFuZCBgQ09ORklHX05FVF9DT1JFYC5cblxuTm93LCBsZXQncyB6ZXJvIGluIG9uIHRoZSBrZXkgc3ltYm9scy4gSSBuZWVkIHRvIGtlZXAgYW4gZXllIG9uIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLCBgYnJfdmxhbl90dW5uZWxfaW5mb2AsIGFuZCBgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb2AuIEkndmUgY29uZmlybWVkIHRoYXQgbm9uZSBvZiB0aGVzZSBhcmUgc3RhdGljLCB3aGljaCBpcyBnb29kIHRvIGtub3cgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuIFRoZXkncmUgYWxsIGRlY2xhcmVkIGluIGBicl9wcml2YXRlX3R1bm5lbC5oYC5cblxuVGhlIGNvcmUgaXNzdWUgaGVyZSBpcyBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBgZXJyYCwgd2l0aGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBFc3NlbnRpYWxseSwgaWYgc29tZW9uZSBjcmFmdHMgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSB3aXRoIGFuIGVuZCBgdmlkYCBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBoYXBwZW5zIHRvIG1hdGNoIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiwgdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIGdldHMgc2tpcHBlZC4gVGhhdCBsZWF2ZXMgYGVycmAgdW50b3VjaGVkLCBidXQgdGhlIGNvZGUgbGF0ZXIgY2hlY2tzIGlmIGBlcnJgIGlzIHRydWUsIGxlYWRpbmcgdG8gYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGxlYWsgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RhY2sgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIHNvIHRoYXQncyBhIGRlZmluaXRlIHNlY3VyaXR5IGNvbmNlcm4uIFRoZSBwYXRjaCBmaXhlcyB0aGlzIGJ5IGRpcmVjdGx5IGNoZWNraW5nIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGFuZCByZXR1cm5pbmcgYC1FSU5WQUxgLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhaywgd2hpY2ggbWVhbnMgZnV6emluZyBpcyB3YXJyYW50ZWQuXG5cbk5leHQsIEkgbmVlZCB0byBjaGVjayBob3cgcmVhY2hhYmxlIHRoaXMgaXMgZnJvbSB1c2VyIHNwYWNlLiBMb29rcyBsaWtlIHRoaXMgaXMgcmVhY2hhYmxlIHZpYSBgcnRuZXRsaW5rYCwgc3BlY2lmaWNhbGx5IGBSVE1fU0VUTElOS2Agb24gYSBicmlkZ2UgcG9ydCwgc28gaXQncyBkaXJlY3RseSBleHBvc2VkLiBUbyBkbyB0aGF0IHlvdSBuZWVkIGBDQVBfTkVUX0FETUlOYCBpbiB0aGUgbmV0d29yayBuYW1lc3BhY2UsIHdoaWNoIGlzIGVhc3kgdG8gZ2V0IHdpdGggdXNlciBuYW1lc3BhY2VzLiBUaGlzIGlzIGZ1bGx5IHJlYWNoYWJsZSwgYW5kIEknbGwgYmUgY2VydGFpbiB0byBkb2N1bWVudCB0aGF0IGluIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LlxuXG4qKldvcnRoRnV6emluZzogdHJ1ZSoqXG5cbioqUmVhc29uaW5nOioqIFRoZSBwYXRjaCBhZGRyZXNzZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIHdpdGhpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gSWYgdGhlIGVuZCBgdmlkYCBpbiBhIFZMQU4gdHVubmVsIHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnQgYHZpZGAsIGFuZCB0aGVpciBgdHVuaWRgIGRpZmZlcmVuY2VzIG1hdGNoIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiwgdGhlIHByb2Nlc3NpbmcgbG9vcCBpcyBza2lwcGVkLiBUaGlzIGxlYXZlcyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZCwgd2hpY2ggaXMgbGF0ZXIgZXZhbHVhdGVkIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5mb3JtYXRpb24gbGVhay5cblxuKipGb2N1c1N5bWJvbHM6KiogYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AsIGBicl92bGFuX3R1bm5lbF9pbmZvYCwgYGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm9gXG5cbioqRW5hYmxlQ29uZmlnczoqKiBgQlJJREdFYCwgYEJSSURHRV9WTEFOX0ZJTFRFUklOR2AsIGBWTEFOXzgwMjFRYFxuXG5Pa2F5LCBqdXN0IGNvbmZpcm1pbmcgdGhlIGNvbmZpZyBuYW1lIGlzIGluZGVlZCBgVkxBTl84MDIxUWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwNDYxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzQwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDY6MTguNjk5NTQ5MDkxWiIsIlNlcSI6NzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTYzMDMyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVkxBTl84MDIxUVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvODAyMXEvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC84MDIxcS9LY29uZmlnLTUtXFxubmV0LzgwMjFxL0tjb25maWc6Njpjb25maWcgVkxBTl84MDIxUVxcbm5ldC84MDIxcS9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIjgwMi4xUS84MDIuMWFkIFZMQU4gU3VwcG9ydFxcXCJcXG4tLVxcbm5ldC84MDIxcS9LY29uZmlnLTIxLVxcbm5ldC84MDIxcS9LY29uZmlnOjIyOmNvbmZpZyBWTEFOXzgwMjFRX0dWUlBcXG5uZXQvODAyMXEvS2NvbmZpZy0yMy1cXHRib29sIFxcXCJHVlJQIChHQVJQIFZMQU4gUmVnaXN0cmF0aW9uIFByb3RvY29sKSBzdXBwb3J0XFxcIlxcbi0tXFxubmV0LzgwMjFxL0tjb25maWctMzEtXFxubmV0LzgwMjFxL0tjb25maWc6MzI6Y29uZmlnIFZMQU5fODAyMVFfTVZSUFxcbm5ldC84MDIxcS9LY29uZmlnLTMzLVxcdGJvb2wgXFxcIk1WUlAgKE11bHRpcGxlIFZMQU4gUmVnaXN0cmF0aW9uIFByb3RvY29sKSBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NjoxOC43NDUxODQ2NDZaIiwiU2VxIjo3MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTgxNDAyMDQyMzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyoqXG5cbk9rYXksIHNvIHdlJ3JlIGxvb2tpbmcgYXQgYFZMQU5fODAyMVFgLiBNeSBpbml0aWFsIHF1ZXN0aW9uIGlzIGlmIHRoaXMgaW52b2x2ZXMgYW55IG90aGVyIG1vZGlmaWVkIGZ1bmN0aW9ucywgYnV0IGl0J3MganVzdCBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gR29vZCwgdGhhdCBuYXJyb3dzIHRoZSBzY29wZS5cblxuTm93LCBsZXQncyBjb25maXJtIGlmIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGlzIGlubGluZWQuIEl0J3MgZGVmaW5lZCBpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYCBhbmQgY2FsbGVkIGZyb20gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYCwgaW4gc2VwYXJhdGUgdHJhbnNsYXRpb24gdW5pdHMuIFNpbmNlIGl0J3Mgbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGlubGluZSBhbmQgd2UncmUgbm90IHVzaW5nIExpbmstVGltZSBPcHRpbWl6YXRpb24gKExUTyksIEkgY2FuIHJlYXNvbmFibHkgYXNzdW1lIGl0IHdvbid0IGJlIGlubGluZWQuIFRoaXMgbWFrZXMgaXQgYSBnb29kIHN5bWJvbCB0byBmb2N1cyBvbiBmb3IgYW5hbHlzaXMuXG5cblRpbWUgZm9yIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGludGVnZXIgcHJvbW90aW9uIHJ1bGVzLiBXZSBoYXZlIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIGJvdGggYHUxNmAuIFRoZWlyIGRpZmZlcmVuY2UgaXMgcHJvbW90ZWQgdG8gYGludGAuIFNpbWlsYXJseSwgYHRpbmZvX2N1cnItXHUwMDNldHVuaWRgIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAsIGJvdGggYHUzMmAsIGFuZCB0aGVpciBkaWZmZXJlbmNlIHJlbWFpbnMgYHUzMmAuIFRoZSBjb21wYXJpc29uIHVzZXMgYCE9YCBiZXR3ZWVuIHRoZSBgaW50YCByZXN1bHQgZnJvbSB0aGUgYHZpZGAgZGlmZmVyZW5jZSBhbmQgdGhlIGB1MzJgIHJlc3VsdCBmcm9tIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2U7IHRoaXMgbWVhbnMgdGhlIGBpbnRgIHdpbGwgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBgdTMyYCBmb3IgdGhlIGNvbXBhcmlzb24uXG5cbkxldCdzIHRlc3QgdGhpcyB3aXRoIHNwZWNpZmljIHZhbHVlcy4gSWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIDEwLCB0aGUgYHZpZGAgZGlmZmVyZW5jZSBpcyAtMTAuIEFzIGEgYHUzMmAsIC0xMCBiZWNvbWVzIDQyOTQ5NjcyODYuIElmIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAgaXMgMTAsIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgaXMgYWxzbyA0Mjk0OTY3Mjg2IChkdWUgdG8gdGhlIGB1MzJgIGFyaXRobWV0aWMpLiBUaHVzLCBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9ICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgIGlzIGA0Mjk0OTY3Mjg2ICE9IDQyOTQ5NjcyODZgLCB3aGljaCByZXNvbHZlcyB0byBGQUxTRS4gVGhhdCdzIGdvb2QsIGJlY2F1c2UgaXQgbWVhbnMgdGhlIGNvZGUgYnlwYXNzZXMgdGhlIGAtRUlOVkFMYCByZXR1cm4uXG5cblRoZSBuZXh0IHN0ZXBzIHNldCBgdGAgdG8gYHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgICh3aGljaCBpcyAxMCkgYW5kIHRoZW4gdGhlIGxvb3AgYGZvciAodiA9IDEwOyB2IFx1MDAzYz0gMDsgdisrKWAuIFRoZSBsb29wIGNvbmRpdGlvbiBgMTAgXHUwMDNjPSAwYCBpcyBGQUxTRSwgc28gdGhlIGxvb3AgZG9lc24ndCBleGVjdXRlIGF0IGFsbC4gVGhpcyBtZWFucyB0aGF0IHRoZSBgZXJyYCB2YXJpYWJsZSwgd2hpY2ggaXMgdXNlZCBsYXRlciwgaXMgbmV2ZXIgaW5pdGlhbGl6ZWQuIFRodXMsIGBpZiAoZXJyKWAgd2lsbCBldmFsdWF0ZSBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBhbmQgdGhpcyBpcyB0aGUgYnVnISBUaGF0J3MgaXQhXG5cbk15IGV4cGxhbmF0aW9uIGlzIHJvY2sgc29saWQsIG5vdyBJJ2xsIHVzZSBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjEzNSwiT3V0cHV0VG9rZW5zIjoyNDgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDk6MjAuMTQ3MjI5OTQ2WiIsIlNlcSI6NzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM1NzQ3NTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJSSURHRVwiLFxuICAgIFwiQlJJREdFX1ZMQU5fRklMVEVSSU5HXCIsXG4gICAgXCJWTEFOXzgwMjFRXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl92bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUklER0VcIixcbiAgICBcIkJSSURHRV9WTEFOX0ZJTFRFUklOR1wiLFxuICAgIFwiVkxBTl84MDIxUVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgS01TQU4gdW5pbml0LXZhbHVlIGJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gV2hlbiBwcm9jZXNzaW5nIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUsIGlmIGEgdXNlciBwcm92aWRlcyBhIFZMQU4gdHVubmVsIHJhbmdlIHdoZXJlIHRoZSBlbmQgYHZpZGAgaXMgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgbWF0Y2hlcyB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSAod2hpY2ggaXMgcG9zc2libGUgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bnNpZ25lZCAzMi1iaXQgYXJpdGhtZXRpYyB3cmFwLWFyb3VuZCksIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGlzIGJ5cGFzc2VkLiBDb25zZXF1ZW50bHksIHRoZSBwcm9jZXNzaW5nIGxvb3AgZXhlY3V0ZXMgemVybyB0aW1lcywgbGVhdmluZyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzIGxhdGVyIGV2YWx1YXRlZCBhbmQgcG90ZW50aWFsbHkgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSwgY2F1c2luZyBhbiBpbmZvcm1hdGlvbiBsZWFrLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ5OjIwLjIzMDgxMjEwN1oiLCJTZXEiOjczLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzEzNTQ5NTg5MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDk6MjAuMjMxMzcwNDc3WiIsIlNlcSI6NzQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjMxMzU0OTAyNTcwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjAzOTc1NzBiMDczNDcxYjU5YjQ5NjJlY2JiYWU1NDAwNzA3MzJmMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDE0IDE0OjM1OjI3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG5pbmRleCA3MWExMmRhMzAwMDRjLi4wNWY1NjBlZWI3ODljIDEwMDY0NFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG4rKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcbkBAIC0zMDEsNyArMzAxLDggQEAgaW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gXG4gXHRcdGlmICghKHRpbmZvX2xhc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4rXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbitcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0OToyMC4yMzEzNzEzMTdaIiwiU2VxIjo3NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTkyOTI5OTA5NzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgS2VybmVsIEJyaWRnZSBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBicl9uZXRsaW5rX3R1bm5lbC5jYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGEgZnVuY3Rpb24gY2FsbGVkIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBUaGUgcGF0Y2ggc2VlbXMgdG8gYmUgbW9kaWZ5aW5nIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGUgbW9zdCBub3RhYmxlIGFkZGl0aW9uIGlzIGEgY2hlY2s6IGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGJlZm9yZSBldmFsdWF0aW5nIHRoZSBkaWZmZXJlbmNlLiBNeSBpbml0aWFsIGltcHJlc3Npb24sIGNvbnNpZGVyaW5nIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0LCBpcyB0aGF0IHRoaXMgaXMgbGlrZWx5IGFuIGF0dGVtcHQgdG8gZ3VhcmQgYWdhaW5zdCBpbnRlZ2VyIHVuZGVyZmxvdyBvciBvdmVyZmxvdy4gVGhhdCdzIGEgY2xhc3NpYyB2dWxuZXJhYmlsaXR5IHR5cGUgaW4ga2VybmVsIGNvZGUsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIHNjcnV0aW5pemUgdGhpcyBjaGFuZ2UuIEkgc2hvdWxkIHByb2JhYmx5IGRpdmUgZGVlcGVyIGludG8gdGhlIGNvZGUgb2YgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgYW5kIHRoZSBzdXJyb3VuZGluZyBsb2dpYyB0byB1bmRlcnN0YW5kIHRoZSB2dWxuZXJhYmlsaXR5IHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhbmQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXggaXMgY29ycmVjdCBhbmQgc3VmZmljaWVudGx5IHJvYnVzdC4gTGV0J3Mgc3RhcnQgd2l0aCB0aGF0IGZ1bmN0aW9uLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNDUsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ5OjM5LjUyNDM2NjE2MloiLCJTZXEiOjc2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDQzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjgwOlxcdG91dF9pbml0OlxcbiAyODE6XFx0XFx0Lyogd2Ugc3RhcnQgYSByYW5nZSBvbmx5IGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyB0byBub3RpZnkgYWJvdXQgKi9cXG4gMjgyOlxcdFxcdCp2X3N0YXJ0ID0gY3Vycl9jaGFuZ2UgPyB2IDogTlVMTDtcXG4gMjgzOlxcdFxcdCp2X2VuZCA9ICp2X3N0YXJ0O1xcbiAyODQ6XFx0fVxcbiAyODU6XFx0XFxuIDI4NjpcXHRpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4gMjg3OlxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXFxuIDI4ODpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19jdXJyLFxcbiAyODk6XFx0XFx0XFx0XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fbGFzdCxcXG4gMjkwOlxcdFxcdFxcdFxcdFxcdGJvb2wgKmNoYW5nZWQpXFxuIDI5MTpcXHR7XFxuIDI5MjpcXHRcXHRpbnQgZXJyO1xcbiAyOTM6XFx0XFxuIDI5NDpcXHRcXHRpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XFxuIDI5NTpcXHRcXHRcXHRpZiAodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKVxcbiAyOTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDI5NzpcXHRcXHRcXHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMjk4OlxcdFxcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xcbiAyOTk6XFx0XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9zdGFydCA9IE5VTEwsICp2X2VuZCA9IE5VTEw7XFxuIDMwMDpcXHRcXHRcXHRpbnQgdCwgdjtcXG4gMzAxOlxcdFxcbiAzMDI6XFx0XFx0XFx0aWYgKCEodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcXG4gMzAzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDQ6XFx0XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCBcXHUwMDNjIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCB8fFxcbiAzMDU6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgLSB0aW5mb19sYXN0LVxcdTAwM2V2aWQpICE9XFxuIDMwNjpcXHRcXHRcXHQgICAgKHRpbmZvX2N1cnItXFx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQpKVxcbiAzMDc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDMwODpcXHRcXHRcXHR0ID0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQ7XFxuIDMwOTpcXHRcXHRcXHRmb3IgKHYgPSB0aW5mb19sYXN0LVxcdTAwM2V2aWQ7IHYgXFx1MDAzYz0gdGluZm9fY3Vyci1cXHUwMDNldmlkOyB2KyspIHtcXG4gMzEwOlxcdFxcdFxcdFxcdGJvb2wgY3Vycl9jaGFuZ2UgPSBmYWxzZTtcXG4gMzExOlxcdFxcbiAzMTI6XFx0XFx0XFx0XFx0ZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYsIHQsIFxcdTAwMjZjdXJyX2NoYW5nZSk7XFxuIDMxMzpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMTQ6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDMxNTpcXHRcXHRcXHRcXHR0Kys7XFxuIDMxNjpcXHRcXG4gMzE3OlxcdFxcdFxcdFxcdGlmIChjdXJyX2NoYW5nZSlcXG4gMzE4OlxcdFxcdFxcdFxcdFxcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XFxuIDMxOTpcXHRcXHRcXHRcXHRfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShwLCBcXHUwMDI2dl9zdGFydCwgXFx1MDAyNnZfZW5kLCB2LFxcbiAzMjA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgY3Vycl9jaGFuZ2UpO1xcbiAzMjE6XFx0XFx0XFx0fVxcbiAzMjI6XFx0XFx0XFx0aWYgKHZfc3RhcnQgXFx1MDAyNlxcdTAwMjYgdl9lbmQpXFxuIDMyMzpcXHRcXHRcXHRcXHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cXHUwMDNldmlkLCB2X2VuZC1cXHUwMDNldmlkLFxcbiAzMjQ6XFx0XFx0XFx0XFx0XFx0ICAgICAgIFJUTV9ORVdWTEFOKTtcXG4gMzI1OlxcdFxcdFxcdGlmIChlcnIpXFxuIDMyNjpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAzMjc6XFx0XFxuIDMyODpcXHRcXHRcXHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMzI5OlxcdFxcdFxcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0OTozOS41MjQ0NDgxNzNaIiwiU2VxIjo3NywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQzNTc1Mjk5OTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCdzIEludGVnZXIgT3ZlcmZsb3cgUHJldmVudGlvbioqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBjaGVjazogYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAgKmJlZm9yZSogdGhlIG1haW4gY29tcGFyaXNvbjogYCh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPSAodGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWQpYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBkZXNpZ25lZCB0byBoZWFkIG9mZiBhIHBvdGVudGlhbCBpbnRlZ2VyIHVuZGVyZmxvdy4gSWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgdGhlIHN1YnRyYWN0aW9uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCB3b3VsZCByZXN1bHQgaW4gYSBuZWdhdGl2ZSB2YWx1ZS4gIEJ1dCwgYW5kIHRoaXMgaXMgY3J1Y2lhbCwgaXQncyBoaWdobHkgcHJvYmFibGUgdGhhdCBgdmlkYCBpcyBhbiAqdW5zaWduZWQqIGludGVnZXIuIEdpdmVuIHRoYXQsIHRoYXQgXCJuZWdhdGl2ZVwiIGRpZmZlcmVuY2Ugd291bGQgYWN0dWFsbHkgd3JhcCBhcm91bmQsIGxlYWRpbmcgdG8gYSBtdWNoIGxhcmdlciBwb3NpdGl2ZSB2YWx1ZSBkdWUgdG8gdGhlIHdheSB1bnNpZ25lZCBhcml0aG1ldGljIHdvcmtzLiBUaGUgbmV3IGNoZWNrIHNlZW1zIHRvIHByZXZlbnQgdGhhdCB3aG9sZSB3cmFwLWFyb3VuZCBzY2VuYXJpby4gSSdtIHByZXR0eSBzdXJlIEkndmUgc2VlbiBgdmlkYCBkZWZpbmVkIGFzIHNvbWV0aGluZyBsaWtlIGEgYHUxNmAgYmVmb3JlLCB3aGljaCB3b3VsZCBjb25maXJtIHRoYXQgdW5zaWduZWQgYmVoYXZpb3IuIEp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQncyB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgYHN0cnVjdCB2dHVubmVsX2luZm9gIGRlZmluaXRpb24gdG8gY29uZmlybSB0aGUgYHZpZGAgdHlwZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzEzNCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjUxOjAzLjg4MTk4MzExNloiLCJTZXEiOjc4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjYyNDA3NzA3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgdnR1bm5lbF9pbmZvIFxcXFx7XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0xMS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MTI6c3RydWN0IHZ0dW5uZWxfaW5mbyB7XFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTEzLVxcdHUzMlxcdHR1bmlkO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo1MTowNi41MDYwNjY1OTRaIiwiU2VxIjo3OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTY1OTM5MzcyMTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGludHJvZHVjaW5nIGEgY2hlY2sgd2l0aGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLCBzcGVjaWZpY2FsbHkgYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAuIFRoZSBnb2FsIGlzIHRvIHByZXZlbnQgYSBwb3RlbnRpYWxseSBuYXN0eSBzaXR1YXRpb24gd2l0aGluIHRoYXQgYGZvcmAgbG9vcC4gTGV0IG1lIHJlZnJlc2ggbXkgbWVtb3J5OyB0aGUgcmVsZXZhbnQgY29kZSBibG9jayBpczpcblxuYGBgY1xuXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcblx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG5cdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZCkpXG5cdFx0XHRyZXR1cm4gLUVJTlZBTDtcblx0XHR0ID0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZDtcblx0XHRmb3IgKHYgPSB0aW5mb19sYXN0LVx1MDAzZXZpZDsgdiBcdTAwM2M9IHRpbmZvX2N1cnItXHUwMDNldmlkOyB2KyspIHtcbmBgYFxuXG5Jbml0aWFsbHksIG15IHRob3VnaHQgd2FzLCBpZiBgdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCB0aGF0IGxvb3Agd291bGQgZWl0aGVyIG5vdCBleGVjdXRlIGF0IGFsbCwgb3IgcG9zc2libHkgY2F1c2UgaW50ZWdlciB1bmRlcmZsb3cgaWYgYHZgIHdlcmUgdW5zaWduZWQsIGFuZCBlbmQgdXAgbG9vcGluZyBhbiBleGNlc3NpdmUgbnVtYmVyIG9mIHRpbWVzLiBJIHJlbWVtYmVyZWQgYHZgIGlzIGFuIGBpbnRgLCBzbyB0aGUgbG9vcCB3b3VsZCBzaW1wbHkgbm90IGV4ZWN1dGUgd2hlbiBgdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC1cdTAwM2V2aWRgLiBCdXQgdGhlbiBJIHJlYWxpemVkLCB0aGlzIGNoZWNrIGlzIHN0aWxsIGltcG9ydGFudCBiZWNhdXNlIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgYXJlIGB1MTZgIHR5cGVzLCB3aGljaCBpcyByZWxldmFudCBpbiBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0uIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgSSdtIHVuZGVyc3RhbmRpbmcgdGhlIGRhdGEgdHlwZXMgY29ycmVjdGx5IHRvIGZ1bGx5IGdyYXNwIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIG9mIHRoaXMgY29uZGl0aW9uLiBJIG5lZWQgdG8gY2hlY2sgdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB2dHVubmVsX2luZm9gIHRvIGNvbmZpcm0gdGhvc2UgZGF0YSB0eXBlcyBhbmQgdGhlIGludGVuZGVkIGJlaGF2aW9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNDk1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjUzOjUyLjQ0NTQ0MjMyMloiLCJTZXEiOjgwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDk3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTAsXG4gIFwiTGluZUNvdW50XCI6IDEwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMTA6XFx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxcbiAgMTE6XFx0XFxuICAxMjpcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvIHtcXG4gIDEzOlxcdFxcdHUzMlxcdHR1bmlkO1xcbiAgMTQ6XFx0XFx0dTE2XFx0dmlkO1xcbiAgMTU6XFx0XFx0dTE2XFx0ZmxhZ3M7XFxuICAxNjpcXHR9O1xcbiAgMTc6XFx0XFxuICAxODpcXHQvKiBicl9uZXRsaW5rX3R1bm5lbC5jICovXFxuICAxOTpcXHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo1Mzo1Mi40NDU1MTg3NzJaIiwiU2VxIjo4MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEzMzQ4NTQ1NjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFZMQU4gVHVubmVsIEluZm8gUGF0Y2gqKlxuXG5Pa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIGFkZGluZyBhIGNoZWNrIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oKWAgc3BlY2lmaWNhbGx5OiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYC4gIEkgc2VlIHRoYXQgaXQncyBkZXNpZ25lZCB0byBmaXggYSBzdWJ0bGUgbG9naWMgZmxhdywgYW5kIEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIGl0J3MgbmVlZGVkLlxuXG5Jbml0aWFsbHksIHRoZSBjb2RlIHdhcyBjb21wYXJpbmcgdGhlIGRpZmZlcmVuY2VzIG9mIGB2aWRgIGFuZCBgdHVuaWRgOiBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9ICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgLiBgdmlkYCBpcyBhIGB1MTZgLCBhbmQgYHR1bmlkYCBpcyBhIGB1MzJgLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGF0IGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBzdWJ0cmFjdGlvbiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZGAgd2lsbCAqdW5kZXJmbG93Ki4gSG93ZXZlciwgYmVjYXVzZSB0aGUgYHUxNmAgdHlwZXMgYXJlIHByb21vdGVkIHRvIGBpbnRgIGR1cmluZyB0aGUgc3VidHJhY3Rpb24sIHRoZSByZXN1bHQgd2lsbCBiZSBhIG5lZ2F0aXZlIGBpbnRgLiAgSSBrbm93IHRoYXQgY29tcGFyaXNvbiBgIT1gIHdpbGwgY29lcmNlIHRoYXQgYGludGAgdG8gYSBgdTMyYC4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBjYXVzZSBzb21lIGludGVyZXN0aW5nIGJlaGF2aW9yLlxuXG5JZiB0aGlzIHVuZGVyZmxvdyBoYXBwZW5zLCBhbmQgdGhlIHJlc3VsdCwgdGhlIG5lZ2F0aXZlIGBpbnRgLCBiZWNvbWVzIGEgdmVyeSBsYXJnZSBgdTMyYCB2YWx1ZSBkdWUgdG8gdGhlIGNvbnZlcnNpb24gdG8gdW5zaWduZWQuIEFuZCBpZiwgc29tZWhvdywgdGhlIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAgY2FsY3VsYXRpb24gaGFwcGVucyB0byAqYWxzbyogeWllbGQgdGhhdCBzYW1lIGxhcmdlIGB1MzJgIHZhbHVlLCB0aGUgaW5lcXVhbGl0eSB3b3VsZCBiZSBmYWxzZWx5IGV2YWx1YXRlZCBhcyB0cnVlISBUaGlzIHRoZW4gbGVhZHMgdG8gYW4gaW50ZXJlc3RpbmcgY2FzZTogdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIG1pZ2h0IHNraXAgZW50aXJlbHksIGJlY2F1c2UgdGhlIGxvb3AgY29uZGl0aW9uIHdvdWxkIG5vdCBiZSBtZXQuIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBsb29wIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZXMgYmVjYXVzZSB0aGUgc3RhcnQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBlbmQgdmFsdWUuXG5cbk9rYXksIHNvIEkgdW5kZXJzdGFuZCB0aGUgbG9naWMgZmxvdyBoZXJlLiBNeSBjb25jZXJuIHJpZ2h0IG5vdyBpcyBpcyB0aGlzIGEgY2FzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeT8gTm8sIGB0aW5mb19jdXJyYCBhbmQgYHRpbmZvX2xhc3RgIGFyZSBwb3B1bGF0ZWQgZnJvbSBuZXRsaW5rIGF0dHJpYnV0ZXMuIFRoZXkncmUgZWl0aGVyIGZ1bGx5IGluaXRpYWxpemVkIG9yIHZhbGlkYXRlZCBzbyB0aGVyZSdzIG5vIHdheSB0aGVyZSdzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB3b3JyeSBhYm91dCwgYW5kIHRoaXMgcGF0Y2ggaXNuJ3QgYWJvdXQgdGhhdC5cblxuVGhlIHBhdGNoIGFwcGVhcnMgdG8gZml4IGEgbG9naWMgZXJyb3IsIHdoZXJlIHRoaXMgbmVnYXRpdmUgcmFuZ2UgY29uZGl0aW9uICggYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAgKSBjb3VsZCBiZSB0cnVlIGFuZCBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IuIFNwZWNpZmljYWxseSwgdGhlIGxvb3AgaXMgc2tpcHBlZCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgKHN1Y2Nlc3MpIGV2ZW4gdGhvdWdoIGl0J3MgZWZmZWN0aXZlbHkgZG9pbmcgKm5vdGhpbmcqIHdpdGggYW4gaW52YWxpZCByYW5nZS4gIEl0IHNob3VsZCByZWFsbHkgYmUgcmV0dXJuaW5nIGFuIGVycm9yIGNvZGUuIGBFSU5WQUxgIGlzIHByb2JhYmx5IHRoZSByaWdodCBjaG9pY2UuXG5cblNvLCB0aGUgcGF0Y2ggaXMgYWRkaW5nIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIHRvIGV4cGxpY2l0bHkgcmV0dXJuIGAtRUlOVkFMYC4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgbG9naWMgYnVnLCBub3QgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYnVnLlxuXG5TbywgbGV0J3MgbmFpbCB0aGlzIGRvd24uIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCBgdGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgbmVnYXRpdmUuIEFuZCBpZiBgdGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgIGFsc28gaGFwcGVucyB0byBlcXVhbCB0aGUgc2FtZSBuZWdhdGl2ZSB2YWx1ZSwgdGhlIGluZXF1YWxpdHkgcGFzc2VzLiBUaGlzIHJlc3VsdHMgaW4gdGhlIGxvb3AgYmVpbmcgc2tpcHBlZCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5pbmcgMCwgZXZlbiB0aG91Z2ggaXQgKnNob3VsZG4ndCouIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgd2hpY2ggY291bGQgYnlwYXNzIHNvbWUgaW1wb3J0YW50IHZhbGlkYXRpb24uIEkgc3RpbGwgZG9uJ3Qgc2VlIGFueSBzaWduIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gS0FTQU4gb3Igc3RhbmRhcmQgdGVzdGluZyBtaWdodCBub3QgY2F0Y2ggdGhpcywgYnV0IGl04oCZcyBkZWZpbml0ZWx5IG5vdCBhIEtNU0FOIGlzc3VlLiBLTVNBTiBpcyBmb3IgZGV0ZWN0aW5nIG1lbW9yeSBpc3N1ZXMuXG5cblNpbmNlIHRoaXMgaXNuJ3QgYSBLTVNBTiBpc3N1ZSBJIGFtIGdvaW5nIHRvIHNldCBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cbkkgYW0gcmUtZXhhbWluaW5nIHRoZSBzaXR1YXRpb24sIGFuZCBJIGFtIHJlLWl0ZXJhdGluZyB0aGF0IHRoZSBjaGVjayBpcyBhZGRlZCB0byBwcmV2ZW50IG5lZ2F0aXZlIHJhbmdlIGxvb3BzIGZyb20gcnVubmluZy4gU28sIG5vLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuIFRoaXMgcGF0Y2ggcHJldmVudHMgbmVnYXRpdmUgcmFuZ2VzLiBTbyBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwNDMsIk91dHB1dFRva2VucyI6MTUwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTE2MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjU0OjMzLjc4MDM3NTgxN1oiLCJTZXEiOjgyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-14 14:19:59 +0000 UTC FinishedAt: 2026-08-14 14:54:34 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "c4f6916a99cf105c3ff340b6210fcbba3fa66b35", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BRIDGE", "BRIDGE_VLAN_FILTERING", "VLAN_8021Q" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "c4f6916a99cf105c3ff340b6210fcbba3fa66b35", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BRIDGE", "BRIDGE_VLAN_FILTERING", "VLAN_8021Q" ], "series_id": "4f5e1571-6e90-43e8-b792-a5a9d8e36f8d" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "br_process_vlan_tunnel_info", "br_vlan_tunnel_info", "br_parse_vlan_tunnel_info" ], "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+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTltPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUklER0UmIzM0OywKICAgICYjMzQ7QlJJREdFX1ZMQU5fRklMVEVSSU5HJiMzNDssCiAgICAmIzM0O1ZMQU5fODAyMVEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAgICYjMzQ7YnJfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICAgJiMzNDticl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgS01TQU4gdW5pbml0LXZhbHVlIGJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gV2hlbiBwcm9jZXNzaW5nIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUsIGlmIGEgdXNlciBwcm92aWRlcyBhIFZMQU4gdHVubmVsIHJhbmdlIHdoZXJlIHRoZSBlbmQgYHZpZGAgaXMgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgbWF0Y2hlcyB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSAod2hpY2ggaXMgcG9zc2libGUgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bnNpZ25lZCAzMi1iaXQgYXJpdGhtZXRpYyB3cmFwLWFyb3VuZCksIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGlzIGJ5cGFzc2VkLiBDb25zZXF1ZW50bHksIHRoZSBwcm9jZXNzaW5nIGxvb3AgZXhlY3V0ZXMgemVybyB0aW1lcywgbGVhdmluZyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzIGxhdGVyIGV2YWx1YXRlZCBhbmQgcG90ZW50aWFsbHkgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSwgY2F1c2luZyBhbiBpbmZvcm1hdGlvbiBsZWFrLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMTQgMTQ6MzU6MjcgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG5pbmRleCA3MWExMmRhMzAwMDRjLi4wNWY1NjBlZWI3ODljIDEwMDY0NFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcbkBAIC0zMDEsNyAmIzQzOzMwMSw4IEBAIGludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuIFxuIFx0XHRpZiAoISh0aW5mb19sYXN0LVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0aWYgKCh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuJiM0MztcdFx0aWYgKHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZCB8fFxuJiM0MztcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTNtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUklER0UmIzM0OywKICAgICYjMzQ7QlJJREdFX1ZMQU5fRklMVEVSSU5HJiMzNDssCiAgICAmIzM0O1ZMQU5fODAyMVEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAgICYjMzQ7YnJfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICAgJiMzNDticl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgS01TQU4gdW5pbml0LXZhbHVlIGJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gV2hlbiBwcm9jZXNzaW5nIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUsIGlmIGEgdXNlciBwcm92aWRlcyBhIFZMQU4gdHVubmVsIHJhbmdlIHdoZXJlIHRoZSBlbmQgYHZpZGAgaXMgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgbWF0Y2hlcyB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSAod2hpY2ggaXMgcG9zc2libGUgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bnNpZ25lZCAzMi1iaXQgYXJpdGhtZXRpYyB3cmFwLWFyb3VuZCksIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGlzIGJ5cGFzc2VkLiBDb25zZXF1ZW50bHksIHRoZSBwcm9jZXNzaW5nIGxvb3AgZXhlY3V0ZXMgemVybyB0aW1lcywgbGVhdmluZyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzIGxhdGVyIGV2YWx1YXRlZCBhbmQgcG90ZW50aWFsbHkgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSwgY2F1c2luZyBhbiBpbmZvcm1hdGlvbiBsZWFrLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMTQgMTQ6MzU6MjcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMKaW5kZXggNzFhMTJkYTMwMDA0Yy4uMDVmNTYwZWViNzg5YyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYwpAQCAtMzAxLDcgJiM0MzszMDEsOCBAQCBpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAogCQlpZiAoISh0aW5mb19sYXN0LSZndDtmbGFncyAmYW1wOyBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0KJiM0MzsJCWlmICh0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWQgfHwKJiM0MzsJCSAgICAodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKSAhPQogCQkgICAgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXQgPSB0aW5mb19sYXN0LSZndDt0dW5pZDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA0OAoJCQkJCQkJb3V0cHV0OiA0MgoJCQkJCQkJdGhvdWdodHM6IDEwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgdG8gbW9kaWZ5IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCB3aHkgdGhpcyBjaGFuZ2Ugd2FzIG5lZWRlZC4gVGhlIGRlc2NyaXB0aW9uIG1lbnRpb25zIGEgY2hlY2ssIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgLCBiZWluZyBhZGRlZC4gQWgsIGl0JiMzOTtzIHRvIHByZXZlbnQgdW5kZXJmbG93IG9yIGludmFsaWQgcmFuZ2VzIHdoZW4gcHJvY2Vzc2luZyBWTEFOIHR1bm5lbCBpbmZvcm1hdGlvbi4gVGhhdCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBXZSB3YW50IHRvIGVuc3VyZSB0aGUgVkxBTiBJRCAoVklEKSB2YWx1ZXMgYXJlIHByb2Nlc3NlZCBpbiBhIGxvZ2ljYWxseSBjb25zaXN0ZW50IGFuZCB2YWxpZCBzZXF1ZW5jZSwgcHJldmVudGluZyBwb3RlbnRpYWwgZXJyb3JzIG9yIHNlY3VyaXR5IGlzc3VlcyB0aGF0IGNvdWxkIGFyaXNlIGZyb20gdW5leHBlY3RlZCBWSUQgb3JkZXIuIEkmIzM5O2xsIG5lZWQgdG8gZGlnIGludG8gdGhlIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGZ1bmN0aW9uIGl0c2VsZiB0byBmdWxseSBncmFzcCB0aGUgY29udGV4dCBhbmQgdGhlIHBvdGVudGlhbCBpbXBhY3Qgb2YgdGhpcyBhZGRpdGlvbi4gVGltZSB0byBkaXZlIGludG8gdGhlIGNvZGUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4Ny1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjUyMwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBWTEFOIFR1bm5lbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IHJlbGF0ZWQgdG8gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIGEgY2xlYXIgcGljdHVyZSBvZiBpdHMgY2FsbCBncmFwaC4gV2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSBpbnZva2VkIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0gYXJjaGl0ZWN0dXJlPyBJIG5lZWQgdG8gdHJhY2UgaXRzIG9yaWdpbnMuIEkmIzM5O2xsIG5lZWQgdG8gaWRlbnRpZnkgYWxsIHRoZSBjYWxsIHNpdGVzIHRvIGZ1bGx5IGdyYXNwIGl0cyByb2xlIGFuZCBjb250ZXh0LiBVbmRlcnN0YW5kaW5nIHRoZSB1cHN0cmVhbSBkYXRhIGZsb3cgaXMga2V5IGhlcmUgdG8gaWRlbnRpZnkgcG90ZW50aWFsIHBvaW50cyBmb3Igb3B0aW1pemF0aW9uIG9yIGRlYnVnZ2luZyBsYXRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMC1cdFx0XHRcdHJldHVybiBlcnI7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MzE6XHRcdFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGJyLCBwLCBjbWQsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MzItXHRcdFx0XHRcdFx0XHQgIFx1MDAyNnRpbmZvX2N1cnIsXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4Ny1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG4tLVxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oPTE5PWludCBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvKHN0cnVjdCBubGF0dHIgKmF0dHIsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjAtXHRcdFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjIxOmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTIyLVx0XHRcdFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDc5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTA1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIHBpbnBvaW50ZWQgYSBwcm9taXNpbmcgdGFyZ2V0LiBUaGUgY29kZSBwYXRoIG9yaWdpbmF0ZXMgZnJvbSBgYnJfYWZzcGVjYCB3aXRoaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYC4gVGhhdCBmdW5jdGlvbiBoYW5kbGVzIGJyaWRnZSBuZXRsaW5rIG1lc3NhZ2Vz4oCUdGhpbmdzIGxpa2UgYFJUTV9TRVRMSU5LYCwgYFJUTV9ORVdMSU5LYCwgdGhhdCBraW5kIG9mIHN0dWZmLiBXaGljaCwgZm9yIG15IHB1cnBvc2VzLCBtYWtlcyBpdCBkZWZpbml0ZWx5IHJlYWNoYWJsZSBhbmQgd29ydGggbXkgdGltZS4gTXkgbWFpbiBpbnRlcmVzdCBsaWVzIGluIHRoZSBmdW5jdGlvbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoLCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBHb3R0YSBtYWtlIHN1cmUgZXZlcnl0aGluZyYjMzk7cyBpbiBwbGFjZSB0byBleHBsb2l0IHRoaXMgcHJvcGVybHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfbmV0bGlua190dW5uZWwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvTWFrZWZpbGU9OD1icmlkZ2UteVx0Oj0gYnIubyBicl9kZXZpY2UubyBicl9mZGIubyBicl9mb3J3YXJkLm8gYnJfaWYubyBicl9pbnB1dC5vIFxcXG4tLVxubmV0L2JyaWRnZS9NYWtlZmlsZS0xMC1cdFx0XHRicl9zdHBfaWYubyBicl9zdHBfdGltZXIubyBicl9uZXRsaW5rLm8gXFxcbm5ldC9icmlkZ2UvTWFrZWZpbGU6MTE6XHRcdFx0YnJfbmV0bGlua190dW5uZWwubyBicl9hcnBfbmRfcHJveHkub1xubmV0L2JyaWRnZS9NYWtlZmlsZS0xMi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDk2CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIG15c2VsZjoKCioqQnJpZGdlIE1vZHVsZSBCdWlsZCBEZXBlbmRlbmN5IElucXVpcnkqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYnVpbGQgcHJvY2VzcyBhbmQgaXQgc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaCAtIHRoZSBtb2R1bGUgYnVpbGRzICppZiogYENPTkZJR19CUklER0VgIGlzIGVuYWJsZWQuIEJ1dCwgaG9sZCBvbiBhIHNlY29uZOKApiBpc24mIzM5O3QgdGhlcmUgc29tZXRoaW5nIGVsc2UgaW5mbHVlbmNpbmcgdGhpcz8gSSBoYXZlIGEgZmVlbGluZyBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgbWlnaHQgYmUgaW4gcGxheSB0b28uIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUuIEJlc3QgdG8gY2hlY2sgdGhlIE1ha2VmaWxlIGZvciBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbGFncywgb3IgbWF5YmUgYGJyX25ldGxpbmtfdHVubmVsLmNgIHdvdWxkIGhhdmUgdGhlIGAjaWZkZWZgIGRpcmVjdGl2ZXMgSSBuZWVkLiBHb3R0YSB0cmFjayBkb3duIHdoZXJlIHRoaXMgbW9kdWxlJiMzOTtzIHRydWx5IGRlZmluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9NYWtlZmlsZSYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAgIDI6XHQjXG4gICAzOlx0IyBNYWtlZmlsZSBmb3IgdGhlIElFRUUgODAyLjFkIGV0aGVybmV0IGJyaWRnaW5nIGxheWVyLlxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRvYmotJChDT05GSUdfQlJJREdFKSAmIzQzOz0gYnJpZGdlLm9cbiAgIDc6XHRcbiAgIDg6XHRicmlkZ2UteVx0Oj0gYnIubyBicl9kZXZpY2UubyBicl9mZGIubyBicl9mb3J3YXJkLm8gYnJfaWYubyBicl9pbnB1dC5vIFxcXG4gICA5Olx0XHRcdFx0YnJfaW9jdGwubyBicl9zdHAubyBicl9zdHBfYnBkdS5vIFxcXG4gIDEwOlx0XHRcdFx0YnJfc3RwX2lmLm8gYnJfc3RwX3RpbWVyLm8gYnJfbmV0bGluay5vIFxcXG4gIDExOlx0XHRcdFx0YnJfbmV0bGlua190dW5uZWwubyBicl9hcnBfbmRfcHJveHkub1xuICAxMjpcdFxuICAxMzpcdGJyaWRnZS0kKENPTkZJR19TWVNGUykgJiM0Mzs9IGJyX3N5c2ZzX2lmLm8gYnJfc3lzZnNfYnIub1xuICAxNDpcdFxuICAxNTpcdGJyaWRnZS0kKHN1YnN0IG0seSwkKENPTkZJR19CUklER0VfTkVURklMVEVSKSkgJiM0Mzs9IGJyX25mX2NvcmUub1xuICAxNjpcdFxuICAxNzpcdGJyX25ldGZpbHRlci15IDo9IGJyX25ldGZpbHRlcl9ob29rcy5vXG4gIDE4Olx0YnJfbmV0ZmlsdGVyLSQoc3Vic3QgbSx5LCQoQ09ORklHX0lQVjYpKSAmIzQzOz0gYnJfbmV0ZmlsdGVyX2lwdjYub1xuICAxOTpcdG9iai0kKENPTkZJR19CUklER0VfTkVURklMVEVSKSAmIzQzOz0gYnJfbmV0ZmlsdGVyLm9cbiAgMjA6XHRcbiAgMjE6XHRicmlkZ2UtJChDT05GSUdfQlJJREdFX0lHTVBfU05PT1BJTkcpICYjNDM7PSBicl9tdWx0aWNhc3QubyBicl9tZGIubyBicl9tdWx0aWNhc3RfZWh0Lm9cbiAgMjI6XHRcbiAgMjM6XHRicmlkZ2UtJChDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HKSAmIzQzOz0gYnJfdmxhbi5vIGJyX3ZsYW5fdHVubmVsLm8gYnJfdmxhbl9vcHRpb25zLm8gYnJfbXN0Lm9cbiAgMjQ6XHRcbiAgMjU6XHRicmlkZ2UtJChDT05GSUdfTkVUX1NXSVRDSERFVikgJiM0Mzs9IGJyX3N3aXRjaGRldi5vXG4gIDI2Olx0XG4gIDI3Olx0b2JqLSQoQ09ORklHX05FVEZJTFRFUikgJiM0Mzs9IG5ldGZpbHRlci9cbiAgMjg6XHRcbiAgMjk6XHRicmlkZ2UtJChDT05GSUdfQlJJREdFX01SUClcdCYjNDM7PSBicl9tcnBfc3dpdGNoZGV2Lm8gYnJfbXJwLm8gYnJfbXJwX25ldGxpbmsub1xuICAzMDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MzAyCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogOTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6CgoqKkV4YW1pbmluZyBCcmlkZ2UgVHVubmVsIE1vZHVsZSBEZXBlbmRlbmNpZXMqKgoKUmlnaHQsIHNvIGBicl9uZXRsaW5rX3R1bm5lbC5vYCBpcyBwcmVkaWN0YWJseSBiYWtlZCBpbiB3aGVuZXZlciBgQ09ORklHX0JSSURHRWAgaXMgc2V0LiBTdGFuZGFyZCBzdHVmZi4gQnV0IGhhbmcgb24sIEkgc2VlbSB0byByZWNhbGwgdGhhdCBgYnJfdmxhbl90dW5uZWwub2AgZ2V0cyBidWlsdCBiYXNlZCBvbiB0aGUgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIG9wdGlvbi4gVGhhdCByaW5ncyBhIGJlbGwuIE5vdywgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHR3byBtb2R1bGVzLiBUaGUgZWFzaWVzdCB3YXkgaXMgYWx3YXlzIHRvIGp1c3QgZGl2ZSBpbnRvIHRoZSBjb2RlLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIHNvdXJjZSBmb3IgYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AgdG8gbG9vayBmb3IgYW55IGAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgZGlyZWN0aXZlcy4gVGhhdCBzaG91bGQgaW1tZWRpYXRlbHkgY2xhcmlmeSBpZiB0aGVyZSYjMzk7cyBhbnkgY29uZGl0aW9uYWwgaW5jbHVzaW9uIG9yIGZ1bmN0aW9uYWxpdHkgdGllZCB0byB0aGUgVkxBTiBmaWx0ZXJpbmcgZmVhdHVyZSB3aXRoaW4gdGhpcyBuZXRsaW5rIHR1bm5lbCBtb2R1bGUuIEl0JiMzOTtzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4gICAyOlx0LypcbiAgIDM6XHQgKlx0QnJpZGdlIHBlciB2bGFuIHR1bm5lbCBwb3J0IGRzdF9tZXRhZGF0YSBuZXRsaW5rIGNvbnRyb2wgaW50ZXJmYWNlXG4gICA0Olx0ICpcbiAgIDU6XHQgKlx0QXV0aG9yczpcbiAgIDY6XHQgKlx0Um9vcGEgUHJhYmh1XHRcdFx1MDAzY3Jvb3BhQGN1bXVsdXNuZXR3b3Jrcy5jb21cdTAwM2VcbiAgIDc6XHQgKi9cbiAgIDg6XHRcbiAgIDk6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuICAxMDpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAxMTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2V0aGVyZGV2aWNlLmhcdTAwM2VcbiAgMTI6XHQjaW5jbHVkZSBcdTAwM2NuZXQvcnRuZXRsaW5rLmhcdTAwM2VcbiAgMTM6XHQjaW5jbHVkZSBcdTAwM2NuZXQvbmV0X25hbWVzcGFjZS5oXHUwMDNlXG4gIDE0Olx0I2luY2x1ZGUgXHUwMDNjbmV0L3NvY2suaFx1MDAzZVxuICAxNTpcdCNpbmNsdWRlIFx1MDAzY3VhcGkvbGludXgvaWZfYnJpZGdlLmhcdTAwM2VcbiAgMTY6XHQjaW5jbHVkZSBcdTAwM2NuZXQvZHN0X21ldGFkYXRhLmhcdTAwM2VcbiAgMTc6XHRcbiAgMTg6XHQjaW5jbHVkZSBcJiMzNDticl9wcml2YXRlLmhcJiMzNDtcbiAgMTk6XHQjaW5jbHVkZSBcJiMzNDticl9wcml2YXRlX3R1bm5lbC5oXCYjMzQ7XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIHNpemVfdCBfX2dldF92bGFuX3RpbmZvX3NpemUodm9pZClcbiAgMjI6XHR7XG4gIDIzOlx0XHRyZXR1cm4gbmxhX3RvdGFsX3NpemUoMCkgJiM0MzsgLyogbmVzdCBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPICovXG4gIDI0Olx0XHRcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpICYjNDM7IC8qIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lEICovXG4gIDI1Olx0XHRcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUxNikpICYjNDM7IC8qIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX1ZJRCAqL1xuICAyNjpcdFx0XHQgIG5sYV90b3RhbF9zaXplKHNpemVvZih1MTYpKTsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1MgKi9cbiAgMjc6XHR9XG4gIDI4Olx0XG4gIDI5Olx0Ym9vbCB2bGFuX3R1bmlkX2lucmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9jdXJyLFxuICAzMDpcdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfbGFzdClcbiAgMzE6XHR7XG4gIDMyOlx0XHRfX2JlMzIgdHVuaWRfY3VyciA9IHR1bm5lbF9pZF90b19rZXkzMih2X2N1cnItXHUwMDNldGluZm8udHVubmVsX2lkKTtcbiAgMzM6XHRcdF9fYmUzMiB0dW5pZF9sYXN0ID0gdHVubmVsX2lkX3RvX2tleTMyKHZfbGFzdC1cdTAwM2V0aW5mby50dW5uZWxfaWQpO1xuICAzNDpcdFxuICAzNTpcdFx0cmV0dXJuIChiZTMyX3RvX2NwdSh0dW5pZF9jdXJyKSAtIGJlMzJfdG9fY3B1KHR1bmlkX2xhc3QpKSA9PSAxO1xuICAzNjpcdH1cbiAgMzc6XHRcbiAgMzg6XHRzdGF0aWMgaW50IF9fZ2V0X251bV92bGFuX3R1bm5lbF9pbmZvcyhzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZylcbiAgMzk6XHR7XG4gIDQwOlx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2LCAqdnRiZWdpbiA9IE5VTEwsICp2dGVuZCA9IE5VTEw7XG4gIDQxOlx0XHRpbnQgbnVtX3RpbmZvcyA9IDA7XG4gIDQyOlx0XG4gIDQzOlx0XHQvKiBDb3VudCBudW1iZXIgb2YgdmxhbiBpbmZvcyAqL1xuICA0NDpcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodiwgXHUwMDI2dmctXHUwMDNldmxhbl9saXN0LCB2bGlzdCkge1xuICA0NTpcdFx0XHQvKiBvbmx5IGEgY29udGV4dCwgYnJpZGdlIHZsYW4gbm90IGFjdGl2YXRlZCAqL1xuICA0NjpcdFx0XHRpZiAoIWJyX3ZsYW5fc2hvdWxkX3VzZSh2KSB8fCAhdi1cdTAwM2V0aW5mby50dW5uZWxfaWQpXG4gIDQ3Olx0XHRcdFx0Y29udGludWU7XG4gIDQ4Olx0XG4gIDQ5Olx0XHRcdGlmICghdnRiZWdpbikge1xuICA1MDpcdFx0XHRcdGdvdG8gaW5pdHZhcnM7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU1MDEKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiA1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIFRob3VnaHRzIG9uIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24uIFRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBhdCBtZSBpcyB0aGF0IGl0JiMzOTtzIGxvY2F0ZWQgd2l0aGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBUaGF0JiMzOTtzIGltcG9ydGFudCBjb250ZXh0LiBHaXZlbiB0aGUgZmlsZSBuYW1lLCBJJiMzOTttIGFscmVhZHkgYXNzdW1pbmcgdGhpcyBmdW5jdGlvbiBpcyBoZWF2aWx5IGludm9sdmVkIGluIGhhbmRsaW5nIFZMQU4tcmVsYXRlZCBjb25maWd1cmF0aW9ucywgcG90ZW50aWFsbHkgZm9yIHR1bm5lbGluZyBzY2VuYXJpb3Mgd2l0aGluIGEgTGludXggYnJpZGdlLiBIb3dldmVyLCBJIG5lZWQgdG8gY29uZmlybSB0aGlzIGFzc3VtcHRpb24uIE15IG5leHQgc3RlcCwgd2l0aG91dCBhIGRvdWJ0LCBpcyB0byBpbW1lZGlhdGVseSBjaGVjayBhbmQgc2VlIGlmIHRoaXMgZnVuY3Rpb24gaXMgY29uZGl0aW9uYWxseSBjb21waWxlZC4gSSBzdHJvbmdseSBzdXNwZWN0IGl0JiMzOTtzIGdvaW5nIHRvIGJlIGd1YXJkZWQgYnkgYSBgI2lmZGVmIENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIHByZXByb2Nlc3NvciBkaXJlY3RpdmUsIG9yIHNvbWV0aGluZyBzaW1pbGFyLiBUaGlzIGlzIGtleSBiZWNhdXNlIHRoYXQgd291bGQgdGVsbCBtZSB3aGV0aGVyIGl0cyBpbmNsdXNpb24gZGVwZW5kcyBvbiB3aGV0aGVyIFZMQU4gZmlsdGVyaW5nIHN1cHBvcnQgaGFzIGJlZW4gc3BlY2lmaWNhbGx5IGVuYWJsZWQgZHVyaW5nIHRoZSBrZXJuZWwgYnVpbGQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU4MDYKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBWTEFOIEludGVyYWN0aW9uKioKCkhtbSwgbm8sIHRoYXQgaW5pdGlhbCBhc3N1bXB0aW9uIGFib3V0IHRoZSBmdW5jdGlvbmFsaXR5IGlzIGluY29ycmVjdC4gSG93ZXZlciwgSSBjYW4gc2VlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBoZWF2aWx5IHJlbGllcyBvbiBgc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cGAgYW5kIG90aGVyIFZMQU4tc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzLiBUaGF0JiMzOTtzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTGV0IG1lIHRoaW5rLi4uIHBlcmhhcHMgZGlnZ2luZyBpbnRvIGBuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmhgIHdpbGwgcmV2ZWFsIGZ1cnRoZXIgaW5zaWdodHMuIEl0IG9mdGVuIGhvbGRzIG1vcmUgZGV0YWlscyBhYm91dCBpbnRlcm5hbCBicmlkZ2Ugd29ya2luZ3MsIGFuZCB0aGVyZSBpcyBhIGRlY2VudCBjaGFuY2UgdGhlcmUgYXJlIHByaXZhdGUgdHVubmVsIGltcGxlbWVudGF0aW9ucyBkZWZpbmVkIGluIHRoYXQgaGVhZGVyLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aG9zZSBzdHJ1Y3R1cmVzIHRvIGdldCBhIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MzI9aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMzQtXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MzU6I2lmZGVmIENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zNi0vKiBicl92bGFuX3R1bm5lbC5jICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDYxNTgKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBkaXZlIGludG8gaG93IFZMQU4gdHVubmVsaW5nIGlzIGhhbmRsZWQgd2l0aGluIHRoZSBicmlkZ2UuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgbGlrZWx5IHNvdXJjZSwgZ2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGJyaWRnZSBpbnRlcm5hbHMuIEkmIzM5O20gdGhpbmtpbmcgdGhhdCB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMgc2hvdWxkIGJlIGRlZmluZWQgb3IgZGVjbGFyZWQgaW4gYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAuIExldCYjMzk7cyBjb25maXJtIHRoYXQgaHlwb3RoZXNpcyBhbmQgc2VlIHdoYXQgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgYWxsIGFib3V0LiBUaGlzIGZ1bmN0aW9uIG5hbWUgc3Ryb25nbHkgc3VnZ2VzdHMgaXQmIzM5O3MgaW52b2x2ZWQgaW4gcHJvY2Vzc2luZyBvciBleHRyYWN0aW5nIHR1bm5lbC1yZWxhdGVkIFZMQU4gaW5mb3JtYXRpb24sIGJ1dCB0aGUgZXhhY3QgZGV0YWlscyBJJiMzOTtsbCBoYXZlIHRvIGFzY2VydGFpbiBieSByZWFkaW5nIHRoZSBjb2RlIHdpdGhpbiB0aGlzIGhlYWRlci4gTXkgZXhwZXJ0aXNlIGd1aWRlcyBtZSB0byB0aGUgbGlrZWx5IGxvY2F0aW9uLCBub3cgSSBqdXN0IGhhdmUgdG8gbG9vay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0xOT1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTIwLVx0XHRcdCAgICAgIHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvKTtcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyMTppbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMi1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY1MzkKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBhIFN5c3RlbSBEZWNsYXJhdGlvbioqCgpSaWdodCwgc28gdGhpcyB0aGluZyBpcyBkZWNsYXJlZCB1bmNvbmRpdGlvbmFsbHkuIFRoYXQmIzM5O3MgYSBzdGFydGluZyBwb2ludCwgbm90IHBhcnRpY3VsYXJseSBoZWxwZnVsIGluIGl0c2VsZi4gVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIGFsd2F5cyB0byB0cmFjZSBpdHMgdXNhZ2UuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0LCBzZWUgd2hlcmUgaXQmIzM5O3MgYmVpbmcgKmNhbGxlZCogdG8gZ3Jhc3AgaXRzIHNpZ25pZmljYW5jZS4gTGV0JiMzOTtzIGRpZyBpbnRvIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AuIFRoYXQmIzM5O3Mgd2hlcmUgSSYjMzk7ZCBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgY29kZSBpZiBpdCYjMzk7cyByZWxhdGVkIHRvIHRoZSBicmlkZ2UgbmV0bGluayBpbnRlcmZhY2UsIHdoaWNoLCBnaXZlbiB0aGUgZmlsZW5hbWUsIHNlZW1zIGhpZ2hseSBsaWtlbHkuIFRpbWUgdG8gc2VlIGhvdyB0aGlzIHRoaW5nIGlzIGJlaW5nICp1c2VkKiB3aXRoaW4gdGhhdCBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMC1cdFx0XHRcdHJldHVybiBlcnI7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MzE6XHRcdFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGJyLCBwLCBjbWQsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MzItXHRcdFx0XHRcdFx0XHQgIFx1MDAyNnRpbmZvX2N1cnIsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4ODIKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gYnJfYWZzcGVjKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcy4gSSYjMzk7bSBnb2luZyB0byBmb2N1cyBvbiBgYnJfYWZzcGVjYCB3aXRoaW4gdGhlIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AgZmlsZS4gVGhpcyBsaWtlbHkgcmVsYXRlcyB0byBob3cgdGhlIGJyaWRnaW5nIGNvZGUgaW50ZXJhY3RzIHdpdGggc3BlY2lmaWMgYWRkcmVzcyBmYW1pbHkgc3BlY2lmaWNhdGlvbnMsIHByb2JhYmx5IHRocm91Z2ggdGhlIE5ldGxpbmsgaW50ZXJmYWNlLiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBoYW5kbGluZyBmb3Igc29tZSBjdXN0b20gb3Igc3BlY2lmaWMgQUYgKEFkZHJlc3MgRmFtaWx5KSByZWxhdGVkIG9wZXJhdGlvbnMgb3IgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBicmlkZ2UuIEdpdmVuIHRoZSBjb250ZXh0LCBJJiMzOTttIGFudGljaXBhdGluZyB0aGlzIHdpbGwgaW52b2x2ZSBpbnRlcmFjdGlvbnMgd2l0aCBOZXRsaW5rIG1lc3NhZ2VzLCBwYXJzaW5nIHNwZWNpZmljIGF0dHJpYnV0ZXMsIGFuZCBwcm9iYWJseSBzb21lIGxvZ2ljIHJlbGF0ZWQgdG8gc2V0dGluZyBvciBxdWVyeWluZyBicmlkZ2Utc3BlY2lmaWMgcGFyYW1ldGVycyBiYXNlZCBvbiB0aGF0IGFkZHJlc3MgZmFtaWx5LiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciB0aGUgZW50cnkgcG9pbnQgb3IgcHJpbWFyeSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlc2UgYWRkcmVzcyBmYW1pbHkgc3BlY2lmaWMgcmVxdWVzdHMsIGFuZCBob3cgdGhleSBpbnRlZ3JhdGUgd2l0aGluIHRoZSBicm9hZGVyIGJyaWRnZSBtYW5hZ2VtZW50IHNjaGVtZS4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODAwOlx0XHR9XG4gODAxOlx0XG4gODAyOlx0XHRlcnIgPSBicl92bGFuX2luZm8oYnIsIHAsIGNtZCwgdmluZm9fY3VyciwgY2hhbmdlZCwgZXh0YWNrKTtcbiA4MDM6XHRcdGlmICgqY2hhbmdlZClcbiA4MDQ6XHRcdFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZpbmZvX2N1cnItXHUwMDNldmlkLCAwLCBydG1fY21kKTtcbiA4MDU6XHRcbiA4MDY6XHRcdHJldHVybiBlcnI7XG4gODA3Olx0fVxuIDgwODpcdFxuIDgwOTpcdHN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbiA4MTA6XHRcdFx0ICAgICBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuIDgxMTpcdFx0XHQgICAgIHN0cnVjdCBubGF0dHIgKmFmX3NwZWMsXG4gODEyOlx0XHRcdCAgICAgaW50IGNtZCwgYm9vbCAqY2hhbmdlZCxcbiA4MTM6XHRcdFx0ICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gODE0Olx0e1xuIDgxNTpcdFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2N1cnIgPSBOVUxMO1xuIDgxNjpcdFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2xhc3QgPSBOVUxMO1xuIDgxNzpcdFx0c3RydWN0IG5sYXR0ciAqYXR0cjtcbiA4MTg6XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gdGluZm9fbGFzdCA9IHt9O1xuIDgxOTpcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19jdXJyID0ge307XG4gODIwOlx0XHRpbnQgZXJyID0gMCwgcmVtO1xuIDgyMTpcdFxuIDgyMjpcdFx0bmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBhZl9zcGVjLCByZW0pIHtcbiA4MjM6XHRcdFx0ZXJyID0gMDtcbiA4MjQ6XHRcdFx0c3dpdGNoIChubGFfdHlwZShhdHRyKSkge1xuIDgyNTpcdFx0XHRjYXNlIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lORk86XG4gODI2Olx0XHRcdFx0aWYgKCFwIHx8ICF0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKVxuIDgyNzpcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gODI4Olx0XHRcdFx0ZXJyID0gYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhhdHRyLCBcdTAwMjZ0aW5mb19jdXJyKTtcbiA4Mjk6XHRcdFx0XHRpZiAoZXJyKVxuIDgzMDpcdFx0XHRcdFx0cmV0dXJuIGVycjtcbiA4MzE6XHRcdFx0XHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oYnIsIHAsIGNtZCxcbiA4MzI6XHRcdFx0XHRcdFx0XHRcdCAgXHUwMDI2dGluZm9fY3VycixcbiA4MzM6XHRcdFx0XHRcdFx0XHRcdCAgXHUwMDI2dGluZm9fbGFzdCxcbiA4MzQ6XHRcdFx0XHRcdFx0XHRcdCAgY2hhbmdlZCk7XG4gODM1Olx0XHRcdFx0aWYgKGVycilcbiA4MzY6XHRcdFx0XHRcdHJldHVybiBlcnI7XG4gODM3Olx0XHRcdFx0YnJlYWs7XG4gODM4Olx0XHRcdGNhc2UgSUZMQV9CUklER0VfVkxBTl9JTkZPOlxuIDgzOTpcdFx0XHRcdGlmIChubGFfbGVuKGF0dHIpICE9IHNpemVvZihzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbykpXG4gODQwOlx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA4NDE6XHRcdFx0XHR2aW5mb19jdXJyID0gbmxhX2RhdGEoYXR0cik7XG4gODQyOlx0XHRcdFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX2luZm8oYnIsIHAsIGNtZCwgdmluZm9fY3VycixcbiA4NDM6XHRcdFx0XHRcdFx0XHQgICBcdTAwMjZ2aW5mb19sYXN0LCBjaGFuZ2VkLFxuIDg0NDpcdFx0XHRcdFx0XHRcdCAgIGV4dGFjayk7XG4gODQ1Olx0XHRcdFx0aWYgKGVycilcbiA4NDY6XHRcdFx0XHRcdHJldHVybiBlcnI7XG4gODQ3Olx0XHRcdFx0YnJlYWs7XG4gODQ4Olx0XHRcdGNhc2UgSUZMQV9CUklER0VfTVJQOlxuIDg0OTpcdFx0XHRcdGVyciA9IGJyX21ycF9wYXJzZShiciwgcCwgYXR0ciwgY21kLCBleHRhY2spO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3OTUzCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogODgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlOgoKKipEaXZpbmcgaW50byBWTEFOIFR1bm5lbGluZyB3aXRoIEJyaWRnZSBQb3J0cyoqCgpBbHJpZ2h0LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBob3cgVkxBTiB0dW5uZWxpbmcgd29ya3Mgd2l0aGluIHRoZSBicmlkZ2UgZnJhbWV3b3JrLiBJJiMzOTt2ZSByZWFsaXplZCB0aGF0IHRoZSBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBmdW5jdGlvbiBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggYElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lORk9gIHdpdGhpbiBgSUZMQV9BRl9TUEVDYCwgd2hpY2ggaXMsIG9mIGNvdXJzZSwgYXNzb2NpYXRlZCB3aXRoIGEgYnJpZGdlIHBvcnQuIFRoZSBrZXkgaGVyZSwgYXMgYWx3YXlzLCBpcyB0aGF0IHRoZSBwb3J0IGl0c2VsZiBuZWVkcyB0byBoYXZlIHRoZSBgQlJfVkxBTl9UVU5ORUxfQklUYCBmbGFnIHNldCB3aXRoaW4gaXRzIGZsYWdzIChgcC0mZ3Q7ZmxhZ3NgLCBzcGVjaWZpY2FsbHkpLiBOb3csIHRoZSBtaWxsaW9uIGRvbGxhciBxdWVzdGlvbiwgb3IgcmF0aGVyLCB0aGUga2V5IHRvIHVubG9ja2luZyB0aGlzIHdob2xlIGZlYXR1cmUsIGlzICpob3cqIGV4YWN0bHkgZG9lcyB0aGF0IGBCUl9WTEFOX1RVTk5FTF9CSVRgIGdldCBzZXQgaW4gdGhlIGZpcnN0IHBsYWNlPyBUaW1lIHRvIGdvIGh1bnRpbmcgdGhyb3VnaCB0aGUgY29kZWJhc2UgYW5kIHNlZSB3aGVyZSB0aGF0IGZsYWcgaXMgYmVpbmcgbWFuaXB1bGF0ZWQuIFRoYXQmIzM5O3MgdGhlIGNyaXRpY2FsIHBpZWNlIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRvIGZ1bGx5IGdyYXNwIHRoZSBpbXBsZW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QlJfVkxBTl9UVU5ORUxfQklUJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9pbnB1dC5jPTMzOT1zdGF0aWMgcnhfaGFuZGxlcl9yZXN1bHRfdCBicl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKVxuLS1cbm5ldC9icmlkZ2UvYnJfaW5wdXQuYy0zNjEtXHRwID0gYnJfcG9ydF9nZXRfcmN1KHNrYi1cdTAwM2VkZXYpO1xubmV0L2JyaWRnZS9icl9pbnB1dC5jOjM2MjpcdGlmICh0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9pbnB1dC5jLTM2My1cdFx0YnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc2tiLCBwLCBuYnBfdmxhbl9ncm91cF9yY3UocCkpO1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTkzPXN0YXRpYyBzaXplX3QgYnJfZ2V0X2xpbmtfYWZfc2l6ZV9maWx0ZXJlZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjExNjpcdGlmIChwIFx1MDAyNlx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTE3LVx0XHR2aW5mb19zeiAmIzQzOz0gYnJfZ2V0X3ZsYW5fdHVubmVsX2luZm9fc2l6ZSh2Zyk7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9NDU4PXN0YXRpYyBpbnQgYnJfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy01NDItXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo1NDM6XHRcdGlmIChwb3J0IFx1MDAyNlx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnBvcnQtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQ0LVx0XHRcdGVyciA9IGJyX2ZpbGxfdmxhbl90dW5uZWxfaW5mbyhza2IsIHZnKTtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNS1cdFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPOlxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODI2Olx0XHRcdGlmICghcCB8fCAhdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNy1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLS1cbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM9MTYwPXN0YXRpYyBpbnQgYnJfdmxhbl9tb2RpZnlfdHVubmVsKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXG4tLVxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYy0xNzQtXHR9XG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjE3NTpcdGlmICghdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSkge1xubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYy0xNzYtXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O1BvcnQgZG9lc24mIzM5O3QgaGF2ZSB0dW5uZWwgZmxhZyBzZXRcJiMzNDspO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTk5CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIGBCUl9WTEFOX1RVTk5FTF9CSVRgKioKCk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIEkgc2VlIGBCUl9WTEFOX1RVTk5FTF9CSVRgLiBJdCBzdHJpa2VzIG1lIGFzIGEgYml0IGZsYWcsIGVpdGhlciBhbiBlbnVtIG9yIGEgc2ltcGxlICNkZWZpbmUuIFRoZSBuYW1lJiMzOTtzIHN1Z2dlc3RpdmUgZW5vdWdoLCBidXQgSSBuZWVkIHRvIGNvbmZpcm0gaXRzIGV4YWN0IGRlZmluaXRpb24uIExldCYjMzk7cyB0cmFjZSB0aGlzIGFuZCBxdWlja2x5IHBpbnBvaW50IHdoZXJlIGBCUl9WTEFOX1RVTk5FTF9CSVRgIGlzIGFjdHVhbGx5IGRlY2xhcmVkLiBUaGF0JiMzOTtsbCB0ZWxsIG1lIGl0cyBzY29wZSwgaXRzIHR5cGUsIGFuZCB1bHRpbWF0ZWx5LCBob3cgaXQmIzM5O3MgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGxhcmdlciBjb250ZXh0IG9mIHRoaXMgVkxBTiB0dW5uZWxpbmcgaW1wbGVtZW50YXRpb24uIEdvdHRhIGZpZ3VyZSBvdXQgd2hhdCYjMzk7cyBnb2luZyBvbiB1bmRlciB0aGUgaG9vZCBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtCUl9WTEFOX1RVTk5FTF9CSVQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oPTM5PWVudW0gYnJpZGdlX2ZsYWdzX2JpdCB7XG4tLVxuaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaC01Mi1cdEJSX01VTFRJQ0FTVF9UT19VTklDQVNUX0JJVCxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg6NTM6XHRCUl9WTEFOX1RVTk5FTF9CSVQsXG5pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oLTU0LVx0QlJfQkNBU1RfRkxPT0RfQklULFxuLS1cbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtODAtI2RlZmluZSBCUl9NVUxUSUNBU1RfVE9fVU5JQ0FTVFx0QklUKEJSX01VTFRJQ0FTVF9UT19VTklDQVNUX0JJVClcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg6ODE6I2RlZmluZSBCUl9WTEFOX1RVTk5FTFx0XHRCSVQoQlJfVkxBTl9UVU5ORUxfQklUKVxuaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaC04Mi0jZGVmaW5lIEJSX0JDQVNUX0ZMT09EXHRcdEJJVChCUl9CQ0FTVF9GTE9PRF9CSVQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0NDgKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipCUl9WTEFOX1RVTk5FTCBJbnZlc3RpZ2F0aW9uKioKCkFscmlnaHQsIGl0JiMzOTtzIGp1bXBpbmcgb3V0IGF0IG1lIGFzIGBCUl9WTEFOX1RVTk5FTGAuIFRpbWUgdG8gZGlnIGluLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB0cmFjZSBpdHMgdXNhZ2UuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0cyBpbiB3aGljaCB0aGlzIGJyaWRnZSBWTEFOIHR1bm5lbCBpcyBlbXBsb3llZC4gSSBuZWVkIHRvIGtub3cgdGhlIGNhbGxpbmcgZnVuY3Rpb25zLCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaW4gZWFjaCBzY2VuYXJpby4gS25vd2luZyB3aGVyZSBpdCYjMzk7cyB1c2VkIHdpbGwgYmUgY3JpdGljYWwgZm9yIGZvcm1pbmcgYSBjb2hlc2l2ZSBtZW50YWwgbW9kZWwuIEkmIzM5O2xsIG5lZWQgdG8gcmFwaWRseSBpZGVudGlmeSBrZXkgZGVwZW5kZW5jaWVzIGFuZCBhbnkgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4gYmFzZWQgb24gdGhlIHN1cnJvdW5kaW5nIGNvZGUuIE15IGZvY3VzIHdpbGwgYmUgb24gdGhlIGVkZ2UgY2FzZXMgYW5kIGhvdyB0aGlzIHR1bm5lbCBpbnRlcmFjdHMgd2l0aCB0aGUgb3ZlcmFsbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlLiBOb3csIGxldCYjMzk7cyBnZXQgdG8gd29yayBhbmQgZmluZCB0aGUgY2FsbHNpdGVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtCUl9WTEFOX1RVTk5FTCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfaW5wdXQuYz0zMzk9c3RhdGljIHJ4X2hhbmRsZXJfcmVzdWx0X3QgYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBza19idWZmICoqcHNrYilcbi0tXG5uZXQvYnJpZGdlL2JyX2lucHV0LmMtMzYxLVx0cCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItXHUwMDNlZGV2KTtcbm5ldC9icmlkZ2UvYnJfaW5wdXQuYzozNjI6XHRpZiAodGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfaW5wdXQuYy0zNjMtXHRcdGJyX2hhbmRsZV9pbmdyZXNzX3ZsYW5fdHVubmVsKHNrYiwgcCwgbmJwX3ZsYW5fZ3JvdXBfcmN1KHApKTtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz05Mz1zdGF0aWMgc2l6ZV90IGJyX2dldF9saW5rX2FmX3NpemVfZmlsdGVyZWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy0xMTUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoxMTY6XHRpZiAocCBcdTAwMjZcdTAwMjYgdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNy1cdFx0dmluZm9fc3ogJiM0Mzs9IGJyX2dldF92bGFuX3R1bm5lbF9pbmZvX3NpemUodmcpO1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTIzND1zdGF0aWMgaW50IGJyX3BvcnRfZmlsbF9hdHRycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTI3Ni1cdCAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfVkxBTl9UVU5ORUwsICEhKGZsYWdzIFx1MDAyNlxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6Mjc3Olx0XHRcdFx0XHRcdFx0QlJfVkxBTl9UVU5ORUwpKSB8fFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMjc4LVx0ICAgIG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9CUlBPUlRfR1JPVVBfRldEX01BU0ssIHAtXHUwMDNlZ3JvdXBfZndkX21hc2spIHx8XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9NDU4PXN0YXRpYyBpbnQgYnJfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy01NDItXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo1NDM6XHRcdGlmIChwb3J0IFx1MDAyNlx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnBvcnQtXHUwMDNlZmxhZ3MpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQ0LVx0XHRcdGVyciA9IGJyX2ZpbGxfdmxhbl90dW5uZWxfaW5mbyhza2IsIHZnKTtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNS1cdFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPOlxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODI2Olx0XHRcdGlmICghcCB8fCAhdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcdTAwMjZwLVx1MDAzZWZsYWdzKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyNy1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTk1MT1zdGF0aWMgaW50IGJyX3NldHBvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IG5sYXR0ciAqdGJbXSxcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NTktXHRvbGRfZmxhZ3MgPSBSRUFEX09OQ0UocC1cdTAwM2VmbGFncyk7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5NjA6XHRicl92bGFuX3R1bm5lbF9vbGQgPSAob2xkX2ZsYWdzIFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkgPyB0cnVlIDogZmFsc2U7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NjEtXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtOTc4LVx0YnJfc2V0X3BvcnRfZmxhZyhcdTAwMjZzZXQsIFx1MDAyNmNsZWFyLCB0YiwgSUZMQV9CUlBPUlRfVkxBTl9UVU5ORUwsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5Nzk6XHRcdFx0IEJSX1ZMQU5fVFVOTkVMKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTk4MC1cdGJyX3NldF9wb3J0X2ZsYWcoXHUwMDI2c2V0LCBcdTAwMjZjbGVhciwgdGIsIElGTEFfQlJQT1JUX05FSUdIX1NVUFBSRVNTLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTEwMTYtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoxMDE3Olx0aWYgKGJyX3ZsYW5fdHVubmVsX29sZCBcdTAwMjZcdTAwMjYgIShmbGFncyBcdTAwMjYgQlJfVkxBTl9UVU5ORUwpKVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTAxOC1cdFx0bmJwX3ZsYW5fdHVubmVsX2luZm9fZmx1c2gocCk7XG4tLVxubmV0L2JyaWRnZS9icl92bGFuLmM9NDgwPXN0cnVjdCBza19idWZmICpicl9oYW5kbGVfdmxhbihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4tLVxubmV0L2JyaWRnZS9icl92bGFuLmMtNTMwLVxubmV0L2JyaWRnZS9icl92bGFuLmM6NTMxOlx0aWYgKHAgXHUwMDI2XHUwMDI2IChwLVx1MDAzZWZsYWdzIFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkgXHUwMDI2XHUwMDI2XG5uZXQvYnJpZGdlL2JyX3ZsYW4uYy01MzItXHQgICAgYnJfaGFuZGxlX2VncmVzc192bGFuX3R1bm5lbChza2IsIHYpKSB7XG4tLVxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTE3NC1cdH1cbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM6MTc1Olx0aWYgKCF0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFx1MDAyNnAtXHUwMDNlZmxhZ3MpKSB7XG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTE3Ni1cdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXCYjMzQ7UG9ydCBkb2VzbiYjMzk7dCBoYXZlIHR1bm5lbCBmbGFnIHNldFwmIzM0Oyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMDA4CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogMTc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgdGhlIFZMQU4gVHVubmVsIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcywgYW5kIGl0IGxvb2tzIGxpa2UgSSBjYW4gbWFuaXB1bGF0ZSBgQlJfVkxBTl9UVU5ORUxgIHRocm91Z2ggYElGTEFfQlJQT1JUX1ZMQU5fVFVOTkVMYCB1c2luZyBgYnJfc2V0cG9ydGAuIFRoYXQmIzM5O3MgYSBnb29kIGVudHJ5IHBvaW50OyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHNob3VsZCBwcmlvcml0aXplIGZvciBmdXp6aW5nLiBJdCYjMzk7cyBhIGNsZWFyIHBhdGggdG8gcmVhY2ggdGhlIHJlbGV2YW50IGNvZGUuCgpOb3csIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywganVzdCB0byBiZSBzdXJlLiBBbHJpZ2h0LCBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYCBzZWVtcyB0byBiZSBjb21waWxlZCB1bmNvbmRpdGlvbmFsbHksIGFzIGxvbmcgYXMgYENPTkZJR19CUklER0VgIGlzIGVuYWJsZWQuIEJ1dCwgYWhhLCB0aGUgZnVuY3Rpb25zIG9mIGludGVyZXN0LCBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBpcyAqYWxzbyogaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AuCgpXYWl0IGEgbWludXRlLCBJIG5lZWQgdG8gY29uZmlybSBzb21ldGhpbmcuIElzIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBhICpyZXF1aXJlbWVudCogZm9yIGFjdHVhbGx5ICp1c2luZyogdGhlc2UgVkxBTiB0dW5uZWxzPyBMZXQgbWUgcXVpY2tseSByZXZpZXcgaG93IGBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvYCBhbmQgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaGFuZGxlIHRoaW5ncyBpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gR290dGEgZ2V0IHRoZSBwcmVjb25kaXRpb25zIHJpZ2h0IGJlZm9yZSBJIHN0YXJ0IHRocm93aW5nIHBheWxvYWRzIGF0IGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4Ny1cdFx0XHRcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjQ1CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgdGFraW5nIG9uIHRoZSBwZXJzb25hIHlvdSYjMzk7dmUgcmVxdWVzdGVkLCBhcyBhbiBleHBlcnQgaW4gdGhlIGZpZWxkOgoKKipJbnZlc3RpZ2F0aW5nIFZMQU4gRmlsdGVyaW5nIERlcGVuZGVuY3kgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gcXVpY2tseSB2ZXJpZnkgaWYgdGhlIGZ1bmN0aW9uIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGFjdHVhbGx5ICp1c2VzKiB0aGUgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBXZSBhbGwga25vdyBob3cgaW1wb3J0YW50IGl0IGlzIHRvIGtlZXAgb3VyIGNvZGUgY2xlYW4gYW5kIGVmZmljaWVudCwgYW5kIHVubmVjZXNzYXJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgYWRkIG92ZXJoZWFkLiBTbywgSSBuZWVkIHRvIHNlZSBpZiB0aGlzIGZ1bmN0aW9uJiMzOTtzIGJlaGF2aW91ciBpcyBhZmZlY3RlZCBieSB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBWTEFOIGZpbHRlcmluZy4gSSYjMzk7bGwgbmVlZCB0byB0cmFjZSBpdHMgY2FsbCBncmFwaCBhbmQgbG9vayBmb3IgYW55IGRpcmVjdCBvciBpbmRpcmVjdCBkZXBlbmRlbmNpZXMgb24gdGhhdCBzcGVjaWZpYyBjb25maWcgc3ltYm9sLiBJJiMzOTttIHRoaW5raW5nIEkmIzM5O2xsIHN0YXJ0IHdpdGggYSBxdWljayBjb2RlIHNlYXJjaCBhbmQgcG90ZW50aWFsbHkgYSBzdGF0aWMgYW5hbHlzaXMgdG9vbCwgdG8gcGlucG9pbnQgYW55IG9idmlvdXMgY29uZGl0aW9uYWwgYmxvY2tzLiBGcm9tIHRoZXJlIEkgY2FuIGRldGVybWluZSBpZiB0aGlzIGlzIGEgY3JpdGljYWwgZGVwZW5kZW5jeSwgYSBtaW5vciBvcHRpbWl6YXRpb24sIG9yIHBvc3NpYmx5IGV2ZW4gYSBjb21wbGV0ZWx5IGlycmVsZXZhbnQgY2hlY2suIExldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSB3aGF0IHdlIGZpbmQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyODA6XHRvdXRfaW5pdDpcbiAyODE6XHRcdC8qIHdlIHN0YXJ0IGEgcmFuZ2Ugb25seSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgdG8gbm90aWZ5IGFib3V0ICovXG4gMjgyOlx0XHQqdl9zdGFydCA9IGN1cnJfY2hhbmdlID8gdiA6IE5VTEw7XG4gMjgzOlx0XHQqdl9lbmQgPSAqdl9zdGFydDtcbiAyODQ6XHR9XG4gMjg1Olx0XG4gMjg2Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gMjg3Olx0XHRcdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuIDI4ODpcdFx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcbiAyODk6XHRcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG4gMjkwOlx0XHRcdFx0XHRib29sICpjaGFuZ2VkKVxuIDI5MTpcdHtcbiAyOTI6XHRcdGludCBlcnI7XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDI5NTpcdFx0XHRpZiAodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcbiAyOTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyOTc6XHRcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiAzMTg6XHRcdFx0XHRcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XG4gMzE5Olx0XHRcdFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXHUwMDI2dl9zdGFydCwgXHUwMDI2dl9lbmQsIHYsXG4gMzIwOlx0XHRcdFx0XHRcdFx0ICAgY3Vycl9jaGFuZ2UpO1xuIDMyMTpcdFx0XHR9XG4gMzIyOlx0XHRcdGlmICh2X3N0YXJ0IFx1MDAyNlx1MDAyNiB2X2VuZClcbiAzMjM6XHRcdFx0XHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cdTAwM2V2aWQsIHZfZW5kLVx1MDAzZXZpZCxcbiAzMjQ6XHRcdFx0XHRcdCAgICAgICBSVE1fTkVXVkxBTik7XG4gMzI1Olx0XHRcdGlmIChlcnIpXG4gMzI2Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAzMjc6XHRcbiAzMjg6XHRcdFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMzI5Olx0XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjgxMQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXAgaW4gdGhlIHdlZWRzIG9mIG5ldHdvcmsgYnJpZGdlIGNvZGUsIGFuZCBzcGVha2luZyBhcyBhbiBleHBlcnQ6CgoqKlRyYWNpbmcgRG93biBhIFZMQU4gVHVubmVsIEZ1bmN0aW9uKioKClJpZ2h0LCBpdCYjMzk7cyBjYWxsaW5nIGBicl92bGFuX3R1bm5lbF9pbmZvYC4gVGhhdCYjMzk7cyBpbnRlcmVzdGluZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGRvaW5nLiBUaGUgbmFtZSBzdWdnZXN0cyBpdCYjMzk7cyByZWxhdGVkIHRvIFZMQU4gdHVubmVscywgd2hpY2gsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCwgY291bGQgYmUgdXNpbmcgVlhMQU4sIEdSRSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHkuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIGtub3cgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIExldCBtZSBxdWlja2x5IGZpbmQgdGhlIGRlZmluaXRpb24gb2YgYGJyX3ZsYW5fdHVubmVsX2luZm9gLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgaW5wdXRzLCB3aGF0IGl0JiMzOTtzIGRvaW5nIHdpdGggdGhlbSwgYW5kIHdoYXQgaXQmIzM5O3MgcmV0dXJuaW5nLiBJcyBpdCByZXR1cm5pbmcgYSBzdHJ1Y3R1cmUsIHNldHRpbmcgYSBiaXQsIG9yIGRvaW5nIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IFRoZSBnb2FsIGlzIHRvIGRldGVybWluZSBpdHMgZXhhY3Qgcm9sZSBpbiB0aGlzIGJyaWRnZSYjMzk7cyBWTEFOIGhhbmRsaW5nLiBJJiMzOTtsbCBzdGFydCB3aXRoIGEgc3RyYWlnaHRmb3J3YXJkIHNlYXJjaCBhbmQgc2VlIHdoYXQgSSBmaW5kLiBUaGVuIEkgY2FuIGZpZ3VyZSBvdXQgaG93IHRoYXQgaXMgcmVsYXRpbmcgdG8gdGhlIHdob2xlIHN5c3RlbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYz0xOTA9c3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHZsYW5fdHVubmVsX3BvbGljeVtJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9NQVggJiM0MzsgMV0gPSB7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTE5OC1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoxOTk6aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMDAtXHRcdFx0dTE2IHZpZCwgdTMyIHR1bl9pZCwgYm9vbCAqY2hhbmdlZClcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9Mjg2PWludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMTEtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzEyOlx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMzEzLVx0XHRcdGlmIChlcnIpXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzMi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMzM6XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB0aW5mb19jdXJyLVx1MDAzZXZpZCxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMzQtXHRcdFx0XHRcdCAgdGluZm9fY3Vyci1cdTAwM2V0dW5pZCwgY2hhbmdlZCk7XG4tLVxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oPTMwPWJvb2wgdmxhbl90dW5pZF9pbnJhbmdlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfY3Vycixcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zMS1cdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2X2xhc3QpO1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjMyOmludCBicl92bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMzMtXHRcdFx0dTE2IHZpZCwgdTMyIHR1bl9pZCwgYm9vbCAqY2hhbmdlZCk7XG4tLVxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTIxMy1cbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM6MjE0Olx0cmV0dXJuIGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LVx1MDAzZXZpZCwgdHVuX2lkLCBjaGFuZ2VkKTtcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMjE1LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM3MzQKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBicl92bGFuX3R1bm5lbF9pbmZvKioKCkFscmlnaHQsIHNvIGBicl92bGFuX3R1bm5lbF9pbmZvYCBpcyBhbHNvIGRlZmluZWQgd2l0aGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBJbnRlcmVzdGluZy4gR2l2ZW4gdGhlIGNvbnRleHQsIHRoYXQgZmlsZSBpcyB0aGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gc3RhcnQgZGlnZ2luZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IHN0cnVjdHVyZSBhbmQgaXRzIHVzYWdlLiBJdCBtYWtlcyBzZW5zZSwgZ2l2ZW4gdGhlIG5hbWUsIHRoYXQgaXQgd291bGQgZGVhbCB3aXRoIHR1bm5lbGluZyBhbmQgVkxBTiBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGJyaWRnaW5nIGNvbnRleHQuIExldCYjMzk7cyBkaXZlIGludG8gdGhlIGNvZGUgaW4gdGhhdCBmaWxlIGFuZCBzZWUgaG93IHRoaXMgYGJyX3ZsYW5fdHVubmVsX2luZm9gIHN0cnVjdCBpcyBhY3R1YWxseSB1dGlsaXplZC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgaG93IGl0JiMzOTtzIGluaXRpYWxpemVkLCBtb2RpZmllZCwgYW5kIGNvbnN1bWVkIHdpdGhpbiB0aGUgbmV0bGluayBmcmFtZXdvcmssIHBheWluZyBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBpdHMgcmVsYXRpb25zaGlwIHdpdGggdGhlIHR1bm5lbCBpbmZyYXN0cnVjdHVyZSBhbmQgVkxBTiBjb25maWd1cmF0aW9uLiBJIGV4cGVjdCB0byBmaW5kIHNvbWUga2V5IGluc2lnaHRzIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5OSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTk5Olx0aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbiAyMDA6XHRcdFx0XHR1MTYgdmlkLCB1MzIgdHVuX2lkLCBib29sICpjaGFuZ2VkKVxuIDIwMTpcdHtcbiAyMDI6XHRcdGludCBlcnIgPSAwO1xuIDIwMzpcdFxuIDIwNDpcdFx0aWYgKCFwKVxuIDIwNTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyMDY6XHRcbiAyMDc6XHRcdHN3aXRjaCAoY21kKSB7XG4gMjA4Olx0XHRjYXNlIFJUTV9TRVRMSU5LOlxuIDIwOTpcdFx0XHRlcnIgPSBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQocCwgdmlkLCB0dW5faWQpO1xuIDIxMDpcdFx0XHRpZiAoIWVycilcbiAyMTE6XHRcdFx0XHQqY2hhbmdlZCA9IHRydWU7XG4gMjEyOlx0XHRcdGJyZWFrO1xuIDIxMzpcdFx0Y2FzZSBSVE1fREVMTElOSzpcbiAyMTQ6XHRcdFx0aWYgKCFuYnBfdmxhbl90dW5uZWxfaW5mb19kZWxldGUocCwgdmlkKSlcbiAyMTU6XHRcdFx0XHQqY2hhbmdlZCA9IHRydWU7XG4gMjE2Olx0XHRcdGJyZWFrO1xuIDIxNzpcdFx0fVxuIDIxODpcdFxuIDIxOTpcdFx0cmV0dXJuIGVycjtcbiAyMjA6XHR9XG4gMjIxOlx0XG4gMjIyOlx0aW50IGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8oc3RydWN0IG5sYXR0ciAqYXR0cixcbiAyMjM6XHRcdFx0XHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbylcbiAyMjQ6XHR7XG4gMjI1Olx0XHRzdHJ1Y3QgbmxhdHRyICp0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9NQVggJiM0MzsgMV07XG4gMjI2Olx0XHR1MzIgdHVuX2lkO1xuIDIyNzpcdFx0dTE2IHZpZCwgZmxhZ3MgPSAwO1xuIDIyODpcdFx0aW50IGVycjtcbiAyMjk6XHRcbiAyMzA6XHRcdG1lbXNldCh0aW5mbywgMCwgc2l6ZW9mKCp0aW5mbykpO1xuIDIzMTpcdFxuIDIzMjpcdFx0ZXJyID0gbmxhX3BhcnNlX25lc3RlZF9kZXByZWNhdGVkKHRiLCBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9NQVgsXG4gMjMzOlx0XHRcdFx0XHRcdCAgYXR0ciwgdmxhbl90dW5uZWxfcG9saWN5LCBOVUxMKTtcbiAyMzQ6XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gMjM1Olx0XHRcdHJldHVybiBlcnI7XG4gMjM2Olx0XG4gMjM3Olx0XHRpZiAoIXRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lEXSB8fFxuIDIzODpcdFx0ICAgICF0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9WSURdKVxuIDIzOTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyNDA6XHRcbiAyNDE6XHRcdHR1bl9pZCA9IG5sYV9nZXRfdTMyKHRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lEXSk7XG4gMjQyOlx0XHR2aWQgPSBubGFfZ2V0X3UxNih0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9WSURdKTtcbiAyNDM6XHRcdGlmICh2aWQgXHUwMDNlPSBWTEFOX1ZJRF9NQVNLKVxuIDI0NDpcdFx0XHRyZXR1cm4gLUVSQU5HRTtcbiAyNDU6XHRcbiAyNDY6XHRcdGlmICh0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9GTEFHU10pXG4gMjQ3Olx0XHRcdGZsYWdzID0gbmxhX2dldF91MTYodGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1NdKTtcbiAyNDg6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ3OTIKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKlRyYWNpbmcgdGhlIFZMQU4gVHVubmVsIEFkZGl0aW9uIEZ1bmN0aW9uKioKCk9rYXksIHNvIHRoZSBjb2RlJiMzOTtzIGludm9raW5nIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gcGlucG9pbnQgd2hlcmUgKnRoYXQqIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGRlZmluZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzaWduYXR1cmUsIHdoYXQgaXQgZXhwZWN0cyBhcyBpbnB1dHMsIGFuZCBtb3N0IGltcG9ydGFudGx5LCB3aGF0IGl0JiMzOTtzIGFjdHVhbGx5ICpkb2luZyogdW5kZXIgdGhlIGhvb2QgdG8gaGFuZGxlIFZMQU4gdHVubmVsIGluZm9ybWF0aW9uLiBLbm93aW5nIHRoZSBkZWZpbml0aW9uIGlzIHRoZSBjcml0aWNhbCBmaXJzdCBzdGVwIHRvIHVucGFja2luZyB0aGUgbG9naWMgZmxvdyBhbmQgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2FsbCB3aXRoaW4gdGhlIGxhcmdlciBzeXN0ZW0uIExldCYjMzk7cyBzZWUgaWYgSSBjYW4gcXVpY2tseSBqdW1wIHRvIHRoZSBkZWNsYXJhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTE5OT1pbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMDgtXHRjYXNlIFJUTV9TRVRMSU5LOlxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjIwOTpcdFx0ZXJyID0gbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKHAsIHZpZCwgdHVuX2lkKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMTAtXHRcdGlmICghZXJyKVxuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0zOT1pbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZGVsZXRlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQpO1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjQwOmludCBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwgdTE2IHZpZCxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC00MS1cdFx0XHQgICAgIHUzMiB0dW5faWQpO1xuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD01Nj1zdGF0aWMgaW5saW5lIGludCBuYnBfdmxhbl90dW5uZWxfaW5mb19kZWxldGUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCxcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtNjEtXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6NjI6c3RhdGljIGlubGluZSBpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtNjMtXHRcdFx0XHRcdCAgIHUxNiB2aWQsIHUzMiB0dW5faWQpXG4tLVxubmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jPTYzPXN0YXRpYyBpbnQgX192bGFuX3R1bm5lbF9pbmZvX2FkZChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyxcbi0tXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmMtOTctICovXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmM6OTg6aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLFxubmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jLTk5LVx0XHRcdCAgICAgdTMyIHR1bl9pZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1MTUKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyB0aGUgVkxBTiBUdW5uZWxpbmcgRnVuY3Rpb25hbGl0eSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgIGZ1bmN0aW9uLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIGRlZmluZWQgaW4gYG5ldC9icmlkZ2UvYnJfdmxhbl90dW5uZWwuY2AsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIHRoZSBmdW5jdGlvbiBuYW1lLiBOb3csIGxldCYjMzk7cyBzZWUsIHRoYXQgZmlsZSwgYGJyX3ZsYW5fdHVubmVsLmNgLCBpcyBjb21waWxlZCBjb25kaXRpb25hbGx5LCBzcGVjaWZpY2FsbHksIGlmIHRoZSBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2Aga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIGVuYWJsZWQuIFRoYXQmIzM5O3MgZ29vZCB0byBrbm93OyBpdCBoZWxwcyBtZSB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IGhhcHBlbnMgaWYgZmlsdGVyaW5nIGlzbiYjMzk7dCBlbmFibGVkLiBUaGVyZWZvcmUsIEkgc2hvdWxkIGNoZWNrIGBuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmhgIHRvIHNlZSBob3cgdGhhdCBmdW5jdGlvbiBpcyBoYW5kbGVkIGluIHNjZW5hcmlvcyB3aGVyZSBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgZGlzYWJsZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IgaW4gdGhhdCBzaXR1YXRpb24uIFRoYXQgd2lsbCB0ZWxsIG1lIGlmIHRoZXJlJiMzOTtzIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9yIGlmIHRoZSBmdW5jdGlvbiBpcyBzdHViYmVkIG91dCBzb21laG93LiBUaGlzIGNvbnRleHR1YWwgdW5kZXJzdGFuZGluZyBpcyBjcnVjaWFsIGZvciBhIGNvbXBsZXRlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAzNTpcdCNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HXG4gIDM2Olx0LyogYnJfdmxhbl90dW5uZWwuYyAqL1xuICAzNzpcdGludCB2bGFuX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKTtcbiAgMzg6XHR2b2lkIHZsYW5fdHVubmVsX2RlaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XG4gIDM5Olx0aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkKTtcbiAgNDA6XHRpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQsXG4gIDQxOlx0XHRcdFx0ICAgICB1MzIgdHVuX2lkKTtcbiAgNDI6XHR2b2lkIG5icF92bGFuX3R1bm5lbF9pbmZvX2ZsdXNoKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQpO1xuICA0MzpcdHZvaWQgdmxhbl90dW5uZWxfaW5mb19kZWwoc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcsXG4gIDQ0Olx0XHRcdFx0ICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2bGFuKTtcbiAgNDU6XHR2b2lkIGJyX2hhbmRsZV9pbmdyZXNzX3ZsYW5fdHVubmVsKHN0cnVjdCBza19idWZmICpza2IsXG4gIDQ2Olx0XHRcdFx0XHQgICBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuICA0NzpcdFx0XHRcdFx0ICAgc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcpO1xuICA0ODpcdGludCBicl9oYW5kbGVfZWdyZXNzX3ZsYW5fdHVubmVsKHN0cnVjdCBza19idWZmICpza2IsXG4gIDQ5Olx0XHRcdFx0XHQgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdmxhbik7XG4gIDUwOlx0I2Vsc2VcbiAgNTE6XHRzdGF0aWMgaW5saW5lIGludCB2bGFuX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKVxuICA1MjpcdHtcbiAgNTM6XHRcdHJldHVybiAwO1xuICA1NDpcdH1cbiAgNTU6XHRcbiAgNTY6XHRzdGF0aWMgaW5saW5lIGludCBuYnBfdmxhbl90dW5uZWxfaW5mb19kZWxldGUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCxcbiAgNTc6XHRcdFx0XHRcdFx0ICAgICAgdTE2IHZpZClcbiAgNTg6XHR7XG4gIDU5Olx0XHRyZXR1cm4gMDtcbiAgNjA6XHR9XG4gIDYxOlx0XG4gIDYyOlx0c3RhdGljIGlubGluZSBpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsXG4gIDYzOlx0XHRcdFx0XHRcdCAgIHUxNiB2aWQsIHUzMiB0dW5faWQpXG4gIDY0Olx0e1xuICA2NTpcdFx0cmV0dXJuIDA7XG4gIDY2Olx0fVxuICA2NzpcdFxuICA2ODpcdHN0YXRpYyBpbmxpbmUgdm9pZCBuYnBfdmxhbl90dW5uZWxfaW5mb19mbHVzaChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0KVxuICA2OTpcdHtcbiAgNzA6XHR9XG4gIDcxOlx0XG4gIDcyOlx0c3RhdGljIGlubGluZSB2b2lkIHZsYW5fdHVubmVsX2luZm9fZGVsKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnLFxuICA3MzpcdFx0XHRcdFx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2bGFuKVxuICA3NDpcdHtcbiAgNzU6XHR9XG4gIDc2Olx0XG4gIDc3Olx0c3RhdGljIGlubGluZSBpbnQgYnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAgNzg6XHRcdFx0XHRcdFx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuICA3OTpcdFx0XHRcdFx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKVxuICA4MDpcdHtcbiAgODE6XHRcdHJldHVybiAwO1xuICA4MjpcdH1cbiAgODM6XHQjZW5kaWZcbiAgODQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY2NzgKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxNjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBWTEFOIFR1bm5lbGluZyBMb2dpYyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgIGZ1bmN0aW9uLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIGdvaW5nIHRvIHJldHVybiAwIHdoZW4gYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGlzIGRpc2FibGVkLiBUaGF0IHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2guIEJ1dCwgSSYjMzk7bSBzdGFydGluZyB0byBzZWUgdGhlIHBvdGVudGlhbCBwcm9ibGVtIG5vdy4uLiB0aGUgYnVnLCBJIGJlbGlldmUsIGlzIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBBbmQgdGhhdCYjMzk7cyBpbiBgYnJfbmV0bGlua190dW5uZWwuY2AsIHdoaWNoLCBhcyBmYXIgYXMgSSBjYW4gc2VlLCBpcyAqYWx3YXlzKiBjb21waWxlZCBpZiBgQ09ORklHX0JSSURHRWAgaXMgZW5hYmxlZC4KClJpZ2h0LCBsZXQgbWUgdGhpbmsgdGhpcyB0aHJvdWdoLiBJZiBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgZGlzYWJsZWQsIHRoZSBmdW5jdGlvbiBgYnJfdmxhbl90dW5uZWxfaW5mb2AsIHdoaWNoIGlzIHRoZSBvbmUgY2FsbGluZyBgbmJwX3ZsYW5fdHVubmVsX2luZm9fYWRkYCwgd2lsbCBqdXN0IGVuZCB1cCByZXR1cm5pbmcgMC4gVGhhdCYjMzk7cyBmaW5lLCBidXQuLi4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgKnN0aWxsKiBnb2luZyB0byBleGVjdXRlIGl0cyBsb2dpYyEgVGhhdCYjMzk7cyB0aGUgY3J1eCBvZiBpdCwgaXNuJiMzOTt0IGl0PyBFdmVuIHRob3VnaCB3ZSYjMzk7cmUgbm90IGFjdHVhbGx5IGZpbHRlcmluZywgdGhhdCBmdW5jdGlvbiBpcyBzdGlsbCBnb2luZyB0byBiZSBkb2luZyBzb21ldGhpbmcuCgpMZXQgbWUgZ28gYmFjayBhbmQgcmUtZXhhbWluZSBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBtb3JlIGNsb3NlbHkgbm93LiBJIG5lZWQgdG8gc2VlIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHRoZXJlLCBldmVuIHdoZW4gdGhlIFZMQU4gZmlsdGVyaW5nIHBhcnQgaXMgYnlwYXNzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjkwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyOTA6XHRcdFx0XHRcdGJvb2wgKmNoYW5nZWQpXG4gMjkxOlx0e1xuIDI5MjpcdFx0aW50IGVycjtcbiAyOTM6XHRcbiAyOTQ6XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XG4gMjk1Olx0XHRcdGlmICh0aW5mb19sYXN0LVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKVxuIDI5NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDI5NzpcdFx0XHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbiAyOTg6XHRcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcbiAyOTk6XHRcdFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9zdGFydCA9IE5VTEwsICp2X2VuZCA9IE5VTEw7XG4gMzAwOlx0XHRcdGludCB0LCB2O1xuIDMwMTpcdFxuIDMwMjpcdFx0XHRpZiAoISh0aW5mb19sYXN0LVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcbiAzMDM6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDQ6XHRcdFx0aWYgKHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZCB8fFxuIDMwNTpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4gMzA2Olx0XHRcdCAgICAodGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWQpKVxuIDMwNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDMwODpcdFx0XHR0ID0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZDtcbiAzMDk6XHRcdFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cdTAwM2V2aWQ7IHYgXHUwMDNjPSB0aW5mb19jdXJyLVx1MDAzZXZpZDsgdiYjNDM7JiM0MzspIHtcbiAzMTA6XHRcdFx0XHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XG4gMzExOlx0XG4gMzEyOlx0XHRcdFx0ZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYsIHQsIFx1MDAyNmN1cnJfY2hhbmdlKTtcbiAzMTM6XHRcdFx0XHRpZiAoZXJyKVxuIDMxNDpcdFx0XHRcdFx0YnJlYWs7XG4gMzE1Olx0XHRcdFx0dCYjNDM7JiM0Mzs7XG4gMzE2Olx0XG4gMzE3Olx0XHRcdFx0aWYgKGN1cnJfY2hhbmdlKVxuIDMxODpcdFx0XHRcdFx0KmNoYW5nZWQgPSBjdXJyX2NoYW5nZTtcbiAzMTk6XHRcdFx0XHRfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShwLCBcdTAwMjZ2X3N0YXJ0LCBcdTAwMjZ2X2VuZCwgdixcbiAzMjA6XHRcdFx0XHRcdFx0XHQgICBjdXJyX2NoYW5nZSk7XG4gMzIxOlx0XHRcdH1cbiAzMjI6XHRcdFx0aWYgKHZfc3RhcnQgXHUwMDI2XHUwMDI2IHZfZW5kKVxuIDMyMzpcdFx0XHRcdGJyX3ZsYW5fbm90aWZ5KGJyLCBwLCB2X3N0YXJ0LVx1MDAzZXZpZCwgdl9lbmQtXHUwMDNldmlkLFxuIDMyNDpcdFx0XHRcdFx0ICAgICAgIFJUTV9ORVdWTEFOKTtcbiAzMjU6XHRcdFx0aWYgKGVycilcbiAzMjY6XHRcdFx0XHRyZXR1cm4gZXJyO1xuIDMyNzpcdFxuIDMyODpcdFx0XHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbiAzMjk6XHRcdFx0bWVtc2V0KHRpbmZvX2N1cnIsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3ODc5CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNTI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRlYnVnZ2luZyBhIFN1YnRsZSBMb29wIENvbmRpdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCB0aGUgbG9vcCBgZm9yICh2ID0gdGluZm9fbGFzdC0mZ3Q7dmlkOyB2ICZsdDs9IHRpbmZvX2N1cnItJmd0O3ZpZDsgdiYjNDM7JiM0MzspYCBzaW1wbHkgd291bGRuJiMzOTt0IHJ1bi4gYHZgIGlzIGFuIGBpbnRgLCBzbyBhIHNpbXBsZSBjb21wYXJpc29uIHNob3VsZCBwcmV2ZW50IHRoZSBsb29wIGZyb20gc3RhcnRpbmcgaWYgdGhhdCYjMzk7cyB0aGUgY2FzZS4gSXQgd291bGRuJiMzOTt0IHdhaXQgZWl0aGVyLgoKVGhlbiBJIHJlbWVtYmVyZWQgdGhlcmUgd2FzIGEgYnVnIHJlbGF0ZWQgdG8gYSBzdWJ0cmFjdGlvbi4gVGhlIGNvcmUgcHJvYmxlbSBsaWVzIGluIHRoaXMgY29tcGFyaXNvbjogYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpYCB2ZXJzdXMgYCh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIEkgbmVlZCB0byB0aGluayBjYXJlZnVsbHkgYWJvdXQgdGhlIHR5cGVzIGludm9sdmVkLgoKYHZpZGAgaXMgYSBgdTE2YCBhbmQgYHR1bmlkYCBpcyBhIGB1MzJgLiBUaGlzIGRpZmZlcmVuY2UgaXMgdGhlIGtleSEgIFdoZW4gc3VidHJhY3RpbmcgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgZnJvbSBgdGluZm9fY3Vyci0mZ3Q7dmlkYCwgdGhlIGB1MTZgIHR5cGVzIGdldCBwcm9tb3RlZCB0byBgaW50YCBiZWNhdXNlIGB1MTZgIHZhbHVlcyBjYW4gYmUgc3RvcmVkIGluIGFuIGBpbnRgIHNhZmVseSwgYWxsb3dpbmcgZm9yIG5lZ2F0aXZlIHJlc3VsdHMuIEJ1dCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgaXMgYSBgdTMyIC0gdTMyYCBvcGVyYXRpb24sIHdoaWNoIHJlc3VsdHMgaW4gYW4gdW5zaWduZWQgYHUzMmAuCgpTbywgd2UgaGF2ZSBhIG5lZ2F0aXZlIGBpbnRgIGJlaW5nIGNvbXBhcmVkIHRvIGFuIHVuc2lnbmVkIGB1MzJgLiAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCB0aGUgYGludGAgdG8gYSBgdTMyYCBmb3IgdGhlIGNvbXBhcmlzb24uIElmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlIHN1YnRyYWN0aW9uIHdpbGwgcmVzdWx0IGluIGEgbmVnYXRpdmUgYGludGAgd2hpY2gsIHdoZW4gY29udmVydGVkIHRvIGEgYHUzMmAsIGJlY29tZXMgYSAqdmVyeSogbGFyZ2UgdW5zaWduZWQgbnVtYmVyISBJZiB0aGUgYHR1bmlkYCB2YWx1ZXMgYWxzbyB3cmFwIGFyb3VuZCBpbiBhIHNpbWlsYXIgd2F5LCB0aGUgYHUzMmAgY29tcGFyaXNvbiBjYW4gc3RpbGwgcGFzcyBiZWNhdXNlIHRoZSBsYXJnZSBgdTMyYCB2YWx1ZSBjYW4gZXF1YWwgdGhlIHJlc3VsdCBvZiBgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpYC4KClRoYXQgbWVhbnMgdGhlIGxvb3AgdGhlbiBleGVjdXRlcy4gQnV0IHdhaXQuLi4gaWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoZSBsb29wIGNvbmRpdGlvbiBgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWRgIHdvdWxkIGJlIGluaXRpYWxseSBmYWxzZSwgc28gdGhlIGxvb3Agd291bGQgZXhlY3V0ZSB6ZXJvIHRpbWVzISBUaGF0IGRvZXNuJiMzOTt0IG1ha2Ugc2Vuc2UgYXMgYSBidWcuCgpJZiB0aGUgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCB3aGVyZSYjMzk7cyB0aGUgYnVnPwoKSSBuZWVkIHRvIHJlLWV4YW1pbmUgbXkgYXNzdW1wdGlvbiBvZiB3aGVyZSB0aGUgYnVnIGxpZXMuCgpPaCEgSSYjMzk7bSBiYWNrIG9uIHRyYWNrLgoKSWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIGFuZCB0aGUgbG9vcCBpcyBzdHJ1Y3R1cmVkIGFzIGBmb3IgKHYgPSB0aW5mb19sYXN0LSZndDt2aWQ7IHYgJmx0Oz0gdGluZm9fY3Vyci0mZ3Q7dmlkOyB2JiM0MzsmIzQzOylgLCB0aGUgbG9vcCBleGVjdXRlcy4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoZW4gdGhlIGxvb3AgaXMgZW50ZXJlZCBvbmx5IGlmIHRoZSB1bnNpZ25lZCB2YWx1ZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UsIG1lYW5pbmcgdGhhdCBgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGZhbHNlIG9uIHRoZSBmaXJzdCBleGVjdXRpb24sIHNvIHRoZSBsb29wIGV4ZWN1dGVzIDAgdGltZXMuIFRoZSB0eXBlcyBhcmUgY3JpdGljYWwgaGVyZS4gQW5kIGluIHRoaXMgY2FzZSBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyBhIGB1MTZgIGJ1dCBgdmAgaXMgYW4gYGludGAuCgpTbywgbGV0IG1lIGNoZWNrIHRoZSB0eXBlcyBvZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBhbmQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgdG8gZWxpbWluYXRlIGFsbCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBidWdzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgdnR1bm5lbF9pbmZvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9ODA5PXN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MTctXHRzdHJ1Y3QgbmxhdHRyICphdHRyO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODE4Olx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19sYXN0ID0ge307XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MTk6XHRzdHJ1Y3QgdnR1bm5lbF9pbmZvIHRpbmZvX2N1cnIgPSB7fTtcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyMC1cdGludCBlcnIgPSAwLCByZW07XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTIyMj1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjIyMzpcdFx0XHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbylcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMjQte1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYz0yODY9aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjg3LVx0XHRcdFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoyODg6XHRcdFx0XHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19jdXJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI4OTpcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjkwLVx0XHRcdFx0Ym9vbCAqY2hhbmdlZClcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjk2LVx0XHRcdHJldHVybiAtRUlOVkFMO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI5NzpcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjk4LVx0fSBlbHNlIGlmICh0aW5mb19jdXJyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMjctXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzI4Olx0XHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMjk6XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzMC1cdH0gZWxzZSB7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzNy1cdFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHRpbmZvX2N1cnItXHUwMDNldmlkLCAwLCBSVE1fTkVXVkxBTik7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzM4Olx0XHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMzk6XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTM0MC1cdH1cbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMTEtXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MTI6c3RydWN0IHZ0dW5uZWxfaW5mbyB7XG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMTMtXHR1MzJcdHR1bmlkO1xuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0xOT1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjIwOlx0XHRcdCAgICAgIHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvKTtcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMS1pbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjMtXHRcdFx0XHRpbnQgY21kLFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjI0Olx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3Vycixcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyNTpcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjYtXHRcdFx0XHRib29sICpjaGFuZ2VkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAxNzgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipEaXZpbmcgaW50byB0aGUgVHVubmVsIERldGFpbHMqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgZ3JhbnVsYXIuIFRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgaW4gdGhlIGJyaWRnaW5nIGNvZGUgcmVsYXRlZCB0byB0dW5uZWxzLCBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhlIGRhdGEgaXMgYmVpbmcgc3RydWN0dXJlZC4gVGhlIG5hdHVyYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHRoYXQgaXMgdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB2dHVubmVsX2luZm9gLiBTbywgbGV0JiMzOTtzIHB1bGwgdXAgYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAgYW5kIHRha2UgYSBsb29rLiBJJiMzOTtsbCBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgZmllbGRzIGFyZSBkZWZpbmVkLCB3aGF0IHRoZXkgcmVwcmVzZW50LCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBvdmVyYWxsIGJyaWRnaW5nIGFuZCB0dW5uZWxpbmcgYXJjaGl0ZWN0dXJlLiBUaGlzIHNob3VsZCBnaXZlIG1lIHRoZSBmb3VuZGF0aW9uIEkgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGFjdHVhbCBwYWNrZXQgcHJvY2Vzc2luZyBsb2dpYy4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBzdHJ1Y3QgdG8gaG9sZCB0aGUgcmVsZXZhbnQgdHVubmVsIGlkZW50aWZpZXJzLCBwZXJoYXBzIHNvbWUgZW5jYXBzdWxhdGlvbiBkZXRhaWxzLCBhbmQgZGVmaW5pdGVseSBzb21lIHNvcnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgdHVubmVsLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgaW4gdGhlcmUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xuICAgMjpcdC8qXG4gICAzOlx0ICpcdEJyaWRnZSBwZXIgdmxhbiB0dW5uZWxzXG4gICA0Olx0ICpcbiAgIDU6XHQgKlx0QXV0aG9yczpcbiAgIDY6XHQgKlx0Um9vcGEgUHJhYmh1XHRcdFx1MDAzY3Jvb3BhQGN1bXVsdXNuZXR3b3Jrcy5jb21cdTAwM2VcbiAgIDc6XHQgKi9cbiAgIDg6XHRcbiAgIDk6XHQjaWZuZGVmIF9CUl9QUklWQVRFX1RVTk5FTF9IXG4gIDEwOlx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxuICAxMTpcdFxuICAxMjpcdHN0cnVjdCB2dHVubmVsX2luZm8ge1xuICAxMzpcdFx0dTMyXHR0dW5pZDtcbiAgMTQ6XHRcdHUxNlx0dmlkO1xuICAxNTpcdFx0dTE2XHRmbGFncztcbiAgMTY6XHR9O1xuICAxNzpcdFxuICAxODpcdC8qIGJyX25ldGxpbmtfdHVubmVsLmMgKi9cbiAgMTk6XHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxuICAyMDpcdFx0XHRcdCAgICAgIHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2OTIKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxMzc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBJbnRlZ2VyIE92ZXJmbG93IGFuZCBJdHMgRml4KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBpcyB0aGF0IGB2aWRgIGlzIGEgYHUxNmAuIElmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlaXIgZGlmZmVyZW5jZSBpcyBuZWdhdGl2ZSwgcmlnaHQ/IFRoZSBpc3N1ZSBpcywgdGhpcyBzdWJ0cmFjdGlvbiBgdGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkYCBpcyBldmFsdWF0ZWQgYXMgYW4gYGludGAgYmVjYXVzZSBvZiB0aGUgdXN1YWwgaW50ZWdlciBwcm9tb3Rpb24gcnVsZXMuIElmLCBzYXksIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIDAgYW5kIGB0aW5mb19sYXN0LSZndDt2aWRgIGlzIDEwLCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIHdpbGwgYmUgLTEwLgoKTm93LCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGFyZSBib3RoIGB1MzJgLiBUaGlzIGRpZmZlcmVuY2UsIGB0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkYCwgaXMgZXZhbHVhdGVkIGFzIGB1MzJgLiBTbywgaGVyZSYjMzk7cyB3aGVyZSB0aGUgcG90ZW50aWFsIHByb2JsZW0gbGllczogYC0xMGAgKGFzIGFuIGBpbnRgKSBnZXRzIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgdmVyeSBsYXJnZSBgdTMyYCwgc3BlY2lmaWNhbGx5IDQyOTQ5NjcyODYuIE5vdyB0aGUgY29tcGFyaXNvbiBgKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0gKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpYCBjb3VsZCBiZWNvbWUgRkFMU0UuCgpJZiB0aGF0IGNvbXBhcmlzb24gaXMgZmFsc2UsIHRoZSBjb2RlIHByb2NlZWRzIHRvIGxvb3AuICBIb3dldmVyLCB0aGUgbG9vcCBpdHNlbGYgbG9va3Mgc3VzcGljaW91cy4gSWYgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgMTAgYW5kIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIDAsIHRoZSBsb29wIGNvbmRpdGlvbiBgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWRgIHdvdWxkIGJlIGZhbHNlIGZyb20gdGhlIHN0YXJ0LiAgVGhlIGxvb3Agd29uJiMzOTt0IGV4ZWN1dGUuIFRoZSBjb2RlIHNraXBzIHRoZSByYW5nZSBwcm9jZXNzaW5nIGFuZCB0aGUgYGJyX3ZsYW5fbm90aWZ5YCBjYWxsIGFuZCBqdXN0IHJldHVybnMgYW4gZXJyb3IgY29kZSAwLiBFc3NlbnRpYWxseSwgdGhlIGNvZGUgc2lsZW50bHkgaWdub3JlcyB0aGUgaW52YWxpZCByYW5nZSwgd2hpY2ggc2VlbXMgbGlrZSBhIGJ1Zy4gSWYgdGhlIGxvb3AgKmRpZCogZXhlY3V0ZSwgdGhlIGNvbXBhcmlzb24gaW4gdGhlIGxvb3AsIHRoYXQgd291bGQgcHJldmVudCB0aGUgbG9vcCBmcm9tIGl0ZXJhdGluZyBpbiBhbiBvdXQtb2YtYm91bmRzIHNjZW5hcmlvLgoKSSB3YXMgdHJ5aW5nIHRvIGNvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dmlkYCBpcyAweEZGRkYuIFRoYXQgbWFrZXMgdGhlIGRpZmZlcmVuY2UgYDAgLSA2NTUzNSA9IC02NTUzNWAuCgpOb3csIGxvb2tpbmcgYXQgdGhlIGZpeCwgaXQgaW50cm9kdWNlcyBhbiBlYXJseSByZXR1cm4gd2l0aCBgLUVJTlZBTGAgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAuIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdvdWxkIHNpbXBseSBza2lwIHRoZSBsb29wIGFuZCByZXR1cm4gMCAoc3VjY2VzcykuIFRoaXMgZWFybHkgcmV0dXJuIHNlZW1zIHJpZ2h0IGJlY2F1c2UgaXQgc2lnbmFscyB0aGUgZXJyb3IuIFJldHVybmluZyAwIHdoZW4gdGhlIHJhbmdlIGlzIGludmFsaWQgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yLiBUaGUgcHJvZ3JhbSBjYW4gbGVhdmUgYHRpbmZvX2xhc3RgIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4gVGhlbiwgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGB0aW5mb19sYXN0YCBhbmQgYHRpbmZvX2N1cnJgIGFyZSB6ZXJvZWQgb3V0IGFueXdheS4KClRoZSBrZXkgY2hhbmdlLCB0aGUgcGF0Y2gsIGp1c3QgYmxvY2tzIHRoZSBjb2RlIGZyb20gZG9pbmcgYW55dGhpbmcgd2hlbiB0aGUgbmV3IGB2aWRgIGlzIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZS4gVGhlIGNvZGUgZGlkIG5vdGhpbmcgYW55d2F5LCBidXQgbm93IGl0IHJldHVybnMgYW4gZXJyb3IuIFRoaXMgYXZvaWRzIHRoZSBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb24gaXNzdWUgd2hlcmUgYSBuZWdhdGl2ZSBgaW50YCBkaWZmZXJlbmNlIGJlY29tZXMgYSBsYXJnZSBgdTMyYCB2YWx1ZSwgcG90ZW50aWFsbHkgYnlwYXNzaW5nIHRoZSBpbmVxdWFsaXR5IGNoZWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5OCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjMxNTIKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA4NDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBJc3N1ZXMgd2l0aCB0aGUgVHVubmVsIElEIGFuZCBWTEFOIElEIENvbXBhcmlzb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkgSSBzZWUgYHZgIGlzIGFuIGludGVnZXIsIGFuZCBpdCYjMzk7cyBiZWluZyBjb21wYXJlZCB0byBgdGluZm9fY3Vyci0mZ3Q7dmlkYCwgd2hpY2ggaXMgYSBgdTE2YC4gUmlnaHQgYXdheSwgdGhlIGNvbXBhcmlzb24gaXMgZ29pbmcgdG8gcHJvbW90ZSB0aGUgYHUxNmAgdG8gYW4gYGludGAuIE5vdywgaWYgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgZ3JlYXRlciB0aGFuIGB0aW5mb19jdXJyLSZndDt2aWRgLCB0aGUgbG9vcCBjb25kaXRpb24gYHYgJmx0Oz0gdGluZm9fY3Vyci0mZ3Q7dmlkYCBiZWNvbWVzIGZhbHNlIGZyb20gdGhlIGdldC1nby4gTm8gZXhlY3V0aW9uLiBObyBiaWcgZGVhbCwgcmlnaHQ/CgpCdXQgd2FpdC4gVGhpcyBtZWFucyB0aGUgbG9vcCAqZG9lc24mIzM5O3QqIGV4ZWN1dGUuIElmIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIGV2YWx1YXRlZCBhcyBhbiBgaW50YCwgYW5kIGB0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkYCBpcyBhIGB1MzJgLCBhbmQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCBpdCByZXR1cm5zIDAuIFJldHVybmluZyAwIHVzdWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MsIHdoaWNoIG1lYW5zIHRoZSBjb2RlIGlzICpzdXBwb3NlZCogdG8gc3VjY2VlZC4gQnV0IGl0IGRpZG4mIzM5O3QgKmRvKiBhbnl0aGluZy4gSXQmIzM5O3MganVzdCBjb25zdW1lZCBgUkFOR0VfQkVHSU5gIGFuZCBgUkFOR0VfRU5EYCB3aXRob3V0IGFkZGluZyB0aGUgdHVubmVscywgdGhlbiBpdCBjbGVhcnMgYHRpbmZvX2xhc3RgIGFuZCBgdGluZm9fY3VycmAuIFRoaXMgY291bGQgYmUgY29uc2lkZXJlZCBhIHNpbGVudCBmYWlsdXJlIHRvIGFkZCBhIHJhbmdlISBJIHRoaW5rIHRoaXMgaXMgYSBwb3RlbnRpYWwgYnVnLiBJdCYjMzk7cyBub3QgYSBjcmFzaCwgYnV0IGl0JiMzOTtzIG5vdCB3b3JraW5nIGFzIGludGVuZGVkLgoKQnV0IGhvbGQgb24sIGxldCYjMzk7cyBleHBsb3JlIGFub3RoZXIgcG9zc2liaWxpdHkuIFdoYXQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgYW5kIGB0aW5mb19sYXN0LSZndDt2aWRgIGFyZSBzdWNoIHRoYXQgdGhlIGRpZmZlcmVuY2UgaXMgcG9zaXRpdmUgYXMgYW4gaW50ZWdlciwgYnV0IGB0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkYCBpcyBuZWdhdGl2ZT8gSWYgYHRpbmZvX2N1cnItJmd0O3R1bmlkYCBpcyBzbWFsbGVyIHRoYW4gYHRpbmZvX2xhc3QtJmd0O3R1bmlkYCwgdGhlbiB0aGUgYHUzMmAgc3VidHJhY3Rpb24gZ2l2ZXMgdXMgYSBodWdlIHZhbHVlLCBiZWNhdXNlIGl0IHVuZGVyZmxvd3MuIEluIHRoaXMgY2FzZSwgY29tcGFyaW5nIGAodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKWAgdG8gYCh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAgd291bGQgYmUgdHJ1ZSBhbmQgaXQgcmV0dXJucyBgLUVJTlZBTGAuIE9rYXksIHNvIHRoYXQmIzM5O3MgaGFuZGxlZCBjb3JyZWN0bHkuIEdvb2QuCgpOb3csIEkgbmVlZCB0byBjb25zaWRlciBwb3RlbnRpYWwgdW5kZWZpbmVkIGJlaGF2aW9yLiBMZXQmIzM5O3Mgc2VlLi4uIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIGBpbnRgLCBhbmQgYHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGlzIGB1MzJgLiBJbiBDLCB0aGUgYGludGAgZ2V0cyBjb252ZXJ0ZWQgdG8gYHUzMmAgZHVyaW5nIHRoZSBjb21wYXJpc29uLiBJZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoZSBsZWZ0IHNpZGUgYmVjb21lcyBhIG5lZ2F0aXZlIGBpbnRgLCB3aGljaCBiZWNvbWVzIGEgdmVyeSBsYXJnZSBgdTMyYCBhZnRlciBjb252ZXJzaW9uLiBCZWNhdXNlIGB0aW5mb19jdXJyLSZndDt2aWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dmlkYCBhcmUgYHUxNmBzLCB0aGUgbWF4aW11bSBkaWZmZXJlbmNlIGlzIGAwIC0gNjU1MzUgPSAtNjU1MzVgLiBDb252ZXJ0ZWQgdG8gYHUzMmAsIHRoaXMgaXMgYDQyOTQ5MDE3NjFgLiBJZiBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgKmFsc28qIGVxdWFscyBgNDI5NDkwMTc2MWAsIHRoZSBsb29wICpzdGlsbCogZG9lc24mIzM5O3QgcnVuLgoKSXMgdGhlcmUgYSBtZW1vcnkgbGVhayBoZXJlPyBOb3BlLiBBbnkgb3V0LW9mLWJvdW5kcyBhY2Nlc3M/IERvZXNuJiMzOTt0IGxvb2sgbGlrZSBpdC4gU28sIG5vIFVCLCBubyBtZW1vcnkgcHJvYmxlbXMuLi4gYnV0IHRoYXQgc2lsZW50IGZhaWx1cmUgc3RpbGwgYnVncyBtZS4gSSBuZWVkIHRvIGJlIHN1cmUuIEkmIzM5O20gZ29pbmcgdG8gbG9vayBtb3JlIGNsb3NlbHkgYXQgdGhlIGBicl9wcm9jZXNzX3ZsYW5faW5mb2AgZnVuY3Rpb24gaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYCBhcyB0aGlzIHNlZW1zIGxpa2UgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciB0aGlzIHRvIGhhdmUga25vY2stb24gZWZmZWN0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfcHJvY2Vzc192bGFuX2luZm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz02OTg9c3RhdGljIGludCBicl92bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTczOC1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjczOTppbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzQwLVx0XHRcdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTgwOT1zdGF0aWMgaW50IGJyX2Fmc3BlYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODQxLVx0XHRcdHZpbmZvX2N1cnIgPSBubGFfZGF0YShhdHRyKTtcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjg0MjpcdFx0XHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5faW5mbyhiciwgcCwgY21kLCB2aW5mb19jdXJyLFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODQzLVx0XHRcdFx0XHRcdCAgIFx1MDAyNnZpbmZvX2xhc3QsIGNoYW5nZWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1MTExCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgYnJfcHJvY2Vzc192bGFuX2luZm9gIGZ1bmN0aW9uLgoKKipBbmFseXppbmcgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCoqCgpBbHJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCBoZXJlLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGV5ZSBzY2FucyBmb3IgaXRzIHByaW1hcnkgcHVycG9zZSDigJMgaXQgc2VlbXMgdG8gYmUgaGFuZGxpbmcgVkxBTi1yZWxhdGVkIGNvbmZpZ3VyYXRpb25zIHdpdGhpbiBhIGJyaWRnZSBjb250ZXh0LCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIEkmIzM5O2QgZXhwZWN0IGl0IHRvIGRlYWwgd2l0aCB0YWdnaW5nL3VudGFnZ2luZywgZm9yd2FyZGluZyBkZWNpc2lvbnMgYmFzZWQgb24gVkxBTiBJRHMsIGFuZCBwb3RlbnRpYWxseSBWTEFOIHRydW5raW5nIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHNvbWUgb2YgdGhlIGxpa2VseSBkYXRhIHN0cnVjdHVyZXMgaXQmIzM5O3MgaW50ZXJhY3Rpbmcgd2l0aDogcHJvYmFibHkgYnJpZGdlIHBvcnQgc3RydWN0dXJlcywgVkxBTiBtZW1iZXJzaGlwIHRhYmxlcyAob3IgZXF1aXZhbGVudCksIGFuZCBtYXliZSBzb21lIGxvdy1sZXZlbCBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmVzLgoKSSB3YW50IHRvIGtub3cgaG93IGVmZmljaWVudCBpdCBpcyBhdCBsb29raW5nIHVwIHZsYW4gaW5mb3JtYXRpb24uIElzIGl0IGEgaGFzaCB0YWJsZT8gSXMgaXQgYW4gYXJyYXk/IEhvdyBpcyBpdCBvcmdhbml6ZWQ/CgpGcm9tIGhlcmUsIEkmIzM5O2xsIHF1aWNrbHkgbG9vayBmb3IgYXJlYXMgb2YgcG90ZW50aWFsIGNvbXBsZXhpdHkuIEFyZSB0aGVyZSBhbnkgY29uZGl0aW9uYWwgYnJhbmNoZXMgdGhhdCBtaWdodCBpbmRpY2F0ZSBkaWZmZXJlbnQgVkxBTiBtb2RlcyAoZS5nLiwgYWNjZXNzLCB0cnVuaywgaHlicmlkKT8gRG9lcyBpdCBoYW5kbGUgVkxBTiB0cmFuc2xhdGlvbiBvciBRLWluLVE/IEFyZSB0aGVyZSBhbnkgb2J2aW91cyBhcmVhcyB3aGVyZSBsb2NraW5nIG1pZ2h0IGJlIG5lZWRlZCB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBhY3Jvc3MgbXVsdGlwbGUgdGhyZWFkcyBvciBicmlkZ2UgcG9ydHM/CgpJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIHNlZWluZyBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgbmV0d29yayBkZXZpY2UgZHJpdmVycy4gRG9lcyBpdCB1c2Ugc3RhbmRhcmQgbmV0bGluayBtZXNzYWdlcywgb3IgaXMgaXQgcmVhY2hpbmcgZG93biBpbnRvIHRoZSBkcml2ZXImIzM5O3MgaW50ZXJuYWxzPyBUaGF0IGNhbiBzb21ldGltZXMgYmUgYSBzb3VyY2Ugb2YgcG9ydGFiaWxpdHkgaXNzdWVzLiBJJiMzOTtsbCBhbHNvIGNoZWNrIGZvciBlcnJvciBoYW5kbGluZyDigJMgd2hhdCBoYXBwZW5zIGlmIGEgVkxBTiBJRCBpcyBpbnZhbGlkIG9yIGEgcGFydGljdWxhciBvcGVyYXRpb24gZmFpbHM/IFJvYnVzdCBlcnJvciBoYW5kbGluZyBpcyBrZXksIGVzcGVjaWFsbHkgaW4gYSBuZXR3b3JrIGZ1bmN0aW9uLgoKRXNzZW50aWFsbHksIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gYmUgYSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlLCBhbmQgSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGl0IHRob3JvdWdobHkgdG8gZW5zdXJlIHRoZSBicmlkZ2UmIzM5O3MgVkxBTiBmdW5jdGlvbmFsaXR5IGlzIHBlcmZvcm1pbmcgb3B0aW1hbGx5LCBzZWN1cmVseSwgYW5kIGluIGxpbmUgd2l0aCBteSBvdmVyYWxsIG5ldHdvcmsgYXJjaGl0ZWN0dXJlIGRlc2lnbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDczOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNzM5Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl9pbmZvKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbiA3NDA6XHRcdFx0XHQgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcbiA3NDE6XHRcdFx0XHQgc3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2N1cnIsXG4gNzQyOlx0XHRcdFx0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICoqdmluZm9fbGFzdCxcbiA3NDM6XHRcdFx0XHQgYm9vbCAqY2hhbmdlZCxcbiA3NDQ6XHRcdFx0XHQgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIDc0NTpcdHtcbiA3NDY6XHRcdGludCBlcnIsIHJ0bV9jbWQ7XG4gNzQ3Olx0XG4gNzQ4Olx0XHRpZiAoIWJyX3ZsYW5fdmFsaWRfaWQodmluZm9fY3Vyci1cdTAwM2V2aWQsIGV4dGFjaykpXG4gNzQ5Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDc1MDpcdFxuIDc1MTpcdFx0LyogbmVlZGVkIGZvciB2bGFuLW9ubHkgTkVXVkxBTi9ERUxWTEFOIG5vdGlmaWNhdGlvbnMgKi9cbiA3NTI6XHRcdHJ0bV9jbWQgPSBicl9hZnNwZWNfY21kX3RvX3J0bShjbWQpO1xuIDc1MzpcdFxuIDc1NDpcdFx0aWYgKHZpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcbiA3NTU6XHRcdFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxuIDc1NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDc1NzpcdFx0XHQqdmluZm9fbGFzdCA9IHZpbmZvX2N1cnI7XG4gNzU4Olx0XHRcdHJldHVybiAwO1xuIDc1OTpcdFx0fVxuIDc2MDpcdFxuIDc2MTpcdFx0aWYgKCp2aW5mb19sYXN0KSB7XG4gNzYyOlx0XHRcdHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvIHRtcF92aW5mbztcbiA3NjM6XHRcdFx0aW50IHYsIHZfY2hhbmdlX3N0YXJ0ID0gMDtcbiA3NjQ6XHRcbiA3NjU6XHRcdFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxuIDc2NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDc2NzpcdFxuIDc2ODpcdFx0XHRtZW1jcHkoXHUwMDI2dG1wX3ZpbmZvLCAqdmluZm9fbGFzdCxcbiA3Njk6XHRcdFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbykpO1xuIDc3MDpcdFx0XHRmb3IgKHYgPSAoKnZpbmZvX2xhc3QpLVx1MDAzZXZpZDsgdiBcdTAwM2M9IHZpbmZvX2N1cnItXHUwMDNldmlkOyB2JiM0MzsmIzQzOykge1xuIDc3MTpcdFx0XHRcdGJvb2wgY3Vycl9jaGFuZ2UgPSBmYWxzZTtcbiA3NzI6XHRcbiA3NzM6XHRcdFx0XHR0bXBfdmluZm8udmlkID0gdjtcbiA3NzQ6XHRcdFx0XHRlcnIgPSBicl92bGFuX2luZm8oYnIsIHAsIGNtZCwgXHUwMDI2dG1wX3ZpbmZvLCBcdTAwMjZjdXJyX2NoYW5nZSxcbiA3NzU6XHRcdFx0XHRcdFx0ICAgZXh0YWNrKTtcbiA3NzY6XHRcdFx0XHRpZiAoZXJyKVxuIDc3NzpcdFx0XHRcdFx0YnJlYWs7XG4gNzc4Olx0XHRcdFx0aWYgKGN1cnJfY2hhbmdlKSB7XG4gNzc5Olx0XHRcdFx0XHQqY2hhbmdlZCA9IGN1cnJfY2hhbmdlO1xuIDc4MDpcdFx0XHRcdFx0aWYgKCF2X2NoYW5nZV9zdGFydClcbiA3ODE6XHRcdFx0XHRcdFx0dl9jaGFuZ2Vfc3RhcnQgPSB2O1xuIDc4MjpcdFx0XHRcdH0gZWxzZSB7XG4gNzgzOlx0XHRcdFx0XHQvKiBub3RoaW5nIHRvIG5vdGlmeSB5ZXQgKi9cbiA3ODQ6XHRcdFx0XHRcdGlmICghdl9jaGFuZ2Vfc3RhcnQpXG4gNzg1Olx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuIDc4NjpcdFx0XHRcdFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfY2hhbmdlX3N0YXJ0LFxuIDc4NzpcdFx0XHRcdFx0XHQgICAgICAgdiAtIDEsIHJ0bV9jbWQpO1xuIDc4ODpcdFx0XHRcdFx0dl9jaGFuZ2Vfc3RhcnQgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjM3MAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIFZMQU4gVmFsaWRhdGlvbioqCgpPa2F5LCBJJiMzOTttIHRyYWNpbmcgdGhyb3VnaCB0aGlzIGBicl9wcm9jZXNzX3ZsYW5faW5mb2AgZnVuY3Rpb24gbm93LiBJdCYjMzk7cyBjYWxsaW5nIGBicl92bGFuX3ZhbGlkX3JhbmdlYCwgYW5kIHRoYXQgaW1tZWRpYXRlbHkgZmxhZ3MgbXkgaW50ZXJlc3QuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgVkxBTiByYW5nZSBpcyBiZWluZyB2YWxpZGF0ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgZnVuY3Rpb24uIExldCYjMzk7cyBkaWcgaW50byBgYnJfdmxhbl92YWxpZF9yYW5nZWAgYW5kIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIHRoZXJlLiBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgcmFuZ2UgdmFsaWRhdGlvbiBpcyBiZWluZyBjb3JyZWN0bHkgaW1wbGVtZW50ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JyX3ZsYW5fdmFsaWRfcmFuZ2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz03Mzk9aW50IGJyX3Byb2Nlc3Nfdmxhbl9pbmZvKHN0cnVjdCBuZXRfYnJpZGdlICpicixcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NTQtXHRpZiAodmluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6NzU1Olx0XHRpZiAoIWJyX3ZsYW5fdmFsaWRfcmFuZ2UodmluZm9fY3VyciwgKnZpbmZvX2xhc3QsIGV4dGFjaykpXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NTYtXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4tLVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzY0LVxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6NzY1Olx0XHRpZiAoIWJyX3ZsYW5fdmFsaWRfcmFuZ2UodmluZm9fY3VyciwgKnZpbmZvX2xhc3QsIGV4dGFjaykpXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NjYtXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT40bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NzkyCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipIdW50aW5nIERvd24gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaW5kIHRoZSBkZWZpbml0aW9uIG9yIHVzYWdlIG9mIGBicl92bGFuX3ZhbGlkX3JhbmdlYC4gSW1tZWRpYXRlbHksIG15IG1lbnRhbCBwcm9jZXNzIGp1bXBzIHRvIHRoaW5raW5nIGFib3V0IHdoZXJlIEkgd291bGQgdHlwaWNhbGx5IGZpbmQgc3VjaCBhIHZhcmlhYmxlLiBHaXZlbiB0aGUgbmFtZSwgYW5kIG15IGV4cGVyaWVuY2Ugd2l0aCBicmlkZ2luZyBhbmQgVkxBTnMsIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgdG8gYmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8gdmFsaWRhdGluZyBWTEFOIElEcyB3aXRoaW4gYSBicmlkZ2UgY29udGV4dC4gSXQgY291bGQgYmUgYSBtYWNybywgYSBjb25zdGFudCwgYSBmdW5jdGlvbiwgb3IgZXZlbiBhIGdsb2JhbCB2YXJpYWJsZSwgcHJvYmFibHkgZGVmaW5lZCB3aXRoaW4gYSBoZWFkZXIgZmlsZSBvciBwZXJoYXBzIHJlbGF0ZWQgdG8gdGhlIGJyaWRnZSBkcml2ZXIgY29kZSBpdHNlbGYuIE15IGluaXRpYWwgc2VhcmNoIHdvdWxkIGxpa2VseSBpbnZvbHZlIGdyZXBwaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IGNvZGViYXNlLCBzdGFydGluZyB3aXRoIHRoZSBicmlkZ2UgdXRpbGl0aWVzLCBuZXR3b3JraW5nIGxpYnJhcmllcywgb3IgYW55IGtlcm5lbCBtb2R1bGVzIHJlbGF0ZWQgdG8gYnJpZGdpbmcuIEkmIzM5O2QgYmUgbG9va2luZyBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIHRoYXQgc2VlbSByZWxldmFudCwgYW5kIEkmIzM5O2QgZXhwYW5kIGZyb20gdGhlcmUuIFRoaXMgd2lsbCBwcm9iYWJseSBsZWFkIHRvIHJlYWRpbmcgc29tZSBkb2N1bWVudGF0aW9uIGFuZCBsb29raW5nIGF0IGNvbW1vbiBwbGFjZXMgZm9yIFZMQU4gY29uZmlndXJhdGlvbiBjb2RlLiBJJiMzOTtsbCBuZWVkIHRvIGNvbnNpZGVyIGhvdyBkaWZmZXJlbnQgYnJpZGdlIGltcGxlbWVudGF0aW9ucyBtaWdodCBoYW5kbGUgVkxBTiB2YWxpZGF0aW9uLiBJcyBpdCBhIGdlbmVyaWMgcmFuZ2UsIG9yIGltcGxlbWVudGF0aW9uLXNwZWNpZmljPyBJcyBpdCBoYXJkY29kZWQsIG9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyYWJsZT8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnJfdmxhbl92YWxpZF9yYW5nZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGluay5jPTczOT1pbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxuLS1cbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1NC1cdGlmICh2aW5mb19jdXJyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NTU6XHRcdGlmICghYnJfdmxhbl92YWxpZF9yYW5nZSh2aW5mb19jdXJyLCAqdmluZm9fbGFzdCwgZXh0YWNrKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1Ni1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03NjQtXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NjU6XHRcdGlmICghYnJfdmxhbl92YWxpZF9yYW5nZSh2aW5mb19jdXJyLCAqdmluZm9fbGFzdCwgZXh0YWNrKSlcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2Ni1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaD02OTE9c3RhdGljIGlubGluZSBib29sIGJyX3ZsYW5fdmFsaWRfaWQodTE2IHZpZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuLS1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oLTcwMC1cbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oOjcwMTpzdGF0aWMgaW5saW5lIGJvb2wgYnJfdmxhbl92YWxpZF9yYW5nZShjb25zdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqY3VyLFxubmV0L2JyaWRnZS9icl9wcml2YXRlLmgtNzAyLVx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICpsYXN0LFxuLS1cbm5ldC9icmlkZ2UvYnJfdmxhbi5jPTIxODI9c3RhdGljIGludCBicl92bGFuX3J0bV9wcm9jZXNzX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9icmlkZ2UvYnJfdmxhbi5jLTIyMzgtXHRcdGlmICghYnJfdmxhbl92YWxpZF9pZCh2aW5mby1cdTAwM2V2aWQsIGV4dGFjaykgfHxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jOjIyMzk6XHRcdCAgICAhYnJfdmxhbl92YWxpZF9yYW5nZSh2aW5mbywgdmluZm9fbGFzdCwgZXh0YWNrKSlcbm5ldC9icmlkZ2UvYnJfdmxhbi5jLTIyNDAtXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NTgyCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgVkxBTiBWYWxpZGF0aW9uIFJhbmdlKioKCk9rYXksIHNvIEkgbmVlZCB0byBjaGVjayBvdXQgYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgLiBJJiMzOTttIGdvaW5nIHRvIGp1bXAgaW50byBgbmV0L2JyaWRnZS9icl9wcml2YXRlLmhgLiBJJiMzOTttIGFzc3VtaW5nIGl0JiMzOTtzIGRlZmluaW5nIHRoZSB2YWxpZCBWTEFOIElEIHJhbmdlIGZvciB0aGUgYnJpZGdlIGRyaXZlci4gUHJvYmFibHkgc29tZSBjb25zdGFudHMgb3IgbWFjcm9zLiBJJiMzOTttIGN1cmlvdXMgaWYgdGhleSYjMzk7dmUgdXNlZCBiaXQgbWFza3MsIGVudW1zLCBvciBqdXN0IHN0cmFpZ2h0IGludGVnZXIgcmFuZ2VzLiBLbm93aW5nIHRoZSB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIGhvdyB0aGUgZHJpdmVyIGhhbmRsZXMgVkxBTiBmaWx0ZXJpbmcgYW5kIHBvdGVudGlhbCBjb25mbGljdHMuIEkmIzM5O20gaW50ZXJlc3RlZCBpbiB0aGUgaW5jbHVzaXZlL2V4Y2x1c2l2ZSBuYXR1cmUgb2YgdGhlIHJhbmdlLCB0b28uIEdvdHRhIG1ha2Ugc3VyZSBJJiMzOTttIGNyeXN0YWwgY2xlYXIgb24gdGhhdCBhc3BlY3QgYmVmb3JlIEkgc3RhcnQgdGlua2VyaW5nIHdpdGggYW55IFZMQU4gc2V0dGluZ3Mgb3IgZGVidWdnaW5nIHJlbGF0ZWQgaXNzdWVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlIHRvIHVuZGVyc3RhbmQgY29ycmVjdCBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNzAwOlx0XG4gNzAxOlx0c3RhdGljIGlubGluZSBib29sIGJyX3ZsYW5fdmFsaWRfcmFuZ2UoY29uc3Qgc3RydWN0IGJyaWRnZV92bGFuX2luZm8gKmN1cixcbiA3MDI6XHRcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqbGFzdCxcbiA3MDM6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gNzA0Olx0e1xuIDcwNTpcdFx0LyogcHZpZCBmbGFnIGlzIG5vdCBhbGxvd2VkIGluIHJhbmdlcyAqL1xuIDcwNjpcdFx0aWYgKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19QVklEKSB7XG4gNzA3Olx0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O1B2aWQgaXNuJiMzOTt0IGFsbG93ZWQgaW4gYSByYW5nZVwmIzM0Oyk7XG4gNzA4Olx0XHRcdHJldHVybiBmYWxzZTtcbiA3MDk6XHRcdH1cbiA3MTA6XHRcbiA3MTE6XHRcdC8qIHdoZW4gY3VyIGlzIHRoZSByYW5nZSBlbmQsIGNoZWNrIGlmOlxuIDcxMjpcdFx0ICogIC0gaXQgaGFzIHJhbmdlIHN0YXJ0IGZsYWdcbiA3MTM6XHRcdCAqICAtIHJhbmdlIGlkcyBhcmUgaW52YWxpZCAoZW5kIGlzIGVxdWFsIHRvIG9yIGJlZm9yZSBzdGFydClcbiA3MTQ6XHRcdCAqL1xuIDcxNTpcdFx0aWYgKGxhc3QpIHtcbiA3MTY6XHRcdFx0aWYgKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDcxNzpcdFx0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O0ZvdW5kIGEgbmV3IHZsYW4gcmFuZ2Ugc3RhcnQgd2hpbGUgcHJvY2Vzc2luZyBvbmVcJiMzNDspO1xuIDcxODpcdFx0XHRcdHJldHVybiBmYWxzZTtcbiA3MTk6XHRcdFx0fSBlbHNlIGlmICghKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MTkwCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBwcmVzZW50ZWQgYXMgaWYgaXQgd2VyZSBteSBvd24gaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipEaXZpbmcgRGVlcGVyIGludG8gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKioKCkFscmlnaHQsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGBicl92bGFuX3ZhbGlkX3JhbmdlYCBhZ2Fpbi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQgbmVlZHMgYSBjbG9zZXIgbG9vay4gSSYjMzk7bSBhbHJlYWR5IHByZXR0eSBmYW1pbGlhciB3aXRoIHRoZSBicm9hZGVyIFZMQU4gY29uY2VwdHMsIGFuZCBob3cgdGhleSByZWxhdGUgdG8gYnJpZGdpbmcsIGJ1dCB0aGVyZSYjMzk7cyBhbHdheXMgdGhlIHBvdGVudGlhbCBmb3IgZWRnZSBjYXNlcyBvciBzdWJ0bGUgaW50ZXJhY3Rpb25zIHRoYXQgYXJlbiYjMzk7dCBpbW1lZGlhdGVseSBvYnZpb3VzLCBlc3BlY2lhbGx5IHdpdGhpbiBhIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGxpa2UgdGhpcy4gVGhpcyBmdW5jdGlvbiBvciBzdHJ1Y3R1cmUgaXMgY2xlYXJseSBwaXZvdGFsIGluIGRlZmluaW5nIHdoYXQgY29uc3RpdHV0ZXMgYSB2YWxpZCBWTEFOIHJhbmdlIGZvciB0aGUgYnJpZGdlLiBHaXZlbiB0aGUgcG90ZW50aWFsIGZvciBjb25mbGljdCBvciBtaXNjb25maWd1cmF0aW9uLCBpdCYjMzk7cyB3b3J0aCByZXZpc2l0aW5nIHRvIHNvbGlkaWZ5IG91ciB1bmRlcnN0YW5kaW5nLiBXZSBuZWVkIGEgY2xlYXIgbWVudGFsIG1vZGVsIG9mIGhvdyBpdCYjMzk7cyB1c2VkIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgYnJpZGdlIGNvZGUuIEFyZSB0aGVyZSBhbnkgYXNzdW1wdGlvbnMgb3IgaW1wbGljaXQgYmVoYXZpb3JzIEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQXJlIHRoZXJlIGFyZWFzIGZvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9uIG9yIHBvdGVudGlhbCByaXNrcyBpbiB0aGUgdmFsaWRhdGlvbiBsb2dpYyBpdCBpbXBsZW1lbnRzPyBSaWdodCBub3csIEkgdGhpbmsgdGhhdCBhIGJpdCBtb3JlIHRpbWUgc3BlbnQgZXhhbWluaW5nIGl0IHdvdWxkIGJlIGJlbmVmaWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlIGJldHRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNzE1Olx0XHRpZiAobGFzdCkge1xuIDcxNjpcdFx0XHRpZiAoY3VyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XG4gNzE3Olx0XHRcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXCYjMzQ7Rm91bmQgYSBuZXcgdmxhbiByYW5nZSBzdGFydCB3aGlsZSBwcm9jZXNzaW5nIG9uZVwmIzM0Oyk7XG4gNzE4Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDcxOTpcdFx0XHR9IGVsc2UgaWYgKCEoY3VyLVx1MDAzZWZsYWdzIFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkpIHtcbiA3MjA6XHRcdFx0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcJiMzNDtWbGFuIHJhbmdlIGVuZCBmbGFnIGlzIG1pc3NpbmdcJiMzNDspO1xuIDcyMTpcdFx0XHRcdHJldHVybiBmYWxzZTtcbiA3MjI6XHRcdFx0fSBlbHNlIGlmIChjdXItXHUwMDNldmlkIFx1MDAzYz0gbGFzdC1cdTAwM2V2aWQpIHtcbiA3MjM6XHRcdFx0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcJiMzNDtFbmQgdmxhbiBpZCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gc3RhcnQgdmxhbiBpZFwmIzM0Oyk7XG4gNzI0Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDcyNTpcdFx0XHR9XG4gNzI2Olx0XHR9XG4gNzI3Olx0XG4gNzI4Olx0XHQvKiBjaGVjayBmb3IgcmVxdWlyZWQgcmFuZ2UgZmxhZ3MgKi9cbiA3Mjk6XHRcdGlmICghKGN1ci1cdTAwM2VmbGFncyBcdTAwMjYgKEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4gfFxuIDczMDpcdFx0XHRcdCAgICBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkpKSB7XG4gNzMxOlx0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O0JvdGggdmxhbiByYW5nZSBmbGFncyBhcmUgbWlzc2luZ1wmIzM0Oyk7XG4gNzMyOlx0XHRcdHJldHVybiBmYWxzZTtcbiA3MzM6XHRcdH1cbiA3MzQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42MS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg4NDAKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxNDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24uIFRoZSBrZXkgaXMgdG8gdW5kZXJzdGFuZCBob3cgaXQgaGFuZGxlcyBWTEFOIHJhbmdlcyBhbmQgdHVubmVsIElEcywgYW5kIHdoeSB0aGUgc3l6Ym90IHJlcG9ydCBmbGFnZ2VkIHRoaXMuIE15IGluaXRpYWwgdGhvdWdodCBpcywgdGhlIGBicl92bGFuX3ZhbGlkX3JhbmdlYCBjaGVjayBlbnN1cmVzIGBjdXItJmd0O3ZpZCAmbHQ7PSBsYXN0LSZndDt2aWRgLCBhbmQgaXQgc2VlbXMgdGhhdCB0aGlzIGNydWNpYWwgY2hlY2sgaXMgKm1pc3NpbmcqIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBJbnRlcmVzdGluZy4gVGhpcyBhYnNlbmNlIG1pZ2h0IGJlIHRoZSBjb3JlIG9mIHRoZSBpc3N1ZS4KClRoZSBmdW5jdGlvbiBjb21wYXJlcyBgKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZClgIHdpdGggYCh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIFRoZSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eSBpcyBpZiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlIHN1YnRyYWN0aW9uIHlpZWxkcyBhIG5lZ2F0aXZlIHJlc3VsdC4gSWYgdGhpcyBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICpzb21laG93KiBtYXRjaGVzIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgKGNvbnZlcnRlZCB0byBgdTMyYCksIHdlIGJ5cGFzcyB0aGUgaW50ZW5kZWQgdmFsaWRhdGlvbiEKCkJ1dCB3YWl0IGEgbWludXRlLi4uIGV2ZW4gaWYgdGhlIGNoZWNrIGlzIGJ5cGFzc2VkLCB0aGUgbG9vcCBgZm9yICh2ID0gdGluZm9fbGFzdC0mZ3Q7dmlkOyB2ICZsdDs9IHRpbmZvX2N1cnItJmd0O3ZpZDsgdiYjNDM7JiM0MzspYCBzdGlsbCAqd291bGRuJiMzOTt0KiBleGVjdXRlLiBJdCYjMzk7cyBiZWNhdXNlIGB2YCBzdGFydHMgYXQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCwgc28gdGhlIGxvb3AgaXMgZWZmZWN0aXZlbHkgc2tpcHBlZCwgcmV0dXJuaW5nIDAuIFdoeSBpcyB0aGlzIGEgcHJvYmxlbT8gIEl0IHNlZW1zIHRoZSBwcmltYXJ5IGlzc3VlIGlzIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgKHN1Y2Nlc3MpIGJ1dCBpdCBoYXMgZWZmZWN0aXZlbHkgZG9uZSBub3RoaW5nIGJlY2F1c2Ugbm8gdmFsaWQgVkxBTnMgYXJlIHByb2Nlc3NlZCBhbmQgbm8gdHVubmVscyB3ZXJlIGFkZGVkLCB5ZXQgdGhlIHVzZXIgaXMgbGVkIHRvIGJlbGlldmUgdGhlIHJhbmdlIHdhcyB2YWxpZC4gSXQgY2xlYXJzIHRoZSBsYXN0IGFuZCBjdXJyZW50IGluZm8gc3RydWN0dXJlcy4gIEVzc2VudGlhbGx5LCB0aGUgcmFuZ2UgaXMgKmlnbm9yZWQqLgoKU28sIGlmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIDAgYW5kIGB0aW5mb19sYXN0LSZndDt2aWRgIGlzIDY1NTM1LCBgdmAgc3RhcnRzIGF0IDY1NTM1LCB3aGljaCBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAsIHdoaWNoIGFsc28gcmVzdWx0cyBpbiBubyBpdGVyYXRpb24gaW4gdGhlIGxvb3AuIFRoZSBgdmAgdmFyaWFibGUgaXMgYW4gYGludGAsIG5vdCBgdTE2YCBvciBgdTMyYC4gVGhpcyBtYWtlcyB0aGUgY29tcGFyaXNvbiBsZXNzIHRyaWNreS4gSSYjMzk7bSBub3Qgc2VlaW5nIGEgbWVtb3J5IGxlYWsgb3IgYSBjcmFzaCBoZXJlLgoKTm93LCBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgdGhlIGRpZmZlcmVuY2VzICpkb24mIzM5O3QqIG1hdGNoLCB3aGVuIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIG5lZ2F0aXZlIGFuZCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgaXMgcG9zaXRpdmUuICBJbiB0aGlzIHNjZW5hcmlvLCB3ZSBnZXQgYW4gYC1FSU5WQUxgIGVycm9yIGFuZCB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaXMgb2JzZXJ2ZWQuCgpUaGVyZWZvcmUsIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgaWYgdGhlIGRpZmZlcmVuY2VzIGRvIG1hdGNoOiB3ZSBnZXQgMCBpbnN0ZWFkIG9mIGAtRUlOVkFMYC4gTm8gbG9vcCBpcyBleGVjdXRlZCwgc28gdGhlIHJlc3VsdCBpcyB0aGUgc2FtZS4gIElzIHRoaXMgYSBidWcgd29ydGggZnV6emluZz8KCkkgdGhpbmsgSSBzZWUgd2hhdCYjMzk7cyBoYXBwZW5pbmcuIFJldHVybmluZyAwIGlzIG1pc2xlYWRpbmcgYmVjYXVzZSBpdCBpbXBsaWVzIHN1Y2Nlc3Mgd2hlbiBhIHJhbmdlIHdhcyBub3QgcHJvY2Vzc2VkLiBJdCBtZWFucyB0aGUgTmV0bGluayBtZXNzYWdlIHByb2Nlc3NpbmcgY29udGludWVzLiBJZiB3ZSByZXR1cm4gYC1FSU5WQUxgLCBpdCBhYm9ydHMuICBUaGUgbWFpbiBpbXBhY3QgaXMgdGhhdCB0aGUgaW50ZXJuYWwgc3RhdGUgKGB0aW5mb19sYXN0YCBhbmQgYHRpbmZvX2N1cnJgKSBpcyAqY2xlYXJlZCouIEFzIGlmIHRoZSByYW5nZSB3YXMgc3VjY2Vzc2Z1bC4KCkdvaW5nIHRocm91Z2ggdGhlIG90aGVyIGxvZ2ljLCBgdGluZm9fY3Vyci0mZ3Q7ZmxhZ3MgJmFtcDsgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTmAgYW5kIGBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORGAsIGlmIHRoZSByYW5nZSBpcyBza2lwcGVkLCB0aGUgZmxhZ3MgYXJlIGNsZWFyZWQuIElmIHRoZSAqbmV4dCogYXR0cmlidXRlIGlzIGFub3RoZXIgYFJBTkdFX0VORGAsIHRoZSBsb2dpYyB3aWxsIGZhaWwuIElmIHRoZSBuZXh0IGF0dHJpYnV0ZSBpcyBhIGBSQU5HRV9CRUdJTmAsIGl0IHdpbGwgc3VjY2VlZCAoYW5kIG92ZXJ3cml0ZSB0aGUgY2xlYXJlZCBgdGluZm9fbGFzdGApLgoKU28sIHdoZW4gdGhlIGRpZmZlcmVuY2VzIG1hdGNoLCB0aGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLCB3aGljaCBtaWdodCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgbGF0ZXIgb24gaW4gdGhlIG5ldGxpbmsgbWVzc2FnZSBwcm9jZXNzaW5nLiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGlzc3VlLgoKTm93IGxldCBtZSBnbyBkZWVwZXIgaW50byBgX192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjU3Olx0c3RhdGljIHZvaWQgX192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcbiAyNTg6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICoqdl9zdGFydCxcbiAyNTk6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICoqdl9lbmQsXG4gMjYwOlx0XHRcdFx0XHQgICAgICAgaW50IHZfY3VyciwgYm9vbCBjdXJyX2NoYW5nZSlcbiAyNjE6XHR7XG4gMjYyOlx0XHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZztcbiAyNjM6XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnY7XG4gMjY0Olx0XG4gMjY1Olx0XHR2ZyA9IG5icF92bGFuX2dyb3VwKHApO1xuIDI2NjpcdFx0aWYgKCF2ZylcbiAyNjc6XHRcdFx0cmV0dXJuO1xuIDI2ODpcdFxuIDI2OTpcdFx0diA9IGJyX3ZsYW5fZmluZCh2Zywgdl9jdXJyKTtcbiAyNzA6XHRcbiAyNzE6XHRcdGlmICghKnZfc3RhcnQpXG4gMjcyOlx0XHRcdGdvdG8gb3V0X2luaXQ7XG4gMjczOlx0XG4gMjc0Olx0XHRpZiAodiBcdTAwMjZcdTAwMjYgY3Vycl9jaGFuZ2UgXHUwMDI2XHUwMDI2IGJyX3ZsYW5fY2FuX2VudGVyX3JhbmdlKHYsICp2X2VuZCkpIHtcbiAyNzU6XHRcdFx0KnZfZW5kID0gdjtcbiAyNzY6XHRcdFx0cmV0dXJuO1xuIDI3NzpcdFx0fVxuIDI3ODpcdFxuIDI3OTpcdFx0YnJfdmxhbl9ub3RpZnkocC1cdTAwM2ViciwgcCwgKCp2X3N0YXJ0KS1cdTAwM2V2aWQsICgqdl9lbmQpLVx1MDAzZXZpZCwgUlRNX05FV1ZMQU4pO1xuIDI4MDpcdG91dF9pbml0OlxuIDI4MTpcdFx0Lyogd2Ugc3RhcnQgYSByYW5nZSBvbmx5IGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyB0byBub3RpZnkgYWJvdXQgKi9cbiAyODI6XHRcdCp2X3N0YXJ0ID0gY3Vycl9jaGFuZ2UgPyB2IDogTlVMTDtcbiAyODM6XHRcdCp2X2VuZCA9ICp2X3N0YXJ0O1xuIDI4NDpcdH1cbiAyODU6XHRcbiAyODY6XHRpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzE2MzcKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA1MjAyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIGEgUG90ZW50aWFsIEJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpZiB0aGUgbG9vcCBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBkb2VzbiYjMzk7dCBleGVjdXRlLCBhbmQgaXQmIzM5O3MgY29uZGl0aW9uYWwgb24gYHZfc3RhcnRgIGFuZCBgdl9lbmRgIGJlaW5nIG5vbi1OVUxMLCB0aGVuIGBicl92bGFuX25vdGlmeWAgd29uJiMzOTt0IGJlIGNhbGxlZCwgd2hpY2ggaXMgZXhwZWN0ZWQuIFRoZSBxdWVzdGlvbiB0aGVuIGJlY29tZXMsIHdoYXQgdHJpZ2dlcnMgdGhlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbG9vcCBpc24mIzM5O3QgZW50ZXJlZCBhbmQgdGhlIGZ1bmN0aW9uJiMzOTtzIHJldHVybiB2YWx1ZSBvZiB6ZXJvIGlzIHdyb25nPwoKVGhlIGtleSBoZXJlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIHRoZSBjb21wYXJpc29uOiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYC4gSWYgdGhpcyBpcyB0cnVlLCB0aGUgbG9vcCAqc2hvdWxkbiYjMzk7dCogZXhlY3V0ZS4gSWYgdGhlIGxvb3AgZXhlY3V0ZXMgd2l0aCB0aG9zZSBjb25mbGljdGluZyB2YWx1ZXMsIHdlIGFyZSBpbiB0cm91YmxlIGFuZCBpdCBuZWVkcyB0byBiZSB1bmRlcnN0b29kLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2aWRzIGFsc28gZXF1YWxzIHRoZSBkaWZmZXJlbmNlIGluIGB0dW5pZGAsIHRoZW4gdGhlIG9yaWdpbmFsIGNvZGUgd291bGQgbm90IGhhdmUgZmxhZ2dlZCB0aGUgZXJyb3IuCgpMZXQmIzM5O3MgYXNzdW1lIHRoZSBjb25kaXRpb24gYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAgKmlzKiBtZXQsIGFuZCB0aGUgbG9vcCBpcyBza2lwcGVkLiBUaGlzIGlzIG5vdyB0aGUgJiMzNDtidWcmIzM0OyB0aGF0IFN5emJvdCBtaWdodCBoYXZlIGZsYWdnZWQuIElzIGl0IGEgYnVnPyBOb3QgaW4gdGhlIHRyYWRpdGlvbmFsIHNlbnNlLCBiZWNhdXNlLCBpdCYjMzk7cyBhIHNpbGVudCBmYWlsdXJlLiBXZSYjMzk7cmUgKm5vdCogY2F1c2luZyBhIGNyYXNoIG9yIG1lbW9yeSBjb3JydXB0aW9uLiBUaGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLiBCdXQgdGhpcyBkb2VzbiYjMzk7dCB2YWxpZGF0ZSB0aGUgbmV0d29yayB0dW5uZWwsIHdoaWNoIGlzIGEgZmxhdy4KCkxldCYjMzk7cyBjaGVjayB0aGUgcGF0Y2g6CgpgYGBjCi0JCWlmICgodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKSAhPQomIzQzOwkJaWYgKHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZCB8fAomIzQzOwkJICAgICh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9CiAJCSAgICAodGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKYGBgCgpUaGUgcGF0Y2ggc3BlY2lmaWNhbGx5IGFkZHJlc3NlcyB0aGUgY2FzZSBvZiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCB0aGF0IGhhZCB0byByZXR1cm4gYC1FSU5WQUxgIGFuZCBhZGRlZCBhbiBpbnZhbGlkIG5ldHdvcmsgdHVubmVsLiBCZWZvcmUgdGhlIHBhdGNoLCBhIGNvbmRpdGlvbiB3aXRoIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGFuZCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgd2FzIG1pc3NpbmcgdmFsaWRhdGlvbiwgYW5kIG5vdyB3ZSBjYXRjaCB0aGF0IGNvbmRpdGlvbi4KCklmIHRoZSByZXR1cm5lZCAwIHNraXBzIHRoZSBsb29wLCBkb2VzIHRoZSBzdGF0ZSBwZXJzaXN0PyBObywgYHRpbmZvX2xhc3RgIGlzIGNsZWFyZWQgd2l0aCBgbWVtc2V0YCwgc28gdGhlIHN0YXRlIGlzIHZhbGlkLiBJZiBpdCByZXR1cm5zIDAsIHRoZSBjb2RlIGNvbnRpbnVlcyB0byB0aGUgbmV4dCBhdHRyaWJ1dGUsIG9yIGl0IHJldHVybnMgdG8gdXNlciBzcGFjZSBpbiBhIGJyb2tlbiBzdGF0ZS4KCldoZXJlIGNvdWxkIHRoaXMgaGF2ZSB0cmlnZ2VyZWQgYSBwcm9ibGVtPyBJJiMzOTttIG5vdCBzZWVpbmcgYW55IG92ZXJmbG93IG9mIGBpbnRgLCBiYXNlZCBvbiB0aGUgdHlwZXMgYW5kIHRoZSBsb29wIGNvbmRpdGlvbi4gSSYjMzk7bSBhbHNvIG5vdCBzZWVpbmcgYW55IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXNzdWVzLiBVQlNBTiBzaG91bGQgbm90IGhhdmUgdHJpZ2dlcmVkIGEgd2FybmluZywgc2luY2UgYSAzMi1iaXQgYGludGAgY2Fubm90IG92ZXJmbG93LiAKClRoZSBtb3N0IGxpa2VseSBpc3N1ZSBpcyB0aGF0IFN5emJvdCBjb3JyZWN0bHkgaWRlbnRpZmllZCB0aGF0IHRoZSBmdW5jdGlvbiBjb3VsZCBzaWxlbnRseSBmYWlsIHZhbGlkYXRpb24gYW5kIHJldHVybiAwLCBpbnN0ZWFkIG9mIGAtRUlOVkFMYCwgaWYgdGhlIGludmFsaWQgYHZpZGAgcmFuZ2UgYWxzbyBtYXRjaGVkIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UuIFRoZSB1c2VyIHdvdWxkIGhhdmUgc2VudCBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgc3lzdGVtIHdvdWxkIGFjY2VwdCBpdCwgYnV0IGRvIG5vdGhpbmcuIFRoaXMgaXMgbm90IGEgc2VjdXJpdHkgZmxhdywgb3IgZXZlbiBhIGNyYXNoLCBidXQgaXMgYW4gdW5kZXNpcmFibGUgYmVoYXZpb3IgdGhhdCBtdXN0IGJlIHZhbGlkYXRlZC4KCkl0JiMzOTtzIGxpa2VseSB0aGF0IGEgcHJldmlvdXMgbG9naWMgZXJyb3IgZXhpc3RzIHdoZXJlIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgIGNvdWxkIHJlc3VsdCBpbiBhbiBpbXByb3BlciByZXR1cm4gb2YgMCBpbnN0ZWFkIG9mIGAtRUlOVkFMYC4gVGhlIHBhdGNoIGZpeGVzIHRoYXQsIGVuc3VyaW5nIGAtRUlOVkFMYCBpcyByZXR1cm5lZCBmb3IgaW52YWxpZCByYW5nZXMuIAoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI4NiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjg2Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gMjg3Olx0XHRcdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuIDI4ODpcdFx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcbiAyODk6XHRcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG4gMjkwOlx0XHRcdFx0XHRib29sICpjaGFuZ2VkKVxuIDI5MTpcdHtcbiAyOTI6XHRcdGludCBlcnI7XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDI5NTpcdFx0XHRpZiAodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcbiAyOTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyOTc6XHRcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiAzMTg6XHRcdFx0XHRcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XG4gMzE5Olx0XHRcdFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXHUwMDI2dl9zdGFydCwgXHUwMDI2dl9lbmQsIHYsXG4gMzIwOlx0XHRcdFx0XHRcdFx0ICAgY3Vycl9jaGFuZ2UpO1xuIDMyMTpcdFx0XHR9XG4gMzIyOlx0XHRcdGlmICh2X3N0YXJ0IFx1MDAyNlx1MDAyNiB2X2VuZClcbiAzMjM6XHRcdFx0XHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cdTAwM2V2aWQsIHZfZW5kLVx1MDAzZXZpZCxcbiAzMjQ6XHRcdFx0XHRcdCAgICAgICBSVE1fTkVXVkxBTik7XG4gMzI1Olx0XHRcdGlmIChlcnIpXG4gMzI2Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAzMjc6XHRcbiAzMjg6XHRcdFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMzI5Olx0XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xuIDMzMDpcdFx0fSBlbHNlIHtcbiAzMzE6XHRcdFx0aWYgKHRpbmZvX2xhc3QtXHUwMDNlZmxhZ3MpXG4gMzMyOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzMzOlx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB0aW5mb19jdXJyLVx1MDAzZXZpZCxcbiAzMzQ6XHRcdFx0XHRcdFx0ICB0aW5mb19jdXJyLVx1MDAzZXR1bmlkLCBjaGFuZ2VkKTtcbiAzMzU6XHRcdFx0aWYgKGVycilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzg1MzMKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA5MzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVW5pbml0aWFsaXplZCBWYXJpYWJsZSBCdWcgaW4gVkxBTiBUdW5uZWwgUHJvY2Vzc2luZyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUsIGFuZCBpbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBgZXJyYC4gVGhlIGNvZGUsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjb25kaXRpb25hbCBgaWYgKHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZClgLCBjYW4gbGVhZCB0byBhIHNpdHVhdGlvbiB3aGVyZSBgZXJyYCBpc24mIzM5O3QgYXNzaWduZWQgYSB2YWx1ZSBiZWZvcmUgaXQmIzM5O3MgdXNlZC4gU3BlY2lmaWNhbGx5LCBpZiB0aGUgbG9vcCBjb25kaXRpb24gYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgZmFsc2UsIGFuZCBpdCBlbmRzIHVwIGluIHRoZSBgZWxzZSBpZiAodGluZm9fY3Vyci0mZ3Q7ZmxhZ3MgJmFtcDsgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpYCBibG9jaywgYGVycmAgd2lsbCByZW1haW4gdW5pbml0aWFsaXplZC4gVGhhdCBtZWFucyB3aGVuIHRoZSBjb2RlIGhpdHMgYGlmIChlcnIpYCwgaXQmIzM5O3MgdXNpbmcgZ2FyYmFnZSwgbGVhZGluZyB0byB1bmRlZmluZWQgYmVoYXZpb3IuIFRoaXMgaXMgYSBjbGFzc2ljIEtNU0FOIGJ1ZywgYW5kIHllcywgS01TQU4gZGVmaW5pdGVseSB3b3VsZCBoYXZlIGNhdWdodCB0aGlzIHVuaW5pdC12YWx1ZSBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4KClRoZSBmaXggY2xldmVybHkgZW5zdXJlcyB0aGUgbG9vcCBleGVjdXRlcyBhdCBsZWFzdCBvbmNlIChieSByZXZlcnNpbmcgdGhlIGNvbXBhcmlzb24pLCBtYWtpbmcgc3VyZSBgZXJyYCBnZXRzIGluaXRpYWxpemVkIHZpYSBgZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyguLi4pYC4gQnJpbGxpYW50IGNhdGNoLCByZWFsbHkhCgpOb3csIHRoZSBmdW5jdGlvbmFsIGltcGFjdCBoZXJlIGlzIHdvcnRoIGNvbnNpZGVyaW5nLiBSZXR1cm5pbmcgYW4gdW5pbml0aWFsaXplZCBlcnJvciBjb2RlIGNvdWxkIGxlYWsga2VybmVsIG1lbW9yeSBvciBsZWFkIHRvIGFyYml0cmFyeSByZXR1cm4gY29kZXMgdG8gdXNlciBzcGFjZSwgd2hpY2ggaXMgZGVmaW5pdGVseSBhIHNlY3VyaXR5IGNvbmNlcm4uIFNvLCB0aGlzIGZpeCBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcgdG8gY29uZmlybSBpdCYjMzk7cyBjb3JyZWN0IGFuZCB0byBsb29rIGZvciBvdGhlciBwb3NzaWJsZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiByZWxhdGVkIGNvZGUgcGF0aHMuCgpJJiMzOTtsbCBiZSBmb2N1c2luZyBvbiBhIGZldyBrZXkgc3ltYm9sczogYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgdGhlIHByaW1hcnkgb25lLiBgYnJfdmxhbl90dW5uZWxfaW5mb2AgYW5kIHRoZSBgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb2AgYXMgd2VsbC4gQWxzbyBgYnJfYWZzcGVjYCBpcyBhIGNhbGxlciBidXQgaXQgaXMgdG9vIGdlbmVyaWMgdG8gYmUgdGhlIG1haW4gZm9jdXMuCgpBcyBmb3IgdGhlIGNvbmZpZ3MsIGBDT05GSUdfQlJJREdFYCBpcyB0aGUga2V5IHJlcXVpcmVtZW50LiBJdCBzZWVtcyB0aGF0IGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBtYXkgYmUgbmVlZGVkIHRvIGZ1bGx5IHRlc3QgZnVuY3Rpb25hbGl0eSwgZXZlbiBpZiB0aGUgdW5pbml0aWFsaXplZCBidWcgZXhpc3RzIHdpdGhvdXQgaXQuIExldCYjMzk7cyBzZWUgLSBgYnJfbmV0bGlua190dW5uZWwuY2AgZ2V0cyBjb21waWxlZCBpZiBgQ09ORklHX0JSSURHRWAgaXMgZW5hYmxlZC4gQnV0IHdoZW4gYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGlzIGRpc2FibGVkLCBgYnJfdmxhbl90dW5uZWxfaW5mb2Agc3RpbGwgZ2V0cyBjYWxsZWQsIGJ1dCBqdXN0IHJldHVybnMgMC4gVGhlIGJ1ZyBpcyBzdGlsbCB0cmlnZ2VyZWQgd2l0aCBgQ09ORklHX0JSSURHRWAgYWxvbmUuIFRoZXJlZm9yZSBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2Agd2lsbCBpbXByb3ZlIHRoZSB0ZXN0IGNvdmVyYWdlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlJJREdFX1ZMQU5fRklMVEVSSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9LY29uZmlnPTM2PWNvbmZpZyBCUklER0VfSUdNUF9TTk9PUElOR1xuLS1cbm5ldC9icmlkZ2UvS2NvbmZpZy00OS1cbm5ldC9icmlkZ2UvS2NvbmZpZzo1MDpjb25maWcgQlJJREdFX1ZMQU5fRklMVEVSSU5HXG5uZXQvYnJpZGdlL0tjb25maWctNTEtXHRib29sIFwmIzM0O1ZMQU4gZmlsdGVyaW5nXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwMTE0CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqSW52ZXN0aWdhdGluZyBWTEFOIEZpbHRlcmluZyBpbiB0aGUgTGludXggQnJpZGdlIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZm9yIGJyaWRnaW5nLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjayB0aGUgZGVwZW5kZW5jaWVzIGZvciBgQlJJREdFX1ZMQU5fRklMVEVSSU5HYC4gVGhhdCBvcHRpb24gaXMgY3JpdGljYWwsIHNvIEkmIzM5O20gYXNzdW1pbmcgaXQgaW5mbHVlbmNlcyBvciByZWxpZXMgb24gYSBmZXcgb3RoZXIgY29uZmlndXJhdGlvbnMgdG8gZnVuY3Rpb24gcHJvcGVybHkuIEkmIzM5O2xsIGhlYWQgb3ZlciB0byBgbmV0L2JyaWRnZS9LY29uZmlnYCB0byBzdGFydCB1bnRhbmdsaW5nIHRob3NlIGRlcGVuZGVuY2llcyBhbmQgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2UgdG8gZW5hYmxlIFZMQU4gZmlsdGVyaW5nIHN1Y2Nlc3NmdWxseS4gSXQmIzM5O3MgYSBrZXkgcGllY2UgaW4gYWxsb3dpbmcgbWUgdG8gbWFuYWdlIGFuZCBzZXBhcmF0ZSBuZXR3b3JrIHRyYWZmaWMgb24gdGhpcyBicmlkZ2UgYW5kIEkgbmVlZCB0byBtYWtlIGNlcnRhaW4gdGhhdCBhbGwgcmVsYXRlZCBzZXR0aW5ncyBhcmUgY29uZmlndXJlZCBwcm9wZXJseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDUwOlx0Y29uZmlnIEJSSURHRV9WTEFOX0ZJTFRFUklOR1xuICA1MTpcdFx0Ym9vbCBcJiMzNDtWTEFOIGZpbHRlcmluZ1wmIzM0O1xuICA1MjpcdFx0ZGVwZW5kcyBvbiBCUklER0VcbiAgNTM6XHRcdGRlcGVuZHMgb24gVkxBTl84MDIxUVxuICA1NDpcdFx0ZGVmYXVsdCBuXG4gIDU1Olx0XHRoZWxwXG4gIDU2Olx0XHQgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHRoZSBFdGhlcm5ldCBicmlkZ2Ugd2lsbCBiZSBhYmxlIHNlbGVjdGl2ZWx5XG4gIDU3Olx0XHQgIHJlY2VpdmUgYW5kIGZvcndhcmQgdHJhZmZpYyBiYXNlZCBvbiBWTEFOIGluZm9ybWF0aW9uIGluIHRoZSBwYWNrZXRcbiAgNTg6XHRcdCAgYW55IFZMQU4gaW5mb3JtYXRpb24gY29uZmlndXJlZCBvbiB0aGUgYnJpZGdlIHBvcnQgb3IgYnJpZGdlIGRldmljZS5cbiAgNTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA0NjEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA3NDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEJyaWRnZSBWTEFOIFR1bm5lbGluZyBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBoZXJlJiMzOTtzIG15IGJyZWFrZG93bi4gSXQgc2VlbXMgYEJSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgcmVsaWFudCBvbiBib3RoIGBCUklER0VgIGFuZCBgVkxBTl84MDIxUWAsIHNvIHRob3NlIHRocmVlIG5lZWQgdG8gYmUgZW5hYmxlZCBpbiBgRW5hYmxlQ29uZmlnc2AuIEkmIzM5O2xsIGFkZCB0aG9zZSByaWdodCBhd2F5LCBJJiMzOTtsbCBhbHNvIGFkZCB0aGUgb2J2aW91cyBvbmVzOiBgQ09ORklHX05FVGAgYW5kIGBDT05GSUdfTkVUX0NPUkVgLgoKTm93LCBsZXQmIzM5O3MgemVybyBpbiBvbiB0aGUga2V5IHN5bWJvbHMuIEkgbmVlZCB0byBrZWVwIGFuIGV5ZSBvbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCwgYGJyX3ZsYW5fdHVubmVsX2luZm9gLCBhbmQgYGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm9gLiBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBub25lIG9mIHRoZXNlIGFyZSBzdGF0aWMsIHdoaWNoIGlzIGdvb2QgdG8ga25vdyBmb3IgZnVydGhlciBhbmFseXNpcy4gVGhleSYjMzk7cmUgYWxsIGRlY2xhcmVkIGluIGBicl9wcml2YXRlX3R1bm5lbC5oYC4KClRoZSBjb3JlIGlzc3VlIGhlcmUgaXMgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSwgYGVycmAsIHdpdGhpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gRXNzZW50aWFsbHksIGlmIHNvbWVvbmUgY3JhZnRzIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUgd2l0aCBhbiBlbmQgYHZpZGAgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgaGFwcGVucyB0byBtYXRjaCB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24sIHRoZSBsb29wIGBmb3IgKHYgPSB0aW5mb19sYXN0LSZndDt2aWQ7IHYgJmx0Oz0gdGluZm9fY3Vyci0mZ3Q7dmlkOyB2JiM0MzsmIzQzOylgIGdldHMgc2tpcHBlZC4gVGhhdCBsZWF2ZXMgYGVycmAgdW50b3VjaGVkLCBidXQgdGhlIGNvZGUgbGF0ZXIgY2hlY2tzIGlmIGBlcnJgIGlzIHRydWUsIGxlYWRpbmcgdG8gYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGxlYWsgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RhY2sgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIHNvIHRoYXQmIzM5O3MgYSBkZWZpbml0ZSBzZWN1cml0eSBjb25jZXJuLiBUaGUgcGF0Y2ggZml4ZXMgdGhpcyBieSBkaXJlY3RseSBjaGVja2luZyBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCBhbmQgcmV0dXJuaW5nIGAtRUlOVkFMYC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIHdpdGggcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWssIHdoaWNoIG1lYW5zIGZ1enppbmcgaXMgd2FycmFudGVkLgoKTmV4dCwgSSBuZWVkIHRvIGNoZWNrIGhvdyByZWFjaGFibGUgdGhpcyBpcyBmcm9tIHVzZXIgc3BhY2UuIExvb2tzIGxpa2UgdGhpcyBpcyByZWFjaGFibGUgdmlhIGBydG5ldGxpbmtgLCBzcGVjaWZpY2FsbHkgYFJUTV9TRVRMSU5LYCBvbiBhIGJyaWRnZSBwb3J0LCBzbyBpdCYjMzk7cyBkaXJlY3RseSBleHBvc2VkLiBUbyBkbyB0aGF0IHlvdSBuZWVkIGBDQVBfTkVUX0FETUlOYCBpbiB0aGUgbmV0d29yayBuYW1lc3BhY2UsIHdoaWNoIGlzIGVhc3kgdG8gZ2V0IHdpdGggdXNlciBuYW1lc3BhY2VzLiBUaGlzIGlzIGZ1bGx5IHJlYWNoYWJsZSwgYW5kIEkmIzM5O2xsIGJlIGNlcnRhaW4gdG8gZG9jdW1lbnQgdGhhdCBpbiB0aGUgZm9ybWF0dGVkIG91dHB1dC4KCioqV29ydGhGdXp6aW5nOiB0cnVlKioKCioqUmVhc29uaW5nOioqIFRoZSBwYXRjaCBhZGRyZXNzZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIHdpdGhpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gSWYgdGhlIGVuZCBgdmlkYCBpbiBhIFZMQU4gdHVubmVsIHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnQgYHZpZGAsIGFuZCB0aGVpciBgdHVuaWRgIGRpZmZlcmVuY2VzIG1hdGNoIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiwgdGhlIHByb2Nlc3NpbmcgbG9vcCBpcyBza2lwcGVkLiBUaGlzIGxlYXZlcyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZCwgd2hpY2ggaXMgbGF0ZXIgZXZhbHVhdGVkIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5mb3JtYXRpb24gbGVhay4KCioqRm9jdXNTeW1ib2xzOioqIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLCBgYnJfdmxhbl90dW5uZWxfaW5mb2AsIGBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvYAoKKipFbmFibGVDb25maWdzOioqIGBCUklER0VgLCBgQlJJREdFX1ZMQU5fRklMVEVSSU5HYCwgYFZMQU5fODAyMVFgCgpPa2F5LCBqdXN0IGNvbmZpcm1pbmcgdGhlIGNvbmZpZyBuYW1lIGlzIGluZGVlZCBgVkxBTl84MDIxUWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBWTEFOXzgwMjFRJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0LzgwMjFxLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvODAyMXEvS2NvbmZpZy01LVxubmV0LzgwMjFxL0tjb25maWc6Njpjb25maWcgVkxBTl84MDIxUVxubmV0LzgwMjFxL0tjb25maWctNy1cdHRyaXN0YXRlIFwmIzM0OzgwMi4xUS84MDIuMWFkIFZMQU4gU3VwcG9ydFwmIzM0O1xuLS1cbm5ldC84MDIxcS9LY29uZmlnLTIxLVxubmV0LzgwMjFxL0tjb25maWc6MjI6Y29uZmlnIFZMQU5fODAyMVFfR1ZSUFxubmV0LzgwMjFxL0tjb25maWctMjMtXHRib29sIFwmIzM0O0dWUlAgKEdBUlAgVkxBTiBSZWdpc3RyYXRpb24gUHJvdG9jb2wpIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvODAyMXEvS2NvbmZpZy0zMS1cbm5ldC84MDIxcS9LY29uZmlnOjMyOmNvbmZpZyBWTEFOXzgwMjFRX01WUlBcbm5ldC84MDIxcS9LY29uZmlnLTMzLVx0Ym9vbCBcJiMzNDtNVlJQIChNdWx0aXBsZSBWTEFOIFJlZ2lzdHJhdGlvbiBQcm90b2NvbCkgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjEzNQoJCQkJCQkJb3V0cHV0OiAyNDgKCQkJCQkJCXRob3VnaHRzOiA1OTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBWTEFOIFR1bm5lbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nKioKCk9rYXksIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGBWTEFOXzgwMjFRYC4gTXkgaW5pdGlhbCBxdWVzdGlvbiBpcyBpZiB0aGlzIGludm9sdmVzIGFueSBvdGhlciBtb2RpZmllZCBmdW5jdGlvbnMsIGJ1dCBpdCYjMzk7cyBqdXN0IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBHb29kLCB0aGF0IG5hcnJvd3MgdGhlIHNjb3BlLgoKTm93LCBsZXQmIzM5O3MgY29uZmlybSBpZiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBpcyBpbmxpbmVkLiBJdCYjMzk7cyBkZWZpbmVkIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgIGFuZCBjYWxsZWQgZnJvbSBgbmV0L2JyaWRnZS9icl9uZXRsaW5rLmNgLCBpbiBzZXBhcmF0ZSB0cmFuc2xhdGlvbiB1bml0cy4gU2luY2UgaXQmIzM5O3Mgbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGlubGluZSBhbmQgd2UmIzM5O3JlIG5vdCB1c2luZyBMaW5rLVRpbWUgT3B0aW1pemF0aW9uIChMVE8pLCBJIGNhbiByZWFzb25hYmx5IGFzc3VtZSBpdCB3b24mIzM5O3QgYmUgaW5saW5lZC4gVGhpcyBtYWtlcyBpdCBhIGdvb2Qgc3ltYm9sIHRvIGZvY3VzIG9uIGZvciBhbmFseXNpcy4KClRpbWUgZm9yIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGludGVnZXIgcHJvbW90aW9uIHJ1bGVzLiBXZSBoYXZlIGB0aW5mb19jdXJyLSZndDt2aWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgYm90aCBgdTE2YC4gVGhlaXIgZGlmZmVyZW5jZSBpcyBwcm9tb3RlZCB0byBgaW50YC4gU2ltaWxhcmx5LCBgdGluZm9fY3Vyci0mZ3Q7dHVuaWRgIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dHVuaWRgLCBib3RoIGB1MzJgLCBhbmQgdGhlaXIgZGlmZmVyZW5jZSByZW1haW5zIGB1MzJgLiBUaGUgY29tcGFyaXNvbiB1c2VzIGAhPWAgYmV0d2VlbiB0aGUgYGludGAgcmVzdWx0IGZyb20gdGhlIGB2aWRgIGRpZmZlcmVuY2UgYW5kIHRoZSBgdTMyYCByZXN1bHQgZnJvbSB0aGUgYHR1bmlkYCBkaWZmZXJlbmNlOyB0aGlzIG1lYW5zIHRoZSBgaW50YCB3aWxsIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgYHUzMmAgZm9yIHRoZSBjb21wYXJpc29uLgoKTGV0JiMzOTtzIHRlc3QgdGhpcyB3aXRoIHNwZWNpZmljIHZhbHVlcy4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgMCBhbmQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgaXMgMTAsIHRoZSBgdmlkYCBkaWZmZXJlbmNlIGlzIC0xMC4gQXMgYSBgdTMyYCwgLTEwIGJlY29tZXMgNDI5NDk2NzI4Ni4gSWYgYHRpbmZvX2N1cnItJmd0O3R1bmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGlzIDEwLCB0aGUgYHR1bmlkYCBkaWZmZXJlbmNlIGlzIGFsc28gNDI5NDk2NzI4NiAoZHVlIHRvIHRoZSBgdTMyYCBhcml0aG1ldGljKS4gVGh1cywgYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9ICh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAgaXMgYDQyOTQ5NjcyODYgIT0gNDI5NDk2NzI4NmAsIHdoaWNoIHJlc29sdmVzIHRvIEZBTFNFLiBUaGF0JiMzOTtzIGdvb2QsIGJlY2F1c2UgaXQgbWVhbnMgdGhlIGNvZGUgYnlwYXNzZXMgdGhlIGAtRUlOVkFMYCByZXR1cm4uCgpUaGUgbmV4dCBzdGVwcyBzZXQgYHRgIHRvIGB0aW5mb19sYXN0LSZndDt0dW5pZGAgKHdoaWNoIGlzIDEwKSBhbmQgdGhlbiB0aGUgbG9vcCBgZm9yICh2ID0gMTA7IHYgJmx0Oz0gMDsgdiYjNDM7JiM0MzspYC4gVGhlIGxvb3AgY29uZGl0aW9uIGAxMCAmbHQ7PSAwYCBpcyBGQUxTRSwgc28gdGhlIGxvb3AgZG9lc24mIzM5O3QgZXhlY3V0ZSBhdCBhbGwuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYGVycmAgdmFyaWFibGUsIHdoaWNoIGlzIHVzZWQgbGF0ZXIsIGlzIG5ldmVyIGluaXRpYWxpemVkLiBUaHVzLCBgaWYgKGVycilgIHdpbGwgZXZhbHVhdGUgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSwgYW5kIHRoaXMgaXMgdGhlIGJ1ZyEgVGhhdCYjMzk7cyBpdCEKCk15IGV4cGxhbmF0aW9uIGlzIHJvY2sgc29saWQsIG5vdyBJJiMzOTtsbCB1c2UgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43Mi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JSSURHRSYjMzQ7LAogICAgJiMzNDtCUklER0VfVkxBTl9GSUxURVJJTkcmIzM0OywKICAgICYjMzQ7VkxBTl84MDIxUSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyYjMzQ7LAogICAgJiMzNDticl92bGFuX3R1bm5lbF9pbmZvJiMzNDssCiAgICAmIzM0O2JyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlJJREdFJiMzNDssCiAgICAmIzM0O0JSSURHRV9WTEFOX0ZJTFRFUklORyYjMzQ7LAogICAgJiMzNDtWTEFOXzgwMjFRJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvJiMzNDssCiAgICAmIzM0O2JyX3ZsYW5fdHVubmVsX2luZm8mIzM0OywKICAgICYjMzQ7YnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIEtNU0FOIHVuaW5pdC12YWx1ZSBidWcgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AuIFdoZW4gcHJvY2Vzc2luZyBhIGBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORGAgYXR0cmlidXRlLCBpZiBhIHVzZXIgcHJvdmlkZXMgYSBWTEFOIHR1bm5lbCByYW5nZSB3aGVyZSB0aGUgZW5kIGB2aWRgIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnQgYHZpZGAsIGFuZCB0aGUgYHR1bmlkYCBkaWZmZXJlbmNlIG1hdGNoZXMgdGhlIG5lZ2F0aXZlIGB2aWRgIGRpZmZlcmVuY2UgKHdoaWNoIGlzIHBvc3NpYmxlIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiBhbmQgdW5zaWduZWQgMzItYml0IGFyaXRobWV0aWMgd3JhcC1hcm91bmQpLCB0aGUgdmFsaWRhdGlvbiBjaGVjayBpcyBieXBhc3NlZC4gQ29uc2VxdWVudGx5LCB0aGUgcHJvY2Vzc2luZyBsb29wIGV4ZWN1dGVzIHplcm8gdGltZXMsIGxlYXZpbmcgdGhlIGBlcnJgIHZhcmlhYmxlIHVuaW5pdGlhbGl6ZWQuIFRoaXMgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpcyBsYXRlciBldmFsdWF0ZWQgYW5kIHBvdGVudGlhbGx5IHJldHVybmVkIHRvIHVzZXIgc3BhY2UsIGNhdXNpbmcgYW4gaW5mb3JtYXRpb24gbGVhay4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIHdpdGggc2VjdXJpdHkgaW1wbGljYXRpb25zLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjczLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0OTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT41bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSB2YWxpZGF0aW9uIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBWTEFOIElEIG9mIHRoZSBjdXJyZW50IHR1bm5lbCBpbmZvIGlzIG5vdCBsZXNzIHRoYW4gdGhlIFZMQU4gSUQgb2YgdGhlIGxhc3QgdHVubmVsIGluZm8gKHByZXZlbnRpbmcgYSBuZWdhdGl2ZSByYW5nZSkuIFRoaXMgZml4ZXMgYSBsb2dpYyBidWcgd2hlcmUgYSBuZWdhdGl2ZSByYW5nZSBjb3VsZCBieXBhc3MgdGhlIHZhbGlkYXRpb24gY2hlY2sgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bmRlcmZsb3csIGxlYWRpbmcgdG8gaW5jb3JyZWN0IGhhbmRsaW5nIG9mIFZMQU4gdHVubmVsIHJhbmdlcy4gVGhpcyBpc3N1ZSBkb2VzIG5vdCBpbnZvbHZlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLCBvciB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgaW4gY29udHJvbCBmbG93LiBJdCBpcyBhIGxvZ2ljIGFuZCBib3VuZHMtY2hlY2tpbmcgaXNzdWUuIFRoZXJlZm9yZSwgS01TQU4gaXMgbm90IHJlcXVpcmVkLCBhcyBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMTQgMTQ6MzU6MjcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMKaW5kZXggNzFhMTJkYTMwMDA0Yy4uMDVmNTYwZWViNzg5YyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYwpAQCAtMzAxLDcgJiM0MzszMDEsOCBAQCBpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAogCQlpZiAoISh0aW5mb19sYXN0LSZndDtmbGFncyAmYW1wOyBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0KJiM0MzsJCWlmICh0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWQgfHwKJiM0MzsJCSAgICAodGluZm9fY3Vyci0mZ3Q7dmlkIC0gdGluZm9fbGFzdC0mZ3Q7dmlkKSAhPQogCQkgICAgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXQgPSB0aW5mb19sYXN0LSZndDt0dW5pZDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNDUKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA4NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgQnJpZGdlIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgYnJfbmV0bGlua190dW5uZWwuY2AsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBhIGZ1bmN0aW9uIGNhbGxlZCBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gVGhlIHBhdGNoIHNlZW1zIHRvIGJlIG1vZGlmeWluZyB0aGlzIGZ1bmN0aW9uLCBhbmQgdGhlIG1vc3Qgbm90YWJsZSBhZGRpdGlvbiBpcyBhIGNoZWNrOiBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYCBiZWZvcmUgZXZhbHVhdGluZyB0aGUgZGlmZmVyZW5jZS4gTXkgaW5pdGlhbCBpbXByZXNzaW9uLCBjb25zaWRlcmluZyB0aGUgc3Vycm91bmRpbmcgY29udGV4dCwgaXMgdGhhdCB0aGlzIGlzIGxpa2VseSBhbiBhdHRlbXB0IHRvIGd1YXJkIGFnYWluc3QgaW50ZWdlciB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIHZ1bG5lcmFiaWxpdHkgdHlwZSBpbiBrZXJuZWwgY29kZSwgc28gaXQgbWFrZXMgc2Vuc2UgdG8gc2NydXRpbml6ZSB0aGlzIGNoYW5nZS4gSSBzaG91bGQgcHJvYmFibHkgZGl2ZSBkZWVwZXIgaW50byB0aGUgY29kZSBvZiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBhbmQgdGhlIHN1cnJvdW5kaW5nIGxvZ2ljIHRvIHVuZGVyc3RhbmQgdGhlIHZ1bG5lcmFiaWxpdHkgdGhpcyBwYXRjaCBpcyBhZGRyZXNzaW5nIGFuZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZpeCBpcyBjb3JyZWN0IGFuZCBzdWZmaWNpZW50bHkgcm9idXN0LiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGF0IGZ1bmN0aW9uLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE0IDE0OjQ5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyODA6XHRvdXRfaW5pdDpcbiAyODE6XHRcdC8qIHdlIHN0YXJ0IGEgcmFuZ2Ugb25seSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgdG8gbm90aWZ5IGFib3V0ICovXG4gMjgyOlx0XHQqdl9zdGFydCA9IGN1cnJfY2hhbmdlID8gdiA6IE5VTEw7XG4gMjgzOlx0XHQqdl9lbmQgPSAqdl9zdGFydDtcbiAyODQ6XHR9XG4gMjg1Olx0XG4gMjg2Olx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gMjg3Olx0XHRcdFx0XHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxuIDI4ODpcdFx0XHRcdFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcbiAyODk6XHRcdFx0XHRcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXG4gMjkwOlx0XHRcdFx0XHRib29sICpjaGFuZ2VkKVxuIDI5MTpcdHtcbiAyOTI6XHRcdGludCBlcnI7XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAodGluZm9fY3Vyci1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xuIDI5NTpcdFx0XHRpZiAodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcbiAyOTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyOTc6XHRcdFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMjk4Olx0XHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSB7XG4gMjk5Olx0XHRcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xuIDMwMDpcdFx0XHRpbnQgdCwgdjtcbiAzMDE6XHRcbiAzMDI6XHRcdFx0aWYgKCEodGluZm9fbGFzdC1cdTAwM2VmbGFncyBcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXG4gMzAzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbiAzMDU6XHRcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIDMwNjpcdFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiAzMDc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDg6XHRcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4gMzA5Olx0XHRcdGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYmIzQzOyYjNDM7KSB7XG4gMzEwOlx0XHRcdFx0Ym9vbCBjdXJyX2NoYW5nZSA9IGZhbHNlO1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcdTAwMjZjdXJyX2NoYW5nZSk7XG4gMzEzOlx0XHRcdFx0aWYgKGVycilcbiAzMTQ6XHRcdFx0XHRcdGJyZWFrO1xuIDMxNTpcdFx0XHRcdHQmIzQzOyYjNDM7O1xuIDMxNjpcdFxuIDMxNzpcdFx0XHRcdGlmIChjdXJyX2NoYW5nZSlcbiAzMTg6XHRcdFx0XHRcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XG4gMzE5Olx0XHRcdFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXHUwMDI2dl9zdGFydCwgXHUwMDI2dl9lbmQsIHYsXG4gMzIwOlx0XHRcdFx0XHRcdFx0ICAgY3Vycl9jaGFuZ2UpO1xuIDMyMTpcdFx0XHR9XG4gMzIyOlx0XHRcdGlmICh2X3N0YXJ0IFx1MDAyNlx1MDAyNiB2X2VuZClcbiAzMjM6XHRcdFx0XHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cdTAwM2V2aWQsIHZfZW5kLVx1MDAzZXZpZCxcbiAzMjQ6XHRcdFx0XHRcdCAgICAgICBSVE1fTkVXVkxBTik7XG4gMzI1Olx0XHRcdGlmIChlcnIpXG4gMzI2Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAzMjc6XHRcbiAzMjg6XHRcdFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XG4gMzI5Olx0XHRcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjc3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo0OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTM0CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2gmIzM5O3MgSW50ZWdlciBPdmVyZmxvdyBQcmV2ZW50aW9uKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBjaGVjazogYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAgKmJlZm9yZSogdGhlIG1haW4gY29tcGFyaXNvbjogYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9ICh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgaXMgZGVzaWduZWQgdG8gaGVhZCBvZmYgYSBwb3RlbnRpYWwgaW50ZWdlciB1bmRlcmZsb3cuIElmIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYCwgdGhlIHN1YnRyYWN0aW9uIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIHdvdWxkIHJlc3VsdCBpbiBhIG5lZ2F0aXZlIHZhbHVlLiAgQnV0LCBhbmQgdGhpcyBpcyBjcnVjaWFsLCBpdCYjMzk7cyBoaWdobHkgcHJvYmFibGUgdGhhdCBgdmlkYCBpcyBhbiAqdW5zaWduZWQqIGludGVnZXIuIEdpdmVuIHRoYXQsIHRoYXQgJiMzNDtuZWdhdGl2ZSYjMzQ7IGRpZmZlcmVuY2Ugd291bGQgYWN0dWFsbHkgd3JhcCBhcm91bmQsIGxlYWRpbmcgdG8gYSBtdWNoIGxhcmdlciBwb3NpdGl2ZSB2YWx1ZSBkdWUgdG8gdGhlIHdheSB1bnNpZ25lZCBhcml0aG1ldGljIHdvcmtzLiBUaGUgbmV3IGNoZWNrIHNlZW1zIHRvIHByZXZlbnQgdGhhdCB3aG9sZSB3cmFwLWFyb3VuZCBzY2VuYXJpby4gSSYjMzk7bSBwcmV0dHkgc3VyZSBJJiMzOTt2ZSBzZWVuIGB2aWRgIGRlZmluZWQgYXMgc29tZXRoaW5nIGxpa2UgYSBgdTE2YCBiZWZvcmUsIHdoaWNoIHdvdWxkIGNvbmZpcm0gdGhhdCB1bnNpZ25lZCBiZWhhdmlvci4gSnVzdCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGxldCYjMzk7cyB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgYHN0cnVjdCB2dHVubmVsX2luZm9gIGRlZmluaXRpb24gdG8gY29uZmlybSB0aGUgYHZpZGAgdHlwZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3RydWN0IHZ0dW5uZWxfaW5mbyBcXHsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTExLVxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjEyOnN0cnVjdCB2dHVubmVsX2luZm8ge1xubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTEzLVx0dTMyXHR0dW5pZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQ5NQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW50cm9kdWNpbmcgYSBjaGVjayB3aXRoaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AsIHNwZWNpZmljYWxseSBgdGluZm9fY3Vyci0mZ3Q7dmlkICZsdDsgdGluZm9fbGFzdC0mZ3Q7dmlkYC4gVGhlIGdvYWwgaXMgdG8gcHJldmVudCBhIHBvdGVudGlhbGx5IG5hc3R5IHNpdHVhdGlvbiB3aXRoaW4gdGhhdCBgZm9yYCBsb29wLiBMZXQgbWUgcmVmcmVzaCBteSBtZW1vcnk7IHRoZSByZWxldmFudCBjb2RlIGJsb2NrIGlzOgoKYGBgYwoJCWlmICh0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWQgfHwKCQkgICAgKHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZCkgIT0KCQkgICAgKHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQpKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQl0ID0gdGluZm9fbGFzdC0mZ3Q7dHVuaWQ7CgkJZm9yICh2ID0gdGluZm9fbGFzdC0mZ3Q7dmlkOyB2ICZsdDs9IHRpbmZvX2N1cnItJmd0O3ZpZDsgdiYjNDM7JiM0MzspIHsKYGBgCgpJbml0aWFsbHksIG15IHRob3VnaHQgd2FzLCBpZiBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtJmd0O3ZpZGAsIHRoYXQgbG9vcCB3b3VsZCBlaXRoZXIgbm90IGV4ZWN1dGUgYXQgYWxsLCBvciBwb3NzaWJseSBjYXVzZSBpbnRlZ2VyIHVuZGVyZmxvdyBpZiBgdmAgd2VyZSB1bnNpZ25lZCwgYW5kIGVuZCB1cCBsb29waW5nIGFuIGV4Y2Vzc2l2ZSBudW1iZXIgb2YgdGltZXMuIEkgcmVtZW1iZXJlZCBgdmAgaXMgYW4gYGludGAsIHNvIHRoZSBsb29wIHdvdWxkIHNpbXBseSBub3QgZXhlY3V0ZSB3aGVuIGB0aW5mb19jdXJyLSZndDt2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC0mZ3Q7dmlkYC4gQnV0IHRoZW4gSSByZWFsaXplZCwgdGhpcyBjaGVjayBpcyBzdGlsbCBpbXBvcnRhbnQgYmVjYXVzZSBgdGluZm9fY3Vyci0mZ3Q7dmlkYCBhbmQgYHRpbmZvX2xhc3QtJmd0O3ZpZGAgYXJlIGB1MTZgIHR5cGVzLCB3aGljaCBpcyByZWxldmFudCBpbiBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0uIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgSSYjMzk7bSB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIHR5cGVzIGNvcnJlY3RseSB0byBmdWxseSBncmFzcCB0aGUgcG90ZW50aWFsIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNvbmRpdGlvbi4gSSBuZWVkIHRvIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgdnR1bm5lbF9pbmZvYCB0byBjb25maXJtIHRob3NlIGRhdGEgdHlwZXMgYW5kIHRoZSBpbnRlbmRlZCBiZWhhdmlvci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDEwOlx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxuICAxMTpcdFxuICAxMjpcdHN0cnVjdCB2dHVubmVsX2luZm8ge1xuICAxMzpcdFx0dTMyXHR0dW5pZDtcbiAgMTQ6XHRcdHUxNlx0dmlkO1xuICAxNTpcdFx0dTE2XHRmbGFncztcbiAgMTY6XHR9O1xuICAxNzpcdFxuICAxODpcdC8qIGJyX25ldGxpbmtfdHVubmVsLmMgKi9cbiAgMTk6XHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNCAxNDo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDQzCgkJCQkJCQlvdXRwdXQ6IDE1MAoJCQkJCQkJdGhvdWdodHM6IDExNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIFZMQU4gVHVubmVsIEluZm8gUGF0Y2gqKgoKT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpcyBhZGRpbmcgYSBjaGVjayBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKClgIHNwZWNpZmljYWxseTogYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAuICBJIHNlZSB0aGF0IGl0JiMzOTtzIGRlc2lnbmVkIHRvIGZpeCBhIHN1YnRsZSBsb2dpYyBmbGF3LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgKndoeSogaXQmIzM5O3MgbmVlZGVkLgoKSW5pdGlhbGx5LCB0aGUgY29kZSB3YXMgY29tcGFyaW5nIHRoZSBkaWZmZXJlbmNlcyBvZiBgdmlkYCBhbmQgYHR1bmlkYDogYCh0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWQpICE9ICh0aW5mb19jdXJyLSZndDt0dW5pZCAtIHRpbmZvX2xhc3QtJmd0O3R1bmlkKWAuIGB2aWRgIGlzIGEgYHUxNmAsIGFuZCBgdHVuaWRgIGlzIGEgYHUzMmAuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHRoYXQgaWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCB0aGUgc3VidHJhY3Rpb24gYHRpbmZvX2N1cnItJmd0O3ZpZCAtIHRpbmZvX2xhc3QtJmd0O3ZpZGAgd2lsbCAqdW5kZXJmbG93Ki4gSG93ZXZlciwgYmVjYXVzZSB0aGUgYHUxNmAgdHlwZXMgYXJlIHByb21vdGVkIHRvIGBpbnRgIGR1cmluZyB0aGUgc3VidHJhY3Rpb24sIHRoZSByZXN1bHQgd2lsbCBiZSBhIG5lZ2F0aXZlIGBpbnRgLiAgSSBrbm93IHRoYXQgY29tcGFyaXNvbiBgIT1gIHdpbGwgY29lcmNlIHRoYXQgYGludGAgdG8gYSBgdTMyYC4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBjYXVzZSBzb21lIGludGVyZXN0aW5nIGJlaGF2aW9yLgoKSWYgdGhpcyB1bmRlcmZsb3cgaGFwcGVucywgYW5kIHRoZSByZXN1bHQsIHRoZSBuZWdhdGl2ZSBgaW50YCwgYmVjb21lcyBhIHZlcnkgbGFyZ2UgYHUzMmAgdmFsdWUgZHVlIHRvIHRoZSBjb252ZXJzaW9uIHRvIHVuc2lnbmVkLiBBbmQgaWYsIHNvbWVob3csIHRoZSBgdGluZm9fY3Vyci0mZ3Q7dHVuaWQgLSB0aW5mb19sYXN0LSZndDt0dW5pZGAgY2FsY3VsYXRpb24gaGFwcGVucyB0byAqYWxzbyogeWllbGQgdGhhdCBzYW1lIGxhcmdlIGB1MzJgIHZhbHVlLCB0aGUgaW5lcXVhbGl0eSB3b3VsZCBiZSBmYWxzZWx5IGV2YWx1YXRlZCBhcyB0cnVlISBUaGlzIHRoZW4gbGVhZHMgdG8gYW4gaW50ZXJlc3RpbmcgY2FzZTogdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtJmd0O3ZpZDsgdiAmbHQ7PSB0aW5mb19jdXJyLSZndDt2aWQ7IHYmIzQzOyYjNDM7KWAgbWlnaHQgc2tpcCBlbnRpcmVseSwgYmVjYXVzZSB0aGUgbG9vcCBjb25kaXRpb24gd291bGQgbm90IGJlIG1ldC4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LSZndDt2aWRgLCB0aGUgbG9vcCBpbW1lZGlhdGVseSB0ZXJtaW5hdGVzIGJlY2F1c2UgdGhlIHN0YXJ0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIHZhbHVlLgoKT2theSwgc28gSSB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93IGhlcmUuIE15IGNvbmNlcm4gcmlnaHQgbm93IGlzIGlzIHRoaXMgYSBjYXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBObywgYHRpbmZvX2N1cnJgIGFuZCBgdGluZm9fbGFzdGAgYXJlIHBvcHVsYXRlZCBmcm9tIG5ldGxpbmsgYXR0cmlidXRlcy4gVGhleSYjMzk7cmUgZWl0aGVyIGZ1bGx5IGluaXRpYWxpemVkIG9yIHZhbGlkYXRlZCBzbyB0aGVyZSYjMzk7cyBubyB3YXkgdGhlcmUmIzM5O3MgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIHdvcnJ5IGFib3V0LCBhbmQgdGhpcyBwYXRjaCBpc24mIzM5O3QgYWJvdXQgdGhhdC4KClRoZSBwYXRjaCBhcHBlYXJzIHRvIGZpeCBhIGxvZ2ljIGVycm9yLCB3aGVyZSB0aGlzIG5lZ2F0aXZlIHJhbmdlIGNvbmRpdGlvbiAoIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgICkgY291bGQgYmUgdHJ1ZSBhbmQgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yLiBTcGVjaWZpY2FsbHksIHRoZSBsb29wIGlzIHNraXBwZWQsIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIChzdWNjZXNzKSBldmVuIHRob3VnaCBpdCYjMzk7cyBlZmZlY3RpdmVseSBkb2luZyAqbm90aGluZyogd2l0aCBhbiBpbnZhbGlkIHJhbmdlLiAgSXQgc2hvdWxkIHJlYWxseSBiZSByZXR1cm5pbmcgYW4gZXJyb3IgY29kZS4gYEVJTlZBTGAgaXMgcHJvYmFibHkgdGhlIHJpZ2h0IGNob2ljZS4KClNvLCB0aGUgcGF0Y2ggaXMgYWRkaW5nIGB0aW5mb19jdXJyLSZndDt2aWQgJmx0OyB0aW5mb19sYXN0LSZndDt2aWRgIHRvIGV4cGxpY2l0bHkgcmV0dXJuIGAtRUlOVkFMYC4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgbG9naWMgYnVnLCBub3QgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYnVnLgoKU28sIGxldCYjMzk7cyBuYWlsIHRoaXMgZG93bi4gSWYgYHRpbmZvX2N1cnItJmd0O3ZpZCAmbHQ7IHRpbmZvX2xhc3QtJmd0O3ZpZGAsIGB0aW5mb19jdXJyLSZndDt2aWQgLSB0aW5mb19sYXN0LSZndDt2aWRgIGlzIG5lZ2F0aXZlLiBBbmQgaWYgYHRpbmZvX2N1cnItJmd0O3R1bmlkIC0gdGluZm9fbGFzdC0mZ3Q7dHVuaWRgIGFsc28gaGFwcGVucyB0byBlcXVhbCB0aGUgc2FtZSBuZWdhdGl2ZSB2YWx1ZSwgdGhlIGluZXF1YWxpdHkgcGFzc2VzLiBUaGlzIHJlc3VsdHMgaW4gdGhlIGxvb3AgYmVpbmcgc2tpcHBlZCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5pbmcgMCwgZXZlbiB0aG91Z2ggaXQgKnNob3VsZG4mIzM5O3QqLiBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIHdoaWNoIGNvdWxkIGJ5cGFzcyBzb21lIGltcG9ydGFudCB2YWxpZGF0aW9uLiBJIHN0aWxsIGRvbiYjMzk7dCBzZWUgYW55IHNpZ24gb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBLQVNBTiBvciBzdGFuZGFyZCB0ZXN0aW5nIG1pZ2h0IG5vdCBjYXRjaCB0aGlzLCBidXQgaXTigJlzIGRlZmluaXRlbHkgbm90IGEgS01TQU4gaXNzdWUuIEtNU0FOIGlzIGZvciBkZXRlY3RpbmcgbWVtb3J5IGlzc3Vlcy4KClNpbmNlIHRoaXMgaXNuJiMzOTt0IGEgS01TQU4gaXNzdWUgSSBhbSBnb2luZyB0byBzZXQgYE5lZWRzS01TQU49ZmFsc2VgLgoKSSBhbSByZS1leGFtaW5pbmcgdGhlIHNpdHVhdGlvbiwgYW5kIEkgYW0gcmUtaXRlcmF0aW5nIHRoYXQgdGhlIGNoZWNrIGlzIGFkZGVkIHRvIHByZXZlbnQgbmVnYXRpdmUgcmFuZ2UgbG9vcHMgZnJvbSBydW5uaW5nLiBTbywgbm8sIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhpcyBwYXRjaCBwcmV2ZW50cyBuZWdhdGl2ZSByYW5nZXMuIFNvIGBOZWVkc0tNU0FOPWZhbHNlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTQgMTQ6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgdmFsaWRhdGlvbiBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgVkxBTiBJRCBvZiB0aGUgY3VycmVudCB0dW5uZWwgaW5mbyBpcyBub3QgbGVzcyB0aGFuIHRoZSBWTEFOIElEIG9mIHRoZSBsYXN0IHR1bm5lbCBpbmZvIChwcmV2ZW50aW5nIGEgbmVnYXRpdmUgcmFuZ2UpLiBUaGlzIGZpeGVzIGEgbG9naWMgYnVnIHdoZXJlIGEgbmVnYXRpdmUgcmFuZ2UgY291bGQgYnlwYXNzIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiBhbmQgdW5kZXJmbG93LCBsZWFkaW5nIHRvIGluY29ycmVjdCBoYW5kbGluZyBvZiBWTEFOIHR1bm5lbCByYW5nZXMuIFRoaXMgaXNzdWUgZG9lcyBub3QgaW52b2x2ZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlciBzcGFjZSwgb3IgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGluIGNvbnRyb2wgZmxvdy4gSXQgaXMgYSBsb2dpYyBhbmQgYm91bmRzLWNoZWNraW5nIGlzc3VlLiBUaGVyZWZvcmUsIEtNU0FOIGlzIG5vdCByZXF1aXJlZCwgYXMgS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MjguMjMxMTYwNDIxWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE0NTU0OTI1MTA5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUklER0VcIixcbiAgICBcIkJSSURHRV9WTEFOX0ZJTFRFUklOR1wiLFxuICAgIFwiVkxBTl84MDIxUVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MjguMjMxMTY4MTIxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzYzNzgzMjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBmMDM5NzU3MGIwNzM0NzFiNTliNDk2MmVjYmJhZTU0MDA3MDczMmYxXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDE0IDE0OjM1OjI3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYyBiL25ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY1xcbmluZGV4IDcxYTEyZGEzMDAwNGMuLjA1ZjU2MGVlYjc4OWMgMTAwNjQ0XFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXFxuKysrIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXFxuQEAgLTMwMSw3ICszMDEsOCBAQCBpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4gXFxuIFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRpZiAoKHRpbmZvX2N1cnItXFx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCkgIT1cXG4rXFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCBcXHUwMDNjIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCB8fFxcbitcXHRcXHQgICAgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCkgIT1cXG4gXFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcdFxcdHQgPSB0aW5mb19sYXN0LVxcdTAwM2V0dW5pZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MjguNjA5MjI1NjEyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6ODMxNjIxNTgyMjc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJSSURHRVwiLFxuICAgIFwiQlJJREdFX1ZMQU5fRklMVEVSSU5HXCIsXG4gICAgXCJWTEFOXzgwMjFRXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl92bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjAzOTc1NzBiMDczNDcxYjU5YjQ5NjJlY2JiYWU1NDAwNzA3MzJmMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDE0IDE0OjM1OjI3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG5pbmRleCA3MWExMmRhMzAwMDRjLi4wNWY1NjBlZWI3ODljIDEwMDY0NFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG4rKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcbkBAIC0zMDEsNyArMzAxLDggQEAgaW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gXG4gXHRcdGlmICghKHRpbmZvX2xhc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4rXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbitcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNToyOC42MDkyMjc0OTJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDg5Mzk0NjM2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIG1vZGlmeSBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgY2hhbmdlIHdhcyBuZWVkZWQuIFRoZSBkZXNjcmlwdGlvbiBtZW50aW9ucyBhIGNoZWNrLCBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgYmVpbmcgYWRkZWQuIEFoLCBpdCdzIHRvIHByZXZlbnQgdW5kZXJmbG93IG9yIGludmFsaWQgcmFuZ2VzIHdoZW4gcHJvY2Vzc2luZyBWTEFOIHR1bm5lbCBpbmZvcm1hdGlvbi4gVGhhdCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBXZSB3YW50IHRvIGVuc3VyZSB0aGUgVkxBTiBJRCAoVklEKSB2YWx1ZXMgYXJlIHByb2Nlc3NlZCBpbiBhIGxvZ2ljYWxseSBjb25zaXN0ZW50IGFuZCB2YWxpZCBzZXF1ZW5jZSwgcHJldmVudGluZyBwb3RlbnRpYWwgZXJyb3JzIG9yIHNlY3VyaXR5IGlzc3VlcyB0aGF0IGNvdWxkIGFyaXNlIGZyb20gdW5leHBlY3RlZCBWSUQgb3JkZXIuIEknbGwgbmVlZCB0byBkaWcgaW50byB0aGUgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24gaXRzZWxmIHRvIGZ1bGx5IGdyYXNwIHRoZSBjb250ZXh0IGFuZCB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGlzIGFkZGl0aW9uLiBUaW1lIHRvIGRpdmUgaW50byB0aGUgY29kZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDQ4LCJPdXRwdXRUb2tlbnMiOjQyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAxLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MzkuNTAzMTc3MTA4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODUzOTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4NS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODctXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6MzkuNTQ5MDM2NDkzWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzI4MDQxNTQ3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIFZMQU4gVHVubmVsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdyByZWxhdGVkIHRvIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCBhIGNsZWFyIHBpY3R1cmUgb2YgaXRzIGNhbGwgZ3JhcGguIFdoZXJlIGlzIHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgaW52b2tlZCB3aXRoaW4gdGhlIGJyb2FkZXIgc3lzdGVtIGFyY2hpdGVjdHVyZT8gSSBuZWVkIHRvIHRyYWNlIGl0cyBvcmlnaW5zLiBJJ2xsIG5lZWQgdG8gaWRlbnRpZnkgYWxsIHRoZSBjYWxsIHNpdGVzIHRvIGZ1bGx5IGdyYXNwIGl0cyByb2xlIGFuZCBjb250ZXh0LiBVbmRlcnN0YW5kaW5nIHRoZSB1cHN0cmVhbSBkYXRhIGZsb3cgaXMga2V5IGhlcmUgdG8gaWRlbnRpZnkgcG90ZW50aWFsIHBvaW50cyBmb3Igb3B0aW1pemF0aW9uIG9yIGRlYnVnZ2luZyBsYXRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjUyMywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM1OjQyLjgyOTQ1NTgxNVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQxODc2NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9ODA5PXN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMC1cXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjgzMTpcXHRcXHRcXHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oYnIsIHAsIGNtZCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MzItXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBcXHUwMDI2dGluZm9fY3VycixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYz0yNTc9c3RhdGljIHZvaWQgX192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODUtXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI4NjppbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjg3LVxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MTk9aW50IGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8oc3RydWN0IG5sYXR0ciAqYXR0cixcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjAtXFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyMTppbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMjItXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6NDIuODc1ODgxMDNaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MjgyNzMwNTM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgc28gSSd2ZSBwaW5wb2ludGVkIGEgcHJvbWlzaW5nIHRhcmdldC4gVGhlIGNvZGUgcGF0aCBvcmlnaW5hdGVzIGZyb20gYGJyX2Fmc3BlY2Agd2l0aGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AuIFRoYXQgZnVuY3Rpb24gaGFuZGxlcyBicmlkZ2UgbmV0bGluayBtZXNzYWdlc+KAlHRoaW5ncyBsaWtlIGBSVE1fU0VUTElOS2AsIGBSVE1fTkVXTElOS2AsIHRoYXQga2luZCBvZiBzdHVmZi4gV2hpY2gsIGZvciBteSBwdXJwb3NlcywgbWFrZXMgaXQgZGVmaW5pdGVseSByZWFjaGFibGUgYW5kIHdvcnRoIG15IHRpbWUuIE15IG1haW4gaW50ZXJlc3QgbGllcyBpbiB0aGUgZnVuY3Rpb24gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AuIE5vdywganVzdCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gR290dGEgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBpbiBwbGFjZSB0byBleHBsb2l0IHRoaXMgcHJvcGVybHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNzksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6NDcuMTU4NjE0MzQ4WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NzE5MDM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX25ldGxpbmtfdHVubmVsLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9NYWtlZmlsZT04PWJyaWRnZS15XFx0Oj0gYnIubyBicl9kZXZpY2UubyBicl9mZGIubyBicl9mb3J3YXJkLm8gYnJfaWYubyBicl9pbnB1dC5vIFxcXFxcXG4tLVxcbm5ldC9icmlkZ2UvTWFrZWZpbGUtMTAtXFx0XFx0XFx0YnJfc3RwX2lmLm8gYnJfc3RwX3RpbWVyLm8gYnJfbmV0bGluay5vIFxcXFxcXG5uZXQvYnJpZGdlL01ha2VmaWxlOjExOlxcdFxcdFxcdGJyX25ldGxpbmtfdHVubmVsLm8gYnJfYXJwX25kX3Byb3h5Lm9cXG5uZXQvYnJpZGdlL01ha2VmaWxlLTEyLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNTo0Ny4yMDUzNDAzNDNaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTQ2MzkyMTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgbXlzZWxmOlxuXG4qKkJyaWRnZSBNb2R1bGUgQnVpbGQgRGVwZW5kZW5jeSBJbnF1aXJ5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBidWlsZCBwcm9jZXNzIGFuZCBpdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoIC0gdGhlIG1vZHVsZSBidWlsZHMgKmlmKiBgQ09ORklHX0JSSURHRWAgaXMgZW5hYmxlZC4gQnV0LCBob2xkIG9uIGEgc2Vjb25k4oCmIGlzbid0IHRoZXJlIHNvbWV0aGluZyBlbHNlIGluZmx1ZW5jaW5nIHRoaXM/IEkgaGF2ZSBhIGZlZWxpbmcgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIG1pZ2h0IGJlIGluIHBsYXkgdG9vLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlLiBCZXN0IHRvIGNoZWNrIHRoZSBNYWtlZmlsZSBmb3IgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZmxhZ3MsIG9yIG1heWJlIGBicl9uZXRsaW5rX3R1bm5lbC5jYCB3b3VsZCBoYXZlIHRoZSBgI2lmZGVmYCBkaXJlY3RpdmVzIEkgbmVlZC4gR290dGEgdHJhY2sgZG93biB3aGVyZSB0aGlzIG1vZHVsZSdzIHRydWx5IGRlZmluZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0OTYsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNTo1Mi4xNTE3MzQ5NjNaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9NYWtlZmlsZVwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTWFrZWZpbGUgZm9yIHRoZSBJRUVFIDgwMi4xZCBldGhlcm5ldCBicmlkZ2luZyBsYXllci5cXG4gICA0OlxcdCNcXG4gICA1OlxcdFxcbiAgIDY6XFx0b2JqLSQoQ09ORklHX0JSSURHRSkgKz0gYnJpZGdlLm9cXG4gICA3OlxcdFxcbiAgIDg6XFx0YnJpZGdlLXlcXHQ6PSBici5vIGJyX2RldmljZS5vIGJyX2ZkYi5vIGJyX2ZvcndhcmQubyBicl9pZi5vIGJyX2lucHV0Lm8gXFxcXFxcbiAgIDk6XFx0XFx0XFx0XFx0YnJfaW9jdGwubyBicl9zdHAubyBicl9zdHBfYnBkdS5vIFxcXFxcXG4gIDEwOlxcdFxcdFxcdFxcdGJyX3N0cF9pZi5vIGJyX3N0cF90aW1lci5vIGJyX25ldGxpbmsubyBcXFxcXFxuICAxMTpcXHRcXHRcXHRcXHRicl9uZXRsaW5rX3R1bm5lbC5vIGJyX2FycF9uZF9wcm94eS5vXFxuICAxMjpcXHRcXG4gIDEzOlxcdGJyaWRnZS0kKENPTkZJR19TWVNGUykgKz0gYnJfc3lzZnNfaWYubyBicl9zeXNmc19ici5vXFxuICAxNDpcXHRcXG4gIDE1OlxcdGJyaWRnZS0kKHN1YnN0IG0seSwkKENPTkZJR19CUklER0VfTkVURklMVEVSKSkgKz0gYnJfbmZfY29yZS5vXFxuICAxNjpcXHRcXG4gIDE3OlxcdGJyX25ldGZpbHRlci15IDo9IGJyX25ldGZpbHRlcl9ob29rcy5vXFxuICAxODpcXHRicl9uZXRmaWx0ZXItJChzdWJzdCBtLHksJChDT05GSUdfSVBWNikpICs9IGJyX25ldGZpbHRlcl9pcHY2Lm9cXG4gIDE5OlxcdG9iai0kKENPTkZJR19CUklER0VfTkVURklMVEVSKSArPSBicl9uZXRmaWx0ZXIub1xcbiAgMjA6XFx0XFxuICAyMTpcXHRicmlkZ2UtJChDT05GSUdfQlJJREdFX0lHTVBfU05PT1BJTkcpICs9IGJyX211bHRpY2FzdC5vIGJyX21kYi5vIGJyX211bHRpY2FzdF9laHQub1xcbiAgMjI6XFx0XFxuICAyMzpcXHRicmlkZ2UtJChDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HKSArPSBicl92bGFuLm8gYnJfdmxhbl90dW5uZWwubyBicl92bGFuX29wdGlvbnMubyBicl9tc3Qub1xcbiAgMjQ6XFx0XFxuICAyNTpcXHRicmlkZ2UtJChDT05GSUdfTkVUX1NXSVRDSERFVikgKz0gYnJfc3dpdGNoZGV2Lm9cXG4gIDI2OlxcdFxcbiAgMjc6XFx0b2JqLSQoQ09ORklHX05FVEZJTFRFUikgKz0gbmV0ZmlsdGVyL1xcbiAgMjg6XFx0XFxuICAyOTpcXHRicmlkZ2UtJChDT05GSUdfQlJJREdFX01SUClcXHQrPSBicl9tcnBfc3dpdGNoZGV2Lm8gYnJfbXJwLm8gYnJfbXJwX25ldGxpbmsub1xcbiAgMzA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM1OjUyLjE1MTgwMjEzM1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTk4NjA1NTI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6XG5cbioqRXhhbWluaW5nIEJyaWRnZSBUdW5uZWwgTW9kdWxlIERlcGVuZGVuY2llcyoqXG5cblJpZ2h0LCBzbyBgYnJfbmV0bGlua190dW5uZWwub2AgaXMgcHJlZGljdGFibHkgYmFrZWQgaW4gd2hlbmV2ZXIgYENPTkZJR19CUklER0VgIGlzIHNldC4gU3RhbmRhcmQgc3R1ZmYuIEJ1dCBoYW5nIG9uLCBJIHNlZW0gdG8gcmVjYWxsIHRoYXQgYGJyX3ZsYW5fdHVubmVsLm9gIGdldHMgYnVpbHQgYmFzZWQgb24gdGhlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBvcHRpb24uIFRoYXQgcmluZ3MgYSBiZWxsLiBOb3csIEkgbmVlZCB0byBjb25maXJtIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSB0d28gbW9kdWxlcy4gVGhlIGVhc2llc3Qgd2F5IGlzIGFsd2F5cyB0byBqdXN0IGRpdmUgaW50byB0aGUgY29kZS4gU3BlY2lmaWNhbGx5LCBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIHNvdXJjZSBmb3IgYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AgdG8gbG9vayBmb3IgYW55IGAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgZGlyZWN0aXZlcy4gVGhhdCBzaG91bGQgaW1tZWRpYXRlbHkgY2xhcmlmeSBpZiB0aGVyZSdzIGFueSBjb25kaXRpb25hbCBpbmNsdXNpb24gb3IgZnVuY3Rpb25hbGl0eSB0aWVkIHRvIHRoZSBWTEFOIGZpbHRlcmluZyBmZWF0dXJlIHdpdGhpbiB0aGlzIG5ldGxpbmsgdHVubmVsIG1vZHVsZS4gSXQncyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDMwMiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzU6NTcuMTUwNDEwMTA3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzNzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICpcXHRCcmlkZ2UgcGVyIHZsYW4gdHVubmVsIHBvcnQgZHN0X21ldGFkYXRhIG5ldGxpbmsgY29udHJvbCBpbnRlcmZhY2VcXG4gICA0OlxcdCAqXFxuICAgNTpcXHQgKlxcdEF1dGhvcnM6XFxuICAgNjpcXHQgKlxcdFJvb3BhIFByYWJodVxcdFxcdFxcdTAwM2Nyb29wYUBjdW11bHVzbmV0d29ya3MuY29tXFx1MDAzZVxcbiAgIDc6XFx0ICovXFxuICAgODpcXHRcXG4gICA5OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4gIDEwOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICAxMTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvZXRoZXJkZXZpY2UuaFxcdTAwM2VcXG4gIDEyOlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvcnRuZXRsaW5rLmhcXHUwMDNlXFxuICAxMzpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L25ldF9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gIDE0OlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvc29jay5oXFx1MDAzZVxcbiAgMTU6XFx0I2luY2x1ZGUgXFx1MDAzY3VhcGkvbGludXgvaWZfYnJpZGdlLmhcXHUwMDNlXFxuICAxNjpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L2RzdF9tZXRhZGF0YS5oXFx1MDAzZVxcbiAgMTc6XFx0XFxuICAxODpcXHQjaW5jbHVkZSBcXFwiYnJfcHJpdmF0ZS5oXFxcIlxcbiAgMTk6XFx0I2luY2x1ZGUgXFxcImJyX3ByaXZhdGVfdHVubmVsLmhcXFwiXFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0YXRpYyBzaXplX3QgX19nZXRfdmxhbl90aW5mb19zaXplKHZvaWQpXFxuICAyMjpcXHR7XFxuICAyMzpcXHRcXHRyZXR1cm4gbmxhX3RvdGFsX3NpemUoMCkgKyAvKiBuZXN0IElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0lORk8gKi9cXG4gIDI0OlxcdFxcdFxcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpICsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfSUQgKi9cXG4gIDI1OlxcdFxcdFxcdCAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUxNikpICsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfVklEICovXFxuICAyNjpcXHRcXHRcXHQgIG5sYV90b3RhbF9zaXplKHNpemVvZih1MTYpKTsgLyogSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1MgKi9cXG4gIDI3OlxcdH1cXG4gIDI4OlxcdFxcbiAgMjk6XFx0Ym9vbCB2bGFuX3R1bmlkX2lucmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9jdXJyLFxcbiAgMzA6XFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9sYXN0KVxcbiAgMzE6XFx0e1xcbiAgMzI6XFx0XFx0X19iZTMyIHR1bmlkX2N1cnIgPSB0dW5uZWxfaWRfdG9fa2V5MzIodl9jdXJyLVxcdTAwM2V0aW5mby50dW5uZWxfaWQpO1xcbiAgMzM6XFx0XFx0X19iZTMyIHR1bmlkX2xhc3QgPSB0dW5uZWxfaWRfdG9fa2V5MzIodl9sYXN0LVxcdTAwM2V0aW5mby50dW5uZWxfaWQpO1xcbiAgMzQ6XFx0XFxuICAzNTpcXHRcXHRyZXR1cm4gKGJlMzJfdG9fY3B1KHR1bmlkX2N1cnIpIC0gYmUzMl90b19jcHUodHVuaWRfbGFzdCkpID09IDE7XFxuICAzNjpcXHR9XFxuICAzNzpcXHRcXG4gIDM4OlxcdHN0YXRpYyBpbnQgX19nZXRfbnVtX3ZsYW5fdHVubmVsX2luZm9zKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnKVxcbiAgMzk6XFx0e1xcbiAgNDA6XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdiwgKnZ0YmVnaW4gPSBOVUxMLCAqdnRlbmQgPSBOVUxMO1xcbiAgNDE6XFx0XFx0aW50IG51bV90aW5mb3MgPSAwO1xcbiAgNDI6XFx0XFxuICA0MzpcXHRcXHQvKiBDb3VudCBudW1iZXIgb2YgdmxhbiBpbmZvcyAqL1xcbiAgNDQ6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodiwgXFx1MDAyNnZnLVxcdTAwM2V2bGFuX2xpc3QsIHZsaXN0KSB7XFxuICA0NTpcXHRcXHRcXHQvKiBvbmx5IGEgY29udGV4dCwgYnJpZGdlIHZsYW4gbm90IGFjdGl2YXRlZCAqL1xcbiAgNDY6XFx0XFx0XFx0aWYgKCFicl92bGFuX3Nob3VsZF91c2UodikgfHwgIXYtXFx1MDAzZXRpbmZvLnR1bm5lbF9pZClcXG4gIDQ3OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAgNDg6XFx0XFxuICA0OTpcXHRcXHRcXHRpZiAoIXZ0YmVnaW4pIHtcXG4gIDUwOlxcdFxcdFxcdFxcdGdvdG8gaW5pdHZhcnM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM1OjU3LjE1MDUwNTMxN1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0Mjg1NDUwODE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgVGhvdWdodHMgb24gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24uIFRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBhdCBtZSBpcyB0aGF0IGl0J3MgbG9jYXRlZCB3aXRoaW4gYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2AuIFRoYXQncyBpbXBvcnRhbnQgY29udGV4dC4gR2l2ZW4gdGhlIGZpbGUgbmFtZSwgSSdtIGFscmVhZHkgYXNzdW1pbmcgdGhpcyBmdW5jdGlvbiBpcyBoZWF2aWx5IGludm9sdmVkIGluIGhhbmRsaW5nIFZMQU4tcmVsYXRlZCBjb25maWd1cmF0aW9ucywgcG90ZW50aWFsbHkgZm9yIHR1bm5lbGluZyBzY2VuYXJpb3Mgd2l0aGluIGEgTGludXggYnJpZGdlLiBIb3dldmVyLCBJIG5lZWQgdG8gY29uZmlybSB0aGlzIGFzc3VtcHRpb24uIE15IG5leHQgc3RlcCwgd2l0aG91dCBhIGRvdWJ0LCBpcyB0byBpbW1lZGlhdGVseSBjaGVjayBhbmQgc2VlIGlmIHRoaXMgZnVuY3Rpb24gaXMgY29uZGl0aW9uYWxseSBjb21waWxlZC4gSSBzdHJvbmdseSBzdXNwZWN0IGl0J3MgZ29pbmcgdG8gYmUgZ3VhcmRlZCBieSBhIGAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSwgb3Igc29tZXRoaW5nIHNpbWlsYXIuIFRoaXMgaXMga2V5IGJlY2F1c2UgdGhhdCB3b3VsZCB0ZWxsIG1lIHdoZXRoZXIgaXRzIGluY2x1c2lvbiBkZXBlbmRzIG9uIHdoZXRoZXIgVkxBTiBmaWx0ZXJpbmcgc3VwcG9ydCBoYXMgYmVlbiBzcGVjaWZpY2FsbHkgZW5hYmxlZCBkdXJpbmcgdGhlIGtlcm5lbCBidWlsZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTUwMSwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6MDEuNDM1OTU5MjI1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQwNjYwNSwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjAxLjQ4MjM3NDRaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzU3ODQ2NzU0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgVkxBTiBJbnRlcmFjdGlvbioqXG5cbkhtbSwgbm8sIHRoYXQgaW5pdGlhbCBhc3N1bXB0aW9uIGFib3V0IHRoZSBmdW5jdGlvbmFsaXR5IGlzIGluY29ycmVjdC4gSG93ZXZlciwgSSBjYW4gc2VlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBoZWF2aWx5IHJlbGllcyBvbiBgc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cGAgYW5kIG90aGVyIFZMQU4tc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBMZXQgbWUgdGhpbmsuLi4gcGVyaGFwcyBkaWdnaW5nIGludG8gYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAgd2lsbCByZXZlYWwgZnVydGhlciBpbnNpZ2h0cy4gSXQgb2Z0ZW4gaG9sZHMgbW9yZSBkZXRhaWxzIGFib3V0IGludGVybmFsIGJyaWRnZSB3b3JraW5ncywgYW5kIHRoZXJlIGlzIGEgZGVjZW50IGNoYW5jZSB0aGVyZSBhcmUgcHJpdmF0ZSB0dW5uZWwgaW1wbGVtZW50YXRpb25zIGRlZmluZWQgaW4gdGhhdCBoZWFkZXIuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhvc2Ugc3RydWN0dXJlcyB0byBnZXQgYSBmdWxsIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU4MDYsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjowNS4wNjA4NDQ2MjFaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTY5MTI1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0zMj1pbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTM0LVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDozNTojaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zNi0vKiBicl92bGFuX3R1bm5lbC5jICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjA1LjEwNjgxOTAxNloiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTUzMDc2MzkxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBWTEFOIFR1bm5lbCBJbmZvcm1hdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBkaXZlIGludG8gaG93IFZMQU4gdHVubmVsaW5nIGlzIGhhbmRsZWQgd2l0aGluIHRoZSBicmlkZ2UuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgbGlrZWx5IHNvdXJjZSwgZ2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGJyaWRnZSBpbnRlcm5hbHMuIEknbSB0aGlua2luZyB0aGF0IHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBzaG91bGQgYmUgZGVmaW5lZCBvciBkZWNsYXJlZCBpbiBgbmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oYC4gTGV0J3MgY29uZmlybSB0aGF0IGh5cG90aGVzaXMgYW5kIHNlZSB3aGF0IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGlzIGFsbCBhYm91dC4gVGhpcyBmdW5jdGlvbiBuYW1lIHN0cm9uZ2x5IHN1Z2dlc3RzIGl0J3MgaW52b2x2ZWQgaW4gcHJvY2Vzc2luZyBvciBleHRyYWN0aW5nIHR1bm5lbC1yZWxhdGVkIFZMQU4gaW5mb3JtYXRpb24sIGJ1dCB0aGUgZXhhY3QgZGV0YWlscyBJJ2xsIGhhdmUgdG8gYXNjZXJ0YWluIGJ5IHJlYWRpbmcgdGhlIGNvZGUgd2l0aGluIHRoaXMgaGVhZGVyLiBNeSBleHBlcnRpc2UgZ3VpZGVzIG1lIHRvIHRoZSBsaWtlbHkgbG9jYXRpb24sIG5vdyBJIGp1c3QgaGF2ZSB0byBsb29rLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MTU4LCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6MTYuNjM3NTg1MjI2WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDc4OTQwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaD0xOT1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMC1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbyk7XFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oOjIxOmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMi1cXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoxNi42ODIzODE0MzJaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDYwMjY4MzczNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBhIFN5c3RlbSBEZWNsYXJhdGlvbioqXG5cblJpZ2h0LCBzbyB0aGlzIHRoaW5nIGlzIGRlY2xhcmVkIHVuY29uZGl0aW9uYWxseS4gVGhhdCdzIGEgc3RhcnRpbmcgcG9pbnQsIG5vdCBwYXJ0aWN1bGFybHkgaGVscGZ1bCBpbiBpdHNlbGYuIFRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyBhbHdheXMgdG8gdHJhY2UgaXRzIHVzYWdlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCwgc2VlIHdoZXJlIGl0J3MgYmVpbmcgKmNhbGxlZCogdG8gZ3Jhc3AgaXRzIHNpZ25pZmljYW5jZS4gTGV0J3MgZGlnIGludG8gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYC4gVGhhdCdzIHdoZXJlIEknZCBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgY29kZSBpZiBpdCdzIHJlbGF0ZWQgdG8gdGhlIGJyaWRnZSBuZXRsaW5rIGludGVyZmFjZSwgd2hpY2gsIGdpdmVuIHRoZSBmaWxlbmFtZSwgc2VlbXMgaGlnaGx5IGxpa2VseS4gVGltZSB0byBzZWUgaG93IHRoaXMgdGhpbmcgaXMgYmVpbmcgKnVzZWQqIHdpdGhpbiB0aGF0IGNvbnRleHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY1MzksIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoyMS4yODUwNjc2MTdaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2ODk1OTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmsuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODMwLVxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODMxOlxcdFxcdFxcdGVyciA9IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhiciwgcCwgY21kLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgzMi1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgIFxcdTAwMjZ0aW5mb19jdXJyLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoyMS4zMzE5NjgzMTJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Nzk5NzYxNzU4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIGJyX2Fmc3BlYyoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcy4gSSdtIGdvaW5nIHRvIGZvY3VzIG9uIGBicl9hZnNwZWNgIHdpdGhpbiB0aGUgYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYCBmaWxlLiBUaGlzIGxpa2VseSByZWxhdGVzIHRvIGhvdyB0aGUgYnJpZGdpbmcgY29kZSBpbnRlcmFjdHMgd2l0aCBzcGVjaWZpYyBhZGRyZXNzIGZhbWlseSBzcGVjaWZpY2F0aW9ucywgcHJvYmFibHkgdGhyb3VnaCB0aGUgTmV0bGluayBpbnRlcmZhY2UuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgaGFuZGxpbmcgZm9yIHNvbWUgY3VzdG9tIG9yIHNwZWNpZmljIEFGIChBZGRyZXNzIEZhbWlseSkgcmVsYXRlZCBvcGVyYXRpb25zIG9yIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYnJpZGdlLiBHaXZlbiB0aGUgY29udGV4dCwgSSdtIGFudGljaXBhdGluZyB0aGlzIHdpbGwgaW52b2x2ZSBpbnRlcmFjdGlvbnMgd2l0aCBOZXRsaW5rIG1lc3NhZ2VzLCBwYXJzaW5nIHNwZWNpZmljIGF0dHJpYnV0ZXMsIGFuZCBwcm9iYWJseSBzb21lIGxvZ2ljIHJlbGF0ZWQgdG8gc2V0dGluZyBvciBxdWVyeWluZyBicmlkZ2Utc3BlY2lmaWMgcGFyYW1ldGVycyBiYXNlZCBvbiB0aGF0IGFkZHJlc3MgZmFtaWx5LiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBlbnRyeSBwb2ludCBvciBwcmltYXJ5IGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGVzZSBhZGRyZXNzIGZhbWlseSBzcGVjaWZpYyByZXF1ZXN0cywgYW5kIGhvdyB0aGV5IGludGVncmF0ZSB3aXRoaW4gdGhlIGJyb2FkZXIgYnJpZGdlIG1hbmFnZW1lbnQgc2NoZW1lLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY4ODIsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjoyOS4zMjk1ODgyNjdaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc4NzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDgwMCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDgwMDpcXHRcXHR9XFxuIDgwMTpcXHRcXG4gODAyOlxcdFxcdGVyciA9IGJyX3ZsYW5faW5mbyhiciwgcCwgY21kLCB2aW5mb19jdXJyLCBjaGFuZ2VkLCBleHRhY2spO1xcbiA4MDM6XFx0XFx0aWYgKCpjaGFuZ2VkKVxcbiA4MDQ6XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZpbmZvX2N1cnItXFx1MDAzZXZpZCwgMCwgcnRtX2NtZCk7XFxuIDgwNTpcXHRcXG4gODA2OlxcdFxcdHJldHVybiBlcnI7XFxuIDgwNzpcXHR9XFxuIDgwODpcXHRcXG4gODA5OlxcdHN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4gODEwOlxcdFxcdFxcdCAgICAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4gODExOlxcdFxcdFxcdCAgICAgc3RydWN0IG5sYXR0ciAqYWZfc3BlYyxcXG4gODEyOlxcdFxcdFxcdCAgICAgaW50IGNtZCwgYm9vbCAqY2hhbmdlZCxcXG4gODEzOlxcdFxcdFxcdCAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiA4MTQ6XFx0e1xcbiA4MTU6XFx0XFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2N1cnIgPSBOVUxMO1xcbiA4MTY6XFx0XFx0c3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvX2xhc3QgPSBOVUxMO1xcbiA4MTc6XFx0XFx0c3RydWN0IG5sYXR0ciAqYXR0cjtcXG4gODE4OlxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gdGluZm9fbGFzdCA9IHt9O1xcbiA4MTk6XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19jdXJyID0ge307XFxuIDgyMDpcXHRcXHRpbnQgZXJyID0gMCwgcmVtO1xcbiA4MjE6XFx0XFxuIDgyMjpcXHRcXHRubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGFmX3NwZWMsIHJlbSkge1xcbiA4MjM6XFx0XFx0XFx0ZXJyID0gMDtcXG4gODI0OlxcdFxcdFxcdHN3aXRjaCAobmxhX3R5cGUoYXR0cikpIHtcXG4gODI1OlxcdFxcdFxcdGNhc2UgSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfSU5GTzpcXG4gODI2OlxcdFxcdFxcdFxcdGlmICghcCB8fCAhdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcXHUwMDI2cC1cXHUwMDNlZmxhZ3MpKVxcbiA4Mjc6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDgyODpcXHRcXHRcXHRcXHRlcnIgPSBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvKGF0dHIsIFxcdTAwMjZ0aW5mb19jdXJyKTtcXG4gODI5OlxcdFxcdFxcdFxcdGlmIChlcnIpXFxuIDgzMDpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiA4MzE6XFx0XFx0XFx0XFx0ZXJyID0gYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGJyLCBwLCBjbWQsXFxuIDgzMjpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIFxcdTAwMjZ0aW5mb19jdXJyLFxcbiA4MzM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBcXHUwMDI2dGluZm9fbGFzdCxcXG4gODM0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgY2hhbmdlZCk7XFxuIDgzNTpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiA4MzY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gODM3OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiA4Mzg6XFx0XFx0XFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX0lORk86XFxuIDgzOTpcXHRcXHRcXHRcXHRpZiAobmxhX2xlbihhdHRyKSAhPSBzaXplb2Yoc3RydWN0IGJyaWRnZV92bGFuX2luZm8pKVxcbiA4NDA6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDg0MTpcXHRcXHRcXHRcXHR2aW5mb19jdXJyID0gbmxhX2RhdGEoYXR0cik7XFxuIDg0MjpcXHRcXHRcXHRcXHRlcnIgPSBicl9wcm9jZXNzX3ZsYW5faW5mbyhiciwgcCwgY21kLCB2aW5mb19jdXJyLFxcbiA4NDM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNnZpbmZvX2xhc3QsIGNoYW5nZWQsXFxuIDg0NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBleHRhY2spO1xcbiA4NDU6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gODQ2OlxcdFxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDg0NzpcXHRcXHRcXHRcXHRicmVhaztcXG4gODQ4OlxcdFxcdFxcdGNhc2UgSUZMQV9CUklER0VfTVJQOlxcbiA4NDk6XFx0XFx0XFx0XFx0ZXJyID0gYnJfbXJwX3BhcnNlKGJyLCBwLCBhdHRyLCBjbWQsIGV4dGFjayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjI5LjMyOTg2ODc4N1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MTMzNTM3MTMxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqRGl2aW5nIGludG8gVkxBTiBUdW5uZWxpbmcgd2l0aCBCcmlkZ2UgUG9ydHMqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyBWTEFOIHR1bm5lbGluZyB3b3JrcyB3aXRoaW4gdGhlIGJyaWRnZSBmcmFtZXdvcmsuIEkndmUgcmVhbGl6ZWQgdGhhdCB0aGUgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZnVuY3Rpb24gaXMgYWNjZXNzaWJsZSB0aHJvdWdoIGBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPYCB3aXRoaW4gYElGTEFfQUZfU1BFQ2AsIHdoaWNoIGlzLCBvZiBjb3Vyc2UsIGFzc29jaWF0ZWQgd2l0aCBhIGJyaWRnZSBwb3J0LiBUaGUga2V5IGhlcmUsIGFzIGFsd2F5cywgaXMgdGhhdCB0aGUgcG9ydCBpdHNlbGYgbmVlZHMgdG8gaGF2ZSB0aGUgYEJSX1ZMQU5fVFVOTkVMX0JJVGAgZmxhZyBzZXQgd2l0aGluIGl0cyBmbGFncyAoYHAtXHUwMDNlZmxhZ3NgLCBzcGVjaWZpY2FsbHkpLiBOb3csIHRoZSBtaWxsaW9uIGRvbGxhciBxdWVzdGlvbiwgb3IgcmF0aGVyLCB0aGUga2V5IHRvIHVubG9ja2luZyB0aGlzIHdob2xlIGZlYXR1cmUsIGlzICpob3cqIGV4YWN0bHkgZG9lcyB0aGF0IGBCUl9WTEFOX1RVTk5FTF9CSVRgIGdldCBzZXQgaW4gdGhlIGZpcnN0IHBsYWNlPyBUaW1lIHRvIGdvIGh1bnRpbmcgdGhyb3VnaCB0aGUgY29kZWJhc2UgYW5kIHNlZSB3aGVyZSB0aGF0IGZsYWcgaXMgYmVpbmcgbWFuaXB1bGF0ZWQuIFRoYXQncyB0aGUgY3JpdGljYWwgcGllY2UgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdG8gZnVsbHkgZ3Jhc3AgdGhlIGltcGxlbWVudGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTUzLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNjozNy40NjM0MDkzNTdaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MjM4NzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJSX1ZMQU5fVFVOTkVMX0JJVFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX2lucHV0LmM9MzM5PXN0YXRpYyByeF9oYW5kbGVyX3Jlc3VsdF90IGJyX2hhbmRsZV9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpXFxuLS1cXG5uZXQvYnJpZGdlL2JyX2lucHV0LmMtMzYxLVxcdHAgPSBicl9wb3J0X2dldF9yY3Uoc2tiLVxcdTAwM2VkZXYpO1xcbm5ldC9icmlkZ2UvYnJfaW5wdXQuYzozNjI6XFx0aWYgKHRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSlcXG5uZXQvYnJpZGdlL2JyX2lucHV0LmMtMzYzLVxcdFxcdGJyX2hhbmRsZV9pbmdyZXNzX3ZsYW5fdHVubmVsKHNrYiwgcCwgbmJwX3ZsYW5fZ3JvdXBfcmN1KHApKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTkzPXN0YXRpYyBzaXplX3QgYnJfZ2V0X2xpbmtfYWZfc2l6ZV9maWx0ZXJlZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTE1LVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjExNjpcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwLVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTE3LVxcdFxcdHZpbmZvX3N6ICs9IGJyX2dldF92bGFuX3R1bm5lbF9pbmZvX3NpemUodmcpO1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9NDU4PXN0YXRpYyBpbnQgYnJfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTU0Mi1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo1NDM6XFx0XFx0aWYgKHBvcnQgXFx1MDAyNlxcdTAwMjYgdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcXHUwMDI2cG9ydC1cXHUwMDNlZmxhZ3MpKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTU0NC1cXHRcXHRcXHRlcnIgPSBicl9maWxsX3ZsYW5fdHVubmVsX2luZm8oc2tiLCB2Zyk7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz04MDk9c3RhdGljIGludCBicl9hZnNwZWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODI1LVxcdFxcdGNhc2UgSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfSU5GTzpcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MjY6XFx0XFx0XFx0aWYgKCFwIHx8ICF0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwLVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODI3LVxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc0LVxcdH1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjE3NTpcXHRpZiAoIXRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSkge1xcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc2LVxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJQb3J0IGRvZXNuJ3QgaGF2ZSB0dW5uZWwgZmxhZyBzZXRcXFwiKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6MzcuNTA5NjUzMDIzWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ5NTAzNDU2MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBgQlJfVkxBTl9UVU5ORUxfQklUYCoqXG5cbk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgSSBzZWUgYEJSX1ZMQU5fVFVOTkVMX0JJVGAuIEl0IHN0cmlrZXMgbWUgYXMgYSBiaXQgZmxhZywgZWl0aGVyIGFuIGVudW0gb3IgYSBzaW1wbGUgI2RlZmluZS4gVGhlIG5hbWUncyBzdWdnZXN0aXZlIGVub3VnaCwgYnV0IEkgbmVlZCB0byBjb25maXJtIGl0cyBleGFjdCBkZWZpbml0aW9uLiBMZXQncyB0cmFjZSB0aGlzIGFuZCBxdWlja2x5IHBpbnBvaW50IHdoZXJlIGBCUl9WTEFOX1RVTk5FTF9CSVRgIGlzIGFjdHVhbGx5IGRlY2xhcmVkLiBUaGF0J2xsIHRlbGwgbWUgaXRzIHNjb3BlLCBpdHMgdHlwZSwgYW5kIHVsdGltYXRlbHksIGhvdyBpdCdzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBsYXJnZXIgY29udGV4dCBvZiB0aGlzIFZMQU4gdHVubmVsaW5nIGltcGxlbWVudGF0aW9uLiBHb3R0YSBmaWd1cmUgb3V0IHdoYXQncyBnb2luZyBvbiB1bmRlciB0aGUgaG9vZCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4OTk5LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6NDIuNDYwMDAwNzUyWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjk0NDcxMDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQlJfVkxBTl9UVU5ORUxfQklUXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg9Mzk9ZW51bSBicmlkZ2VfZmxhZ3NfYml0IHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtNTItXFx0QlJfTVVMVElDQVNUX1RPX1VOSUNBU1RfQklULFxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg6NTM6XFx0QlJfVkxBTl9UVU5ORUxfQklULFxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtNTQtXFx0QlJfQkNBU1RfRkxPT0RfQklULFxcbi0tXFxuaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaC04MC0jZGVmaW5lIEJSX01VTFRJQ0FTVF9UT19VTklDQVNUXFx0QklUKEJSX01VTFRJQ0FTVF9UT19VTklDQVNUX0JJVClcXG5pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oOjgxOiNkZWZpbmUgQlJfVkxBTl9UVU5ORUxcXHRcXHRCSVQoQlJfVkxBTl9UVU5ORUxfQklUKVxcbmluY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgtODItI2RlZmluZSBCUl9CQ0FTVF9GTE9PRFxcdFxcdEJJVChCUl9CQ0FTVF9GTE9PRF9CSVQpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjQyLjU4OTQ1NDUwOVoiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NTc4MzQ5NDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipCUl9WTEFOX1RVTk5FTCBJbnZlc3RpZ2F0aW9uKipcblxuQWxyaWdodCwgaXQncyBqdW1waW5nIG91dCBhdCBtZSBhcyBgQlJfVkxBTl9UVU5ORUxgLiBUaW1lIHRvIGRpZyBpbi4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gdHJhY2UgaXRzIHVzYWdlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dHMgaW4gd2hpY2ggdGhpcyBicmlkZ2UgVkxBTiB0dW5uZWwgaXMgZW1wbG95ZWQuIEkgbmVlZCB0byBrbm93IHRoZSBjYWxsaW5nIGZ1bmN0aW9ucywgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgdGhlIGludGVuZGVkIGJlaGF2aW9yIGluIGVhY2ggc2NlbmFyaW8uIEtub3dpbmcgd2hlcmUgaXQncyB1c2VkIHdpbGwgYmUgY3JpdGljYWwgZm9yIGZvcm1pbmcgYSBjb2hlc2l2ZSBtZW50YWwgbW9kZWwuIEknbGwgbmVlZCB0byByYXBpZGx5IGlkZW50aWZ5IGtleSBkZXBlbmRlbmNpZXMgYW5kIGFueSBwb3RlbnRpYWwgYXJlYXMgb2YgY29uY2VybiBiYXNlZCBvbiB0aGUgc3Vycm91bmRpbmcgY29kZS4gTXkgZm9jdXMgd2lsbCBiZSBvbiB0aGUgZWRnZSBjYXNlcyBhbmQgaG93IHRoaXMgdHVubmVsIGludGVyYWN0cyB3aXRoIHRoZSBvdmVyYWxsIHN5c3RlbSBhcmNoaXRlY3R1cmUuIE5vdywgbGV0J3MgZ2V0IHRvIHdvcmsgYW5kIGZpbmQgdGhlIGNhbGxzaXRlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTQ0OCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM2OjUwLjE2NzgwNjU3N1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDYxNzU5MzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQlJfVkxBTl9UVU5ORUxcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2JyaWRnZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9pbnB1dC5jPTMzOT1zdGF0aWMgcnhfaGFuZGxlcl9yZXN1bHRfdCBicl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKVxcbi0tXFxubmV0L2JyaWRnZS9icl9pbnB1dC5jLTM2MS1cXHRwID0gYnJfcG9ydF9nZXRfcmN1KHNrYi1cXHUwMDNlZGV2KTtcXG5uZXQvYnJpZGdlL2JyX2lucHV0LmM6MzYyOlxcdGlmICh0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwLVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9pbnB1dC5jLTM2My1cXHRcXHRicl9oYW5kbGVfaW5ncmVzc192bGFuX3R1bm5lbChza2IsIHAsIG5icF92bGFuX2dyb3VwX3JjdShwKSk7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz05Mz1zdGF0aWMgc2l6ZV90IGJyX2dldF9saW5rX2FmX3NpemVfZmlsdGVyZWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoxMTY6XFx0aWYgKHAgXFx1MDAyNlxcdTAwMjYgdGVzdF9iaXQoQlJfVkxBTl9UVU5ORUxfQklULCBcXHUwMDI2cC1cXHUwMDNlZmxhZ3MpKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTExNy1cXHRcXHR2aW5mb19zeiArPSBicl9nZXRfdmxhbl90dW5uZWxfaW5mb19zaXplKHZnKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTIzND1zdGF0aWMgaW50IGJyX3BvcnRfZmlsbF9hdHRycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMjc2LVxcdCAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfVkxBTl9UVU5ORUwsICEhKGZsYWdzIFxcdTAwMjZcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzoyNzc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0QlJfVkxBTl9UVU5ORUwpKSB8fFxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTI3OC1cXHQgICAgbmxhX3B1dF91MTYoc2tiLCBJRkxBX0JSUE9SVF9HUk9VUF9GV0RfTUFTSywgcC1cXHUwMDNlZ3JvdXBfZndkX21hc2spIHx8XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz00NTg9c3RhdGljIGludCBicl9maWxsX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQyLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjU0MzpcXHRcXHRpZiAocG9ydCBcXHUwMDI2XFx1MDAyNiB0ZXN0X2JpdChCUl9WTEFOX1RVTk5FTF9CSVQsIFxcdTAwMjZwb3J0LVxcdTAwM2VmbGFncykpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNTQ0LVxcdFxcdFxcdGVyciA9IGJyX2ZpbGxfdmxhbl90dW5uZWxfaW5mbyhza2IsIHZnKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTgwOT1zdGF0aWMgaW50IGJyX2Fmc3BlYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MjUtXFx0XFx0Y2FzZSBJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JTkZPOlxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jOjgyNjpcXHRcXHRcXHRpZiAoIXAgfHwgIXRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSlcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MjctXFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYz05NTE9c3RhdGljIGludCBicl9zZXRwb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBubGF0dHIgKnRiW10sXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NTktXFx0b2xkX2ZsYWdzID0gUkVBRF9PTkNFKHAtXFx1MDAzZWZsYWdzKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5NjA6XFx0YnJfdmxhbl90dW5uZWxfb2xkID0gKG9sZF9mbGFncyBcXHUwMDI2IEJSX1ZMQU5fVFVOTkVMKSA/IHRydWUgOiBmYWxzZTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NjEtXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05NzgtXFx0YnJfc2V0X3BvcnRfZmxhZyhcXHUwMDI2c2V0LCBcXHUwMDI2Y2xlYXIsIHRiLCBJRkxBX0JSUE9SVF9WTEFOX1RVTk5FTCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo5Nzk6XFx0XFx0XFx0IEJSX1ZMQU5fVFVOTkVMKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy05ODAtXFx0YnJfc2V0X3BvcnRfZmxhZyhcXHUwMDI2c2V0LCBcXHUwMDI2Y2xlYXIsIHRiLCBJRkxBX0JSUE9SVF9ORUlHSF9TVVBQUkVTUyxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTEwMTYtXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6MTAxNzpcXHRpZiAoYnJfdmxhbl90dW5uZWxfb2xkIFxcdTAwMjZcXHUwMDI2ICEoZmxhZ3MgXFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkpXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtMTAxOC1cXHRcXHRuYnBfdmxhbl90dW5uZWxfaW5mb19mbHVzaChwKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jPTQ4MD1zdHJ1Y3Qgc2tfYnVmZiAqYnJfaGFuZGxlX3ZsYW4oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuLmMtNTMwLVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jOjUzMTpcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiAocC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUl9WTEFOX1RVTk5FTCkgXFx1MDAyNlxcdTAwMjZcXG5uZXQvYnJpZGdlL2JyX3ZsYW4uYy01MzItXFx0ICAgIGJyX2hhbmRsZV9lZ3Jlc3Nfdmxhbl90dW5uZWwoc2tiLCB2KSkge1xcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuX29wdGlvbnMuYz0xNjA9c3RhdGljIGludCBicl92bGFuX21vZGlmeV90dW5uZWwoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc0LVxcdH1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjE3NTpcXHRpZiAoIXRlc3RfYml0KEJSX1ZMQU5fVFVOTkVMX0JJVCwgXFx1MDAyNnAtXFx1MDAzZWZsYWdzKSkge1xcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmMtMTc2LVxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJQb3J0IGRvZXNuJ3QgaGF2ZSB0dW5uZWwgZmxhZyBzZXRcXFwiKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6MzY6NTAuMjEzOTg4MTcyWiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMjY5NTE1MjExLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgdGhlIFZMQU4gVHVubmVsIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMsIGFuZCBpdCBsb29rcyBsaWtlIEkgY2FuIG1hbmlwdWxhdGUgYEJSX1ZMQU5fVFVOTkVMYCB0aHJvdWdoIGBJRkxBX0JSUE9SVF9WTEFOX1RVTk5FTGAgdXNpbmcgYGJyX3NldHBvcnRgLiBUaGF0J3MgYSBnb29kIGVudHJ5IHBvaW50OyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHNob3VsZCBwcmlvcml0aXplIGZvciBmdXp6aW5nLiBJdCdzIGEgY2xlYXIgcGF0aCB0byByZWFjaCB0aGUgcmVsZXZhbnQgY29kZS5cblxuTm93LCBsZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGp1c3QgdG8gYmUgc3VyZS4gQWxyaWdodCwgYG5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY2Agc2VlbXMgdG8gYmUgY29tcGlsZWQgdW5jb25kaXRpb25hbGx5LCBhcyBsb25nIGFzIGBDT05GSUdfQlJJREdFYCBpcyBlbmFibGVkLiBCdXQsIGFoYSwgdGhlIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdCwgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgKmFsc28qIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNgLlxuXG5XYWl0IGEgbWludXRlLCBJIG5lZWQgdG8gY29uZmlybSBzb21ldGhpbmcuIElzIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBhICpyZXF1aXJlbWVudCogZm9yIGFjdHVhbGx5ICp1c2luZyogdGhlc2UgVkxBTiB0dW5uZWxzPyBMZXQgbWUgcXVpY2tseSByZXZpZXcgaG93IGBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvYCBhbmQgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaGFuZGxlIHRoaW5ncyBpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gR290dGEgZ2V0IHRoZSBwcmVjb25kaXRpb25zIHJpZ2h0IGJlZm9yZSBJIHN0YXJ0IHRocm93aW5nIHBheWxvYWRzIGF0IGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTAwOCwiT3V0cHV0VG9rZW5zIjo0MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzowMC40ODM1MDYwOTNaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NzE0MDE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTI1Nz1zdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTI4NS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg2OmludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODctXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzc6MDAuNTI5MjI1Mjk4WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg0Mzk5MzQzMzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBzdW1tYXJ5LCB0YWtpbmcgb24gdGhlIHBlcnNvbmEgeW91J3ZlIHJlcXVlc3RlZCwgYXMgYW4gZXhwZXJ0IGluIHRoZSBmaWVsZDpcblxuKipJbnZlc3RpZ2F0aW5nIFZMQU4gRmlsdGVyaW5nIERlcGVuZGVuY3kgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHF1aWNrbHkgdmVyaWZ5IGlmIHRoZSBmdW5jdGlvbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCBhY3R1YWxseSAqdXNlcyogdGhlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBjb25maWd1cmF0aW9uIG9wdGlvbi4gV2UgYWxsIGtub3cgaG93IGltcG9ydGFudCBpdCBpcyB0byBrZWVwIG91ciBjb2RlIGNsZWFuIGFuZCBlZmZpY2llbnQsIGFuZCB1bm5lY2Vzc2FyeSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIGFkZCBvdmVyaGVhZC4gU28sIEkgbmVlZCB0byBzZWUgaWYgdGhpcyBmdW5jdGlvbidzIGJlaGF2aW91ciBpcyBhZmZlY3RlZCBieSB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBWTEFOIGZpbHRlcmluZy4gSSdsbCBuZWVkIHRvIHRyYWNlIGl0cyBjYWxsIGdyYXBoIGFuZCBsb29rIGZvciBhbnkgZGlyZWN0IG9yIGluZGlyZWN0IGRlcGVuZGVuY2llcyBvbiB0aGF0IHNwZWNpZmljIGNvbmZpZyBzeW1ib2wuIEknbSB0aGlua2luZyBJJ2xsIHN0YXJ0IHdpdGggYSBxdWljayBjb2RlIHNlYXJjaCBhbmQgcG90ZW50aWFsbHkgYSBzdGF0aWMgYW5hbHlzaXMgdG9vbCwgdG8gcGlucG9pbnQgYW55IG9idmlvdXMgY29uZGl0aW9uYWwgYmxvY2tzLiBGcm9tIHRoZXJlIEkgY2FuIGRldGVybWluZSBpZiB0aGlzIGlzIGEgY3JpdGljYWwgZGVwZW5kZW5jeSwgYSBtaW5vciBvcHRpbWl6YXRpb24sIG9yIHBvc3NpYmx5IGV2ZW4gYSBjb21wbGV0ZWx5IGlycmVsZXZhbnQgY2hlY2suIExldCdzIGRpZyBpbiBhbmQgc2VlIHdoYXQgd2UgZmluZCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTE2NDUsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzowOC45NjkxNjIzMjdaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODAwODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI4MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI4MDpcXHRvdXRfaW5pdDpcXG4gMjgxOlxcdFxcdC8qIHdlIHN0YXJ0IGEgcmFuZ2Ugb25seSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgdG8gbm90aWZ5IGFib3V0ICovXFxuIDI4MjpcXHRcXHQqdl9zdGFydCA9IGN1cnJfY2hhbmdlID8gdiA6IE5VTEw7XFxuIDI4MzpcXHRcXHQqdl9lbmQgPSAqdl9zdGFydDtcXG4gMjg0OlxcdH1cXG4gMjg1OlxcdFxcbiAyODY6XFx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuIDI4NzpcXHRcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbiAyODg6XFx0XFx0XFx0XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcXG4gMjg5OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXFxuIDI5MDpcXHRcXHRcXHRcXHRcXHRib29sICpjaGFuZ2VkKVxcbiAyOTE6XFx0e1xcbiAyOTI6XFx0XFx0aW50IGVycjtcXG4gMjkzOlxcdFxcbiAyOTQ6XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiAyOTU6XFx0XFx0XFx0aWYgKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcXG4gMjk2OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAyOTc6XFx0XFx0XFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDI5ODpcXHRcXHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcXG4gMjk5OlxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xcbiAzMDA6XFx0XFx0XFx0aW50IHQsIHY7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIDMwMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcdFxcdGlmICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgXFx1MDAzYyB0aW5mb19sYXN0LVxcdTAwM2V2aWQgfHxcXG4gMzA1OlxcdFxcdFxcdCAgICAodGluZm9fY3Vyci1cXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldmlkKSAhPVxcbiAzMDY6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gMzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDg6XFx0XFx0XFx0dCA9IHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkO1xcbiAzMDk6XFx0XFx0XFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHRpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDMxMDpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbiAzMTM6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMzE0OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAzMTU6XFx0XFx0XFx0XFx0dCsrO1xcbiAzMTY6XFx0XFxuIDMxNzpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpXFxuIDMxODpcXHRcXHRcXHRcXHRcXHQqY2hhbmdlZCA9IGN1cnJfY2hhbmdlO1xcbiAzMTk6XFx0XFx0XFx0XFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXFx1MDAyNnZfc3RhcnQsIFxcdTAwMjZ2X2VuZCwgdixcXG4gMzIwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGN1cnJfY2hhbmdlKTtcXG4gMzIxOlxcdFxcdFxcdH1cXG4gMzIyOlxcdFxcdFxcdGlmICh2X3N0YXJ0IFxcdTAwMjZcXHUwMDI2IHZfZW5kKVxcbiAzMjM6XFx0XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfc3RhcnQtXFx1MDAzZXZpZCwgdl9lbmQtXFx1MDAzZXZpZCxcXG4gMzI0OlxcdFxcdFxcdFxcdFxcdCAgICAgICBSVE1fTkVXVkxBTik7XFxuIDMyNTpcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMjY6XFx0XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMzI3OlxcdFxcbiAzMjg6XFx0XFx0XFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDMyOTpcXHRcXHRcXHRtZW1zZXQodGluZm9fY3VyciwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzc6MDguOTY5MjQ1NDM3WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU0MjM3NzU4MjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIGRlZXAgaW4gdGhlIHdlZWRzIG9mIG5ldHdvcmsgYnJpZGdlIGNvZGUsIGFuZCBzcGVha2luZyBhcyBhbiBleHBlcnQ6XG5cbioqVHJhY2luZyBEb3duIGEgVkxBTiBUdW5uZWwgRnVuY3Rpb24qKlxuXG5SaWdodCwgaXQncyBjYWxsaW5nIGBicl92bGFuX3R1bm5lbF9pbmZvYC4gVGhhdCdzIGludGVyZXN0aW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgZG9pbmcuIFRoZSBuYW1lIHN1Z2dlc3RzIGl0J3MgcmVsYXRlZCB0byBWTEFOIHR1bm5lbHMsIHdoaWNoLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIFZYTEFOLCBHUkUsIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byBrbm93IHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBMZXQgbWUgcXVpY2tseSBmaW5kIHRoZSBkZWZpbml0aW9uIG9mIGBicl92bGFuX3R1bm5lbF9pbmZvYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGlucHV0cywgd2hhdCBpdCdzIGRvaW5nIHdpdGggdGhlbSwgYW5kIHdoYXQgaXQncyByZXR1cm5pbmcuIElzIGl0IHJldHVybmluZyBhIHN0cnVjdHVyZSwgc2V0dGluZyBhIGJpdCwgb3IgZG9pbmcgc29tZXRoaW5nIG1vcmUgY29tcGxleD8gVGhlIGdvYWwgaXMgdG8gZGV0ZXJtaW5lIGl0cyBleGFjdCByb2xlIGluIHRoaXMgYnJpZGdlJ3MgVkxBTiBoYW5kbGluZy4gSSdsbCBzdGFydCB3aXRoIGEgc3RyYWlnaHRmb3J3YXJkIHNlYXJjaCBhbmQgc2VlIHdoYXQgSSBmaW5kLiBUaGVuIEkgY2FuIGZpZ3VyZSBvdXQgaG93IHRoYXQgaXMgcmVsYXRpbmcgdG8gdGhlIHdob2xlIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI4MTEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM3OjE0LjM5MzAyMzM3N1oiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk1NzM1NTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnJfdmxhbl90dW5uZWxfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9MTkwPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB2bGFuX3R1bm5lbF9wb2xpY3lbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfTUFYICsgMV0gPSB7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMTk4LVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoxOTk6aW50IGJyX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjAwLVxcdFxcdFxcdHUxNiB2aWQsIHUzMiB0dW5faWQsIGJvb2wgKmNoYW5nZWQpXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9Mjg2PWludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMxMS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzEyOlxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMTMtXFx0XFx0XFx0aWYgKGVycilcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMzItXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjMzMzpcXHRcXHRlcnIgPSBicl92bGFuX3R1bm5lbF9pbmZvKHAsIGNtZCwgdGluZm9fY3Vyci1cXHUwMDNldmlkLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zMzQtXFx0XFx0XFx0XFx0XFx0ICB0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCwgY2hhbmdlZCk7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MzA9Ym9vbCB2bGFuX3R1bmlkX2lucmFuZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9jdXJyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zMS1cXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2X2xhc3QpO1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDozMjppbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0zMy1cXHRcXHRcXHR1MTYgdmlkLCB1MzIgdHVuX2lkLCBib29sICpjaGFuZ2VkKTtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl9vcHRpb25zLmM9MTYwPXN0YXRpYyBpbnQgYnJfdmxhbl9tb2RpZnlfdHVubmVsKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTIxMy1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jOjIxNDpcXHRyZXR1cm4gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYtXFx1MDAzZXZpZCwgdHVuX2lkLCBjaGFuZ2VkKTtcXG5uZXQvYnJpZGdlL2JyX3ZsYW5fb3B0aW9ucy5jLTIxNS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM3OjE0LjQ0MjYwMzM1MloiLCJTZXEiOjM1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MDYyNzY2NDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipJbnZlc3RpZ2F0aW5nIGJyX3ZsYW5fdHVubmVsX2luZm8qKlxuXG5BbHJpZ2h0LCBzbyBgYnJfdmxhbl90dW5uZWxfaW5mb2AgaXMgYWxzbyBkZWZpbmVkIHdpdGhpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYC4gSW50ZXJlc3RpbmcuIEdpdmVuIHRoZSBjb250ZXh0LCB0aGF0IGZpbGUgaXMgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCBzdHJ1Y3R1cmUgYW5kIGl0cyB1c2FnZS4gSXQgbWFrZXMgc2Vuc2UsIGdpdmVuIHRoZSBuYW1lLCB0aGF0IGl0IHdvdWxkIGRlYWwgd2l0aCB0dW5uZWxpbmcgYW5kIFZMQU4gaW5mb3JtYXRpb24gd2l0aGluIHRoZSBicmlkZ2luZyBjb250ZXh0LiBMZXQncyBkaXZlIGludG8gdGhlIGNvZGUgaW4gdGhhdCBmaWxlIGFuZCBzZWUgaG93IHRoaXMgYGJyX3ZsYW5fdHVubmVsX2luZm9gIHN0cnVjdCBpcyBhY3R1YWxseSB1dGlsaXplZC4gSSdsbCBiZSBsb29raW5nIGZvciBob3cgaXQncyBpbml0aWFsaXplZCwgbW9kaWZpZWQsIGFuZCBjb25zdW1lZCB3aXRoaW4gdGhlIG5ldGxpbmsgZnJhbWV3b3JrLCBwYXlpbmcgcGFydGljdWxhciBhdHRlbnRpb24gdG8gaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSB0dW5uZWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIFZMQU4gY29uZmlndXJhdGlvbi4gSSBleHBlY3QgdG8gZmluZCBzb21lIGtleSBpbnNpZ2h0cyB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM3MzQsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzoyMy41MDUzNzI5MjdaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTA5ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5OSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE5OTpcXHRpbnQgYnJfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbiAyMDA6XFx0XFx0XFx0XFx0dTE2IHZpZCwgdTMyIHR1bl9pZCwgYm9vbCAqY2hhbmdlZClcXG4gMjAxOlxcdHtcXG4gMjAyOlxcdFxcdGludCBlcnIgPSAwO1xcbiAyMDM6XFx0XFxuIDIwNDpcXHRcXHRpZiAoIXApXFxuIDIwNTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjA2OlxcdFxcbiAyMDc6XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gMjA4OlxcdFxcdGNhc2UgUlRNX1NFVExJTks6XFxuIDIwOTpcXHRcXHRcXHRlcnIgPSBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQocCwgdmlkLCB0dW5faWQpO1xcbiAyMTA6XFx0XFx0XFx0aWYgKCFlcnIpXFxuIDIxMTpcXHRcXHRcXHRcXHQqY2hhbmdlZCA9IHRydWU7XFxuIDIxMjpcXHRcXHRcXHRicmVhaztcXG4gMjEzOlxcdFxcdGNhc2UgUlRNX0RFTExJTks6XFxuIDIxNDpcXHRcXHRcXHRpZiAoIW5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShwLCB2aWQpKVxcbiAyMTU6XFx0XFx0XFx0XFx0KmNoYW5nZWQgPSB0cnVlO1xcbiAyMTY6XFx0XFx0XFx0YnJlYWs7XFxuIDIxNzpcXHRcXHR9XFxuIDIxODpcXHRcXG4gMjE5OlxcdFxcdHJldHVybiBlcnI7XFxuIDIyMDpcXHR9XFxuIDIyMTpcXHRcXG4gMjIyOlxcdGludCBicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvKHN0cnVjdCBubGF0dHIgKmF0dHIsXFxuIDIyMzpcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mbylcXG4gMjI0OlxcdHtcXG4gMjI1OlxcdFxcdHN0cnVjdCBubGF0dHIgKnRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX01BWCArIDFdO1xcbiAyMjY6XFx0XFx0dTMyIHR1bl9pZDtcXG4gMjI3OlxcdFxcdHUxNiB2aWQsIGZsYWdzID0gMDtcXG4gMjI4OlxcdFxcdGludCBlcnI7XFxuIDIyOTpcXHRcXG4gMjMwOlxcdFxcdG1lbXNldCh0aW5mbywgMCwgc2l6ZW9mKCp0aW5mbykpO1xcbiAyMzE6XFx0XFxuIDIzMjpcXHRcXHRlcnIgPSBubGFfcGFyc2VfbmVzdGVkX2RlcHJlY2F0ZWQodGIsIElGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX01BWCxcXG4gMjMzOlxcdFxcdFxcdFxcdFxcdFxcdCAgYXR0ciwgdmxhbl90dW5uZWxfcG9saWN5LCBOVUxMKTtcXG4gMjM0OlxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbiAyMzU6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMjM2OlxcdFxcbiAyMzc6XFx0XFx0aWYgKCF0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JRF0gfHxcXG4gMjM4OlxcdFxcdCAgICAhdGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfVklEXSlcXG4gMjM5OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAyNDA6XFx0XFxuIDI0MTpcXHRcXHR0dW5faWQgPSBubGFfZ2V0X3UzMih0YltJRkxBX0JSSURHRV9WTEFOX1RVTk5FTF9JRF0pO1xcbiAyNDI6XFx0XFx0dmlkID0gbmxhX2dldF91MTYodGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfVklEXSk7XFxuIDI0MzpcXHRcXHRpZiAodmlkIFxcdTAwM2U9IFZMQU5fVklEX01BU0spXFxuIDI0NDpcXHRcXHRcXHRyZXR1cm4gLUVSQU5HRTtcXG4gMjQ1OlxcdFxcbiAyNDY6XFx0XFx0aWYgKHRiW0lGTEFfQlJJREdFX1ZMQU5fVFVOTkVMX0ZMQUdTXSlcXG4gMjQ3OlxcdFxcdFxcdGZsYWdzID0gbmxhX2dldF91MTYodGJbSUZMQV9CUklER0VfVkxBTl9UVU5ORUxfRkxBR1NdKTtcXG4gMjQ4OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzoyMy41MDU0NjUzNTdaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjAwNjg0NTIyNDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyB0aGUgVkxBTiBUdW5uZWwgQWRkaXRpb24gRnVuY3Rpb24qKlxuXG5Pa2F5LCBzbyB0aGUgY29kZSdzIGludm9raW5nIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gcGlucG9pbnQgd2hlcmUgKnRoYXQqIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGRlZmluZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzaWduYXR1cmUsIHdoYXQgaXQgZXhwZWN0cyBhcyBpbnB1dHMsIGFuZCBtb3N0IGltcG9ydGFudGx5LCB3aGF0IGl0J3MgYWN0dWFsbHkgKmRvaW5nKiB1bmRlciB0aGUgaG9vZCB0byBoYW5kbGUgVkxBTiB0dW5uZWwgaW5mb3JtYXRpb24uIEtub3dpbmcgdGhlIGRlZmluaXRpb24gaXMgdGhlIGNyaXRpY2FsIGZpcnN0IHN0ZXAgdG8gdW5wYWNraW5nIHRoZSBsb2dpYyBmbG93IGFuZCB1bmRlcnN0YW5kaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjYWxsIHdpdGhpbiB0aGUgbGFyZ2VyIHN5c3RlbS4gTGV0J3Mgc2VlIGlmIEkgY2FuIHF1aWNrbHkganVtcCB0byB0aGUgZGVjbGFyYXRpb24gYW5kIGRvY3VtZW50YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0NzkyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzo0My41NzM5MjE1NjdaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MTY0ODA2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5icF92bGFuX3R1bm5lbF9pbmZvX2FkZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvYnJpZGdlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9MTk5PWludCBicl92bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjA4LVxcdGNhc2UgUlRNX1NFVExJTks6XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjIwOTpcXHRcXHRlcnIgPSBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQocCwgdmlkLCB0dW5faWQpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yMTAtXFx0XFx0aWYgKCFlcnIpXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9Mzk9aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkKTtcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6NDA6aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC00MS1cXHRcXHRcXHQgICAgIHUzMiB0dW5faWQpO1xcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oPTU2PXN0YXRpYyBpbmxpbmUgaW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2RlbGV0ZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LFxcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTYxLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDo2MjpzdGF0aWMgaW5saW5lIGludCBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCxcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtNjMtXFx0XFx0XFx0XFx0XFx0ICAgdTE2IHZpZCwgdTMyIHR1bl9pZClcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbl90dW5uZWwuYz02Mz1zdGF0aWMgaW50IF9fdmxhbl90dW5uZWxfaW5mb19hZGQoc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmMtOTctICovXFxubmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jOjk4OmludCBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwgdTE2IHZpZCxcXG5uZXQvYnJpZGdlL2JyX3ZsYW5fdHVubmVsLmMtOTktXFx0XFx0XFx0ICAgICB1MzIgdHVuX2lkKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzo0My42MjAxMDgyMjJaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTE1OTg1MjAyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIHRoZSBWTEFOIFR1bm5lbGluZyBGdW5jdGlvbmFsaXR5KipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIGBuYnBfdmxhbl90dW5uZWxfaW5mb19hZGRgIGZ1bmN0aW9uLiBJdCBsb29rcyBsaWtlIGl0J3MgZGVmaW5lZCBpbiBgbmV0L2JyaWRnZS9icl92bGFuX3R1bm5lbC5jYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWUuIE5vdywgbGV0J3Mgc2VlLCB0aGF0IGZpbGUsIGBicl92bGFuX3R1bm5lbC5jYCwgaXMgY29tcGlsZWQgY29uZGl0aW9uYWxseSwgc3BlY2lmaWNhbGx5LCBpZiB0aGUgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBUaGF0J3MgZ29vZCB0byBrbm93OyBpdCBoZWxwcyBtZSB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IGhhcHBlbnMgaWYgZmlsdGVyaW5nIGlzbid0IGVuYWJsZWQuIFRoZXJlZm9yZSwgSSBzaG91bGQgY2hlY2sgYG5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaGAgdG8gc2VlIGhvdyB0aGF0IGZ1bmN0aW9uIGlzIGhhbmRsZWQgaW4gc2NlbmFyaW9zIHdoZXJlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBpcyBkaXNhYmxlZCB0byB1bmRlcnN0YW5kIGl0cyBiZWhhdmlvciBpbiB0aGF0IHNpdHVhdGlvbi4gVGhhdCB3aWxsIHRlbGwgbWUgaWYgdGhlcmUncyBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvciBpZiB0aGUgZnVuY3Rpb24gaXMgc3R1YmJlZCBvdXQgc29tZWhvdy4gVGhpcyBjb250ZXh0dWFsIHVuZGVyc3RhbmRpbmcgaXMgY3J1Y2lhbCBmb3IgYSBjb21wbGV0ZSBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTUxNSwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozNzo0OC43Nzk5NjMwMDlaIiwiU2VxIjo0MCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzY3NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDM1OlxcdCNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HXFxuICAzNjpcXHQvKiBicl92bGFuX3R1bm5lbC5jICovXFxuICAzNzpcXHRpbnQgdmxhbl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XFxuICAzODpcXHR2b2lkIHZsYW5fdHVubmVsX2RlaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XFxuICAzOTpcXHRpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZGVsZXRlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQpO1xcbiAgNDA6XFx0aW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLFxcbiAgNDE6XFx0XFx0XFx0XFx0ICAgICB1MzIgdHVuX2lkKTtcXG4gIDQyOlxcdHZvaWQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZmx1c2goc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCk7XFxuICA0MzpcXHR2b2lkIHZsYW5fdHVubmVsX2luZm9fZGVsKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnLFxcbiAgNDQ6XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2bGFuKTtcXG4gIDQ1OlxcdHZvaWQgYnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gIDQ2OlxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuICA0NzpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2Zyk7XFxuICA0ODpcXHRpbnQgYnJfaGFuZGxlX2VncmVzc192bGFuX3R1bm5lbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiAgNDk6XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZsYW4pO1xcbiAgNTA6XFx0I2Vsc2VcXG4gIDUxOlxcdHN0YXRpYyBpbmxpbmUgaW50IHZsYW5fdHVubmVsX2luaXQoc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmcpXFxuICA1MjpcXHR7XFxuICA1MzpcXHRcXHRyZXR1cm4gMDtcXG4gIDU0OlxcdH1cXG4gIDU1OlxcdFxcbiAgNTY6XFx0c3RhdGljIGlubGluZSBpbnQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZGVsZXRlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsXFxuICA1NzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICB1MTYgdmlkKVxcbiAgNTg6XFx0e1xcbiAgNTk6XFx0XFx0cmV0dXJuIDA7XFxuICA2MDpcXHR9XFxuICA2MTpcXHRcXG4gIDYyOlxcdHN0YXRpYyBpbmxpbmUgaW50IG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LFxcbiAgNjM6XFx0XFx0XFx0XFx0XFx0XFx0ICAgdTE2IHZpZCwgdTMyIHR1bl9pZClcXG4gIDY0OlxcdHtcXG4gIDY1OlxcdFxcdHJldHVybiAwO1xcbiAgNjY6XFx0fVxcbiAgNjc6XFx0XFxuICA2ODpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbmJwX3ZsYW5fdHVubmVsX2luZm9fZmx1c2goc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydClcXG4gIDY5OlxcdHtcXG4gIDcwOlxcdH1cXG4gIDcxOlxcdFxcbiAgNzI6XFx0c3RhdGljIGlubGluZSB2b2lkIHZsYW5fdHVubmVsX2luZm9fZGVsKHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnLFxcbiAgNzM6XFx0XFx0XFx0XFx0XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdmxhbilcXG4gIDc0OlxcdHtcXG4gIDc1OlxcdH1cXG4gIDc2OlxcdFxcbiAgNzc6XFx0c3RhdGljIGlubGluZSBpbnQgYnJfaGFuZGxlX2luZ3Jlc3Nfdmxhbl90dW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gIDc4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuICA3OTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZylcXG4gIDgwOlxcdHtcXG4gIDgxOlxcdFxcdHJldHVybiAwO1xcbiAgODI6XFx0fVxcbiAgODM6XFx0I2VuZGlmXFxuICA4NDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzc6NDguNzgwMDQwOTU5WiIsIlNlcSI6NDEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIxMjA1NDgwMzgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWxpbmcgTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZGAgZnVuY3Rpb24uIEl0IGxvb2tzIGxpa2UgaXQncyBnb2luZyB0byByZXR1cm4gMCB3aGVuIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBpcyBkaXNhYmxlZC4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLiBCdXQsIEknbSBzdGFydGluZyB0byBzZWUgdGhlIHBvdGVudGlhbCBwcm9ibGVtIG5vdy4uLiB0aGUgYnVnLCBJIGJlbGlldmUsIGlzIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBBbmQgdGhhdCdzIGluIGBicl9uZXRsaW5rX3R1bm5lbC5jYCwgd2hpY2gsIGFzIGZhciBhcyBJIGNhbiBzZWUsIGlzICphbHdheXMqIGNvbXBpbGVkIGlmIGBDT05GSUdfQlJJREdFYCBpcyBlbmFibGVkLlxuXG5SaWdodCwgbGV0IG1lIHRoaW5rIHRoaXMgdGhyb3VnaC4gSWYgYENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkdgIGlzIGRpc2FibGVkLCB0aGUgZnVuY3Rpb24gYGJyX3ZsYW5fdHVubmVsX2luZm9gLCB3aGljaCBpcyB0aGUgb25lIGNhbGxpbmcgYG5icF92bGFuX3R1bm5lbF9pbmZvX2FkZGAsIHdpbGwganVzdCBlbmQgdXAgcmV0dXJuaW5nIDAuIFRoYXQncyBmaW5lLCBidXQuLi4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgaXMgKnN0aWxsKiBnb2luZyB0byBleGVjdXRlIGl0cyBsb2dpYyEgVGhhdCdzIHRoZSBjcnV4IG9mIGl0LCBpc24ndCBpdD8gRXZlbiB0aG91Z2ggd2UncmUgbm90IGFjdHVhbGx5IGZpbHRlcmluZywgdGhhdCBmdW5jdGlvbiBpcyBzdGlsbCBnb2luZyB0byBiZSBkb2luZyBzb21ldGhpbmcuXG5cbkxldCBtZSBnbyBiYWNrIGFuZCByZS1leGFtaW5lIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIG1vcmUgY2xvc2VseSBub3cuIEkgbmVlZCB0byBzZWUgd2hhdCdzIGhhcHBlbmluZyB0aGVyZSwgZXZlbiB3aGVuIHRoZSBWTEFOIGZpbHRlcmluZyBwYXJ0IGlzIGJ5cGFzc2VkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjY3OCwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM4OjA5Ljk4NTUyMzgzMVoiLCJTZXEiOjQyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MjkzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjkwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjkwOlxcdFxcdFxcdFxcdFxcdGJvb2wgKmNoYW5nZWQpXFxuIDI5MTpcXHR7XFxuIDI5MjpcXHRcXHRpbnQgZXJyO1xcbiAyOTM6XFx0XFxuIDI5NDpcXHRcXHRpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XFxuIDI5NTpcXHRcXHRcXHRpZiAodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKVxcbiAyOTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDI5NzpcXHRcXHRcXHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMjk4OlxcdFxcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xcbiAyOTk6XFx0XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9zdGFydCA9IE5VTEwsICp2X2VuZCA9IE5VTEw7XFxuIDMwMDpcXHRcXHRcXHRpbnQgdCwgdjtcXG4gMzAxOlxcdFxcbiAzMDI6XFx0XFx0XFx0aWYgKCEodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcXG4gMzAzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDQ6XFx0XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCBcXHUwMDNjIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCB8fFxcbiAzMDU6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgLSB0aW5mb19sYXN0LVxcdTAwM2V2aWQpICE9XFxuIDMwNjpcXHRcXHRcXHQgICAgKHRpbmZvX2N1cnItXFx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQpKVxcbiAzMDc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDMwODpcXHRcXHRcXHR0ID0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQ7XFxuIDMwOTpcXHRcXHRcXHRmb3IgKHYgPSB0aW5mb19sYXN0LVxcdTAwM2V2aWQ7IHYgXFx1MDAzYz0gdGluZm9fY3Vyci1cXHUwMDNldmlkOyB2KyspIHtcXG4gMzEwOlxcdFxcdFxcdFxcdGJvb2wgY3Vycl9jaGFuZ2UgPSBmYWxzZTtcXG4gMzExOlxcdFxcbiAzMTI6XFx0XFx0XFx0XFx0ZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYsIHQsIFxcdTAwMjZjdXJyX2NoYW5nZSk7XFxuIDMxMzpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMTQ6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDMxNTpcXHRcXHRcXHRcXHR0Kys7XFxuIDMxNjpcXHRcXG4gMzE3OlxcdFxcdFxcdFxcdGlmIChjdXJyX2NoYW5nZSlcXG4gMzE4OlxcdFxcdFxcdFxcdFxcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XFxuIDMxOTpcXHRcXHRcXHRcXHRfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShwLCBcXHUwMDI2dl9zdGFydCwgXFx1MDAyNnZfZW5kLCB2LFxcbiAzMjA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgY3Vycl9jaGFuZ2UpO1xcbiAzMjE6XFx0XFx0XFx0fVxcbiAzMjI6XFx0XFx0XFx0aWYgKHZfc3RhcnQgXFx1MDAyNlxcdTAwMjYgdl9lbmQpXFxuIDMyMzpcXHRcXHRcXHRcXHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cXHUwMDNldmlkLCB2X2VuZC1cXHUwMDNldmlkLFxcbiAzMjQ6XFx0XFx0XFx0XFx0XFx0ICAgICAgIFJUTV9ORVdWTEFOKTtcXG4gMzI1OlxcdFxcdFxcdGlmIChlcnIpXFxuIDMyNjpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAzMjc6XFx0XFxuIDMyODpcXHRcXHRcXHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMzI5OlxcdFxcdFxcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozODowOS45ODU2MDc5NjJaIiwiU2VxIjo0MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTI4NjgwMjU3OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRGVidWdnaW5nIGEgU3VidGxlIExvb3AgQ29uZGl0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgaWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIHNpbXBseSB3b3VsZG4ndCBydW4uIGB2YCBpcyBhbiBgaW50YCwgc28gYSBzaW1wbGUgY29tcGFyaXNvbiBzaG91bGQgcHJldmVudCB0aGUgbG9vcCBmcm9tIHN0YXJ0aW5nIGlmIHRoYXQncyB0aGUgY2FzZS4gSXQgd291bGRuJ3Qgd2FpdCBlaXRoZXIuXG5cblRoZW4gSSByZW1lbWJlcmVkIHRoZXJlIHdhcyBhIGJ1ZyByZWxhdGVkIHRvIGEgc3VidHJhY3Rpb24uIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiB0aGlzIGNvbXBhcmlzb246IGAodGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZClgIHZlcnN1cyBgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKWAuIEkgbmVlZCB0byB0aGluayBjYXJlZnVsbHkgYWJvdXQgdGhlIHR5cGVzIGludm9sdmVkLlxuXG5gdmlkYCBpcyBhIGB1MTZgIGFuZCBgdHVuaWRgIGlzIGEgYHUzMmAuIFRoaXMgZGlmZmVyZW5jZSBpcyB0aGUga2V5ISAgV2hlbiBzdWJ0cmFjdGluZyBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGZyb20gYHRpbmZvX2N1cnItXHUwMDNldmlkYCwgdGhlIGB1MTZgIHR5cGVzIGdldCBwcm9tb3RlZCB0byBgaW50YCBiZWNhdXNlIGB1MTZgIHZhbHVlcyBjYW4gYmUgc3RvcmVkIGluIGFuIGBpbnRgIHNhZmVseSwgYWxsb3dpbmcgZm9yIG5lZ2F0aXZlIHJlc3VsdHMuIEJ1dCBgdGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgIGlzIGEgYHUzMiAtIHUzMmAgb3BlcmF0aW9uLCB3aGljaCByZXN1bHRzIGluIGFuIHVuc2lnbmVkIGB1MzJgLlxuXG5Tbywgd2UgaGF2ZSBhIG5lZ2F0aXZlIGBpbnRgIGJlaW5nIGNvbXBhcmVkIHRvIGFuIHVuc2lnbmVkIGB1MzJgLiAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCB0aGUgYGludGAgdG8gYSBgdTMyYCBmb3IgdGhlIGNvbXBhcmlzb24uIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBzdWJ0cmFjdGlvbiB3aWxsIHJlc3VsdCBpbiBhIG5lZ2F0aXZlIGBpbnRgIHdoaWNoLCB3aGVuIGNvbnZlcnRlZCB0byBhIGB1MzJgLCBiZWNvbWVzIGEgKnZlcnkqIGxhcmdlIHVuc2lnbmVkIG51bWJlciEgSWYgdGhlIGB0dW5pZGAgdmFsdWVzIGFsc28gd3JhcCBhcm91bmQgaW4gYSBzaW1pbGFyIHdheSwgdGhlIGB1MzJgIGNvbXBhcmlzb24gY2FuIHN0aWxsIHBhc3MgYmVjYXVzZSB0aGUgbGFyZ2UgYHUzMmAgdmFsdWUgY2FuIGVxdWFsIHRoZSByZXN1bHQgb2YgYCh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgLlxuXG5UaGF0IG1lYW5zIHRoZSBsb29wIHRoZW4gZXhlY3V0ZXMuIEJ1dCB3YWl0Li4uIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCB0aGUgbG9vcCBjb25kaXRpb24gYHYgXHUwMDNjPSB0aW5mb19jdXJyLVx1MDAzZXZpZGAgd291bGQgYmUgaW5pdGlhbGx5IGZhbHNlLCBzbyB0aGUgbG9vcCB3b3VsZCBleGVjdXRlIHplcm8gdGltZXMhIFRoYXQgZG9lc24ndCBtYWtlIHNlbnNlIGFzIGEgYnVnLlxuXG5JZiB0aGUgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCB3aGVyZSdzIHRoZSBidWc/XG5cbkkgbmVlZCB0byByZS1leGFtaW5lIG15IGFzc3VtcHRpb24gb2Ygd2hlcmUgdGhlIGJ1ZyBsaWVzLlxuXG5PaCEgSSdtIGJhY2sgb24gdHJhY2suXG5cbklmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCBhbmQgdGhlIGxvb3AgaXMgc3RydWN0dXJlZCBhcyBgZm9yICh2ID0gdGluZm9fbGFzdC1cdTAwM2V2aWQ7IHYgXHUwMDNjPSB0aW5mb19jdXJyLVx1MDAzZXZpZDsgdisrKWAsIHRoZSBsb29wIGV4ZWN1dGVzLiBJZiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgdGhlbiB0aGUgbG9vcCBpcyBlbnRlcmVkIG9ubHkgaWYgdGhlIHVuc2lnbmVkIHZhbHVlIGlzIHN1ZmZpY2llbnRseSBsYXJnZSwgbWVhbmluZyB0aGF0IGB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGZhbHNlIG9uIHRoZSBmaXJzdCBleGVjdXRpb24sIHNvIHRoZSBsb29wIGV4ZWN1dGVzIDAgdGltZXMuIFRoZSB0eXBlcyBhcmUgY3JpdGljYWwgaGVyZS4gQW5kIGluIHRoaXMgY2FzZSBgdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGEgYHUxNmAgYnV0IGB2YCBpcyBhbiBgaW50YC5cblxuU28sIGxldCBtZSBjaGVjayB0aGUgdHlwZXMgb2YgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBhbmQgYHRpbmZvX2xhc3QtXHUwMDNldmlkYCB0byBlbGltaW5hdGUgYWxsIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wIGJ1Z3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3ODc5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTI5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzg6MjIuODUzNjM3NzI0WiIsIlNlcSI6NDQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTMyNzA3NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgdnR1bm5lbF9pbmZvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTgwOT1zdGF0aWMgaW50IGJyX2Fmc3BlYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy04MTctXFx0c3RydWN0IG5sYXR0ciAqYXR0cjtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo4MTg6XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyB0aW5mb19sYXN0ID0ge307XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODE5OlxcdHN0cnVjdCB2dHVubmVsX2luZm8gdGluZm9fY3VyciA9IHt9O1xcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTgyMC1cXHRpbnQgZXJyID0gMCwgcmVtO1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jPTIyMj1pbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzoyMjM6XFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTIyNC17XFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM9Mjg2PWludCBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yODctXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6Mjg4OlxcdFxcdFxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2N1cnIsXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI4OTpcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19sYXN0LFxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yOTAtXFx0XFx0XFx0XFx0Ym9vbCAqY2hhbmdlZClcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0yOTYtXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjI5NzpcXHRcXHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmMtMjk4LVxcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMyNy1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzI4OlxcdFxcdG1lbXNldCh0aW5mb19sYXN0LCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYzozMjk6XFx0XFx0bWVtc2V0KHRpbmZvX2N1cnIsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzMC1cXHR9IGVsc2Uge1xcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jLTMzNy1cXHRcXHRicl92bGFuX25vdGlmeShiciwgcCwgdGluZm9fY3Vyci1cXHUwMDNldmlkLCAwLCBSVE1fTkVXVkxBTik7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jOjMzODpcXHRcXHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmM6MzM5OlxcdFxcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcbm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuYy0zNDAtXFx0fVxcbi0tXFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTExLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoxMjpzdHJ1Y3QgdnR1bm5lbF9pbmZvIHtcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmgtMTMtXFx0dTMyXFx0dHVuaWQ7XFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg9MTk9aW50IGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm8oc3RydWN0IG5sYXR0ciAqYXR0cixcXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MjA6XFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMS1pbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yMy1cXHRcXHRcXHRcXHRpbnQgY21kLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyNDpcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19jdXJyLFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaDoyNTpcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19sYXN0LFxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0yNi1cXHRcXHRcXHRcXHRib29sICpjaGFuZ2VkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzg6MjIuOTAyOTY5Njk5WiIsIlNlcSI6NDUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2NjIwOTE5MzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBUdW5uZWwgRGV0YWlscyoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IGdyYW51bGFyLiBUbyB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgaW4gdGhlIGJyaWRnaW5nIGNvZGUgcmVsYXRlZCB0byB0dW5uZWxzLCBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhlIGRhdGEgaXMgYmVpbmcgc3RydWN0dXJlZC4gVGhlIG5hdHVyYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHRoYXQgaXMgdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB2dHVubmVsX2luZm9gLiBTbywgbGV0J3MgcHVsbCB1cCBgbmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oYCBhbmQgdGFrZSBhIGxvb2suIEknbGwgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB3aGF0IGZpZWxkcyBhcmUgZGVmaW5lZCwgd2hhdCB0aGV5IHJlcHJlc2VudCwgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgb3ZlcmFsbCBicmlkZ2luZyBhbmQgdHVubmVsaW5nIGFyY2hpdGVjdHVyZS4gVGhpcyBzaG91bGQgZ2l2ZSBtZSB0aGUgZm91bmRhdGlvbiBJIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBhY3R1YWwgcGFja2V0IHByb2Nlc3NpbmcgbG9naWMuIEknbSBleHBlY3RpbmcgdGhpcyBzdHJ1Y3QgdG8gaG9sZCB0aGUgcmVsZXZhbnQgdHVubmVsIGlkZW50aWZpZXJzLCBwZXJoYXBzIHNvbWUgZW5jYXBzdWxhdGlvbiBkZXRhaWxzLCBhbmQgZGVmaW5pdGVseSBzb21lIHNvcnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgdHVubmVsLiBMZXQncyBzZWUgd2hhdCdzIGluIHRoZXJlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMTc4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzg6MzEuNTY1MDY0NDU1WiIsIlNlcSI6NDYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICpcXHRCcmlkZ2UgcGVyIHZsYW4gdHVubmVsc1xcbiAgIDQ6XFx0ICpcXG4gICA1OlxcdCAqXFx0QXV0aG9yczpcXG4gICA2OlxcdCAqXFx0Um9vcGEgUHJhYmh1XFx0XFx0XFx1MDAzY3Jvb3BhQGN1bXVsdXNuZXR3b3Jrcy5jb21cXHUwMDNlXFxuICAgNzpcXHQgKi9cXG4gICA4OlxcdFxcbiAgIDk6XFx0I2lmbmRlZiBfQlJfUFJJVkFURV9UVU5ORUxfSFxcbiAgMTA6XFx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxcbiAgMTE6XFx0XFxuICAxMjpcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvIHtcXG4gIDEzOlxcdFxcdHUzMlxcdHR1bmlkO1xcbiAgMTQ6XFx0XFx0dTE2XFx0dmlkO1xcbiAgMTU6XFx0XFx0dTE2XFx0ZmxhZ3M7XFxuICAxNjpcXHR9O1xcbiAgMTc6XFx0XFxuICAxODpcXHQvKiBicl9uZXRsaW5rX3R1bm5lbC5jICovXFxuICAxOTpcXHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcbiAgMjA6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm8pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozODozMS41NjUxNDczNTVaIiwiU2VxIjo0NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjMxMDc0NTQ0NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgYW5kIEl0cyBGaXgqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBpcyB0aGF0IGB2aWRgIGlzIGEgYHUxNmAuIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZWlyIGRpZmZlcmVuY2UgaXMgbmVnYXRpdmUsIHJpZ2h0PyBUaGUgaXNzdWUgaXMsIHRoaXMgc3VidHJhY3Rpb24gYHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIGV2YWx1YXRlZCBhcyBhbiBgaW50YCBiZWNhdXNlIG9mIHRoZSB1c3VhbCBpbnRlZ2VyIHByb21vdGlvbiBydWxlcy4gSWYsIHNheSwgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIDEwLCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIHdpbGwgYmUgLTEwLlxuXG5Ob3csIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkYCBhbmQgYHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgIGFyZSBib3RoIGB1MzJgLiBUaGlzIGRpZmZlcmVuY2UsIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAsIGlzIGV2YWx1YXRlZCBhcyBgdTMyYC4gU28sIGhlcmUncyB3aGVyZSB0aGUgcG90ZW50aWFsIHByb2JsZW0gbGllczogYC0xMGAgKGFzIGFuIGBpbnRgKSBnZXRzIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgdmVyeSBsYXJnZSBgdTMyYCwgc3BlY2lmaWNhbGx5IDQyOTQ5NjcyODYuIE5vdyB0aGUgY29tcGFyaXNvbiBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9ICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgIGNvdWxkIGJlY29tZSBGQUxTRS5cblxuSWYgdGhhdCBjb21wYXJpc29uIGlzIGZhbHNlLCB0aGUgY29kZSBwcm9jZWVkcyB0byBsb29wLiAgSG93ZXZlciwgdGhlIGxvb3AgaXRzZWxmIGxvb2tzIHN1c3BpY2lvdXMuIElmIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgMTAgYW5kIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgMCwgdGhlIGxvb3AgY29uZGl0aW9uIGB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWRgIHdvdWxkIGJlIGZhbHNlIGZyb20gdGhlIHN0YXJ0LiAgVGhlIGxvb3Agd29uJ3QgZXhlY3V0ZS4gVGhlIGNvZGUgc2tpcHMgdGhlIHJhbmdlIHByb2Nlc3NpbmcgYW5kIHRoZSBgYnJfdmxhbl9ub3RpZnlgIGNhbGwgYW5kIGp1c3QgcmV0dXJucyBhbiBlcnJvciBjb2RlIDAuIEVzc2VudGlhbGx5LCB0aGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLCB3aGljaCBzZWVtcyBsaWtlIGEgYnVnLiBJZiB0aGUgbG9vcCAqZGlkKiBleGVjdXRlLCB0aGUgY29tcGFyaXNvbiBpbiB0aGUgbG9vcCwgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBsb29wIGZyb20gaXRlcmF0aW5nIGluIGFuIG91dC1vZi1ib3VuZHMgc2NlbmFyaW8uXG5cbkkgd2FzIHRyeWluZyB0byBjb25zaWRlciB3aGF0IGhhcHBlbnMgaWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIDB4RkZGRi4gVGhhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZSBgMCAtIDY1NTM1ID0gLTY1NTM1YC5cblxuTm93LCBsb29raW5nIGF0IHRoZSBmaXgsIGl0IGludHJvZHVjZXMgYW4gZWFybHkgcmV0dXJuIHdpdGggYC1FSU5WQUxgIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLiBCZWZvcmUgdGhlIHBhdGNoLCB0aGUgY29kZSB3b3VsZCBzaW1wbHkgc2tpcCB0aGUgbG9vcCBhbmQgcmV0dXJuIDAgKHN1Y2Nlc3MpLiBUaGlzIGVhcmx5IHJldHVybiBzZWVtcyByaWdodCBiZWNhdXNlIGl0IHNpZ25hbHMgdGhlIGVycm9yLiBSZXR1cm5pbmcgMCB3aGVuIHRoZSByYW5nZSBpcyBpbnZhbGlkIGNvdWxkIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvci4gVGhlIHByb2dyYW0gY2FuIGxlYXZlIGB0aW5mb19sYXN0YCBpbiBhbiB1bmRlZmluZWQgc3RhdGUuIFRoZW4sIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBgdGluZm9fbGFzdGAgYW5kIGB0aW5mb19jdXJyYCBhcmUgemVyb2VkIG91dCBhbnl3YXkuXG5cblRoZSBrZXkgY2hhbmdlLCB0aGUgcGF0Y2gsIGp1c3QgYmxvY2tzIHRoZSBjb2RlIGZyb20gZG9pbmcgYW55dGhpbmcgd2hlbiB0aGUgbmV3IGB2aWRgIGlzIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZS4gVGhlIGNvZGUgZGlkIG5vdGhpbmcgYW55d2F5LCBidXQgbm93IGl0IHJldHVybnMgYW4gZXJyb3IuIFRoaXMgYXZvaWRzIHRoZSBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb24gaXNzdWUgd2hlcmUgYSBuZWdhdGl2ZSBgaW50YCBkaWZmZXJlbmNlIGJlY29tZXMgYSBsYXJnZSBgdTMyYCB2YWx1ZSwgcG90ZW50aWFsbHkgYnlwYXNzaW5nIHRoZSBpbmVxdWFsaXR5IGNoZWNrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDY5MiwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNzYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozODo1NC42NzI2MDU1MzFaIiwiU2VxIjo0OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODk5OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI5OCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI5ODpcXHRcXHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcXG4gMjk5OlxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xcbiAzMDA6XFx0XFx0XFx0aW50IHQsIHY7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIDMwMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcdFxcdGlmICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgXFx1MDAzYyB0aW5mb19sYXN0LVxcdTAwM2V2aWQgfHxcXG4gMzA1OlxcdFxcdFxcdCAgICAodGluZm9fY3Vyci1cXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldmlkKSAhPVxcbiAzMDY6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gMzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDg6XFx0XFx0XFx0dCA9IHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkO1xcbiAzMDk6XFx0XFx0XFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHRpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDMxMDpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbiAzMTM6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMzE0OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAzMTU6XFx0XFx0XFx0XFx0dCsrO1xcbiAzMTY6XFx0XFxuIDMxNzpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM4OjU0LjY3MjY5Njk4MVoiLCJTZXEiOjQ5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzk2NTQzNTk5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIElzc3VlcyB3aXRoIHRoZSBUdW5uZWwgSUQgYW5kIFZMQU4gSUQgQ29tcGFyaXNvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkgSSBzZWUgYHZgIGlzIGFuIGludGVnZXIsIGFuZCBpdCdzIGJlaW5nIGNvbXBhcmVkIHRvIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAsIHdoaWNoIGlzIGEgYHUxNmAuIFJpZ2h0IGF3YXksIHRoZSBjb21wYXJpc29uIGlzIGdvaW5nIHRvIHByb21vdGUgdGhlIGB1MTZgIHRvIGFuIGBpbnRgLiBOb3csIGlmIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgZ3JlYXRlciB0aGFuIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAsIHRoZSBsb29wIGNvbmRpdGlvbiBgdiBcdTAwM2M9IHRpbmZvX2N1cnItXHUwMDNldmlkYCBiZWNvbWVzIGZhbHNlIGZyb20gdGhlIGdldC1nby4gTm8gZXhlY3V0aW9uLiBObyBiaWcgZGVhbCwgcmlnaHQ/XG5cbkJ1dCB3YWl0LiBUaGlzIG1lYW5zIHRoZSBsb29wICpkb2Vzbid0KiBleGVjdXRlLiBJZiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgZXZhbHVhdGVkIGFzIGFuIGBpbnRgLCBhbmQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCBpcyBhIGB1MzJgLCBhbmQgaWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgaXQgcmV0dXJucyAwLiBSZXR1cm5pbmcgMCB1c3VhbGx5IGluZGljYXRlcyBzdWNjZXNzLCB3aGljaCBtZWFucyB0aGUgY29kZSBpcyAqc3VwcG9zZWQqIHRvIHN1Y2NlZWQuIEJ1dCBpdCBkaWRuJ3QgKmRvKiBhbnl0aGluZy4gSXQncyBqdXN0IGNvbnN1bWVkIGBSQU5HRV9CRUdJTmAgYW5kIGBSQU5HRV9FTkRgIHdpdGhvdXQgYWRkaW5nIHRoZSB0dW5uZWxzLCB0aGVuIGl0IGNsZWFycyBgdGluZm9fbGFzdGAgYW5kIGB0aW5mb19jdXJyYC4gVGhpcyBjb3VsZCBiZSBjb25zaWRlcmVkIGEgc2lsZW50IGZhaWx1cmUgdG8gYWRkIGEgcmFuZ2UhIEkgdGhpbmsgdGhpcyBpcyBhIHBvdGVudGlhbCBidWcuIEl0J3Mgbm90IGEgY3Jhc2gsIGJ1dCBpdCdzIG5vdCB3b3JraW5nIGFzIGludGVuZGVkLlxuXG5CdXQgaG9sZCBvbiwgbGV0J3MgZXhwbG9yZSBhbm90aGVyIHBvc3NpYmlsaXR5LiBXaGF0IGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgYXJlIHN1Y2ggdGhhdCB0aGUgZGlmZmVyZW5jZSBpcyBwb3NpdGl2ZSBhcyBhbiBpbnRlZ2VyLCBidXQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCBpcyBuZWdhdGl2ZT8gSWYgYHRpbmZvX2N1cnItXHUwMDNldHVuaWRgIGlzIHNtYWxsZXIgdGhhbiBgdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAsIHRoZW4gdGhlIGB1MzJgIHN1YnRyYWN0aW9uIGdpdmVzIHVzIGEgaHVnZSB2YWx1ZSwgYmVjYXVzZSBpdCB1bmRlcmZsb3dzLiBJbiB0aGlzIGNhc2UsIGNvbXBhcmluZyBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpYCB0byBgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKWAgd291bGQgYmUgdHJ1ZSBhbmQgaXQgcmV0dXJucyBgLUVJTlZBTGAuIE9rYXksIHNvIHRoYXQncyBoYW5kbGVkIGNvcnJlY3RseS4gR29vZC5cblxuTm93LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIHVuZGVmaW5lZCBiZWhhdmlvci4gTGV0J3Mgc2VlLi4uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBpcyBgaW50YCwgYW5kIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAgaXMgYHUzMmAuIEluIEMsIHRoZSBgaW50YCBnZXRzIGNvbnZlcnRlZCB0byBgdTMyYCBkdXJpbmcgdGhlIGNvbXBhcmlzb24uIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBsZWZ0IHNpZGUgYmVjb21lcyBhIG5lZ2F0aXZlIGBpbnRgLCB3aGljaCBiZWNvbWVzIGEgdmVyeSBsYXJnZSBgdTMyYCBhZnRlciBjb252ZXJzaW9uLiBCZWNhdXNlIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgYXJlIGB1MTZgcywgdGhlIG1heGltdW0gZGlmZmVyZW5jZSBpcyBgMCAtIDY1NTM1ID0gLTY1NTM1YC4gQ29udmVydGVkIHRvIGB1MzJgLCB0aGlzIGlzIGA0Mjk0OTAxNzYxYC4gSWYgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCAqYWxzbyogZXF1YWxzIGA0Mjk0OTAxNzYxYCwgdGhlIGxvb3AgKnN0aWxsKiBkb2Vzbid0IHJ1bi5cblxuSXMgdGhlcmUgYSBtZW1vcnkgbGVhayBoZXJlPyBOb3BlLiBBbnkgb3V0LW9mLWJvdW5kcyBhY2Nlc3M/IERvZXNuJ3QgbG9vayBsaWtlIGl0LiBTbywgbm8gVUIsIG5vIG1lbW9yeSBwcm9ibGVtcy4uLiBidXQgdGhhdCBzaWxlbnQgZmFpbHVyZSBzdGlsbCBidWdzIG1lLiBJIG5lZWQgdG8gYmUgc3VyZS4gSSdtIGdvaW5nIHRvIGxvb2sgbW9yZSBjbG9zZWx5IGF0IHRoZSBgYnJfcHJvY2Vzc192bGFuX2luZm9gIGZ1bmN0aW9uIGluIGBuZXQvYnJpZGdlL2JyX25ldGxpbmsuY2AgYXMgdGhpcyBzZWVtcyBsaWtlIHRoZSBtb3N0IGxpa2VseSBwbGFjZSBmb3IgdGhpcyB0byBoYXZlIGtub2NrLW9uIGVmZmVjdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMTUyLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzk6MDguNjM4MTM1ODZaIiwiU2VxIjo1MCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NzUyNzY1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJyX3Byb2Nlc3Nfdmxhbl9pbmZvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTY5OD1zdGF0aWMgaW50IGJyX3ZsYW5faW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsXFxuLS1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYy03MzgtXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6NzM5OmludCBicl9wcm9jZXNzX3ZsYW5faW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzQwLVxcdFxcdFxcdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM9ODA5PXN0YXRpYyBpbnQgYnJfYWZzcGVjKHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTg0MS1cXHRcXHRcXHR2aW5mb19jdXJyID0gbmxhX2RhdGEoYXR0cik7XFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmM6ODQyOlxcdFxcdFxcdGVyciA9IGJyX3Byb2Nlc3Nfdmxhbl9pbmZvKGJyLCBwLCBjbWQsIHZpbmZvX2N1cnIsXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtODQzLVxcdFxcdFxcdFxcdFxcdFxcdCAgIFxcdTAwMjZ2aW5mb19sYXN0LCBjaGFuZ2VkLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDozOTowOC42ODM4OTUzNDVaIiwiU2VxIjo1MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTYzNjgzNTU0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCBmdW5jdGlvbi5cblxuKipBbmFseXppbmcgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCoqXG5cbkFscmlnaHQsIHNvIEknbSBsb29raW5nIGF0IGBicl9wcm9jZXNzX3ZsYW5faW5mb2AgaGVyZS4gSW1tZWRpYXRlbHksIG15IGV4cGVydCBleWUgc2NhbnMgZm9yIGl0cyBwcmltYXJ5IHB1cnBvc2Ug4oCTIGl0IHNlZW1zIHRvIGJlIGhhbmRsaW5nIFZMQU4tcmVsYXRlZCBjb25maWd1cmF0aW9ucyB3aXRoaW4gYSBicmlkZ2UgY29udGV4dCwgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBJJ2QgZXhwZWN0IGl0IHRvIGRlYWwgd2l0aCB0YWdnaW5nL3VudGFnZ2luZywgZm9yd2FyZGluZyBkZWNpc2lvbnMgYmFzZWQgb24gVkxBTiBJRHMsIGFuZCBwb3RlbnRpYWxseSBWTEFOIHRydW5raW5nIGNvbmZpZ3VyYXRpb25zLiBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgc29tZSBvZiB0aGUgbGlrZWx5IGRhdGEgc3RydWN0dXJlcyBpdCdzIGludGVyYWN0aW5nIHdpdGg6IHByb2JhYmx5IGJyaWRnZSBwb3J0IHN0cnVjdHVyZXMsIFZMQU4gbWVtYmVyc2hpcCB0YWJsZXMgKG9yIGVxdWl2YWxlbnQpLCBhbmQgbWF5YmUgc29tZSBsb3ctbGV2ZWwgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlcy5cblxuSSB3YW50IHRvIGtub3cgaG93IGVmZmljaWVudCBpdCBpcyBhdCBsb29raW5nIHVwIHZsYW4gaW5mb3JtYXRpb24uIElzIGl0IGEgaGFzaCB0YWJsZT8gSXMgaXQgYW4gYXJyYXk/IEhvdyBpcyBpdCBvcmdhbml6ZWQ/XG5cbkZyb20gaGVyZSwgSSdsbCBxdWlja2x5IGxvb2sgZm9yIGFyZWFzIG9mIHBvdGVudGlhbCBjb21wbGV4aXR5LiBBcmUgdGhlcmUgYW55IGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRoYXQgbWlnaHQgaW5kaWNhdGUgZGlmZmVyZW50IFZMQU4gbW9kZXMgKGUuZy4sIGFjY2VzcywgdHJ1bmssIGh5YnJpZCk/IERvZXMgaXQgaGFuZGxlIFZMQU4gdHJhbnNsYXRpb24gb3IgUS1pbi1RPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgYXJlYXMgd2hlcmUgbG9ja2luZyBtaWdodCBiZSBuZWVkZWQgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgYWNyb3NzIG11bHRpcGxlIHRocmVhZHMgb3IgYnJpZGdlIHBvcnRzP1xuXG5JJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gc2VlaW5nIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBuZXR3b3JrIGRldmljZSBkcml2ZXJzLiBEb2VzIGl0IHVzZSBzdGFuZGFyZCBuZXRsaW5rIG1lc3NhZ2VzLCBvciBpcyBpdCByZWFjaGluZyBkb3duIGludG8gdGhlIGRyaXZlcidzIGludGVybmFscz8gVGhhdCBjYW4gc29tZXRpbWVzIGJlIGEgc291cmNlIG9mIHBvcnRhYmlsaXR5IGlzc3Vlcy4gSSdsbCBhbHNvIGNoZWNrIGZvciBlcnJvciBoYW5kbGluZyDigJMgd2hhdCBoYXBwZW5zIGlmIGEgVkxBTiBJRCBpcyBpbnZhbGlkIG9yIGEgcGFydGljdWxhciBvcGVyYXRpb24gZmFpbHM/IFJvYnVzdCBlcnJvciBoYW5kbGluZyBpcyBrZXksIGVzcGVjaWFsbHkgaW4gYSBuZXR3b3JrIGZ1bmN0aW9uLlxuXG5Fc3NlbnRpYWxseSwgSSdtIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGJlIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZSwgYW5kIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIGl0IHRob3JvdWdobHkgdG8gZW5zdXJlIHRoZSBicmlkZ2UncyBWTEFOIGZ1bmN0aW9uYWxpdHkgaXMgcGVyZm9ybWluZyBvcHRpbWFsbHksIHNlY3VyZWx5LCBhbmQgaW4gbGluZSB3aXRoIG15IG92ZXJhbGwgbmV0d29yayBhcmNoaXRlY3R1cmUgZGVzaWduLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTExMSwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM5OjE4LjMyMDczNDk0MVoiLCJTZXEiOjUyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE3OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNzM5LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNzM5OlxcdGludCBicl9wcm9jZXNzX3ZsYW5faW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuIDc0MDpcXHRcXHRcXHRcXHQgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGNtZCxcXG4gNzQxOlxcdFxcdFxcdFxcdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqdmluZm9fY3VycixcXG4gNzQyOlxcdFxcdFxcdFxcdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqKnZpbmZvX2xhc3QsXFxuIDc0MzpcXHRcXHRcXHRcXHQgYm9vbCAqY2hhbmdlZCxcXG4gNzQ0OlxcdFxcdFxcdFxcdCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIDc0NTpcXHR7XFxuIDc0NjpcXHRcXHRpbnQgZXJyLCBydG1fY21kO1xcbiA3NDc6XFx0XFxuIDc0ODpcXHRcXHRpZiAoIWJyX3ZsYW5fdmFsaWRfaWQodmluZm9fY3Vyci1cXHUwMDNldmlkLCBleHRhY2spKVxcbiA3NDk6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDc1MDpcXHRcXG4gNzUxOlxcdFxcdC8qIG5lZWRlZCBmb3Igdmxhbi1vbmx5IE5FV1ZMQU4vREVMVkxBTiBub3RpZmljYXRpb25zICovXFxuIDc1MjpcXHRcXHRydG1fY21kID0gYnJfYWZzcGVjX2NtZF90b19ydG0oY21kKTtcXG4gNzUzOlxcdFxcbiA3NTQ6XFx0XFx0aWYgKHZpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiA3NTU6XFx0XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbiA3NTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDc1NzpcXHRcXHRcXHQqdmluZm9fbGFzdCA9IHZpbmZvX2N1cnI7XFxuIDc1ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gNzU5OlxcdFxcdH1cXG4gNzYwOlxcdFxcbiA3NjE6XFx0XFx0aWYgKCp2aW5mb19sYXN0KSB7XFxuIDc2MjpcXHRcXHRcXHRzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyB0bXBfdmluZm87XFxuIDc2MzpcXHRcXHRcXHRpbnQgdiwgdl9jaGFuZ2Vfc3RhcnQgPSAwO1xcbiA3NjQ6XFx0XFxuIDc2NTpcXHRcXHRcXHRpZiAoIWJyX3ZsYW5fdmFsaWRfcmFuZ2UodmluZm9fY3VyciwgKnZpbmZvX2xhc3QsIGV4dGFjaykpXFxuIDc2NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNzY3OlxcdFxcbiA3Njg6XFx0XFx0XFx0bWVtY3B5KFxcdTAwMjZ0bXBfdmluZm8sICp2aW5mb19sYXN0LFxcbiA3Njk6XFx0XFx0XFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbykpO1xcbiA3NzA6XFx0XFx0XFx0Zm9yICh2ID0gKCp2aW5mb19sYXN0KS1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHZpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDc3MTpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDc3MjpcXHRcXG4gNzczOlxcdFxcdFxcdFxcdHRtcF92aW5mby52aWQgPSB2O1xcbiA3NzQ6XFx0XFx0XFx0XFx0ZXJyID0gYnJfdmxhbl9pbmZvKGJyLCBwLCBjbWQsIFxcdTAwMjZ0bXBfdmluZm8sIFxcdTAwMjZjdXJyX2NoYW5nZSxcXG4gNzc1OlxcdFxcdFxcdFxcdFxcdFxcdCAgIGV4dGFjayk7XFxuIDc3NjpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiA3Nzc6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDc3ODpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpIHtcXG4gNzc5OlxcdFxcdFxcdFxcdFxcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XFxuIDc4MDpcXHRcXHRcXHRcXHRcXHRpZiAoIXZfY2hhbmdlX3N0YXJ0KVxcbiA3ODE6XFx0XFx0XFx0XFx0XFx0XFx0dl9jaGFuZ2Vfc3RhcnQgPSB2O1xcbiA3ODI6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4gNzgzOlxcdFxcdFxcdFxcdFxcdC8qIG5vdGhpbmcgdG8gbm90aWZ5IHlldCAqL1xcbiA3ODQ6XFx0XFx0XFx0XFx0XFx0aWYgKCF2X2NoYW5nZV9zdGFydClcXG4gNzg1OlxcdFxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiA3ODY6XFx0XFx0XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfY2hhbmdlX3N0YXJ0LFxcbiA3ODc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIHYgLSAxLCBydG1fY21kKTtcXG4gNzg4OlxcdFxcdFxcdFxcdFxcdHZfY2hhbmdlX3N0YXJ0ID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzk6MTguMzIwODY5MzExWiIsIlNlcSI6NTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI3NzI2MDc4NzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBWTEFOIFZhbGlkYXRpb24qKlxuXG5Pa2F5LCBJJ20gdHJhY2luZyB0aHJvdWdoIHRoaXMgYGJyX3Byb2Nlc3Nfdmxhbl9pbmZvYCBmdW5jdGlvbiBub3cuIEl0J3MgY2FsbGluZyBgYnJfdmxhbl92YWxpZF9yYW5nZWAsIGFuZCB0aGF0IGltbWVkaWF0ZWx5IGZsYWdzIG15IGludGVyZXN0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIFZMQU4gcmFuZ2UgaXMgYmVpbmcgdmFsaWRhdGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIGZ1bmN0aW9uLiBMZXQncyBkaWcgaW50byBgYnJfdmxhbl92YWxpZF9yYW5nZWAgYW5kIHNlZSB3aGF0J3MgZ29pbmcgb24gdGhlcmUuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCByYW5nZSB2YWxpZGF0aW9uIGlzIGJlaW5nIGNvcnJlY3RseSBpbXBsZW1lbnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjYzNzAsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjM5OjQ2LjA0Njk1MTcyWiIsIlNlcSI6NTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzA4MDkyNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl92bGFuX3ZhbGlkX3JhbmdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTczOT1pbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzU0LVxcdGlmICh2aW5mb19jdXJyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NTU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2NC1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NjU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6Mzk6NDYuMDk0MDM5MTU1WiIsIlNlcSI6NTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI1Njc5NzI3OTg4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipIdW50aW5nIERvd24gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb3IgdXNhZ2Ugb2YgYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgLiBJbW1lZGlhdGVseSwgbXkgbWVudGFsIHByb2Nlc3MganVtcHMgdG8gdGhpbmtpbmcgYWJvdXQgd2hlcmUgSSB3b3VsZCB0eXBpY2FsbHkgZmluZCBzdWNoIGEgdmFyaWFibGUuIEdpdmVuIHRoZSBuYW1lLCBhbmQgbXkgZXhwZXJpZW5jZSB3aXRoIGJyaWRnaW5nIGFuZCBWTEFOcywgSSdtIGV4cGVjdGluZyB0aGlzIHRvIGJlIHNvbWV0aGluZyByZWxhdGVkIHRvIHZhbGlkYXRpbmcgVkxBTiBJRHMgd2l0aGluIGEgYnJpZGdlIGNvbnRleHQuIEl0IGNvdWxkIGJlIGEgbWFjcm8sIGEgY29uc3RhbnQsIGEgZnVuY3Rpb24sIG9yIGV2ZW4gYSBnbG9iYWwgdmFyaWFibGUsIHByb2JhYmx5IGRlZmluZWQgd2l0aGluIGEgaGVhZGVyIGZpbGUgb3IgcGVyaGFwcyByZWxhdGVkIHRvIHRoZSBicmlkZ2UgZHJpdmVyIGNvZGUgaXRzZWxmLiBNeSBpbml0aWFsIHNlYXJjaCB3b3VsZCBsaWtlbHkgaW52b2x2ZSBncmVwcGluZyB0aHJvdWdoIHRoZSByZWxldmFudCBjb2RlYmFzZSwgc3RhcnRpbmcgd2l0aCB0aGUgYnJpZGdlIHV0aWxpdGllcywgbmV0d29ya2luZyBsaWJyYXJpZXMsIG9yIGFueSBrZXJuZWwgbW9kdWxlcyByZWxhdGVkIHRvIGJyaWRnaW5nLiBJJ2QgYmUgbG9va2luZyBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIHRoYXQgc2VlbSByZWxldmFudCwgYW5kIEknZCBleHBhbmQgZnJvbSB0aGVyZS4gVGhpcyB3aWxsIHByb2JhYmx5IGxlYWQgdG8gcmVhZGluZyBzb21lIGRvY3VtZW50YXRpb24gYW5kIGxvb2tpbmcgYXQgY29tbW9uIHBsYWNlcyBmb3IgVkxBTiBjb25maWd1cmF0aW9uIGNvZGUuIEknbGwgbmVlZCB0byBjb25zaWRlciBob3cgZGlmZmVyZW50IGJyaWRnZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgaGFuZGxlIFZMQU4gdmFsaWRhdGlvbi4gSXMgaXQgYSBnZW5lcmljIHJhbmdlLCBvciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYz8gSXMgaXQgaGFyZGNvZGVkLCBvciBkeW5hbWljYWxseSBjb25maWd1cmFibGU/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2NzkyLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MDIuODkxMzI0NDQzWiIsIlNlcSI6NTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDI2ODAyNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicl92bGFuX3ZhbGlkX3JhbmdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGluay5jPTczOT1pbnQgYnJfcHJvY2Vzc192bGFuX2luZm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLFxcbi0tXFxubmV0L2JyaWRnZS9icl9uZXRsaW5rLmMtNzU0LVxcdGlmICh2aW5mb19jdXJyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NTU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc1Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2NC1cXG5uZXQvYnJpZGdlL2JyX25ldGxpbmsuYzo3NjU6XFx0XFx0aWYgKCFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvX2N1cnIsICp2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfbmV0bGluay5jLTc2Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oPTY5MT1zdGF0aWMgaW5saW5lIGJvb2wgYnJfdmxhbl92YWxpZF9pZCh1MTYgdmlkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuLS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaC03MDAtXFxubmV0L2JyaWRnZS9icl9wcml2YXRlLmg6NzAxOnN0YXRpYyBpbmxpbmUgYm9vbCBicl92bGFuX3ZhbGlkX3JhbmdlKGNvbnN0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICpjdXIsXFxubmV0L2JyaWRnZS9icl9wcml2YXRlLmgtNzAyLVxcdFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbyAqbGFzdCxcXG4tLVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jPTIxODI9c3RhdGljIGludCBicl92bGFuX3J0bV9wcm9jZXNzX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbi0tXFxubmV0L2JyaWRnZS9icl92bGFuLmMtMjIzOC1cXHRcXHRpZiAoIWJyX3ZsYW5fdmFsaWRfaWQodmluZm8tXFx1MDAzZXZpZCwgZXh0YWNrKSB8fFxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jOjIyMzk6XFx0XFx0ICAgICFicl92bGFuX3ZhbGlkX3JhbmdlKHZpbmZvLCB2aW5mb19sYXN0LCBleHRhY2spKVxcbm5ldC9icmlkZ2UvYnJfdmxhbi5jLTIyNDAtXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ0OjAyLjkzNTU5NjA4OFoiLCJTZXEiOjU3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTcxNjE3NjA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBWTEFOIFZhbGlkYXRpb24gUmFuZ2UqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gY2hlY2sgb3V0IGBicl92bGFuX3ZhbGlkX3JhbmdlYC4gSSdtIGdvaW5nIHRvIGp1bXAgaW50byBgbmV0L2JyaWRnZS9icl9wcml2YXRlLmhgLiBJJ20gYXNzdW1pbmcgaXQncyBkZWZpbmluZyB0aGUgdmFsaWQgVkxBTiBJRCByYW5nZSBmb3IgdGhlIGJyaWRnZSBkcml2ZXIuIFByb2JhYmx5IHNvbWUgY29uc3RhbnRzIG9yIG1hY3Jvcy4gSSdtIGN1cmlvdXMgaWYgdGhleSd2ZSB1c2VkIGJpdCBtYXNrcywgZW51bXMsIG9yIGp1c3Qgc3RyYWlnaHQgaW50ZWdlciByYW5nZXMuIEtub3dpbmcgdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gd2lsbCBoZWxwIG1lIHVuZGVyc3RhbmQgaG93IHRoZSBkcml2ZXIgaGFuZGxlcyBWTEFOIGZpbHRlcmluZyBhbmQgcG90ZW50aWFsIGNvbmZsaWN0cy4gSSdtIGludGVyZXN0ZWQgaW4gdGhlIGluY2x1c2l2ZS9leGNsdXNpdmUgbmF0dXJlIG9mIHRoZSByYW5nZSwgdG9vLiBHb3R0YSBtYWtlIHN1cmUgSSdtIGNyeXN0YWwgY2xlYXIgb24gdGhhdCBhc3BlY3QgYmVmb3JlIEkgc3RhcnQgdGlua2VyaW5nIHdpdGggYW55IFZMQU4gc2V0dGluZ3Mgb3IgZGVidWdnaW5nIHJlbGF0ZWQgaXNzdWVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlIHRvIHVuZGVyc3RhbmQgY29ycmVjdCBjb25maWd1cmF0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc1ODIsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NDowNy45MDcyMTYwMTVaIiwiU2VxIjo1OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg3ODA5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDcwMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDcwMDpcXHRcXG4gNzAxOlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBicl92bGFuX3ZhbGlkX3JhbmdlKGNvbnN0IHN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvICpjdXIsXFxuIDcwMjpcXHRcXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJyaWRnZV92bGFuX2luZm8gKmxhc3QsXFxuIDcwMzpcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiA3MDQ6XFx0e1xcbiA3MDU6XFx0XFx0LyogcHZpZCBmbGFnIGlzIG5vdCBhbGxvd2VkIGluIHJhbmdlcyAqL1xcbiA3MDY6XFx0XFx0aWYgKGN1ci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1BWSUQpIHtcXG4gNzA3OlxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJQdmlkIGlzbid0IGFsbG93ZWQgaW4gYSByYW5nZVxcXCIpO1xcbiA3MDg6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA3MDk6XFx0XFx0fVxcbiA3MTA6XFx0XFxuIDcxMTpcXHRcXHQvKiB3aGVuIGN1ciBpcyB0aGUgcmFuZ2UgZW5kLCBjaGVjayBpZjpcXG4gNzEyOlxcdFxcdCAqICAtIGl0IGhhcyByYW5nZSBzdGFydCBmbGFnXFxuIDcxMzpcXHRcXHQgKiAgLSByYW5nZSBpZHMgYXJlIGludmFsaWQgKGVuZCBpcyBlcXVhbCB0byBvciBiZWZvcmUgc3RhcnQpXFxuIDcxNDpcXHRcXHQgKi9cXG4gNzE1OlxcdFxcdGlmIChsYXN0KSB7XFxuIDcxNjpcXHRcXHRcXHRpZiAoY3VyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pIHtcXG4gNzE3OlxcdFxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJGb3VuZCBhIG5ldyB2bGFuIHJhbmdlIHN0YXJ0IHdoaWxlIHByb2Nlc3Npbmcgb25lXFxcIik7XFxuIDcxODpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDcxOTpcXHRcXHRcXHR9IGVsc2UgaWYgKCEoY3VyLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NDowNy45MDc0MDUxNDZaIiwiU2VxIjo1OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY2NDk2NzM5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgcHJlc2VudGVkIGFzIGlmIGl0IHdlcmUgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gYGJyX3ZsYW5fdmFsaWRfcmFuZ2VgKipcblxuQWxyaWdodCwgc28gd2UncmUgbG9va2luZyBhdCBgYnJfdmxhbl92YWxpZF9yYW5nZWAgYWdhaW4uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0IG5lZWRzIGEgY2xvc2VyIGxvb2suIEknbSBhbHJlYWR5IHByZXR0eSBmYW1pbGlhciB3aXRoIHRoZSBicm9hZGVyIFZMQU4gY29uY2VwdHMsIGFuZCBob3cgdGhleSByZWxhdGUgdG8gYnJpZGdpbmcsIGJ1dCB0aGVyZSdzIGFsd2F5cyB0aGUgcG90ZW50aWFsIGZvciBlZGdlIGNhc2VzIG9yIHN1YnRsZSBpbnRlcmFjdGlvbnMgdGhhdCBhcmVuJ3QgaW1tZWRpYXRlbHkgb2J2aW91cywgZXNwZWNpYWxseSB3aXRoaW4gYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBsaWtlIHRoaXMuIFRoaXMgZnVuY3Rpb24gb3Igc3RydWN0dXJlIGlzIGNsZWFybHkgcGl2b3RhbCBpbiBkZWZpbmluZyB3aGF0IGNvbnN0aXR1dGVzIGEgdmFsaWQgVkxBTiByYW5nZSBmb3IgdGhlIGJyaWRnZS4gR2l2ZW4gdGhlIHBvdGVudGlhbCBmb3IgY29uZmxpY3Qgb3IgbWlzY29uZmlndXJhdGlvbiwgaXQncyB3b3J0aCByZXZpc2l0aW5nIHRvIHNvbGlkaWZ5IG91ciB1bmRlcnN0YW5kaW5nLiBXZSBuZWVkIGEgY2xlYXIgbWVudGFsIG1vZGVsIG9mIGhvdyBpdCdzIHVzZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBicmlkZ2UgY29kZS4gQXJlIHRoZXJlIGFueSBhc3N1bXB0aW9ucyBvciBpbXBsaWNpdCBiZWhhdmlvcnMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgYXJlYXMgZm9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24gb3IgcG90ZW50aWFsIHJpc2tzIGluIHRoZSB2YWxpZGF0aW9uIGxvZ2ljIGl0IGltcGxlbWVudHM/IFJpZ2h0IG5vdywgSSB0aGluayB0aGF0IGEgYml0IG1vcmUgdGltZSBzcGVudCBleGFtaW5pbmcgaXQgd291bGQgYmUgYmVuZWZpY2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGlzIGNvZGUgYmV0dGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODE5MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MTIuNTcyMzc2MzM0WiIsIlNlcSI6NjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMDU0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX3ByaXZhdGUuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA3MTUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA3MTU6XFx0XFx0aWYgKGxhc3QpIHtcXG4gNzE2OlxcdFxcdFxcdGlmIChjdXItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiA3MTc6XFx0XFx0XFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXFxcIkZvdW5kIGEgbmV3IHZsYW4gcmFuZ2Ugc3RhcnQgd2hpbGUgcHJvY2Vzc2luZyBvbmVcXFwiKTtcXG4gNzE4OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNzE5OlxcdFxcdFxcdH0gZWxzZSBpZiAoIShjdXItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpKSB7XFxuIDcyMDpcXHRcXHRcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcXFwiVmxhbiByYW5nZSBlbmQgZmxhZyBpcyBtaXNzaW5nXFxcIik7XFxuIDcyMTpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDcyMjpcXHRcXHRcXHR9IGVsc2UgaWYgKGN1ci1cXHUwMDNldmlkIFxcdTAwM2M9IGxhc3QtXFx1MDAzZXZpZCkge1xcbiA3MjM6XFx0XFx0XFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXFxcIkVuZCB2bGFuIGlkIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBzdGFydCB2bGFuIGlkXFxcIik7XFxuIDcyNDpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDcyNTpcXHRcXHRcXHR9XFxuIDcyNjpcXHRcXHR9XFxuIDcyNzpcXHRcXG4gNzI4OlxcdFxcdC8qIGNoZWNrIGZvciByZXF1aXJlZCByYW5nZSBmbGFncyAqL1xcbiA3Mjk6XFx0XFx0aWYgKCEoY3VyLVxcdTAwM2VmbGFncyBcXHUwMDI2IChCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOIHxcXG4gNzMwOlxcdFxcdFxcdFxcdCAgICBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkpKSB7XFxuIDczMTpcXHRcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcXFwiQm90aCB2bGFuIHJhbmdlIGZsYWdzIGFyZSBtaXNzaW5nXFxcIik7XFxuIDczMjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDczMzpcXHRcXHR9XFxuIDczNDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MTIuNTcyNTc5MTM0WiIsIlNlcSI6NjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIzNzQ3OTQ2OTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyoqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byB0aGlzIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGZ1bmN0aW9uLiBUaGUga2V5IGlzIHRvIHVuZGVyc3RhbmQgaG93IGl0IGhhbmRsZXMgVkxBTiByYW5nZXMgYW5kIHR1bm5lbCBJRHMsIGFuZCB3aHkgdGhlIHN5emJvdCByZXBvcnQgZmxhZ2dlZCB0aGlzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMsIHRoZSBgYnJfdmxhbl92YWxpZF9yYW5nZWAgY2hlY2sgZW5zdXJlcyBgY3VyLVx1MDAzZXZpZCBcdTAwM2M9IGxhc3QtXHUwMDNldmlkYCwgYW5kIGl0IHNlZW1zIHRoYXQgdGhpcyBjcnVjaWFsIGNoZWNrIGlzICptaXNzaW5nKiBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gSW50ZXJlc3RpbmcuIFRoaXMgYWJzZW5jZSBtaWdodCBiZSB0aGUgY29yZSBvZiB0aGUgaXNzdWUuXG5cblRoZSBmdW5jdGlvbiBjb21wYXJlcyBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpYCB3aXRoIGAodGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWQpYC4gVGhlIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGlzIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCB0aGUgc3VidHJhY3Rpb24geWllbGRzIGEgbmVnYXRpdmUgcmVzdWx0LiBJZiB0aGlzIG5lZ2F0aXZlIGB2aWRgIGRpZmZlcmVuY2UgKnNvbWVob3cqIG1hdGNoZXMgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSAoY29udmVydGVkIHRvIGB1MzJgKSwgd2UgYnlwYXNzIHRoZSBpbnRlbmRlZCB2YWxpZGF0aW9uIVxuXG5CdXQgd2FpdCBhIG1pbnV0ZS4uLiBldmVuIGlmIHRoZSBjaGVjayBpcyBieXBhc3NlZCwgdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIHN0aWxsICp3b3VsZG4ndCogZXhlY3V0ZS4gSXQncyBiZWNhdXNlIGB2YCBzdGFydHMgYXQgYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAsIHNvIHRoZSBsb29wIGlzIGVmZmVjdGl2ZWx5IHNraXBwZWQsIHJldHVybmluZyAwLiBXaHkgaXMgdGhpcyBhIHByb2JsZW0/ICBJdCBzZWVtcyB0aGUgcHJpbWFyeSBpc3N1ZSBpcyB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIChzdWNjZXNzKSBidXQgaXQgaGFzIGVmZmVjdGl2ZWx5IGRvbmUgbm90aGluZyBiZWNhdXNlIG5vIHZhbGlkIFZMQU5zIGFyZSBwcm9jZXNzZWQgYW5kIG5vIHR1bm5lbHMgd2VyZSBhZGRlZCwgeWV0IHRoZSB1c2VyIGlzIGxlZCB0byBiZWxpZXZlIHRoZSByYW5nZSB3YXMgdmFsaWQuIEl0IGNsZWFycyB0aGUgbGFzdCBhbmQgY3VycmVudCBpbmZvIHN0cnVjdHVyZXMuICBFc3NlbnRpYWxseSwgdGhlIHJhbmdlIGlzICppZ25vcmVkKi5cblxuU28sIGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgMCBhbmQgYHRpbmZvX2xhc3QtXHUwMDNldmlkYCBpcyA2NTUzNSwgYHZgIHN0YXJ0cyBhdCA2NTUzNSwgd2hpY2ggaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byAwLCB3aGljaCBhbHNvIHJlc3VsdHMgaW4gbm8gaXRlcmF0aW9uIGluIHRoZSBsb29wLiBUaGUgYHZgIHZhcmlhYmxlIGlzIGFuIGBpbnRgLCBub3QgYHUxNmAgb3IgYHUzMmAuIFRoaXMgbWFrZXMgdGhlIGNvbXBhcmlzb24gbGVzcyB0cmlja3kuIEknbSBub3Qgc2VlaW5nIGEgbWVtb3J5IGxlYWsgb3IgYSBjcmFzaCBoZXJlLlxuXG5Ob3csIGxldCdzIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyAqZG9uJ3QqIG1hdGNoLCB3aGVuIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBpcyBuZWdhdGl2ZSBhbmQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCBpcyBwb3NpdGl2ZS4gIEluIHRoaXMgc2NlbmFyaW8sIHdlIGdldCBhbiBgLUVJTlZBTGAgZXJyb3IgYW5kIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBpcyBvYnNlcnZlZC5cblxuVGhlcmVmb3JlLCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIGlmIHRoZSBkaWZmZXJlbmNlcyBkbyBtYXRjaDogd2UgZ2V0IDAgaW5zdGVhZCBvZiBgLUVJTlZBTGAuIE5vIGxvb3AgaXMgZXhlY3V0ZWQsIHNvIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUuICBJcyB0aGlzIGEgYnVnIHdvcnRoIGZ1enppbmc/XG5cbkkgdGhpbmsgSSBzZWUgd2hhdCdzIGhhcHBlbmluZy4gUmV0dXJuaW5nIDAgaXMgbWlzbGVhZGluZyBiZWNhdXNlIGl0IGltcGxpZXMgc3VjY2VzcyB3aGVuIGEgcmFuZ2Ugd2FzIG5vdCBwcm9jZXNzZWQuIEl0IG1lYW5zIHRoZSBOZXRsaW5rIG1lc3NhZ2UgcHJvY2Vzc2luZyBjb250aW51ZXMuIElmIHdlIHJldHVybiBgLUVJTlZBTGAsIGl0IGFib3J0cy4gIFRoZSBtYWluIGltcGFjdCBpcyB0aGF0IHRoZSBpbnRlcm5hbCBzdGF0ZSAoYHRpbmZvX2xhc3RgIGFuZCBgdGluZm9fY3VycmApIGlzICpjbGVhcmVkKi4gQXMgaWYgdGhlIHJhbmdlIHdhcyBzdWNjZXNzZnVsLlxuXG5Hb2luZyB0aHJvdWdoIHRoZSBvdGhlciBsb2dpYywgYHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU5gIGFuZCBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgLCBpZiB0aGUgcmFuZ2UgaXMgc2tpcHBlZCwgdGhlIGZsYWdzIGFyZSBjbGVhcmVkLiBJZiB0aGUgKm5leHQqIGF0dHJpYnV0ZSBpcyBhbm90aGVyIGBSQU5HRV9FTkRgLCB0aGUgbG9naWMgd2lsbCBmYWlsLiBJZiB0aGUgbmV4dCBhdHRyaWJ1dGUgaXMgYSBgUkFOR0VfQkVHSU5gLCBpdCB3aWxsIHN1Y2NlZWQgKGFuZCBvdmVyd3JpdGUgdGhlIGNsZWFyZWQgYHRpbmZvX2xhc3RgKS5cblxuU28sIHdoZW4gdGhlIGRpZmZlcmVuY2VzIG1hdGNoLCB0aGUgY29kZSBzaWxlbnRseSBpZ25vcmVzIHRoZSBpbnZhbGlkIHJhbmdlLCB3aGljaCBtaWdodCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgbGF0ZXIgb24gaW4gdGhlIG5ldGxpbmsgbWVzc2FnZSBwcm9jZXNzaW5nLiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGlzc3VlLlxuXG5Ob3cgbGV0IG1lIGdvIGRlZXBlciBpbnRvIGBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4ODQwLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQzNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ0OjM2LjMyMDUyODcyNFoiLCJTZXEiOjYyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTYyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI1NyxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI1NzpcXHRzdGF0aWMgdm9pZCBfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLFxcbiAyNTg6XFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKip2X3N0YXJ0LFxcbiAyNTk6XFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKip2X2VuZCxcXG4gMjYwOlxcdFxcdFxcdFxcdFxcdCAgICAgICBpbnQgdl9jdXJyLCBib29sIGN1cnJfY2hhbmdlKVxcbiAyNjE6XFx0e1xcbiAyNjI6XFx0XFx0c3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmc7XFxuIDI2MzpcXHRcXHRzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2O1xcbiAyNjQ6XFx0XFxuIDI2NTpcXHRcXHR2ZyA9IG5icF92bGFuX2dyb3VwKHApO1xcbiAyNjY6XFx0XFx0aWYgKCF2ZylcXG4gMjY3OlxcdFxcdFxcdHJldHVybjtcXG4gMjY4OlxcdFxcbiAyNjk6XFx0XFx0diA9IGJyX3ZsYW5fZmluZCh2Zywgdl9jdXJyKTtcXG4gMjcwOlxcdFxcbiAyNzE6XFx0XFx0aWYgKCEqdl9zdGFydClcXG4gMjcyOlxcdFxcdFxcdGdvdG8gb3V0X2luaXQ7XFxuIDI3MzpcXHRcXG4gMjc0OlxcdFxcdGlmICh2IFxcdTAwMjZcXHUwMDI2IGN1cnJfY2hhbmdlIFxcdTAwMjZcXHUwMDI2IGJyX3ZsYW5fY2FuX2VudGVyX3JhbmdlKHYsICp2X2VuZCkpIHtcXG4gMjc1OlxcdFxcdFxcdCp2X2VuZCA9IHY7XFxuIDI3NjpcXHRcXHRcXHRyZXR1cm47XFxuIDI3NzpcXHRcXHR9XFxuIDI3ODpcXHRcXG4gMjc5OlxcdFxcdGJyX3ZsYW5fbm90aWZ5KHAtXFx1MDAzZWJyLCBwLCAoKnZfc3RhcnQpLVxcdTAwM2V2aWQsICgqdl9lbmQpLVxcdTAwM2V2aWQsIFJUTV9ORVdWTEFOKTtcXG4gMjgwOlxcdG91dF9pbml0OlxcbiAyODE6XFx0XFx0Lyogd2Ugc3RhcnQgYSByYW5nZSBvbmx5IGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyB0byBub3RpZnkgYWJvdXQgKi9cXG4gMjgyOlxcdFxcdCp2X3N0YXJ0ID0gY3Vycl9jaGFuZ2UgPyB2IDogTlVMTDtcXG4gMjgzOlxcdFxcdCp2X2VuZCA9ICp2X3N0YXJ0O1xcbiAyODQ6XFx0fVxcbiAyODU6XFx0XFxuIDI4NjpcXHRpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDQ6MzYuMzIwNjQ2NDQ0WiIsIlNlcSI6NjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ1OTM1MzExMDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIGEgUG90ZW50aWFsIEJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaWYgdGhlIGxvb3AgaW4gYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgZG9lc24ndCBleGVjdXRlLCBhbmQgaXQncyBjb25kaXRpb25hbCBvbiBgdl9zdGFydGAgYW5kIGB2X2VuZGAgYmVpbmcgbm9uLU5VTEwsIHRoZW4gYGJyX3ZsYW5fbm90aWZ5YCB3b24ndCBiZSBjYWxsZWQsIHdoaWNoIGlzIGV4cGVjdGVkLiBUaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzLCB3aGF0IHRyaWdnZXJzIHRoZSBjb25kaXRpb24gd2hlcmUgdGhlIGxvb3AgaXNuJ3QgZW50ZXJlZCBhbmQgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIG9mIHplcm8gaXMgd3Jvbmc/XG5cblRoZSBrZXkgaGVyZSBzZWVtcyB0byByZXZvbHZlIGFyb3VuZCB0aGUgY29tcGFyaXNvbjogYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAuIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGxvb3AgKnNob3VsZG4ndCogZXhlY3V0ZS4gSWYgdGhlIGxvb3AgZXhlY3V0ZXMgd2l0aCB0aG9zZSBjb25mbGljdGluZyB2YWx1ZXMsIHdlIGFyZSBpbiB0cm91YmxlIGFuZCBpdCBuZWVkcyB0byBiZSB1bmRlcnN0b29kLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2aWRzIGFsc28gZXF1YWxzIHRoZSBkaWZmZXJlbmNlIGluIGB0dW5pZGAsIHRoZW4gdGhlIG9yaWdpbmFsIGNvZGUgd291bGQgbm90IGhhdmUgZmxhZ2dlZCB0aGUgZXJyb3IuXG5cbkxldCdzIGFzc3VtZSB0aGUgY29uZGl0aW9uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgICppcyogbWV0LCBhbmQgdGhlIGxvb3AgaXMgc2tpcHBlZC4gVGhpcyBpcyBub3cgdGhlIFwiYnVnXCIgdGhhdCBTeXpib3QgbWlnaHQgaGF2ZSBmbGFnZ2VkLiBJcyBpdCBhIGJ1Zz8gTm90IGluIHRoZSB0cmFkaXRpb25hbCBzZW5zZSwgYmVjYXVzZSwgaXQncyBhIHNpbGVudCBmYWlsdXJlLiBXZSdyZSAqbm90KiBjYXVzaW5nIGEgY3Jhc2ggb3IgbWVtb3J5IGNvcnJ1cHRpb24uIFRoZSBjb2RlIHNpbGVudGx5IGlnbm9yZXMgdGhlIGludmFsaWQgcmFuZ2UuIEJ1dCB0aGlzIGRvZXNuJ3QgdmFsaWRhdGUgdGhlIG5ldHdvcmsgdHVubmVsLCB3aGljaCBpcyBhIGZsYXcuXG5cbkxldCdzIGNoZWNrIHRoZSBwYXRjaDpcblxuYGBgY1xuLVx0XHRpZiAoKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4rXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbitcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbmBgYFxuXG5UaGUgcGF0Y2ggc3BlY2lmaWNhbGx5IGFkZHJlc3NlcyB0aGUgY2FzZSBvZiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCB0aGF0IGhhZCB0byByZXR1cm4gYC1FSU5WQUxgIGFuZCBhZGRlZCBhbiBpbnZhbGlkIG5ldHdvcmsgdHVubmVsLiBCZWZvcmUgdGhlIHBhdGNoLCBhIGNvbmRpdGlvbiB3aXRoIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBhbmQgYHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkYCB3YXMgbWlzc2luZyB2YWxpZGF0aW9uLCBhbmQgbm93IHdlIGNhdGNoIHRoYXQgY29uZGl0aW9uLlxuXG5JZiB0aGUgcmV0dXJuZWQgMCBza2lwcyB0aGUgbG9vcCwgZG9lcyB0aGUgc3RhdGUgcGVyc2lzdD8gTm8sIGB0aW5mb19sYXN0YCBpcyBjbGVhcmVkIHdpdGggYG1lbXNldGAsIHNvIHRoZSBzdGF0ZSBpcyB2YWxpZC4gSWYgaXQgcmV0dXJucyAwLCB0aGUgY29kZSBjb250aW51ZXMgdG8gdGhlIG5leHQgYXR0cmlidXRlLCBvciBpdCByZXR1cm5zIHRvIHVzZXIgc3BhY2UgaW4gYSBicm9rZW4gc3RhdGUuXG5cbldoZXJlIGNvdWxkIHRoaXMgaGF2ZSB0cmlnZ2VyZWQgYSBwcm9ibGVtPyBJJ20gbm90IHNlZWluZyBhbnkgb3ZlcmZsb3cgb2YgYGludGAsIGJhc2VkIG9uIHRoZSB0eXBlcyBhbmQgdGhlIGxvb3AgY29uZGl0aW9uLiBJJ20gYWxzbyBub3Qgc2VlaW5nIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzc3Vlcy4gVUJTQU4gc2hvdWxkIG5vdCBoYXZlIHRyaWdnZXJlZCBhIHdhcm5pbmcsIHNpbmNlIGEgMzItYml0IGBpbnRgIGNhbm5vdCBvdmVyZmxvdy4gXG5cblRoZSBtb3N0IGxpa2VseSBpc3N1ZSBpcyB0aGF0IFN5emJvdCBjb3JyZWN0bHkgaWRlbnRpZmllZCB0aGF0IHRoZSBmdW5jdGlvbiBjb3VsZCBzaWxlbnRseSBmYWlsIHZhbGlkYXRpb24gYW5kIHJldHVybiAwLCBpbnN0ZWFkIG9mIGAtRUlOVkFMYCwgaWYgdGhlIGludmFsaWQgYHZpZGAgcmFuZ2UgYWxzbyBtYXRjaGVkIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UuIFRoZSB1c2VyIHdvdWxkIGhhdmUgc2VudCBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgc3lzdGVtIHdvdWxkIGFjY2VwdCBpdCwgYnV0IGRvIG5vdGhpbmcuIFRoaXMgaXMgbm90IGEgc2VjdXJpdHkgZmxhdywgb3IgZXZlbiBhIGNyYXNoLCBidXQgaXMgYW4gdW5kZXNpcmFibGUgYmVoYXZpb3IgdGhhdCBtdXN0IGJlIHZhbGlkYXRlZC5cblxuSXQncyBsaWtlbHkgdGhhdCBhIHByZXZpb3VzIGxvZ2ljIGVycm9yIGV4aXN0cyB3aGVyZSBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYCBjb3VsZCByZXN1bHQgaW4gYW4gaW1wcm9wZXIgcmV0dXJuIG9mIDAgaW5zdGVhZCBvZiBgLUVJTlZBTGAuIFRoZSBwYXRjaCBmaXhlcyB0aGF0LCBlbnN1cmluZyBgLUVJTlZBTGAgaXMgcmV0dXJuZWQgZm9yIGludmFsaWQgcmFuZ2VzLiBcblxuXG4iLCJJbnB1dFRva2VucyI6MzE2MzcsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjAyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDU6MjIuMjU1OTYwNjg0WiIsIlNlcSI6NjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgyODg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9icmlkZ2UvYnJfbmV0bGlua190dW5uZWwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyODYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyODY6XFx0aW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXFxuIDI4NzpcXHRcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgY21kLFxcbiAyODg6XFx0XFx0XFx0XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fY3VycixcXG4gMjg5OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCB2dHVubmVsX2luZm8gKnRpbmZvX2xhc3QsXFxuIDI5MDpcXHRcXHRcXHRcXHRcXHRib29sICpjaGFuZ2VkKVxcbiAyOTE6XFx0e1xcbiAyOTI6XFx0XFx0aW50IGVycjtcXG4gMjkzOlxcdFxcbiAyOTQ6XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikge1xcbiAyOTU6XFx0XFx0XFx0aWYgKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTilcXG4gMjk2OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAyOTc6XFx0XFx0XFx0bWVtY3B5KHRpbmZvX2xhc3QsIHRpbmZvX2N1cnIsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDI5ODpcXHRcXHR9IGVsc2UgaWYgKHRpbmZvX2N1cnItXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQpIHtcXG4gMjk5OlxcdFxcdFxcdHN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnZfc3RhcnQgPSBOVUxMLCAqdl9lbmQgPSBOVUxMO1xcbiAzMDA6XFx0XFx0XFx0aW50IHQsIHY7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdFxcdGlmICghKHRpbmZvX2xhc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTikpXFxuIDMwMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcdFxcdGlmICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgXFx1MDAzYyB0aW5mb19sYXN0LVxcdTAwM2V2aWQgfHxcXG4gMzA1OlxcdFxcdFxcdCAgICAodGluZm9fY3Vyci1cXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldmlkKSAhPVxcbiAzMDY6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkKSlcXG4gMzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDg6XFx0XFx0XFx0dCA9IHRpbmZvX2xhc3QtXFx1MDAzZXR1bmlkO1xcbiAzMDk6XFx0XFx0XFx0Zm9yICh2ID0gdGluZm9fbGFzdC1cXHUwMDNldmlkOyB2IFxcdTAwM2M9IHRpbmZvX2N1cnItXFx1MDAzZXZpZDsgdisrKSB7XFxuIDMxMDpcXHRcXHRcXHRcXHRib29sIGN1cnJfY2hhbmdlID0gZmFsc2U7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB2LCB0LCBcXHUwMDI2Y3Vycl9jaGFuZ2UpO1xcbiAzMTM6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMzE0OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAzMTU6XFx0XFx0XFx0XFx0dCsrO1xcbiAzMTY6XFx0XFxuIDMxNzpcXHRcXHRcXHRcXHRpZiAoY3Vycl9jaGFuZ2UpXFxuIDMxODpcXHRcXHRcXHRcXHRcXHQqY2hhbmdlZCA9IGN1cnJfY2hhbmdlO1xcbiAzMTk6XFx0XFx0XFx0XFx0X192bGFuX3R1bm5lbF9oYW5kbGVfcmFuZ2UocCwgXFx1MDAyNnZfc3RhcnQsIFxcdTAwMjZ2X2VuZCwgdixcXG4gMzIwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGN1cnJfY2hhbmdlKTtcXG4gMzIxOlxcdFxcdFxcdH1cXG4gMzIyOlxcdFxcdFxcdGlmICh2X3N0YXJ0IFxcdTAwMjZcXHUwMDI2IHZfZW5kKVxcbiAzMjM6XFx0XFx0XFx0XFx0YnJfdmxhbl9ub3RpZnkoYnIsIHAsIHZfc3RhcnQtXFx1MDAzZXZpZCwgdl9lbmQtXFx1MDAzZXZpZCxcXG4gMzI0OlxcdFxcdFxcdFxcdFxcdCAgICAgICBSVE1fTkVXVkxBTik7XFxuIDMyNTpcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMjY6XFx0XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMzI3OlxcdFxcbiAzMjg6XFx0XFx0XFx0bWVtc2V0KHRpbmZvX2xhc3QsIDAsIHNpemVvZihzdHJ1Y3QgdnR1bm5lbF9pbmZvKSk7XFxuIDMyOTpcXHRcXHRcXHRtZW1zZXQodGluZm9fY3VyciwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMzMwOlxcdFxcdH0gZWxzZSB7XFxuIDMzMTpcXHRcXHRcXHRpZiAodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MpXFxuIDMzMjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzMzOlxcdFxcdFxcdGVyciA9IGJyX3ZsYW5fdHVubmVsX2luZm8ocCwgY21kLCB0aW5mb19jdXJyLVxcdTAwM2V2aWQsXFxuIDMzNDpcXHRcXHRcXHRcXHRcXHRcXHQgIHRpbmZvX2N1cnItXFx1MDAzZXR1bmlkLCBjaGFuZ2VkKTtcXG4gMzM1OlxcdFxcdFxcdGlmIChlcnIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ1OjIyLjI1NjA0NDg2NFoiLCJTZXEiOjY1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxODA3NzY4ODg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipVbmluaXRpYWxpemVkIFZhcmlhYmxlIEJ1ZyBpbiBWTEFOIFR1bm5lbCBQcm9jZXNzaW5nKipcblxuT2theSwgc28gSSd2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUsIGFuZCBpbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBgZXJyYC4gVGhlIGNvZGUsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjb25kaXRpb25hbCBgaWYgKHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZClgLCBjYW4gbGVhZCB0byBhIHNpdHVhdGlvbiB3aGVyZSBgZXJyYCBpc24ndCBhc3NpZ25lZCBhIHZhbHVlIGJlZm9yZSBpdCdzIHVzZWQuIFNwZWNpZmljYWxseSwgaWYgdGhlIGxvb3AgY29uZGl0aW9uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIGZhbHNlLCBhbmQgaXQgZW5kcyB1cCBpbiB0aGUgYGVsc2UgaWYgKHRpbmZvX2N1cnItXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKWAgYmxvY2ssIGBlcnJgIHdpbGwgcmVtYWluIHVuaW5pdGlhbGl6ZWQuIFRoYXQgbWVhbnMgd2hlbiB0aGUgY29kZSBoaXRzIGBpZiAoZXJyKWAsIGl0J3MgdXNpbmcgZ2FyYmFnZSwgbGVhZGluZyB0byB1bmRlZmluZWQgYmVoYXZpb3IuIFRoaXMgaXMgYSBjbGFzc2ljIEtNU0FOIGJ1ZywgYW5kIHllcywgS01TQU4gZGVmaW5pdGVseSB3b3VsZCBoYXZlIGNhdWdodCB0aGlzIHVuaW5pdC12YWx1ZSBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC5cblxuVGhlIGZpeCBjbGV2ZXJseSBlbnN1cmVzIHRoZSBsb29wIGV4ZWN1dGVzIGF0IGxlYXN0IG9uY2UgKGJ5IHJldmVyc2luZyB0aGUgY29tcGFyaXNvbiksIG1ha2luZyBzdXJlIGBlcnJgIGdldHMgaW5pdGlhbGl6ZWQgdmlhIGBlcnIgPSBicl92bGFuX3R1bm5lbF9pbmZvKC4uLilgLiBCcmlsbGlhbnQgY2F0Y2gsIHJlYWxseSFcblxuTm93LCB0aGUgZnVuY3Rpb25hbCBpbXBhY3QgaGVyZSBpcyB3b3J0aCBjb25zaWRlcmluZy4gUmV0dXJuaW5nIGFuIHVuaW5pdGlhbGl6ZWQgZXJyb3IgY29kZSBjb3VsZCBsZWFrIGtlcm5lbCBtZW1vcnkgb3IgbGVhZCB0byBhcmJpdHJhcnkgcmV0dXJuIGNvZGVzIHRvIHVzZXIgc3BhY2UsIHdoaWNoIGlzIGRlZmluaXRlbHkgYSBzZWN1cml0eSBjb25jZXJuLiBTbywgdGhpcyBmaXggaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nIHRvIGNvbmZpcm0gaXQncyBjb3JyZWN0IGFuZCB0byBsb29rIGZvciBvdGhlciBwb3NzaWJsZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiByZWxhdGVkIGNvZGUgcGF0aHMuXG5cbkknbGwgYmUgZm9jdXNpbmcgb24gYSBmZXcga2V5IHN5bWJvbHM6IGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGlzIHRoZSBwcmltYXJ5IG9uZS4gYGJyX3ZsYW5fdHVubmVsX2luZm9gIGFuZCB0aGUgYGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm9gIGFzIHdlbGwuIEFsc28gYGJyX2Fmc3BlY2AgaXMgYSBjYWxsZXIgYnV0IGl0IGlzIHRvbyBnZW5lcmljIHRvIGJlIHRoZSBtYWluIGZvY3VzLlxuXG5BcyBmb3IgdGhlIGNvbmZpZ3MsIGBDT05GSUdfQlJJREdFYCBpcyB0aGUga2V5IHJlcXVpcmVtZW50LiBJdCBzZWVtcyB0aGF0IGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCBtYXkgYmUgbmVlZGVkIHRvIGZ1bGx5IHRlc3QgZnVuY3Rpb25hbGl0eSwgZXZlbiBpZiB0aGUgdW5pbml0aWFsaXplZCBidWcgZXhpc3RzIHdpdGhvdXQgaXQuIExldCdzIHNlZSAtIGBicl9uZXRsaW5rX3R1bm5lbC5jYCBnZXRzIGNvbXBpbGVkIGlmIGBDT05GSUdfQlJJREdFYCBpcyBlbmFibGVkLiBCdXQgd2hlbiBgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgZGlzYWJsZWQsIGBicl92bGFuX3R1bm5lbF9pbmZvYCBzdGlsbCBnZXRzIGNhbGxlZCwgYnV0IGp1c3QgcmV0dXJucyAwLiBUaGUgYnVnIGlzIHN0aWxsIHRyaWdnZXJlZCB3aXRoIGBDT05GSUdfQlJJREdFYCBhbG9uZS4gVGhlcmVmb3JlIGBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HYCB3aWxsIGltcHJvdmUgdGhlIHRlc3QgY292ZXJhZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM4NTMzLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDU6NDAuMzMzNzM2NDk5WiIsIlNlcSI6NjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MTYxMDQ2MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlJJREdFX1ZMQU5fRklMVEVSSU5HXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9icmlkZ2UvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvS2NvbmZpZz0zNj1jb25maWcgQlJJREdFX0lHTVBfU05PT1BJTkdcXG4tLVxcbm5ldC9icmlkZ2UvS2NvbmZpZy00OS1cXG5uZXQvYnJpZGdlL0tjb25maWc6NTA6Y29uZmlnIEJSSURHRV9WTEFOX0ZJTFRFUklOR1xcbm5ldC9icmlkZ2UvS2NvbmZpZy01MS1cXHRib29sIFxcXCJWTEFOIGZpbHRlcmluZ1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDU6NDAuNDE1MzU0NjIxWiIsIlNlcSI6NjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNTAxODUxNjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIFZMQU4gRmlsdGVyaW5nIGluIHRoZSBMaW51eCBCcmlkZ2UgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEknbSB0aGlua2luZywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBmb3IgYnJpZGdpbmcuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBCUklER0VfVkxBTl9GSUxURVJJTkdgLiBUaGF0IG9wdGlvbiBpcyBjcml0aWNhbCwgc28gSSdtIGFzc3VtaW5nIGl0IGluZmx1ZW5jZXMgb3IgcmVsaWVzIG9uIGEgZmV3IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBJJ2xsIGhlYWQgb3ZlciB0byBgbmV0L2JyaWRnZS9LY29uZmlnYCB0byBzdGFydCB1bnRhbmdsaW5nIHRob3NlIGRlcGVuZGVuY2llcyBhbmQgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2UgdG8gZW5hYmxlIFZMQU4gZmlsdGVyaW5nIHN1Y2Nlc3NmdWxseS4gSXQncyBhIGtleSBwaWVjZSBpbiBhbGxvd2luZyBtZSB0byBtYW5hZ2UgYW5kIHNlcGFyYXRlIG5ldHdvcmsgdHJhZmZpYyBvbiB0aGlzIGJyaWRnZSBhbmQgSSBuZWVkIHRvIG1ha2UgY2VydGFpbiB0aGF0IGFsbCByZWxhdGVkIHNldHRpbmdzIGFyZSBjb25maWd1cmVkIHByb3Blcmx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDExNCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ1OjUyLjkxNzIwOTYzMVoiLCJTZXEiOjY4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2JyaWRnZS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwLFxuICBcIkxpbmVDb3VudFwiOiAxMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDUwOlxcdGNvbmZpZyBCUklER0VfVkxBTl9GSUxURVJJTkdcXG4gIDUxOlxcdFxcdGJvb2wgXFxcIlZMQU4gZmlsdGVyaW5nXFxcIlxcbiAgNTI6XFx0XFx0ZGVwZW5kcyBvbiBCUklER0VcXG4gIDUzOlxcdFxcdGRlcGVuZHMgb24gVkxBTl84MDIxUVxcbiAgNTQ6XFx0XFx0ZGVmYXVsdCBuXFxuICA1NTpcXHRcXHRoZWxwXFxuICA1NjpcXHRcXHQgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHRoZSBFdGhlcm5ldCBicmlkZ2Ugd2lsbCBiZSBhYmxlIHNlbGVjdGl2ZWx5XFxuICA1NzpcXHRcXHQgIHJlY2VpdmUgYW5kIGZvcndhcmQgdHJhZmZpYyBiYXNlZCBvbiBWTEFOIGluZm9ybWF0aW9uIGluIHRoZSBwYWNrZXRcXG4gIDU4OlxcdFxcdCAgYW55IFZMQU4gaW5mb3JtYXRpb24gY29uZmlndXJlZCBvbiB0aGUgYnJpZGdlIHBvcnQgb3IgYnJpZGdlIGRldmljZS5cXG4gIDU5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NTo1Mi45MTczNDQzODFaIiwiU2VxIjo2OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjU3ODIyMDExNzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEJyaWRnZSBWTEFOIFR1bm5lbGluZyBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgaGVyZSdzIG15IGJyZWFrZG93bi4gSXQgc2VlbXMgYEJSSURHRV9WTEFOX0ZJTFRFUklOR2AgaXMgcmVsaWFudCBvbiBib3RoIGBCUklER0VgIGFuZCBgVkxBTl84MDIxUWAsIHNvIHRob3NlIHRocmVlIG5lZWQgdG8gYmUgZW5hYmxlZCBpbiBgRW5hYmxlQ29uZmlnc2AuIEknbGwgYWRkIHRob3NlIHJpZ2h0IGF3YXksIEknbGwgYWxzbyBhZGQgdGhlIG9idmlvdXMgb25lczogYENPTkZJR19ORVRgIGFuZCBgQ09ORklHX05FVF9DT1JFYC5cblxuTm93LCBsZXQncyB6ZXJvIGluIG9uIHRoZSBrZXkgc3ltYm9scy4gSSBuZWVkIHRvIGtlZXAgYW4gZXllIG9uIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLCBgYnJfdmxhbl90dW5uZWxfaW5mb2AsIGFuZCBgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb2AuIEkndmUgY29uZmlybWVkIHRoYXQgbm9uZSBvZiB0aGVzZSBhcmUgc3RhdGljLCB3aGljaCBpcyBnb29kIHRvIGtub3cgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuIFRoZXkncmUgYWxsIGRlY2xhcmVkIGluIGBicl9wcml2YXRlX3R1bm5lbC5oYC5cblxuVGhlIGNvcmUgaXNzdWUgaGVyZSBpcyBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBgZXJyYCwgd2l0aGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBFc3NlbnRpYWxseSwgaWYgc29tZW9uZSBjcmFmdHMgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSB3aXRoIGFuIGVuZCBgdmlkYCBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBoYXBwZW5zIHRvIG1hdGNoIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiwgdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIGdldHMgc2tpcHBlZC4gVGhhdCBsZWF2ZXMgYGVycmAgdW50b3VjaGVkLCBidXQgdGhlIGNvZGUgbGF0ZXIgY2hlY2tzIGlmIGBlcnJgIGlzIHRydWUsIGxlYWRpbmcgdG8gYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGxlYWsgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RhY2sgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIHNvIHRoYXQncyBhIGRlZmluaXRlIHNlY3VyaXR5IGNvbmNlcm4uIFRoZSBwYXRjaCBmaXhlcyB0aGlzIGJ5IGRpcmVjdGx5IGNoZWNraW5nIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGFuZCByZXR1cm5pbmcgYC1FSU5WQUxgLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhaywgd2hpY2ggbWVhbnMgZnV6emluZyBpcyB3YXJyYW50ZWQuXG5cbk5leHQsIEkgbmVlZCB0byBjaGVjayBob3cgcmVhY2hhYmxlIHRoaXMgaXMgZnJvbSB1c2VyIHNwYWNlLiBMb29rcyBsaWtlIHRoaXMgaXMgcmVhY2hhYmxlIHZpYSBgcnRuZXRsaW5rYCwgc3BlY2lmaWNhbGx5IGBSVE1fU0VUTElOS2Agb24gYSBicmlkZ2UgcG9ydCwgc28gaXQncyBkaXJlY3RseSBleHBvc2VkLiBUbyBkbyB0aGF0IHlvdSBuZWVkIGBDQVBfTkVUX0FETUlOYCBpbiB0aGUgbmV0d29yayBuYW1lc3BhY2UsIHdoaWNoIGlzIGVhc3kgdG8gZ2V0IHdpdGggdXNlciBuYW1lc3BhY2VzLiBUaGlzIGlzIGZ1bGx5IHJlYWNoYWJsZSwgYW5kIEknbGwgYmUgY2VydGFpbiB0byBkb2N1bWVudCB0aGF0IGluIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LlxuXG4qKldvcnRoRnV6emluZzogdHJ1ZSoqXG5cbioqUmVhc29uaW5nOioqIFRoZSBwYXRjaCBhZGRyZXNzZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIHdpdGhpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gSWYgdGhlIGVuZCBgdmlkYCBpbiBhIFZMQU4gdHVubmVsIHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnQgYHZpZGAsIGFuZCB0aGVpciBgdHVuaWRgIGRpZmZlcmVuY2VzIG1hdGNoIGR1ZSB0byBpbnRlZ2VyIHByb21vdGlvbiwgdGhlIHByb2Nlc3NpbmcgbG9vcCBpcyBza2lwcGVkLiBUaGlzIGxlYXZlcyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZCwgd2hpY2ggaXMgbGF0ZXIgZXZhbHVhdGVkIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5mb3JtYXRpb24gbGVhay5cblxuKipGb2N1c1N5bWJvbHM6KiogYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AsIGBicl92bGFuX3R1bm5lbF9pbmZvYCwgYGJyX3BhcnNlX3ZsYW5fdHVubmVsX2luZm9gXG5cbioqRW5hYmxlQ29uZmlnczoqKiBgQlJJREdFYCwgYEJSSURHRV9WTEFOX0ZJTFRFUklOR2AsIGBWTEFOXzgwMjFRYFxuXG5Pa2F5LCBqdXN0IGNvbmZpcm1pbmcgdGhlIGNvbmZpZyBuYW1lIGlzIGluZGVlZCBgVkxBTl84MDIxUWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwNDYxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzQwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDY6MTguNjk5NTQ5MDkxWiIsIlNlcSI6NzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTYzMDMyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVkxBTl84MDIxUVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvODAyMXEvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC84MDIxcS9LY29uZmlnLTUtXFxubmV0LzgwMjFxL0tjb25maWc6Njpjb25maWcgVkxBTl84MDIxUVxcbm5ldC84MDIxcS9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIjgwMi4xUS84MDIuMWFkIFZMQU4gU3VwcG9ydFxcXCJcXG4tLVxcbm5ldC84MDIxcS9LY29uZmlnLTIxLVxcbm5ldC84MDIxcS9LY29uZmlnOjIyOmNvbmZpZyBWTEFOXzgwMjFRX0dWUlBcXG5uZXQvODAyMXEvS2NvbmZpZy0yMy1cXHRib29sIFxcXCJHVlJQIChHQVJQIFZMQU4gUmVnaXN0cmF0aW9uIFByb3RvY29sKSBzdXBwb3J0XFxcIlxcbi0tXFxubmV0LzgwMjFxL0tjb25maWctMzEtXFxubmV0LzgwMjFxL0tjb25maWc6MzI6Y29uZmlnIFZMQU5fODAyMVFfTVZSUFxcbm5ldC84MDIxcS9LY29uZmlnLTMzLVxcdGJvb2wgXFxcIk1WUlAgKE11bHRpcGxlIFZMQU4gUmVnaXN0cmF0aW9uIFByb3RvY29sKSBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0NjoxOC43NDUxODQ2NDZaIiwiU2VxIjo3MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTgxNDAyMDQyMzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyoqXG5cbk9rYXksIHNvIHdlJ3JlIGxvb2tpbmcgYXQgYFZMQU5fODAyMVFgLiBNeSBpbml0aWFsIHF1ZXN0aW9uIGlzIGlmIHRoaXMgaW52b2x2ZXMgYW55IG90aGVyIG1vZGlmaWVkIGZ1bmN0aW9ucywgYnV0IGl0J3MganVzdCBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gR29vZCwgdGhhdCBuYXJyb3dzIHRoZSBzY29wZS5cblxuTm93LCBsZXQncyBjb25maXJtIGlmIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gIGlzIGlubGluZWQuIEl0J3MgZGVmaW5lZCBpbiBgbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jYCBhbmQgY2FsbGVkIGZyb20gYG5ldC9icmlkZ2UvYnJfbmV0bGluay5jYCwgaW4gc2VwYXJhdGUgdHJhbnNsYXRpb24gdW5pdHMuIFNpbmNlIGl0J3Mgbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGlubGluZSBhbmQgd2UncmUgbm90IHVzaW5nIExpbmstVGltZSBPcHRpbWl6YXRpb24gKExUTyksIEkgY2FuIHJlYXNvbmFibHkgYXNzdW1lIGl0IHdvbid0IGJlIGlubGluZWQuIFRoaXMgbWFrZXMgaXQgYSBnb29kIHN5bWJvbCB0byBmb2N1cyBvbiBmb3IgYW5hbHlzaXMuXG5cblRpbWUgZm9yIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGludGVnZXIgcHJvbW90aW9uIHJ1bGVzLiBXZSBoYXZlIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIGJvdGggYHUxNmAuIFRoZWlyIGRpZmZlcmVuY2UgaXMgcHJvbW90ZWQgdG8gYGludGAuIFNpbWlsYXJseSwgYHRpbmZvX2N1cnItXHUwMDNldHVuaWRgIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAsIGJvdGggYHUzMmAsIGFuZCB0aGVpciBkaWZmZXJlbmNlIHJlbWFpbnMgYHUzMmAuIFRoZSBjb21wYXJpc29uIHVzZXMgYCE9YCBiZXR3ZWVuIHRoZSBgaW50YCByZXN1bHQgZnJvbSB0aGUgYHZpZGAgZGlmZmVyZW5jZSBhbmQgdGhlIGB1MzJgIHJlc3VsdCBmcm9tIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2U7IHRoaXMgbWVhbnMgdGhlIGBpbnRgIHdpbGwgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBgdTMyYCBmb3IgdGhlIGNvbXBhcmlzb24uXG5cbkxldCdzIHRlc3QgdGhpcyB3aXRoIHNwZWNpZmljIHZhbHVlcy4gSWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGlzIDEwLCB0aGUgYHZpZGAgZGlmZmVyZW5jZSBpcyAtMTAuIEFzIGEgYHUzMmAsIC0xMCBiZWNvbWVzIDQyOTQ5NjcyODYuIElmIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkYCBpcyAwIGFuZCBgdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAgaXMgMTAsIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgaXMgYWxzbyA0Mjk0OTY3Mjg2IChkdWUgdG8gdGhlIGB1MzJgIGFyaXRobWV0aWMpLiBUaHVzLCBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9ICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgIGlzIGA0Mjk0OTY3Mjg2ICE9IDQyOTQ5NjcyODZgLCB3aGljaCByZXNvbHZlcyB0byBGQUxTRS4gVGhhdCdzIGdvb2QsIGJlY2F1c2UgaXQgbWVhbnMgdGhlIGNvZGUgYnlwYXNzZXMgdGhlIGAtRUlOVkFMYCByZXR1cm4uXG5cblRoZSBuZXh0IHN0ZXBzIHNldCBgdGAgdG8gYHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgICh3aGljaCBpcyAxMCkgYW5kIHRoZW4gdGhlIGxvb3AgYGZvciAodiA9IDEwOyB2IFx1MDAzYz0gMDsgdisrKWAuIFRoZSBsb29wIGNvbmRpdGlvbiBgMTAgXHUwMDNjPSAwYCBpcyBGQUxTRSwgc28gdGhlIGxvb3AgZG9lc24ndCBleGVjdXRlIGF0IGFsbC4gVGhpcyBtZWFucyB0aGF0IHRoZSBgZXJyYCB2YXJpYWJsZSwgd2hpY2ggaXMgdXNlZCBsYXRlciwgaXMgbmV2ZXIgaW5pdGlhbGl6ZWQuIFRodXMsIGBpZiAoZXJyKWAgd2lsbCBldmFsdWF0ZSBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLCBhbmQgdGhpcyBpcyB0aGUgYnVnISBUaGF0J3MgaXQhXG5cbk15IGV4cGxhbmF0aW9uIGlzIHJvY2sgc29saWQsIG5vdyBJJ2xsIHVzZSBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjEzNSwiT3V0cHV0VG9rZW5zIjoyNDgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDk6MjAuMTQ3MjI5OTQ2WiIsIlNlcSI6NzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM1NzQ3NTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJSSURHRVwiLFxuICAgIFwiQlJJREdFX1ZMQU5fRklMVEVSSU5HXCIsXG4gICAgXCJWTEFOXzgwMjFRXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl92bGFuX3R1bm5lbF9pbmZvXCIsXG4gICAgXCJicl9wYXJzZV92bGFuX3R1bm5lbF9pbmZvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBLTVNBTiB1bmluaXQtdmFsdWUgYnVnIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBXaGVuIHByb2Nlc3NpbmcgYSBgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkRgIGF0dHJpYnV0ZSwgaWYgYSB1c2VyIHByb3ZpZGVzIGEgVkxBTiB0dW5uZWwgcmFuZ2Ugd2hlcmUgdGhlIGVuZCBgdmlkYCBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0IGB2aWRgLCBhbmQgdGhlIGB0dW5pZGAgZGlmZmVyZW5jZSBtYXRjaGVzIHRoZSBuZWdhdGl2ZSBgdmlkYCBkaWZmZXJlbmNlICh3aGljaCBpcyBwb3NzaWJsZSBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuc2lnbmVkIDMyLWJpdCBhcml0aG1ldGljIHdyYXAtYXJvdW5kKSwgdGhlIHZhbGlkYXRpb24gY2hlY2sgaXMgYnlwYXNzZWQuIENvbnNlcXVlbnRseSwgdGhlIHByb2Nlc3NpbmcgbG9vcCBleGVjdXRlcyB6ZXJvIHRpbWVzLCBsZWF2aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB1bmluaXRpYWxpemVkLiBUaGlzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXMgbGF0ZXIgZXZhbHVhdGVkIGFuZCBwb3RlbnRpYWxseSByZXR1cm5lZCB0byB1c2VyIHNwYWNlLCBjYXVzaW5nIGFuIGluZm9ybWF0aW9uIGxlYWsuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1ZyB3aXRoIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUklER0VcIixcbiAgICBcIkJSSURHRV9WTEFOX0ZJTFRFUklOR1wiLFxuICAgIFwiVkxBTl84MDIxUVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfdmxhbl90dW5uZWxfaW5mb1wiLFxuICAgIFwiYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgS01TQU4gdW5pbml0LXZhbHVlIGJ1ZyBpbiBgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvYC4gV2hlbiBwcm9jZXNzaW5nIGEgYEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EYCBhdHRyaWJ1dGUsIGlmIGEgdXNlciBwcm92aWRlcyBhIFZMQU4gdHVubmVsIHJhbmdlIHdoZXJlIHRoZSBlbmQgYHZpZGAgaXMgbGVzcyB0aGFuIHRoZSBzdGFydCBgdmlkYCwgYW5kIHRoZSBgdHVuaWRgIGRpZmZlcmVuY2UgbWF0Y2hlcyB0aGUgbmVnYXRpdmUgYHZpZGAgZGlmZmVyZW5jZSAod2hpY2ggaXMgcG9zc2libGUgZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIGFuZCB1bnNpZ25lZCAzMi1iaXQgYXJpdGhtZXRpYyB3cmFwLWFyb3VuZCksIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGlzIGJ5cGFzc2VkLiBDb25zZXF1ZW50bHksIHRoZSBwcm9jZXNzaW5nIGxvb3AgZXhlY3V0ZXMgemVybyB0aW1lcywgbGVhdmluZyB0aGUgYGVycmAgdmFyaWFibGUgdW5pbml0aWFsaXplZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGlzIGxhdGVyIGV2YWx1YXRlZCBhbmQgcG90ZW50aWFsbHkgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSwgY2F1c2luZyBhbiBpbmZvcm1hdGlvbiBsZWFrLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcgd2l0aCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ5OjIwLjIzMDgxMjEwN1oiLCJTZXEiOjczLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzEzNTQ5NTg5MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTRUMTQ6NDk6MjAuMjMxMzcwNDc3WiIsIlNlcSI6NzQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjMxMzU0OTAyNTcwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjAzOTc1NzBiMDczNDcxYjU5YjQ5NjJlY2JiYWU1NDAwNzA3MzJmMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDE0IDE0OjM1OjI3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG5pbmRleCA3MWExMmRhMzAwMDRjLi4wNWY1NjBlZWI3ODljIDEwMDY0NFxuLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rX3R1bm5lbC5jXG4rKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcbkBAIC0zMDEsNyArMzAxLDggQEAgaW50IGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsXG4gXG4gXHRcdGlmICghKHRpbmZvX2xhc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG4rXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcbitcdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPVxuIFx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldHVuaWQgLSB0aW5mb19sYXN0LVx1MDAzZXR1bmlkKSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdFx0dCA9IHRpbmZvX2xhc3QtXHUwMDNldHVuaWQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0OToyMC4yMzEzNzEzMTdaIiwiU2VxIjo3NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTkyOTI5OTA5NzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgS2VybmVsIEJyaWRnZSBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBicl9uZXRsaW5rX3R1bm5lbC5jYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGEgZnVuY3Rpb24gY2FsbGVkIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLiBUaGUgcGF0Y2ggc2VlbXMgdG8gYmUgbW9kaWZ5aW5nIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGUgbW9zdCBub3RhYmxlIGFkZGl0aW9uIGlzIGEgY2hlY2s6IGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIGJlZm9yZSBldmFsdWF0aW5nIHRoZSBkaWZmZXJlbmNlLiBNeSBpbml0aWFsIGltcHJlc3Npb24sIGNvbnNpZGVyaW5nIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0LCBpcyB0aGF0IHRoaXMgaXMgbGlrZWx5IGFuIGF0dGVtcHQgdG8gZ3VhcmQgYWdhaW5zdCBpbnRlZ2VyIHVuZGVyZmxvdyBvciBvdmVyZmxvdy4gVGhhdCdzIGEgY2xhc3NpYyB2dWxuZXJhYmlsaXR5IHR5cGUgaW4ga2VybmVsIGNvZGUsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIHNjcnV0aW5pemUgdGhpcyBjaGFuZ2UuIEkgc2hvdWxkIHByb2JhYmx5IGRpdmUgZGVlcGVyIGludG8gdGhlIGNvZGUgb2YgYGJyX3Byb2Nlc3Nfdmxhbl90dW5uZWxfaW5mb2AgYW5kIHRoZSBzdXJyb3VuZGluZyBsb2dpYyB0byB1bmRlcnN0YW5kIHRoZSB2dWxuZXJhYmlsaXR5IHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhbmQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXggaXMgY29ycmVjdCBhbmQgc3VmZmljaWVudGx5IHJvYnVzdC4gTGV0J3Mgc3RhcnQgd2l0aCB0aGF0IGZ1bmN0aW9uLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNDUsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjQ5OjM5LjUyNDM2NjE2MloiLCJTZXEiOjc2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDQzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX25ldGxpbmtfdHVubmVsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjgwOlxcdG91dF9pbml0OlxcbiAyODE6XFx0XFx0Lyogd2Ugc3RhcnQgYSByYW5nZSBvbmx5IGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyB0byBub3RpZnkgYWJvdXQgKi9cXG4gMjgyOlxcdFxcdCp2X3N0YXJ0ID0gY3Vycl9jaGFuZ2UgPyB2IDogTlVMTDtcXG4gMjgzOlxcdFxcdCp2X2VuZCA9ICp2X3N0YXJ0O1xcbiAyODQ6XFx0fVxcbiAyODU6XFx0XFxuIDI4NjpcXHRpbnQgYnJfcHJvY2Vzc192bGFuX3R1bm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicixcXG4gMjg3OlxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGludCBjbWQsXFxuIDI4ODpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvICp0aW5mb19jdXJyLFxcbiAyODk6XFx0XFx0XFx0XFx0XFx0c3RydWN0IHZ0dW5uZWxfaW5mbyAqdGluZm9fbGFzdCxcXG4gMjkwOlxcdFxcdFxcdFxcdFxcdGJvb2wgKmNoYW5nZWQpXFxuIDI5MTpcXHR7XFxuIDI5MjpcXHRcXHRpbnQgZXJyO1xcbiAyOTM6XFx0XFxuIDI5NDpcXHRcXHRpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7XFxuIDI5NTpcXHRcXHRcXHRpZiAodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKVxcbiAyOTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDI5NzpcXHRcXHRcXHRtZW1jcHkodGluZm9fbGFzdCwgdGluZm9fY3Vyciwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMjk4OlxcdFxcdH0gZWxzZSBpZiAodGluZm9fY3Vyci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0VORCkge1xcbiAyOTk6XFx0XFx0XFx0c3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdl9zdGFydCA9IE5VTEwsICp2X2VuZCA9IE5VTEw7XFxuIDMwMDpcXHRcXHRcXHRpbnQgdCwgdjtcXG4gMzAxOlxcdFxcbiAzMDI6XFx0XFx0XFx0aWYgKCEodGluZm9fbGFzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSlcXG4gMzAzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDQ6XFx0XFx0XFx0aWYgKHRpbmZvX2N1cnItXFx1MDAzZXZpZCBcXHUwMDNjIHRpbmZvX2xhc3QtXFx1MDAzZXZpZCB8fFxcbiAzMDU6XFx0XFx0XFx0ICAgICh0aW5mb19jdXJyLVxcdTAwM2V2aWQgLSB0aW5mb19sYXN0LVxcdTAwM2V2aWQpICE9XFxuIDMwNjpcXHRcXHRcXHQgICAgKHRpbmZvX2N1cnItXFx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQpKVxcbiAzMDc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDMwODpcXHRcXHRcXHR0ID0gdGluZm9fbGFzdC1cXHUwMDNldHVuaWQ7XFxuIDMwOTpcXHRcXHRcXHRmb3IgKHYgPSB0aW5mb19sYXN0LVxcdTAwM2V2aWQ7IHYgXFx1MDAzYz0gdGluZm9fY3Vyci1cXHUwMDNldmlkOyB2KyspIHtcXG4gMzEwOlxcdFxcdFxcdFxcdGJvb2wgY3Vycl9jaGFuZ2UgPSBmYWxzZTtcXG4gMzExOlxcdFxcbiAzMTI6XFx0XFx0XFx0XFx0ZXJyID0gYnJfdmxhbl90dW5uZWxfaW5mbyhwLCBjbWQsIHYsIHQsIFxcdTAwMjZjdXJyX2NoYW5nZSk7XFxuIDMxMzpcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbiAzMTQ6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDMxNTpcXHRcXHRcXHRcXHR0Kys7XFxuIDMxNjpcXHRcXG4gMzE3OlxcdFxcdFxcdFxcdGlmIChjdXJyX2NoYW5nZSlcXG4gMzE4OlxcdFxcdFxcdFxcdFxcdCpjaGFuZ2VkID0gY3Vycl9jaGFuZ2U7XFxuIDMxOTpcXHRcXHRcXHRcXHRfX3ZsYW5fdHVubmVsX2hhbmRsZV9yYW5nZShwLCBcXHUwMDI2dl9zdGFydCwgXFx1MDAyNnZfZW5kLCB2LFxcbiAzMjA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgY3Vycl9jaGFuZ2UpO1xcbiAzMjE6XFx0XFx0XFx0fVxcbiAzMjI6XFx0XFx0XFx0aWYgKHZfc3RhcnQgXFx1MDAyNlxcdTAwMjYgdl9lbmQpXFxuIDMyMzpcXHRcXHRcXHRcXHRicl92bGFuX25vdGlmeShiciwgcCwgdl9zdGFydC1cXHUwMDNldmlkLCB2X2VuZC1cXHUwMDNldmlkLFxcbiAzMjQ6XFx0XFx0XFx0XFx0XFx0ICAgICAgIFJUTV9ORVdWTEFOKTtcXG4gMzI1OlxcdFxcdFxcdGlmIChlcnIpXFxuIDMyNjpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAzMjc6XFx0XFxuIDMyODpcXHRcXHRcXHRtZW1zZXQodGluZm9fbGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2dHVubmVsX2luZm8pKTtcXG4gMzI5OlxcdFxcdFxcdG1lbXNldCh0aW5mb19jdXJyLCAwLCBzaXplb2Yoc3RydWN0IHZ0dW5uZWxfaW5mbykpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo0OTozOS41MjQ0NDgxNzNaIiwiU2VxIjo3NywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQzNTc1Mjk5OTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCdzIEludGVnZXIgT3ZlcmZsb3cgUHJldmVudGlvbioqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBjaGVjazogYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAgKmJlZm9yZSogdGhlIG1haW4gY29tcGFyaXNvbjogYCh0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkKSAhPSAodGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWQpYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBkZXNpZ25lZCB0byBoZWFkIG9mZiBhIHBvdGVudGlhbCBpbnRlZ2VyIHVuZGVyZmxvdy4gSWYgYHRpbmZvX2N1cnItXHUwMDNldmlkYCBpcyBsZXNzIHRoYW4gYHRpbmZvX2xhc3QtXHUwMDNldmlkYCwgdGhlIHN1YnRyYWN0aW9uIGB0aW5mb19jdXJyLVx1MDAzZXZpZCAtIHRpbmZvX2xhc3QtXHUwMDNldmlkYCB3b3VsZCByZXN1bHQgaW4gYSBuZWdhdGl2ZSB2YWx1ZS4gIEJ1dCwgYW5kIHRoaXMgaXMgY3J1Y2lhbCwgaXQncyBoaWdobHkgcHJvYmFibGUgdGhhdCBgdmlkYCBpcyBhbiAqdW5zaWduZWQqIGludGVnZXIuIEdpdmVuIHRoYXQsIHRoYXQgXCJuZWdhdGl2ZVwiIGRpZmZlcmVuY2Ugd291bGQgYWN0dWFsbHkgd3JhcCBhcm91bmQsIGxlYWRpbmcgdG8gYSBtdWNoIGxhcmdlciBwb3NpdGl2ZSB2YWx1ZSBkdWUgdG8gdGhlIHdheSB1bnNpZ25lZCBhcml0aG1ldGljIHdvcmtzLiBUaGUgbmV3IGNoZWNrIHNlZW1zIHRvIHByZXZlbnQgdGhhdCB3aG9sZSB3cmFwLWFyb3VuZCBzY2VuYXJpby4gSSdtIHByZXR0eSBzdXJlIEkndmUgc2VlbiBgdmlkYCBkZWZpbmVkIGFzIHNvbWV0aGluZyBsaWtlIGEgYHUxNmAgYmVmb3JlLCB3aGljaCB3b3VsZCBjb25maXJtIHRoYXQgdW5zaWduZWQgYmVoYXZpb3IuIEp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQncyB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgYHN0cnVjdCB2dHVubmVsX2luZm9gIGRlZmluaXRpb24gdG8gY29uZmlybSB0aGUgYHZpZGAgdHlwZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzEzNCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjUxOjAzLjg4MTk4MzExNloiLCJTZXEiOjc4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjYyNDA3NzA3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgdnR1bm5lbF9pbmZvIFxcXFx7XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9icmlkZ2UvYnJfcHJpdmF0ZV90dW5uZWwuaC0xMS1cXG5uZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmg6MTI6c3RydWN0IHZ0dW5uZWxfaW5mbyB7XFxubmV0L2JyaWRnZS9icl9wcml2YXRlX3R1bm5lbC5oLTEzLVxcdHUzMlxcdHR1bmlkO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo1MTowNi41MDYwNjY1OTRaIiwiU2VxIjo3OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTY1OTM5MzcyMTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVkxBTiBUdW5uZWwgSW5mb3JtYXRpb24gUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGludHJvZHVjaW5nIGEgY2hlY2sgd2l0aGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm9gLCBzcGVjaWZpY2FsbHkgYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAuIFRoZSBnb2FsIGlzIHRvIHByZXZlbnQgYSBwb3RlbnRpYWxseSBuYXN0eSBzaXR1YXRpb24gd2l0aGluIHRoYXQgYGZvcmAgbG9vcC4gTGV0IG1lIHJlZnJlc2ggbXkgbWVtb3J5OyB0aGUgcmVsZXZhbnQgY29kZSBibG9jayBpczpcblxuYGBgY1xuXHRcdGlmICh0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWQgfHxcblx0XHQgICAgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9XG5cdFx0ICAgICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZCkpXG5cdFx0XHRyZXR1cm4gLUVJTlZBTDtcblx0XHR0ID0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZDtcblx0XHRmb3IgKHYgPSB0aW5mb19sYXN0LVx1MDAzZXZpZDsgdiBcdTAwM2M9IHRpbmZvX2N1cnItXHUwMDNldmlkOyB2KyspIHtcbmBgYFxuXG5Jbml0aWFsbHksIG15IHRob3VnaHQgd2FzLCBpZiBgdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCB0aGF0IGxvb3Agd291bGQgZWl0aGVyIG5vdCBleGVjdXRlIGF0IGFsbCwgb3IgcG9zc2libHkgY2F1c2UgaW50ZWdlciB1bmRlcmZsb3cgaWYgYHZgIHdlcmUgdW5zaWduZWQsIGFuZCBlbmQgdXAgbG9vcGluZyBhbiBleGNlc3NpdmUgbnVtYmVyIG9mIHRpbWVzLiBJIHJlbWVtYmVyZWQgYHZgIGlzIGFuIGBpbnRgLCBzbyB0aGUgbG9vcCB3b3VsZCBzaW1wbHkgbm90IGV4ZWN1dGUgd2hlbiBgdGluZm9fY3Vyci1cdTAwM2V2aWRgIGlzIGxlc3MgdGhhbiBgdGluZm9fbGFzdC1cdTAwM2V2aWRgLiBCdXQgdGhlbiBJIHJlYWxpemVkLCB0aGlzIGNoZWNrIGlzIHN0aWxsIGltcG9ydGFudCBiZWNhdXNlIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgYW5kIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAgYXJlIGB1MTZgIHR5cGVzLCB3aGljaCBpcyByZWxldmFudCBpbiBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0uIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgSSdtIHVuZGVyc3RhbmRpbmcgdGhlIGRhdGEgdHlwZXMgY29ycmVjdGx5IHRvIGZ1bGx5IGdyYXNwIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIG9mIHRoaXMgY29uZGl0aW9uLiBJIG5lZWQgdG8gY2hlY2sgdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB2dHVubmVsX2luZm9gIHRvIGNvbmZpcm0gdGhvc2UgZGF0YSB0eXBlcyBhbmQgdGhlIGludGVuZGVkIGJlaGF2aW9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNDk1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjUzOjUyLjQ0NTQ0MjMyMloiLCJTZXEiOjgwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDk3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYnJpZGdlL2JyX3ByaXZhdGVfdHVubmVsLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTAsXG4gIFwiTGluZUNvdW50XCI6IDEwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMTA6XFx0I2RlZmluZSBfQlJfUFJJVkFURV9UVU5ORUxfSFxcbiAgMTE6XFx0XFxuICAxMjpcXHRzdHJ1Y3QgdnR1bm5lbF9pbmZvIHtcXG4gIDEzOlxcdFxcdHUzMlxcdHR1bmlkO1xcbiAgMTQ6XFx0XFx0dTE2XFx0dmlkO1xcbiAgMTU6XFx0XFx0dTE2XFx0ZmxhZ3M7XFxuICAxNjpcXHR9O1xcbiAgMTc6XFx0XFxuICAxODpcXHQvKiBicl9uZXRsaW5rX3R1bm5lbC5jICovXFxuICAxOTpcXHRpbnQgYnJfcGFyc2Vfdmxhbl90dW5uZWxfaW5mbyhzdHJ1Y3QgbmxhdHRyICphdHRyLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNFQxNDo1Mzo1Mi40NDU1MTg3NzJaIiwiU2VxIjo4MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEzMzQ4NTQ1NjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFZMQU4gVHVubmVsIEluZm8gUGF0Y2gqKlxuXG5Pa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIGFkZGluZyBhIGNoZWNrIGluIGBicl9wcm9jZXNzX3ZsYW5fdHVubmVsX2luZm8oKWAgc3BlY2lmaWNhbGx5OiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgXHUwMDNjIHRpbmZvX2xhc3QtXHUwMDNldmlkYC4gIEkgc2VlIHRoYXQgaXQncyBkZXNpZ25lZCB0byBmaXggYSBzdWJ0bGUgbG9naWMgZmxhdywgYW5kIEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIGl0J3MgbmVlZGVkLlxuXG5Jbml0aWFsbHksIHRoZSBjb2RlIHdhcyBjb21wYXJpbmcgdGhlIGRpZmZlcmVuY2VzIG9mIGB2aWRgIGFuZCBgdHVuaWRgOiBgKHRpbmZvX2N1cnItXHUwMDNldmlkIC0gdGluZm9fbGFzdC1cdTAwM2V2aWQpICE9ICh0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZClgLiBgdmlkYCBpcyBhIGB1MTZgLCBhbmQgYHR1bmlkYCBpcyBhIGB1MzJgLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGF0IGlmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBzdWJ0cmFjdGlvbiBgdGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZGAgd2lsbCAqdW5kZXJmbG93Ki4gSG93ZXZlciwgYmVjYXVzZSB0aGUgYHUxNmAgdHlwZXMgYXJlIHByb21vdGVkIHRvIGBpbnRgIGR1cmluZyB0aGUgc3VidHJhY3Rpb24sIHRoZSByZXN1bHQgd2lsbCBiZSBhIG5lZ2F0aXZlIGBpbnRgLiAgSSBrbm93IHRoYXQgY29tcGFyaXNvbiBgIT1gIHdpbGwgY29lcmNlIHRoYXQgYGludGAgdG8gYSBgdTMyYC4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBjYXVzZSBzb21lIGludGVyZXN0aW5nIGJlaGF2aW9yLlxuXG5JZiB0aGlzIHVuZGVyZmxvdyBoYXBwZW5zLCBhbmQgdGhlIHJlc3VsdCwgdGhlIG5lZ2F0aXZlIGBpbnRgLCBiZWNvbWVzIGEgdmVyeSBsYXJnZSBgdTMyYCB2YWx1ZSBkdWUgdG8gdGhlIGNvbnZlcnNpb24gdG8gdW5zaWduZWQuIEFuZCBpZiwgc29tZWhvdywgdGhlIGB0aW5mb19jdXJyLVx1MDAzZXR1bmlkIC0gdGluZm9fbGFzdC1cdTAwM2V0dW5pZGAgY2FsY3VsYXRpb24gaGFwcGVucyB0byAqYWxzbyogeWllbGQgdGhhdCBzYW1lIGxhcmdlIGB1MzJgIHZhbHVlLCB0aGUgaW5lcXVhbGl0eSB3b3VsZCBiZSBmYWxzZWx5IGV2YWx1YXRlZCBhcyB0cnVlISBUaGlzIHRoZW4gbGVhZHMgdG8gYW4gaW50ZXJlc3RpbmcgY2FzZTogdGhlIGxvb3AgYGZvciAodiA9IHRpbmZvX2xhc3QtXHUwMDNldmlkOyB2IFx1MDAzYz0gdGluZm9fY3Vyci1cdTAwM2V2aWQ7IHYrKylgIG1pZ2h0IHNraXAgZW50aXJlbHksIGJlY2F1c2UgdGhlIGxvb3AgY29uZGl0aW9uIHdvdWxkIG5vdCBiZSBtZXQuIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZGAgaXMgbGVzcyB0aGFuIGB0aW5mb19sYXN0LVx1MDAzZXZpZGAsIHRoZSBsb29wIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZXMgYmVjYXVzZSB0aGUgc3RhcnQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBlbmQgdmFsdWUuXG5cbk9rYXksIHNvIEkgdW5kZXJzdGFuZCB0aGUgbG9naWMgZmxvdyBoZXJlLiBNeSBjb25jZXJuIHJpZ2h0IG5vdyBpcyBpcyB0aGlzIGEgY2FzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeT8gTm8sIGB0aW5mb19jdXJyYCBhbmQgYHRpbmZvX2xhc3RgIGFyZSBwb3B1bGF0ZWQgZnJvbSBuZXRsaW5rIGF0dHJpYnV0ZXMuIFRoZXkncmUgZWl0aGVyIGZ1bGx5IGluaXRpYWxpemVkIG9yIHZhbGlkYXRlZCBzbyB0aGVyZSdzIG5vIHdheSB0aGVyZSdzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB3b3JyeSBhYm91dCwgYW5kIHRoaXMgcGF0Y2ggaXNuJ3QgYWJvdXQgdGhhdC5cblxuVGhlIHBhdGNoIGFwcGVhcnMgdG8gZml4IGEgbG9naWMgZXJyb3IsIHdoZXJlIHRoaXMgbmVnYXRpdmUgcmFuZ2UgY29uZGl0aW9uICggYHRpbmZvX2N1cnItXHUwMDNldmlkIFx1MDAzYyB0aW5mb19sYXN0LVx1MDAzZXZpZGAgKSBjb3VsZCBiZSB0cnVlIGFuZCBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IuIFNwZWNpZmljYWxseSwgdGhlIGxvb3AgaXMgc2tpcHBlZCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgKHN1Y2Nlc3MpIGV2ZW4gdGhvdWdoIGl0J3MgZWZmZWN0aXZlbHkgZG9pbmcgKm5vdGhpbmcqIHdpdGggYW4gaW52YWxpZCByYW5nZS4gIEl0IHNob3VsZCByZWFsbHkgYmUgcmV0dXJuaW5nIGFuIGVycm9yIGNvZGUuIGBFSU5WQUxgIGlzIHByb2JhYmx5IHRoZSByaWdodCBjaG9pY2UuXG5cblNvLCB0aGUgcGF0Y2ggaXMgYWRkaW5nIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgIHRvIGV4cGxpY2l0bHkgcmV0dXJuIGAtRUlOVkFMYC4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgbG9naWMgYnVnLCBub3QgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYnVnLlxuXG5TbywgbGV0J3MgbmFpbCB0aGlzIGRvd24uIElmIGB0aW5mb19jdXJyLVx1MDAzZXZpZCBcdTAwM2MgdGluZm9fbGFzdC1cdTAwM2V2aWRgLCBgdGluZm9fY3Vyci1cdTAwM2V2aWQgLSB0aW5mb19sYXN0LVx1MDAzZXZpZGAgaXMgbmVnYXRpdmUuIEFuZCBpZiBgdGluZm9fY3Vyci1cdTAwM2V0dW5pZCAtIHRpbmZvX2xhc3QtXHUwMDNldHVuaWRgIGFsc28gaGFwcGVucyB0byBlcXVhbCB0aGUgc2FtZSBuZWdhdGl2ZSB2YWx1ZSwgdGhlIGluZXF1YWxpdHkgcGFzc2VzLiBUaGlzIHJlc3VsdHMgaW4gdGhlIGxvb3AgYmVpbmcgc2tpcHBlZCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5pbmcgMCwgZXZlbiB0aG91Z2ggaXQgKnNob3VsZG4ndCouIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgd2hpY2ggY291bGQgYnlwYXNzIHNvbWUgaW1wb3J0YW50IHZhbGlkYXRpb24uIEkgc3RpbGwgZG9uJ3Qgc2VlIGFueSBzaWduIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gS0FTQU4gb3Igc3RhbmRhcmQgdGVzdGluZyBtaWdodCBub3QgY2F0Y2ggdGhpcywgYnV0IGl04oCZcyBkZWZpbml0ZWx5IG5vdCBhIEtNU0FOIGlzc3VlLiBLTVNBTiBpcyBmb3IgZGV0ZWN0aW5nIG1lbW9yeSBpc3N1ZXMuXG5cblNpbmNlIHRoaXMgaXNuJ3QgYSBLTVNBTiBpc3N1ZSBJIGFtIGdvaW5nIHRvIHNldCBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cbkkgYW0gcmUtZXhhbWluaW5nIHRoZSBzaXR1YXRpb24sIGFuZCBJIGFtIHJlLWl0ZXJhdGluZyB0aGF0IHRoZSBjaGVjayBpcyBhZGRlZCB0byBwcmV2ZW50IG5lZ2F0aXZlIHJhbmdlIGxvb3BzIGZyb20gcnVubmluZy4gU28sIG5vLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuIFRoaXMgcGF0Y2ggcHJldmVudHMgbmVnYXRpdmUgcmFuZ2VzLiBTbyBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwNDMsIk91dHB1dFRva2VucyI6MTUwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTE2MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE0VDE0OjU0OjMzLjc4MDM3NTgxN1oiLCJTZXEiOjgyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIHZhbGlkYXRpb24gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFZMQU4gSUQgb2YgdGhlIGN1cnJlbnQgdHVubmVsIGluZm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgVkxBTiBJRCBvZiB0aGUgbGFzdCB0dW5uZWwgaW5mbyAocHJldmVudGluZyBhIG5lZ2F0aXZlIHJhbmdlKS4gVGhpcyBmaXhlcyBhIGxvZ2ljIGJ1ZyB3aGVyZSBhIG5lZ2F0aXZlIHJhbmdlIGNvdWxkIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbiBjaGVjayBkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gYW5kIHVuZGVyZmxvdywgbGVhZGluZyB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVkxBTiB0dW5uZWwgcmFuZ2VzLiBUaGlzIGlzc3VlIGRvZXMgbm90IGludm9sdmUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb250cm9sIGZsb3cuIEl0IGlzIGEgbG9naWMgYW5kIGJvdW5kcy1jaGVja2luZyBpc3N1ZS4gVGhlcmVmb3JlLCBLTVNBTiBpcyBub3QgcmVxdWlyZWQsIGFzIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[1] Phase: Succeeded StartedAt: 2026-08-14 14:54:44 +0000 UTC FinishedAt: 2026-08-14 14:54:44 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-14 14:54:44 +0000 UTC FinishedAt: 2026-08-14 14:54:44 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2] Phase: Succeeded StartedAt: 2026-08-14 14:54:44 +0000 UTC FinishedAt: 2026-08-14 18:47:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-14 14:54:44 +0000 UTC FinishedAt: 2026-08-14 18:47:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-14 14:54:44 +0000 UTC FinishedAt: 2026-08-14 14:54:54 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-14 14:54:44 +0000 UTC FinishedAt: 2026-08-14 14:54:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workfloww7lzt/series-workfloww7lzt-convert-artifact-3761976047/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-14 14:54:54 +0000 UTC FinishedAt: 2026-08-14 15:14:50 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-14 14:54:54 +0000 UTC FinishedAt: 2026-08-14 15:14:50 +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:*32c13946-7fb5-45ab-9caf-c1acd38ccd4f,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-workfloww7lzt/series-workfloww7lzt-convert-artifact-3761976047/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": "e8f63033-3e82-4b5e-8785-730bfcbba5e6", "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-workfloww7lzt/series-workfloww7lzt-build-action-1480191925/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-14 14:54:54 +0000 UTC FinishedAt: 2026-08-14 15:14:40 +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:*32c13946-7fb5-45ab-9caf-c1acd38ccd4f,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-workfloww7lzt/series-workfloww7lzt-convert-artifact-3761976047/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": "e8f63033-3e82-4b5e-8785-730bfcbba5e6", "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-workfloww7lzt/series-workfloww7lzt-build-action-1480191925/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-14 15:14:50 +0000 UTC FinishedAt: 2026-08-14 15:14:50 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-14 15:14:50 +0000 UTC FinishedAt: 2026-08-14 15:14:50 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-14 15:14:50 +0000 UTC FinishedAt: 2026-08-14 15:15:00 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-14 15:14:50 +0000 UTC FinishedAt: 2026-08-14 15:14:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workfloww7lzt/series-workfloww7lzt-convert-artifact-1861564990/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-14 15:15:00 +0000 UTC FinishedAt: 2026-08-14 15:16:52 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-14 15:15:00 +0000 UTC FinishedAt: 2026-08-14 15:16:42 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*e8f63033-3e82-4b5e-8785-730bfcbba5e6,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-workfloww7lzt/series-workfloww7lzt-build-action-1480191925/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-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-14 15:16:52 +0000 UTC FinishedAt: 2026-08-14 15:16:52 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-14 15:16:52 +0000 UTC FinishedAt: 2026-08-14 15:16:52 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-14 15:16:52 +0000 UTC FinishedAt: 2026-08-14 15:40:12 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-14 15:16:52 +0000 UTC FinishedAt: 2026-08-14 15:40:12 +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:*32c13946-7fb5-45ab-9caf-c1acd38ccd4f,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-workfloww7lzt/series-workfloww7lzt-convert-artifact-1861564990/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": "a7644bd1-f89c-4f4a-a22c-fd9e086e1af1", "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-workfloww7lzt/series-workfloww7lzt-build-action-3914331026/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-14 15:16:52 +0000 UTC FinishedAt: 2026-08-14 15:40:02 +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:*32c13946-7fb5-45ab-9caf-c1acd38ccd4f,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-workfloww7lzt/series-workfloww7lzt-convert-artifact-1861564990/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": "a7644bd1-f89c-4f4a-a22c-fd9e086e1af1", "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-workfloww7lzt/series-workfloww7lzt-build-action-3914331026/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-14 15:40:12 +0000 UTC FinishedAt: 2026-08-14 15:40:12 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-14 15:40:12 +0000 UTC FinishedAt: 2026-08-14 15:40:12 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-14 15:40:12 +0000 UTC FinishedAt: 2026-08-14 15:42:24 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-14 15:40:12 +0000 UTC FinishedAt: 2026-08-14 15:42:15 +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:*a7644bd1-f89c-4f4a-a22c-fd9e086e1af1,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-workfloww7lzt/series-workfloww7lzt-build-action-3914331026/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-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-14 15:42:24 +0000 UTC FinishedAt: 2026-08-14 18:47:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-14 15:42:24 +0000 UTC FinishedAt: 2026-08-14 18:47:18 +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":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"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:*e8f63033-3e82-4b5e-8785-730bfcbba5e6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a7644bd1-f89c-4f4a-a22c-fd9e086e1af1,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-workfloww7lzt/series-workfloww7lzt-build-action-1480191925/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-workfloww7lzt/series-workfloww7lzt-build-action-3914331026/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-14 15:42:24 +0000 UTC FinishedAt: 2026-08-14 15:42:34 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-14 15:42:24 +0000 UTC FinishedAt: 2026-08-14 15:42:31 +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":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"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-workfloww7lzt/series-workfloww7lzt-convert-artifact-1991632195/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-14 15:42:24 +0000 UTC FinishedAt: 2026-08-14 15:42:24 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-14 15:42:24 +0000 UTC FinishedAt: 2026-08-14 15:42:24 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-14 15:42:24 +0000 UTC FinishedAt: 2026-08-14 15:42:24 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-14 15:42:34 +0000 UTC FinishedAt: 2026-08-14 18:47:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww7lzt[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["br_process_vlan_tunnel_info","br_vlan_tunnel_info","br_parse_vlan_tunnel_info"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"c4f6916a99cf105c3ff340b6210fcbba3fa66b35","config_name":"upstream-apparmor-kasan.config","enable_configs":["BRIDGE","BRIDGE_VLAN_FILTERING","VLAN_8021Q"],"series_id":"4f5e1571-6e90-43e8-b792-a5a9d8e36f8d","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-14 15:42:34 +0000 UTC FinishedAt: 2026-08-14 18:47:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*e8f63033-3e82-4b5e-8785-730bfcbba5e6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a7644bd1-f89c-4f4a-a22c-fd9e086e1af1,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-workfloww7lzt/series-workfloww7lzt-build-action-1480191925/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-workfloww7lzt/series-workfloww7lzt-build-action-3914331026/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-workfloww7lzt/series-workfloww7lzt-convert-artifact-1991632195/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,}