Name: series-workflowznqlz Phase: Succeeded StartedAt: 2026-08-06 08:26:09 +0000 UTC FinishedAt: 2026-08-06 12:16:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[0] Phase: Succeeded StartedAt: 2026-08-06 08:26:09 +0000 UTC FinishedAt: 2026-08-06 08:30:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[0].run-triage Phase: Succeeded StartedAt: 2026-08-06 08:26:09 +0000 UTC FinishedAt: 2026-08-06 08:30:49 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "8cd9520d35a6c38db6567e97dd93b1f11f185dc6", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION", "CXL_BUS", "CXL_REGION", "DEV_DAX", "DEV_DAX_KMEM", "MEMORY_HOTPLUG" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "8cd9520d35a6c38db6567e97dd93b1f11f185dc6", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION", "CXL_BUS", "CXL_REGION", "DEV_DAX", "DEV_DAX_KMEM", "MEMORY_HOTPLUG" ], "series_id": "9d000881-72ed-42e7-9fb5-8f981b017848" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "mp_add_package_node", "mp_add_package_node_by_initiator", "mp_get_package_nodes", "mp_get_package_cpu_nodes", "mp_get_package_memory_only_nodes", "mp_next_demotion_nodemask", "mp_next_demotion_node", "mp_next_promotion_nodemask", "mp_next_promotion_node", "mp_is_topology_symmetric", "nearest_nodes_nodemask", "mp_probe_package_id", "register_mp_package_notifier", "unregister_mp_package_notifier" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OywKICAgICYjMzQ7Q1hMX0JVUyYjMzQ7LAogICAgJiMzNDtDWExfUkVHSU9OJiMzNDssCiAgICAmIzM0O0RFVl9EQVgmIzM0OywKICAgICYjMzQ7REVWX0RBWF9LTUVNJiMzNDssCiAgICAmIzM0O01FTU9SWV9IT1RQTFVHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZSYjMzQ7LAogICAgJiMzNDttcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvciYjMzQ7LAogICAgJiMzNDttcF9nZXRfcGFja2FnZV9ub2RlcyYjMzQ7LAogICAgJiMzNDttcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayYjMzQ7LAogICAgJiMzNDttcF9uZXh0X2RlbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9wcm9tb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDttcF9pc190b3BvbG9neV9zeW1tZXRyaWMmIzM0OywKICAgICYjMzQ7bmVhcmVzdF9ub2Rlc19ub2RlbWFzayYjMzQ7LAogICAgJiMzNDttcF9wcm9iZV9wYWNrYWdlX2lkJiMzNDssCiAgICAmIzM0O3JlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXImIzM0OywKICAgICYjMzQ7dW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3kgY29uY2VwdCBmb3IgTlVNQSBub2RlcywgbW9kaWZ5aW5nIGNvcmUgbWVtb3J5IHRpZXJpbmcsIG1lbXBvbGljeSwgYW5kIENYTCByZWdpb24gaGFuZGxpbmcuIEl0IGFkZHMgbmV3IHN5c2ZzIGludGVyZmFjZXMgYW5kIGEgbmV3IG1lbXBvbGljeSB3ZWlnaHRlZCBpbnRlcmxlYXZlIG1vZGUsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyNWEyYTJhYWM2NDliY2FiNmY0MGMxZGM2ZmZhYTM1MTEwZWRhYjdhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgNiAwODoyODoyNSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2UgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2Vcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTAwZjllNWZmMTllXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2VcbkBAIC0wLDAgJiM0MzsxLDM1IEBAXG4mIzQzO1doYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9cbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRNZW1vcnkgcGFja2FnZSB0b3BvbG9neVxuJiM0MztcbiYjNDM7XHRcdEEgXCYjMzQ7bWVtb3J5IHBhY2thZ2VcJiMzNDsgZ3JvdXBzIHRoZSBOVU1BIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBvbmVcbiYjNDM7XHRcdHBoeXNpY2FsIENQVSBwYWNrYWdlIChzb2NrZXQpOiB0aGUgbm9kZXMgdGhhdCBoYXZlIENQVXMgYW5kXG4mIzQzO1x0XHR0aGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTCBvciBIQk0pLlxuJiM0MztcbiYjNDM7XHRcdEFsbCBhdHRyaWJ1dGVzIGFyZSByZWFkLW9ubHk7IHRoZSB0b3BvbG9neSBjYW5ub3QgYmVcbiYjNDM7XHRcdG92ZXJyaWRkZW4gZnJvbSB1c2VyIHNwYWNlLlxuJiM0MztcbiYjNDM7V2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXNcbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0IGZvcm1hdFxuJiM0MztcdFx0KGUuZy4gXCYjMzQ7MCwyXCYjMzQ7KS5cbiYjNDM7XG4mIzQzO1doYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9wYWNrYWdlX2NwdV9ub2Rlc1xuJiM0MztEYXRlOlx0XHRBdWd1c3QgMjAyNlxuJiM0MztDb250YWN0Olx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuJiM0MztEZXNjcmlwdGlvbjpcdFRoZSBub2RlcyB0aGF0IGhhdmUgQ1BVcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0XG4mIzQzO1x0XHRmb3JtYXQuXG4mIzQzO1xuJiM0MztXaGF0Olx0XHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGFja2FnZV9tZW1fb25seV9ub2Rlc1xuJiM0MztEYXRlOlx0XHRBdWd1c3QgMjAyNlxuJiM0MztDb250YWN0Olx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuJiM0MztEZXNjcmlwdGlvbjpcdFRoZSBub2RlcyB0aGF0IG9ubHkgaGF2ZSBtZW1vcnkgKGUuZy4gQ1hML0hCTSkgaW4gdGhpc1xuJiM0MztcdFx0cGFja2FnZSwgaW4gbm9kZWxpc3QgZm9ybWF0LlxuJiM0MztcbiYjNDM7V2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BoeXNpY2FsX3BhY2thZ2VfaWRcbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRUaGUgcGh5c2ljYWwgcGFja2FnZSBpZCB0aGlzIGdyb3VwIGNvcnJlc3BvbmRzIHRvLCBhc1xuJiM0MztcdFx0cmVwb3J0ZWQgYnkgQ1BVIHRvcG9sb2d5LlxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbkBAIC01MiwzICYjNDM7NTIsMjAgQEAgRGVzY3JpcHRpb246XHRBdXRvLXdlaWdodGluZyBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuIFxuIFx0XHRXcml0aW5nIGEgbmV3IHdlaWdodCB0byBhIG5vZGUgZGlyZWN0bHkgdmlhIHRoZSBub2RlTiBpbnRlcmZhY2VcbiBcdFx0d2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRoZSBzeXN0ZW0gdG8gbWFudWFsIG1vZGUuXG4mIzQzO1xuJiM0MztXaGF0Olx0XHQvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVcbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRQYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgdG9nZ2xlXG4mIzQzO1xuJiM0MztcdFx0JiMzOTt0cnVlJiMzOTsgcmVzdHJpY3RzIHdlaWdodGVkIGludGVybGVhdmUgbm9kZSBzZWxlY3Rpb24gdG8gdGhlXG4mIzQzO1x0XHROVU1BIG5vZGVzIG9mIHRoZSBwYWNrYWdlIChDUFUgc29ja2V0KSB0aGUgYWxsb2NhdGluZyB0YXNrXG4mIzQzO1x0XHRpcyBydW5uaW5nIG9uLiAmIzM5O2ZhbHNlJiMzOTsgKHRoZSBkZWZhdWx0KSB1c2VzIHRoZSBleGlzdGluZ1xuJiM0MztcdFx0d2VpZ2h0ZWQgaW50ZXJsZWF2ZSBiZWhhdmlvci5cbiYjNDM7XG4mIzQzO1x0XHRFbmFibGluZyBpcyByZWplY3RlZCB3aXRoIC1FSU5WQUwgd2hpbGUgdGhlIHBhY2thZ2UgdG9wb2xvZ3lcbiYjNDM7XHRcdGlzIG5vdCBzeW1tZXRyaWMuXG4mIzQzO1xuJiM0MztcdFx0V3JpdGluZyBhbnkgdHJ1ZSB2YWx1ZSBzdHJpbmcgKGUuZy4gWSBvciAxKSBlbmFibGVzIHRoZVxuJiM0MztcdFx0cmVzdHJpY3Rpb24sIGFueSBmYWxzZSB2YWx1ZSBzdHJpbmcgKGUuZy4gTiBvciAwKSBkaXNhYmxlc1xuJiM0MztcdFx0aXQuIEFsbCBvdGhlciBzdHJpbmdzIHJldHVybiAtRUlOVkFMLlxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXG5pbmRleCBlNTBkYzcxNmQ0ZTgyLi5hZjY2ZTJlMDZjNjI0IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY1xuQEAgLTI2NzMsNiAmIzQzOzI2NzMsNTUgQEAgc3RhdGljIGludCBjeGxfcmVnaW9uX2NhbGN1bGF0ZV9hZGlzdGFuY2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbiBcdHJldHVybiBOT1RJRllfU1RPUDtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIEZpbmQgYSBOVU1BIG5vZGUgdG8gYWN0IGFzIHRoZSBpbml0aWF0b3IgZm9yIHRoaXMgcmVnaW9uOiBzY2FuIHRoZVxuJiM0MzsgKiByZWdpb24mIzM5O3MgZW5kcG9pbnQgdGFyZ2V0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCByZXNvbHZlcyB0byBhXG4mIzQzOyAqIHZhbGlkIE5VTUEgbm9kZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hscilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjeGxfcmVnaW9uX3BhcmFtcyAqcCA9IFx1MDAyNmN4bHItXHUwMDNlcGFyYW1zO1xuJiM0MztcdHN0cnVjdCBjeGxfZW5kcG9pbnRfZGVjb2RlciAqY3hsZWQgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBjeGxfbWVtZGV2ICpjeGxtZCA9IE5VTEw7XG4mIzQzO1x0aW50IGksIG51bWFfbm9kZTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcC1cdTAwM2Vucl90YXJnZXRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y3hsZWQgPSBwLVx1MDAzZXRhcmdldHNbaV07XG4mIzQzO1x0XHRjeGxtZCA9IGN4bGVkX3RvX21lbWRldihjeGxlZCk7XG4mIzQzO1x0XHRudW1hX25vZGUgPSBkZXZfdG9fbm9kZShcdTAwMjZjeGxtZC1cdTAwM2VkZXYpO1xuJiM0MztcdFx0aWYgKG51bWFfbm9kZSAhPSBOVU1BX05PX05PREUpXG4mIzQzO1x0XHRcdHJldHVybiBudW1hX25vZGU7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFBhY2thZ2Ugbm90aWZpZXIgY2FsbGJhY2s6IHdoZW4gYSBuZXcgbWVtb3J5IG5vZGUgaXMgb25saW5lZCB2aWEgZGF4XG4mIzQzOyAqIGttZW0sIGJpbmQgdGhlIG5vZGUgdGhpcyBDWEwgcmVnaW9uIGJhY2tzIHRvIGl0cyBtZW1vcnkgcGFja2FnZSwgdXNpbmdcbiYjNDM7ICogdGhlIG5lYXJlc3QgcmVnaW9uIHRhcmdldCBhcyB0aGUgaW5pdGlhdG9yLiBOb3RpZmljYXRpb25zIGZvciBvdGhlclxuJiM0MzsgKiBub2RlcyBhcmUgaWdub3JlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9hZGRfcGFja2FnZV9ub2RlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgZGF4X25pZCwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGludCByZWdpb25fbmlkLCBuZWFyZXN0X25pZCwgcmV0O1xuJiM0MztcdHN0cnVjdCBjeGxfcmVnaW9uICpjeGxyID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgY3hsX3JlZ2lvbiwgcGFja2FnZV9ub3RpZmllcik7XG4mIzQzO1xuJiM0MztcdHJlZ2lvbl9uaWQgPSBwaHlzX3RvX3RhcmdldF9ub2RlKGN4bHItXHUwMDNlcGFyYW1zLnJlcy1cdTAwM2VzdGFydCk7XG4mIzQzO1x0aWYgKHJlZ2lvbl9uaWQgIT0gZGF4X25pZClcbiYjNDM7XHRcdHJldHVybiBOT1RJRllfRE9ORTtcbiYjNDM7XG4mIzQzO1x0bmVhcmVzdF9uaWQgPSBjeGxfcmVnaW9uX2ZpbmRfbmVhcmVzdF9ub2RlKGN4bHIpO1xuJiM0MztcdGlmIChuZWFyZXN0X25pZCA9PSBOVU1BX05PX05PREUpXG4mIzQzO1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4mIzQzO1xuJiM0MztcdHJldCA9IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGRheF9uaWQsIG5lYXJlc3RfbmlkKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIE5PVElGWV9ET05FO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gTk9USUZZX09LO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIGRldm1fY3hsX2FkZF9yZWdpb24gLSBBZGRzIGEgcmVnaW9uIHRvIGEgZGVjb2RlclxuICAqIEBjeGxyZDogcm9vdCBkZWNvZGVyXG5AQCAtMzg1Miw2ICYjNDM7MzkwMSw3IEBAIHN0YXRpYyB2b2lkIHNodXRkb3duX25vdGlmaWVycyh2b2lkICpfY3hscilcbiBcbiBcdHVucmVnaXN0ZXJfbm9kZV9ub3RpZmllcihcdTAwMjZjeGxyLVx1MDAzZW5vZGVfbm90aWZpZXIpO1xuIFx0dW5yZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKFx1MDAyNmN4bHItXHUwMDNlYWRpc3Rfbm90aWZpZXIpO1xuJiM0MztcdHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihcdTAwMjZjeGxyLVx1MDAzZXBhY2thZ2Vfbm90aWZpZXIpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCByZW1vdmVfZGVidWdmcyh2b2lkICpkZW50cnkpXG5AQCAtNDA2Niw2ICYjNDM7NDExNiwxMCBAQCBzdGF0aWMgaW50IGN4bF9yZWdpb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KVxuIFx0Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllci5wcmlvcml0eSA9IDEwMDtcbiBcdHJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oXHUwMDI2Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllcik7XG4gXG4mIzQzO1x0Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGU7XG4mIzQzO1x0Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyLnByaW9yaXR5ID0gMTAwO1xuJiM0MztcdHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXHUwMDI2Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyKTtcbiYjNDM7XG4gXHRyYyA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChcdTAwMjZjeGxyLVx1MDAzZWRldiwgc2h1dGRvd25fbm90aWZpZXJzLCBjeGxyKTtcbiBcdGlmIChyYylcbiBcdFx0cmV0dXJuIHJjO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2N4bC5oIGIvZHJpdmVycy9jeGwvY3hsLmhcbmluZGV4IDEyOTc1OTRiZWFlYzMuLjkyODFjYTNhNWYwZjggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2N4bC9jeGwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9jeGwvY3hsLmhcbkBAIC00NzcsNiAmIzQzOzQ3Nyw3IEBAIHN0cnVjdCBjeGxfcmVnaW9uIHtcbiBcdHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSBjb29yZFtBQ0NFU1NfQ09PUkRJTkFURV9NQVhdO1xuIFx0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vZGVfbm90aWZpZXI7XG4gXHRzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWRpc3Rfbm90aWZpZXI7XG4mIzQzO1x0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhY2thZ2Vfbm90aWZpZXI7XG4gfTtcbiBcbiBzdHJ1Y3QgY3hsX252ZGltbV9icmlkZ2Uge1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGF4L2ttZW0uYyBiL2RyaXZlcnMvZGF4L2ttZW0uY1xuaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZGF4L2ttZW0uY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9kYXgva21lbS5jXG5AQCAtOTQsNiAmIzQzOzk0LDkgQEAgc3RhdGljIGludCBkZXZfZGF4X2ttZW1fcHJvYmUoc3RydWN0IGRldl9kYXggKmRldl9kYXgpXG4gXHRpZiAoSVNfRVJSKG10eXBlKSlcbiBcdFx0cmV0dXJuIFBUUl9FUlIobXR5cGUpO1xuIFxuJiM0MztcdC8qIFJlc29sdmUgdGhlIG1lbW9yeSBwYWNrYWdlIGZvciB0aGlzIG5ld2x5IG9ubGluZWQga21lbSBub2RlLiAqL1xuJiM0MztcdG1wX3Byb2JlX3BhY2thZ2VfaWQobnVtYV9ub2RlKTtcbiYjNDM7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXZfZGF4LVx1MDAzZW5yX3JhbmdlOyBpJiM0MzsmIzQzOykge1xuIFx0XHRzdHJ1Y3QgcmFuZ2UgcmFuZ2U7XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmhcbmluZGV4IDc5OTljNTg2MjllZWIuLmY4Nzc4YzQzNDI5ZmIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG5AQCAtNTIsMTAgJiM0Mzs1MiwyNSBAQCBpbnQgbXRfcGVyZl90b19hZGlzdGFuY2Uoc3RydWN0IGFjY2Vzc19jb29yZGluYXRlICpwZXJmLCBpbnQgKmFkaXN0KTtcbiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCxcbiBcdFx0XHRcdFx0XHQgIHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XG4gdm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XG4mIzQzO1xuJiM0MztpbnQgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcbiYjNDM7dm9pZCB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcik7XG4mIzQzO2ludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpO1xuJiM0MztpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpO1xuJiM0MztpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKTtcbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XG4mIzQzO2ludCBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XG4mIzQzO2Jvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpO1xuICNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbiBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spO1xuIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpO1xuIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcbiYjNDM7XG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCk7XG4mIzQzO2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xuJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKTtcbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxuIHtcbkBAIC03MSw2ICYjNDM7ODYsMzAgQEAgc3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSlcbiB7XG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRpZiAob3V0KVxuJiM0MztcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4mIzQzO1x0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO31cbiAjZW5kaWZcbiBcbiAjZWxzZVxuQEAgLTE1MSw1ICYjNDM7MTkwLDc5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3QsXG4gc3RhdGljIGlubGluZSB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKVxuIHtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOT1RJRllfRE9ORTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG91dClcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuJiM0MztcdHJldHVybiAtRU5PRU5UO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG91dClcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuJiM0MztcdHJldHVybiAtRU5PRU5UO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiYjNDM7fVxuICNlbmRpZlx0LyogQ09ORklHX05VTUEgKi9cbiAjZW5kaWYgIC8qIF9MSU5VWF9NRU1PUllfVElFUlNfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnVtYS5oIGIvaW5jbHVkZS9saW51eC9udW1hLmhcbmluZGV4IGU2YmFhZjYwNTFiY2YuLjRmMmEwYzM0NDEyMmEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L251bWEuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9udW1hLmhcbkBAIC0zMyw2ICYjNDM7MzMsOCBAQCBpbnQgbnVtYV9uZWFyZXN0X25vZGUoaW50IG5vZGUsIHVuc2lnbmVkIGludCBzdGF0ZSk7XG4gXG4gaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzayk7XG4gXG4mIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpO1xuJiM0MztcbiAjaWZuZGVmIG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkXG4gaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCk7XG4gI2VuZGlmXG5AQCAtNTQsNiAmIzQzOzU2LDE1IEBAIHN0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzaylcbiBcdHJldHVybiBOVU1BX05PX05PREU7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLFxuJiM0MztcdFx0XHRcdFx0IG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmICghb3V0KVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0bm9kZXNfY2xlYXIoKm91dCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGlubGluZSBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KVxuIHtcbiBcdHJldHVybiAwO1xuZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmNcbmluZGV4IDU0ODUxZDhhMTk1YjAuLjU5MzJkZjMxNTYwNGEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmNcbkBAIC0xLDQgJiM0MzsxLDUgQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jbGVhbnVwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9sb2NrZGVwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNmcy5oXHUwMDNlXG5AQCAtNTEsNiAmIzQzOzUyLDExIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xuIFx0LmRldl9uYW1lID0gXCYjMzQ7bWVtb3J5X3RpZXJcJiMzNDssXG4gfTtcbiBcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBwYWNrYWdlX3N1YnN5cyA9IHtcbiYjNDM7XHQubmFtZSA9IFwmIzM0O3BhY2thZ2VcJiMzNDssXG4mIzQzO1x0LmRldl9uYW1lID0gXCYjMzQ7cGFja2FnZVwmIzM0OyxcbiYjNDM7fTtcbiYjNDM7XG4gI2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xuIC8qKlxuICAqIGZvbGlvX3VzZV9hY2Nlc3NfdGltZSAtIGNoZWNrIGlmIGEgZm9saW8gcmV1c2VzIGNwdXBpZCBmb3IgcGFnZSBhY2Nlc3MgdGltZVxuQEAgLTEwMDcsMyAmIzQzOzEwMTMsMTAwNiBAQCBzdGF0aWMgaW50IF9faW5pdCBudW1hX2luaXRfc3lzZnModm9pZClcbiBzdWJzeXNfaW5pdGNhbGwobnVtYV9pbml0X3N5c2ZzKTtcbiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovXG4gI2VuZGlmXG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogZW51bSBtcF9ub2Rlc190eXBlIC0gU2VsZWN0b3IgZm9yIHdoaWNoIHN1YnNldCBvZiBhIHBhY2thZ2UgdG8gcmV0dXJuXG4mIzQzOyAqIEBNUF9OT0RFU19BTEw6ICAgICAgIEFsbCBOVU1BIG5vZGVzIHRoYXQgYmVsb25nIHRvIHRoZSBwYWNrYWdlLlxuJiM0MzsgKiBATVBfTk9ERVNfQ1BVOiAgICAgICBPbmx5IENQVSBub2RlcyBpbiB0aGUgcGFja2FnZS5cbiYjNDM7ICogQE1QX05PREVTX01FTV9PTkxZOiAgT25seSBtZW1vcnktb25seSBub2RlcyAoZS5nLiBDWEwvSEJNKSBpbiB0aGUgcGFja2FnZS5cbiYjNDM7ICpcbiYjNDM7ICogVXNlZCBpbnRlcm5hbGx5IHRvIGNob29zZSB3aGljaCBub2RlbWFzayB0byBleHBvc2UgZm9yIGEgZ2l2ZW4gcGFja2FnZS5cbiYjNDM7ICovXG4mIzQzO2VudW0gbXBfbm9kZXNfdHlwZSB7XG4mIzQzO1x0TVBfTk9ERVNfQUxMLFxuJiM0MztcdE1QX05PREVTX0NQVSxcbiYjNDM7XHRNUF9OT0RFU19NRU1fT05MWVxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAtIFBlci1waHlzaWNhbC1wYWNrYWdlIGNvbnRhaW5lclxuJiM0MzsgKiBAcGFja2FnZV9pZDogICAgICAgICAgUGh5c2ljYWwgcGFja2FnZSBpZCAoZnJvbSB0b3BvbG9neSkuXG4mIzQzOyAqIEBub2RlczogICAgICAgICAgICAgICBOb2RlbWFzayBvZiBhbGwgbWVtYmVyIG5vZGVzIGluIHRoaXMgcGFja2FnZS5cbiYjNDM7ICogQGNwdV9ub2RlczogICAgICAgICAgIE5vZGVtYXNrIG9mIENQVSBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXG4mIzQzOyAqIEBtZW1vcnlfb25seV9ub2RlczogICBOb2RlbWFzayBvZiBtZW1vcnktb25seSBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXG4mIzQzOyAqIEBjcHVfbGlzdDogICAgICAgICAgICBMaXN0IGhlYWQgb2YgQ1BVLXR5cGUgbWVtYmVycy5cbiYjNDM7ICogQG1lbW9yeV9vbmx5X2xpc3Q6ICAgIExpc3QgaGVhZCBvZiBtZW1vcnktb25seSBtZW1iZXJzLlxuJiM0MzsgKiBAbGlzdDogICAgICAgICAgICAgICAgTGlua2FnZSBvbiB0aGUgZ2xvYmFsIEBtZW1vcnlfcGFja2FnZXMgbGlzdC5cbiYjNDM7ICogQGRldjogICAgICAgICAgICAgICAgIHN5c2ZzIGRldmljZSBmb3IgdGhpcyBwYWNrYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBBIG1lbW9yeV9wYWNrYWdlIGdyb3VwcyBOVU1BIG5vZGVzIHRoYXQgc2hhcmUgdGhlIHNhbWUgcGh5c2ljYWwgQ1BVIHBhY2thZ2UuXG4mIzQzOyAqIFRoZSBtYXNrcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgcGFja2FnZS1sb2NhbCBwbGFjZW1lbnQvZGVtb3Rpb24vcHJvbW90aW9uLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IG1lbW9yeV9wYWNrYWdlIHtcbiYjNDM7XHRpbnQgcGFja2FnZV9pZDtcbiYjNDM7XHRub2RlbWFza190IG5vZGVzO1xuJiM0MztcdG5vZGVtYXNrX3QgY3B1X25vZGVzO1xuJiM0MztcdG5vZGVtYXNrX3QgbWVtb3J5X29ubHlfbm9kZXM7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBjcHVfbGlzdDtcbiYjNDM7XHRzdHJ1Y3QgbGlzdF9oZWFkIG1lbW9yeV9vbmx5X2xpc3Q7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuJiM0MztcdHN0cnVjdCBkZXZpY2UgZGV2O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGVudW0gbXBuX3NvdXJjZV9mbGFncyAtIFNvdXJjZSB1c2VkIHRvIHJlc29sdmUgYSBub2RlJiMzOTtzIHBhY2thZ2UgbWVtYmVyc2hpcFxuJiM0MzsgKiBATVBOX1NSQ19VTktOT1dOOiAgICAgVW5rbm93bi91bnNwZWNpZmllZC5cbiYjNDM7ICogQE1QTl9TUkNfQ1BVOiAgICAgICAgIERpcmVjdGx5IHJlc29sdmVkIGZyb20gYSBDUFUgbm9kZSAoMToxKS5cbiYjNDM7ICogQE1QTl9TUkNfSU5JVElBVE9SOiAgIFJlc29sdmVkIHZpYSBhbiBpbml0aWF0b3IgQ1BVIG5vZGUgcHJvdmlkZWQgYnkgYSBkcml2ZXIuXG4mIzQzOyAqIEBNUE5fU1JDX1NMSVQ6ICAgICAgICBSZXNvbHZlZCB2aWEgU0xJVC9uZWFyZXN0LW5vZGUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZXNlIGZsYWdzIGFyZSBpbmZvcm1hdGlvbmFsOyB0aGV5IGRlc2NyaWJlIGhvdyBhIGdpdmVuIG5vZGUgd2FzIGJvdW5kIHRvXG4mIzQzOyAqIGl0cyBwYWNrYWdlIGFuZCBoZWxwIHdpdGggcG9saWN5IGRlY2lzaW9ucyBsYXRlci5cbiYjNDM7ICovXG4mIzQzO2VudW0gbXBuX3NvdXJjZV9mbGFncyB7XG4mIzQzO1x0TVBOX1NSQ19VTktOT1dOXHRcdD0gMCxcbiYjNDM7XHRNUE5fU1JDX0NQVVx0XHQ9IEJJVCgxKSxcbiYjNDM7XHRNUE5fU1JDX0lOSVRJQVRPUlx0PSBCSVQoMiksXG4mIzQzO1x0TVBOX1NSQ19TTElUXHRcdD0gQklUKDMpXG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgLSBQZXItbm9kZSBtZW1iZXJzaGlwIGFuZCBwcmVmZXJlbmNlc1xuJiM0MzsgKiBAbmlkOiAgICAgICAgICAgICAgTlVNQSBub2RlIGlkIGZvciB0aGlzIGVudHJ5LlxuJiM0MzsgKiBAaW5pdGlhdG9yX25pZDogICAgQ1BVIG5pZCB0aGF0IHNlcnZlZCBhcyB0aGUgaW5pdGlhdG9yIHdoZW4gcmVzb2x2aW5nIEBuaWQuXG4mIzQzOyAqIEBwYWNrYWdlX2lkOiAgICAgICBSZXNvbHZlZCBwYWNrYWdlIGlkIHRoYXQgQG5pZCBiZWxvbmdzIHRvLlxuJiM0MzsgKiBAc291cmNlX2ZsYWdzOiAgICAgT25lIG9mIFx1MDAyNmVudW0gbXBuX3NvdXJjZV9mbGFncyBkZXNjcmliaW5nIHRoZSByZXNvbHV0aW9uLlxuJiM0MzsgKiBAcHJlZmVycmVkOiAgICAgICAgT3Bwb3NpdGUtdHlwZSBuZWFyZXN0IGNhbmRpZGF0ZXMgaW5zaWRlIHRoZSBzYW1lIHBhY2thZ2UuXG4mIzQzOyAqIEBwYWNrYWdlOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvd25pbmcgXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlIChOVUxMIHVudGlsIGJvdW5kKS5cbiYjNDM7ICogQHBhY2thZ2VfZW50cnk6ICAgIExpbmthZ2Ugb24gdGhlIG93bmluZyBwYWNrYWdlJiMzOTtzIHR5cGUgbGlzdC5cbiYjNDM7ICpcbiYjNDM7ICogRWFjaCBOVU1BIG5vZGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gcGFja2FnZS1hd2FyZSBwb2xpY3kgZ2V0cyBhIHdyYXBwZXIgZW50cnlcbiYjNDM7ICogdGhhdCBjYWNoZXMgcGFja2FnZSBtZW1iZXJzaGlwIGFuZCB0aGUgcHJlY29tcHV0ZWQgc2V0IG9mIHByZWZlcnJlZCB0YXJnZXRzLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUge1xuJiM0MztcdGludCBuaWQ7XG4mIzQzO1x0aW50IGluaXRpYXRvcl9uaWQ7XG4mIzQzO1x0aW50IHBhY2thZ2VfaWQ7XG4mIzQzO1x0aW50IHNvdXJjZV9mbGFncztcbiYjNDM7XHRub2RlbWFza190IHByZWZlcnJlZDtcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKnBhY2thZ2U7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBwYWNrYWdlX2VudHJ5O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBub2RlX2lzX21lbW9yeV9vbmx5KF9uaWQpIFxcXG4mIzQzO1x0KG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgXHUwMDI2XHUwMDI2ICFub2RlX3N0YXRlKChfbmlkKSwgTl9DUFUpKVxuJiM0MztcbiYjNDM7c3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQobXBfcGFja2FnZV9hbGdvcml0aG1zKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBMSVNUX0hFQUQobWVtb3J5X3BhY2thZ2VzKTtcbiYjNDM7c3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG5zW01BWF9OVU1OT0RFU107XG4mIzQzO3N0YXRpYyBERUZJTkVfTVVURVgobWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSQ1Ugc25hcHNob3Qgb2YgdGhlIHBhY2thZ2UgdG9wb2xvZ3kuIFRoZSBhbGxvY2F0aW9uIHBhdGggcmVhZHMgaXRcbiYjNDM7ICogb2Z0ZW4sIHNvIGl0IGlzIHB1Ymxpc2hlZCBmb3IgbG9ja2xlc3MgcmVhZHMgaW5zdGVhZCBvZiBsb2NraW5nIG9uXG4mIzQzOyAqIGV2ZXJ5IGFjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBtcF9zbmFwc2hvdCB7XG4mIzQzO1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbiYjNDM7XHRpbnQgbnJfcGFja2FnZXM7XG4mIzQzO1x0aW50IHBrZ19vZltNQVhfTlVNTk9ERVNdO1xuJiM0MztcdHN0cnVjdCB7XG4mIzQzO1x0XHRub2RlbWFza190IG5vZGVzO1xuJiM0MztcdFx0bm9kZW1hc2tfdCBjcHVfbm9kZXM7XG4mIzQzO1x0XHRub2RlbWFza190IG1lbW9yeV9vbmx5X25vZGVzO1xuJiM0MztcdH0gcGtnW107XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IG1wX3NuYXBzaG90IF9fcmN1ICptcF9zbmFwc2hvdDtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gUmVnaXN0ZXIgYSBwYWNrYWdlIHJlc29sdXRpb24gYWxnb3JpdGhtXG4mIzQzOyAqIEBub3RpZmllcjogTm90aWZpZXIgY2FsbGVkIHdpdGggdGhlIG5pZCB0byByZXNvbHZlIChzZWUgbXBfcHJvYmVfcGFja2FnZV9pZCgpKS5cbiYjNDM7ICpcbiYjNDM7ICogRHJpdmVycyAoZS5nLiwgQ1hMIHJlZ2lvbi9kZWNvZGVyIGNvZGUpIHJlZ2lzdGVyIGhlcmUgdG8gc3VwcGx5IGEgcGFja2FnZVxuJiM0MzsgKiBoaW50IGZvciBuZXdseSBhcHBlYXJpbmcgbm9kZXMuIFRoZSBub3RpZmllciBpcyBpbnZva2VkIGR1cmluZyBuaWQtXHUwMDNlcGFja2FnZVxuJiM0MzsgKiByZXNvbHV0aW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoXHUwMDI2bXBfcGFja2FnZV9hbGdvcml0aG1zLCBub3RpZmllcik7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcik7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gVW5yZWdpc3RlciBhIHBhY2thZ2UgcmVzb2x1dGlvbiBhbGdvcml0aG1cbiYjNDM7ICogQG5vdGlmaWVyOiBOb3RpZmllciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKCkuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxuJiM0Mzt7XG4mIzQzO1x0YmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcihcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX3Byb2JlX3BhY2thZ2VfaWQgLSBJbnZva2UgcmVnaXN0ZXJlZCBub3RpZmllcnMgdG8gcmVzb2x2ZSBhIG5vZGUmIzM5O3MgcGFja2FnZVxuJiM0MzsgKiBAbmlkOiBOVU1BIG5vZGUgaWQgdG8gcmVzb2x2ZS5cbiYjNDM7ICpcbiYjNDM7ICogQ2FsbHMgdGhlIGJsb2NraW5nIG5vdGlmaWVyIGNoYWluIHRvIGxldCBzdWJzeXN0ZW1zIHByb3ZpZGUgYW4gaW5pdGlhdG9yIG9yXG4mIzQzOyAqIHBhY2thZ2UgaWQgZm9yIEBuaWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogTm90aWZpZXIgcmV0dXJuIGNvZGUgKFx1MDAzZT0wIHR5cGljYWxseSk7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oXHUwMDI2bXBfcGFja2FnZV9hbGdvcml0aG1zLCBuaWQsIE5VTEwpO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX3Byb2JlX3BhY2thZ2VfaWQpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdGludCBwYWNrYWdlX2lkO1xuJiM0MztcdHVuc2lnbmVkIGludCBmaXJzdF9jcHU7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXNrO1xuJiM0MztcbiYjNDM7XHRpZiAobmlkIFx1MDAzYyAwIHx8IG5pZCBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX0NQVSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0Y3B1X21hc2sgPSBjcHVtYXNrX29mX25vZGUobmlkKTtcbiYjNDM7XHRpZiAoY3B1bWFza19lbXB0eShjcHVfbWFzaykpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0Zmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfbWFzayk7XG4mIzQzO1x0aWYgKGZpcnN0X2NwdSBcdTAwM2U9IG5yX2NwdV9pZHMpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0cGFja2FnZV9pZCA9IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoZmlyc3RfY3B1KTtcbiYjNDM7XHRpZiAocGFja2FnZV9pZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcGFja2FnZV9pZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xuJiM0MztcbiYjNDM7XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0XG4mIzQzO1x0ICogbWVtb3J5LW9ubHkgbm9kZShzKSB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZS4gSWYgdGhlIHBhY2thZ2UgaGFzXG4mIzQzO1x0ICogbm8gbWVtb3J5LW9ubHkgbm9kZXMsIGZhbGwgYmFjayB0byBhIHNlbGYtcmVmZXJlbmNlIHNvIGNhbGxlcnNcbiYjNDM7XHQgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wbiwgXHUwMDI2bXAtXHUwMDNlY3B1X2xpc3QsIHBhY2thZ2VfZW50cnkpIHtcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuJiM0MztcdFx0aWYgKCFub2Rlc19lbXB0eShtcC1cdTAwM2VtZW1vcnlfb25seV9ub2RlcykpXG4mIzQzO1x0XHRcdG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2sobXBuLVx1MDAzZW5pZCwgXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2bXBuLVx1MDAzZXByZWZlcnJlZCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdG5vZGVfc2V0KG1wbi1cdTAwM2VuaWQsIG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTeW1tZXRyaWNhbGx5LCBmb3IgZWFjaCBtZW1vcnktb25seSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0XG4mIzQzO1x0ICogYXMgdGhlIG5lYXJlc3QgQ1BVIG5vZGUocykgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UuIElmIHRoZSBwYWNrYWdlXG4mIzQzO1x0ICogaGFzIG5vIENQVSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcG4sIFx1MDAyNm1wLVx1MDAzZW1lbW9yeV9vbmx5X2xpc3QsIHBhY2thZ2VfZW50cnkpIHtcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuJiM0MztcdFx0aWYgKCFub2Rlc19lbXB0eShtcC1cdTAwM2VjcHVfbm9kZXMpKVxuJiM0MztcdFx0XHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cdTAwM2VuaWQsIFx1MDAyNm1wLVx1MDAzZWNwdV9ub2RlcyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBcdTAwMjZtcG4tXHUwMDNlcHJlZmVycmVkKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0bm9kZV9zZXQobXBuLVx1MDAzZW5pZCwgbXBuLVx1MDAzZXByZWZlcnJlZCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkoc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcClcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAobm9kZXNfZW1wdHkobXAtXHUwMDNlY3B1X25vZGVzKSBcdTAwMjZcdTAwMjYgbm9kZXNfZW1wdHkobXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBhY2thZ2Vfbm9kZV9pc192YWxpZChpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFtcG5zW25pZF0pXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGlmIChub2Rlc19lbXB0eShtcG5zW25pZF0tXHUwMDNlcHJlZmVycmVkKSB8fCAobXBuc1tuaWRdLVx1MDAzZXBhY2thZ2UgPT0gTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW107XG4mIzQzO1xuJiM0MzsvKiBGcmVlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgcGFja2FnZSYjMzk7cyBzeXNmcyBkZXZpY2UgaXMgZHJvcHBlZC4gKi9cbiYjNDM7c3RhdGljIHZvaWQgbWVtb3J5X3BhY2thZ2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1lbW9yeV9wYWNrYWdlLCBkZXYpO1xuJiM0MztcbiYjNDM7XHRrZnJlZShtcCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKmNyZWF0ZV9tZW1vcnlfcGFja2FnZShpbnQgcGFja2FnZV9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRtZW1wYWNrYWdlID0ga3phbGxvY19vYmooKm1lbXBhY2thZ2UpO1xuJiM0MztcdGlmICghbWVtcGFja2FnZSlcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuJiM0MztcbiYjNDM7XHRtZW1wYWNrYWdlLVx1MDAzZXBhY2thZ2VfaWQgPSBwYWNrYWdlX2lkO1xuJiM0MztcdG1lbXBhY2thZ2UtXHUwMDNlbm9kZXMgPSBOT0RFX01BU0tfTk9ORTtcbiYjNDM7XHRtZW1wYWNrYWdlLVx1MDAzZWNwdV9ub2RlcyA9IE5PREVfTUFTS19OT05FO1xuJiM0MztcdG1lbXBhY2thZ2UtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMgPSBOT0RFX01BU0tfTk9ORTtcbiYjNDM7XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWNwdV9saXN0KTtcbiYjNDM7XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZW1lbW9yeV9vbmx5X2xpc3QpO1xuJiM0MztcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlbGlzdCk7XG4mIzQzO1x0ZGV2aWNlX2luaXRpYWxpemUoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VkZXYpO1xuJiM0MztcdG1lbXBhY2thZ2UtXHUwMDNlZGV2LnJlbGVhc2UgPSBtZW1vcnlfcGFja2FnZV9yZWxlYXNlO1xuJiM0MztcdGRldl9zZXRfZHJ2ZGF0YShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldiwgbWVtcGFja2FnZSk7XG4mIzQzO1x0bWVtcGFja2FnZS1cdTAwM2VkZXYuYnVzID0gXHUwMDI2cGFja2FnZV9zdWJzeXM7XG4mIzQzO1x0bWVtcGFja2FnZS1cdTAwM2VkZXYuZ3JvdXBzID0gbWVtb3J5X3BhY2thZ2VfZ3JvdXBzO1xuJiM0MztcdHJldCA9IGRldl9zZXRfbmFtZShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldiwgXCYjMzQ7cGFja2FnZSVkXCYjMzQ7LCBwYWNrYWdlX2lkKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRwdXRfZGV2aWNlKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gbWVtcGFja2FnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1lbXBhY2thZ2UsICpleGlzdGluZztcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtcGFja2FnZSwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XG4mIzQzO1x0XHRpZiAobWVtcGFja2FnZS1cdTAwM2VwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHtcbiYjNDM7XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdFx0XHRyZXR1cm4gbWVtcGFja2FnZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRtZW1wYWNrYWdlID0gY3JlYXRlX21lbW9yeV9wYWNrYWdlKHBhY2thZ2VfaWQpO1xuJiM0MztcdGlmIChJU19FUlIobWVtcGFja2FnZSkpXG4mIzQzO1x0XHRyZXR1cm4gbWVtcGFja2FnZTtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV4aXN0aW5nLCBcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcbiYjNDM7XHRcdGlmIChleGlzdGluZy1cdTAwM2VwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHtcbiYjNDM7XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdFx0XHRwdXRfZGV2aWNlKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbiYjNDM7XHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRsaXN0X2FkZChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWxpc3QsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcyk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBkZXZpY2VfYWRkKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdFx0bGlzdF9kZWwoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VsaXN0KTtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRcdHB1dF9kZXZpY2UoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VkZXYpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBtZW1wYWNrYWdlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBtcF9zbmFwc2hvdF9yZWJ1aWxkKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbXBfc25hcHNob3QgKm5ldywgKm9sZDtcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wO1xuJiM0MztcdGludCBuciA9IDAsIGkgPSAwLCBuaWQ7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdGxpc3RfZm9yX2VhY2hfZW50cnkobXAsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdClcbiYjNDM7XHRcdG5yJiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0bmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFuZXcpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdG1lbXNldChuZXctXHUwMDNlcGtnX29mLCAweGZmLCBzaXplb2YobmV3LVx1MDAzZXBrZ19vZikpO1xuJiM0MztcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcbiYjNDM7XHRcdG5ldy1cdTAwM2Vwa2dbaV0ubm9kZXMgPSBtcC1cdTAwM2Vub2RlcztcbiYjNDM7XHRcdG5ldy1cdTAwM2Vwa2dbaV0uY3B1X25vZGVzID0gbXAtXHUwMDNlY3B1X25vZGVzO1xuJiM0MztcdFx0bmV3LVx1MDAzZXBrZ1tpXS5tZW1vcnlfb25seV9ub2RlcyA9IG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzO1xuJiM0MztcdFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbXAtXHUwMDNlbm9kZXMpXG4mIzQzO1x0XHRcdG5ldy1cdTAwM2Vwa2dfb2ZbbmlkXSA9IGk7XG4mIzQzO1x0XHRpJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0bmV3LVx1MDAzZW5yX3BhY2thZ2VzID0gbnI7XG4mIzQzO1xuJiM0MztcdG9sZCA9IHJjdV9yZXBsYWNlX3BvaW50ZXIobXBfc25hcHNob3QsIG5ldyxcbiYjNDM7XHRcdFx0XHQgIGxvY2tkZXBfaXNfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKSk7XG4mIzQzO1x0aWYgKG9sZClcbiYjNDM7XHRcdGt2ZnJlZV9yY3Uob2xkLCByY3UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJpbmRfbm9kZV90b19wYWNrYWdlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcGFja2FnZV9pZCwgcGtnX2lkO1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXA7XG4mIzQzO1x0bm9kZW1hc2tfdCBub2RlcywgY3B1LCBtZW07XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1x0aWYgKCFtcG5zW25pZF0pIHtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XHRwYWNrYWdlX2lkID0gbXBuc1tuaWRdLVx1MDAzZXBhY2thZ2VfaWQ7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRtcCA9IGZpbmRfY3JlYXRlX21lbW9yeV9wYWNrYWdlKHBhY2thZ2VfaWQpO1xuJiM0MztcdGlmIChJU19FUlIobXApKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIobXApO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGlmICghbXBuc1tuaWRdKSB7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1x0bXBuc1tuaWRdLVx1MDAzZXBhY2thZ2UgPSBtcDtcbiYjNDM7XHRub2RlX3NldChtcG5zW25pZF0tXHUwMDNlbmlkLCBtcC1cdTAwM2Vub2Rlcyk7XG4mIzQzO1x0aWYgKG5vZGVfaXNfbWVtb3J5X29ubHkobXBuc1tuaWRdLVx1MDAzZW5pZCkpIHtcbiYjNDM7XHRcdG5vZGVfc2V0KG1wbnNbbmlkXS1cdTAwM2VuaWQsIG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcbiYjNDM7XHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VtZW1vcnlfb25seV9saXN0KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0bm9kZV9zZXQobXBuc1tuaWRdLVx1MDAzZW5pZCwgbXAtXHUwMDNlY3B1X25vZGVzKTtcbiYjNDM7XHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VjcHVfbGlzdCk7XG4mIzQzO1x0fVxuJiM0MztcdHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChtcCk7XG4mIzQzO1x0bXBfc25hcHNob3RfcmVidWlsZCgpO1xuJiM0MztcdHBrZ19pZCA9IG1wLVx1MDAzZXBhY2thZ2VfaWQ7XG4mIzQzO1x0bm9kZXMgPSBtcC1cdTAwM2Vub2RlcztcbiYjNDM7XHRjcHUgPSBtcC1cdTAwM2VjcHVfbm9kZXM7XG4mIzQzO1x0bWVtID0gbXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXM7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O21lbW9yeV9wYWNrYWdlICVkOiBub2Rlcz0lKnBibCBjcHU9JSpwYmwgbWVtb3J5X29ubHk9JSpwYmxcXG5cJiMzNDssXG4mIzQzO1x0XHRwa2dfaWQsIG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2bm9kZXMpLFxuJiM0MztcdFx0bm9kZW1hc2tfcHJfYXJncyhcdTAwMjZjcHUpLCBub2RlbWFza19wcl9hcmdzKFx1MDAyNm1lbSkpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdW5iaW5kX25vZGVfdG9fcGFja2FnZShzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCBpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0bm9kZV9jbGVhcihuaWQsIG1wLVx1MDAzZW5vZGVzKTtcbiYjNDM7XHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSlcbiYjNDM7XHRcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2VjcHVfbm9kZXMpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChtcG5zW25pZF0pXG4mIzQzO1x0XHRsaXN0X2RlbChcdTAwMjZtcG5zW25pZF0tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4mIzQzO1xuJiM0MztcdHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChtcCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqY3JlYXRlX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbiYjNDM7e1xuJiM0MztcdGludCBjcHVfbmlkLCBwYWNrYWdlX2lkO1xuJiM0MztcdGludCBzb3VyY2VfZmxhZ3M7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjtcbiYjNDM7XG4mIzQzO1x0aWYgKG5vZGVfc3RhdGUobmlkLCBOX0NQVSkpIHtcbiYjNDM7XHRcdGNwdV9uaWQgPSBuaWQ7XG4mIzQzO1x0XHRzb3VyY2VfZmxhZ3MgPSBNUE5fU1JDX0NQVTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKGluaXRpYXRvcl9uaWQgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRcdGNwdV9uaWQgPSBpbml0aWF0b3JfbmlkO1xuJiM0MztcdFx0XHRzb3VyY2VfZmxhZ3MgPSBNUE5fU1JDX0lOSVRJQVRPUjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE5vIGRyaXZlci1zdXBwbGllZCBpbml0aWF0b3I6IGZhbGwgYmFjayB0byB0aGVcbiYjNDM7XHRcdFx0ICogbmVhcmVzdCBDUFUgbm9kZSAodmlhIFNMSVQvbnVtYV9kaXN0YW5jZSkuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRjcHVfbmlkID0gbnVtYV9uZWFyZXN0X25vZGUobmlkLCBOX0NQVSk7XG4mIzQzO1x0XHRcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfU0xJVDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHBhY2thZ2VfaWQgPSBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoY3B1X25pZCk7XG4mIzQzO1x0aWYgKHBhY2thZ2VfaWQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiYjNDM7XG4mIzQzO1x0bXBuID0ga3phbGxvY19vYmooKm1wbik7XG4mIzQzO1x0aWYgKCFtcG4pXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiYjNDM7XG4mIzQzO1x0bXBuLVx1MDAzZW5pZCA9IG5pZDtcbiYjNDM7XHRtcG4tXHUwMDNlaW5pdGlhdG9yX25pZCA9IGNwdV9uaWQ7XG4mIzQzO1x0bXBuLVx1MDAzZXBhY2thZ2VfaWQgPSBwYWNrYWdlX2lkO1xuJiM0MztcdG1wbi1cdTAwM2Vzb3VyY2VfZmxhZ3MgPSBzb3VyY2VfZmxhZ3M7XG4mIzQzO1x0bXBuLVx1MDAzZXByZWZlcnJlZCA9IE5PREVfTUFTS19OT05FO1xuJiM0MztcdG1wbi1cdTAwM2VwYWNrYWdlID0gTlVMTDtcbiYjNDM7XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtcG4tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBtcG47XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRvcG9sb2d5IHN5bW1ldHJ5IHN0YXR1c1xuJiM0MzsgKiBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgbm9kZSBzdHJ1Y3R1cmVcbiYjNDM7ICogKHNhbWUgbnVtYmVyIG9mIENQVSBub2RlcyBhbmQgbWVtb3J5LW9ubHkgbm9kZXMpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgdG9wb2xvZ3lfc3ltbWV0cmljO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkodm9pZCk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlICpfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsICp1bnJlZ19tcCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdG1wbiA9IG1wbnNbbmlkXTtcbiYjNDM7XHRpZiAoIW1wbilcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRtcCA9IG1wbi1cdTAwM2VwYWNrYWdlO1xuJiM0MztcdGlmIChtcCkge1xuJiM0MztcdFx0dW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTtcbiYjNDM7XHRcdG1wbi1cdTAwM2VwYWNrYWdlID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkobXApKSB7XG4mIzQzO1x0XHRcdGxpc3RfZGVsKFx1MDAyNm1wLVx1MDAzZWxpc3QpO1xuJiM0MztcdFx0XHR1bnJlZ19tcCA9IG1wO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bXBuc1tuaWRdID0gTlVMTDtcbiYjNDM7XHRrZnJlZShtcG4pO1xuJiM0MztcdG1wX3NuYXBzaG90X3JlYnVpbGQoKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHVucmVnX21wO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBkZXN0cm95X3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcDtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmICh1bnJlZ19tcClcbiYjNDM7XHRcdGRldmljZV91bnJlZ2lzdGVyKFx1MDAyNnVucmVnX21wLVx1MDAzZWRldik7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZmluZF9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKnVucmVnX21wID0gTlVMTDtcbiYjNDM7XHRpbnQgcmV0ID0gbmlkO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGlmICghbXBuc1tuaWRdKSB7XG4mIzQzO1x0XHRyZXQgPSBOVU1BX05PX05PREU7XG4mIzQzO1x0fSBlbHNlIGlmIChtcG5zW25pZF0tXHUwMDNlc291cmNlX2ZsYWdzID09IE1QTl9TUkNfU0xJVCBcdTAwMjZcdTAwMjYgaW5pdGlhdG9yX25pZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBTTElULWRlcml2ZWQgZW50cmllcyBhcmUgcHJvdmlzaW9uYWw7IGlmIGEgZHJpdmVyIGxhdGVyXG4mIzQzO1x0XHQgKiBwcm92aWRlcyBhbiBleHBsaWNpdCBpbml0aWF0b3IsIGRyb3AgdGhlIHByb3Zpc2lvbmFsXG4mIzQzO1x0XHQgKiBlbnRyeSBhbmQgcmVidWlsZCB3aXRoIHRoZSBzdHJvbmdlciBoaW50LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbiYjNDM7XHRcdHJldCA9IE5VTUFfTk9fTk9ERTtcbiYjNDM7XHR9XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAodW5yZWdfbXApXG4mIzQzO1x0XHRkZXZpY2VfdW5yZWdpc3RlcihcdTAwMjZ1bnJlZ19tcC1cdTAwM2VkZXYpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbiYjNDM7e1xuJiM0MztcdGludCBtcG5fbmlkO1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XG4mIzQzO1xuJiM0MztcdG1wbl9uaWQgPSBmaW5kX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xuJiM0MztcdGlmIChtcG5fbmlkICE9IE5VTUFfTk9fTk9ERSlcbiYjNDM7XHRcdHJldHVybiBtcG5fbmlkO1xuJiM0MztcbiYjNDM7XHRtcG4gPSBjcmVhdGVfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7XG4mIzQzO1x0aWYgKElTX0VSUihtcG4pKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIobXBuKTtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGlmIChtcG5zW25pZF0pIHtcbiYjNDM7XHRcdGtmcmVlKG1wbik7XG4mIzQzO1x0XHRyZXR1cm4gbmlkO1xuJiM0MztcdH1cbiYjNDM7XHRtcG5zW25pZF0gPSBtcG47XG4mIzQzO1xuJiM0MztcdHJldHVybiBuaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBOVU1BX05PX05PREUpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBiaW5kX25vZGVfdG9fcGFja2FnZShuaWQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IgLSBBZGQgYSBub2RlIHdpdGggYW4gaW5pdGlhdG9yXG4mIzQzOyAqIEBuaWQ6ICAgICAgICAgICAgVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4mIzQzOyAqIEBpbml0aWF0b3JfbmlkOiAgQ1BVIG5pZCB1c2VkIHRvIHJlc29sdmUgQG5pZCYjMzk7cyBwYWNrYWdlIChcdTAwM2U9MCkuXG4mIzQzOyAqXG4mIzQzOyAqIEVuc3VyZXMgdGhhdCBhIFx1MDAyNnN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlIGV4aXN0cyBmb3IgQG5pZCBhbmQgdGhhdCBpdHNcbiYjNDM7ICogcGFja2FnZV9pZCBpcyBkZXRlcm1pbmVkIHVzaW5nIEBpbml0aWF0b3JfbmlkIHdoZW4gcHJvdmlkZWQuIEJpbmRpbmcgdG8gdGhlXG4mIzQzOyAqIHBhY2thZ2UgaXMgbm90IHBlcmZvcm1lZCBoZXJlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcik7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfYWRkX3BhY2thZ2Vfbm9kZSAtIEFkZCBhIG5vZGUsIHJlc29sdmluZyBwYWNrYWdlIGF1dG9tYXRpY2FsbHlcbiYjNDM7ICogQG5pZDogVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4mIzQzOyAqXG4mIzQzOyAqIFdyYXBwZXIgb3ZlciBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcigpIHRoYXQgcmVxdWVzdHMgYXV0b21hdGljXG4mIzQzOyAqIGluaXRpYXRvciByZXNvbHV0aW9uIChlLmcuLCBuZWFyZXN0IENQVSkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfYWRkX3BhY2thZ2Vfbm9kZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcbiYjNDM7XHRcdFx0XHQgICAgIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtcF9zbmFwc2hvdCAqc25hcDtcbiYjNDM7XHRpbnQgcGtnO1xuJiM0MztcbiYjNDM7XHRpZiAoIW91dClcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQocmN1KSgpO1xuJiM0MztcbiYjNDM7XHRzbmFwID0gcmN1X2RlcmVmZXJlbmNlKG1wX3NuYXBzaG90KTtcbiYjNDM7XHRpZiAoIXNuYXApXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0cGtnID0gc25hcC1cdTAwM2Vwa2dfb2ZbbmlkXTtcbiYjNDM7XHRpZiAocGtnIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAobm9kZV90eXBlKSB7XG4mIzQzO1x0Y2FzZSBNUF9OT0RFU19BTEw6XG4mIzQzO1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubm9kZXMpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBNUF9OT0RFU19DUFU6XG4mIzQzO1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10uY3B1X25vZGVzKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgTVBfTk9ERVNfTUVNX09OTFk6XG4mIzQzO1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubWVtb3J5X29ubHlfbm9kZXMpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbiYjNDM7c3RhdGljIGludCBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcbiYjNDM7XHRcdFx0XHQgICAgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4mIzQzO1xuJiM0MztcdC8qIE5vIGhvdC1wYXRoIGNhbGxlcnM6IHRoZSBtdXRleCBpcyBmaW5lIGhlcmUuICovXG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAoIW91dCkge1xuJiM0MztcdFx0cmV0ID0gLUVJTlZBTDtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bm9kZXNfY2xlYXIoKm91dCk7XG4mIzQzO1xuJiM0MztcdGlmIChuaWQgXHUwMDNjIDAgfHwgbmlkIFx1MDAzZT0gTUFYX05VTU5PREVTKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUlOVkFMO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobm9kZV90eXBlID09IE1QX05PREVTX0NQVSkge1xuJiM0MztcdFx0aWYgKG5vZGVfaXNfbWVtb3J5X29ubHkobmlkKSkge1xuJiM0MztcdFx0XHRyZXQgPSAtRUlOVkFMO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9IGVsc2UgaWYgKG5vZGVfdHlwZSA9PSBNUF9OT0RFU19NRU1fT05MWSkge1xuJiM0MztcdFx0aWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHtcbiYjNDM7XHRcdHJldCA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5vZGVzX2NvcHkoKm91dCwgbXBuc1tuaWRdLVx1MDAzZXByZWZlcnJlZCk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sgLSBEZW1vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2VcbiYjNDM7ICogQG5pZDogQ1BVIG5vZGUgZnJvbSB3aGljaCBtZW1vcnkgd291bGQgYmUgZGVtb3RlZC5cbiYjNDM7ICogQG91dDogT3V0cHV0IG5vZGVtYXNrIG9mIG5lYXJlc3QgbWVtb3J5LW9ubHkgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfbmV4dF9kZW1vdGlvbl9ub2RlIC0gUGljayBvbmUgZGVtb3Rpb24gdGFyZ2V0XG4mIzQzOyAqIEBuaWQ6IENQVSBub2RlIGZyb20gd2hpY2ggbWVtb3J5IHdvdWxkIGJlIGRlbW90ZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFBpY2tzIG9uZSB0YXJnZXQgKHJhbmRvbSBhbW9uZyB0aGUgbmVhcmVzdCkgZnJvbSBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKCkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdGludCB0YXJnZXRfbmlkO1xuJiM0MztcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xuJiM0MztcbiYjNDM7XHRpZiAobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhuaWQsIFx1MDAyNnRhcmdldF9ub2RlbWFzaykpXG4mIzQzO1x0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuJiM0MztcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxuJiM0MztcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiYjNDM7XG4mIzQzO1x0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFx1MDAyNnRhcmdldF9ub2RlbWFzayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0YXJnZXRfbmlkO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfZGVtb3Rpb25fbm9kZSk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2sgLSBQcm9tb3Rpb24gY2FuZGlkYXRlcyB3aXRoaW4gYSBwYWNrYWdlXG4mIzQzOyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG93YXJkcyB3aGljaCBwcm9tb3Rpb24gc2Vla3MgQ1BVIGxvY2FsaXR5LlxuJiM0MzsgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBDUFUgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2spO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX25leHRfcHJvbW90aW9uX25vZGUgLSBQaWNrIG9uZSBwcm9tb3Rpb24gdGFyZ2V0XG4mIzQzOyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG8gYmUgcHJvbW90ZWQgdG93YXJkcyBDUFVzLlxuJiM0MzsgKlxuJiM0MzsgKiBQaWNrcyBvbmUgdGFyZ2V0IChyYW5kb20gYW1vbmcgdGhlIG5lYXJlc3QpIGZyb20gbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soKS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0YXJnZXQgbmlkIG9uIHN1Y2Nlc3MsIG9yIE5VTUFfTk9fTk9ERSBpZiBubyBjYW5kaWRhdGUgaXMgYXZhaWxhYmxlLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdGludCB0YXJnZXRfbmlkO1xuJiM0MztcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xuJiM0MztcbiYjNDM7XHRpZiAobXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2sobmlkLCBcdTAwMjZ0YXJnZXRfbm9kZW1hc2spKVxuJiM0MztcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiYjNDM7XHRpZiAobm9kZXNfZW1wdHkodGFyZ2V0X25vZGVtYXNrKSlcbiYjNDM7XHRcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO1xuJiM0MztcdHRhcmdldF9uaWQgPSBub2RlX3JhbmRvbShcdTAwMjZ0YXJnZXRfbm9kZW1hc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdGFyZ2V0X25pZDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X3Byb21vdGlvbl9ub2RlKTtcbiYjNDM7I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2dldF9wYWNrYWdlX25vZGVzIC0gUmV0dXJuIGFsbCBtZW1iZXJzIG9mIEBuaWQmIzM5O3MgcGFja2FnZVxuJiM0MzsgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLlxuJiM0MzsgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBhbGwgbWVtYmVycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19BTEwsIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2Vfbm9kZXMpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyAtIFJldHVybiBDUFUgbWVtYmVycyBvZiBAbmlkJiMzOTtzIHBhY2thZ2VcbiYjNDM7ICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS5cbiYjNDM7ICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgQ1BVIG1lbWJlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhuaWQsIE1QX05PREVTX0NQVSwgb3V0KTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzIC0gUmV0dXJuIG1lbW9yeS1vbmx5IG1lbWJlcnMgb2YgQG5pZCYjMzk7cyBwYWNrYWdlXG4mIzQzOyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuXG4mIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIG1lbW9yeS1vbmx5IG1lbWJlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX21lbWluaXQgbXBfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKl9hcmcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgbmlkO1xuJiM0MztcdHN0cnVjdCBub2RlX25vdGlmeSAqbm4gPSBfYXJnO1xuJiM0MztcbiYjNDM7XHRuaWQgPSBubi1cdTAwM2VuaWQ7XG4mIzQzO1x0aWYgKG5pZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKDApO1xuJiM0MztcbiYjNDM7XHRzd2l0Y2ggKGFjdGlvbikge1xuJiM0MztcdGNhc2UgTk9ERV9SRU1PVkVEX0xBU1RfTUVNT1JZOlxuJiM0MztcdFx0ZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRjYXNlIE5PREVfQURERURfRklSU1RfTUVNT1JZOlxuJiM0MztcdFx0Y3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHN5c2ZzIGludGVyZmFjZSBmb3IgbWVtb3J5X3BhY2thZ2UgdG9wb2xvZ3lcbiYjNDM7ICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6XG4mIzQzOyAqICAgLSBwYWNrYWdlX25vZGVzOiAgICAgICBBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcbiYjNDM7ICogICAtIHBhY2thZ2VfY3B1X25vZGVzOiAgIENQVSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcbiYjNDM7ICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxuJiM0MzsgKiAgIC0gcGh5c2ljYWxfcGFja2FnZV9pZDogUGh5c2ljYWwgcGFja2FnZSBJRFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2Vfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xuJiM0MztcbiYjNDM7XHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcJiMzNDslKnBibFxcblwmIzM0Oywgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZtcC1cdTAwM2Vub2RlcykpO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwYWNrYWdlX25vZGVzKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfY3B1X25vZGVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XG4mIzQzO1xuJiM0MztcdGd1YXJkKG11dGV4KShcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFwmIzM0OyUqcGJsXFxuXCYjMzQ7LCBub2RlbWFza19wcl9hcmdzKFx1MDAyNm1wLVx1MDAzZWNwdV9ub2RlcykpO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwYWNrYWdlX2NwdV9ub2Rlcyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21lbV9vbmx5X25vZGVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdFx0ICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdHJldHVybiBzeXNmc19lbWl0KGJ1ZiwgXCYjMzQ7JSpwYmxcXG5cJiMzNDssIG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbiYjNDM7fVxuJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9tZW1fb25seV9ub2Rlcyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3NpemVfdCBwaHlzaWNhbF9wYWNrYWdlX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdFx0c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcJiMzNDslZFxcblwmIzM0OywgbXAtXHUwMDNlcGFja2FnZV9pZCk7XG4mIzQzO31cbiYjNDM7c3RhdGljIERFVklDRV9BVFRSX1JPKHBoeXNpY2FsX3BhY2thZ2VfaWQpO1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1lbW9yeV9wYWNrYWdlX2F0dHJzW10gPSB7XG4mIzQzO1x0XHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9ub2Rlcy5hdHRyLFxuJiM0MztcdFx1MDAyNmRldl9hdHRyX3BhY2thZ2VfY3B1X25vZGVzLmF0dHIsXG4mIzQzO1x0XHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9tZW1fb25seV9ub2Rlcy5hdHRyLFxuJiM0MztcdFx1MDAyNmRldl9hdHRyX3BoeXNpY2FsX3BhY2thZ2VfaWQuYXR0cixcbiYjNDM7XHROVUxMLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWVtb3J5X3BhY2thZ2VfZ3JvdXAgPSB7XG4mIzQzO1x0LmF0dHJzID0gbWVtb3J5X3BhY2thZ2VfYXR0cnMsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW10gPSB7XG4mIzQzO1x0XHUwMDI2bWVtb3J5X3BhY2thZ2VfZ3JvdXAsXG4mIzQzO1x0TlVMTCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgX19pbml0IG1lbW9yeV9wYWNrYWdlX3N5c2ZzX2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHN1YnN5c19zeXN0ZW1fcmVnaXN0ZXIoXHUwMDI2cGFja2FnZV9zdWJzeXMsIE5VTEwpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDttZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcXG5cJiMzNDssIHJldCk7XG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0Mztjb3JlX2luaXRjYWxsKG1lbW9yeV9wYWNrYWdlX3N5c2ZzX2luaXQpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyAtIENoZWNrIGlmIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG1lbW9yeSBwYWNrYWdlcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBDUFUgbm9kZXNcbiYjNDM7ICogYW5kIG1lbW9yeS1vbmx5IG5vZGVzLCBpbmRpY2F0aW5nIGEgc3ltbWV0cmljIHRvcG9sb2d5LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgdG9wb2xvZ3lfc3ltbWV0cmljIHZhcmlhYmxlIGlzIHByb3RlY3RlZCBieSBtZW1vcnlfcGFja2FnZV9sb2NrIGZvclxuJiM0MzsgKiB3cml0ZXMgKGluIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KS5cbiYjNDM7ICovXG4mIzQzO2Jvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gUkVBRF9PTkNFKHRvcG9sb2d5X3N5bW1ldHJpYyk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKTtcbiYjNDM7XG4mIzQzOy8qIFdhbGsgdGhlIHBhY2thZ2UgbGlzdCBhbmQgY29tcGFyZSBub2RlIGNvdW50czsgdGhlIGNhbGxlciBob2xkcyB0aGUgbG9jay4gKi9cbiYjNDM7c3RhdGljIGJvb2wgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcbiYjNDM7XHRpbnQgcmVmX2NwdV9ub2RlX2NvdW50ID0gMCwgcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSAwO1xuJiM0MztcdGludCBwYWNrYWdlX2NvdW50ID0gMDtcbiYjNDM7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcCwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XG4mIzQzO1x0XHRpbnQgY3B1X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXHUwMDNlY3B1X25vZGVzKTtcbiYjNDM7XHRcdGludCBtZW1vcnlfb25seV9ub2RlX2NvdW50ID0gbm9kZXNfd2VpZ2h0KG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcbiYjNDM7XHRcdGludCB0b3RhbF9ub2RlX2NvdW50ID0gY3B1X25vZGVfY291bnQgJiM0MzsgbWVtb3J5X29ubHlfbm9kZV9jb3VudDtcbiYjNDM7XG4mIzQzO1x0XHRwYWNrYWdlX2NvdW50JiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0XHQvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi9cbiYjNDM7XHRcdGlmICh0b3RhbF9ub2RlX2NvdW50IFx1MDAzYyAyKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBhY2thZ2VfY291bnQgPT0gMSkge1xuJiM0MztcdFx0XHRyZWZfY3B1X25vZGVfY291bnQgPSBjcHVfbm9kZV9jb3VudDtcbiYjNDM7XHRcdFx0cmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSBtZW1vcnlfb25seV9ub2RlX2NvdW50O1xuJiM0MztcdFx0fSBlbHNlIGlmIChjcHVfbm9kZV9jb3VudCAhPSByZWZfY3B1X25vZGVfY291bnQgfHxcbiYjNDM7XHRcdFx0ICAgbWVtb3J5X29ubHlfbm9kZV9jb3VudCAhPSByZWZfbWVtb3J5X29ubHlfbm9kZV9jb3VudCkge1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAocGFja2FnZV9jb3VudCBcdTAwM2MgMilcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSAtIFZhbGlkYXRlIHRvcG9sb2d5IGZvciBwYWNrYWdlLWF3YXJlIGZlYXR1cmVzXG4mIzQzOyAqXG4mIzQzOyAqIFZhbGlkYXRlcyB0b3BvbG9neSBzeW1tZXRyeSBieSBjaGVja2luZyBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsXG4mIzQzOyAqIG5vZGUgc3RydWN0dXJlLiBVcGRhdGVzIHRoZSBnbG9iYWwgdG9wb2xvZ3lfc3ltbWV0cmljIHZhcmlhYmxlLlxuJiM0MzsgKlxuJiM0MzsgKiBUb3BvbG9neSBpcyB2YWxpZCBvbmx5IHdoZW4gYWxsIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiYjNDM7ICogMS4gQXQgbGVhc3QgMiBwYWNrYWdlcyBleGlzdCAobXVsdGktcGFja2FnZSBzeXN0ZW0pXG4mIzQzOyAqIDIuIEFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBjcHVfbm9kZSBhbmQgbWVtb3J5X29ubHlfbm9kZSBjb3VudHNcbiYjNDM7ICogMy4gRWFjaCBwYWNrYWdlIGhhcyBhdCBsZWFzdCAyIHRvdGFsIG5vZGVzIChjcHVfbm9kZSAmIzQzOyBtZW1vcnlfb25seV9ub2RlIFx1MDAzZT0gMilcbiYjNDM7ICpcbiYjNDM7ICogVmFsaWQgY29uZmlndXJhdGlvbnMgcGVyIHBhY2thZ2U6XG4mIzQzOyAqIC0gMSBjcHVfbm9kZSAmIzQzOyAxIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZClcbiYjNDM7ICogLSAyIGNwdV9ub2RlcyAmIzQzOyAwIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZClcbiYjNDM7ICogLSAwIGNwdV9ub2RlICYjNDM7IDIgbWVtb3J5X29ubHlfbm9kZXMgPSAyIG5vZGVzICh2YWxpZClcbiYjNDM7ICogLSAxIGNwdV9ub2RlICYjNDM7IDAgbWVtb3J5X29ubHlfbm9kZSA9IDEgbm9kZSAoaW52YWxpZCAtIHNpbmdsZSBub2RlIHBhY2thZ2UpXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRXUklURV9PTkNFKHRvcG9sb2d5X3N5bW1ldHJpYywgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSgpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3BhY2thZ2VfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IDAsIG5pZDtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7XG4mIzQzO1x0XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IGNyZWF0ZV9ub2RlX3dpdGhfcGFja2FnZShuaWQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRob3RwbHVnX25vZGVfbm90aWZpZXIobXBfaG90cGx1Z19jYWxsYmFjaywgTUVNVElFUl9IT1RQTFVHX1BSSSk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztsYXRlX2luaXRjYWxsKG1lbW9yeV9wYWNrYWdlX2luaXQpO1xuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcbmluZGV4IDRlNDQyMWIyMmI1OWYuLjY2YmNjYjlhMGExOTEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1wb2xpY3kuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtcG9saWN5LmNcbkBAIC0xMTcsNiAmIzQzOzExNyw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3RsYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdWFjY2Vzcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gXG5AQCAtMTY3LDYgJiM0MzsxNjgsOCBAQCBzdGF0aWMgdW5zaWduZWQgaW50ICpub2RlX2J3X3RhYmxlO1xuICAqL1xuIHN0YXRpYyBERUZJTkVfTVVURVgod2lfc3RhdGVfbG9jayk7XG4gXG4mIzQzO3N0YXRpYyBib29sIHBhY2thZ2VfbW9kZV9lbmFibGVkO1xuJiM0MztcbiBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcbiB7XG4gXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XG5AQCAtMTgwLDYgJiM0MzsxODMsMTEgQEAgc3RhdGljIHU4IGdldF9pbF93ZWlnaHQoaW50IG5vZGUpXG4gXHRyZXR1cm4gd2VpZ2h0O1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBSRUFEX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQpIFx1MDAyNlx1MDAyNiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIENvbnZlcnQgYmFuZHdpZHRoIHZhbHVlcyBpbnRvIHdlaWdodGVkIGludGVybGVhdmUgd2VpZ2h0cy5cbiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay5cbkBAIC0zMzcsNiAmIzQzOzM0NSw0NyBAQCBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChuZWFyZXN0X25vZGVfbm9kZW1hc2spO1xuIFxuJiM0MzsvKipcbiYjNDM7ICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGVcbiYjNDM7ICogQG5vZGU6IFRoZSByZWZlcmVuY2Ugbm9kZSBJRCB0byBtZWFzdXJlIGRpc3RhbmNlIGZyb21cbiYjNDM7ICogQG1hc2s6IFRoZSBzZXQgb2YgY2FuZGlkYXRlIG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdFxuJiM0MzsgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciBhbGwgbm9kZXMgaW4gQG1hc2sgYW5kIG1lYXN1cmVzIHRoZSBkaXN0YW5jZVxuJiM0MzsgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuXG4mIzQzOyAqIEl0IGZpbmRzIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGFuZCB0aGVuIHJlY29yZHMgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXRcbiYjNDM7ICogc2hhcmUgdGhhdCBzYW1lIG1pbmltdW0gZGlzdGFuY2UgaW50byB0aGUgb3V0cHV0IG1hc2sgQG91dC5cbiYjNDM7ICpcbiYjNDM7ICogRm9yIGV4YW1wbGUsIGlmIG11bHRpcGxlIG5vZGVzIGhhdmUgZXF1YWwgbWluaW1hbCBkaXN0YW5jZSB0byBAbm9kZSwgYWxsXG4mIzQzOyAqIG9mIHRoZW0gYXJlIGluY2x1ZGVkIGluIEBvdXQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciAtRUlOVkFMIGlmIEBvdXQgaXMgTlVMTC5cbiYjNDM7ICovXG4mIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZGlzdCwgbiwgbWluX2Rpc3QgPSBJTlRfTUFYO1xuJiM0MztcbiYjNDM7XHRpZiAoIW91dClcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7XG4mIzQzO1x0XHRkaXN0ID0gbm9kZV9kaXN0YW5jZShub2RlLCBuKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoZGlzdCBcdTAwM2MgbWluX2Rpc3QpIHtcbiYjNDM7XHRcdFx0bWluX2Rpc3QgPSBkaXN0O1xuJiM0MztcdFx0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRcdFx0bm9kZV9zZXQobiwgKm91dCk7XG4mIzQzO1x0XHR9IGVsc2UgaWYgKGRpc3QgPT0gbWluX2Rpc3QpIHtcbiYjNDM7XHRcdFx0bm9kZV9zZXQobiwgKm91dCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChuZWFyZXN0X25vZGVzX25vZGVtYXNrKTtcbiYjNDM7XG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBwLVx1MDAzZW1lbXBvbGljeTtcbkBAIC0yMDk3LDE3ICYjNDM7MjE0Niw5NyBAQCBib29sIGFwcGx5X3BvbGljeV96b25lKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgZW51bSB6b25lX3R5cGUgem9uZSlcbiBcdHJldHVybiB6b25lIFx1MDAzZT0gZHluYW1pY19wb2xpY3lfem9uZTtcbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2VcbiYjNDM7ICogQHBvbGljeTogVGFyZ2V0IG1lbXBvbGljeSB3aG9zZSB1c2VyLXNlbGVjdGVkIG5vZGVzIGFyZSBpbiBAcG9saWN5LVx1MDAzZW5vZGVzLlxuJiM0MzsgKiBAbWFzazogICBPdXRwdXQgbm9kZW1hc2suIE9uIHN1Y2Nlc3MsIGNvbnRhaW5zIHBvbGljeS1cdTAwM2Vub2RlcyBsaW1pdGVkIHRvXG4mIzQzOyAqICAgICAgICAgIHRoZSBwYWNrYWdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBhbGxvY2F0aW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGhlbHBlciBjb21iaW5lcyB0d28gY29uc3RyYWludHMgdG8gZGVjaWRlIHdoZXJlIHdpdGhpbiBhIHBhY2thZ2VcbiYjNDM7ICogbWVtb3J5IG1heSBiZSBhbGxvY2F0ZWQ6XG4mIzQzOyAqXG4mIzQzOyAqICAgMSkgVGhlIGNhbGxlciYjMzk7cyBwYWNrYWdlOiBkZXJpdmVkIHZpYSBtcF9nZXRfcGFja2FnZV9ub2RlcyhudW1hX25vZGVfaWQoKSkuXG4mIzQzOyAqICAgMikgVGhlIHVzZXImIzM5O3MgcHJlc2VsZWN0ZWQgc2V0IEBwb2xpY3ktXHUwMDNlbm9kZXMgKGNwdXNldHMvbWVtcG9saWN5KS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGZ1bmN0aW9uIG9idGFpbnMgdGhlIG5vZGVtYXNrIG9mIHRoZSBjdXJyZW50IENQVSYjMzk7cyBwYWNrYWdlIGFuZFxuJiM0MzsgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS1cdTAwM2Vub2Rlcy4gSWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSAoZS5nLiB0aGVcbiYjNDM7ICogdXNlciBleGNsdWRlZCBldmVyeSBub2RlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UpLCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuJiM0MzsgKiBub2RlIGluIEBwb2xpY3ktXHUwMDNlbm9kZXMsIGRlcml2ZXMgdGhhdCBub2RlJiMzOTtzIHBhY2thZ2UsIGFuZCBpbnRlcnNlY3RzXG4mIzQzOyAqIGFnYWluLiBJZiB0aGUgZmFsbGJhY2sgYWxzbyB5aWVsZHMgYW4gZW1wdHkgc2V0LCBAbWFzayBzdGF5cyBlbXB0eSBhbmQgYVxuJiM0MzsgKiBub24temVybyBlcnJvciBpcyByZXR1cm5lZC5cbiYjNDM7ICpcbiYjNDM7ICogRXhhbXBsZXMgKHBhY2thZ2VzOiBQMD17Q1BVOjAsIE1FTToyfSwgUDE9e0NQVToxLCBNRU06M30pOlxuJiM0MzsgKiAgIC0gcG9saWN5LVx1MDAzZW5vZGVzID0gezAsMSwyLDN9XG4mIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezAsMn07IG9uIFAxOiBtYXNrID0gezEsM30uXG4mIzQzOyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MCwxLDN9XG4mIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezB9ICAgICAgKG9ubHkgbm9kZSAwIGZyb20gUDAgaXMgYWxsb3dlZCkuXG4mIzQzOyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MSwyLDN9XG4mIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezJ9ICAgICAgKG9ubHkgbm9kZSAyIGZyb20gUDAgaXMgYWxsb3dlZCkuXG4mIzQzOyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MSwzfVxuJiM0MzsgKiAgICAgICBvbiBQMDogY3VycmVudCBwYWNrYWdlIChQMCkgXHUwMDI2IHBvbGljeSA9IE5VTEwgLVx1MDAzZSBmYWxsYmFjayB0byBwb2xpY3k9MSxcbiYjNDM7ICogICAgICAgICAgICAgICBwYWNrYWdlKDEpPVAxLCBtYXNrID0gezEsM30uIChVc2VyIGVmZmVjdGl2ZWx5IG9wdGVkIG91dCBvZiBQMC4pXG4mIzQzOyAqXG4mIzQzOyAqIElmIHRoZSBzZWxlY3RlZCBub2RlIGlzIGxvdyBvbiBtZW1vcnksIHRoZSBhbGxvY2F0aW9uIG1heSB1c2UgYW5vdGhlciBub2RlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46XG4mIzQzOyAqICAgMCBvbiBzdWNjZXNzIHdpdGggQG1hc2sgc2V0IGFzIGFib3ZlO1xuJiM0MzsgKiAgIC1FSU5WQUwgaWYgQHBvbGljeS9AbWFzayBpcyBOVUxMO1xuJiM0MzsgKiAgIC1FTk9FTlQgaWYgZXZlbiB0aGUgZmFsbGJhY2sgaW50ZXJzZWN0aW9uIGlzIGVtcHR5O1xuJiM0MzsgKiAgIFByb3BhZ2F0ZWQgZXJyb3IgZnJvbSBtcF9nZXRfcGFja2FnZV9ub2RlcygpIG9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHBvbGljeV9yZXNvbHZlX3BhY2thZ2Vfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBub2RlbWFza190ICptYXNrKVxuJiM0Mzt7XG4mIzQzO1x0bm9kZW1hc2tfdCBwYWNrYWdlX21hc2s7XG4mIzQzO1x0aW50IG5vZGUsIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwb2xpY3kgfHwgIW1hc2spXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0bm9kZXNfY2xlYXIoKm1hc2spO1xuJiM0MztcbiYjNDM7XHRub2RlID0gbnVtYV9ub2RlX2lkKCk7XG4mIzQzO1x0cmV0ID0gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMobm9kZSwgXHUwMDI2cGFja2FnZV9tYXNrKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0bm9kZXNfYW5kKCptYXNrLCBwYWNrYWdlX21hc2ssIHBvbGljeS1cdTAwM2Vub2Rlcyk7XG4mIzQzO1x0aWYgKCFub2Rlc19lbXB0eSgqbWFzaykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdXNlciYjMzk7cyBub2RlbWFzayBleGNsdWRlcyBldmVyeSBub2RlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2U7XG4mIzQzO1x0ICogZmFsbCBiYWNrIHRvIHRoZSBwYWNrYWdlIHNwYW5uZWQgYnkgdGhlIHVzZXImIzM5O3Mgb3duIGZpcnN0IG5vZGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0bm9kZSA9IGZpcnN0X25vZGUocG9saWN5LVx1MDAzZW5vZGVzKTtcbiYjNDM7XHRyZXQgPSBtcF9nZXRfcGFja2FnZV9ub2Rlcyhub2RlLCBcdTAwMjZwYWNrYWdlX21hc2spO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRub2Rlc19hbmQoKm1hc2ssIHBhY2thZ2VfbWFzaywgcG9saWN5LVx1MDAzZW5vZGVzKTtcbiYjNDM7XHRpZiAobm9kZXNfZW1wdHkoKm1hc2spKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXG4ge1xuIFx0dW5zaWduZWQgaW50IG5vZGU7XG4gXHR1bnNpZ25lZCBpbnQgY3B1c2V0X21lbXNfY29va2llO1xuJiM0MztcdG5vZGVtYXNrX3QgbWFzaztcbiBcbiByZXRyeTpcbiBcdC8qIHRvIHByZXZlbnQgbWlzY291bnQgdXNlIHRzay1cdTAwM2VtZW1zX2FsbG93ZWRfc2VxIHRvIGRldGVjdCByZWJpbmQgKi9cbiBcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XG4gXHRub2RlID0gY3VycmVudC1cdTAwM2VpbF9wcmV2O1xuLVx0aWYgKCFjdXJyZW50LVx1MDAzZWlsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBwb2xpY3ktXHUwMDNlbm9kZXMpKSB7XG4tXHRcdG5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgcG9saWN5LVx1MDAzZW5vZGVzKTtcbiYjNDM7XG4mIzQzO1x0LyogUGFja2FnZSBtb2RlIG9mZiBvciB1bnJlc29sdmVkOiBmYWxsIGJhY2sgdG8gdGhlIGZ1bGwgcG9saWN5IG5vZGVtYXNrLiAqL1xuJiM0MztcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fFxuJiM0MztcdCAgICBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHBvbGljeSwgXHUwMDI2bWFzaykpXG4mIzQzO1x0XHRtYXNrID0gcG9saWN5LVx1MDAzZW5vZGVzO1xuJiM0MztcbiYjNDM7XHRpZiAoIWN1cnJlbnQtXHUwMDNlaWxfd2VpZ2h0IHx8ICFub2RlX2lzc2V0KG5vZGUsIG1hc2spKSB7XG4mIzQzO1x0XHRub2RlID0gbmV4dF9ub2RlX2luKG5vZGUsIG1hc2spO1xuIFx0XHRpZiAocmVhZF9tZW1zX2FsbG93ZWRfcmV0cnkoY3B1c2V0X21lbXNfY29va2llKSlcbiBcdFx0XHRnb3RvIHJldHJ5O1xuIFx0XHRpZiAobm9kZSA9PSBNQVhfTlVNTk9ERVMpXG5AQCAtMjIwMCw2ICYjNDM7MjMyOSwzMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuIFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBQYWNrYWdlLWF3YXJlIGNvdW50ZXJwYXJ0IG9mIHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soKTogcmVzb2x2ZSB0aGVcbiYjNDM7ICogY3VycmVudCBwYWNrYWdlJiMzOTtzIG5vZGVzIGludGVyc2VjdGVkIHdpdGggdGhlIHBvbGljeSwgZmFsbGluZyBiYWNrIHRvIHRoZVxuJiM0MzsgKiBmdWxsIHBvbGljeSBub2RlbWFzayB3aGVuIHBhY2thZ2UgbW9kZSBpcyBvZmYgb3IgcmVzb2x1dGlvbiBmYWlscy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgbm9kZW1hc2tfdCAqbWFzaylcbiYjNDM7e1xuJiM0MztcdG5vZGVtYXNrX3QgcGFja2FnZV9tYXNrO1xuJiM0MztcbiYjNDM7XHRiYXJyaWVyKCk7XG4mIzQzO1x0aWYgKCF3aV9wYWNrYWdlX21vZGVfZW5hYmxlZCgpKSB7XG4mIzQzO1x0XHRtZW1jcHkobWFzaywgXHUwMDI2cG9sLVx1MDAzZW5vZGVzLCBzaXplb2Yobm9kZW1hc2tfdCkpO1xuJiM0MztcdFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHBvbCwgXHUwMDI2cGFja2FnZV9tYXNrKSlcbiYjNDM7XHRcdG1lbWNweShtYXNrLCBcdTAwMjZwb2wtXHUwMDNlbm9kZXMsIHNpemVvZihub2RlbWFza190KSk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0bWVtY3B5KG1hc2ssIFx1MDAyNnBhY2thZ2VfbWFzaywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcbiYjNDM7XHRiYXJyaWVyKCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBub2Rlc193ZWlnaHQoKm1hc2spO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcbiB7XG4gXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XG5AQCAtMjIxMCw3ICYjNDM7MjM2Myw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcbiBcdHU4IHdlaWdodDtcbiBcdGludCBuaWQgPSAwO1xuIFxuLVx0bnJfbm9kZXMgPSByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZW1hc2spO1xuJiM0MztcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZW1hc2spO1xuIFx0aWYgKCFucl9ub2RlcylcbiBcdFx0cmV0dXJuIG51bWFfbm9kZV9pZCgpO1xuIFxuQEAgLTI2NTQsNyAmIzQzOzI4MDcsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxuIFx0LyogcmVhZCB0aGUgbm9kZXMgb250byB0aGUgc3RhY2ssIHJldHJ5IGlmIGRvbmUgZHVyaW5nIHJlYmluZCAqL1xuIFx0ZG8ge1xuIFx0XHRjcHVzZXRfbWVtc19jb29raWUgPSByZWFkX21lbXNfYWxsb3dlZF9iZWdpbigpO1xuLVx0XHRubm9kZXMgPSByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZXMpO1xuJiM0MztcdFx0bm5vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZXMpO1xuIFx0fSB3aGlsZSAocmVhZF9tZW1zX2FsbG93ZWRfcmV0cnkoY3B1c2V0X21lbXNfY29va2llKSk7XG4gXG4gXHQvKiBpZiB0aGUgbm9kZW1hc2sgaGFzIGJlY29tZSBpbnZhbGlkLCB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgKi9cbkBAIC0zNzk0LDcgJiM0MzszOTQ3LDQyIEBAIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfYXV0b19hdHRyID0ge1xuIFx0LnN0b3JlID0gd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9hdXRvX3N0b3JlLFxuIH07XG4gXG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxuJiM0MztcdFx0c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFwmIzM0OyVzXFxuXCYjMzQ7LCBzdHJfdHJ1ZV9mYWxzZShSRUFEX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQpKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbiYjNDM7XHRcdHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRib29sIGlucHV0O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IGtzdHJ0b2Jvb2woYnVmLCBcdTAwMjZpbnB1dCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRGlzYWJsZSBwYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9naWVzLlxuJiM0MztcdCAqIE5vbi1zeW1tZXRyaWMgdG9wb2xvZ3kgKGUuZy4sIGFzeW1tZXRyaWMgQ1hMIG1lbW9yeSBhdHRhY2htZW50KSBjYW5cbiYjNDM7XHQgKiBjYXVzZSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpZiBwYWNrYWdlLWF3YXJlIGFsbG9jYXRpb24gaXMgdXNlZC5cbiYjNDM7XHQgKiBSZWplY3QgZW5hYmxlIHJlcXVlc3QgaWYgdG9wb2xvZ3kgaXMgbm90IHN5bW1ldHJpYy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaW5wdXQgXHUwMDI2XHUwMDI2ICFtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKSkge1xuJiM0MztcdFx0cHJfd2FybihcJiMzNDtwYWNrYWdlX21vZGUgY2Fubm90IGJlIGVuYWJsZWQgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9neVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdFdSSVRFX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQsIGlucHV0KTtcbiYjNDM7XHRyZXR1cm4gY291bnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfcGFja2FnZV9tb2RlX2F0dHIgPVxuJiM0MztcdF9fQVRUUihwYWNrYWdlX21vZGUsIDA2NjQsIHBhY2thZ2VfbW9kZV9zaG93LCBwYWNrYWdlX21vZGVfc3RvcmUpO1xuJiM0MztcbiBzdGF0aWMgdm9pZCB3aV9jbGVhbnVwKHZvaWQpIHtcbiYjNDM7XHRzeXNmc19yZW1vdmVfZmlsZShcdTAwMjZ3aV9ncm91cC1cdTAwM2V3aV9rb2JqLCBcdTAwMjZ3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3JlbW92ZV9maWxlKFx1MDAyNndpX2dyb3VwLVx1MDAzZXdpX2tvYmosIFx1MDAyNndpX2F1dG9fYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3dpX25vZGVfZGVsZXRlX2FsbCgpO1xuIFx0d2lfc3RhdGVfZnJlZSgpO1xuQEAgLTM5MDAsNiAmIzQzOzQwODgsMTAgQEAgc3RhdGljIGludCBfX2luaXQgYWRkX3dlaWdodGVkX2ludGVybGVhdmVfZ3JvdXAoc3RydWN0IGtvYmplY3QgKm1lbXBvbGljeV9rb2JqKVxuIFx0aWYgKGVycilcbiBcdFx0Z290byBlcnJfcHV0X2tvYmo7XG4gXG4mIzQzO1x0ZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoXHUwMDI2d2lfZ3JvdXAtXHUwMDNld2lfa29iaiwgXHUwMDI2d2lfcGFja2FnZV9tb2RlX2F0dHIuYXR0cik7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdGdvdG8gZXJyX2NsZWFudXBfa29iajtcbiYjNDM7XG4gXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHtcbiBcdFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtOVU1BJiMzNDssCiAgICAmIzM0O05VTUFfTUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0NYTF9CVVMmIzM0OywKICAgICYjMzQ7Q1hMX1JFR0lPTiYjMzQ7LAogICAgJiMzNDtERVZfREFYJiMzNDssCiAgICAmIzM0O0RFVl9EQVhfS01FTSYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wX2FkZF9wYWNrYWdlX25vZGUmIzM0OywKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2Vfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzJiMzNDssCiAgICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgICAmIzM0O21wX25leHRfZGVtb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljJiMzNDssCiAgICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfcHJvYmVfcGFja2FnZV9pZCYjMzQ7LAogICAgJiMzNDtyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDssCiAgICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjVhMmEyYWFjNjQ5YmNhYjZmNDBjMWRjNmZmYWEzNTExMGVkYWI3YQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgQXVnIDYgMDg6Mjg6MjUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2UgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUwMGY5ZTVmZjE5ZQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tcGFja2FnZQpAQCAtMCwwICYjNDM7MSwzNSBAQAomIzQzO1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvCiYjNDM7RGF0ZToJCUF1Z3VzdCAyMDI2CiYjNDM7Q29udGFjdDoJTGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0ICZsdDtsaW51eC1tbUBrdmFjay5vcmcmZ3Q7CiYjNDM7RGVzY3JpcHRpb246CU1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5CiYjNDM7CiYjNDM7CQlBICYjMzQ7bWVtb3J5IHBhY2thZ2UmIzM0OyBncm91cHMgdGhlIE5VTUEgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIG9uZQomIzQzOwkJcGh5c2ljYWwgQ1BVIHBhY2thZ2UgKHNvY2tldCk6IHRoZSBub2RlcyB0aGF0IGhhdmUgQ1BVcyBhbmQKJiM0MzsJCXRoZSBub2RlcyB0aGF0IG9ubHkgaGF2ZSBtZW1vcnkgKGUuZy4gQ1hMIG9yIEhCTSkuCiYjNDM7CiYjNDM7CQlBbGwgYXR0cmlidXRlcyBhcmUgcmVhZC1vbmx5OyB0aGUgdG9wb2xvZ3kgY2Fubm90IGJlCiYjNDM7CQlvdmVycmlkZGVuIGZyb20gdXNlciBzcGFjZS4KJiM0MzsKJiM0MztXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXMKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJQWxsIE5VTUEgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLCBpbiBub2RlbGlzdCBmb3JtYXQKJiM0MzsJCShlLmcuICYjMzQ7MCwyJiMzNDspLgomIzQzOwomIzQzO1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGFja2FnZV9jcHVfbm9kZXMKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJVGhlIG5vZGVzIHRoYXQgaGF2ZSBDUFVzIGluIHRoaXMgcGFja2FnZSwgaW4gbm9kZWxpc3QKJiM0MzsJCWZvcm1hdC4KJiM0MzsKJiM0MztXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2VfbWVtX29ubHlfbm9kZXMKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJVGhlIG5vZGVzIHRoYXQgb25seSBoYXZlIG1lbW9yeSAoZS5nLiBDWEwvSEJNKSBpbiB0aGlzCiYjNDM7CQlwYWNrYWdlLCBpbiBub2RlbGlzdCBmb3JtYXQuCiYjNDM7CiYjNDM7V2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9waHlzaWNhbF9wYWNrYWdlX2lkCiYjNDM7RGF0ZToJCUF1Z3VzdCAyMDI2CiYjNDM7Q29udGFjdDoJTGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0ICZsdDtsaW51eC1tbUBrdmFjay5vcmcmZ3Q7CiYjNDM7RGVzY3JpcHRpb246CVRoZSBwaHlzaWNhbCBwYWNrYWdlIGlkIHRoaXMgZ3JvdXAgY29ycmVzcG9uZHMgdG8sIGFzCiYjNDM7CQlyZXBvcnRlZCBieSBDUFUgdG9wb2xvZ3kuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlCmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlCiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlCkBAIC01MiwzICYjNDM7NTIsMjAgQEAgRGVzY3JpcHRpb246CUF1dG8td2VpZ2h0aW5nIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCiAKIAkJV3JpdGluZyBhIG5ldyB3ZWlnaHQgdG8gYSBub2RlIGRpcmVjdGx5IHZpYSB0aGUgbm9kZU4gaW50ZXJmYWNlCiAJCXdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0aGUgc3lzdGVtIHRvIG1hbnVhbCBtb2RlLgomIzQzOwomIzQzO1doYXQ6CQkvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGUKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJUGFja2FnZS1hd2FyZSB3ZWlnaHRlZCBpbnRlcmxlYXZlIHRvZ2dsZQomIzQzOwomIzQzOwkJJiMzOTt0cnVlJiMzOTsgcmVzdHJpY3RzIHdlaWdodGVkIGludGVybGVhdmUgbm9kZSBzZWxlY3Rpb24gdG8gdGhlCiYjNDM7CQlOVU1BIG5vZGVzIG9mIHRoZSBwYWNrYWdlIChDUFUgc29ja2V0KSB0aGUgYWxsb2NhdGluZyB0YXNrCiYjNDM7CQlpcyBydW5uaW5nIG9uLiAmIzM5O2ZhbHNlJiMzOTsgKHRoZSBkZWZhdWx0KSB1c2VzIHRoZSBleGlzdGluZwomIzQzOwkJd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBiZWhhdmlvci4KJiM0MzsKJiM0MzsJCUVuYWJsaW5nIGlzIHJlamVjdGVkIHdpdGggLUVJTlZBTCB3aGlsZSB0aGUgcGFja2FnZSB0b3BvbG9neQomIzQzOwkJaXMgbm90IHN5bW1ldHJpYy4KJiM0MzsKJiM0MzsJCVdyaXRpbmcgYW55IHRydWUgdmFsdWUgc3RyaW5nIChlLmcuIFkgb3IgMSkgZW5hYmxlcyB0aGUKJiM0MzsJCXJlc3RyaWN0aW9uLCBhbnkgZmFsc2UgdmFsdWUgc3RyaW5nIChlLmcuIE4gb3IgMCkgZGlzYWJsZXMKJiM0MzsJCWl0LiBBbGwgb3RoZXIgc3RyaW5ncyByZXR1cm4gLUVJTlZBTC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jCmluZGV4IGU1MGRjNzE2ZDRlODIuLmFmNjZlMmUwNmM2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uYwpAQCAtMjY3Myw2ICYjNDM7MjY3Myw1NSBAQCBzdGF0aWMgaW50IGN4bF9yZWdpb25fY2FsY3VsYXRlX2FkaXN0YW5jZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCXJldHVybiBOT1RJRllfU1RPUDsKIH0KIAomIzQzOy8qCiYjNDM7ICogRmluZCBhIE5VTUEgbm9kZSB0byBhY3QgYXMgdGhlIGluaXRpYXRvciBmb3IgdGhpcyByZWdpb246IHNjYW4gdGhlCiYjNDM7ICogcmVnaW9uJiMzOTtzIGVuZHBvaW50IHRhcmdldHMgYW5kIHJldHVybiB0aGUgZmlyc3Qgb25lIHRoYXQgcmVzb2x2ZXMgdG8gYQomIzQzOyAqIHZhbGlkIE5VTUEgbm9kZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGN4bF9yZWdpb25fZmluZF9uZWFyZXN0X25vZGUoc3RydWN0IGN4bF9yZWdpb24gKmN4bHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY3hsX3JlZ2lvbl9wYXJhbXMgKnAgPSAmYW1wO2N4bHItJmd0O3BhcmFtczsKJiM0MzsJc3RydWN0IGN4bF9lbmRwb2ludF9kZWNvZGVyICpjeGxlZCA9IE5VTEw7CiYjNDM7CXN0cnVjdCBjeGxfbWVtZGV2ICpjeGxtZCA9IE5VTEw7CiYjNDM7CWludCBpLCBudW1hX25vZGU7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBwLSZndDtucl90YXJnZXRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY3hsZWQgPSBwLSZndDt0YXJnZXRzW2ldOwomIzQzOwkJY3hsbWQgPSBjeGxlZF90b19tZW1kZXYoY3hsZWQpOwomIzQzOwkJbnVtYV9ub2RlID0gZGV2X3RvX25vZGUoJmFtcDtjeGxtZC0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChudW1hX25vZGUgIT0gTlVNQV9OT19OT0RFKQomIzQzOwkJCXJldHVybiBudW1hX25vZGU7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTUFfTk9fTk9ERTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBQYWNrYWdlIG5vdGlmaWVyIGNhbGxiYWNrOiB3aGVuIGEgbmV3IG1lbW9yeSBub2RlIGlzIG9ubGluZWQgdmlhIGRheAomIzQzOyAqIGttZW0sIGJpbmQgdGhlIG5vZGUgdGhpcyBDWEwgcmVnaW9uIGJhY2tzIHRvIGl0cyBtZW1vcnkgcGFja2FnZSwgdXNpbmcKJiM0MzsgKiB0aGUgbmVhcmVzdCByZWdpb24gdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IuIE5vdGlmaWNhdGlvbnMgZm9yIG90aGVyCiYjNDM7ICogbm9kZXMgYXJlIGlnbm9yZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF4X25pZCwgdm9pZCAqZGF0YSkKJiM0Mzt7CiYjNDM7CWludCByZWdpb25fbmlkLCBuZWFyZXN0X25pZCwgcmV0OwomIzQzOwlzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hsciA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGN4bF9yZWdpb24sIHBhY2thZ2Vfbm90aWZpZXIpOwomIzQzOwomIzQzOwlyZWdpb25fbmlkID0gcGh5c190b190YXJnZXRfbm9kZShjeGxyLSZndDtwYXJhbXMucmVzLSZndDtzdGFydCk7CiYjNDM7CWlmIChyZWdpb25fbmlkICE9IGRheF9uaWQpCiYjNDM7CQlyZXR1cm4gTk9USUZZX0RPTkU7CiYjNDM7CiYjNDM7CW5lYXJlc3RfbmlkID0gY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShjeGxyKTsKJiM0MzsJaWYgKG5lYXJlc3RfbmlkID09IE5VTUFfTk9fTk9ERSkKJiM0MzsJCXJldHVybiBOT1RJRllfRE9ORTsKJiM0MzsKJiM0MzsJcmV0ID0gbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoZGF4X25pZCwgbmVhcmVzdF9uaWQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIE5PVElGWV9ET05FOwomIzQzOwomIzQzOwlyZXR1cm4gTk9USUZZX09LOwomIzQzO30KJiM0MzsKIC8qKgogICogZGV2bV9jeGxfYWRkX3JlZ2lvbiAtIEFkZHMgYSByZWdpb24gdG8gYSBkZWNvZGVyCiAgKiBAY3hscmQ6IHJvb3QgZGVjb2RlcgpAQCAtMzg1Miw2ICYjNDM7MzkwMSw3IEBAIHN0YXRpYyB2b2lkIHNodXRkb3duX25vdGlmaWVycyh2b2lkICpfY3hscikKIAogCXVucmVnaXN0ZXJfbm9kZV9ub3RpZmllcigmYW1wO2N4bHItJmd0O25vZGVfbm90aWZpZXIpOwogCXVucmVnaXN0ZXJfbXRfYWRpc3RhbmNlX2FsZ29yaXRobSgmYW1wO2N4bHItJmd0O2FkaXN0X25vdGlmaWVyKTsKJiM0MzsJdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKCZhbXA7Y3hsci0mZ3Q7cGFja2FnZV9ub3RpZmllcik7CiB9CiAKIHN0YXRpYyB2b2lkIHJlbW92ZV9kZWJ1Z2ZzKHZvaWQgKmRlbnRyeSkKQEAgLTQwNjYsNiAmIzQzOzQxMTYsMTAgQEAgc3RhdGljIGludCBjeGxfcmVnaW9uX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIAljeGxyLSZndDthZGlzdF9ub3RpZmllci5wcmlvcml0eSA9IDEwMDsKIAlyZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKCZhbXA7Y3hsci0mZ3Q7YWRpc3Rfbm90aWZpZXIpOwogCiYjNDM7CWN4bHItJmd0O3BhY2thZ2Vfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZTsKJiM0MzsJY3hsci0mZ3Q7cGFja2FnZV9ub3RpZmllci5wcmlvcml0eSA9IDEwMDsKJiM0MzsJcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcigmYW1wO2N4bHItJmd0O3BhY2thZ2Vfbm90aWZpZXIpOwomIzQzOwogCXJjID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KCZhbXA7Y3hsci0mZ3Q7ZGV2LCBzaHV0ZG93bl9ub3RpZmllcnMsIGN4bHIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jeGwvY3hsLmggYi9kcml2ZXJzL2N4bC9jeGwuaAppbmRleCAxMjk3NTk0YmVhZWMzLi45MjgxY2EzYTVmMGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2N4bC9jeGwuaAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2N4bC9jeGwuaApAQCAtNDc3LDYgJiM0Mzs0NzcsNyBAQCBzdHJ1Y3QgY3hsX3JlZ2lvbiB7CiAJc3RydWN0IGFjY2Vzc19jb29yZGluYXRlIGNvb3JkW0FDQ0VTU19DT09SRElOQVRFX01BWF07CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vZGVfbm90aWZpZXI7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFkaXN0X25vdGlmaWVyOwomIzQzOwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFja2FnZV9ub3RpZmllcjsKIH07CiAKIHN0cnVjdCBjeGxfbnZkaW1tX2JyaWRnZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RheC9rbWVtLmMgYi9kcml2ZXJzL2RheC9rbWVtLmMKaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kYXgva21lbS5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZGF4L2ttZW0uYwpAQCAtOTQsNiAmIzQzOzk0LDkgQEAgc3RhdGljIGludCBkZXZfZGF4X2ttZW1fcHJvYmUoc3RydWN0IGRldl9kYXggKmRldl9kYXgpCiAJaWYgKElTX0VSUihtdHlwZSkpCiAJCXJldHVybiBQVFJfRVJSKG10eXBlKTsKIAomIzQzOwkvKiBSZXNvbHZlIHRoZSBtZW1vcnkgcGFja2FnZSBmb3IgdGhpcyBuZXdseSBvbmxpbmVkIGttZW0gbm9kZS4gKi8KJiM0MzsJbXBfcHJvYmVfcGFja2FnZV9pZChudW1hX25vZGUpOwomIzQzOwogCWZvciAoaSA9IDA7IGkgJmx0OyBkZXZfZGF4LSZndDtucl9yYW5nZTsgaSYjNDM7JiM0MzspIHsKIAkJc3RydWN0IHJhbmdlIHJhbmdlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaAppbmRleCA3OTk5YzU4NjI5ZWViLi5mODc3OGM0MzQyOWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgKQEAgLTUyLDEwICYjNDM7NTIsMjUgQEAgaW50IG10X3BlcmZfdG9fYWRpc3RhbmNlKHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZiwgaW50ICphZGlzdCk7CiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCwKIAkJCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTsKIHZvaWQgbXRfcHV0X21lbW9yeV90eXBlcyhzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpOwomIzQzOwomIzQzO2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwomIzQzO3ZvaWQgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwomIzQzO2ludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpOwomIzQzO2ludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCk7CiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGUoaW50IG5pZCk7CiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7CiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpOwomIzQzO2ludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpOwomIzQzO2Jvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpOwogI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTgogaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTsKIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpOwogYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpOwomIzQzOwomIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7CiYjNDM7aW50IG1wX25leHRfZGVtb3Rpb25fbm9kZShpbnQgbmlkKTsKJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTsKJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaykKIHsKQEAgLTcxLDYgJiM0Mzs4NiwzMCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKQogewogCXJldHVybiB0cnVlOwogfQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaWYgKG91dCkKJiM0MzsJCW5vZGVzX2NsZWFyKCpvdXQpOwomIzQzOwlyZXR1cm4gLUVOT0VOVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gTlVNQV9OT19OT0RFOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpCiYjNDM7ewomIzQzOwlpZiAob3V0KQomIzQzOwkJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CXJldHVybiAtRU5PRU5UOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gTlVNQV9OT19OT0RFOwomIzQzO30KICNlbmRpZgogCiAjZWxzZQpAQCAtMTUxLDUgJiM0MzsxOTAsNzkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCwKIHN0YXRpYyBpbmxpbmUgdm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcykKIHsKIH0KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKQomIzQzO3sKJiM0MzsJcmV0dXJuIE5PVElGWV9ET05FOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaWYgKG91dCkKJiM0MzsJCW5vZGVzX2NsZWFyKCpvdXQpOwomIzQzOwlyZXR1cm4gLUVOT0VOVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBtcF9pc190b3BvbG9neV9zeW1tZXRyaWModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpCiYjNDM7ewomIzQzOwlpZiAob3V0KQomIzQzOwkJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CXJldHVybiAtRU5PRU5UOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7fQogI2VuZGlmCS8qIENPTkZJR19OVU1BICovCiAjZW5kaWYgIC8qIF9MSU5VWF9NRU1PUllfVElFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9udW1hLmggYi9pbmNsdWRlL2xpbnV4L251bWEuaAppbmRleCBlNmJhYWY2MDUxYmNmLi40ZjJhMGMzNDQxMjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L251bWEuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L251bWEuaApAQCAtMzMsNiAmIzQzOzMzLDggQEAgaW50IG51bWFfbmVhcmVzdF9ub2RlKGludCBub2RlLCB1bnNpZ25lZCBpbnQgc3RhdGUpOwogCiBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKTsKIAomIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpOwomIzQzOwogI2lmbmRlZiBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZAogaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCk7CiAjZW5kaWYKQEAgLTU0LDYgJiM0Mzs1NiwxNSBAQCBzdGF0aWMgaW5saW5lIGludCBuZWFyZXN0X25vZGVfbm9kZW1hc2soaW50IG5vZGUsIG5vZGVtYXNrX3QgKm1hc2spCiAJcmV0dXJuIE5VTUFfTk9fTk9ERTsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2soaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKm1hc2ssCiYjNDM7CQkJCQkgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaWYgKCFvdXQpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmMKaW5kZXggNTQ4NTFkOGExOTViMC4uNTkzMmRmMzE1NjA0YSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmMKQEAgLTEsNCAmIzQzOzEsNSBAQAogLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY2xlYW51cC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9sb2NrZGVwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc3lzZnMuaCZndDsKQEAgLTUxLDYgJiM0Mzs1MiwxMSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ1c190eXBlIG1lbW9yeV90aWVyX3N1YnN5cyA9IHsKIAkuZGV2X25hbWUgPSAmIzM0O21lbW9yeV90aWVyJiMzNDssCiB9OwogCiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBwYWNrYWdlX3N1YnN5cyA9IHsKJiM0MzsJLm5hbWUgPSAmIzM0O3BhY2thZ2UmIzM0OywKJiM0MzsJLmRldl9uYW1lID0gJiMzNDtwYWNrYWdlJiMzNDssCiYjNDM7fTsKJiM0MzsKICNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkcKIC8qKgogICogZm9saW9fdXNlX2FjY2Vzc190aW1lIC0gY2hlY2sgaWYgYSBmb2xpbyByZXVzZXMgY3B1cGlkIGZvciBwYWdlIGFjY2VzcyB0aW1lCkBAIC0xMDA3LDMgJiM0MzsxMDEzLDEwMDYgQEAgc3RhdGljIGludCBfX2luaXQgbnVtYV9pbml0X3N5c2ZzKHZvaWQpCiBzdWJzeXNfaW5pdGNhbGwobnVtYV9pbml0X3N5c2ZzKTsKICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KICNlbmRpZgomIzQzOwomIzQzOy8qKgomIzQzOyAqIGVudW0gbXBfbm9kZXNfdHlwZSAtIFNlbGVjdG9yIGZvciB3aGljaCBzdWJzZXQgb2YgYSBwYWNrYWdlIHRvIHJldHVybgomIzQzOyAqIEBNUF9OT0RFU19BTEw6ICAgICAgIEFsbCBOVU1BIG5vZGVzIHRoYXQgYmVsb25nIHRvIHRoZSBwYWNrYWdlLgomIzQzOyAqIEBNUF9OT0RFU19DUFU6ICAgICAgIE9ubHkgQ1BVIG5vZGVzIGluIHRoZSBwYWNrYWdlLgomIzQzOyAqIEBNUF9OT0RFU19NRU1fT05MWTogIE9ubHkgbWVtb3J5LW9ubHkgbm9kZXMgKGUuZy4gQ1hML0hCTSkgaW4gdGhlIHBhY2thZ2UuCiYjNDM7ICoKJiM0MzsgKiBVc2VkIGludGVybmFsbHkgdG8gY2hvb3NlIHdoaWNoIG5vZGVtYXNrIHRvIGV4cG9zZSBmb3IgYSBnaXZlbiBwYWNrYWdlLgomIzQzOyAqLwomIzQzO2VudW0gbXBfbm9kZXNfdHlwZSB7CiYjNDM7CU1QX05PREVTX0FMTCwKJiM0MzsJTVBfTk9ERVNfQ1BVLAomIzQzOwlNUF9OT0RFU19NRU1fT05MWQomIzQzO307CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogc3RydWN0IG1lbW9yeV9wYWNrYWdlIC0gUGVyLXBoeXNpY2FsLXBhY2thZ2UgY29udGFpbmVyCiYjNDM7ICogQHBhY2thZ2VfaWQ6ICAgICAgICAgIFBoeXNpY2FsIHBhY2thZ2UgaWQgKGZyb20gdG9wb2xvZ3kpLgomIzQzOyAqIEBub2RlczogICAgICAgICAgICAgICBOb2RlbWFzayBvZiBhbGwgbWVtYmVyIG5vZGVzIGluIHRoaXMgcGFja2FnZS4KJiM0MzsgKiBAY3B1X25vZGVzOiAgICAgICAgICAgTm9kZW1hc2sgb2YgQ1BVIG5vZGVzIGluIHRoaXMgcGFja2FnZS4KJiM0MzsgKiBAbWVtb3J5X29ubHlfbm9kZXM6ICAgTm9kZW1hc2sgb2YgbWVtb3J5LW9ubHkgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLgomIzQzOyAqIEBjcHVfbGlzdDogICAgICAgICAgICBMaXN0IGhlYWQgb2YgQ1BVLXR5cGUgbWVtYmVycy4KJiM0MzsgKiBAbWVtb3J5X29ubHlfbGlzdDogICAgTGlzdCBoZWFkIG9mIG1lbW9yeS1vbmx5IG1lbWJlcnMuCiYjNDM7ICogQGxpc3Q6ICAgICAgICAgICAgICAgIExpbmthZ2Ugb24gdGhlIGdsb2JhbCBAbWVtb3J5X3BhY2thZ2VzIGxpc3QuCiYjNDM7ICogQGRldjogICAgICAgICAgICAgICAgIHN5c2ZzIGRldmljZSBmb3IgdGhpcyBwYWNrYWdlLgomIzQzOyAqCiYjNDM7ICogQSBtZW1vcnlfcGFja2FnZSBncm91cHMgTlVNQSBub2RlcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHBoeXNpY2FsIENQVSBwYWNrYWdlLgomIzQzOyAqIFRoZSBtYXNrcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgcGFja2FnZS1sb2NhbCBwbGFjZW1lbnQvZGVtb3Rpb24vcHJvbW90aW9uLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtZW1vcnlfcGFja2FnZSB7CiYjNDM7CWludCBwYWNrYWdlX2lkOwomIzQzOwlub2RlbWFza190IG5vZGVzOwomIzQzOwlub2RlbWFza190IGNwdV9ub2RlczsKJiM0MzsJbm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlczsKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCBjcHVfbGlzdDsKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCBtZW1vcnlfb25seV9saXN0OwomIzQzOwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiYjNDM7CXN0cnVjdCBkZXZpY2UgZGV2OwomIzQzO307CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogZW51bSBtcG5fc291cmNlX2ZsYWdzIC0gU291cmNlIHVzZWQgdG8gcmVzb2x2ZSBhIG5vZGUmIzM5O3MgcGFja2FnZSBtZW1iZXJzaGlwCiYjNDM7ICogQE1QTl9TUkNfVU5LTk9XTjogICAgIFVua25vd24vdW5zcGVjaWZpZWQuCiYjNDM7ICogQE1QTl9TUkNfQ1BVOiAgICAgICAgIERpcmVjdGx5IHJlc29sdmVkIGZyb20gYSBDUFUgbm9kZSAoMToxKS4KJiM0MzsgKiBATVBOX1NSQ19JTklUSUFUT1I6ICAgUmVzb2x2ZWQgdmlhIGFuIGluaXRpYXRvciBDUFUgbm9kZSBwcm92aWRlZCBieSBhIGRyaXZlci4KJiM0MzsgKiBATVBOX1NSQ19TTElUOiAgICAgICAgUmVzb2x2ZWQgdmlhIFNMSVQvbmVhcmVzdC1ub2RlLgomIzQzOyAqCiYjNDM7ICogVGhlc2UgZmxhZ3MgYXJlIGluZm9ybWF0aW9uYWw7IHRoZXkgZGVzY3JpYmUgaG93IGEgZ2l2ZW4gbm9kZSB3YXMgYm91bmQgdG8KJiM0MzsgKiBpdHMgcGFja2FnZSBhbmQgaGVscCB3aXRoIHBvbGljeSBkZWNpc2lvbnMgbGF0ZXIuCiYjNDM7ICovCiYjNDM7ZW51bSBtcG5fc291cmNlX2ZsYWdzIHsKJiM0MzsJTVBOX1NSQ19VTktOT1dOCQk9IDAsCiYjNDM7CU1QTl9TUkNfQ1BVCQk9IEJJVCgxKSwKJiM0MzsJTVBOX1NSQ19JTklUSUFUT1IJPSBCSVQoMiksCiYjNDM7CU1QTl9TUkNfU0xJVAkJPSBCSVQoMykKJiM0Mzt9OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlIC0gUGVyLW5vZGUgbWVtYmVyc2hpcCBhbmQgcHJlZmVyZW5jZXMKJiM0MzsgKiBAbmlkOiAgICAgICAgICAgICAgTlVNQSBub2RlIGlkIGZvciB0aGlzIGVudHJ5LgomIzQzOyAqIEBpbml0aWF0b3JfbmlkOiAgICBDUFUgbmlkIHRoYXQgc2VydmVkIGFzIHRoZSBpbml0aWF0b3Igd2hlbiByZXNvbHZpbmcgQG5pZC4KJiM0MzsgKiBAcGFja2FnZV9pZDogICAgICAgUmVzb2x2ZWQgcGFja2FnZSBpZCB0aGF0IEBuaWQgYmVsb25ncyB0by4KJiM0MzsgKiBAc291cmNlX2ZsYWdzOiAgICAgT25lIG9mICZhbXA7ZW51bSBtcG5fc291cmNlX2ZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlc29sdXRpb24uCiYjNDM7ICogQHByZWZlcnJlZDogICAgICAgIE9wcG9zaXRlLXR5cGUgbmVhcmVzdCBjYW5kaWRhdGVzIGluc2lkZSB0aGUgc2FtZSBwYWNrYWdlLgomIzQzOyAqIEBwYWNrYWdlOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvd25pbmcgJmFtcDtzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKE5VTEwgdW50aWwgYm91bmQpLgomIzQzOyAqIEBwYWNrYWdlX2VudHJ5OiAgICBMaW5rYWdlIG9uIHRoZSBvd25pbmcgcGFja2FnZSYjMzk7cyB0eXBlIGxpc3QuCiYjNDM7ICoKJiM0MzsgKiBFYWNoIE5VTUEgbm9kZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBwYWNrYWdlLWF3YXJlIHBvbGljeSBnZXRzIGEgd3JhcHBlciBlbnRyeQomIzQzOyAqIHRoYXQgY2FjaGVzIHBhY2thZ2UgbWVtYmVyc2hpcCBhbmQgdGhlIHByZWNvbXB1dGVkIHNldCBvZiBwcmVmZXJyZWQgdGFyZ2V0cy4KJiM0MzsgKi8KJiM0MztzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSB7CiYjNDM7CWludCBuaWQ7CiYjNDM7CWludCBpbml0aWF0b3JfbmlkOwomIzQzOwlpbnQgcGFja2FnZV9pZDsKJiM0MzsJaW50IHNvdXJjZV9mbGFnczsKJiM0MzsJbm9kZW1hc2tfdCBwcmVmZXJyZWQ7CiYjNDM7CXN0cnVjdCBtZW1vcnlfcGFja2FnZSAqcGFja2FnZTsKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCBwYWNrYWdlX2VudHJ5OwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBub2RlX2lzX21lbW9yeV9vbmx5KF9uaWQpIFwKJiM0MzsJKG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgJmFtcDsmYW1wOyAhbm9kZV9zdGF0ZSgoX25pZCksIE5fQ1BVKSkKJiM0MzsKJiM0MztzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChtcF9wYWNrYWdlX2FsZ29yaXRobXMpOwomIzQzOwomIzQzO3N0YXRpYyBMSVNUX0hFQUQobWVtb3J5X3BhY2thZ2VzKTsKJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbnNbTUFYX05VTU5PREVTXTsKJiM0MztzdGF0aWMgREVGSU5FX01VVEVYKG1lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOy8qCiYjNDM7ICogUkNVIHNuYXBzaG90IG9mIHRoZSBwYWNrYWdlIHRvcG9sb2d5LiBUaGUgYWxsb2NhdGlvbiBwYXRoIHJlYWRzIGl0CiYjNDM7ICogb2Z0ZW4sIHNvIGl0IGlzIHB1Ymxpc2hlZCBmb3IgbG9ja2xlc3MgcmVhZHMgaW5zdGVhZCBvZiBsb2NraW5nIG9uCiYjNDM7ICogZXZlcnkgYWNjZXNzLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtcF9zbmFwc2hvdCB7CiYjNDM7CXN0cnVjdCByY3VfaGVhZCByY3U7CiYjNDM7CWludCBucl9wYWNrYWdlczsKJiM0MzsJaW50IHBrZ19vZltNQVhfTlVNTk9ERVNdOwomIzQzOwlzdHJ1Y3QgewomIzQzOwkJbm9kZW1hc2tfdCBub2RlczsKJiM0MzsJCW5vZGVtYXNrX3QgY3B1X25vZGVzOwomIzQzOwkJbm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlczsKJiM0MzsJfSBwa2dbXTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbXBfc25hcHNob3QgX19yY3UgKm1wX3NuYXBzaG90OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIgLSBSZWdpc3RlciBhIHBhY2thZ2UgcmVzb2x1dGlvbiBhbGdvcml0aG0KJiM0MzsgKiBAbm90aWZpZXI6IE5vdGlmaWVyIGNhbGxlZCB3aXRoIHRoZSBuaWQgdG8gcmVzb2x2ZSAoc2VlIG1wX3Byb2JlX3BhY2thZ2VfaWQoKSkuCiYjNDM7ICoKJiM0MzsgKiBEcml2ZXJzIChlLmcuLCBDWEwgcmVnaW9uL2RlY29kZXIgY29kZSkgcmVnaXN0ZXIgaGVyZSB0byBzdXBwbHkgYSBwYWNrYWdlCiYjNDM7ICogaGludCBmb3IgbmV3bHkgYXBwZWFyaW5nIG5vZGVzLiBUaGUgbm90aWZpZXIgaXMgaW52b2tlZCBkdXJpbmcgbmlkLSZndDtwYWNrYWdlCiYjNDM7ICogcmVzb2x1dGlvbi4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCiYjNDM7ewomIzQzOwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmFtcDttcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcik7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gVW5yZWdpc3RlciBhIHBhY2thZ2UgcmVzb2x1dGlvbiBhbGdvcml0aG0KJiM0MzsgKiBAbm90aWZpZXI6IE5vdGlmaWVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoKS4KJiM0MzsgKi8KJiM0Mzt2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKQomIzQzO3sKJiM0MzsJYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmYW1wO21wX3BhY2thZ2VfYWxnb3JpdGhtcywgbm90aWZpZXIpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX3Byb2JlX3BhY2thZ2VfaWQgLSBJbnZva2UgcmVnaXN0ZXJlZCBub3RpZmllcnMgdG8gcmVzb2x2ZSBhIG5vZGUmIzM5O3MgcGFja2FnZQomIzQzOyAqIEBuaWQ6IE5VTUEgbm9kZSBpZCB0byByZXNvbHZlLgomIzQzOyAqCiYjNDM7ICogQ2FsbHMgdGhlIGJsb2NraW5nIG5vdGlmaWVyIGNoYWluIHRvIGxldCBzdWJzeXN0ZW1zIHByb3ZpZGUgYW4gaW5pdGlhdG9yIG9yCiYjNDM7ICogcGFja2FnZSBpZCBmb3IgQG5pZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogTm90aWZpZXIgcmV0dXJuIGNvZGUgKCZndDs9MCB0eXBpY2FsbHkpOyBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO2ludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmYW1wO21wX3BhY2thZ2VfYWxnb3JpdGhtcywgbmlkLCBOVUxMKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfcHJvYmVfcGFja2FnZV9pZCk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CWludCBwYWNrYWdlX2lkOwomIzQzOwl1bnNpZ25lZCBpbnQgZmlyc3RfY3B1OwomIzQzOwljb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hc2s7CiYjNDM7CiYjNDM7CWlmIChuaWQgJmx0OyAwIHx8IG5pZCAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9DUFUpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CWNwdV9tYXNrID0gY3B1bWFza19vZl9ub2RlKG5pZCk7CiYjNDM7CWlmIChjcHVtYXNrX2VtcHR5KGNwdV9tYXNrKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlmaXJzdF9jcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9tYXNrKTsKJiM0MzsJaWYgKGZpcnN0X2NwdSAmZ3Q7PSBucl9jcHVfaWRzKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CXBhY2thZ2VfaWQgPSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGZpcnN0X2NwdSk7CiYjNDM7CWlmIChwYWNrYWdlX2lkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlyZXR1cm4gcGFja2FnZV9pZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0CiYjNDM7CSAqIG1lbW9yeS1vbmx5IG5vZGUocykgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UuIElmIHRoZSBwYWNrYWdlIGhhcwomIzQzOwkgKiBubyBtZW1vcnktb25seSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2Ugc28gY2FsbGVycwomIzQzOwkgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC4KJiM0MzsJICovCiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnkobXBuLCAmYW1wO21wLSZndDtjcHVfbGlzdCwgcGFja2FnZV9lbnRyeSkgewomIzQzOwkJbm9kZXNfY2xlYXIobXBuLSZndDtwcmVmZXJyZWQpOwomIzQzOwkJaWYgKCFub2Rlc19lbXB0eShtcC0mZ3Q7bWVtb3J5X29ubHlfbm9kZXMpKQomIzQzOwkJCW5lYXJlc3Rfbm9kZXNfbm9kZW1hc2sobXBuLSZndDtuaWQsICZhbXA7bXAtJmd0O21lbW9yeV9vbmx5X25vZGVzLAomIzQzOwkJCQkJICAgICAgICZhbXA7bXBuLSZndDtwcmVmZXJyZWQpOwomIzQzOwkJZWxzZQomIzQzOwkJCW5vZGVfc2V0KG1wbi0mZ3Q7bmlkLCBtcG4tJmd0O3ByZWZlcnJlZCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU3ltbWV0cmljYWxseSwgZm9yIGVhY2ggbWVtb3J5LW9ubHkgbm9kZSwgY29tcHV0ZSBpdHMgcHJlZmVycmVkIHNldAomIzQzOwkgKiBhcyB0aGUgbmVhcmVzdCBDUFUgbm9kZShzKSB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZS4gSWYgdGhlIHBhY2thZ2UKJiM0MzsJICogaGFzIG5vIENQVSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2UuCiYjNDM7CSAqLwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wbiwgJmFtcDttcC0mZ3Q7bWVtb3J5X29ubHlfbGlzdCwgcGFja2FnZV9lbnRyeSkgewomIzQzOwkJbm9kZXNfY2xlYXIobXBuLSZndDtwcmVmZXJyZWQpOwomIzQzOwkJaWYgKCFub2Rlc19lbXB0eShtcC0mZ3Q7Y3B1X25vZGVzKSkKJiM0MzsJCQluZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi0mZ3Q7bmlkLCAmYW1wO21wLSZndDtjcHVfbm9kZXMsCiYjNDM7CQkJCQkgICAgICAgJmFtcDttcG4tJmd0O3ByZWZlcnJlZCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbm9kZV9zZXQobXBuLSZndDtuaWQsIG1wbi0mZ3Q7cHJlZmVycmVkKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkoc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCkKJiM0Mzt7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIChub2Rlc19lbXB0eShtcC0mZ3Q7Y3B1X25vZGVzKSAmYW1wOyZhbXA7IG5vZGVzX2VtcHR5KG1wLSZndDttZW1vcnlfb25seV9ub2RlcykpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGFja2FnZV9ub2RlX2lzX3ZhbGlkKGludCBuaWQpCiYjNDM7ewomIzQzOwlpZiAoIW1wbnNbbmlkXSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKG5vZGVzX2VtcHR5KG1wbnNbbmlkXS0mZ3Q7cHJlZmVycmVkKSB8fCAobXBuc1tuaWRdLSZndDtwYWNrYWdlID09IE5VTEwpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1lbW9yeV9wYWNrYWdlX2dyb3Vwc1tdOwomIzQzOwomIzQzOy8qIEZyZWVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBwYWNrYWdlJiMzOTtzIHN5c2ZzIGRldmljZSBpcyBkcm9wcGVkLiAqLwomIzQzO3N0YXRpYyB2b2lkIG1lbW9yeV9wYWNrYWdlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1vcnlfcGFja2FnZSwgZGV2KTsKJiM0MzsKJiM0MzsJa2ZyZWUobXApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlICpjcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1lbXBhY2thZ2U7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW1lbXBhY2thZ2UgPSBremFsbG9jX29iaigqbWVtcGFja2FnZSk7CiYjNDM7CWlmICghbWVtcGFja2FnZSkKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwomIzQzOwomIzQzOwltZW1wYWNrYWdlLSZndDtwYWNrYWdlX2lkID0gcGFja2FnZV9pZDsKJiM0MzsJbWVtcGFja2FnZS0mZ3Q7bm9kZXMgPSBOT0RFX01BU0tfTk9ORTsKJiM0MzsJbWVtcGFja2FnZS0mZ3Q7Y3B1X25vZGVzID0gTk9ERV9NQVNLX05PTkU7CiYjNDM7CW1lbXBhY2thZ2UtJmd0O21lbW9yeV9vbmx5X25vZGVzID0gTk9ERV9NQVNLX05PTkU7CiYjNDM7CUlOSVRfTElTVF9IRUFEKCZhbXA7bWVtcGFja2FnZS0mZ3Q7Y3B1X2xpc3QpOwomIzQzOwlJTklUX0xJU1RfSEVBRCgmYW1wO21lbXBhY2thZ2UtJmd0O21lbW9yeV9vbmx5X2xpc3QpOwomIzQzOwlJTklUX0xJU1RfSEVBRCgmYW1wO21lbXBhY2thZ2UtJmd0O2xpc3QpOwomIzQzOwlkZXZpY2VfaW5pdGlhbGl6ZSgmYW1wO21lbXBhY2thZ2UtJmd0O2Rldik7CiYjNDM7CW1lbXBhY2thZ2UtJmd0O2Rldi5yZWxlYXNlID0gbWVtb3J5X3BhY2thZ2VfcmVsZWFzZTsKJiM0MzsJZGV2X3NldF9kcnZkYXRhKCZhbXA7bWVtcGFja2FnZS0mZ3Q7ZGV2LCBtZW1wYWNrYWdlKTsKJiM0MzsJbWVtcGFja2FnZS0mZ3Q7ZGV2LmJ1cyA9ICZhbXA7cGFja2FnZV9zdWJzeXM7CiYjNDM7CW1lbXBhY2thZ2UtJmd0O2Rldi5ncm91cHMgPSBtZW1vcnlfcGFja2FnZV9ncm91cHM7CiYjNDM7CXJldCA9IGRldl9zZXRfbmFtZSgmYW1wO21lbXBhY2thZ2UtJmd0O2RldiwgJiMzNDtwYWNrYWdlJWQmIzM0OywgcGFja2FnZV9pZCk7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCXB1dF9kZXZpY2UoJmFtcDttZW1wYWNrYWdlLSZndDtkZXYpOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gbWVtcGFja2FnZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1lbXBhY2thZ2UsICpleGlzdGluZzsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbXBhY2thZ2UsICZhbXA7bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7CiYjNDM7CQlpZiAobWVtcGFja2FnZS0mZ3Q7cGFja2FnZV9pZCA9PSBwYWNrYWdlX2lkKSB7CiYjNDM7CQkJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CQkJcmV0dXJuIG1lbXBhY2thZ2U7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW1lbXBhY2thZ2UgPSBjcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7CiYjNDM7CWlmIChJU19FUlIobWVtcGFja2FnZSkpCiYjNDM7CQlyZXR1cm4gbWVtcGFja2FnZTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV4aXN0aW5nLCAmYW1wO21lbW9yeV9wYWNrYWdlcywgbGlzdCkgewomIzQzOwkJaWYgKGV4aXN0aW5nLSZndDtwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHsKJiM0MzsJCQltdXRleF91bmxvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJCQlwdXRfZGV2aWNlKCZhbXA7bWVtcGFja2FnZS0mZ3Q7ZGV2KTsKJiM0MzsJCQlyZXR1cm4gZXhpc3Rpbmc7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJbGlzdF9hZGQoJmFtcDttZW1wYWNrYWdlLSZndDtsaXN0LCAmYW1wO21lbW9yeV9wYWNrYWdlcyk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlyZXQgPSBkZXZpY2VfYWRkKCZhbXA7bWVtcGFja2FnZS0mZ3Q7ZGV2KTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJbXV0ZXhfbG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwkJbGlzdF9kZWwoJmFtcDttZW1wYWNrYWdlLSZndDtsaXN0KTsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwkJcHV0X2RldmljZSgmYW1wO21lbXBhY2thZ2UtJmd0O2Rldik7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUihyZXQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBtZW1wYWNrYWdlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBtcF9zbmFwc2hvdF9yZWJ1aWxkKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbXBfc25hcHNob3QgKm5ldywgKm9sZDsKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDsKJiM0MzsJaW50IG5yID0gMCwgaSA9IDAsIG5pZDsKJiM0MzsKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCAmYW1wO21lbW9yeV9wYWNrYWdlcywgbGlzdCkKJiM0MzsJCW5yJiM0MzsmIzQzOzsKJiM0MzsKJiM0MzsJbmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghbmV3KQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwltZW1zZXQobmV3LSZndDtwa2dfb2YsIDB4ZmYsIHNpemVvZihuZXctJmd0O3BrZ19vZikpOwomIzQzOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCAmYW1wO21lbW9yeV9wYWNrYWdlcywgbGlzdCkgewomIzQzOwkJbmV3LSZndDtwa2dbaV0ubm9kZXMgPSBtcC0mZ3Q7bm9kZXM7CiYjNDM7CQluZXctJmd0O3BrZ1tpXS5jcHVfbm9kZXMgPSBtcC0mZ3Q7Y3B1X25vZGVzOwomIzQzOwkJbmV3LSZndDtwa2dbaV0ubWVtb3J5X29ubHlfbm9kZXMgPSBtcC0mZ3Q7bWVtb3J5X29ubHlfbm9kZXM7CiYjNDM7CQlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBtcC0mZ3Q7bm9kZXMpCiYjNDM7CQkJbmV3LSZndDtwa2dfb2ZbbmlkXSA9IGk7CiYjNDM7CQlpJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwluZXctJmd0O25yX3BhY2thZ2VzID0gbnI7CiYjNDM7CiYjNDM7CW9sZCA9IHJjdV9yZXBsYWNlX3BvaW50ZXIobXBfc25hcHNob3QsIG5ldywKJiM0MzsJCQkJICBsb2NrZGVwX2lzX2hlbGQoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKSk7CiYjNDM7CWlmIChvbGQpCiYjNDM7CQlrdmZyZWVfcmN1KG9sZCwgcmN1KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBiaW5kX25vZGVfdG9fcGFja2FnZShpbnQgbmlkKQomIzQzO3sKJiM0MzsJaW50IHBhY2thZ2VfaWQsIHBrZ19pZDsKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDsKJiM0MzsJbm9kZW1hc2tfdCBub2RlcywgY3B1LCBtZW07CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJaWYgKCFtcG5zW25pZF0pIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsJcGFja2FnZV9pZCA9IG1wbnNbbmlkXS0mZ3Q7cGFja2FnZV9pZDsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW1wID0gZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7CiYjNDM7CWlmIChJU19FUlIobXApKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIobXApOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CWlmICghbXBuc1tuaWRdKSB7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CW1wbnNbbmlkXS0mZ3Q7cGFja2FnZSA9IG1wOwomIzQzOwlub2RlX3NldChtcG5zW25pZF0tJmd0O25pZCwgbXAtJmd0O25vZGVzKTsKJiM0MzsJaWYgKG5vZGVfaXNfbWVtb3J5X29ubHkobXBuc1tuaWRdLSZndDtuaWQpKSB7CiYjNDM7CQlub2RlX3NldChtcG5zW25pZF0tJmd0O25pZCwgbXAtJmd0O21lbW9yeV9vbmx5X25vZGVzKTsKJiM0MzsJCWxpc3RfYWRkKCZhbXA7bXBuc1tuaWRdLSZndDtwYWNrYWdlX2VudHJ5LCAmYW1wO21wLSZndDttZW1vcnlfb25seV9saXN0KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW5vZGVfc2V0KG1wbnNbbmlkXS0mZ3Q7bmlkLCBtcC0mZ3Q7Y3B1X25vZGVzKTsKJiM0MzsJCWxpc3RfYWRkKCZhbXA7bXBuc1tuaWRdLSZndDtwYWNrYWdlX2VudHJ5LCAmYW1wO21wLSZndDtjcHVfbGlzdCk7CiYjNDM7CX0KJiM0MzsJdXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKG1wKTsKJiM0MzsJbXBfc25hcHNob3RfcmVidWlsZCgpOwomIzQzOwlwa2dfaWQgPSBtcC0mZ3Q7cGFja2FnZV9pZDsKJiM0MzsJbm9kZXMgPSBtcC0mZ3Q7bm9kZXM7CiYjNDM7CWNwdSA9IG1wLSZndDtjcHVfbm9kZXM7CiYjNDM7CW1lbSA9IG1wLSZndDttZW1vcnlfb25seV9ub2RlczsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CXByX2luZm8oJiMzNDttZW1vcnlfcGFja2FnZSAlZDogbm9kZXM9JSpwYmwgY3B1PSUqcGJsIG1lbW9yeV9vbmx5PSUqcGJsXG4mIzM0OywKJiM0MzsJCXBrZ19pZCwgbm9kZW1hc2tfcHJfYXJncygmYW1wO25vZGVzKSwKJiM0MzsJCW5vZGVtYXNrX3ByX2FyZ3MoJmFtcDtjcHUpLCBub2RlbWFza19wcl9hcmdzKCZhbXA7bWVtKSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB1bmJpbmRfbm9kZV90b19wYWNrYWdlKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsIGludCBuaWQpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW5vZGVfY2xlYXIobmlkLCBtcC0mZ3Q7bm9kZXMpOwomIzQzOwlpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSkKJiM0MzsJCW5vZGVfY2xlYXIobmlkLCBtcC0mZ3Q7Y3B1X25vZGVzKTsKJiM0MzsJZWxzZQomIzQzOwkJbm9kZV9jbGVhcihuaWQsIG1wLSZndDttZW1vcnlfb25seV9ub2Rlcyk7CiYjNDM7CiYjNDM7CWlmIChtcG5zW25pZF0pCiYjNDM7CQlsaXN0X2RlbCgmYW1wO21wbnNbbmlkXS0mZ3Q7cGFja2FnZV9lbnRyeSk7CiYjNDM7CiYjNDM7CXVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChtcCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqY3JlYXRlX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCkKJiM0Mzt7CiYjNDM7CWludCBjcHVfbmlkLCBwYWNrYWdlX2lkOwomIzQzOwlpbnQgc291cmNlX2ZsYWdzOwomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuOwomIzQzOwomIzQzOwlpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSkgewomIzQzOwkJY3B1X25pZCA9IG5pZDsKJiM0MzsJCXNvdXJjZV9mbGFncyA9IE1QTl9TUkNfQ1BVOwomIzQzOwl9IGVsc2UgewomIzQzOwkJaWYgKGluaXRpYXRvcl9uaWQgJmd0Oz0gMCkgewomIzQzOwkJCWNwdV9uaWQgPSBpbml0aWF0b3JfbmlkOwomIzQzOwkJCXNvdXJjZV9mbGFncyA9IE1QTl9TUkNfSU5JVElBVE9SOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIE5vIGRyaXZlci1zdXBwbGllZCBpbml0aWF0b3I6IGZhbGwgYmFjayB0byB0aGUKJiM0MzsJCQkgKiBuZWFyZXN0IENQVSBub2RlICh2aWEgU0xJVC9udW1hX2Rpc3RhbmNlKS4KJiM0MzsJCQkgKi8KJiM0MzsJCQljcHVfbmlkID0gbnVtYV9uZWFyZXN0X25vZGUobmlkLCBOX0NQVSk7CiYjNDM7CQkJc291cmNlX2ZsYWdzID0gTVBOX1NSQ19TTElUOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXBhY2thZ2VfaWQgPSBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoY3B1X25pZCk7CiYjNDM7CWlmIChwYWNrYWdlX2lkICZsdDsgMCkKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwomIzQzOwomIzQzOwltcG4gPSBremFsbG9jX29iaigqbXBuKTsKJiM0MzsJaWYgKCFtcG4pCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsKJiM0MzsJbXBuLSZndDtuaWQgPSBuaWQ7CiYjNDM7CW1wbi0mZ3Q7aW5pdGlhdG9yX25pZCA9IGNwdV9uaWQ7CiYjNDM7CW1wbi0mZ3Q7cGFja2FnZV9pZCA9IHBhY2thZ2VfaWQ7CiYjNDM7CW1wbi0mZ3Q7c291cmNlX2ZsYWdzID0gc291cmNlX2ZsYWdzOwomIzQzOwltcG4tJmd0O3ByZWZlcnJlZCA9IE5PREVfTUFTS19OT05FOwomIzQzOwltcG4tJmd0O3BhY2thZ2UgPSBOVUxMOwomIzQzOwlJTklUX0xJU1RfSEVBRCgmYW1wO21wbi0mZ3Q7cGFja2FnZV9lbnRyeSk7CiYjNDM7CiYjNDM7CXJldHVybiBtcG47CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVG9wb2xvZ3kgc3ltbWV0cnkgc3RhdHVzCiYjNDM7ICogSW5kaWNhdGVzIHdoZXRoZXIgYWxsIHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsIG5vZGUgc3RydWN0dXJlCiYjNDM7ICogKHNhbWUgbnVtYmVyIG9mIENQVSBub2RlcyBhbmQgbWVtb3J5LW9ubHkgbm9kZXMpLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIHRvcG9sb2d5X3N5bW1ldHJpYzsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSh2b2lkKTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlICpfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuOwomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCAqdW5yZWdfbXAgPSBOVUxMOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW1wbiA9IG1wbnNbbmlkXTsKJiM0MzsJaWYgKCFtcG4pCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJbXAgPSBtcG4tJmd0O3BhY2thZ2U7CiYjNDM7CWlmIChtcCkgewomIzQzOwkJdW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTsKJiM0MzsJCW1wbi0mZ3Q7cGFja2FnZSA9IE5VTEw7CiYjNDM7CiYjNDM7CQlpZiAobWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkobXApKSB7CiYjNDM7CQkJbGlzdF9kZWwoJmFtcDttcC0mZ3Q7bGlzdCk7CiYjNDM7CQkJdW5yZWdfbXAgPSBtcDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwltcG5zW25pZF0gPSBOVUxMOwomIzQzOwlrZnJlZShtcG4pOwomIzQzOwltcF9zbmFwc2hvdF9yZWJ1aWxkKCk7CiYjNDM7CiYjNDM7CXJldHVybiB1bnJlZ19tcDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZGVzdHJveV9wYWNrYWdlX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1vcnlfcGFja2FnZSAqdW5yZWdfbXA7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJdW5yZWdfbXAgPSBfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlpZiAodW5yZWdfbXApCiYjNDM7CQlkZXZpY2VfdW5yZWdpc3RlcigmYW1wO3VucmVnX21wLSZndDtkZXYpOwomIzQzOwomIzQzOwl2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGZpbmRfcGFja2FnZV9ub2RlKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcCA9IE5VTEw7CiYjNDM7CWludCByZXQgPSBuaWQ7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJaWYgKCFtcG5zW25pZF0pIHsKJiM0MzsJCXJldCA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJfSBlbHNlIGlmIChtcG5zW25pZF0tJmd0O3NvdXJjZV9mbGFncyA9PSBNUE5fU1JDX1NMSVQgJmFtcDsmYW1wOyBpbml0aWF0b3JfbmlkICZndDs9IDApIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBTTElULWRlcml2ZWQgZW50cmllcyBhcmUgcHJvdmlzaW9uYWw7IGlmIGEgZHJpdmVyIGxhdGVyCiYjNDM7CQkgKiBwcm92aWRlcyBhbiBleHBsaWNpdCBpbml0aWF0b3IsIGRyb3AgdGhlIHByb3Zpc2lvbmFsCiYjNDM7CQkgKiBlbnRyeSBhbmQgcmVidWlsZCB3aXRoIHRoZSBzdHJvbmdlciBoaW50LgomIzQzOwkJICovCiYjNDM7CQl1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTsKJiM0MzsJCXJldCA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsKJiM0MzsJaWYgKHVucmVnX21wKQomIzQzOwkJZGV2aWNlX3VucmVnaXN0ZXIoJmFtcDt1bnJlZ19tcC0mZ3Q7ZGV2KTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpCiYjNDM7ewomIzQzOwlpbnQgbXBuX25pZDsKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjsKJiM0MzsKJiM0MzsJbXBuX25pZCA9IGZpbmRfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7CiYjNDM7CWlmIChtcG5fbmlkICE9IE5VTUFfTk9fTk9ERSkKJiM0MzsJCXJldHVybiBtcG5fbmlkOwomIzQzOwomIzQzOwltcG4gPSBjcmVhdGVfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7CiYjNDM7CWlmIChJU19FUlIobXBuKSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKG1wbik7CiYjNDM7CiYjNDM7CWd1YXJkKG11dGV4KSgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlpZiAobXBuc1tuaWRdKSB7CiYjNDM7CQlrZnJlZShtcG4pOwomIzQzOwkJcmV0dXJuIG5pZDsKJiM0MzsJfQomIzQzOwltcG5zW25pZF0gPSBtcG47CiYjNDM7CiYjNDM7CXJldHVybiBuaWQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBOVU1BX05PX05PREUpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJpbmRfbm9kZV90b19wYWNrYWdlKG5pZCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwl2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IgLSBBZGQgYSBub2RlIHdpdGggYW4gaW5pdGlhdG9yCiYjNDM7ICogQG5pZDogICAgICAgICAgICBUYXJnZXQgTlVNQSBub2RlIHRvIGFkZC4KJiM0MzsgKiBAaW5pdGlhdG9yX25pZDogIENQVSBuaWQgdXNlZCB0byByZXNvbHZlIEBuaWQmIzM5O3MgcGFja2FnZSAoJmd0Oz0wKS4KJiM0MzsgKgomIzQzOyAqIEVuc3VyZXMgdGhhdCBhICZhbXA7c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgZXhpc3RzIGZvciBAbmlkIGFuZCB0aGF0IGl0cwomIzQzOyAqIHBhY2thZ2VfaWQgaXMgZGV0ZXJtaW5lZCB1c2luZyBAaW5pdGlhdG9yX25pZCB3aGVuIHByb3ZpZGVkLiBCaW5kaW5nIHRvIHRoZQomIzQzOyAqIHBhY2thZ2UgaXMgbm90IHBlcmZvcm1lZCBoZXJlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gZmluZF9jcmVhdGVfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBtcF9hZGRfcGFja2FnZV9ub2RlIC0gQWRkIGEgbm9kZSwgcmVzb2x2aW5nIHBhY2thZ2UgYXV0b21hdGljYWxseQomIzQzOyAqIEBuaWQ6IFRhcmdldCBOVU1BIG5vZGUgdG8gYWRkLgomIzQzOyAqCiYjNDM7ICogV3JhcHBlciBvdmVyIG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKCkgdGhhdCByZXF1ZXN0cyBhdXRvbWF0aWMKJiM0MzsgKiBpbml0aWF0b3IgcmVzb2x1dGlvbiAoZS5nLiwgbmVhcmVzdCBDUFUpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGUpOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLAomIzQzOwkJCQkgICAgIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtcF9zbmFwc2hvdCAqc25hcDsKJiM0MzsJaW50IHBrZzsKJiM0MzsKJiM0MzsJaWYgKCFvdXQpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CiYjNDM7CWlmIChuaWQgJmx0OyAwIHx8IG5pZCAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJZ3VhcmQocmN1KSgpOwomIzQzOwomIzQzOwlzbmFwID0gcmN1X2RlcmVmZXJlbmNlKG1wX3NuYXBzaG90KTsKJiM0MzsJaWYgKCFzbmFwKQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CXBrZyA9IHNuYXAtJmd0O3BrZ19vZltuaWRdOwomIzQzOwlpZiAocGtnICZsdDsgMCkKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwomIzQzOwlzd2l0Y2ggKG5vZGVfdHlwZSkgewomIzQzOwljYXNlIE1QX05PREVTX0FMTDoKJiM0MzsJCW5vZGVzX2NvcHkoKm91dCwgc25hcC0mZ3Q7cGtnW3BrZ10ubm9kZXMpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTVBfTk9ERVNfQ1BVOgomIzQzOwkJbm9kZXNfY29weSgqb3V0LCBzbmFwLSZndDtwa2dbcGtnXS5jcHVfbm9kZXMpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTVBfTk9ERVNfTUVNX09OTFk6CiYjNDM7CQlub2Rlc19jb3B5KCpvdXQsIHNuYXAtJmd0O3BrZ1twa2ddLm1lbW9yeV9vbmx5X25vZGVzKTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT04KJiM0MztzdGF0aWMgaW50IF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLAomIzQzOwkJCQkgICAgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaW50IHJldCA9IDA7CiYjNDM7CiYjNDM7CS8qIE5vIGhvdC1wYXRoIGNhbGxlcnM6IHRoZSBtdXRleCBpcyBmaW5lIGhlcmUuICovCiYjNDM7CWd1YXJkKG11dGV4KSgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlpZiAoIW91dCkgewomIzQzOwkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5vZGVzX2NsZWFyKCpvdXQpOwomIzQzOwomIzQzOwlpZiAobmlkICZsdDsgMCB8fCBuaWQgJmd0Oz0gTUFYX05VTU5PREVTKSB7CiYjNDM7CQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG5vZGVfdHlwZSA9PSBNUF9OT0RFU19DUFUpIHsKJiM0MzsJCWlmIChub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHsKJiM0MzsJCQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwl9IGVsc2UgaWYgKG5vZGVfdHlwZSA9PSBNUF9OT0RFU19NRU1fT05MWSkgewomIzQzOwkJaWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHsKJiM0MzsJCQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHsKJiM0MzsJCXJldCA9IC1FTk9FTlQ7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlub2Rlc19jb3B5KCpvdXQsIG1wbnNbbmlkXS0mZ3Q7cHJlZmVycmVkKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sgLSBEZW1vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2UKJiM0MzsgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLgomIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayBvZiBuZWFyZXN0IG1lbW9yeS1vbmx5IHRhcmdldHMgaW4gdGhlIHNhbWUgcGFja2FnZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLgomIzQzOyAqLwomIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2spOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZSAtIFBpY2sgb25lIGRlbW90aW9uIHRhcmdldAomIzQzOyAqIEBuaWQ6IENQVSBub2RlIGZyb20gd2hpY2ggbWVtb3J5IHdvdWxkIGJlIGRlbW90ZWQuCiYjNDM7ICoKJiM0MzsgKiBQaWNrcyBvbmUgdGFyZ2V0IChyYW5kb20gYW1vbmcgdGhlIG5lYXJlc3QpIGZyb20gbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzaygpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0YXJnZXQgbmlkIG9uIHN1Y2Nlc3MsIG9yIE5VTUFfTk9fTk9ERSBpZiBubyBjYW5kaWRhdGUgaXMgYXZhaWxhYmxlLgomIzQzOyAqLwomIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CWludCB0YXJnZXRfbmlkOwomIzQzOwlub2RlbWFza190IHRhcmdldF9ub2RlbWFzazsKJiM0MzsKJiM0MzsJaWYgKG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sobmlkLCAmYW1wO3RhcmdldF9ub2RlbWFzaykpCiYjNDM7CQlyZXR1cm4gTlVNQV9OT19OT0RFOwomIzQzOwlpZiAobm9kZXNfZW1wdHkodGFyZ2V0X25vZGVtYXNrKSkKJiM0MzsJCXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7CiYjNDM7CXRhcmdldF9uaWQgPSBub2RlX3JhbmRvbSgmYW1wO3RhcmdldF9ub2RlbWFzayk7CiYjNDM7CiYjNDM7CXJldHVybiB0YXJnZXRfbmlkOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X2RlbW90aW9uX25vZGUpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrIC0gUHJvbW90aW9uIGNhbmRpZGF0ZXMgd2l0aGluIGEgcGFja2FnZQomIzQzOyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG93YXJkcyB3aGljaCBwcm9tb3Rpb24gc2Vla3MgQ1BVIGxvY2FsaXR5LgomIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayBvZiBuZWFyZXN0IENQVSB0YXJnZXRzIGluIHRoZSBzYW1lIHBhY2thZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC4KJiM0MzsgKi8KJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhuaWQsIE1QX05PREVTX01FTV9PTkxZLCBvdXQpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogbXBfbmV4dF9wcm9tb3Rpb25fbm9kZSAtIFBpY2sgb25lIHByb21vdGlvbiB0YXJnZXQKJiM0MzsgKiBAbmlkOiBNZW1vcnktb25seSBub2RlIHRvIGJlIHByb21vdGVkIHRvd2FyZHMgQ1BVcy4KJiM0MzsgKgomIzQzOyAqIFBpY2tzIG9uZSB0YXJnZXQgKHJhbmRvbSBhbW9uZyB0aGUgbmVhcmVzdCkgZnJvbSBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzaygpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0YXJnZXQgbmlkIG9uIHN1Y2Nlc3MsIG9yIE5VTUFfTk9fTk9ERSBpZiBubyBjYW5kaWRhdGUgaXMgYXZhaWxhYmxlLgomIzQzOyAqLwomIzQzO2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlpbnQgdGFyZ2V0X25pZDsKJiM0MzsJbm9kZW1hc2tfdCB0YXJnZXRfbm9kZW1hc2s7CiYjNDM7CiYjNDM7CWlmIChtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhuaWQsICZhbXA7dGFyZ2V0X25vZGVtYXNrKSkKJiM0MzsJCXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7CWlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKQomIzQzOwkJcmV0dXJuIE5VTUFfTk9fTk9ERTsKJiM0MzsKJiM0MzsJdGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKCZhbXA7dGFyZ2V0X25vZGVtYXNrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHRhcmdldF9uaWQ7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfcHJvbW90aW9uX25vZGUpOwomIzQzOyNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi8KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBtcF9nZXRfcGFja2FnZV9ub2RlcyAtIFJldHVybiBhbGwgbWVtYmVycyBvZiBAbmlkJiMzOTtzIHBhY2thZ2UKJiM0MzsgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLgomIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIGFsbCBtZW1iZXJzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuCiYjNDM7ICovCiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQUxMLCBvdXQpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9nZXRfcGFja2FnZV9ub2Rlcyk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzIC0gUmV0dXJuIENQVSBtZW1iZXJzIG9mIEBuaWQmIzM5O3MgcGFja2FnZQomIzQzOyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuCiYjNDM7ICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgQ1BVIG1lbWJlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC4KJiM0MzsgKi8KJiM0MztpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQ1BVLCBvdXQpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzIC0gUmV0dXJuIG1lbW9yeS1vbmx5IG1lbWJlcnMgb2YgQG5pZCYjMzk7cyBwYWNrYWdlCiYjNDM7ICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS4KJiM0MzsgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBtZW1vcnktb25seSBtZW1iZXJzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuCiYjNDM7ICovCiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9fbWVtaW5pdCBtcF9ob3RwbHVnX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqX2FyZykKJiM0Mzt7CiYjNDM7CWludCBuaWQ7CiYjNDM7CXN0cnVjdCBub2RlX25vdGlmeSAqbm4gPSBfYXJnOwomIzQzOwomIzQzOwluaWQgPSBubi0mZ3Q7bmlkOwomIzQzOwlpZiAobmlkICZsdDsgMCkKJiM0MzsJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKDApOwomIzQzOwomIzQzOwlzd2l0Y2ggKGFjdGlvbikgewomIzQzOwljYXNlIE5PREVfUkVNT1ZFRF9MQVNUX01FTU9SWToKJiM0MzsJCWRlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7CiYjNDM7CQlicmVhazsKJiM0MzsKJiM0MzsJY2FzZSBOT0RFX0FEREVEX0ZJUlNUX01FTU9SWToKJiM0MzsJCWNyZWF0ZV9ub2RlX3dpdGhfcGFja2FnZShuaWQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIG1lbW9yeV9wYWNrYWdlIHRvcG9sb2d5CiYjNDM7ICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6CiYjNDM7ICogICAtIHBhY2thZ2Vfbm9kZXM6ICAgICAgIEFsbCBOVU1BIG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKQomIzQzOyAqICAgLSBwYWNrYWdlX2NwdV9ub2RlczogICBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlIChub2RlIG1hc2spCiYjNDM7ICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKQomIzQzOyAqICAgLSBwaHlzaWNhbF9wYWNrYWdlX2lkOiBQaHlzaWNhbCBwYWNrYWdlIElECiYjNDM7ICovCiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGFja2FnZV9ub2Rlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKJiM0MzsJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwomIzQzOwomIzQzOwlndWFyZChtdXRleCkoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAmIzM0OyUqcGJsXG4mIzM0Oywgbm9kZW1hc2tfcHJfYXJncygmYW1wO21wLSZndDtub2RlcykpOwomIzQzO30KJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9ub2Rlcyk7CiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGFja2FnZV9jcHVfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiYjNDM7CiYjNDM7CWd1YXJkKG11dGV4KSgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlyZXR1cm4gc3lzZnNfZW1pdChidWYsICYjMzQ7JSpwYmxcbiYjMzQ7LCBub2RlbWFza19wcl9hcmdzKCZhbXA7bXAtJmd0O2NwdV9ub2RlcykpOwomIzQzO30KJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9jcHVfbm9kZXMpOwomIzQzOwomIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbWVtX29ubHlfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiYjNDM7CQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwomIzQzOwomIzQzOwlndWFyZChtdXRleCkoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAmIzM0OyUqcGJsXG4mIzM0Oywgbm9kZW1hc2tfcHJfYXJncygmYW1wO21wLSZndDttZW1vcnlfb25seV9ub2RlcykpOwomIzQzO30KJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9tZW1fb25seV9ub2Rlcyk7CiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGh5c2ljYWxfcGFja2FnZV9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKJiM0MzsJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiYjNDM7CiYjNDM7CXJldHVybiBzeXNmc19lbWl0KGJ1ZiwgJiMzNDslZFxuJiMzNDssIG1wLSZndDtwYWNrYWdlX2lkKTsKJiM0Mzt9CiYjNDM7c3RhdGljIERFVklDRV9BVFRSX1JPKHBoeXNpY2FsX3BhY2thZ2VfaWQpOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptZW1vcnlfcGFja2FnZV9hdHRyc1tdID0gewomIzQzOwkmYW1wO2Rldl9hdHRyX3BhY2thZ2Vfbm9kZXMuYXR0ciwKJiM0MzsJJmFtcDtkZXZfYXR0cl9wYWNrYWdlX2NwdV9ub2Rlcy5hdHRyLAomIzQzOwkmYW1wO2Rldl9hdHRyX3BhY2thZ2VfbWVtX29ubHlfbm9kZXMuYXR0ciwKJiM0MzsJJmFtcDtkZXZfYXR0cl9waHlzaWNhbF9wYWNrYWdlX2lkLmF0dHIsCiYjNDM7CU5VTEwsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtZW1vcnlfcGFja2FnZV9ncm91cCA9IHsKJiM0MzsJLmF0dHJzID0gbWVtb3J5X3BhY2thZ2VfYXR0cnMsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW10gPSB7CiYjNDM7CSZhbXA7bWVtb3J5X3BhY2thZ2VfZ3JvdXAsCiYjNDM7CU5VTEwsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyKCZhbXA7cGFja2FnZV9zdWJzeXMsIE5VTEwpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDttZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcbiYjMzQ7LCByZXQpOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7Y29yZV9pbml0Y2FsbChtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMgLSBDaGVjayBpZiBhbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgbm9kZSBzdHJ1Y3R1cmUKJiM0MzsgKgomIzQzOyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIENQVSBub2RlcwomIzQzOyAqIGFuZCBtZW1vcnktb25seSBub2RlcywgaW5kaWNhdGluZyBhIHN5bW1ldHJpYyB0b3BvbG9neS4KJiM0MzsgKgomIzQzOyAqIFRoZSB0b3BvbG9neV9zeW1tZXRyaWMgdmFyaWFibGUgaXMgcHJvdGVjdGVkIGJ5IG1lbW9yeV9wYWNrYWdlX2xvY2sgZm9yCiYjNDM7ICogd3JpdGVzIChpbiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSkuCiYjNDM7ICovCiYjNDM7Ym9vbCBtcF9pc190b3BvbG9neV9zeW1tZXRyaWModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBSRUFEX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKTsKJiM0MzsKJiM0MzsvKiBXYWxrIHRoZSBwYWNrYWdlIGxpc3QgYW5kIGNvbXBhcmUgbm9kZSBjb3VudHM7IHRoZSBjYWxsZXIgaG9sZHMgdGhlIGxvY2suICovCiYjNDM7c3RhdGljIGJvb2wgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDsKJiM0MzsJaW50IHJlZl9jcHVfbm9kZV9jb3VudCA9IDAsIHJlZl9tZW1vcnlfb25seV9ub2RlX2NvdW50ID0gMDsKJiM0MzsJaW50IHBhY2thZ2VfY291bnQgPSAwOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnkobXAsICZhbXA7bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7CiYjNDM7CQlpbnQgY3B1X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtJmd0O2NwdV9ub2Rlcyk7CiYjNDM7CQlpbnQgbWVtb3J5X29ubHlfbm9kZV9jb3VudCA9IG5vZGVzX3dlaWdodChtcC0mZ3Q7bWVtb3J5X29ubHlfbm9kZXMpOwomIzQzOwkJaW50IHRvdGFsX25vZGVfY291bnQgPSBjcHVfbm9kZV9jb3VudCAmIzQzOyBtZW1vcnlfb25seV9ub2RlX2NvdW50OwomIzQzOwomIzQzOwkJcGFja2FnZV9jb3VudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQkvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi8KJiM0MzsJCWlmICh0b3RhbF9ub2RlX2NvdW50ICZsdDsgMikKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlpZiAocGFja2FnZV9jb3VudCA9PSAxKSB7CiYjNDM7CQkJcmVmX2NwdV9ub2RlX2NvdW50ID0gY3B1X25vZGVfY291bnQ7CiYjNDM7CQkJcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSBtZW1vcnlfb25seV9ub2RlX2NvdW50OwomIzQzOwkJfSBlbHNlIGlmIChjcHVfbm9kZV9jb3VudCAhPSByZWZfY3B1X25vZGVfY291bnQgfHwKJiM0MzsJCQkgICBtZW1vcnlfb25seV9ub2RlX2NvdW50ICE9IHJlZl9tZW1vcnlfb25seV9ub2RlX2NvdW50KSB7CiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwYWNrYWdlX2NvdW50ICZsdDsgMikKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5IC0gVmFsaWRhdGUgdG9wb2xvZ3kgZm9yIHBhY2thZ2UtYXdhcmUgZmVhdHVyZXMKJiM0MzsgKgomIzQzOyAqIFZhbGlkYXRlcyB0b3BvbG9neSBzeW1tZXRyeSBieSBjaGVja2luZyBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsCiYjNDM7ICogbm9kZSBzdHJ1Y3R1cmUuIFVwZGF0ZXMgdGhlIGdsb2JhbCB0b3BvbG9neV9zeW1tZXRyaWMgdmFyaWFibGUuCiYjNDM7ICoKJiM0MzsgKiBUb3BvbG9neSBpcyB2YWxpZCBvbmx5IHdoZW4gYWxsIGNvbmRpdGlvbnMgYXJlIG1ldDoKJiM0MzsgKiAxLiBBdCBsZWFzdCAyIHBhY2thZ2VzIGV4aXN0IChtdWx0aS1wYWNrYWdlIHN5c3RlbSkKJiM0MzsgKiAyLiBBbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgY3B1X25vZGUgYW5kIG1lbW9yeV9vbmx5X25vZGUgY291bnRzCiYjNDM7ICogMy4gRWFjaCBwYWNrYWdlIGhhcyBhdCBsZWFzdCAyIHRvdGFsIG5vZGVzIChjcHVfbm9kZSAmIzQzOyBtZW1vcnlfb25seV9ub2RlICZndDs9IDIpCiYjNDM7ICoKJiM0MzsgKiBWYWxpZCBjb25maWd1cmF0aW9ucyBwZXIgcGFja2FnZToKJiM0MzsgKiAtIDEgY3B1X25vZGUgJiM0MzsgMSBtZW1vcnlfb25seV9ub2RlID0gMiBub2RlcyAodmFsaWQpCiYjNDM7ICogLSAyIGNwdV9ub2RlcyAmIzQzOyAwIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZCkKJiM0MzsgKiAtIDAgY3B1X25vZGUgJiM0MzsgMiBtZW1vcnlfb25seV9ub2RlcyA9IDIgbm9kZXMgKHZhbGlkKQomIzQzOyAqIC0gMSBjcHVfbm9kZSAmIzQzOyAwIG1lbW9yeV9vbmx5X25vZGUgPSAxIG5vZGUgKGludmFsaWQgLSBzaW5nbGUgbm9kZSBwYWNrYWdlKQomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KHZvaWQpCiYjNDM7ewomIzQzOwlndWFyZChtdXRleCkoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsKJiM0MzsJV1JJVEVfT05DRSh0b3BvbG9neV9zeW1tZXRyaWMsIF9fY2hlY2tfdG9wb2xvZ3lfc3ltbWV0cnkoKSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IG1lbW9yeV9wYWNrYWdlX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAwLCBuaWQ7CiYjNDM7CiYjNDM7CWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewomIzQzOwkJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJcmV0ID0gY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWhvdHBsdWdfbm9kZV9ub3RpZmllcihtcF9ob3RwbHVnX2NhbGxiYWNrLCBNRU1USUVSX0hPVFBMVUdfUFJJKTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkoKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwobWVtb3J5X3BhY2thZ2VfaW5pdCk7CmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IDRlNDQyMWIyMmI1OWYuLjY2YmNjYjlhMGExOTEgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbXBvbGljeS5jCkBAIC0xMTcsNiAmIzQzOzExNyw3IEBACiAjaW5jbHVkZSAmbHQ7YXNtL3RsYi5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3VhY2Nlc3MuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tZW1vcnkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWVtb3J5LXRpZXJzLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAKQEAgLTE2Nyw2ICYjNDM7MTY4LDggQEAgc3RhdGljIHVuc2lnbmVkIGludCAqbm9kZV9id190YWJsZTsKICAqLwogc3RhdGljIERFRklORV9NVVRFWCh3aV9zdGF0ZV9sb2NrKTsKIAomIzQzO3N0YXRpYyBib29sIHBhY2thZ2VfbW9kZV9lbmFibGVkOwomIzQzOwogc3RhdGljIHU4IGdldF9pbF93ZWlnaHQoaW50IG5vZGUpCiB7CiAJc3RydWN0IHdlaWdodGVkX2ludGVybGVhdmVfc3RhdGUgKnN0YXRlOwpAQCAtMTgwLDYgJiM0MzsxODMsMTEgQEAgc3RhdGljIHU4IGdldF9pbF93ZWlnaHQoaW50IG5vZGUpCiAJcmV0dXJuIHdlaWdodDsKIH0KIAomIzQzO3N0YXRpYyBib29sIHdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSAmYW1wOyZhbXA7IG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYygpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBDb252ZXJ0IGJhbmR3aWR0aCB2YWx1ZXMgaW50byB3ZWlnaHRlZCBpbnRlcmxlYXZlIHdlaWdodHMuCiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay4KQEAgLTMzNyw2ICYjNDM7MzQ1LDQ3IEBAIGludCBuZWFyZXN0X25vZGVfbm9kZW1hc2soaW50IG5vZGUsIG5vZGVtYXNrX3QgKm1hc2spCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZWFyZXN0X25vZGVfbm9kZW1hc2spOwogCiYjNDM7LyoqCiYjNDM7ICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGUKJiM0MzsgKiBAbm9kZTogVGhlIHJlZmVyZW5jZSBub2RlIElEIHRvIG1lYXN1cmUgZGlzdGFuY2UgZnJvbQomIzQzOyAqIEBtYXNrOiBUaGUgc2V0IG9mIGNhbmRpZGF0ZSBub2RlcyB0byBjb21wYXJlIGFnYWluc3QKJiM0MzsgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgYWxsIG5vZGVzIGluIEBtYXNrIGFuZCBtZWFzdXJlcyB0aGUgZGlzdGFuY2UKJiM0MzsgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuCiYjNDM7ICogSXQgZmluZHMgdGhlIG1pbmltdW0gZGlzdGFuY2UgYW5kIHRoZW4gcmVjb3JkcyBhbGwgbm9kZXMgaW4gQG1hc2sgdGhhdAomIzQzOyAqIHNoYXJlIHRoYXQgc2FtZSBtaW5pbXVtIGRpc3RhbmNlIGludG8gdGhlIG91dHB1dCBtYXNrIEBvdXQuCiYjNDM7ICoKJiM0MzsgKiBGb3IgZXhhbXBsZSwgaWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSBlcXVhbCBtaW5pbWFsIGRpc3RhbmNlIHRvIEBub2RlLCBhbGwKJiM0MzsgKiBvZiB0aGVtIGFyZSBpbmNsdWRlZCBpbiBAb3V0LgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIC1FSU5WQUwgaWYgQG91dCBpcyBOVUxMLgomIzQzOyAqLwomIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpCiYjNDM7ewomIzQzOwlpbnQgZGlzdCwgbiwgbWluX2Rpc3QgPSBJTlRfTUFYOwomIzQzOwomIzQzOwlpZiAoIW91dCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7CiYjNDM7CQlkaXN0ID0gbm9kZV9kaXN0YW5jZShub2RlLCBuKTsKJiM0MzsKJiM0MzsJCWlmIChkaXN0ICZsdDsgbWluX2Rpc3QpIHsKJiM0MzsJCQltaW5fZGlzdCA9IGRpc3Q7CiYjNDM7CQkJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CQkJbm9kZV9zZXQobiwgKm91dCk7CiYjNDM7CQl9IGVsc2UgaWYgKGRpc3QgPT0gbWluX2Rpc3QpIHsKJiM0MzsJCQlub2RlX3NldChuLCAqb3V0KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobmVhcmVzdF9ub2Rlc19ub2RlbWFzayk7CiYjNDM7CiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCA9IHAtJmd0O21lbXBvbGljeTsKQEAgLTIwOTcsMTcgJiM0MzsyMTQ2LDk3IEBAIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKQogCXJldHVybiB6b25lICZndDs9IGR5bmFtaWNfcG9saWN5X3pvbmU7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UKJiM0MzsgKiBAcG9saWN5OiBUYXJnZXQgbWVtcG9saWN5IHdob3NlIHVzZXItc2VsZWN0ZWQgbm9kZXMgYXJlIGluIEBwb2xpY3ktJmd0O25vZGVzLgomIzQzOyAqIEBtYXNrOiAgIE91dHB1dCBub2RlbWFzay4gT24gc3VjY2VzcywgY29udGFpbnMgcG9saWN5LSZndDtub2RlcyBsaW1pdGVkIHRvCiYjNDM7ICogICAgICAgICAgdGhlIHBhY2thZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGFsbG9jYXRpb24uCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGhlbHBlciBjb21iaW5lcyB0d28gY29uc3RyYWludHMgdG8gZGVjaWRlIHdoZXJlIHdpdGhpbiBhIHBhY2thZ2UKJiM0MzsgKiBtZW1vcnkgbWF5IGJlIGFsbG9jYXRlZDoKJiM0MzsgKgomIzQzOyAqICAgMSkgVGhlIGNhbGxlciYjMzk7cyBwYWNrYWdlOiBkZXJpdmVkIHZpYSBtcF9nZXRfcGFja2FnZV9ub2RlcyhudW1hX25vZGVfaWQoKSkuCiYjNDM7ICogICAyKSBUaGUgdXNlciYjMzk7cyBwcmVzZWxlY3RlZCBzZXQgQHBvbGljeS0mZ3Q7bm9kZXMgKGNwdXNldHMvbWVtcG9saWN5KS4KJiM0MzsgKgomIzQzOyAqIFRoZSBmdW5jdGlvbiBvYnRhaW5zIHRoZSBub2RlbWFzayBvZiB0aGUgY3VycmVudCBDUFUmIzM5O3MgcGFja2FnZSBhbmQKJiM0MzsgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS0mZ3Q7bm9kZXMuIElmIHRoZSBpbnRlcnNlY3Rpb24gaXMgZW1wdHkgKGUuZy4gdGhlCiYjNDM7ICogdXNlciBleGNsdWRlZCBldmVyeSBub2RlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UpLCBpdCBmYWxscyBiYWNrIHRvIHRoZQomIzQzOyAqIG5vZGUgaW4gQHBvbGljeS0mZ3Q7bm9kZXMsIGRlcml2ZXMgdGhhdCBub2RlJiMzOTtzIHBhY2thZ2UsIGFuZCBpbnRlcnNlY3RzCiYjNDM7ICogYWdhaW4uIElmIHRoZSBmYWxsYmFjayBhbHNvIHlpZWxkcyBhbiBlbXB0eSBzZXQsIEBtYXNrIHN0YXlzIGVtcHR5IGFuZCBhCiYjNDM7ICogbm9uLXplcm8gZXJyb3IgaXMgcmV0dXJuZWQuCiYjNDM7ICoKJiM0MzsgKiBFeGFtcGxlcyAocGFja2FnZXM6IFAwPXtDUFU6MCwgTUVNOjJ9LCBQMT17Q1BVOjEsIE1FTTozfSk6CiYjNDM7ICogICAtIHBvbGljeS0mZ3Q7bm9kZXMgPSB7MCwxLDIsM30KJiM0MzsgKiAgICAgICBvbiBQMDogbWFzayA9IHswLDJ9OyBvbiBQMTogbWFzayA9IHsxLDN9LgomIzQzOyAqICAgLSBwb2xpY3ktJmd0O25vZGVzID0gezAsMSwzfQomIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezB9ICAgICAgKG9ubHkgbm9kZSAwIGZyb20gUDAgaXMgYWxsb3dlZCkuCiYjNDM7ICogICAtIHBvbGljeS0mZ3Q7bm9kZXMgPSB7MSwyLDN9CiYjNDM7ICogICAgICAgb24gUDA6IG1hc2sgPSB7Mn0gICAgICAob25seSBub2RlIDIgZnJvbSBQMCBpcyBhbGxvd2VkKS4KJiM0MzsgKiAgIC0gcG9saWN5LSZndDtub2RlcyA9IHsxLDN9CiYjNDM7ICogICAgICAgb24gUDA6IGN1cnJlbnQgcGFja2FnZSAoUDApICZhbXA7IHBvbGljeSA9IE5VTEwgLSZndDsgZmFsbGJhY2sgdG8gcG9saWN5PTEsCiYjNDM7ICogICAgICAgICAgICAgICBwYWNrYWdlKDEpPVAxLCBtYXNrID0gezEsM30uIChVc2VyIGVmZmVjdGl2ZWx5IG9wdGVkIG91dCBvZiBQMC4pCiYjNDM7ICoKJiM0MzsgKiBJZiB0aGUgc2VsZWN0ZWQgbm9kZSBpcyBsb3cgb24gbWVtb3J5LCB0aGUgYWxsb2NhdGlvbiBtYXkgdXNlIGFub3RoZXIgbm9kZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAgIDAgb24gc3VjY2VzcyB3aXRoIEBtYXNrIHNldCBhcyBhYm92ZTsKJiM0MzsgKiAgIC1FSU5WQUwgaWYgQHBvbGljeS9AbWFzayBpcyBOVUxMOwomIzQzOyAqICAgLUVOT0VOVCBpZiBldmVuIHRoZSBmYWxsYmFjayBpbnRlcnNlY3Rpb24gaXMgZW1wdHk7CiYjNDM7ICogICBQcm9wYWdhdGVkIGVycm9yIGZyb20gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoKSBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIG5vZGVtYXNrX3QgKm1hc2spCiYjNDM7ewomIzQzOwlub2RlbWFza190IHBhY2thZ2VfbWFzazsKJiM0MzsJaW50IG5vZGUsIHJldDsKJiM0MzsKJiM0MzsJaWYgKCFwb2xpY3kgfHwgIW1hc2spCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJbm9kZXNfY2xlYXIoKm1hc2spOwomIzQzOwomIzQzOwlub2RlID0gbnVtYV9ub2RlX2lkKCk7CiYjNDM7CXJldCA9IG1wX2dldF9wYWNrYWdlX25vZGVzKG5vZGUsICZhbXA7cGFja2FnZV9tYXNrKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CW5vZGVzX2FuZCgqbWFzaywgcGFja2FnZV9tYXNrLCBwb2xpY3ktJmd0O25vZGVzKTsKJiM0MzsJaWYgKCFub2Rlc19lbXB0eSgqbWFzaykpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHVzZXImIzM5O3Mgbm9kZW1hc2sgZXhjbHVkZXMgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlOwomIzQzOwkgKiBmYWxsIGJhY2sgdG8gdGhlIHBhY2thZ2Ugc3Bhbm5lZCBieSB0aGUgdXNlciYjMzk7cyBvd24gZmlyc3Qgbm9kZS4KJiM0MzsJICovCiYjNDM7CW5vZGUgPSBmaXJzdF9ub2RlKHBvbGljeS0mZ3Q7bm9kZXMpOwomIzQzOwlyZXQgPSBtcF9nZXRfcGFja2FnZV9ub2Rlcyhub2RlLCAmYW1wO3BhY2thZ2VfbWFzayk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlub2Rlc19hbmQoKm1hc2ssIHBhY2thZ2VfbWFzaywgcG9saWN5LSZndDtub2Rlcyk7CiYjNDM7CWlmIChub2Rlc19lbXB0eSgqbWFzaykpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogc3RhdGljIHVuc2lnbmVkIGludCB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSkKIHsKIAl1bnNpZ25lZCBpbnQgbm9kZTsKIAl1bnNpZ25lZCBpbnQgY3B1c2V0X21lbXNfY29va2llOwomIzQzOwlub2RlbWFza190IG1hc2s7CiAKIHJldHJ5OgogCS8qIHRvIHByZXZlbnQgbWlzY291bnQgdXNlIHRzay0mZ3Q7bWVtc19hbGxvd2VkX3NlcSB0byBkZXRlY3QgcmViaW5kICovCiAJY3B1c2V0X21lbXNfY29va2llID0gcmVhZF9tZW1zX2FsbG93ZWRfYmVnaW4oKTsKIAlub2RlID0gY3VycmVudC0mZ3Q7aWxfcHJldjsKLQlpZiAoIWN1cnJlbnQtJmd0O2lsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBwb2xpY3ktJmd0O25vZGVzKSkgewotCQlub2RlID0gbmV4dF9ub2RlX2luKG5vZGUsIHBvbGljeS0mZ3Q7bm9kZXMpOwomIzQzOwomIzQzOwkvKiBQYWNrYWdlIG1vZGUgb2ZmIG9yIHVucmVzb2x2ZWQ6IGZhbGwgYmFjayB0byB0aGUgZnVsbCBwb2xpY3kgbm9kZW1hc2suICovCiYjNDM7CWlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fAomIzQzOwkgICAgcG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2xpY3ksICZhbXA7bWFzaykpCiYjNDM7CQltYXNrID0gcG9saWN5LSZndDtub2RlczsKJiM0MzsKJiM0MzsJaWYgKCFjdXJyZW50LSZndDtpbF93ZWlnaHQgfHwgIW5vZGVfaXNzZXQobm9kZSwgbWFzaykpIHsKJiM0MzsJCW5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgbWFzayk7CiAJCWlmIChyZWFkX21lbXNfYWxsb3dlZF9yZXRyeShjcHVzZXRfbWVtc19jb29raWUpKQogCQkJZ290byByZXRyeTsKIAkJaWYgKG5vZGUgPT0gTUFYX05VTU5PREVTKQpAQCAtMjIwMCw2ICYjNDM7MjMyOSwzMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLAogCXJldHVybiBub2Rlc193ZWlnaHQoKm1hc2spOwogfQogCiYjNDM7LyoKJiM0MzsgKiBQYWNrYWdlLWF3YXJlIGNvdW50ZXJwYXJ0IG9mIHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soKTogcmVzb2x2ZSB0aGUKJiM0MzsgKiBjdXJyZW50IHBhY2thZ2UmIzM5O3Mgbm9kZXMgaW50ZXJzZWN0ZWQgd2l0aCB0aGUgcG9saWN5LCBmYWxsaW5nIGJhY2sgdG8gdGhlCiYjNDM7ICogZnVsbCBwb2xpY3kgbm9kZW1hc2sgd2hlbiBwYWNrYWdlIG1vZGUgaXMgb2ZmIG9yIHJlc29sdXRpb24gZmFpbHMuCiYjNDM7ICovCiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLAomIzQzOwkJCQkJCSAgICAgIG5vZGVtYXNrX3QgKm1hc2spCiYjNDM7ewomIzQzOwlub2RlbWFza190IHBhY2thZ2VfbWFzazsKJiM0MzsKJiM0MzsJYmFycmllcigpOwomIzQzOwlpZiAoIXdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKCkpIHsKJiM0MzsJCW1lbWNweShtYXNrLCAmYW1wO3BvbC0mZ3Q7bm9kZXMsIHNpemVvZihub2RlbWFza190KSk7CiYjNDM7CQlyZXR1cm4gbm9kZXNfd2VpZ2h0KCptYXNrKTsKJiM0MzsJfQomIzQzOwlpZiAocG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2wsICZhbXA7cGFja2FnZV9tYXNrKSkKJiM0MzsJCW1lbWNweShtYXNrLCAmYW1wO3BvbC0mZ3Q7bm9kZXMsIHNpemVvZihub2RlbWFza190KSk7CiYjNDM7CWVsc2UKJiM0MzsJCW1lbWNweShtYXNrLCAmYW1wO3BhY2thZ2VfbWFzaywgc2l6ZW9mKG5vZGVtYXNrX3QpKTsKJiM0MzsJYmFycmllcigpOwomIzQzOwomIzQzOwlyZXR1cm4gbm9kZXNfd2VpZ2h0KCptYXNrKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbmlkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgcGdvZmZfdCBpbHgpCiB7CiAJc3RydWN0IHdlaWdodGVkX2ludGVybGVhdmVfc3RhdGUgKnN0YXRlOwpAQCAtMjIxMCw3ICYjNDM7MjM2Myw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseCkKIAl1OCB3ZWlnaHQ7CiAJaW50IG5pZCA9IDA7CiAKLQlucl9ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCAmYW1wO25vZGVtYXNrKTsKJiM0MzsJbnJfbm9kZXMgPSByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2socG9sLCAmYW1wO25vZGVtYXNrKTsKIAlpZiAoIW5yX25vZGVzKQogCQlyZXR1cm4gbnVtYV9ub2RlX2lkKCk7CiAKQEAgLTI2NTQsNyAmIzQzOzI4MDcsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLAogCS8qIHJlYWQgdGhlIG5vZGVzIG9udG8gdGhlIHN0YWNrLCByZXRyeSBpZiBkb25lIGR1cmluZyByZWJpbmQgKi8KIAlkbyB7CiAJCWNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7Ci0JCW5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCAmYW1wO25vZGVzKTsKJiM0MzsJCW5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfcGFja2FnZV9ub2RlbWFzayhwb2wsICZhbXA7bm9kZXMpOwogCX0gd2hpbGUgKHJlYWRfbWVtc19hbGxvd2VkX3JldHJ5KGNwdXNldF9tZW1zX2Nvb2tpZSkpOwogCiAJLyogaWYgdGhlIG5vZGVtYXNrIGhhcyBiZWNvbWUgaW52YWxpZCwgd2UgY2Fubm90IGRvIGFueXRoaW5nICovCkBAIC0zNzk0LDcgJiM0MzszOTQ3LDQyIEBAIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfYXV0b19hdHRyID0gewogCS5zdG9yZSA9IHdlaWdodGVkX2ludGVybGVhdmVfYXV0b19zdG9yZSwKIH07CiAKJiM0MztzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21vZGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKJiM0MzsJCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQomIzQzO3sKJiM0MzsJcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAmIzM0OyVzXG4mIzM0Oywgc3RyX3RydWVfZmFsc2UoUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21vZGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCiYjNDM7CQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQomIzQzO3sKJiM0MzsJYm9vbCBpbnB1dDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJZXJyID0ga3N0cnRvYm9vbChidWYsICZhbXA7aW5wdXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRGlzYWJsZSBwYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9naWVzLgomIzQzOwkgKiBOb24tc3ltbWV0cmljIHRvcG9sb2d5IChlLmcuLCBhc3ltbWV0cmljIENYTCBtZW1vcnkgYXR0YWNobWVudCkgY2FuCiYjNDM7CSAqIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlmIHBhY2thZ2UtYXdhcmUgYWxsb2NhdGlvbiBpcyB1c2VkLgomIzQzOwkgKiBSZWplY3QgZW5hYmxlIHJlcXVlc3QgaWYgdG9wb2xvZ3kgaXMgbm90IHN5bW1ldHJpYy4KJiM0MzsJICovCiYjNDM7CWlmIChpbnB1dCAmYW1wOyZhbXA7ICFtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKSkgewomIzQzOwkJcHJfd2FybigmIzM0O3BhY2thZ2VfbW9kZSBjYW5ub3QgYmUgZW5hYmxlZCBvbiBub24tc3ltbWV0cmljIHRvcG9sb2d5XG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlXUklURV9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkLCBpbnB1dCk7CiYjNDM7CXJldHVybiBjb3VudDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSB3aV9wYWNrYWdlX21vZGVfYXR0ciA9CiYjNDM7CV9fQVRUUihwYWNrYWdlX21vZGUsIDA2NjQsIHBhY2thZ2VfbW9kZV9zaG93LCBwYWNrYWdlX21vZGVfc3RvcmUpOwomIzQzOwogc3RhdGljIHZvaWQgd2lfY2xlYW51cCh2b2lkKSB7CiYjNDM7CXN5c2ZzX3JlbW92ZV9maWxlKCZhbXA7d2lfZ3JvdXAtJmd0O3dpX2tvYmosICZhbXA7d2lfcGFja2FnZV9tb2RlX2F0dHIuYXR0cik7CiAJc3lzZnNfcmVtb3ZlX2ZpbGUoJmFtcDt3aV9ncm91cC0mZ3Q7d2lfa29iaiwgJmFtcDt3aV9hdXRvX2F0dHIuYXR0cik7CiAJc3lzZnNfd2lfbm9kZV9kZWxldGVfYWxsKCk7CiAJd2lfc3RhdGVfZnJlZSgpOwpAQCAtMzkwMCw2ICYjNDM7NDA4OCwxMCBAQCBzdGF0aWMgaW50IF9faW5pdCBhZGRfd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ncm91cChzdHJ1Y3Qga29iamVjdCAqbWVtcG9saWN5X2tvYmopCiAJaWYgKGVycikKIAkJZ290byBlcnJfcHV0X2tvYmo7CiAKJiM0MzsJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmFtcDt3aV9ncm91cC0mZ3Q7d2lfa29iaiwgJmFtcDt3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCWdvdG8gZXJyX2NsZWFudXBfa29iajsKJiM0MzsKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKIAkJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKQogCQkJY29udGludWU7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5ODE2CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNzYwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS2VybmVsIE1lbW9yeSBQYWNrYWdlIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGEgJiMzNDttZW1vcnkgcGFja2FnZSYjMzQ7IHRvcG9sb2d5IGNvbmNlcHQgd2l0aGluIHRoZSBrZXJuZWwsIHByaW1hcmlseSBmb3IgTlVNQSBub2RlcyBhbmQsIGltcG9ydGFudGx5LCBDWEwvSEJNIG1lbW9yeSBjb25maWd1cmF0aW9ucy4gSXQmIzM5O3MgdG91Y2hpbmcgc29tZSBjcml0aWNhbCBhcmVhczogYG1tL21lbW9yeS10aWVycy5jYCwgYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgLCBgZHJpdmVycy9kYXgva21lbS5jYCwgYW5kIGBtbS9tZW1wb2xpY3kuY2AuIFRoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2Ug4oCTIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmYgaGVyZSwgZGVhbGluZyB3aXRoIE5VTUEgbWVtb3J5IHRpZXJzLCBDWEwgcmVnaW9ucywgYW5kIHRoZSBtZW1wb2xpY3kgc3Vic3lzdGVtLiBJdOKAmXMgZGVmaW5pdGVseSB0b3VjaGluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIG1ha2luZyBmdXp6aW5nIGEgaGlnaCBwcmlvcml0eS4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBkaXZlIGludG8gaXQgYW5kIGlkZW50aWZ5IHRoZSBrZXkgZnVuY3Rpb25zIHRoYXQgYXJlIGFkZGVkIG9yIG1vZGlmaWVkLCBmb2N1c2luZyBvbiBwb3RlbnRpYWwgYXJlYXMgb2YgdnVsbmVyYWJpbGl0eSBvciB1bmV4cGVjdGVkIGJlaGF2aW9yLiBMZXQmIzM5O3Mgc2VlLi4uIHRoZSBwYXRjaCBpcyBpbnRyb2R1Y2luZyBhIHN5c2ZzIGludGVyZmFjZSBmb3IgdGhlc2UgbWVtb3J5IHBhY2thZ2VzIHVuZGVyIGAvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvYCBhbmQgYSBuZXcgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlIGZvciBtZW1wb2xpY3ksIGFjY2Vzc2libGUgdmlhIGAvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVgLgoKSSYjMzk7bSBtYWtpbmcgYSBsaXN0IG9mIHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgaW1wYWN0ZWQ6IGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfcHJvYmVfcGFja2FnZV9pZGAsIHRoZSBub3RpZmllciBmdW5jdGlvbnMsIHRoZSBwYWNrYWdlIG5vZGUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAoYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBldGMuKSwgYW5kIHRoZSBpbnRlcmxlYXZlIGFuZCBwcm9tb3Rpb24vZGVtb3Rpb24gZnVuY3Rpb25zLiBJIHNlZSBhIGxvdCBvZiBhY3Rpdml0eSB3aXRoaW4gYG1tL21lbW9yeS10aWVycy5jYCBhbmQgYG1tL21lbXBvbGljeS5jYCwgc28gSSYjMzk7bGwgbmVlZCB0byBzY3J1dGluaXplIHRob3NlIG1vZHVsZXMgY2FyZWZ1bGx5IHRvIHVuZGVyc3RhbmQgdGhlIGNhbGwgcGF0aHMgYW5kIGRlcGVuZGVuY2llcy4KCk5vdywgbXkgZm9jdXMgbmFycm93cyB0byB0aGUgZXhwb3J0ZWQgYW5kIHJlYWNoYWJsZSBmdW5jdGlvbnMgd2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9tZW1wb2xpY3kuY2AsIG5hbWVseTogYG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yYCwgYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzYCwgYG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzYCwgYG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tgLCBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVgLCBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYCBhbmQgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgLiBUaGVzZSBhcmUgbXkgcHJpbWFyeSB0YXJnZXRzLgoKR2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgY2hhbmdlcywgZXNwZWNpYWxseSB0aGUgTlVNQSBmb2N1cywgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gTmF0dXJhbGx5LCB0aGlzIGNvZGUgaXMgaGVhdmlseSBOVU1BLWRlcGVuZGVudC4gTGV0JiMzOTtzIG1ha2Ugc3VyZSBgQ09ORklHX05VTUFgIGlzIGVuYWJsZWQuIEZ1cnRoZXIsIEkgc2hvdWxkIHNlZSBpZiBgQ09ORklHX05VTUFfQkFMQU5DSU5HYCwgYENPTkZJR19OVU1BX01JR1JBVElPTmAsIGBDT05GSUdfTUVNT1JZX1RJRVJTYCwgb3IgYENPTkZJR19DWExfQlVTYCBhcmUgZGVwZW5kZW5jaWVzLiBJJiMzOTtsbCBxdWlja2x5IGdyZXAgZm9yIHRoZSBtb3N0IHJlbGV2YW50IG9uZXMuIE9rYXksIHNvIHRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB3aGVyZSB0byBmb2N1cyBteSBpbml0aWFsIGZ1enppbmcgZWZmb3J0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfTlVNQV9NSUdSQVRJT04mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LXRpZXJzLmM9NzE9Ym9vbCBmb2xpb191c2VfYWNjZXNzX3RpbWUoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9tZW1vcnktdGllcnMuYy03Ny1cbm1tL21lbW9yeS10aWVycy5jOjc4OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTc5LXN0YXRpYyBpbnQgdG9wX3RpZXJfYWRpc3RhbmNlO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTEzNz1zdGF0aWMgc3RydWN0IGRlbW90aW9uX25vZGVzICpub2RlX2RlbW90aW9uIF9fcmVhZF9tb3N0bHk7XG5tbS9tZW1vcnktdGllcnMuYzoxMzg6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWVtb3J5LXRpZXJzLmMtMTM5LVxuLS1cbm1tL21lbW9yeS10aWVycy5jPTI2Nj1zdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTI4MS1cbm1tL21lbW9yeS10aWVycy5jOjI4MjojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy0yODMtYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NTI3PXN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxubW0vbWVtb3J5LXRpZXJzLmM6NTI4OiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbm1tL21lbW9yeS10aWVycy5jLTUyOS1cbi0tXG5tbS9tZW1vcnktdGllcnMuYz05MTI9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfaW5pdCh2b2lkKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTkxOS1cbm1tL21lbW9yeS10aWVycy5jOjkyMDojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy05MjEtXHRub2RlX2RlbW90aW9uID0ga3phbGxvY19vYmpzKHN0cnVjdCBkZW1vdGlvbl9ub2RlcywgbnJfbm9kZV9pZHMpO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTk0NT1ib29sIG51bWFfZGVtb3Rpb25fZW5hYmxlZCA9IGZhbHNlO1xubW0vbWVtb3J5LXRpZXJzLmMtOTQ2LVxubW0vbWVtb3J5LXRpZXJzLmM6OTQ3OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTk0OC0jaWZkZWYgQ09ORklHX1NZU0ZTXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MTYxOD1zdGF0aWMgaW50IF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcbi0tXG5tbS9tZW1vcnktdGllcnMuYy0xNjU4LVxubW0vbWVtb3J5LXRpZXJzLmM6MTY1OTojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy0xNjYwLXN0YXRpYyBpbnQgX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKGludCBuaWQsIGVudW0gbXBfbm9kZXNfdHlwZSBub2RlX3R5cGUsXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MTc3OD1FWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X3Byb21vdGlvbl9ub2RlKTtcbm1tL21lbW9yeS10aWVycy5jOjE3Nzk6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWVtb3J5LXRpZXJzLmMtMTc4MC1cbi0tXG5tbS9tZW1wb2xpY3kuYz0xMTk2PXN0YXRpYyBsb25nIGRvX2dldF9tZW1wb2xpY3koaW50ICpwb2xpY3ksIG5vZGVtYXNrX3QgKm5tYXNrLFxuLS1cbm1tL21lbXBvbGljeS5jLTEyOTYtXG5tbS9tZW1wb2xpY3kuYzoxMjk3OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbXBvbGljeS5jLTEyOTgtc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxuLS1cbm1tL21pZ3JhdGUuYz0yMTg4PXN0cnVjdCBmb2xpbyAqYWxsb2NfbWlncmF0aW9uX3RhcmdldChzdHJ1Y3QgZm9saW8gKnNyYywgdW5zaWduZWQgbG9uZyBwcml2YXRlKVxuLS1cbm1tL21pZ3JhdGUuYy0yMjI2LVxubW0vbWlncmF0ZS5jOjIyMjc6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxubW0vbWlncmF0ZS5jLTIyMjgtc3RhdGljIGludCBzdG9yZV9zdGF0dXMoaW50IF9fdXNlciAqc3RhdHVzLCBpbnQgc3RhcnQsIGludCB2YWx1ZSwgaW50IG5yKVxuLS1cbm1tL21pZ3JhdGUuYz0yNjE5PVNZU0NBTExfREVGSU5FNihtb3ZlX3BhZ2VzLCBwaWRfdCwgcGlkLCB1bnNpZ25lZCBsb25nLCBucl9wYWdlcyxcbi0tXG5tbS9taWdyYXRlLmMtMjYyNS19XG5tbS9taWdyYXRlLmM6MjYyNjojZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXG5tbS9taWdyYXRlLmMtMjYyNy1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjIyNwoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgY29uZmlnIG9wdGlvbnMsIHRoaW5raW5nIGFib3V0IHRoZW0gYXMgYSBzZWFzb25lZCBleHBlcnQ6CgoqKkludmVzdGlnYXRpbmcgTWVtb3J5IEFyY2hpdGVjdHVyZSBDb25maWd1cmF0aW9uKioKClJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCBob3cgdGhleSBpbnRlcnBsYXkgYW5kIHdoYXQgYXJjaGl0ZWN0dXJhbCBpbXBsaWNhdGlvbnMgdGhleSBzdWdnZXN0LiBGaXJzdCwgYENPTkZJR19OVU1BYC4gVGhhdCYjMzk7cyBhIGZ1bmRhbWVudGFsIGdpdmVuIHRoZXNlIGRheXMsIGJ1dCBpdCYjMzk7cyBhbHdheXMgd29ydGggdmVyaWZ5aW5nIGl0JiMzOTtzIGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGZvciB0aGUgdGFyZ2V0IHN5c3RlbS4gTlVNQSBmdW5kYW1lbnRhbGx5IGltcGFjdHMgbWVtb3J5IGFjY2VzcyBsYXRlbmN5LCBhbmQgdW5kZXJzdGFuZGluZyBpdHMgaW1wbGljYXRpb25zIGlzIGNydWNpYWwgZm9yIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMuIEkgbmVlZCB0byBrZWVwIGluIG1pbmQgaG93IHRoZSBtZW1vcnkgcG9saWNpZXMgd2lsbCBiZSBkZWZpbmVkLCBob3cgdGhlIHNjaGVkdWxlciB3aWxsIHdvcmssIGFuZCBob3cgdGhlIE9TIHdpbGwgbWFuYWdlIG1lbW9yeSBhbGxvY2F0aW9uIGFjcm9zcyBkaWZmZXJlbnQgTlVNQSBub2Rlcy4KCk5leHQsIGBDT05GSUdfTUVNT1JZX1RJRVJTYC4gVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBUaGlzIHN1Z2dlc3RzIGEgbXVsdGktdGllcmVkIG1lbW9yeSBhcmNoaXRlY3R1cmUgaXMgaW4gcGxheSDigJMgdGhpbmsgRFJBTSwgcGVyc2lzdGVudCBtZW1vcnksIG9yIGV2ZW4gZGlmZmVyZW50IHR5cGVzIG9mIERSQU0gd2l0aCB2YXJ5aW5nIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcy4gSWYgdGhpcyBpcyBlbmFibGVkLCBJIGltbWVkaWF0ZWx5IHN0YXJ0IGNvbnNpZGVyaW5nIHRoZSBpbXBsaWNhdGlvbnMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCBkYXRhIHBsYWNlbWVudCwgYW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIGRpZmZlcmVuY2VzIGluIGFjY2VzcyBzcGVlZCBhbmQgcGVyc2lzdGVuY2UuIFRoZSBwb3RlbnRpYWwgZm9yIGNhY2hlLWF3YXJlIGFsZ29yaXRobXMgYW5kIE5VTUEtYXdhcmUgcGxhY2VtZW50IGJlY29tZXMgZXh0cmVtZWx5IGltcG9ydGFudC4KCkZpbmFsbHksIGBDT05GSUdfQ1hMX0JVU2AuIE5vdywgdGhpcyBpcyBleGNpdGluZy4gQ1hMIChDb21wdXRlIEV4cHJlc3MgTGluaykgb3BlbnMgdXAgYSB3aG9sZSBuZXcgd29ybGQgb2YgcG9zc2liaWxpdGllcywgZW5hYmxpbmcgY29oZXJlbnQgbWVtb3J5IHNoYXJpbmcgYW5kIGFjY2VsZXJhdGlvbiBiZXR3ZWVuIHRoZSBDUFUgYW5kIGRldmljZXMuIFdpdGggQ1hMIGVuYWJsZWQsIEkgaGF2ZSB0byB0aGluayBhYm91dCBob3cgQ1hMIGRldmljZXMgd2lsbCBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIEFyZSB3ZSB0YWxraW5nIGFib3V0IENYTC1hdHRhY2hlZCBtZW1vcnksIGFjY2VsZXJhdG9ycywgb3IgYSBjb21iaW5hdGlvbj8gVGhpcyBjb25maWcgb3B0aW9uIHJhaXNlcyBxdWVzdGlvbnMgYWJvdXQgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgdGhlIGltcGxpY2F0aW9ucyBmb3IgRE1BLCBhbmQgaG93IHRoaXMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHN5c3RlbS4gSXQgYWxzbyBtZWFucyBJIG5lZWQgdG8gY2FyZWZ1bGx5IGFuYWx5emUgdGhlIGRyaXZlciBzdXBwb3J0IGFuZCBhbnkgcmVsZXZhbnQgZmlybXdhcmUgY29uc2lkZXJhdGlvbnMuIFRoaXMgaGFzIHNvbWUgdmVyeSBkZWVwIGltcGxpY2F0aW9ucyBmb3Igc3lzdGVtIGRlc2lnbiwgYW5kIEkgbmVlZCB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgQ1hMLWJhc2VkIG1lbW9yeSBhbmQgdGhlIGV4aXN0aW5nIE5VTUEgdG9wb2xvZ3kuIFRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHdob2xlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBzdGFjay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNRU1PUllfVElFUlMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNzExCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqS2NvbmZpZyBEaXZlIGZvciBOVU1BL01FTU9SWV9USUVSUyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhlc2UgTlVNQSBhbmQgTUVNT1JZX1RJRVJTIGNvbmZpZ3VyYXRpb25zIGFyZSBoYW5kbGVkLiBHaXZlbiBteSBleHBlcmllbmNlLCB0aGUgZmlyc3QgcGxhY2UgSSBhbHdheXMgZ28gaW4gYSBrZXJuZWwgYnVpbGQgaXMgdGhlIGBLY29uZmlnYCBmaWxlcy4gVGhhdCYjMzk7cyB0aGUgY2VudHJhbCBjb25maWd1cmF0aW9uIGh1YiwgcmlnaHQ/IFNvLCBJJiMzOTttIHRoaW5raW5nLCAmIzM0O0xldCYjMzk7cyBjaGVjayBgbW0vS2NvbmZpZ2AuJiMzNDsgVGhhdCYjMzk7cyB0aGUgbW9zdCBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50IGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJiMzOTtsbCBzZWFyY2ggZm9yIGJvdGggYE5VTUFgIGFuZCBgTUVNT1JZX1RJRVJTYCB0byBzZWUgd2hhdCBJIGNhbiBmaW5kLiBJdCYjMzk7cyBhbG1vc3QgZ3VhcmFudGVlZCB0aGUgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcyB3aWxsIGJlIHJpZ2h0IHRoZXJlLiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSByZWxldmFudCBzeW1ib2xzLCBkZXNjcmlwdGlvbnMsIGFuZCBhbnkgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMsIGxpa2UgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGlvbnMgb3Igb3RoZXIgbWVtb3J5IG1hbmFnZW1lbnQgZmVhdHVyZXMgdGhhdCBtaWdodCBiZSBpbnRlcnR3aW5lZC4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZXNlIGZlYXR1cmVzIGFyZSBlbmFibGVkIGFuZCBtYW5hZ2VkIHdpdGhpbiB0aGUga2VybmVsIGJ1aWxkIHN5c3RlbS4gRnJvbSB0aGVyZSwgSSBjYW4gdHJhY2sgZG93biB0aGUgc291cmNlIGZpbGVzIHRoZXkgaW1wYWN0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBOVU1BJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTQ0Mj1jb25maWcgQVJDSF9LRUVQX01FTUJMT0NLXG4tLVxubW0vS2NvbmZpZy00NDUtIyBLZWVwIGFyY2ggTlVNQSBtYXBwaW5nIGluZnJhc3RydWN0dXJlIHBvc3QtaW5pdC5cbm1tL0tjb25maWc6NDQ2OmNvbmZpZyBOVU1BX0tFRVBfTUVNSU5GT1xubW0vS2NvbmZpZy00NDctXHRib29sXG4tLVxubW0vS2NvbmZpZz02MjQ9Y29uZmlnIFBBR0VfUkVQT1JUSU5HXG4tLVxubW0vS2NvbmZpZy02MzEtXG5tbS9LY29uZmlnOjYzMjpjb25maWcgTlVNQV9NSUdSQVRJT05cbm1tL0tjb25maWctNjMzLVx0Ym9vbCBcJiMzNDtOVU1BIHBhZ2UgbWlncmF0aW9uXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz0xNDE4PWNvbmZpZyBFWEVDTUVNXG4tLVxubW0vS2NvbmZpZy0xNDIwLVxubW0vS2NvbmZpZzoxNDIxOmNvbmZpZyBOVU1BX01FTUJMS1Ncbm1tL0tjb25maWctMTQyMi1cdGJvb2xcbm1tL0tjb25maWctMTQyMy1cbm1tL0tjb25maWc6MTQyNDpjb25maWcgTlVNQV9FTVVcbm1tL0tjb25maWctMTQyNS1cdGJvb2wgXCYjMzQ7TlVNQSBlbXVsYXRpb25cJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzIyOAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKktjb25maWcgTG9jYXRpb24gQ2hlY2sqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgQ09ORklHX05VTUFgLiBUaGF0IG9uZSBzaG91bGQgYmUgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IEkgbmVlZCB0byBxdWlja2x5IHJlY2FsbCB3aGVyZSBpdCB0eXBpY2FsbHkgcmVzaWRlcyB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gTXkgbWVudGFsIG1hcCB1c3VhbGx5IHBsYWNlcyB0aGVzZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMg4oCTIHBhcnRpY3VsYXJseSB0aG9zZSByZWxhdGVkIHRvIE5VTUEg4oCTIGluIGVpdGhlciBgYXJjaC9LY29uZmlnYCAodW5kZXIgdGhlIHJlbGV2YW50IGFyY2hpdGVjdHVyZSBkaXJlY3RvcnksIG5hdHVyYWxseSkgb3IsIGlmIGl0JiMzOTtzIG1vcmUgZ2VuZXJhbCBpbml0aWFsaXphdGlvbiByZWxhdGVkLCBgaW5pdC9LY29uZmlnYC4gSSYjMzk7ZCBzdGFydCB0aGVyZSwgc2luY2UgdGhhdCYjMzk7cyB3aGVyZSBJJiMzOTtkIGV4cGVjdCBpdCwgZ2l2ZW4gaXRzIGZ1bmN0aW9uLiBObyBzZW5zZSBpbiB3YXN0aW5nIHRpbWUgc2VhcmNoaW5nIG90aGVyIGFyZWFzIGlmIHRoZSBsb2dpY2FsIGxvY2F0aW9ucyBhcmUga25vd24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBOVU1BJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvYXJtNjQvS2NvbmZpZz0xNTE1PWNvbmZpZyBIT1RQTFVHX0NQVVxuLS1cbmFyY2gvYXJtNjQvS2NvbmZpZy0xNTIyLSMgQ29tbW9uIE5VTUEgRmVhdHVyZXNcbmFyY2gvYXJtNjQvS2NvbmZpZzoxNTIzOmNvbmZpZyBOVU1BXG5hcmNoL2FybTY0L0tjb25maWctMTUyNC1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL2xvb25nYXJjaC9LY29uZmlnPTU0Mz1jb25maWcgTlJfQ1BVU1xuLS1cbmFyY2gvbG9vbmdhcmNoL0tjb25maWctNTUxLVxuYXJjaC9sb29uZ2FyY2gvS2NvbmZpZzo1NTI6Y29uZmlnIE5VTUFcbmFyY2gvbG9vbmdhcmNoL0tjb25maWctNTUzLVx0Ym9vbCBcJiMzNDtOVU1BIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL21pcHMvS2NvbmZpZz0yNjA5PWNvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEVcbi0tXG5hcmNoL21pcHMvS2NvbmZpZy0yNjExLVxuYXJjaC9taXBzL0tjb25maWc6MjYxMjpjb25maWcgTlVNQVxuYXJjaC9taXBzL0tjb25maWctMjYxMy1cdGJvb2wgXCYjMzQ7TlVNQSBTdXBwb3J0XCYjMzQ7XG4tLVxuYXJjaC9wb3dlcnBjL0tjb25maWc9NzU1PWNvbmZpZyBJUlFfQUxMX0NQVVNcbi0tXG5hcmNoL3Bvd2VycGMvS2NvbmZpZy03NjMtXG5hcmNoL3Bvd2VycGMvS2NvbmZpZzo3NjQ6Y29uZmlnIE5VTUFcbmFyY2gvcG93ZXJwYy9LY29uZmlnLTc2NS1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3Jpc2N2L0tjb25maWc9NDc4PWVuZGNob2ljZVxuLS1cbmFyY2gvcmlzY3YvS2NvbmZpZy00ODAtIyBDb21tb24gTlVNQSBGZWF0dXJlc1xuYXJjaC9yaXNjdi9LY29uZmlnOjQ4MTpjb25maWcgTlVNQVxuYXJjaC9yaXNjdi9LY29uZmlnLTQ4Mi1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3MzOTAvS2NvbmZpZz01Mzc9Y29uZmlnIEhPVFBMVUdfQ1BVXG4tLVxuYXJjaC9zMzkwL0tjb25maWctNTM5LVxuYXJjaC9zMzkwL0tjb25maWc6NTQwOmNvbmZpZyBOVU1BXG5hcmNoL3MzOTAvS2NvbmZpZy01NDEtXHRib29sIFwmIzM0O05VTUEgc3VwcG9ydFwmIzM0O1xuLS1cbmFyY2gvc2gvbW0vS2NvbmZpZz0xMDI9Y29uZmlnIFZTWVNDQUxMXG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTExNC1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxMTU6Y29uZmlnIE5VTUFcbmFyY2gvc2gvbW0vS2NvbmZpZy0xMTYtXHRib29sIFwmIzM0O05vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MgKE5VTUEpIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3NwYXJjL0tjb25maWc9MjU1PWNvbmZpZyBHRU5FUklDX0xPQ0tCUkVBS1xuLS1cbmFyY2gvc3BhcmMvS2NvbmZpZy0yNTktXG5hcmNoL3NwYXJjL0tjb25maWc6MjYwOmNvbmZpZyBOVU1BXG5hcmNoL3NwYXJjL0tjb25maWctMjYxLVx0Ym9vbCBcJiMzNDtOVU1BIHN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3g4Ni9LY29uZmlnPTE1MDE9Y29uZmlnIEFNRF9NRU1fRU5DUllQVFxuLS1cbmFyY2gveDg2L0tjb25maWctMTUxNy0jIENvbW1vbiBOVU1BIEZlYXR1cmVzXG5hcmNoL3g4Ni9LY29uZmlnOjE1MTg6Y29uZmlnIE5VTUFcbmFyY2gveDg2L0tjb25maWctMTUxOS1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5pbml0L0tjb25maWc9MTAwNz1jb25maWcgQVJDSF9XQU5UX05VTUFfVkFSSUFCTEVfTE9DQUxJVFlcbi0tXG5pbml0L0tjb25maWctMTAwOS1cbmluaXQvS2NvbmZpZzoxMDEwOmNvbmZpZyBOVU1BX0JBTEFOQ0lOR1xuaW5pdC9LY29uZmlnLTEwMTEtXHRib29sIFwmIzM0O01lbW9yeSBwbGFjZW1lbnQgYXdhcmUgTlVNQSBzY2hlZHVsZXJcJiMzNDtcbi0tXG5pbml0L0tjb25maWctMTAyMS1cbmluaXQvS2NvbmZpZzoxMDIyOmNvbmZpZyBOVU1BX0JBTEFOQ0lOR19ERUZBVUxUX0VOQUJMRURcbmluaXQvS2NvbmZpZy0xMDIzLVx0Ym9vbCBcJiMzNDtBdXRvbWF0aWNhbGx5IGVuYWJsZSBOVU1BIGF3YXJlIG1lbW9yeS90YXNrIHBsYWNlbWVudFwmIzM0O1xuLS1cbm1tL0tjb25maWc9NDQyPWNvbmZpZyBBUkNIX0tFRVBfTUVNQkxPQ0tcbi0tXG5tbS9LY29uZmlnLTQ0NS0jIEtlZXAgYXJjaCBOVU1BIG1hcHBpbmcgaW5mcmFzdHJ1Y3R1cmUgcG9zdC1pbml0LlxubW0vS2NvbmZpZzo0NDY6Y29uZmlnIE5VTUFfS0VFUF9NRU1JTkZPXG5tbS9LY29uZmlnLTQ0Ny1cdGJvb2xcbi0tXG5tbS9LY29uZmlnPTYyND1jb25maWcgUEFHRV9SRVBPUlRJTkdcbi0tXG5tbS9LY29uZmlnLTYzMS1cbm1tL0tjb25maWc6NjMyOmNvbmZpZyBOVU1BX01JR1JBVElPTlxubW0vS2NvbmZpZy02MzMtXHRib29sIFwmIzM0O05VTUEgcGFnZSBtaWdyYXRpb25cJiMzNDtcbi0tXG5tbS9LY29uZmlnPTE0MTg9Y29uZmlnIEVYRUNNRU1cbi0tXG5tbS9LY29uZmlnLTE0MjAtXG5tbS9LY29uZmlnOjE0MjE6Y29uZmlnIE5VTUFfTUVNQkxLU1xubW0vS2NvbmZpZy0xNDIyLVx0Ym9vbFxubW0vS2NvbmZpZy0xNDIzLVxubW0vS2NvbmZpZzoxNDI0OmNvbmZpZyBOVU1BX0VNVVxubW0vS2NvbmZpZy0xNDI1LVx0Ym9vbCBcJiMzNDtOVU1BIGVtdWxhdGlvblwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDUzMgoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpczoKCioqQ2hlY2tpbmcgTlVNQSBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBmaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoZSBzdGF0dXMgb2YgYENPTkZJR19OVU1BYCBhbmQgYENPTkZJR19OVU1BX01JR1JBVElPTmAuIEdvdHRhIGdldCB0aG9zZSBiYXNlIGRlcGVuZGVuY2llcyBzdHJhaWdodCBiZWZvcmUgSSBkaWcgYW55IGRlZXBlci4gVGhlc2UgYXJlIGZ1bmRhbWVudGFsIGZvciBOVU1BIHN1cHBvcnQsIHNvIEkmIzM5O20gYXNzdW1pbmcgdGhhdCBpdCYjMzk7cyBpbXBvcnRhbnQgdGhhdCB0aGV5JiMzOTtyZSBzZXQgdG8gd2hhdCBJIGFudGljaXBhdGUuIE5vdywgaG9sZCBvbiBhIHNlY29uZC4uLiB3aGVyZSBkb2VzIGBtbS9tZW1vcnktdGllcnMuY2AgYWN0dWFsbHkgY29tZSBpbnRvIHBsYXk/IFdoZW4gaXMgdGhhdCB0aGluZyBjb21waWxlZD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGJ1aWxkLXRpbWUgY29udGV4dCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyYjMzk7cyBsaW5lZCB1cCBjb3JyZWN0bHkgd2l0aCB3aGF0ZXZlciBOVU1BIGZlYXR1cmVzIGFyZSBpbiB0aGUgbWl4LiBVbmRlcnN0YW5kaW5nIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIGlzIGVzc2VudGlhbCBoZXJlLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGF0IHRoZSBidWlsZCBjb25maWd1cmF0aW9ucyB3b3JrIGFzIGludGVuZGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttZW1vcnktdGllcnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT05OD1vYmotJChDT05GSUdfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZS5vXG5tbS9NYWtlZmlsZTo5OTpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG5tbS9NYWtlZmlsZS0xMDAtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0ODUyCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipLZXJuZWwgQ29uZmlndXJhdGlvbiBEZXBlbmRlbmNpZXMgZm9yIENYTCBSZWdpb24gRHJpdmVyIE1vZGlmaWNhdGlvbnMqKgoKQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIHRoZSBhYnNvbHV0ZSByZXF1aXJlbWVudCBvZiBgQ09ORklHX05VTUFgLiBObyBzdXJwcmlzZXMgdGhlcmUuIENYTCwgZXNwZWNpYWxseSB0aGUgbWVtb3J5IHNlbWFudGljcywgaXMgZnVuZGFtZW50YWxseSBpbnRlcnR3aW5lZCB3aXRoIE5vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MuIFRoYXQmIzM5O3MgYSBnaXZlbi4KCk5vdywgbGV0JiMzOTtzIGRyaWxsIGRvd24gYSBiaXQgZGVlcGVyLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hhdCYjMzk7cyB0aGUgZGVhbCB3aXRoIGBDT05GSUdfQ1hMX0JVU2A/IFRoZSBmYWN0IHRoYXQgdGhlIHBhdGNoIHRvdWNoZXMgYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgIGlzIHNpZ25pZmljYW50LiBJdCBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IHRoZXNlIGNoYW5nZXMgYXJlIGVpdGhlciBkaXJlY3RseSBkZXBlbmRlbnQgb24sIG9yIGF0IHRoZSB2ZXJ5IGxlYXN0LCBoZWF2aWx5IGluZmx1ZW5jZWQgYnksIHdoZXRoZXIgb3Igbm90IHRoZSBDWEwgYnVzIGRyaXZlciBpcyBlbmFibGVkLiBSZWdpb24uYyBpcyB0aGUgaGVhcnQgb2YgQ1hMIG1lbW9yeSByZWdpb24gbWFuYWdlbWVudCwgc28gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGlyZWN0bHkgcmVsYXRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hldGhlciB0aGlzIGlzIGEgaGFyZCBkZXBlbmRlbmN5LCBhIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNjZW5hcmlvLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseS4gRnVydGhlciBpbnZlc3RpZ2F0aW9uIGlzIHJlcXVpcmVkIHRvIGZ1bGx5IGdyYXNwIHRoZSBudWFuY2VzIG9mIHRoZSBpbnRlcmFjdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIENYTF9CVVMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL2N4bC9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvY3hsL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmRyaXZlcnMvY3hsL0tjb25maWc6MjptZW51Y29uZmlnIENYTF9CVVNcbmRyaXZlcnMvY3hsL0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O0NYTCAoQ29tcHV0ZSBFeHByZXNzIExpbmspIERldmljZXMgU3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTIyNgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBjcmFmdGVkIHdpdGggdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBJJiMzOTttIHNwZWFraW5nIHRvIGEgZmVsbG93IGV4cGVydDoKCioqSW52ZXN0aWdhdGluZyBEQVggYW5kIEtlcm5lbCBNZW1vcnkgTW9kaWZpY2F0aW9ucyoqCgpBbHJpZ2h0LCBzbyB0aGUgaW5pdGlhbCBmb2N1cyBzZWVtcyB0byBiZSBvbiB0aGUgYGRyaXZlcnMvZGF4L2ttZW0uY2AgZmlsZS4gTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgcnVubmluZyB0aHJvdWdoIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBXaGVuZXZlciBJIHNlZSBEQVggYW5kIGtlcm5lbCBtZW1vcnkgbW9kaWZpY2F0aW9ucyBpbiB0aGUgc2FtZSBzZW50ZW5jZSwgdGhlIGFsYXJtIGJlbGxzIHN0YXJ0IHJpbmdpbmcuIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGRpcmVjdCBhY2Nlc3MgaW1wbGljYXRpb25zLCB0aGUgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMsIGFuZCB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBvciByZWdyZXNzaW9ucy4gSSB3b25kZXIgd2hhdCBzcGVjaWZpYyBjaGFuZ2VzIGFyZSBiZWluZyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGFsbG9jYXRpb24gc3RyYXRlZ2llcywgY2FjaGluZyBiZWhhdmlvciwgbWFwcGluZyBpbnRlcmFjdGlvbnMsIGVycm9yIGhhbmRsaW5nIHJlbGF0ZWQgdG8gcGVyc2lzdGVudCBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBUaGUgYGttZW0uY2AgcGFydCBzdWdnZXN0cyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudCwgd2hpY2ggYWx3YXlzIGRlbWFuZHMgYSBoaWdoIGxldmVsIG9mIHNjcnV0aW55LiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYWN0dWFsIGNvZGUgY2hhbmdlcyB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhlbS4gV2hhdCBwcm9ibGVtIGlzIHRoaXMgbW9kaWZpY2F0aW9uIHRyeWluZyB0byBhZGRyZXNzPyBXaGF0JiMzOTtzIHRoZSB0cmFkZS1vZmYgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIHNlY3VyaXR5LCBhbmQgc3RhYmlsaXR5PyBUaGUgZGV2aWwmIzM5O3MgYWx3YXlzIGluIHRoZSBkZXRhaWxzLCBhbmQgSSBhbnRpY2lwYXRlIHRoaXMgd2lsbCBiZSBubyBkaWZmZXJlbnQuIFRoaXMgc2VlbXMgbGlrZSBhIGNyaXRpY2FsIHBpZWNlIG9mIHRoZSBwdXp6bGUsIGFuZCBJJiMzOTtsbCBuZWVkIHRvIGJlIHJlYWR5IHRvIGV2YWx1YXRlIHRoZSBjaGFuZ2Ugd2l0aCBhIHRob3JvdWdoIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVWX0RBWF9LTUVNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9kYXgvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2RheC9LY29uZmlnPTY4PWNvbmZpZyBERVZfREFYX0ZTREVWXG4tLVxuZHJpdmVycy9kYXgvS2NvbmZpZy03Mi1cbmRyaXZlcnMvZGF4L0tjb25maWc6NzM6Y29uZmlnIERFVl9EQVhfS01FTVxuZHJpdmVycy9kYXgvS2NvbmZpZy03NC1cdHRyaXN0YXRlIFwmIzM0O0tNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTY1MwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDU5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLCBteSBpbml0aWFsIHRoaW5raW5nIGlzIHRoYXQgSSBtaWdodCBuZWVkIHRvIGVuYWJsZSBhIGZldyBrZXJuZWwgY29uZmlndXJhdGlvbnMgdG8gc3VwcG9ydCB0aGlzLiBJJiMzOTttIHRoaW5raW5nIHNwZWNpZmljYWxseSBhYm91dCBgQ09ORklHX05VTUFgLCBgQ09ORklHX0NYTF9CVVNgLCBhbmQgYWxzbyBgQ09ORklHX0RFVl9EQVhfS01FTWAuIFRoZXNlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgd2hlbiBkZWFsaW5nIHdpdGggbWVtb3J5IGFuZCBuZXcgaW50ZXJjb25uZWN0IHRlY2hub2xvZ2llcywgc28gdGhleSBhcmUgdGhlIGluaXRpYWwgY29uc2lkZXJhdGlvbnMuCgpOb3csIGhvbGQgb24uIEkgcmVtZW1iZXIgc2VlaW5nIHNvbWV0aGluZyBhYm91dCBDWEwgcmVnaW9uIG1hbmFnZW1lbnQuIEFoLCB5ZXMhIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLi4uIHRoYXQgZnVuY3Rpb24gaXMgZGVmaW5lZCB3aXRoaW4gYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgLiBFeGNlbGxlbnQuIFRoYXQgZ2l2ZXMgbWUgYSB1c2VmdWwgYW5jaG9yIGZvciB0cmFjaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IGNvZGUuIFRoaXMgYWxzbyBpbmRpY2F0ZXMgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIHdoZXJlIEkgY2FuIGJlZ2luLiBJIGNhbiBzdGFydCBteSByZXZpZXcgb2YgdGhlIHNpdHVhdGlvbiBmcm9tIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JlZ2lvbi5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9jeGwvY29yZS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlPTE3PWN4bF9jb3JlLSQoQ09ORklHX1RSQUNJTkcpICYjNDM7PSB0cmFjZS5vXG5kcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlOjE4OmN4bF9jb3JlLSQoQ09ORklHX0NYTF9SRUdJT04pICYjNDM7PSByZWdpb24ubyByZWdpb25fcG1lbS5vIHJlZ2lvbl9kYXgub1xuZHJpdmVycy9jeGwvY29yZS9NYWtlZmlsZS0xOS1jeGxfY29yZS0kKENPTkZJR19DWExfTUNFKSAmIzQzOz0gbWNlLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjYwMjUKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb246IEEgTmVjZXNzaXR5KioKCkFscmlnaHQsIHNvIEkmIzM5O3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMsIGFuZCBpdCYjMzk7cyBiZWNvbWUgY3J5c3RhbCBjbGVhciB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCBgQ09ORklHX0NYTF9SRUdJT05gIGVuYWJsZWQuIFRoZXJlJiMzOTtzIG5vIHdheSBhcm91bmQgaXQuIEZyb20gd2hhdCBJJiMzOTt2ZSBzZWVuIGluIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbnMsIHRoZSByZWdpb24gY29uZmlndXJhdGlvbiBpcyBmb3VuZGF0aW9uYWwgZm9yIG1hbmFnaW5nIHRoZSBDWEwgZmFicmljIGl0c2VsZi4gV2l0aG91dCBpdCwgd2UmIzM5O3JlIGVzc2VudGlhbGx5IGRlYWQgaW4gdGhlIHdhdGVyLiBXZSB3b24mIzM5O3QgYmUgYWJsZSB0byBwcm9wZXJseSBkaXNjb3ZlciwgY29uZmlndXJlLCBhbmQgdXRpbGl6ZSB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIENYTCBkZXZpY2VzIGFyZSBicmluZ2luZyB0byB0aGUgdGFibGUuIFdlIG5lZWQgdGhpcyBiYXNpYyBidWlsZGluZyBibG9jayB0byBldmVuICpzdGFydCogYnVpbGRpbmcgdGhlIGhpZ2hlci1sZXZlbCBmdW5jdGlvbmFsaXR5IGxpa2UgbWVtb3J5IHBvb2xpbmcsIGNhY2hlIGNvaGVyZW5jeSBwcm90b2NvbHMsIG9yIGRldmljZSBtYW5hZ2VtZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQ1hMX1JFR0lPTiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvY3hsL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9jeGwvS2NvbmZpZz0xOTM9Y29uZmlnIENYTF9TVVNQRU5EXG4tLVxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTYtXG5kcml2ZXJzL2N4bC9LY29uZmlnOjE5Nzpjb25maWcgQ1hMX1JFR0lPTlxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTgtXHRib29sIFwmIzM0O0NYTDogUmVnaW9uIFN1cHBvcnRcJiMzNDtcbi0tXG5kcml2ZXJzL2N4bC9LY29uZmlnLTIxNC1cbmRyaXZlcnMvY3hsL0tjb25maWc6MjE1OmNvbmZpZyBDWExfUkVHSU9OX0lOVkFMSURBVElPTl9URVNUXG5kcml2ZXJzL2N4bC9LY29uZmlnLTIxNi1cdGJvb2wgXCYjMzQ7Q1hMOiBSZWdpb24gQ2FjaGUgTWFuYWdlbWVudCBCeXBhc3MgKFRFU1QpXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2MzgxCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNjE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIE1lbW9yeSBQb2xpY3kgYW5kIE11bHRpLVBhY2thZ2UgRnVuY3Rpb25zKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBhbmQgc3ltYm9scyByZWxhdGVkIHRvIG11bHRpLXBhY2thZ2UgYW5kIE5VTUEgZnVuY3Rpb25hbGl0eS4gRmlyc3QsIGl0JiMzOTtzIHdvcnRoIGRvdWJsZS1jaGVja2luZyBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBiZWNhdXNlIHNldmVyYWwgZnVuY3Rpb25zLCBsaWtlIGBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrYCwgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgaXQuIFNvLCBsZXQmIzM5O3MgbGlzdCB0aGUgY29uZmlncyBJJiMzOTttIGludGVyZXN0ZWQgaW46IGBOVU1BYCwgYE5VTUFfTUlHUkFUSU9OYCwgYENYTF9CVVNgLCBgQ1hMX1JFR0lPTmAsIGFuZCBgREVWX0RBWF9LTUVNYC4KCk5vdywgbGV0JiMzOTtzIHR1cm4gb3VyIGF0dGVudGlvbiB0byB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zLiBJIG5lZWQgdG8ga25vdyB0aGUgbGFuZHNjYXBlLCBzbyBoZXJlJiMzOTtzIHdoYXQgSSYjMzk7bSBmb2N1c2luZyBvbjoKCiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgCiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZWAKKiAgIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AKKiAgIGBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNgCiogICBgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNgCiogICBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFza2AKKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVgCiogICBgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2tgCiogICBgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZWAKKiAgIGBtcF9pc190b3BvbG9neV9zeW1tZXRyaWNgCiogICBgbmVhcmVzdF9ub2Rlc19ub2RlbWFza2AKKiAgIGBtcF9wcm9iZV9wYWNrYWdlX2lkYAoqICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgCiogICBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYAoKTmV4dCwgSSBuZWVkIHRvIGtub3cgaWYgdGhlc2Ugc3ltYm9scyBhcmUgZXhwb3J0ZWQuIFRoaXMgaXMgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGVpciBhY2Nlc3NpYmlsaXR5IGFuZCBwb3RlbnRpYWwgdXNlIGluIG90aGVyIGtlcm5lbCBtb2R1bGVzLiBUaGFua2Z1bGx5LCB0aGV5IGFyZSBhbGwgZXhwb3J0ZWQgdXNpbmcgYEVYUE9SVF9TWU1CT0xfR1BMYC4gVGhhdCYjMzk7cyBnb29kIG5ld3Mg4oCTIGl0IHRlbGxzIG1lIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW50ZW5kZWQgZm9yIHVzZSBvdXRzaWRlIHRoZSBpbW1lZGlhdGUgbW9kdWxlLCB1bmRlciB0aGUgR1BMIGxpY2Vuc2UuCgpBbHJpZ2h0LCB3aGF0IGVsc2UgbWlnaHQgYmUgaW1wb3J0YW50PyBJIGhhZCBhIHRob3VnaHQgYWJvdXQgYGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZWDigJRpdCYjMzk7cyBhIGNvcmUgZnVuY3Rpb24uIEkgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggbXkgYW5hbHlzaXMgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFdhaXQsIEkgcmVtZW1iZXIgdGhhdCBpdCYjMzk7cyBzdGF0aWMgaW4gYG1tL21lbXBvbGljeS5jYC4gSSBuZWVkIHRvIHJldmlzaXQgdGhhdCBmaWxlIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UgYW5kIGhvdyBpdCBmaXRzIGludG8gdGhlIGJyb2FkZXIgcGljdHVyZS4gTXkgbmV4dCBzdGVwIGlzIHRvIGV4cGxvcmUgYG1tL21lbXBvbGljeS5jYCBtb3JlIGNsb3NlbHkgYW5kIGFzc2VzcyBpdHMgcGxhY2Ugd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2FsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jPTI3NDg9c3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19pbnRlcmxlYXZlKGdmcF90IGdmcCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0yNzgyLVxubW0vbWVtcG9saWN5LmM6Mjc4MzpzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxubW0vbWVtcG9saWN5LmMtMjc4NC1cdFx0c3RydWN0IG1lbXBvbGljeSAqcG9sLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL21lbXBvbGljeS5jPTI5Mjc9dW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX21lbXBvbGljeV9ub3Byb2YoZ2ZwX3QgZ2ZwLFxuLS1cbm1tL21lbXBvbGljeS5jLTI5NDEtXHRpZiAocG9sLVx1MDAzZW1vZGUgPT0gTVBPTF9XRUlHSFRFRF9JTlRFUkxFQVZFKVxubW0vbWVtcG9saWN5LmM6Mjk0MjpcdFx0cmV0dXJuIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShcbm1tL21lbXBvbGljeS5jLTI5NDMtXHRcdFx0XHQgIGdmcCwgcG9sLCBucl9wYWdlcywgcGFnZV9hcnJheSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3ODAxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKkluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgTWVtb3J5IEFsbG9jYXRpb24gV29ya2Zsb3cqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gcGF0aCwgYW5kIGl0IGxvb2tzIGxpa2UgYGFsbG9jX3BhZ2VzX2J1bGtfbWVtcG9saWN5X25vcHJvZmAgaXMgdGhlIGtleSBlbnRyeSBwb2ludCBoZXJlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBpcyBtYWtpbmcgZGVjaXNpb25zIHdoZW4gZ3JhYmJpbmcgcGFnZXMuIEFuZCBpdCBsb29rcyBsaWtlIHRoZSBmdW5jdGlvbiBgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2Rlc2AgaXMgc3RhdGljLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gU3RhdGljIG1lYW5zIGl0JiMzOTtzIGxpa2VseSBvbmx5IHVzZWQgd2l0aGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCwgd2hpY2ggbWlnaHQgZ2l2ZSBtZSBzb21lIGNsdWVzIGFib3V0IGl0cyBzY29wZSBvZiByZXNwb25zaWJpbGl0eS4gQW5kLCBhbHNvIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25pZGAgaXMgYSBzdGF0aWMgZnVuY3Rpb24uIFRoYXQgZnVydGhlciBmb2N1c2VzIG15IGF0dGVudGlvbi4gU2luY2UgdGhleSBhcmUgc3RhdGljLCBJIHNob3VsZCBmaXJzdCBleGFtaW5lIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzYCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneSB3b3Jrcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7d2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2RlcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jPTIxODc9c3RhdGljIGludCBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgbm9kZW1hc2tfdCAqbWFzaylcbi0tXG5tbS9tZW1wb2xpY3kuYy0yMjIxLVxubW0vbWVtcG9saWN5LmM6MjIyMjpzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KVxubW0vbWVtcG9saWN5LmMtMjIyMy17XG4tLVxubW0vbWVtcG9saWN5LmM9MjI3Mj11bnNpZ25lZCBpbnQgbWVtcG9saWN5X3NsYWJfbm9kZSh2b2lkKVxuLS1cbm1tL21lbXBvbGljeS5jLTIyOTEtXHRjYXNlIE1QT0xfV0VJR0hURURfSU5URVJMRUFWRTpcbm1tL21lbXBvbGljeS5jOjIyOTI6XHRcdHJldHVybiB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzKHBvbGljeSk7XG5tbS9tZW1wb2xpY3kuYy0yMjkzLVxuLS1cbm1tL21lbXBvbGljeS5jPTI0MjI9c3RhdGljIG5vZGVtYXNrX3QgKnBvbGljeV9ub2RlbWFzayhnZnBfdCBnZnAsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0yNDU3LVx0XHQqbmlkID0gKGlseCA9PSBOT19JTlRFUkxFQVZFX0lOREVYKSA/XG5tbS9tZW1wb2xpY3kuYzoyNDU4Olx0XHRcdHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMocG9sKSA6XG5tbS9tZW1wb2xpY3kuYy0yNDU5LVx0XHRcdHdlaWdodGVkX2ludGVybGVhdmVfbmlkKHBvbCwgaWx4KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjgzNzYKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZS4uLgoKKipBbmFseXppbmcgYG1lbXBvbGljeV9zbGFiX25vZGVgIGFuZCBQb2xpY3kgSW50ZXJhY3Rpb24qKgoKUmlnaHQsIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSwgYW5kIGl0IGxvb2tzIGxpa2UgYG1lbXBvbGljeV9zbGFiX25vZGVgIGFuZCBgcG9saWN5X25vZGVtYXNrYCBhcmUgdGhlIGtleSBwbGF5ZXJzIGNhbGxpbmcgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiBJbnRlcmVzdGluZy4gTm93LCBob2xkIG9uIGEgc2Vjb25kLi4uIGlzIGBtZW1wb2xpY3lfc2xhYl9ub2RlYCBleHBvcnRlZD8gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdC4gVGhhdCYjMzk7cyBhIGNydWNpYWwgZGV0YWlsLiBJdHMgZXhwb3J0IHN0YXR1cyB3aWxsIHNpZ25pZmljYW50bHkgY2hhbmdlIGhvdyBJIG5lZWQgdG8gYXBwcm9hY2ggdGhpcyBhbmFseXNpcywgYW5kIHdoYXQgYXNzdW1wdGlvbnMgSSBjYW4gbWFrZSBhYm91dCBpdHMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIHRoZSBkZXBlbmRlbmNpZXMgaXQgbWF5IGhhdmUuIEdvdHRhIGdldCB0aGUgZnVsbCBwaWN0dXJlIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbXBvbGljeV9zbGFiX25vZGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYz0yMjUyPXN0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXG4tLVxubW0vbWVtcG9saWN5LmMtMjI3MS0gKi9cbm1tL21lbXBvbGljeS5jOjIyNzI6dW5zaWduZWQgaW50IG1lbXBvbGljeV9zbGFiX25vZGUodm9pZClcbm1tL21lbXBvbGljeS5jLTIyNzMte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODY3NgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiAqKkNoZWNraW5nIGZvciBTeW1ib2wgRXhwb3J0KiouCgpJIG5lZWQgdG8gY29uZmlybSBpZiB0aGUgc3ltYm9sIGBtZW1wb2xpY3lfc2xhYl9ub2RlYCBpcyBhY3R1YWxseSBleHBvcnRlZC4gVGhpcyBpcyBhIGNydWNpYWwgc3RlcCBiZWZvcmUgSSBjb25zaWRlciB1c2luZyBpdC4gSSYjMzk7bSBsaWtlbHkgdHJ5aW5nIHRvIHVzZSBpdCBpbiBzb21lIGNvbnRleHQgd2hlcmUgSSBuZWVkIGl0IHRvIGJlIHB1YmxpY2x5IGFjY2Vzc2libGUsIHBlcmhhcHMgaW4gYSBtb2R1bGUgSSYjMzk7bSBkZXZlbG9waW5nLCBvciBpbiBhIHBhdGNoLiBLbm93aW5nIGlmIGl0JiMzOTtzIGV4cG9ydGVkIGluZm9ybXMgbWUgb24gdGhlIGludGVuZGVkIHB1YmxpYyBBUEkgb2YgdGhlIGtlcm5lbCwgYW5kIGlmIGl0JiMzOTtzIHNhZmUgdG8gdXNlIHRoZSBzeW1ib2wgb3Igbm90LiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBzeW1ib2wgdGFibGUgZGlyZWN0bHksIG9yIHBlcmhhcHMgdXNlIGEgdG9vbCB0byB2ZXJpZnkgaXRzIGV4cG9ydCBzdGF0dXMuIFRoaXMgaXMgYSBmdW5kYW1lbnRhbCBwcmVsaW1pbmFyeSBzdGVwIEkgYWx3YXlzIHRha2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RVhQT1JUX1NZTUJPTC4qbWVtcG9saWN5X3NsYWJfbm9kZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg4ODgKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA1NTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBBUEkgRW50cnlwb2ludHMgYW5kIFJlbGF0ZWQgRnVuY3Rpb25zKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIGhvdyBzbGFiIGFsbG9jYXRpb24gaW50ZXJmYWNlcyB3aXRoIHRoZSBzeXN0ZW0sIGFuZCBJJiMzOTt2ZSBoaXQgYSBwb3RlbnRpYWwgZW50cnlwb2ludCB0aGF0IGlzbiYjMzk7dCBkaXJlY3RseSBleHBvcnRlZC4gVGhhdCYjMzk7cyBhIGZsYWcsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB3aWRlciBsYW5kc2NhcGUuIFRoZSBmb2N1cyBpcyBvbiBwYWNrYWdlIG5vZGUgbWFuaXB1bGF0aW9uLgoKSSYjMzk7dmUgYWxyZWFkeSBpZGVudGlmaWVkIHNldmVyYWwgZXhwb3J0ZWQgZnVuY3Rpb25zIHRoYXQgYXJlIGRpcmVjdGx5IHJlbGV2YW50OiBgbXBfYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcmAsIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AsIGFuZCBzbyBvbiwgYWxsIHRoZSB3YXkgdG8gYHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcmAuIFRoaXMgZ2l2ZXMgbWUgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBtYXBwaW5nIHRoZSBBUEkuCgpUaGVuIHRoZXJlIGlzIHRoYXQgY2FsbGJhY2ssIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLiBJdCYjMzk7cyBhIHN0YXRpYyBjYWxsYmFjaywgYnV0IGl0JiMzOTtzIGltcG9ydGFudCBiZWNhdXNlIGl0IGlzIHJlZ2lzdGVyZWQgdmlhIGByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYCwgc28gSSBuZWVkIHRvIGZhY3RvciBpdCBpbi4gQXJlIHRoZXJlIGFueSBvdGhlciBjYWxsYmFja3MgcmVnaXN0ZXJlZD8KCkJleW9uZCB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLCBJIGFsc28gbmVlZCB0byBjb25zaWRlciByZWxhdGVkIHN5c3RlbS1sZXZlbCBpbnRlcmZhY2VzIGxpa2UgYHBhY2thZ2VfbW9kZV9zdG9yZWAsIGBwYWNrYWdlX25vZGVzX3Nob3dgLCBhbmQgc2ltaWxhciBzeXNmcyBlbnRyaWVzIHRoYXQgYXJlIGVzc2VudGlhbCBmb3IgY29uZmlndXJhdGlvbiBhbmQgbW9uaXRvcmluZy4gVGhlc2UgZnVuY3Rpb25zIGV4cG9zZSBhZGRpdGlvbmFsIGZhY2V0cyBvZiB0aGUgcGFja2FnZSBub2RlIG1hbmFnZW1lbnQuCgpMZXQmIzM5O3MgY29uc29saWRhdGUgdGhlIGxpc3Qgb2YgZXhwb3NlZCBmdW5jdGlvbnMgZnJvbSBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vbWVtcG9saWN5LmNgIGFnYWluLCBqdXN0IHRvIGVuc3VyZSBJIGhhdmUgYSBjb21wbGV0ZSBwaWN0dXJlLiBJdCYjMzk7cyB0aGUgc2FtZSBsaXN0IGFzIGJlZm9yZTogYG1wX2FkZF9wYWNrYWdlX25vZGVgLCB0byBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYC4gQSBjbGVhbiBzdW1tYXJ5IGlzIGFsd2F5cyBlc3NlbnRpYWwuCgpMYXN0bHksIEkgbmVlZCB0byBrZWVwIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gbWluZC4gSSBrbm93IHRoZXNlIGFyZSByZWxldmFudDogYE5VTUFgLCBgTlVNQV9NSUdSQVRJT05gLCBgQ1hMX0JVU2AsIGBDWExfUkVHSU9OYCwgYW5kIGBERVZfREFYX0tNRU1gLiBJJiMzOTttIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGF0IGBERVZfREFYX0tNRU1gIGlzIGluZGVlZCB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoYXQgc2V0dGluZywganVzdCB0byBiZSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVWX0RBWF9LTUVNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9kYXgvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2RheC9LY29uZmlnPTY4PWNvbmZpZyBERVZfREFYX0ZTREVWXG4tLVxuZHJpdmVycy9kYXgvS2NvbmZpZy03Mi1cbmRyaXZlcnMvZGF4L0tjb25maWc6NzM6Y29uZmlnIERFVl9EQVhfS01FTVxuZHJpdmVycy9kYXgvS2NvbmZpZy03NC1cdHRyaXN0YXRlIFwmIzM0O0tNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTk5MgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQ4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTlVNQSBCYWxhbmNpbmcgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gSSBuZWVkIHRvIGFzc2VzcyB3aGV0aGVyIGBOVU1BX0JBTEFOQ0lOR2AgaXMgZXNzZW50aWFsIGhlcmUuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGBtcF9uZXh0X2RlbW90aW9uX25vZGVgIHVuZGVyIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBgTlVNQV9NSUdSQVRJT05gIGlzIHRoZSBjcml0aWNhbCBjb25maWd1cmF0aW9uIHRvIGZvY3VzIG9uLgoKTm93LCBsZXQmIzM5O3MgcmV2aWV3IHRoZSBjcnVjaWFsIHN5bWJvbHMuIEkmIzM5O3ZlIGdvdCB0aGlzIEpTT04gbGlzdDoKCmBgYGpzb24KWwogICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZSYjMzQ7LAogICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAmIzM0O21wX2dldF9wYWNrYWdlX25vZGVzJiMzNDssCiAgJiMzNDttcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMmIzM0OywKICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgJiMzNDttcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrJiMzNDssCiAgJiMzNDttcF9uZXh0X2RlbW90aW9uX25vZGUmIzM0OywKICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgJiMzNDttcF9uZXh0X3Byb21vdGlvbl9ub2RlJiMzNDssCiAgJiMzNDttcF9pc190b3BvbG9neV9zeW1tZXRyaWMmIzM0OywKICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAmIzM0O21wX3Byb2JlX3BhY2thZ2VfaWQmIzM0OywKICAmIzM0O3JlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXImIzM0OywKICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7Cl0KYGBgCgpBaGEhIGBtcF9hZGRfcGFja2FnZV9ub2RlYCBpcyBjYWxsZWQgZnJvbSBgY3hsX3JlZ2lvbl9hZGRfcGFja2FnZV9ub2RlYCwgd2hpY2ggaXMgYSBub3RpZmllciBjYWxsYmFjay4gQW5kIEkgc2VlIHRoYXQgYG1wX3Byb2JlX3BhY2thZ2VfaWRgIGlzIGNhbGxlZCBmcm9tIGBkZXZfZGF4X2ttZW1fcHJvYmVgLiBTbywgYm90aCBvZiB0aGVzZSBhcmUgZGVmaW5pdGVseSByZWFjaGFibGUuIE1lbW9yeSBwb2xpY3kgY2hhbmdlcyBhcmUgYWxzbyByZWFjaGFibGUgdmlhIGBzZXRfbWVtcG9saWN5YCBzeXNjYWxsIGFuZCBzeXNmcy4gTm93LCB0aGUgc3lzZnMgc3RvcmUgZnVuY3Rpb24gYHBhY2thZ2VfbW9kZV9zdG9yZWAgc2VlbXMgcmVsZXZhbnQgdG9vLgoKV2FpdCwgYHBhY2thZ2VfbW9kZV9zdG9yZWAgaXMgc3RhdGljLCBidXQgaXQmIzM5O3MgYSBzeXNmcyBjYWxsYmFjaywgbWFraW5nIGl0IGFuIGVudHJ5IHBvaW50LiBTaG91bGQgSSBsaXN0IGl0LCBvciBqdXN0IHN0aWNrIHRvIGV4cG9ydGVkIGZ1bmN0aW9ucz8gQWN0dWFsbHksIGp1c3QgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyAqYW5kKiAgYHBhY2thZ2VfbW9kZV9zdG9yZWAgaXMgdGhlIGJlc3QgYXBwcm9hY2guCgpPa2F5LCBsZXQmIzM5O3MgcmVmaW5lIHRoZSBsaXN0IG9mIHJlbGV2YW50IGtlcm5lbCBjb25maWd1cmF0aW9ucy4gSSYjMzk7bSB0aGlua2luZzoKCiogICBgTlVNQWAKKiAgIGBOVU1BX01JR1JBVElPTmAKKiAgIGBDWExfQlVTYAoqICAgYENYTF9SRUdJT05gCiogICBgREVWX0RBWF9LTUVNYAoKTm93LCBJIG5lZWQgdG8gY2hlY2sgaWYgYENYTF9SRUdJT05gIGhhcyBhbnkgZGVwZW5kZW5jaWVzIHRoYXQgY291bGQgaW1wYWN0IHRoaXMgYW5hbHlzaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDWExfUkVHSU9OJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9jeGwvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2N4bC9LY29uZmlnPTE5Mz1jb25maWcgQ1hMX1NVU1BFTkRcbi0tXG5kcml2ZXJzL2N4bC9LY29uZmlnLTE5Ni1cbmRyaXZlcnMvY3hsL0tjb25maWc6MTk3OmNvbmZpZyBDWExfUkVHSU9OXG5kcml2ZXJzL2N4bC9LY29uZmlnLTE5OC1cdGJvb2wgXCYjMzQ7Q1hMOiBSZWdpb24gU3VwcG9ydFwmIzM0O1xuLS1cbmRyaXZlcnMvY3hsL0tjb25maWctMjE0LVxuZHJpdmVycy9jeGwvS2NvbmZpZzoyMTU6Y29uZmlnIENYTF9SRUdJT05fSU5WQUxJREFUSU9OX1RFU1RcbmRyaXZlcnMvY3hsL0tjb25maWctMjE2LVx0Ym9vbCBcJiMzNDtDWEw6IFJlZ2lvbiBDYWNoZSBNYW5hZ2VtZW50IEJ5cGFzcyAoVEVTVClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzExODUKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgYGRyaXZlcnMvY3hsL0tjb25maWdgIGZpbGUsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiB0aGUgYENYTF9SRUdJT05gIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgoKKipEaXZpbmcgaW50byBDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBkcml2ZXJzL2N4bC9LY29uZmlnYC4gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBjb25maWd1cmF0aW9uIGZvciBDWEwgZGV2aWNlcyBhbmQgdGhlaXIgbWVtb3J5IHJlZ2lvbnMgaXMgaGFuZGxlZCwgbmF0dXJhbGx5LiBNeSBhdHRlbnRpb24gaXMgZHJhd24gdG8gYENYTF9SRUdJT05gLiBJdCYjMzk7cyBhIGtleSBjb25maWd1cmF0aW9uIHN5bWJvbCwgZGVmaW5pdGVseSBhIHN0YXJ0aW5nIHBvaW50IHRvIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBrZXJuZWwgZGVhbHMgd2l0aCBDWEwmIzM5O3MgbWVtb3J5IGFyY2hpdGVjdHVyZS4gSSBhc3N1bWUgdGhpcyB3aWxsIGFmZmVjdCBob3cgdGhlIGRyaXZlciBlbmFibGVzLCBhbmQgY29uZmlndXJlcywgdGhlIGhhcmR3YXJlIGZ1bmN0aW9uYWxpdHkuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGUgb3RoZXIgb3B0aW9ucyBhcm91bmQgaXQgcmVsYXRlLiBBcmUgdGhlcmUgZGVwZW5kZW5jaWVzPyBBbnkgcmVsYXRlZCBkZWZhdWx0cz8gQXJlIHRoZXJlIGFueSBzdWItb3B0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gdG8gY29uZmlndXJlIHRoZSB0eXBlIG9mIHJlZ2lvbj8gT3IgcGVyaGFwcyB0aGUgc2l6ZT8KSSYjMzk7bGwgYWxzbyBoYXZlIHRvIHNlZSBob3cgdGhpcyBzeW1ib2wgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSByZXN0IG9mIHRoZSBDWEwgZHJpdmVyIGNvZGUuIFdoZXJlIGlzIGl0IGNoZWNrZWQ/IFdoYXQgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgZGVwZW5kIG9uIGl0PyBJJiMzOTttIGV4cGVjdGluZyB0aGlzIG9wdGlvbiB0byBlbmFibGUgc3VwcG9ydCBmb3IgYWxsb2NhdGluZyBhbmQgbWFuYWdpbmcgQ1hMIG1lbW9yeSByZWdpb25zLCB3aGljaCBpcyBmb3VuZGF0aW9uYWwgdG8gbWFraW5nIENYTCBkZXZpY2VzIGFjdHVhbGx5IHVzZWZ1bCBpbiB0aGUgc3lzdGVtLgpFc3NlbnRpYWxseSwgSSYjMzk7bSBleHBlY3RpbmcgYENYTF9SRUdJT05gIHRvIGJlIGEgZ2F0ZWtlZXBlciAtIGlmIGl0JiMzOTtzIG5vdCBlbmFibGVkLCBhIGxvdCBvZiB0aGUgQ1hMIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgd2lsbCBsaWtlbHkgYmUgZGlzYWJsZWQgYXMgd2VsbC4gVGltZSB0byBzdGFydCBkaWdnaW5nIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvY3hsL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE5MDpcdFx0ZGVmYXVsdCBDWExfQlVTXG4gMTkxOlx0XHR0cmlzdGF0ZVxuIDE5MjpcdFxuIDE5MzpcdGNvbmZpZyBDWExfU1VTUEVORFxuIDE5NDpcdFx0ZGVmX2Jvb2wgeVxuIDE5NTpcdFx0ZGVwZW5kcyBvbiBTVVNQRU5EIFx1MDAyNlx1MDAyNiBDWExfTUVNXG4gMTk2Olx0XG4gMTk3Olx0Y29uZmlnIENYTF9SRUdJT05cbiAxOTg6XHRcdGJvb2wgXCYjMzQ7Q1hMOiBSZWdpb24gU3VwcG9ydFwmIzM0O1xuIDE5OTpcdFx0ZGVmYXVsdCBDWExfQlVTXG4gMjAwOlx0XHQjIEZvciBNQVhfUEhZU01FTV9CSVRTXG4gMjAxOlx0XHRkZXBlbmRzIG9uIFNQQVJTRU1FTVxuIDIwMjpcdFx0c2VsZWN0IE1FTVJFR0lPTlxuIDIwMzpcdFx0c2VsZWN0IEdFVF9GUkVFX1JFR0lPTlxuIDIwNDpcdFx0aGVscFxuIDIwNTpcdFx0ICBFbmFibGUgdGhlIENYTCBjb3JlIHRvIGVudW1lcmF0ZSBhbmQgcHJvdmlzaW9uIENYTCByZWdpb25zLiBBIENYTFxuIDIwNjpcdFx0ICByZWdpb24gaXMgZGVmaW5lZCBieSBvbmUgb3IgbW9yZSBDWEwgZXhwYW5kZXJzIHRoYXQgZGVjb2RlIGEgZ2l2ZW5cbiAyMDc6XHRcdCAgc3lzdGVtLXBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UuIEZvciBDWEwgcmVnaW9ucyBlc3RhYmxpc2hlZCBieVxuIDIwODpcdFx0ICBwbGF0Zm9ybS1maXJtd2FyZSB0aGlzIG9wdGlvbiBlbmFibGVzIG1lbW9yeSBlcnJvciBoYW5kbGluZyB0b1xuIDIwOTpcdFx0ICBpZGVudGlmeSB0aGUgZGV2aWNlcyBwYXJ0aWNpcGF0aW5nIGluIGEgZ2l2ZW4gaW50ZXJsZWF2ZWQgbWVtb3J5XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxODIzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgZGVwZW5kZW5jaWVzLCBleHBsYWluZWQgYXMgaWYgdGhleSBhcmUgbXkgb3duIHRob3VnaHRzOgoKKipEaXNzZWN0aW5nIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSBhIGtlcm5lbCBjb25maWd1cmF0aW9uIHBlcnNwZWN0aXZlLCBpdCYjMzk7cyBjbGVhciB0aGF0IHRoZSBtb2R1bGUgb3IgZmVhdHVyZSBmbGFnZ2VkIGFzIGBDWExfUkVHSU9OYCBpcyBmdW5kYW1lbnRhbGx5IHJlbGlhbnQgb24gdGhlIGZvdW5kYXRpb24gcHJvdmlkZWQgYnkgYFNQQVJTRU1FTWAuIFlvdSBjYW4mIzM5O3QgaGF2ZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuIEl0JiMzOTtzIGxpa2UgYnVpbGRpbmcgYSBjb21wbGV4IHN0cnVjdHVyZSDigJMgeW91IG5lZWQgYSBzb2xpZCBiYXNlIGJlZm9yZSB5b3UgY2FuIHN0YXJ0IGxheWVyaW5nIG9uIHRoZSBtb3JlIHNwZWNpYWxpemVkIGNvbXBvbmVudHMuIFNwYXJzZW1lbSBwcm92aWRlcyB0aGF0IGJhc2UgYW5kIGlzIGludGVncmFsLgoKU2ltaWxhcmx5LCBJJiMzOTttIG5vdGluZyB0aGF0IHRoZSBgREVWX0RBWF9LTUVNYCBvcHRpb24gaGFzIGEgZGlyZWN0IGRlcGVuZGVuY3kgb24gYERFVl9EQVhgLiBUaGlzIG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGBERVZfREFYX0tNRU1gIGlzIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb3IgZmVhdHVyZSB0aGF0IGxldmVyYWdlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGBERVZfREFYYC4gVGhpbmsgb2YgYERFVl9EQVhgIGFzIHRoZSBnZW5lcmFsIGZyYW1ld29yaywgYW5kIGBERVZfREFYX0tNRU1gIGFzIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvciBleHRlbnNpb24gd2l0aGluIHRoYXQgZnJhbWV3b3JrLiBZb3Ugd291bGRuJiMzOTt0IGF0dGVtcHQgdG8gdXNlIHRoZSBleHRlbnNpb24gd2l0aG91dCB0aGUgYmFzZSBmcmFtZXdvcmsgZXhpc3RpbmcuIFRoaXMgbW9kdWxhciBhcHByb2FjaCBpcyBjb21tb24gZm9yIGtlZXBpbmcgYSBsZWFuIGFuZCBleHRlbnNpYmxlIGtlcm5lbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL2RheC9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA2NTpcdFx0ZGVwZW5kcyBvbiBERVZfREFYX0hNRU0gXHUwMDI2XHUwMDI2IERBWFxuICA2NjpcdFx0ZGVmX2Jvb2wgeVxuICA2NzpcdFxuICA2ODpcdGNvbmZpZyBERVZfREFYX0ZTREVWXG4gIDY5Olx0XHR0cmlzdGF0ZVxuICA3MDpcdFx0ZGVwZW5kcyBvbiBERVZfREFYIFx1MDAyNlx1MDAyNiBGU19EQVhcbiAgNzE6XHRcdGRlZmF1bHQgREVWX0RBWFxuICA3MjpcdFxuICA3MzpcdGNvbmZpZyBERVZfREFYX0tNRU1cbiAgNzQ6XHRcdHRyaXN0YXRlIFwmIzM0O0tNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVwmIzM0O1xuICA3NTpcdFx0ZGVmYXVsdCBERVZfREFYXG4gIDc2Olx0XHRkZXBlbmRzIG9uIERFVl9EQVhcbiAgNzc6XHRcdGRlcGVuZHMgb24gTUVNT1JZX0hPVFBMVUcgIyBmb3IgYWRkX21lbW9yeSgpIGFuZCBmcmllbmRzXG4gIDc4Olx0XHRoZWxwXG4gIDc5Olx0XHQgIFN1cHBvcnQgYWNjZXNzIHRvIHBlcnNpc3RlbnQsIG9yIG90aGVyIHBlcmZvcm1hbmNlXG4gIDgwOlx0XHQgIGRpZmZlcmVudGlhdGVkIG1lbW9yeSBhcyBpZiBpdCB3ZXJlIFN5c3RlbSBSQU0uIFRoaXMgYWxsb3dzXG4gIDgxOlx0XHQgIGVhc2llciB1c2Ugb2YgcGVyc2lzdGVudCBtZW1vcnkgYnkgdW5tb2RpZmllZCBhcHBsaWNhdGlvbnMsIG9yXG4gIDgyOlx0XHQgIGFkZHMgY29yZSBrZXJuZWwgbWVtb3J5IHNlcnZpY2VzIHRvIGhldGVyb2dlbmVvdXMgbWVtb3J5IHR5cGVzXG4gIDgzOlx0XHQgIChITUVNKSBtYXJrZWQgXCYjMzQ7cmVzZXJ2ZWRcJiMzNDsgYnkgcGxhdGZvcm0gZmlybXdhcmUuXG4gIDg0Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyNDIzCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMTA4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uOiBOZWNlc3NhcnkgRmVhdHVyZXMqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgYmFzZWQgb24gdGhpcywgSSBhYnNvbHV0ZWx5IG5lZWQgYERFVl9EQVhgIGFuZCBgTUVNT1JZX0hPVFBMVUdgIGVuYWJsZWQuIE5vIHF1ZXN0aW9uIGFib3V0IGl0LiBMZXQgbWUganVzdCBhZGQgYERFVl9EQVhgIHRvIHRoZSBjaGVja2xpc3QgSSYjMzk7bSBtZW50YWxseSBhc3NlbWJsaW5nLgoKUmlnaHQsIHNvIHRvIG1ha2Ugc3VyZSBJJiMzOTttIGNsZWFyIGluIG15IGhlYWQsIHRoZSBlc3NlbnRpYWwga2VybmVsIGNvbmZpZ3VyYXRpb25zIGludm9sdmVkIGhlcmUgYXJlOgoKKiAgIGBOVU1BYAoqICAgYE5VTUFfTUlHUkFUSU9OYAoqICAgYENYTF9CVVNgCiogICBgQ1hMX1JFR0lPTmAKKiAgIGBERVZfREFYYCAoZGVmaW5pdGVseSBuZWVkZWQpCiogICBgREVWX0RBWF9LTUVNYAoqICAgYE1FTU9SWV9IT1RQTFVHYCAoVGhhdCYjMzk7cyBhbm90aGVyIGNydWNpYWwgb25lIHRvIGNvbmZpcm0uKQoKTm93LCBJIHNob3VsZCB0YWtlIGEgbG9vayBhdCB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEkmIzM5O20gZ29pbmcgdG8gZG91YmxlLWNoZWNrIHRoZSBpbXBsaWNhdGlvbnMgb2YgYE1FTU9SWV9IT1RQTFVHYCBpbiByZWxhdGlvbiB0byB0aGlzIHdob2xlIHNldHVwLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgb3RoZXIgb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIE1FTU9SWV9IT1RQTFVHJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTQ2Nj1jb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcbi0tXG5tbS9LY29uZmlnLTQ2OS0jIGV2ZW50dWFsbHksIHdlIGNhbiBoYXZlIHRoaXMgb3B0aW9uIGp1c3QgJiMzOTtzZWxlY3QgU1BBUlNFTUVNJiMzOTtcbm1tL0tjb25maWc6NDcwOm1lbnVjb25maWcgTUVNT1JZX0hPVFBMVUdcbm1tL0tjb25maWctNDcxLVx0Ym9vbCBcJiMzNDtNZW1vcnkgaG90cGx1Z1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMjg4MwoJCQkJCQkJb3V0cHV0OiAyOTcKCQkJCQkJCXRob3VnaHRzOiAyNjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgTWVtb3J5IFBhY2thZ2UgRnVuY3Rpb25hbGl0eSoqCgpPa2F5LCBzbyBgTUVNT1JZX0hPVFBMVUdgIGlzIGNvbmZpcm1lZCwgdGhhdCYjMzk7cyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhlc2UgY29yZSBzeW1ib2xzLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHdoYXQmIzM5O3MgYmVpbmcgZXhwb3NlZCwgYmVjYXVzZSB0aGF0JiMzOTtzIHdoZXJlIHRoZSBpbnRlcmVzdGluZyBhdHRhY2sgc3VyZmFjZSBsaWtlbHkgbGllcy4KCkkgc2VlIGEgY29uY2VudHJhdGVkIHNldCBvZiBzeW1ib2xzIGhlcmUgdGhhdCBjb25zdGl0dXRlIHRoZSBuZXcgbWVtb3J5IHBhY2thZ2UgZnVuY3Rpb25hbGl0eToKCiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcmA6IENsZWFybHksIHRoZXNlIGFyZSBmb3IgYWRkaW5nIG5vZGVzIHRvIHRoZSBtZW1vcnkgcGFja2FnZSB0b3BvbG9neSwgcG90ZW50aWFsbHkgZHluYW1pY2FsbHksIGJhc2VkIG9uIGFuIGluaXRpYXRvci4KKiAgIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AsIGBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNgLCBgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNgOiBUaGVzZSBhcmUgdGhlIGFjY2VzcyBtZXRob2RzIHRvIGdldCB0aGUgbGlzdCBvZiB0aGUgcGFja2FnZSYjMzk7cyBub2RlcywgZGlmZmVyZW50aWF0ZWQgYnkgdHlwZS4KKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfZGVtb3Rpb25fbm9kZWAsIGBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFza2AsIGBtcF9uZXh0X3Byb21vdGlvbl9ub2RlYDogVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nIGZyb20gYSB0aWVyaW5nIHBlcnNwZWN0aXZlLCBlc3BlY2lhbGx5IGFyb3VuZCB0aGUgbWFza3MuCiogICBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYDogQ2hlY2tpbmcgZm9yIHRvcG9sb2dpY2FsIHN5bW1ldHJ5IGlzIGNydWNpYWwuIFRoaXMgY291bGQgYmUgYSB2ZWN0b3IuCiogICBgbmVhcmVzdF9ub2Rlc19ub2RlbWFza2A6IERldGVybWluaW5nIHByb3hpbWl0eSBpcyBjcml0aWNhbCBmb3IgTlVNQS4KKiAgIGBtcF9wcm9iZV9wYWNrYWdlX2lkYDogQSBwcm9iaW5nIGZ1bmN0aW9uIGFkZHMgYW4gZWxlbWVudCBvZiByaXNrLgoqICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgLCBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYDogVGhlIHVzZSBvZiBub3RpZmllcnMgY2FuIGNyZWF0ZSB2dWxuZXJhYmlsaXRpZXMgaW4gY29uY3VycmVudCBhY2Nlc3MuCgpUaGVzZSBhcmUgYWxsIGV4cG9ydGVkLCBtZWFuaW5nIHRoZXkmIzM5O3JlIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiBUaGlzIHRlbGxzIG1lIHdlJiMzOTtyZSBsb29raW5nIGF0IHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgdGhpcyBuZXcgbWVtb3J5IHBhY2thZ2UgZnVuY3Rpb25hbGl0eSwgd2hpY2gsIGZyb20gd2hhdCBJJiMzOTttIHJlYWRpbmcsIGlzIGFsdGVyaW5nIGNvcmUgbWVtb3J5IHRpZXJpbmcsIG1lbXBvbGljeSwgYW5kIGhvdyBDWEwgcmVnaW9ucyBhcmUgaGFuZGxlZC4gUGx1cywgdGhlcmUgYXJlIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyB3ZWlnaHRlZCBpbnRlcmxlYXZlIG1lbXBvbGljeSBtb2RlLiBBbGwgb2YgdGhpcyB1c2VyLXNwYWNlIGFjY2Vzc2libGUgc3R1ZmY/IFRoaXMgc2NyZWFtcyBmb3IgZnV6emluZy4gV2UmIzM5O3ZlIGdvdCBpbnRlcmZhY2VzIGZvciBhZGRpbmcsIHF1ZXJ5aW5nLCBhbmQgbWFuaXB1bGF0aW5nIHRoZSBtZW1vcnkgcGFja2FnZSB0b3BvbG9neS4gSSYjMzk7bSBnb2luZyB0byBoYXZlIHRvIHRlc3QgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIHJhY2UgY29uZGl0aW9ucywgYW5kIGVycm9yIGhhbmRsaW5nIG9mIHRoZXNlIGZ1bmN0aW9ucyB2ZXJ5IGNhcmVmdWxseSwgZXNwZWNpYWxseSB3aGVuIGNvbWJpbmVkIHdpdGggdGhlc2UgbmV3IHN5c2ZzIGVudHJpZXMgYW5kIHRoZSBuZXcgbWVtcG9saWN5LgoKVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtOVU1BJiMzNDssCiAgICAmIzM0O05VTUFfTUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0NYTF9CVVMmIzM0OywKICAgICYjMzQ7Q1hMX1JFR0lPTiYjMzQ7LAogICAgJiMzNDtERVZfREFYJiMzNDssCiAgICAmIzM0O0RFVl9EQVhfS01FTSYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wX2FkZF9wYWNrYWdlX25vZGUmIzM0OywKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2Vfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzJiMzNDssCiAgICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgICAmIzM0O21wX25leHRfZGVtb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljJiMzNDssCiAgICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfcHJvYmVfcGFja2FnZV9pZCYjMzQ7LAogICAgJiMzNDtyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDssCiAgICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtOVU1BJiMzNDssCiAgICAmIzM0O05VTUFfTUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0NYTF9CVVMmIzM0OywKICAgICYjMzQ7Q1hMX1JFR0lPTiYjMzQ7LAogICAgJiMzNDtERVZfREFYJiMzNDssCiAgICAmIzM0O0RFVl9EQVhfS01FTSYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wX2FkZF9wYWNrYWdlX25vZGUmIzM0OywKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2Vfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzJiMzNDssCiAgICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgICAmIzM0O21wX25leHRfZGVtb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljJiMzNDssCiAgICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfcHJvYmVfcGFja2FnZV9pZCYjMzQ7LAogICAgJiMzNDtyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDssCiAgICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6MjcuNDc3NjQ0MjRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjg1Njc5OTcxNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTlVNQVwiLFxuICAgIFwiTlVNQV9NSUdSQVRJT05cIixcbiAgICBcIkNYTF9CVVNcIixcbiAgICBcIkNYTF9SRUdJT05cIixcbiAgICBcIkRFVl9EQVhcIixcbiAgICBcIkRFVl9EQVhfS01FTVwiLFxuICAgIFwiTUVNT1JZX0hPVFBMVUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlXCIsXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvclwiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2Vfbm9kZXNcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlc1wiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwibXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVcIixcbiAgICBcIm1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpY1wiLFxuICAgIFwibmVhcmVzdF9ub2Rlc19ub2RlbWFza1wiLFxuICAgIFwibXBfcHJvYmVfcGFja2FnZV9pZFwiLFxuICAgIFwicmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllclwiLFxuICAgIFwidW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBtZW1vcnkgcGFja2FnZSB0b3BvbG9neSBjb25jZXB0IGZvciBOVU1BIG5vZGVzLCBtb2RpZnlpbmcgY29yZSBtZW1vcnkgdGllcmluZywgbWVtcG9saWN5LCBhbmQgQ1hMIHJlZ2lvbiBoYW5kbGluZy4gSXQgYWRkcyBuZXcgc3lzZnMgaW50ZXJmYWNlcyBhbmQgYSBuZXcgbWVtcG9saWN5IHdlaWdodGVkIGludGVybGVhdmUgbW9kZSwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6MjcuNDc3NjUxNTFaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2ODM3MTg2MDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAyNWEyYTJhYWM2NDliY2FiNmY0MGMxZGM2ZmZhYTM1MTEwZWRhYjdhXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgQXVnIDYgMDg6Mjg6MjUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTAwZjllNWZmMTllXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tcGFja2FnZVxcbkBAIC0wLDAgKzEsMzUgQEBcXG4rV2hhdDpcXHRcXHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvXFxuK0RhdGU6XFx0XFx0QXVndXN0IDIwMjZcXG4rQ29udGFjdDpcXHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1xcdTAwM2VcXG4rRGVzY3JpcHRpb246XFx0TWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3lcXG4rXFxuK1xcdFxcdEEgXFxcIm1lbW9yeSBwYWNrYWdlXFxcIiBncm91cHMgdGhlIE5VTUEgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIG9uZVxcbitcXHRcXHRwaHlzaWNhbCBDUFUgcGFja2FnZSAoc29ja2V0KTogdGhlIG5vZGVzIHRoYXQgaGF2ZSBDUFVzIGFuZFxcbitcXHRcXHR0aGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTCBvciBIQk0pLlxcbitcXG4rXFx0XFx0QWxsIGF0dHJpYnV0ZXMgYXJlIHJlYWQtb25seTsgdGhlIHRvcG9sb2d5IGNhbm5vdCBiZVxcbitcXHRcXHRvdmVycmlkZGVuIGZyb20gdXNlciBzcGFjZS5cXG4rXFxuK1doYXQ6XFx0XFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXNcXG4rRGF0ZTpcXHRcXHRBdWd1c3QgMjAyNlxcbitDb250YWN0OlxcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbitEZXNjcmlwdGlvbjpcXHRBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0IGZvcm1hdFxcbitcXHRcXHQoZS5nLiBcXFwiMCwyXFxcIikuXFxuK1xcbitXaGF0OlxcdFxcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9wYWNrYWdlX2NwdV9ub2Rlc1xcbitEYXRlOlxcdFxcdEF1Z3VzdCAyMDI2XFxuK0NvbnRhY3Q6XFx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFxcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcXHUwMDNlXFxuK0Rlc2NyaXB0aW9uOlxcdFRoZSBub2RlcyB0aGF0IGhhdmUgQ1BVcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0XFxuK1xcdFxcdGZvcm1hdC5cXG4rXFxuK1doYXQ6XFx0XFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2VfbWVtX29ubHlfbm9kZXNcXG4rRGF0ZTpcXHRcXHRBdWd1c3QgMjAyNlxcbitDb250YWN0OlxcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbitEZXNjcmlwdGlvbjpcXHRUaGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTC9IQk0pIGluIHRoaXNcXG4rXFx0XFx0cGFja2FnZSwgaW4gbm9kZWxpc3QgZm9ybWF0LlxcbitcXG4rV2hhdDpcXHRcXHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGh5c2ljYWxfcGFja2FnZV9pZFxcbitEYXRlOlxcdFxcdEF1Z3VzdCAyMDI2XFxuK0NvbnRhY3Q6XFx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFxcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcXHUwMDNlXFxuK0Rlc2NyaXB0aW9uOlxcdFRoZSBwaHlzaWNhbCBwYWNrYWdlIGlkIHRoaXMgZ3JvdXAgY29ycmVzcG9uZHMgdG8sIGFzXFxuK1xcdFxcdHJlcG9ydGVkIGJ5IENQVSB0b3BvbG9neS5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmUgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxcbmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcXG4rKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxcbkBAIC01MiwzICs1MiwyMCBAQCBEZXNjcmlwdGlvbjpcXHRBdXRvLXdlaWdodGluZyBjb25maWd1cmF0aW9uIGludGVyZmFjZVxcbiBcXG4gXFx0XFx0V3JpdGluZyBhIG5ldyB3ZWlnaHQgdG8gYSBub2RlIGRpcmVjdGx5IHZpYSB0aGUgbm9kZU4gaW50ZXJmYWNlXFxuIFxcdFxcdHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0aGUgc3lzdGVtIHRvIG1hbnVhbCBtb2RlLlxcbitcXG4rV2hhdDpcXHRcXHQvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVcXG4rRGF0ZTpcXHRcXHRBdWd1c3QgMjAyNlxcbitDb250YWN0OlxcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbitEZXNjcmlwdGlvbjpcXHRQYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgdG9nZ2xlXFxuK1xcbitcXHRcXHQndHJ1ZScgcmVzdHJpY3RzIHdlaWdodGVkIGludGVybGVhdmUgbm9kZSBzZWxlY3Rpb24gdG8gdGhlXFxuK1xcdFxcdE5VTUEgbm9kZXMgb2YgdGhlIHBhY2thZ2UgKENQVSBzb2NrZXQpIHRoZSBhbGxvY2F0aW5nIHRhc2tcXG4rXFx0XFx0aXMgcnVubmluZyBvbi4gJ2ZhbHNlJyAodGhlIGRlZmF1bHQpIHVzZXMgdGhlIGV4aXN0aW5nXFxuK1xcdFxcdHdlaWdodGVkIGludGVybGVhdmUgYmVoYXZpb3IuXFxuK1xcbitcXHRcXHRFbmFibGluZyBpcyByZWplY3RlZCB3aXRoIC1FSU5WQUwgd2hpbGUgdGhlIHBhY2thZ2UgdG9wb2xvZ3lcXG4rXFx0XFx0aXMgbm90IHN5bW1ldHJpYy5cXG4rXFxuK1xcdFxcdFdyaXRpbmcgYW55IHRydWUgdmFsdWUgc3RyaW5nIChlLmcuIFkgb3IgMSkgZW5hYmxlcyB0aGVcXG4rXFx0XFx0cmVzdHJpY3Rpb24sIGFueSBmYWxzZSB2YWx1ZSBzdHJpbmcgKGUuZy4gTiBvciAwKSBkaXNhYmxlc1xcbitcXHRcXHRpdC4gQWxsIG90aGVyIHN0cmluZ3MgcmV0dXJuIC1FSU5WQUwuXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXFxuaW5kZXggZTUwZGM3MTZkNGU4Mi4uYWY2NmUyZTA2YzYyNCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXFxuKysrIGIvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY1xcbkBAIC0yNjczLDYgKzI2NzMsNTUgQEAgc3RhdGljIGludCBjeGxfcmVnaW9uX2NhbGN1bGF0ZV9hZGlzdGFuY2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4gXFx0cmV0dXJuIE5PVElGWV9TVE9QO1xcbiB9XFxuIFxcbisvKlxcbisgKiBGaW5kIGEgTlVNQSBub2RlIHRvIGFjdCBhcyB0aGUgaW5pdGlhdG9yIGZvciB0aGlzIHJlZ2lvbjogc2NhbiB0aGVcXG4rICogcmVnaW9uJ3MgZW5kcG9pbnQgdGFyZ2V0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCByZXNvbHZlcyB0byBhXFxuKyAqIHZhbGlkIE5VTUEgbm9kZS5cXG4rICovXFxuK3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hscilcXG4re1xcbitcXHRzdHJ1Y3QgY3hsX3JlZ2lvbl9wYXJhbXMgKnAgPSBcXHUwMDI2Y3hsci1cXHUwMDNlcGFyYW1zO1xcbitcXHRzdHJ1Y3QgY3hsX2VuZHBvaW50X2RlY29kZXIgKmN4bGVkID0gTlVMTDtcXG4rXFx0c3RydWN0IGN4bF9tZW1kZXYgKmN4bG1kID0gTlVMTDtcXG4rXFx0aW50IGksIG51bWFfbm9kZTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBwLVxcdTAwM2Vucl90YXJnZXRzOyBpKyspIHtcXG4rXFx0XFx0Y3hsZWQgPSBwLVxcdTAwM2V0YXJnZXRzW2ldO1xcbitcXHRcXHRjeGxtZCA9IGN4bGVkX3RvX21lbWRldihjeGxlZCk7XFxuK1xcdFxcdG51bWFfbm9kZSA9IGRldl90b19ub2RlKFxcdTAwMjZjeGxtZC1cXHUwMDNlZGV2KTtcXG4rXFx0XFx0aWYgKG51bWFfbm9kZSAhPSBOVU1BX05PX05PREUpXFxuK1xcdFxcdFxcdHJldHVybiBudW1hX25vZGU7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4rfVxcbitcXG4rLypcXG4rICogUGFja2FnZSBub3RpZmllciBjYWxsYmFjazogd2hlbiBhIG5ldyBtZW1vcnkgbm9kZSBpcyBvbmxpbmVkIHZpYSBkYXhcXG4rICoga21lbSwgYmluZCB0aGUgbm9kZSB0aGlzIENYTCByZWdpb24gYmFja3MgdG8gaXRzIG1lbW9yeSBwYWNrYWdlLCB1c2luZ1xcbisgKiB0aGUgbmVhcmVzdCByZWdpb24gdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IuIE5vdGlmaWNhdGlvbnMgZm9yIG90aGVyXFxuKyAqIG5vZGVzIGFyZSBpZ25vcmVkLlxcbisgKi9cXG4rc3RhdGljIGludCBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgZGF4X25pZCwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRpbnQgcmVnaW9uX25pZCwgbmVhcmVzdF9uaWQsIHJldDtcXG4rXFx0c3RydWN0IGN4bF9yZWdpb24gKmN4bHIgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBjeGxfcmVnaW9uLCBwYWNrYWdlX25vdGlmaWVyKTtcXG4rXFxuK1xcdHJlZ2lvbl9uaWQgPSBwaHlzX3RvX3RhcmdldF9ub2RlKGN4bHItXFx1MDAzZXBhcmFtcy5yZXMtXFx1MDAzZXN0YXJ0KTtcXG4rXFx0aWYgKHJlZ2lvbl9uaWQgIT0gZGF4X25pZClcXG4rXFx0XFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbitcXG4rXFx0bmVhcmVzdF9uaWQgPSBjeGxfcmVnaW9uX2ZpbmRfbmVhcmVzdF9ub2RlKGN4bHIpO1xcbitcXHRpZiAobmVhcmVzdF9uaWQgPT0gTlVNQV9OT19OT0RFKVxcbitcXHRcXHRyZXR1cm4gTk9USUZZX0RPTkU7XFxuK1xcbitcXHRyZXQgPSBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihkYXhfbmlkLCBuZWFyZXN0X25pZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiBOT1RJRllfRE9ORTtcXG4rXFxuK1xcdHJldHVybiBOT1RJRllfT0s7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBkZXZtX2N4bF9hZGRfcmVnaW9uIC0gQWRkcyBhIHJlZ2lvbiB0byBhIGRlY29kZXJcXG4gICogQGN4bHJkOiByb290IGRlY29kZXJcXG5AQCAtMzg1Miw2ICszOTAxLDcgQEAgc3RhdGljIHZvaWQgc2h1dGRvd25fbm90aWZpZXJzKHZvaWQgKl9jeGxyKVxcbiBcXG4gXFx0dW5yZWdpc3Rlcl9ub2RlX25vdGlmaWVyKFxcdTAwMjZjeGxyLVxcdTAwM2Vub2RlX25vdGlmaWVyKTtcXG4gXFx0dW5yZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKFxcdTAwMjZjeGxyLVxcdTAwM2VhZGlzdF9ub3RpZmllcik7XFxuK1xcdHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihcXHUwMDI2Y3hsci1cXHUwMDNlcGFja2FnZV9ub3RpZmllcik7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHJlbW92ZV9kZWJ1Z2ZzKHZvaWQgKmRlbnRyeSlcXG5AQCAtNDA2Niw2ICs0MTE2LDEwIEBAIHN0YXRpYyBpbnQgY3hsX3JlZ2lvbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuIFxcdGN4bHItXFx1MDAzZWFkaXN0X25vdGlmaWVyLnByaW9yaXR5ID0gMTAwO1xcbiBcXHRyZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKFxcdTAwMjZjeGxyLVxcdTAwM2VhZGlzdF9ub3RpZmllcik7XFxuIFxcbitcXHRjeGxyLVxcdTAwM2VwYWNrYWdlX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGU7XFxuK1xcdGN4bHItXFx1MDAzZXBhY2thZ2Vfbm90aWZpZXIucHJpb3JpdHkgPSAxMDA7XFxuK1xcdHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXFx1MDAyNmN4bHItXFx1MDAzZXBhY2thZ2Vfbm90aWZpZXIpO1xcbitcXG4gXFx0cmMgPSBkZXZtX2FkZF9hY3Rpb25fb3JfcmVzZXQoXFx1MDAyNmN4bHItXFx1MDAzZWRldiwgc2h1dGRvd25fbm90aWZpZXJzLCBjeGxyKTtcXG4gXFx0aWYgKHJjKVxcbiBcXHRcXHRyZXR1cm4gcmM7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2N4bC5oIGIvZHJpdmVycy9jeGwvY3hsLmhcXG5pbmRleCAxMjk3NTk0YmVhZWMzLi45MjgxY2EzYTVmMGY4IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvY3hsL2N4bC5oXFxuKysrIGIvZHJpdmVycy9jeGwvY3hsLmhcXG5AQCAtNDc3LDYgKzQ3Nyw3IEBAIHN0cnVjdCBjeGxfcmVnaW9uIHtcXG4gXFx0c3RydWN0IGFjY2Vzc19jb29yZGluYXRlIGNvb3JkW0FDQ0VTU19DT09SRElOQVRFX01BWF07XFxuIFxcdHN0cnVjdCBub3RpZmllcl9ibG9jayBub2RlX25vdGlmaWVyO1xcbiBcXHRzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWRpc3Rfbm90aWZpZXI7XFxuK1xcdHN0cnVjdCBub3RpZmllcl9ibG9jayBwYWNrYWdlX25vdGlmaWVyO1xcbiB9O1xcbiBcXG4gc3RydWN0IGN4bF9udmRpbW1fYnJpZGdlIHtcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgva21lbS5jIGIvZHJpdmVycy9kYXgva21lbS5jXFxuaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL2RheC9rbWVtLmNcXG4rKysgYi9kcml2ZXJzL2RheC9rbWVtLmNcXG5AQCAtOTQsNiArOTQsOSBAQCBzdGF0aWMgaW50IGRldl9kYXhfa21lbV9wcm9iZShzdHJ1Y3QgZGV2X2RheCAqZGV2X2RheClcXG4gXFx0aWYgKElTX0VSUihtdHlwZSkpXFxuIFxcdFxcdHJldHVybiBQVFJfRVJSKG10eXBlKTtcXG4gXFxuK1xcdC8qIFJlc29sdmUgdGhlIG1lbW9yeSBwYWNrYWdlIGZvciB0aGlzIG5ld2x5IG9ubGluZWQga21lbSBub2RlLiAqL1xcbitcXHRtcF9wcm9iZV9wYWNrYWdlX2lkKG51bWFfbm9kZSk7XFxuK1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZGV2X2RheC1cXHUwMDNlbnJfcmFuZ2U7IGkrKykge1xcbiBcXHRcXHRzdHJ1Y3QgcmFuZ2UgcmFuZ2U7XFxuIFxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaFxcbmluZGV4IDc5OTljNTg2MjllZWIuLmY4Nzc4YzQzNDI5ZmIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmhcXG5AQCAtNTIsMTAgKzUyLDI1IEBAIGludCBtdF9wZXJmX3RvX2FkaXN0YW5jZShzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgKnBlcmYsIGludCAqYWRpc3QpO1xcbiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xcbiB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcXG4rXFxuK2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpO1xcbit2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcXG4raW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZCk7XFxuK2ludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCk7XFxuK2ludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpO1xcbitpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcXG4raW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xcbitpbnQgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcXG4rYm9vbCBtcF9pc190b3BvbG9neV9zeW1tZXRyaWModm9pZCk7XFxuICNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG4gaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTtcXG4gdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cyk7XFxuIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcXG4rXFxuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XFxuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCk7XFxuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xcbitpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKTtcXG4gI2Vsc2VcXG4gc3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuIHtcXG5AQCAtNzEsNiArODYsMzAgQEAgc3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSlcXG4ge1xcbiBcXHRyZXR1cm4gdHJ1ZTtcXG4gfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4rfVxcbiAjZW5kaWZcXG4gXFxuICNlbHNlXFxuQEAgLTE1MSw1ICsxOTAsNzkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCxcXG4gc3RhdGljIGlubGluZSB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKVxcbiB7XFxuIH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcilcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gTk9USUZZX0RPTkU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAob3V0KVxcbitcXHRcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFx0cmV0dXJuIC1FTk9FTlQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAob3V0KVxcbitcXHRcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFx0cmV0dXJuIC1FTk9FTlQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZShpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiBOVU1BX05PX05PREU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAob3V0KVxcbitcXHRcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFx0cmV0dXJuIC1FTk9FTlQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbit9XFxuICNlbmRpZlxcdC8qIENPTkZJR19OVU1BICovXFxuICNlbmRpZiAgLyogX0xJTlVYX01FTU9SWV9USUVSU19IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnVtYS5oIGIvaW5jbHVkZS9saW51eC9udW1hLmhcXG5pbmRleCBlNmJhYWY2MDUxYmNmLi40ZjJhMGMzNDQxMjJhIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvbnVtYS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9udW1hLmhcXG5AQCAtMzMsNiArMzMsOCBAQCBpbnQgbnVtYV9uZWFyZXN0X25vZGUoaW50IG5vZGUsIHVuc2lnbmVkIGludCBzdGF0ZSk7XFxuIFxcbiBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKTtcXG4gXFxuK2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpO1xcbitcXG4gI2lmbmRlZiBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZFxcbiBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KTtcXG4gI2VuZGlmXFxuQEAgLTU0LDYgKzU2LDE1IEBAIHN0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzaylcXG4gXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSBpbnQgbmVhcmVzdF9ub2Rlc19ub2RlbWFzayhpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqbWFzayxcXG4rXFx0XFx0XFx0XFx0XFx0IG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAoIW91dClcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdG5vZGVzX2NsZWFyKCpvdXQpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gc3RhdGljIGlubGluZSBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KVxcbiB7XFxuIFxcdHJldHVybiAwO1xcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnktdGllcnMuYyBiL21tL21lbW9yeS10aWVycy5jXFxuaW5kZXggNTQ4NTFkOGExOTViMC4uNTkzMmRmMzE1NjA0YSAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xcbisrKyBiL21tL21lbW9yeS10aWVycy5jXFxuQEAgLTEsNCArMSw1IEBAXFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jbGVhbnVwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9sb2NrZGVwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zeXNmcy5oXFx1MDAzZVxcbkBAIC01MSw2ICs1MiwxMSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ1c190eXBlIG1lbW9yeV90aWVyX3N1YnN5cyA9IHtcXG4gXFx0LmRldl9uYW1lID0gXFxcIm1lbW9yeV90aWVyXFxcIixcXG4gfTtcXG4gXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgcGFja2FnZV9zdWJzeXMgPSB7XFxuK1xcdC5uYW1lID0gXFxcInBhY2thZ2VcXFwiLFxcbitcXHQuZGV2X25hbWUgPSBcXFwicGFja2FnZVxcXCIsXFxuK307XFxuK1xcbiAjaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxuIC8qKlxcbiAgKiBmb2xpb191c2VfYWNjZXNzX3RpbWUgLSBjaGVjayBpZiBhIGZvbGlvIHJldXNlcyBjcHVwaWQgZm9yIHBhZ2UgYWNjZXNzIHRpbWVcXG5AQCAtMTAwNywzICsxMDEzLDEwMDYgQEAgc3RhdGljIGludCBfX2luaXQgbnVtYV9pbml0X3N5c2ZzKHZvaWQpXFxuIHN1YnN5c19pbml0Y2FsbChudW1hX2luaXRfc3lzZnMpO1xcbiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovXFxuICNlbmRpZlxcbitcXG4rLyoqXFxuKyAqIGVudW0gbXBfbm9kZXNfdHlwZSAtIFNlbGVjdG9yIGZvciB3aGljaCBzdWJzZXQgb2YgYSBwYWNrYWdlIHRvIHJldHVyblxcbisgKiBATVBfTk9ERVNfQUxMOiAgICAgICBBbGwgTlVNQSBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGUgcGFja2FnZS5cXG4rICogQE1QX05PREVTX0NQVTogICAgICAgT25seSBDUFUgbm9kZXMgaW4gdGhlIHBhY2thZ2UuXFxuKyAqIEBNUF9OT0RFU19NRU1fT05MWTogIE9ubHkgbWVtb3J5LW9ubHkgbm9kZXMgKGUuZy4gQ1hML0hCTSkgaW4gdGhlIHBhY2thZ2UuXFxuKyAqXFxuKyAqIFVzZWQgaW50ZXJuYWxseSB0byBjaG9vc2Ugd2hpY2ggbm9kZW1hc2sgdG8gZXhwb3NlIGZvciBhIGdpdmVuIHBhY2thZ2UuXFxuKyAqL1xcbitlbnVtIG1wX25vZGVzX3R5cGUge1xcbitcXHRNUF9OT0RFU19BTEwsXFxuK1xcdE1QX05PREVTX0NQVSxcXG4rXFx0TVBfTk9ERVNfTUVNX09OTFlcXG4rfTtcXG4rXFxuKy8qKlxcbisgKiBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgLSBQZXItcGh5c2ljYWwtcGFja2FnZSBjb250YWluZXJcXG4rICogQHBhY2thZ2VfaWQ6ICAgICAgICAgIFBoeXNpY2FsIHBhY2thZ2UgaWQgKGZyb20gdG9wb2xvZ3kpLlxcbisgKiBAbm9kZXM6ICAgICAgICAgICAgICAgTm9kZW1hc2sgb2YgYWxsIG1lbWJlciBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXFxuKyAqIEBjcHVfbm9kZXM6ICAgICAgICAgICBOb2RlbWFzayBvZiBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxcbisgKiBAbWVtb3J5X29ubHlfbm9kZXM6ICAgTm9kZW1hc2sgb2YgbWVtb3J5LW9ubHkgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxcbisgKiBAY3B1X2xpc3Q6ICAgICAgICAgICAgTGlzdCBoZWFkIG9mIENQVS10eXBlIG1lbWJlcnMuXFxuKyAqIEBtZW1vcnlfb25seV9saXN0OiAgICBMaXN0IGhlYWQgb2YgbWVtb3J5LW9ubHkgbWVtYmVycy5cXG4rICogQGxpc3Q6ICAgICAgICAgICAgICAgIExpbmthZ2Ugb24gdGhlIGdsb2JhbCBAbWVtb3J5X3BhY2thZ2VzIGxpc3QuXFxuKyAqIEBkZXY6ICAgICAgICAgICAgICAgICBzeXNmcyBkZXZpY2UgZm9yIHRoaXMgcGFja2FnZS5cXG4rICpcXG4rICogQSBtZW1vcnlfcGFja2FnZSBncm91cHMgTlVNQSBub2RlcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHBoeXNpY2FsIENQVSBwYWNrYWdlLlxcbisgKiBUaGUgbWFza3MgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHBhY2thZ2UtbG9jYWwgcGxhY2VtZW50L2RlbW90aW9uL3Byb21vdGlvbi5cXG4rICovXFxuK3N0cnVjdCBtZW1vcnlfcGFja2FnZSB7XFxuK1xcdGludCBwYWNrYWdlX2lkO1xcbitcXHRub2RlbWFza190IG5vZGVzO1xcbitcXHRub2RlbWFza190IGNwdV9ub2RlcztcXG4rXFx0bm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlcztcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBjcHVfbGlzdDtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBtZW1vcnlfb25seV9saXN0O1xcbitcXHRzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7XFxuK1xcdHN0cnVjdCBkZXZpY2UgZGV2O1xcbit9O1xcbitcXG4rLyoqXFxuKyAqIGVudW0gbXBuX3NvdXJjZV9mbGFncyAtIFNvdXJjZSB1c2VkIHRvIHJlc29sdmUgYSBub2RlJ3MgcGFja2FnZSBtZW1iZXJzaGlwXFxuKyAqIEBNUE5fU1JDX1VOS05PV046ICAgICBVbmtub3duL3Vuc3BlY2lmaWVkLlxcbisgKiBATVBOX1NSQ19DUFU6ICAgICAgICAgRGlyZWN0bHkgcmVzb2x2ZWQgZnJvbSBhIENQVSBub2RlICgxOjEpLlxcbisgKiBATVBOX1NSQ19JTklUSUFUT1I6ICAgUmVzb2x2ZWQgdmlhIGFuIGluaXRpYXRvciBDUFUgbm9kZSBwcm92aWRlZCBieSBhIGRyaXZlci5cXG4rICogQE1QTl9TUkNfU0xJVDogICAgICAgIFJlc29sdmVkIHZpYSBTTElUL25lYXJlc3Qtbm9kZS5cXG4rICpcXG4rICogVGhlc2UgZmxhZ3MgYXJlIGluZm9ybWF0aW9uYWw7IHRoZXkgZGVzY3JpYmUgaG93IGEgZ2l2ZW4gbm9kZSB3YXMgYm91bmQgdG9cXG4rICogaXRzIHBhY2thZ2UgYW5kIGhlbHAgd2l0aCBwb2xpY3kgZGVjaXNpb25zIGxhdGVyLlxcbisgKi9cXG4rZW51bSBtcG5fc291cmNlX2ZsYWdzIHtcXG4rXFx0TVBOX1NSQ19VTktOT1dOXFx0XFx0PSAwLFxcbitcXHRNUE5fU1JDX0NQVVxcdFxcdD0gQklUKDEpLFxcbitcXHRNUE5fU1JDX0lOSVRJQVRPUlxcdD0gQklUKDIpLFxcbitcXHRNUE5fU1JDX1NMSVRcXHRcXHQ9IEJJVCgzKVxcbit9O1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlIC0gUGVyLW5vZGUgbWVtYmVyc2hpcCBhbmQgcHJlZmVyZW5jZXNcXG4rICogQG5pZDogICAgICAgICAgICAgIE5VTUEgbm9kZSBpZCBmb3IgdGhpcyBlbnRyeS5cXG4rICogQGluaXRpYXRvcl9uaWQ6ICAgIENQVSBuaWQgdGhhdCBzZXJ2ZWQgYXMgdGhlIGluaXRpYXRvciB3aGVuIHJlc29sdmluZyBAbmlkLlxcbisgKiBAcGFja2FnZV9pZDogICAgICAgUmVzb2x2ZWQgcGFja2FnZSBpZCB0aGF0IEBuaWQgYmVsb25ncyB0by5cXG4rICogQHNvdXJjZV9mbGFnczogICAgIE9uZSBvZiBcXHUwMDI2ZW51bSBtcG5fc291cmNlX2ZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlc29sdXRpb24uXFxuKyAqIEBwcmVmZXJyZWQ6ICAgICAgICBPcHBvc2l0ZS10eXBlIG5lYXJlc3QgY2FuZGlkYXRlcyBpbnNpZGUgdGhlIHNhbWUgcGFja2FnZS5cXG4rICogQHBhY2thZ2U6ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG93bmluZyBcXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlIChOVUxMIHVudGlsIGJvdW5kKS5cXG4rICogQHBhY2thZ2VfZW50cnk6ICAgIExpbmthZ2Ugb24gdGhlIG93bmluZyBwYWNrYWdlJ3MgdHlwZSBsaXN0LlxcbisgKlxcbisgKiBFYWNoIE5VTUEgbm9kZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBwYWNrYWdlLWF3YXJlIHBvbGljeSBnZXRzIGEgd3JhcHBlciBlbnRyeVxcbisgKiB0aGF0IGNhY2hlcyBwYWNrYWdlIG1lbWJlcnNoaXAgYW5kIHRoZSBwcmVjb21wdXRlZCBzZXQgb2YgcHJlZmVycmVkIHRhcmdldHMuXFxuKyAqL1xcbitzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSB7XFxuK1xcdGludCBuaWQ7XFxuK1xcdGludCBpbml0aWF0b3JfbmlkO1xcbitcXHRpbnQgcGFja2FnZV9pZDtcXG4rXFx0aW50IHNvdXJjZV9mbGFncztcXG4rXFx0bm9kZW1hc2tfdCBwcmVmZXJyZWQ7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqcGFja2FnZTtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBwYWNrYWdlX2VudHJ5O1xcbit9O1xcbitcXG4rI2RlZmluZSBub2RlX2lzX21lbW9yeV9vbmx5KF9uaWQpIFxcXFxcXG4rXFx0KG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgXFx1MDAyNlxcdTAwMjYgIW5vZGVfc3RhdGUoKF9uaWQpLCBOX0NQVSkpXFxuK1xcbitzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChtcF9wYWNrYWdlX2FsZ29yaXRobXMpO1xcbitcXG4rc3RhdGljIExJU1RfSEVBRChtZW1vcnlfcGFja2FnZXMpO1xcbitzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbnNbTUFYX05VTU5PREVTXTtcXG4rc3RhdGljIERFRklORV9NVVRFWChtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuKy8qXFxuKyAqIFJDVSBzbmFwc2hvdCBvZiB0aGUgcGFja2FnZSB0b3BvbG9neS4gVGhlIGFsbG9jYXRpb24gcGF0aCByZWFkcyBpdFxcbisgKiBvZnRlbiwgc28gaXQgaXMgcHVibGlzaGVkIGZvciBsb2NrbGVzcyByZWFkcyBpbnN0ZWFkIG9mIGxvY2tpbmcgb25cXG4rICogZXZlcnkgYWNjZXNzLlxcbisgKi9cXG4rc3RydWN0IG1wX3NuYXBzaG90IHtcXG4rXFx0c3RydWN0IHJjdV9oZWFkIHJjdTtcXG4rXFx0aW50IG5yX3BhY2thZ2VzO1xcbitcXHRpbnQgcGtnX29mW01BWF9OVU1OT0RFU107XFxuK1xcdHN0cnVjdCB7XFxuK1xcdFxcdG5vZGVtYXNrX3Qgbm9kZXM7XFxuK1xcdFxcdG5vZGVtYXNrX3QgY3B1X25vZGVzO1xcbitcXHRcXHRub2RlbWFza190IG1lbW9yeV9vbmx5X25vZGVzO1xcbitcXHR9IHBrZ1tdO1xcbit9O1xcbitcXG4rc3RhdGljIHN0cnVjdCBtcF9zbmFwc2hvdCBfX3JjdSAqbXBfc25hcHNob3Q7XFxuK1xcbisvKipcXG4rICogcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciAtIFJlZ2lzdGVyIGEgcGFja2FnZSByZXNvbHV0aW9uIGFsZ29yaXRobVxcbisgKiBAbm90aWZpZXI6IE5vdGlmaWVyIGNhbGxlZCB3aXRoIHRoZSBuaWQgdG8gcmVzb2x2ZSAoc2VlIG1wX3Byb2JlX3BhY2thZ2VfaWQoKSkuXFxuKyAqXFxuKyAqIERyaXZlcnMgKGUuZy4sIENYTCByZWdpb24vZGVjb2RlciBjb2RlKSByZWdpc3RlciBoZXJlIHRvIHN1cHBseSBhIHBhY2thZ2VcXG4rICogaGludCBmb3IgbmV3bHkgYXBwZWFyaW5nIG5vZGVzLiBUaGUgbm90aWZpZXIgaXMgaW52b2tlZCBkdXJpbmcgbmlkLVxcdTAwM2VwYWNrYWdlXFxuKyAqIHJlc29sdXRpb24uXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxcbisgKi9cXG4raW50IHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcilcXG4re1xcbitcXHRyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoXFx1MDAyNm1wX3BhY2thZ2VfYWxnb3JpdGhtcywgbm90aWZpZXIpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpO1xcbitcXG4rLyoqXFxuKyAqIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciAtIFVucmVnaXN0ZXIgYSBwYWNrYWdlIHJlc29sdXRpb24gYWxnb3JpdGhtXFxuKyAqIEBub3RpZmllcjogTm90aWZpZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcigpLlxcbisgKi9cXG4rdm9pZCB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcilcXG4re1xcbitcXHRibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKFxcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpO1xcbitcXG4rLyoqXFxuKyAqIG1wX3Byb2JlX3BhY2thZ2VfaWQgLSBJbnZva2UgcmVnaXN0ZXJlZCBub3RpZmllcnMgdG8gcmVzb2x2ZSBhIG5vZGUncyBwYWNrYWdlXFxuKyAqIEBuaWQ6IE5VTUEgbm9kZSBpZCB0byByZXNvbHZlLlxcbisgKlxcbisgKiBDYWxscyB0aGUgYmxvY2tpbmcgbm90aWZpZXIgY2hhaW4gdG8gbGV0IHN1YnN5c3RlbXMgcHJvdmlkZSBhbiBpbml0aWF0b3Igb3JcXG4rICogcGFja2FnZSBpZCBmb3IgQG5pZC5cXG4rICpcXG4rICogUmV0dXJuOiBOb3RpZmllciByZXR1cm4gY29kZSAoXFx1MDAzZT0wIHR5cGljYWxseSk7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKFxcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5pZCwgTlVMTCk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfcHJvYmVfcGFja2FnZV9pZCk7XFxuK1xcbitzdGF0aWMgaW50IG1wX25vZGVfdG9fcGFja2FnZV9pZChpbnQgbmlkKVxcbit7XFxuK1xcdGludCBwYWNrYWdlX2lkO1xcbitcXHR1bnNpZ25lZCBpbnQgZmlyc3RfY3B1O1xcbitcXHRjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hc2s7XFxuK1xcbitcXHRpZiAobmlkIFxcdTAwM2MgMCB8fCBuaWQgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRjcHVfbWFzayA9IGNwdW1hc2tfb2Zfbm9kZShuaWQpO1xcbitcXHRpZiAoY3B1bWFza19lbXB0eShjcHVfbWFzaykpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0Zmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfbWFzayk7XFxuK1xcdGlmIChmaXJzdF9jcHUgXFx1MDAzZT0gbnJfY3B1X2lkcylcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRwYWNrYWdlX2lkID0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChmaXJzdF9jcHUpO1xcbitcXHRpZiAocGFja2FnZV9pZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0cmV0dXJuIHBhY2thZ2VfaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XFxuK1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0XFxuK1xcdCAqIG1lbW9yeS1vbmx5IG5vZGUocykgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UuIElmIHRoZSBwYWNrYWdlIGhhc1xcbitcXHQgKiBubyBtZW1vcnktb25seSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2Ugc28gY2FsbGVyc1xcbitcXHQgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC5cXG4rXFx0ICovXFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkobXBuLCBcXHUwMDI2bXAtXFx1MDAzZWNwdV9saXN0LCBwYWNrYWdlX2VudHJ5KSB7XFxuK1xcdFxcdG5vZGVzX2NsZWFyKG1wbi1cXHUwMDNlcHJlZmVycmVkKTtcXG4rXFx0XFx0aWYgKCFub2Rlc19lbXB0eShtcC1cXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKVxcbitcXHRcXHRcXHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cXHUwMDNlbmlkLCBcXHUwMDI2bXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNm1wbi1cXHUwMDNlcHJlZmVycmVkKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRub2RlX3NldChtcG4tXFx1MDAzZW5pZCwgbXBuLVxcdTAwM2VwcmVmZXJyZWQpO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTeW1tZXRyaWNhbGx5LCBmb3IgZWFjaCBtZW1vcnktb25seSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0XFxuK1xcdCAqIGFzIHRoZSBuZWFyZXN0IENQVSBub2RlKHMpIHdpdGhpbiB0aGUgc2FtZSBwYWNrYWdlLiBJZiB0aGUgcGFja2FnZVxcbitcXHQgKiBoYXMgbm8gQ1BVIG5vZGVzLCBmYWxsIGJhY2sgdG8gYSBzZWxmLXJlZmVyZW5jZS5cXG4rXFx0ICovXFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkobXBuLCBcXHUwMDI2bXAtXFx1MDAzZW1lbW9yeV9vbmx5X2xpc3QsIHBhY2thZ2VfZW50cnkpIHtcXG4rXFx0XFx0bm9kZXNfY2xlYXIobXBuLVxcdTAwM2VwcmVmZXJyZWQpO1xcbitcXHRcXHRpZiAoIW5vZGVzX2VtcHR5KG1wLVxcdTAwM2VjcHVfbm9kZXMpKVxcbitcXHRcXHRcXHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cXHUwMDNlbmlkLCBcXHUwMDI2bXAtXFx1MDAzZWNwdV9ub2RlcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZtcG4tXFx1MDAzZXByZWZlcnJlZCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0bm9kZV9zZXQobXBuLVxcdTAwM2VuaWQsIG1wbi1cXHUwMDNlcHJlZmVycmVkKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgbWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkoc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcClcXG4re1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdHJldHVybiAobm9kZXNfZW1wdHkobXAtXFx1MDAzZWNwdV9ub2RlcykgXFx1MDAyNlxcdTAwMjYgbm9kZXNfZW1wdHkobXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwYWNrYWdlX25vZGVfaXNfdmFsaWQoaW50IG5pZClcXG4re1xcbitcXHRpZiAoIW1wbnNbbmlkXSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKG5vZGVzX2VtcHR5KG1wbnNbbmlkXS1cXHUwMDNlcHJlZmVycmVkKSB8fCAobXBuc1tuaWRdLVxcdTAwM2VwYWNrYWdlID09IE5VTEwpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1lbW9yeV9wYWNrYWdlX2dyb3Vwc1tdO1xcbitcXG4rLyogRnJlZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIHBhY2thZ2UncyBzeXNmcyBkZXZpY2UgaXMgZHJvcHBlZC4gKi9cXG4rc3RhdGljIHZvaWQgbWVtb3J5X3BhY2thZ2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1vcnlfcGFja2FnZSwgZGV2KTtcXG4rXFxuK1xcdGtmcmVlKG1wKTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqY3JlYXRlX21lbW9yeV9wYWNrYWdlKGludCBwYWNrYWdlX2lkKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG1lbXBhY2thZ2UgPSBremFsbG9jX29iaigqbWVtcGFja2FnZSk7XFxuK1xcdGlmICghbWVtcGFja2FnZSlcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuK1xcbitcXHRtZW1wYWNrYWdlLVxcdTAwM2VwYWNrYWdlX2lkID0gcGFja2FnZV9pZDtcXG4rXFx0bWVtcGFja2FnZS1cXHUwMDNlbm9kZXMgPSBOT0RFX01BU0tfTk9ORTtcXG4rXFx0bWVtcGFja2FnZS1cXHUwMDNlY3B1X25vZGVzID0gTk9ERV9NQVNLX05PTkU7XFxuK1xcdG1lbXBhY2thZ2UtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzID0gTk9ERV9NQVNLX05PTkU7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtZW1wYWNrYWdlLVxcdTAwM2VjcHVfbGlzdCk7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtZW1wYWNrYWdlLVxcdTAwM2VtZW1vcnlfb25seV9saXN0KTtcXG4rXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWxpc3QpO1xcbitcXHRkZXZpY2VfaW5pdGlhbGl6ZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0bWVtcGFja2FnZS1cXHUwMDNlZGV2LnJlbGVhc2UgPSBtZW1vcnlfcGFja2FnZV9yZWxlYXNlO1xcbitcXHRkZXZfc2V0X2RydmRhdGEoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWRldiwgbWVtcGFja2FnZSk7XFxuK1xcdG1lbXBhY2thZ2UtXFx1MDAzZWRldi5idXMgPSBcXHUwMDI2cGFja2FnZV9zdWJzeXM7XFxuK1xcdG1lbXBhY2thZ2UtXFx1MDAzZWRldi5ncm91cHMgPSBtZW1vcnlfcGFja2FnZV9ncm91cHM7XFxuK1xcdHJldCA9IGRldl9zZXRfbmFtZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2LCBcXFwicGFja2FnZSVkXFxcIiwgcGFja2FnZV9pZCk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cHV0X2RldmljZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIG1lbXBhY2thZ2U7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKmZpbmRfY3JlYXRlX21lbW9yeV9wYWNrYWdlKGludCBwYWNrYWdlX2lkKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZSwgKmV4aXN0aW5nO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtcGFja2FnZSwgXFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xcbitcXHRcXHRpZiAobWVtcGFja2FnZS1cXHUwMDNlcGFja2FnZV9pZCA9PSBwYWNrYWdlX2lkKSB7XFxuK1xcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcdFxcdFxcdHJldHVybiBtZW1wYWNrYWdlO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdG1lbXBhY2thZ2UgPSBjcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7XFxuK1xcdGlmIChJU19FUlIobWVtcGFja2FnZSkpXFxuK1xcdFxcdHJldHVybiBtZW1wYWNrYWdlO1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkoZXhpc3RpbmcsIFxcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcXG4rXFx0XFx0aWYgKGV4aXN0aW5nLVxcdTAwM2VwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHtcXG4rXFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0XFx0cHV0X2RldmljZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0XFx0XFx0cmV0dXJuIGV4aXN0aW5nO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0bGlzdF9hZGQoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWxpc3QsIFxcdTAwMjZtZW1vcnlfcGFja2FnZXMpO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXG4rXFx0cmV0ID0gZGV2aWNlX2FkZChcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0bGlzdF9kZWwoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWxpc3QpO1xcbitcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRcXHRwdXRfZGV2aWNlKFxcdTAwMjZtZW1wYWNrYWdlLVxcdTAwM2VkZXYpO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUihyZXQpO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gbWVtcGFja2FnZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgbXBfc25hcHNob3RfcmVidWlsZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBtcF9zbmFwc2hvdCAqbmV3LCAqb2xkO1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wO1xcbitcXHRpbnQgbnIgPSAwLCBpID0gMCwgbmlkO1xcbitcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KVxcbitcXHRcXHRucisrO1xcbitcXG4rXFx0bmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghbmV3KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRtZW1zZXQobmV3LVxcdTAwM2Vwa2dfb2YsIDB4ZmYsIHNpemVvZihuZXctXFx1MDAzZXBrZ19vZikpO1xcbitcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShtcCwgXFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xcbitcXHRcXHRuZXctXFx1MDAzZXBrZ1tpXS5ub2RlcyA9IG1wLVxcdTAwM2Vub2RlcztcXG4rXFx0XFx0bmV3LVxcdTAwM2Vwa2dbaV0uY3B1X25vZGVzID0gbXAtXFx1MDAzZWNwdV9ub2RlcztcXG4rXFx0XFx0bmV3LVxcdTAwM2Vwa2dbaV0ubWVtb3J5X29ubHlfbm9kZXMgPSBtcC1cXHUwMDNlbWVtb3J5X29ubHlfbm9kZXM7XFxuK1xcdFxcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG1wLVxcdTAwM2Vub2RlcylcXG4rXFx0XFx0XFx0bmV3LVxcdTAwM2Vwa2dfb2ZbbmlkXSA9IGk7XFxuK1xcdFxcdGkrKztcXG4rXFx0fVxcbitcXHRuZXctXFx1MDAzZW5yX3BhY2thZ2VzID0gbnI7XFxuK1xcbitcXHRvbGQgPSByY3VfcmVwbGFjZV9wb2ludGVyKG1wX3NuYXBzaG90LCBuZXcsXFxuK1xcdFxcdFxcdFxcdCAgbG9ja2RlcF9pc19oZWxkKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKSk7XFxuK1xcdGlmIChvbGQpXFxuK1xcdFxcdGt2ZnJlZV9yY3Uob2xkLCByY3UpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGJpbmRfbm9kZV90b19wYWNrYWdlKGludCBuaWQpXFxuK3tcXG4rXFx0aW50IHBhY2thZ2VfaWQsIHBrZ19pZDtcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcXG4rXFx0bm9kZW1hc2tfdCBub2RlcywgY3B1LCBtZW07XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0aWYgKCFtcG5zW25pZF0pIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFx0cGFja2FnZV9pZCA9IG1wbnNbbmlkXS1cXHUwMDNlcGFja2FnZV9pZDtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdG1wID0gZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7XFxuK1xcdGlmIChJU19FUlIobXApKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihtcCk7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0aWYgKCFtcG5zW25pZF0pIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFx0bXBuc1tuaWRdLVxcdTAwM2VwYWNrYWdlID0gbXA7XFxuK1xcdG5vZGVfc2V0KG1wbnNbbmlkXS1cXHUwMDNlbmlkLCBtcC1cXHUwMDNlbm9kZXMpO1xcbitcXHRpZiAobm9kZV9pc19tZW1vcnlfb25seShtcG5zW25pZF0tXFx1MDAzZW5pZCkpIHtcXG4rXFx0XFx0bm9kZV9zZXQobXBuc1tuaWRdLVxcdTAwM2VuaWQsIG1wLVxcdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XFxuK1xcdFxcdGxpc3RfYWRkKFxcdTAwMjZtcG5zW25pZF0tXFx1MDAzZXBhY2thZ2VfZW50cnksIFxcdTAwMjZtcC1cXHUwMDNlbWVtb3J5X29ubHlfbGlzdCk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdG5vZGVfc2V0KG1wbnNbbmlkXS1cXHUwMDNlbmlkLCBtcC1cXHUwMDNlY3B1X25vZGVzKTtcXG4rXFx0XFx0bGlzdF9hZGQoXFx1MDAyNm1wbnNbbmlkXS1cXHUwMDNlcGFja2FnZV9lbnRyeSwgXFx1MDAyNm1wLVxcdTAwM2VjcHVfbGlzdCk7XFxuK1xcdH1cXG4rXFx0dXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKG1wKTtcXG4rXFx0bXBfc25hcHNob3RfcmVidWlsZCgpO1xcbitcXHRwa2dfaWQgPSBtcC1cXHUwMDNlcGFja2FnZV9pZDtcXG4rXFx0bm9kZXMgPSBtcC1cXHUwMDNlbm9kZXM7XFxuK1xcdGNwdSA9IG1wLVxcdTAwM2VjcHVfbm9kZXM7XFxuK1xcdG1lbSA9IG1wLVxcdTAwM2VtZW1vcnlfb25seV9ub2RlcztcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdHByX2luZm8oXFxcIm1lbW9yeV9wYWNrYWdlICVkOiBub2Rlcz0lKnBibCBjcHU9JSpwYmwgbWVtb3J5X29ubHk9JSpwYmxcXFxcblxcXCIsXFxuK1xcdFxcdHBrZ19pZCwgbm9kZW1hc2tfcHJfYXJncyhcXHUwMDI2bm9kZXMpLFxcbitcXHRcXHRub2RlbWFza19wcl9hcmdzKFxcdTAwMjZjcHUpLCBub2RlbWFza19wcl9hcmdzKFxcdTAwMjZtZW0pKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB1bmJpbmRfbm9kZV90b19wYWNrYWdlKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsIGludCBuaWQpXFxuK3tcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRub2RlX2NsZWFyKG5pZCwgbXAtXFx1MDAzZW5vZGVzKTtcXG4rXFx0aWYgKG5vZGVfc3RhdGUobmlkLCBOX0NQVSkpXFxuK1xcdFxcdG5vZGVfY2xlYXIobmlkLCBtcC1cXHUwMDNlY3B1X25vZGVzKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRub2RlX2NsZWFyKG5pZCwgbXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFxuK1xcdGlmIChtcG5zW25pZF0pXFxuK1xcdFxcdGxpc3RfZGVsKFxcdTAwMjZtcG5zW25pZF0tXFx1MDAzZXBhY2thZ2VfZW50cnkpO1xcbitcXG4rXFx0dXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKG1wKTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICpjcmVhdGVfcGFja2FnZV9ub2RlKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxcbit7XFxuK1xcdGludCBjcHVfbmlkLCBwYWNrYWdlX2lkO1xcbitcXHRpbnQgc291cmNlX2ZsYWdzO1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xcbitcXG4rXFx0aWYgKG5vZGVfc3RhdGUobmlkLCBOX0NQVSkpIHtcXG4rXFx0XFx0Y3B1X25pZCA9IG5pZDtcXG4rXFx0XFx0c291cmNlX2ZsYWdzID0gTVBOX1NSQ19DUFU7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGlmIChpbml0aWF0b3JfbmlkIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0XFx0Y3B1X25pZCA9IGluaXRpYXRvcl9uaWQ7XFxuK1xcdFxcdFxcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfSU5JVElBVE9SO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBObyBkcml2ZXItc3VwcGxpZWQgaW5pdGlhdG9yOiBmYWxsIGJhY2sgdG8gdGhlXFxuK1xcdFxcdFxcdCAqIG5lYXJlc3QgQ1BVIG5vZGUgKHZpYSBTTElUL251bWFfZGlzdGFuY2UpLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0Y3B1X25pZCA9IG51bWFfbmVhcmVzdF9ub2RlKG5pZCwgTl9DUFUpO1xcbitcXHRcXHRcXHRzb3VyY2VfZmxhZ3MgPSBNUE5fU1JDX1NMSVQ7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cGFja2FnZV9pZCA9IG1wX25vZGVfdG9fcGFja2FnZV9pZChjcHVfbmlkKTtcXG4rXFx0aWYgKHBhY2thZ2VfaWQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4rXFxuK1xcdG1wbiA9IGt6YWxsb2Nfb2JqKCptcG4pO1xcbitcXHRpZiAoIW1wbilcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuK1xcbitcXHRtcG4tXFx1MDAzZW5pZCA9IG5pZDtcXG4rXFx0bXBuLVxcdTAwM2Vpbml0aWF0b3JfbmlkID0gY3B1X25pZDtcXG4rXFx0bXBuLVxcdTAwM2VwYWNrYWdlX2lkID0gcGFja2FnZV9pZDtcXG4rXFx0bXBuLVxcdTAwM2Vzb3VyY2VfZmxhZ3MgPSBzb3VyY2VfZmxhZ3M7XFxuK1xcdG1wbi1cXHUwMDNlcHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7XFxuK1xcdG1wbi1cXHUwMDNlcGFja2FnZSA9IE5VTEw7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtcG4tXFx1MDAzZXBhY2thZ2VfZW50cnkpO1xcbitcXG4rXFx0cmV0dXJuIG1wbjtcXG4rfVxcbitcXG4rLypcXG4rICogVG9wb2xvZ3kgc3ltbWV0cnkgc3RhdHVzXFxuKyAqIEluZGljYXRlcyB3aGV0aGVyIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxcbisgKiAoc2FtZSBudW1iZXIgb2YgQ1BVIG5vZGVzIGFuZCBtZW1vcnktb25seSBub2RlcykuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCB0b3BvbG9neV9zeW1tZXRyaWM7XFxuK1xcbitzdGF0aWMgdm9pZCB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSh2b2lkKTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKl9fZGVzdHJveV9wYWNrYWdlX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCAqdW5yZWdfbXAgPSBOVUxMO1xcbitcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRtcG4gPSBtcG5zW25pZF07XFxuK1xcdGlmICghbXBuKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdG1wID0gbXBuLVxcdTAwM2VwYWNrYWdlO1xcbitcXHRpZiAobXApIHtcXG4rXFx0XFx0dW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTtcXG4rXFx0XFx0bXBuLVxcdTAwM2VwYWNrYWdlID0gTlVMTDtcXG4rXFxuK1xcdFxcdGlmIChtZW1vcnlfcGFja2FnZV9pc19lbXB0eShtcCkpIHtcXG4rXFx0XFx0XFx0bGlzdF9kZWwoXFx1MDAyNm1wLVxcdTAwM2VsaXN0KTtcXG4rXFx0XFx0XFx0dW5yZWdfbXAgPSBtcDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRtcG5zW25pZF0gPSBOVUxMO1xcbitcXHRrZnJlZShtcG4pO1xcbitcXHRtcF9zbmFwc2hvdF9yZWJ1aWxkKCk7XFxuK1xcbitcXHRyZXR1cm4gdW5yZWdfbXA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcDtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdGlmICh1bnJlZ19tcClcXG4rXFx0XFx0ZGV2aWNlX3VucmVnaXN0ZXIoXFx1MDAyNnVucmVnX21wLVxcdTAwM2VkZXYpO1xcbitcXG4rXFx0dmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkoKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBmaW5kX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKnVucmVnX21wID0gTlVMTDtcXG4rXFx0aW50IHJldCA9IG5pZDtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRpZiAoIW1wbnNbbmlkXSkge1xcbitcXHRcXHRyZXQgPSBOVU1BX05PX05PREU7XFxuK1xcdH0gZWxzZSBpZiAobXBuc1tuaWRdLVxcdTAwM2Vzb3VyY2VfZmxhZ3MgPT0gTVBOX1NSQ19TTElUIFxcdTAwMjZcXHUwMDI2IGluaXRpYXRvcl9uaWQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBTTElULWRlcml2ZWQgZW50cmllcyBhcmUgcHJvdmlzaW9uYWw7IGlmIGEgZHJpdmVyIGxhdGVyXFxuK1xcdFxcdCAqIHByb3ZpZGVzIGFuIGV4cGxpY2l0IGluaXRpYXRvciwgZHJvcCB0aGUgcHJvdmlzaW9uYWxcXG4rXFx0XFx0ICogZW50cnkgYW5kIHJlYnVpbGQgd2l0aCB0aGUgc3Ryb25nZXIgaGludC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHVucmVnX21wID0gX19kZXN0cm95X3BhY2thZ2Vfbm9kZShuaWQpO1xcbitcXHRcXHRyZXQgPSBOVU1BX05PX05PREU7XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdGlmICh1bnJlZ19tcClcXG4rXFx0XFx0ZGV2aWNlX3VucmVnaXN0ZXIoXFx1MDAyNnVucmVnX21wLVxcdTAwM2VkZXYpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXFxuK3tcXG4rXFx0aW50IG1wbl9uaWQ7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XFxuK1xcbitcXHRtcG5fbmlkID0gZmluZF9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcXG4rXFx0aWYgKG1wbl9uaWQgIT0gTlVNQV9OT19OT0RFKVxcbitcXHRcXHRyZXR1cm4gbXBuX25pZDtcXG4rXFxuK1xcdG1wbiA9IGNyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcXG4rXFx0aWYgKElTX0VSUihtcG4pKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihtcG4pO1xcbitcXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0aWYgKG1wbnNbbmlkXSkge1xcbitcXHRcXHRrZnJlZShtcG4pO1xcbitcXHRcXHRyZXR1cm4gbmlkO1xcbitcXHR9XFxuK1xcdG1wbnNbbmlkXSA9IG1wbjtcXG4rXFxuK1xcdHJldHVybiBuaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIE5VTUFfTk9fTk9ERSk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYmluZF9ub2RlX3RvX3BhY2thZ2UobmlkKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IgLSBBZGQgYSBub2RlIHdpdGggYW4gaW5pdGlhdG9yXFxuKyAqIEBuaWQ6ICAgICAgICAgICAgVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXFxuKyAqIEBpbml0aWF0b3JfbmlkOiAgQ1BVIG5pZCB1c2VkIHRvIHJlc29sdmUgQG5pZCdzIHBhY2thZ2UgKFxcdTAwM2U9MCkuXFxuKyAqXFxuKyAqIEVuc3VyZXMgdGhhdCBhIFxcdTAwMjZzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSBleGlzdHMgZm9yIEBuaWQgYW5kIHRoYXQgaXRzXFxuKyAqIHBhY2thZ2VfaWQgaXMgZGV0ZXJtaW5lZCB1c2luZyBAaW5pdGlhdG9yX25pZCB3aGVuIHByb3ZpZGVkLiBCaW5kaW5nIHRvIHRoZVxcbisgKiBwYWNrYWdlIGlzIG5vdCBwZXJmb3JtZWQgaGVyZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9hZGRfcGFja2FnZV9ub2RlIC0gQWRkIGEgbm9kZSwgcmVzb2x2aW5nIHBhY2thZ2UgYXV0b21hdGljYWxseVxcbisgKiBAbmlkOiBUYXJnZXQgTlVNQSBub2RlIHRvIGFkZC5cXG4rICpcXG4rICogV3JhcHBlciBvdmVyIG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKCkgdGhhdCByZXF1ZXN0cyBhdXRvbWF0aWNcXG4rICogaW5pdGlhdG9yIHJlc29sdXRpb24gKGUuZy4sIG5lYXJlc3QgQ1BVKS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfYWRkX3BhY2thZ2Vfbm9kZSk7XFxuK1xcbitzdGF0aWMgaW50IF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcXG4rXFx0XFx0XFx0XFx0ICAgICBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0c3RydWN0IG1wX3NuYXBzaG90ICpzbmFwO1xcbitcXHRpbnQgcGtnO1xcbitcXG4rXFx0aWYgKCFvdXQpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcbitcXHRpZiAobmlkIFxcdTAwM2MgMCB8fCBuaWQgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGd1YXJkKHJjdSkoKTtcXG4rXFxuK1xcdHNuYXAgPSByY3VfZGVyZWZlcmVuY2UobXBfc25hcHNob3QpO1xcbitcXHRpZiAoIXNuYXApXFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXG4rXFx0cGtnID0gc25hcC1cXHUwMDNlcGtnX29mW25pZF07XFxuK1xcdGlmIChwa2cgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdHN3aXRjaCAobm9kZV90eXBlKSB7XFxuK1xcdGNhc2UgTVBfTk9ERVNfQUxMOlxcbitcXHRcXHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXFx1MDAzZXBrZ1twa2ddLm5vZGVzKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTVBfTk9ERVNfQ1BVOlxcbitcXHRcXHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXFx1MDAzZXBrZ1twa2ddLmNwdV9ub2Rlcyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIE1QX05PREVTX01FTV9PTkxZOlxcbitcXHRcXHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXFx1MDAzZXBrZ1twa2ddLm1lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbitzdGF0aWMgaW50IF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLFxcbitcXHRcXHRcXHRcXHQgICAgbm9kZW1hc2tfdCAqb3V0KVxcbit7XFxuK1xcdGludCByZXQgPSAwO1xcbitcXG4rXFx0LyogTm8gaG90LXBhdGggY2FsbGVyczogdGhlIG11dGV4IGlzIGZpbmUgaGVyZS4gKi9cXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdGlmICghb3V0KSB7XFxuK1xcdFxcdHJldCA9IC1FSU5WQUw7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFxuK1xcdGlmIChuaWQgXFx1MDAzYyAwIHx8IG5pZCBcXHUwMDNlPSBNQVhfTlVNTk9ERVMpIHtcXG4rXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChub2RlX3R5cGUgPT0gTVBfTk9ERVNfQ1BVKSB7XFxuK1xcdFxcdGlmIChub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIGlmIChub2RlX3R5cGUgPT0gTVBfTk9ERVNfTUVNX09OTFkpIHtcXG4rXFx0XFx0aWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHtcXG4rXFx0XFx0cmV0ID0gLUVOT0VOVDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG5vZGVzX2NvcHkoKm91dCwgbXBuc1tuaWRdLVxcdTAwM2VwcmVmZXJyZWQpO1xcbitcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayAtIERlbW90aW9uIGNhbmRpZGF0ZXMgd2l0aGluIGEgcGFja2FnZVxcbisgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLlxcbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBtZW1vcnktb25seSB0YXJnZXRzIGluIHRoZSBzYW1lIHBhY2thZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxcbisgKi9cXG4raW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxcbit7XFxuK1xcdHJldHVybiBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayk7XFxuK1xcbisvKipcXG4rICogbXBfbmV4dF9kZW1vdGlvbl9ub2RlIC0gUGljayBvbmUgZGVtb3Rpb24gdGFyZ2V0XFxuKyAqIEBuaWQ6IENQVSBub2RlIGZyb20gd2hpY2ggbWVtb3J5IHdvdWxkIGJlIGRlbW90ZWQuXFxuKyAqXFxuKyAqIFBpY2tzIG9uZSB0YXJnZXQgKHJhbmRvbSBhbW9uZyB0aGUgbmVhcmVzdCkgZnJvbSBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKCkuXFxuKyAqXFxuKyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cXG4rICovXFxuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRpbnQgdGFyZ2V0X25pZDtcXG4rXFx0bm9kZW1hc2tfdCB0YXJnZXRfbm9kZW1hc2s7XFxuK1xcbitcXHRpZiAobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhuaWQsIFxcdTAwMjZ0YXJnZXRfbm9kZW1hc2spKVxcbitcXHRcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbitcXHRpZiAobm9kZXNfZW1wdHkodGFyZ2V0X25vZGVtYXNrKSlcXG4rXFx0XFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4rXFxuK1xcdHRhcmdldF9uaWQgPSBub2RlX3JhbmRvbShcXHUwMDI2dGFyZ2V0X25vZGVtYXNrKTtcXG4rXFxuK1xcdHJldHVybiB0YXJnZXRfbmlkO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfZGVtb3Rpb25fbm9kZSk7XFxuK1xcbisvKipcXG4rICogbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2sgLSBQcm9tb3Rpb24gY2FuZGlkYXRlcyB3aXRoaW4gYSBwYWNrYWdlXFxuKyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG93YXJkcyB3aGljaCBwcm9tb3Rpb24gc2Vla3MgQ1BVIGxvY2FsaXR5LlxcbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBDUFUgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC5cXG4rICovXFxuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0cmV0dXJuIF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhuaWQsIE1QX05PREVTX01FTV9PTkxZLCBvdXQpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9uZXh0X3Byb21vdGlvbl9ub2RlIC0gUGljayBvbmUgcHJvbW90aW9uIHRhcmdldFxcbisgKiBAbmlkOiBNZW1vcnktb25seSBub2RlIHRvIGJlIHByb21vdGVkIHRvd2FyZHMgQ1BVcy5cXG4rICpcXG4rICogUGlja3Mgb25lIHRhcmdldCAocmFuZG9tIGFtb25nIHRoZSBuZWFyZXN0KSBmcm9tIG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKCkuXFxuKyAqXFxuKyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cXG4rICovXFxuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0aW50IHRhcmdldF9uaWQ7XFxuK1xcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xcbitcXG4rXFx0aWYgKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKG5pZCwgXFx1MDAyNnRhcmdldF9ub2RlbWFzaykpXFxuK1xcdFxcdHJldHVybiBOVU1BX05PX05PREU7XFxuK1xcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxcbitcXHRcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbitcXG4rXFx0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFxcdTAwMjZ0YXJnZXRfbm9kZW1hc2spO1xcbitcXG4rXFx0cmV0dXJuIHRhcmdldF9uaWQ7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZSk7XFxuKyNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG4rXFxuKy8qKlxcbisgKiBtcF9nZXRfcGFja2FnZV9ub2RlcyAtIFJldHVybiBhbGwgbWVtYmVycyBvZiBAbmlkJ3MgcGFja2FnZVxcbisgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLlxcbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBhbGwgbWVtYmVycy5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXFxuKyAqL1xcbitpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxcbit7XFxuK1xcdHJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQUxMLCBvdXQpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX25vZGVzKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMgLSBSZXR1cm4gQ1BVIG1lbWJlcnMgb2YgQG5pZCdzIHBhY2thZ2VcXG4rICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS5cXG4rICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgQ1BVIG1lbWJlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxcbisgKi9cXG4raW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyAtIFJldHVybiBtZW1vcnktb25seSBtZW1iZXJzIG9mIEBuaWQncyBwYWNrYWdlXFxuKyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuXFxuKyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIG1lbW9yeS1vbmx5IG1lbWJlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxcbisgKi9cXG4raW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRyZXR1cm4gX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhuaWQsIE1QX05PREVTX01FTV9PTkxZLCBvdXQpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFxuK3N0YXRpYyBpbnQgX19tZW1pbml0IG1wX2hvdHBsdWdfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKl9hcmcpXFxuK3tcXG4rXFx0aW50IG5pZDtcXG4rXFx0c3RydWN0IG5vZGVfbm90aWZ5ICpubiA9IF9hcmc7XFxuK1xcbitcXHRuaWQgPSBubi1cXHUwMDNlbmlkO1xcbitcXHRpZiAobmlkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XFxuK1xcbitcXHRzd2l0Y2ggKGFjdGlvbikge1xcbitcXHRjYXNlIE5PREVfUkVNT1ZFRF9MQVNUX01FTU9SWTpcXG4rXFx0XFx0ZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRjYXNlIE5PREVfQURERURfRklSU1RfTUVNT1JZOlxcbitcXHRcXHRjcmVhdGVfbm9kZV93aXRoX3BhY2thZ2UobmlkKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIHN5c2ZzIGludGVyZmFjZSBmb3IgbWVtb3J5X3BhY2thZ2UgdG9wb2xvZ3lcXG4rICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6XFxuKyAqICAgLSBwYWNrYWdlX25vZGVzOiAgICAgICBBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcXG4rICogICAtIHBhY2thZ2VfY3B1X25vZGVzOiAgIENQVSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcXG4rICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxcbisgKiAgIC0gcGh5c2ljYWxfcGFja2FnZV9pZDogUGh5c2ljYWwgcGFja2FnZSBJRFxcbisgKi9cXG4rXFxuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2Vfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XFxuK1xcbitcXHRndWFyZChtdXRleCkoXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlKnBibFxcXFxuXFxcIiwgbm9kZW1hc2tfcHJfYXJncyhcXHUwMDI2bXAtXFx1MDAzZW5vZGVzKSk7XFxuK31cXG4rc3RhdGljIERFVklDRV9BVFRSX1JPKHBhY2thZ2Vfbm9kZXMpO1xcbitcXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9jcHVfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xcbitcXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcXFwiJSpwYmxcXFxcblxcXCIsIG5vZGVtYXNrX3ByX2FyZ3MoXFx1MDAyNm1wLVxcdTAwM2VjcHVfbm9kZXMpKTtcXG4rfVxcbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9jcHVfbm9kZXMpO1xcbitcXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9tZW1fb25seV9ub2Rlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XFxuK1xcbitcXHRndWFyZChtdXRleCkoXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlKnBibFxcXFxuXFxcIiwgbm9kZW1hc2tfcHJfYXJncyhcXHUwMDI2bXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKSk7XFxuK31cXG4rc3RhdGljIERFVklDRV9BVFRSX1JPKHBhY2thZ2VfbWVtX29ubHlfbm9kZXMpO1xcbitcXG4rc3RhdGljIHNzaXplX3QgcGh5c2ljYWxfcGFja2FnZV9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcXG4rXFx0XFx0XFx0XFx0XFx0c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XFxuK1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlZFxcXFxuXFxcIiwgbXAtXFx1MDAzZXBhY2thZ2VfaWQpO1xcbit9XFxuK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwaHlzaWNhbF9wYWNrYWdlX2lkKTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptZW1vcnlfcGFja2FnZV9hdHRyc1tdID0ge1xcbitcXHRcXHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9ub2Rlcy5hdHRyLFxcbitcXHRcXHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9jcHVfbm9kZXMuYXR0cixcXG4rXFx0XFx1MDAyNmRldl9hdHRyX3BhY2thZ2VfbWVtX29ubHlfbm9kZXMuYXR0cixcXG4rXFx0XFx1MDAyNmRldl9hdHRyX3BoeXNpY2FsX3BhY2thZ2VfaWQuYXR0cixcXG4rXFx0TlVMTCxcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1lbW9yeV9wYWNrYWdlX2dyb3VwID0ge1xcbitcXHQuYXR0cnMgPSBtZW1vcnlfcGFja2FnZV9hdHRycyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICptZW1vcnlfcGFja2FnZV9ncm91cHNbXSA9IHtcXG4rXFx0XFx1MDAyNm1lbW9yeV9wYWNrYWdlX2dyb3VwLFxcbitcXHROVUxMLFxcbit9O1xcbitcXG4rc3RhdGljIGludCBfX2luaXQgbWVtb3J5X3BhY2thZ2Vfc3lzZnNfaW5pdCh2b2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyKFxcdTAwMjZwYWNrYWdlX3N1YnN5cywgTlVMTCk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJtZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcXFxcblxcXCIsIHJldCk7XFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rY29yZV9pbml0Y2FsbChtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KTtcXG4rXFxuKy8qKlxcbisgKiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMgLSBDaGVjayBpZiBhbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgbm9kZSBzdHJ1Y3R1cmVcXG4rICpcXG4rICogUmV0dXJucyB0cnVlIGlmIGFsbCBtZW1vcnkgcGFja2FnZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgQ1BVIG5vZGVzXFxuKyAqIGFuZCBtZW1vcnktb25seSBub2RlcywgaW5kaWNhdGluZyBhIHN5bW1ldHJpYyB0b3BvbG9neS5cXG4rICpcXG4rICogVGhlIHRvcG9sb2d5X3N5bW1ldHJpYyB2YXJpYWJsZSBpcyBwcm90ZWN0ZWQgYnkgbWVtb3J5X3BhY2thZ2VfbG9jayBmb3JcXG4rICogd3JpdGVzIChpbiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSkuXFxuKyAqL1xcbitib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBSRUFEX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChtcF9pc190b3BvbG9neV9zeW1tZXRyaWMpO1xcbitcXG4rLyogV2FsayB0aGUgcGFja2FnZSBsaXN0IGFuZCBjb21wYXJlIG5vZGUgY291bnRzOyB0aGUgY2FsbGVyIGhvbGRzIHRoZSBsb2NrLiAqL1xcbitzdGF0aWMgYm9vbCBfX2NoZWNrX3RvcG9sb2d5X3N5bW1ldHJ5KHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcXG4rXFx0aW50IHJlZl9jcHVfbm9kZV9jb3VudCA9IDAsIHJlZl9tZW1vcnlfb25seV9ub2RlX2NvdW50ID0gMDtcXG4rXFx0aW50IHBhY2thZ2VfY291bnQgPSAwO1xcbitcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XFxuK1xcdFxcdGludCBjcHVfbm9kZV9jb3VudCA9IG5vZGVzX3dlaWdodChtcC1cXHUwMDNlY3B1X25vZGVzKTtcXG4rXFx0XFx0aW50IG1lbW9yeV9vbmx5X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFx0XFx0aW50IHRvdGFsX25vZGVfY291bnQgPSBjcHVfbm9kZV9jb3VudCArIG1lbW9yeV9vbmx5X25vZGVfY291bnQ7XFxuK1xcbitcXHRcXHRwYWNrYWdlX2NvdW50Kys7XFxuK1xcbitcXHRcXHQvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi9cXG4rXFx0XFx0aWYgKHRvdGFsX25vZGVfY291bnQgXFx1MDAzYyAyKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRpZiAocGFja2FnZV9jb3VudCA9PSAxKSB7XFxuK1xcdFxcdFxcdHJlZl9jcHVfbm9kZV9jb3VudCA9IGNwdV9ub2RlX2NvdW50O1xcbitcXHRcXHRcXHRyZWZfbWVtb3J5X29ubHlfbm9kZV9jb3VudCA9IG1lbW9yeV9vbmx5X25vZGVfY291bnQ7XFxuK1xcdFxcdH0gZWxzZSBpZiAoY3B1X25vZGVfY291bnQgIT0gcmVmX2NwdV9ub2RlX2NvdW50IHx8XFxuK1xcdFxcdFxcdCAgIG1lbW9yeV9vbmx5X25vZGVfY291bnQgIT0gcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQpIHtcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChwYWNrYWdlX2NvdW50IFxcdTAwM2MgMilcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuKy8qKlxcbisgKiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSAtIFZhbGlkYXRlIHRvcG9sb2d5IGZvciBwYWNrYWdlLWF3YXJlIGZlYXR1cmVzXFxuKyAqXFxuKyAqIFZhbGlkYXRlcyB0b3BvbG9neSBzeW1tZXRyeSBieSBjaGVja2luZyBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsXFxuKyAqIG5vZGUgc3RydWN0dXJlLiBVcGRhdGVzIHRoZSBnbG9iYWwgdG9wb2xvZ3lfc3ltbWV0cmljIHZhcmlhYmxlLlxcbisgKlxcbisgKiBUb3BvbG9neSBpcyB2YWxpZCBvbmx5IHdoZW4gYWxsIGNvbmRpdGlvbnMgYXJlIG1ldDpcXG4rICogMS4gQXQgbGVhc3QgMiBwYWNrYWdlcyBleGlzdCAobXVsdGktcGFja2FnZSBzeXN0ZW0pXFxuKyAqIDIuIEFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBjcHVfbm9kZSBhbmQgbWVtb3J5X29ubHlfbm9kZSBjb3VudHNcXG4rICogMy4gRWFjaCBwYWNrYWdlIGhhcyBhdCBsZWFzdCAyIHRvdGFsIG5vZGVzIChjcHVfbm9kZSArIG1lbW9yeV9vbmx5X25vZGUgXFx1MDAzZT0gMilcXG4rICpcXG4rICogVmFsaWQgY29uZmlndXJhdGlvbnMgcGVyIHBhY2thZ2U6XFxuKyAqIC0gMSBjcHVfbm9kZSArIDEgbWVtb3J5X29ubHlfbm9kZSA9IDIgbm9kZXMgKHZhbGlkKVxcbisgKiAtIDIgY3B1X25vZGVzICsgMCBtZW1vcnlfb25seV9ub2RlID0gMiBub2RlcyAodmFsaWQpXFxuKyAqIC0gMCBjcHVfbm9kZSArIDIgbWVtb3J5X29ubHlfbm9kZXMgPSAyIG5vZGVzICh2YWxpZClcXG4rICogLSAxIGNwdV9ub2RlICsgMCBtZW1vcnlfb25seV9ub2RlID0gMSBub2RlIChpbnZhbGlkIC0gc2luZ2xlIG5vZGUgcGFja2FnZSlcXG4rICovXFxuK3N0YXRpYyB2b2lkIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KHZvaWQpXFxuK3tcXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdFdSSVRFX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljLCBfX2NoZWNrX3RvcG9sb2d5X3N5bW1ldHJ5KCkpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfcGFja2FnZV9pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldCA9IDAsIG5pZDtcXG4rXFxuK1xcdGZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkge1xcbitcXHRcXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0cmV0ID0gY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRob3RwbHVnX25vZGVfbm90aWZpZXIobXBfaG90cGx1Z19jYWxsYmFjaywgTUVNVElFUl9IT1RQTFVHX1BSSSk7XFxuK1xcbitcXHR2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpO1xcbitcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK2xhdGVfaW5pdGNhbGwobWVtb3J5X3BhY2thZ2VfaW5pdCk7XFxuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcXG5pbmRleCA0ZTQ0MjFiMjJiNTlmLi42NmJjY2I5YTBhMTkxIDEwMDY0NFxcbi0tLSBhL21tL21lbXBvbGljeS5jXFxuKysrIGIvbW0vbWVtcG9saWN5LmNcXG5AQCAtMTE3LDYgKzExNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vdGxiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC91YWNjZXNzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1vcnkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuIFxcbkBAIC0xNjcsNiArMTY4LDggQEAgc3RhdGljIHVuc2lnbmVkIGludCAqbm9kZV9id190YWJsZTtcXG4gICovXFxuIHN0YXRpYyBERUZJTkVfTVVURVgod2lfc3RhdGVfbG9jayk7XFxuIFxcbitzdGF0aWMgYm9vbCBwYWNrYWdlX21vZGVfZW5hYmxlZDtcXG4rXFxuIHN0YXRpYyB1OCBnZXRfaWxfd2VpZ2h0KGludCBub2RlKVxcbiB7XFxuIFxcdHN0cnVjdCB3ZWlnaHRlZF9pbnRlcmxlYXZlX3N0YXRlICpzdGF0ZTtcXG5AQCAtMTgwLDYgKzE4MywxMSBAQCBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcXG4gXFx0cmV0dXJuIHdlaWdodDtcXG4gfVxcbiBcXG4rc3RhdGljIGJvb2wgd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQodm9pZClcXG4re1xcbitcXHRyZXR1cm4gUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSBcXHUwMDI2XFx1MDAyNiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKTtcXG4rfVxcbitcXG4gLypcXG4gICogQ29udmVydCBiYW5kd2lkdGggdmFsdWVzIGludG8gd2VpZ2h0ZWQgaW50ZXJsZWF2ZSB3ZWlnaHRzLlxcbiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay5cXG5AQCAtMzM3LDYgKzM0NSw0NyBAQCBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKG5lYXJlc3Rfbm9kZV9ub2RlbWFzayk7XFxuIFxcbisvKipcXG4rICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGVcXG4rICogQG5vZGU6IFRoZSByZWZlcmVuY2Ugbm9kZSBJRCB0byBtZWFzdXJlIGRpc3RhbmNlIGZyb21cXG4rICogQG1hc2s6IFRoZSBzZXQgb2YgY2FuZGlkYXRlIG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdFxcbisgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciBhbGwgbm9kZXMgaW4gQG1hc2sgYW5kIG1lYXN1cmVzIHRoZSBkaXN0YW5jZVxcbisgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuXFxuKyAqIEl0IGZpbmRzIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGFuZCB0aGVuIHJlY29yZHMgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXRcXG4rICogc2hhcmUgdGhhdCBzYW1lIG1pbmltdW0gZGlzdGFuY2UgaW50byB0aGUgb3V0cHV0IG1hc2sgQG91dC5cXG4rICpcXG4rICogRm9yIGV4YW1wbGUsIGlmIG11bHRpcGxlIG5vZGVzIGhhdmUgZXF1YWwgbWluaW1hbCBkaXN0YW5jZSB0byBAbm9kZSwgYWxsXFxuKyAqIG9mIHRoZW0gYXJlIGluY2x1ZGVkIGluIEBvdXQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciAtRUlOVkFMIGlmIEBvdXQgaXMgTlVMTC5cXG4rICovXFxuK2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aW50IGRpc3QsIG4sIG1pbl9kaXN0ID0gSU5UX01BWDtcXG4rXFxuK1xcdGlmICghb3V0KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdG5vZGVzX2NsZWFyKCpvdXQpO1xcbitcXG4rXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7XFxuK1xcdFxcdGRpc3QgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pO1xcbitcXG4rXFx0XFx0aWYgKGRpc3QgXFx1MDAzYyBtaW5fZGlzdCkge1xcbitcXHRcXHRcXHRtaW5fZGlzdCA9IGRpc3Q7XFxuK1xcdFxcdFxcdG5vZGVzX2NsZWFyKCpvdXQpO1xcbitcXHRcXHRcXHRub2RlX3NldChuLCAqb3V0KTtcXG4rXFx0XFx0fSBlbHNlIGlmIChkaXN0ID09IG1pbl9kaXN0KSB7XFxuK1xcdFxcdFxcdG5vZGVfc2V0KG4sICpvdXQpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2spO1xcbitcXG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcXG4ge1xcbiBcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBwLVxcdTAwM2VtZW1wb2xpY3k7XFxuQEAgLTIwOTcsMTcgKzIxNDYsOTcgQEAgYm9vbCBhcHBseV9wb2xpY3lfem9uZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIGVudW0gem9uZV90eXBlIHpvbmUpXFxuIFxcdHJldHVybiB6b25lIFxcdTAwM2U9IGR5bmFtaWNfcG9saWN5X3pvbmU7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2VcXG4rICogQHBvbGljeTogVGFyZ2V0IG1lbXBvbGljeSB3aG9zZSB1c2VyLXNlbGVjdGVkIG5vZGVzIGFyZSBpbiBAcG9saWN5LVxcdTAwM2Vub2Rlcy5cXG4rICogQG1hc2s6ICAgT3V0cHV0IG5vZGVtYXNrLiBPbiBzdWNjZXNzLCBjb250YWlucyBwb2xpY3ktXFx1MDAzZW5vZGVzIGxpbWl0ZWQgdG9cXG4rICogICAgICAgICAgdGhlIHBhY2thZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGFsbG9jYXRpb24uXFxuKyAqXFxuKyAqIFRoaXMgaGVscGVyIGNvbWJpbmVzIHR3byBjb25zdHJhaW50cyB0byBkZWNpZGUgd2hlcmUgd2l0aGluIGEgcGFja2FnZVxcbisgKiBtZW1vcnkgbWF5IGJlIGFsbG9jYXRlZDpcXG4rICpcXG4rICogICAxKSBUaGUgY2FsbGVyJ3MgcGFja2FnZTogZGVyaXZlZCB2aWEgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMobnVtYV9ub2RlX2lkKCkpLlxcbisgKiAgIDIpIFRoZSB1c2VyJ3MgcHJlc2VsZWN0ZWQgc2V0IEBwb2xpY3ktXFx1MDAzZW5vZGVzIChjcHVzZXRzL21lbXBvbGljeSkuXFxuKyAqXFxuKyAqIFRoZSBmdW5jdGlvbiBvYnRhaW5zIHRoZSBub2RlbWFzayBvZiB0aGUgY3VycmVudCBDUFUncyBwYWNrYWdlIGFuZFxcbisgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS1cXHUwMDNlbm9kZXMuIElmIHRoZSBpbnRlcnNlY3Rpb24gaXMgZW1wdHkgKGUuZy4gdGhlXFxuKyAqIHVzZXIgZXhjbHVkZWQgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlKSwgaXQgZmFsbHMgYmFjayB0byB0aGVcXG4rICogbm9kZSBpbiBAcG9saWN5LVxcdTAwM2Vub2RlcywgZGVyaXZlcyB0aGF0IG5vZGUncyBwYWNrYWdlLCBhbmQgaW50ZXJzZWN0c1xcbisgKiBhZ2Fpbi4gSWYgdGhlIGZhbGxiYWNrIGFsc28geWllbGRzIGFuIGVtcHR5IHNldCwgQG1hc2sgc3RheXMgZW1wdHkgYW5kIGFcXG4rICogbm9uLXplcm8gZXJyb3IgaXMgcmV0dXJuZWQuXFxuKyAqXFxuKyAqIEV4YW1wbGVzIChwYWNrYWdlczogUDA9e0NQVTowLCBNRU06Mn0sIFAxPXtDUFU6MSwgTUVNOjN9KTpcXG4rICogICAtIHBvbGljeS1cXHUwMDNlbm9kZXMgPSB7MCwxLDIsM31cXG4rICogICAgICAgb24gUDA6IG1hc2sgPSB7MCwyfTsgb24gUDE6IG1hc2sgPSB7MSwzfS5cXG4rICogICAtIHBvbGljeS1cXHUwMDNlbm9kZXMgPSB7MCwxLDN9XFxuKyAqICAgICAgIG9uIFAwOiBtYXNrID0gezB9ICAgICAgKG9ubHkgbm9kZSAwIGZyb20gUDAgaXMgYWxsb3dlZCkuXFxuKyAqICAgLSBwb2xpY3ktXFx1MDAzZW5vZGVzID0gezEsMiwzfVxcbisgKiAgICAgICBvbiBQMDogbWFzayA9IHsyfSAgICAgIChvbmx5IG5vZGUgMiBmcm9tIFAwIGlzIGFsbG93ZWQpLlxcbisgKiAgIC0gcG9saWN5LVxcdTAwM2Vub2RlcyA9IHsxLDN9XFxuKyAqICAgICAgIG9uIFAwOiBjdXJyZW50IHBhY2thZ2UgKFAwKSBcXHUwMDI2IHBvbGljeSA9IE5VTEwgLVxcdTAwM2UgZmFsbGJhY2sgdG8gcG9saWN5PTEsXFxuKyAqICAgICAgICAgICAgICAgcGFja2FnZSgxKT1QMSwgbWFzayA9IHsxLDN9LiAoVXNlciBlZmZlY3RpdmVseSBvcHRlZCBvdXQgb2YgUDAuKVxcbisgKlxcbisgKiBJZiB0aGUgc2VsZWN0ZWQgbm9kZSBpcyBsb3cgb24gbWVtb3J5LCB0aGUgYWxsb2NhdGlvbiBtYXkgdXNlIGFub3RoZXIgbm9kZS5cXG4rICpcXG4rICogUmV0dXJuOlxcbisgKiAgIDAgb24gc3VjY2VzcyB3aXRoIEBtYXNrIHNldCBhcyBhYm92ZTtcXG4rICogICAtRUlOVkFMIGlmIEBwb2xpY3kvQG1hc2sgaXMgTlVMTDtcXG4rICogICAtRU5PRU5UIGlmIGV2ZW4gdGhlIGZhbGxiYWNrIGludGVyc2VjdGlvbiBpcyBlbXB0eTtcXG4rICogICBQcm9wYWdhdGVkIGVycm9yIGZyb20gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoKSBvbiBmYWlsdXJlLlxcbisgKi9cXG4rc3RhdGljIGludCBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgbm9kZW1hc2tfdCAqbWFzaylcXG4re1xcbitcXHRub2RlbWFza190IHBhY2thZ2VfbWFzaztcXG4rXFx0aW50IG5vZGUsIHJldDtcXG4rXFxuK1xcdGlmICghcG9saWN5IHx8ICFtYXNrKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdG5vZGVzX2NsZWFyKCptYXNrKTtcXG4rXFxuK1xcdG5vZGUgPSBudW1hX25vZGVfaWQoKTtcXG4rXFx0cmV0ID0gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMobm9kZSwgXFx1MDAyNnBhY2thZ2VfbWFzayk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRub2Rlc19hbmQoKm1hc2ssIHBhY2thZ2VfbWFzaywgcG9saWN5LVxcdTAwM2Vub2Rlcyk7XFxuK1xcdGlmICghbm9kZXNfZW1wdHkoKm1hc2spKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB1c2VyJ3Mgbm9kZW1hc2sgZXhjbHVkZXMgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlO1xcbitcXHQgKiBmYWxsIGJhY2sgdG8gdGhlIHBhY2thZ2Ugc3Bhbm5lZCBieSB0aGUgdXNlcidzIG93biBmaXJzdCBub2RlLlxcbitcXHQgKi9cXG4rXFx0bm9kZSA9IGZpcnN0X25vZGUocG9saWN5LVxcdTAwM2Vub2Rlcyk7XFxuK1xcdHJldCA9IG1wX2dldF9wYWNrYWdlX25vZGVzKG5vZGUsIFxcdTAwMjZwYWNrYWdlX21hc2spO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0bm9kZXNfYW5kKCptYXNrLCBwYWNrYWdlX21hc2ssIHBvbGljeS1cXHUwMDNlbm9kZXMpO1xcbitcXHRpZiAobm9kZXNfZW1wdHkoKm1hc2spKVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KVxcbiB7XFxuIFxcdHVuc2lnbmVkIGludCBub2RlO1xcbiBcXHR1bnNpZ25lZCBpbnQgY3B1c2V0X21lbXNfY29va2llO1xcbitcXHRub2RlbWFza190IG1hc2s7XFxuIFxcbiByZXRyeTpcXG4gXFx0LyogdG8gcHJldmVudCBtaXNjb3VudCB1c2UgdHNrLVxcdTAwM2VtZW1zX2FsbG93ZWRfc2VxIHRvIGRldGVjdCByZWJpbmQgKi9cXG4gXFx0Y3B1c2V0X21lbXNfY29va2llID0gcmVhZF9tZW1zX2FsbG93ZWRfYmVnaW4oKTtcXG4gXFx0bm9kZSA9IGN1cnJlbnQtXFx1MDAzZWlsX3ByZXY7XFxuLVxcdGlmICghY3VycmVudC1cXHUwMDNlaWxfd2VpZ2h0IHx8ICFub2RlX2lzc2V0KG5vZGUsIHBvbGljeS1cXHUwMDNlbm9kZXMpKSB7XFxuLVxcdFxcdG5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgcG9saWN5LVxcdTAwM2Vub2Rlcyk7XFxuK1xcbitcXHQvKiBQYWNrYWdlIG1vZGUgb2ZmIG9yIHVucmVzb2x2ZWQ6IGZhbGwgYmFjayB0byB0aGUgZnVsbCBwb2xpY3kgbm9kZW1hc2suICovXFxuK1xcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fFxcbitcXHQgICAgcG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2xpY3ksIFxcdTAwMjZtYXNrKSlcXG4rXFx0XFx0bWFzayA9IHBvbGljeS1cXHUwMDNlbm9kZXM7XFxuK1xcbitcXHRpZiAoIWN1cnJlbnQtXFx1MDAzZWlsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBtYXNrKSkge1xcbitcXHRcXHRub2RlID0gbmV4dF9ub2RlX2luKG5vZGUsIG1hc2spO1xcbiBcXHRcXHRpZiAocmVhZF9tZW1zX2FsbG93ZWRfcmV0cnkoY3B1c2V0X21lbXNfY29va2llKSlcXG4gXFx0XFx0XFx0Z290byByZXRyeTtcXG4gXFx0XFx0aWYgKG5vZGUgPT0gTUFYX05VTU5PREVTKVxcbkBAIC0yMjAwLDYgKzIzMjksMzAgQEAgc3RhdGljIHVuc2lnbmVkIGludCByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcXG4gXFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFBhY2thZ2UtYXdhcmUgY291bnRlcnBhcnQgb2YgcmVhZF9vbmNlX3BvbGljeV9ub2RlbWFzaygpOiByZXNvbHZlIHRoZVxcbisgKiBjdXJyZW50IHBhY2thZ2UncyBub2RlcyBpbnRlcnNlY3RlZCB3aXRoIHRoZSBwb2xpY3ksIGZhbGxpbmcgYmFjayB0byB0aGVcXG4rICogZnVsbCBwb2xpY3kgbm9kZW1hc2sgd2hlbiBwYWNrYWdlIG1vZGUgaXMgb2ZmIG9yIHJlc29sdXRpb24gZmFpbHMuXFxuKyAqL1xcbitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfcGFja2FnZV9ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIG5vZGVtYXNrX3QgKm1hc2spXFxuK3tcXG4rXFx0bm9kZW1hc2tfdCBwYWNrYWdlX21hc2s7XFxuK1xcbitcXHRiYXJyaWVyKCk7XFxuK1xcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSkge1xcbitcXHRcXHRtZW1jcHkobWFzaywgXFx1MDAyNnBvbC1cXHUwMDNlbm9kZXMsIHNpemVvZihub2RlbWFza190KSk7XFxuK1xcdFxcdHJldHVybiBub2Rlc193ZWlnaHQoKm1hc2spO1xcbitcXHR9XFxuK1xcdGlmIChwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHBvbCwgXFx1MDAyNnBhY2thZ2VfbWFzaykpXFxuK1xcdFxcdG1lbWNweShtYXNrLCBcXHUwMDI2cG9sLVxcdTAwM2Vub2Rlcywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRtZW1jcHkobWFzaywgXFx1MDAyNnBhY2thZ2VfbWFzaywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcXG4rXFx0YmFycmllcigpO1xcbitcXG4rXFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XFxuK31cXG4rXFxuIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcXG4ge1xcbiBcXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XFxuQEAgLTIyMTAsNyArMjM2Myw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcXG4gXFx0dTggd2VpZ2h0O1xcbiBcXHRpbnQgbmlkID0gMDtcXG4gXFxuLVxcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9ub2RlbWFzayhwb2wsIFxcdTAwMjZub2RlbWFzayk7XFxuK1xcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXFx1MDAyNm5vZGVtYXNrKTtcXG4gXFx0aWYgKCFucl9ub2RlcylcXG4gXFx0XFx0cmV0dXJuIG51bWFfbm9kZV9pZCgpO1xcbiBcXG5AQCAtMjY1NCw3ICsyODA3LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKGdmcF90IGdmcCxcXG4gXFx0LyogcmVhZCB0aGUgbm9kZXMgb250byB0aGUgc3RhY2ssIHJldHJ5IGlmIGRvbmUgZHVyaW5nIHJlYmluZCAqL1xcbiBcXHRkbyB7XFxuIFxcdFxcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XFxuLVxcdFxcdG5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCBcXHUwMDI2bm9kZXMpO1xcbitcXHRcXHRubm9kZXMgPSByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2socG9sLCBcXHUwMDI2bm9kZXMpO1xcbiBcXHR9IHdoaWxlIChyZWFkX21lbXNfYWxsb3dlZF9yZXRyeShjcHVzZXRfbWVtc19jb29raWUpKTtcXG4gXFxuIFxcdC8qIGlmIHRoZSBub2RlbWFzayBoYXMgYmVjb21lIGludmFsaWQsIHdlIGNhbm5vdCBkbyBhbnl0aGluZyAqL1xcbkBAIC0zNzk0LDcgKzM5NDcsNDIgQEAgc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSB3aV9hdXRvX2F0dHIgPSB7XFxuIFxcdC5zdG9yZSA9IHdlaWdodGVkX2ludGVybGVhdmVfYXV0b19zdG9yZSxcXG4gfTtcXG4gXFxuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxcbitcXHRcXHRzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlc1xcXFxuXFxcIiwgc3RyX3RydWVfZmFsc2UoUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSkpO1xcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21vZGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosXFxuK1xcdFxcdHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0Ym9vbCBpbnB1dDtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdGVyciA9IGtzdHJ0b2Jvb2woYnVmLCBcXHUwMDI2aW5wdXQpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0LypcXG4rXFx0ICogRGlzYWJsZSBwYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9naWVzLlxcbitcXHQgKiBOb24tc3ltbWV0cmljIHRvcG9sb2d5IChlLmcuLCBhc3ltbWV0cmljIENYTCBtZW1vcnkgYXR0YWNobWVudCkgY2FuXFxuK1xcdCAqIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlmIHBhY2thZ2UtYXdhcmUgYWxsb2NhdGlvbiBpcyB1c2VkLlxcbitcXHQgKiBSZWplY3QgZW5hYmxlIHJlcXVlc3QgaWYgdG9wb2xvZ3kgaXMgbm90IHN5bW1ldHJpYy5cXG4rXFx0ICovXFxuK1xcdGlmIChpbnB1dCBcXHUwMDI2XFx1MDAyNiAhbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKCkpIHtcXG4rXFx0XFx0cHJfd2FybihcXFwicGFja2FnZV9tb2RlIGNhbm5vdCBiZSBlbmFibGVkIG9uIG5vbi1zeW1tZXRyaWMgdG9wb2xvZ3lcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0V1JJVEVfT05DRShwYWNrYWdlX21vZGVfZW5hYmxlZCwgaW5wdXQpO1xcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfcGFja2FnZV9tb2RlX2F0dHIgPVxcbitcXHRfX0FUVFIocGFja2FnZV9tb2RlLCAwNjY0LCBwYWNrYWdlX21vZGVfc2hvdywgcGFja2FnZV9tb2RlX3N0b3JlKTtcXG4rXFxuIHN0YXRpYyB2b2lkIHdpX2NsZWFudXAodm9pZCkge1xcbitcXHRzeXNmc19yZW1vdmVfZmlsZShcXHUwMDI2d2lfZ3JvdXAtXFx1MDAzZXdpX2tvYmosIFxcdTAwMjZ3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTtcXG4gXFx0c3lzZnNfcmVtb3ZlX2ZpbGUoXFx1MDAyNndpX2dyb3VwLVxcdTAwM2V3aV9rb2JqLCBcXHUwMDI2d2lfYXV0b19hdHRyLmF0dHIpO1xcbiBcXHRzeXNmc193aV9ub2RlX2RlbGV0ZV9hbGwoKTtcXG4gXFx0d2lfc3RhdGVfZnJlZSgpO1xcbkBAIC0zOTAwLDYgKzQwODgsMTAgQEAgc3RhdGljIGludCBfX2luaXQgYWRkX3dlaWdodGVkX2ludGVybGVhdmVfZ3JvdXAoc3RydWN0IGtvYmplY3QgKm1lbXBvbGljeV9rb2JqKVxcbiBcXHRpZiAoZXJyKVxcbiBcXHRcXHRnb3RvIGVycl9wdXRfa29iajtcXG4gXFxuK1xcdGVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKFxcdTAwMjZ3aV9ncm91cC1cXHUwMDNld2lfa29iaiwgXFx1MDAyNndpX3BhY2thZ2VfbW9kZV9hdHRyLmF0dHIpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRnb3RvIGVycl9jbGVhbnVwX2tvYmo7XFxuK1xcbiBcXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHtcXG4gXFx0XFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6MjkuMTYyMzI5OTY0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTI2ODgzMjk5MDQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5VTUFcIixcbiAgICBcIk5VTUFfTUlHUkFUSU9OXCIsXG4gICAgXCJDWExfQlVTXCIsXG4gICAgXCJDWExfUkVHSU9OXCIsXG4gICAgXCJERVZfREFYXCIsXG4gICAgXCJERVZfREFYX0tNRU1cIixcbiAgICBcIk1FTU9SWV9IT1RQTFVHXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibXBfYWRkX3BhY2thZ2Vfbm9kZVwiLFxuICAgIFwibXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX25vZGVzXCIsXG4gICAgXCJtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzXCIsXG4gICAgXCJtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrXCIsXG4gICAgXCJtcF9uZXh0X2RlbW90aW9uX25vZGVcIixcbiAgICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrXCIsXG4gICAgXCJtcF9uZXh0X3Byb21vdGlvbl9ub2RlXCIsXG4gICAgXCJtcF9pc190b3BvbG9neV9zeW1tZXRyaWNcIixcbiAgICBcIm5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tcIixcbiAgICBcIm1wX3Byb2JlX3BhY2thZ2VfaWRcIixcbiAgICBcInJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIixcbiAgICBcInVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllclwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3kgY29uY2VwdCBmb3IgTlVNQSBub2RlcywgbW9kaWZ5aW5nIGNvcmUgbWVtb3J5IHRpZXJpbmcsIG1lbXBvbGljeSwgYW5kIENYTCByZWdpb24gaGFuZGxpbmcuIEl0IGFkZHMgbmV3IHN5c2ZzIGludGVyZmFjZXMgYW5kIGEgbmV3IG1lbXBvbGljeSB3ZWlnaHRlZCBpbnRlcmxlYXZlIG1vZGUsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDI1YTJhMmFhYzY0OWJjYWI2ZjQwYzFkYzZmZmFhMzUxMTBlZGFiN2FcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyA2IDA4OjI4OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUwMGY5ZTVmZjE5ZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlXG5AQCAtMCwwICsxLDM1IEBAXG4rV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL1xuK0RhdGU6XHRcdEF1Z3VzdCAyMDI2XG4rQ29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbitEZXNjcmlwdGlvbjpcdE1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5XG4rXG4rXHRcdEEgXCJtZW1vcnkgcGFja2FnZVwiIGdyb3VwcyB0aGUgTlVNQSBub2RlcyBhc3NvY2lhdGVkIHdpdGggb25lXG4rXHRcdHBoeXNpY2FsIENQVSBwYWNrYWdlIChzb2NrZXQpOiB0aGUgbm9kZXMgdGhhdCBoYXZlIENQVXMgYW5kXG4rXHRcdHRoZSBub2RlcyB0aGF0IG9ubHkgaGF2ZSBtZW1vcnkgKGUuZy4gQ1hMIG9yIEhCTSkuXG4rXG4rXHRcdEFsbCBhdHRyaWJ1dGVzIGFyZSByZWFkLW9ubHk7IHRoZSB0b3BvbG9neSBjYW5ub3QgYmVcbitcdFx0b3ZlcnJpZGRlbiBmcm9tIHVzZXIgc3BhY2UuXG4rXG4rV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXNcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0IGZvcm1hdFxuK1x0XHQoZS5nLiBcIjAsMlwiKS5cbitcbitXaGF0Olx0XHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGFja2FnZV9jcHVfbm9kZXNcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRUaGUgbm9kZXMgdGhhdCBoYXZlIENQVXMgaW4gdGhpcyBwYWNrYWdlLCBpbiBub2RlbGlzdFxuK1x0XHRmb3JtYXQuXG4rXG4rV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2VfbWVtX29ubHlfbm9kZXNcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRUaGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTC9IQk0pIGluIHRoaXNcbitcdFx0cGFja2FnZSwgaW4gbm9kZWxpc3QgZm9ybWF0LlxuK1xuK1doYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9waHlzaWNhbF9wYWNrYWdlX2lkXG4rRGF0ZTpcdFx0QXVndXN0IDIwMjZcbitDb250YWN0Olx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuK0Rlc2NyaXB0aW9uOlx0VGhlIHBoeXNpY2FsIHBhY2thZ2UgaWQgdGhpcyBncm91cCBjb3JyZXNwb25kcyB0bywgYXNcbitcdFx0cmVwb3J0ZWQgYnkgQ1BVIHRvcG9sb2d5LlxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbkBAIC01MiwzICs1MiwyMCBAQCBEZXNjcmlwdGlvbjpcdEF1dG8td2VpZ2h0aW5nIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlXG4gXG4gXHRcdFdyaXRpbmcgYSBuZXcgd2VpZ2h0IHRvIGEgbm9kZSBkaXJlY3RseSB2aWEgdGhlIG5vZGVOIGludGVyZmFjZVxuIFx0XHR3aWxsIGFsc28gYXV0b21hdGljYWxseSBzd2l0Y2ggdGhlIHN5c3RlbSB0byBtYW51YWwgbW9kZS5cbitcbitXaGF0Olx0XHQvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRQYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgdG9nZ2xlXG4rXG4rXHRcdCd0cnVlJyByZXN0cmljdHMgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBub2RlIHNlbGVjdGlvbiB0byB0aGVcbitcdFx0TlVNQSBub2RlcyBvZiB0aGUgcGFja2FnZSAoQ1BVIHNvY2tldCkgdGhlIGFsbG9jYXRpbmcgdGFza1xuK1x0XHRpcyBydW5uaW5nIG9uLiAnZmFsc2UnICh0aGUgZGVmYXVsdCkgdXNlcyB0aGUgZXhpc3RpbmdcbitcdFx0d2VpZ2h0ZWQgaW50ZXJsZWF2ZSBiZWhhdmlvci5cbitcbitcdFx0RW5hYmxpbmcgaXMgcmVqZWN0ZWQgd2l0aCAtRUlOVkFMIHdoaWxlIHRoZSBwYWNrYWdlIHRvcG9sb2d5XG4rXHRcdGlzIG5vdCBzeW1tZXRyaWMuXG4rXG4rXHRcdFdyaXRpbmcgYW55IHRydWUgdmFsdWUgc3RyaW5nIChlLmcuIFkgb3IgMSkgZW5hYmxlcyB0aGVcbitcdFx0cmVzdHJpY3Rpb24sIGFueSBmYWxzZSB2YWx1ZSBzdHJpbmcgKGUuZy4gTiBvciAwKSBkaXNhYmxlc1xuK1x0XHRpdC4gQWxsIG90aGVyIHN0cmluZ3MgcmV0dXJuIC1FSU5WQUwuXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uYyBiL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNcbmluZGV4IGU1MGRjNzE2ZDRlODIuLmFmNjZlMmUwNmM2MjQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXG4rKysgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXG5AQCAtMjY3Myw2ICsyNjczLDU1IEBAIHN0YXRpYyBpbnQgY3hsX3JlZ2lvbl9jYWxjdWxhdGVfYWRpc3RhbmNlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsXG4gXHRyZXR1cm4gTk9USUZZX1NUT1A7XG4gfVxuIFxuKy8qXG4rICogRmluZCBhIE5VTUEgbm9kZSB0byBhY3QgYXMgdGhlIGluaXRpYXRvciBmb3IgdGhpcyByZWdpb246IHNjYW4gdGhlXG4rICogcmVnaW9uJ3MgZW5kcG9pbnQgdGFyZ2V0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCByZXNvbHZlcyB0byBhXG4rICogdmFsaWQgTlVNQSBub2RlLlxuKyAqL1xuK3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hscilcbit7XG4rXHRzdHJ1Y3QgY3hsX3JlZ2lvbl9wYXJhbXMgKnAgPSBcdTAwMjZjeGxyLVx1MDAzZXBhcmFtcztcbitcdHN0cnVjdCBjeGxfZW5kcG9pbnRfZGVjb2RlciAqY3hsZWQgPSBOVUxMO1xuK1x0c3RydWN0IGN4bF9tZW1kZXYgKmN4bG1kID0gTlVMTDtcbitcdGludCBpLCBudW1hX25vZGU7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwLVx1MDAzZW5yX3RhcmdldHM7IGkrKykge1xuK1x0XHRjeGxlZCA9IHAtXHUwMDNldGFyZ2V0c1tpXTtcbitcdFx0Y3hsbWQgPSBjeGxlZF90b19tZW1kZXYoY3hsZWQpO1xuK1x0XHRudW1hX25vZGUgPSBkZXZfdG9fbm9kZShcdTAwMjZjeGxtZC1cdTAwM2VkZXYpO1xuK1x0XHRpZiAobnVtYV9ub2RlICE9IE5VTUFfTk9fTk9ERSlcbitcdFx0XHRyZXR1cm4gbnVtYV9ub2RlO1xuK1x0fVxuK1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbit9XG4rXG4rLypcbisgKiBQYWNrYWdlIG5vdGlmaWVyIGNhbGxiYWNrOiB3aGVuIGEgbmV3IG1lbW9yeSBub2RlIGlzIG9ubGluZWQgdmlhIGRheFxuKyAqIGttZW0sIGJpbmQgdGhlIG5vZGUgdGhpcyBDWEwgcmVnaW9uIGJhY2tzIHRvIGl0cyBtZW1vcnkgcGFja2FnZSwgdXNpbmdcbisgKiB0aGUgbmVhcmVzdCByZWdpb24gdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IuIE5vdGlmaWNhdGlvbnMgZm9yIG90aGVyXG4rICogbm9kZXMgYXJlIGlnbm9yZWQuXG4rICovXG4rc3RhdGljIGludCBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGRheF9uaWQsIHZvaWQgKmRhdGEpXG4re1xuK1x0aW50IHJlZ2lvbl9uaWQsIG5lYXJlc3RfbmlkLCByZXQ7XG4rXHRzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hsciA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGN4bF9yZWdpb24sIHBhY2thZ2Vfbm90aWZpZXIpO1xuK1xuK1x0cmVnaW9uX25pZCA9IHBoeXNfdG9fdGFyZ2V0X25vZGUoY3hsci1cdTAwM2VwYXJhbXMucmVzLVx1MDAzZXN0YXJ0KTtcbitcdGlmIChyZWdpb25fbmlkICE9IGRheF9uaWQpXG4rXHRcdHJldHVybiBOT1RJRllfRE9ORTtcbitcbitcdG5lYXJlc3RfbmlkID0gY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShjeGxyKTtcbitcdGlmIChuZWFyZXN0X25pZCA9PSBOVU1BX05PX05PREUpXG4rXHRcdHJldHVybiBOT1RJRllfRE9ORTtcbitcbitcdHJldCA9IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGRheF9uaWQsIG5lYXJlc3RfbmlkKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiBOT1RJRllfRE9ORTtcbitcbitcdHJldHVybiBOT1RJRllfT0s7XG4rfVxuK1xuIC8qKlxuICAqIGRldm1fY3hsX2FkZF9yZWdpb24gLSBBZGRzIGEgcmVnaW9uIHRvIGEgZGVjb2RlclxuICAqIEBjeGxyZDogcm9vdCBkZWNvZGVyXG5AQCAtMzg1Miw2ICszOTAxLDcgQEAgc3RhdGljIHZvaWQgc2h1dGRvd25fbm90aWZpZXJzKHZvaWQgKl9jeGxyKVxuIFxuIFx0dW5yZWdpc3Rlcl9ub2RlX25vdGlmaWVyKFx1MDAyNmN4bHItXHUwMDNlbm9kZV9ub3RpZmllcik7XG4gXHR1bnJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oXHUwMDI2Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllcik7XG4rXHR1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXHUwMDI2Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcmVtb3ZlX2RlYnVnZnModm9pZCAqZGVudHJ5KVxuQEAgLTQwNjYsNiArNDExNiwxMCBAQCBzdGF0aWMgaW50IGN4bF9yZWdpb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KVxuIFx0Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllci5wcmlvcml0eSA9IDEwMDtcbiBcdHJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oXHUwMDI2Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllcik7XG4gXG4rXHRjeGxyLVx1MDAzZXBhY2thZ2Vfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZTtcbitcdGN4bHItXHUwMDNlcGFja2FnZV9ub3RpZmllci5wcmlvcml0eSA9IDEwMDtcbitcdHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXHUwMDI2Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyKTtcbitcbiBcdHJjID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KFx1MDAyNmN4bHItXHUwMDNlZGV2LCBzaHV0ZG93bl9ub3RpZmllcnMsIGN4bHIpO1xuIFx0aWYgKHJjKVxuIFx0XHRyZXR1cm4gcmM7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9jeGwvY3hsLmggYi9kcml2ZXJzL2N4bC9jeGwuaFxuaW5kZXggMTI5NzU5NGJlYWVjMy4uOTI4MWNhM2E1ZjBmOCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvY3hsL2N4bC5oXG4rKysgYi9kcml2ZXJzL2N4bC9jeGwuaFxuQEAgLTQ3Nyw2ICs0NzcsNyBAQCBzdHJ1Y3QgY3hsX3JlZ2lvbiB7XG4gXHRzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgY29vcmRbQUNDRVNTX0NPT1JESU5BVEVfTUFYXTtcbiBcdHN0cnVjdCBub3RpZmllcl9ibG9jayBub2RlX25vdGlmaWVyO1xuIFx0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFkaXN0X25vdGlmaWVyO1xuK1x0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhY2thZ2Vfbm90aWZpZXI7XG4gfTtcbiBcbiBzdHJ1Y3QgY3hsX252ZGltbV9icmlkZ2Uge1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGF4L2ttZW0uYyBiL2RyaXZlcnMvZGF4L2ttZW0uY1xuaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZGF4L2ttZW0uY1xuKysrIGIvZHJpdmVycy9kYXgva21lbS5jXG5AQCAtOTQsNiArOTQsOSBAQCBzdGF0aWMgaW50IGRldl9kYXhfa21lbV9wcm9iZShzdHJ1Y3QgZGV2X2RheCAqZGV2X2RheClcbiBcdGlmIChJU19FUlIobXR5cGUpKVxuIFx0XHRyZXR1cm4gUFRSX0VSUihtdHlwZSk7XG4gXG4rXHQvKiBSZXNvbHZlIHRoZSBtZW1vcnkgcGFja2FnZSBmb3IgdGhpcyBuZXdseSBvbmxpbmVkIGttZW0gbm9kZS4gKi9cbitcdG1wX3Byb2JlX3BhY2thZ2VfaWQobnVtYV9ub2RlKTtcbitcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRldl9kYXgtXHUwMDNlbnJfcmFuZ2U7IGkrKykge1xuIFx0XHRzdHJ1Y3QgcmFuZ2UgcmFuZ2U7XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmhcbmluZGV4IDc5OTljNTg2MjllZWIuLmY4Nzc4YzQzNDI5ZmIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG5AQCAtNTIsMTAgKzUyLDI1IEBAIGludCBtdF9wZXJmX3RvX2FkaXN0YW5jZShzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgKnBlcmYsIGludCAqYWRpc3QpO1xuIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm10X2ZpbmRfYWxsb2NfbWVtb3J5X3R5cGUoaW50IGFkaXN0LFxuIFx0XHRcdFx0XHRcdCAgc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcbiB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcbitcbitpbnQgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcbit2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcbitpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKTtcbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpO1xuK2ludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpO1xuK2ludCBtcF9nZXRfcGFja2FnZV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xuK2ludCBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbitpbnQgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbitib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKTtcbiAjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG4gaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTtcbiB2b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKTtcbiBib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSk7XG4rXG4raW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbitpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpO1xuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpO1xuICNlbHNlXG4gc3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG4ge1xuQEAgLTcxLDYgKzg2LDMwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXG4ge1xuIFx0cmV0dXJuIHRydWU7XG4gfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuK3tcbitcdGlmIChvdXQpXG4rXHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1x0cmV0dXJuIC1FTk9FTlQ7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiBOVU1BX05PX05PREU7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRpZiAob3V0KVxuK1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbitcdHJldHVybiAtRU5PRU5UO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbit9XG4gI2VuZGlmXG4gXG4gI2Vsc2VcbkBAIC0xNTEsNSArMTkwLDc5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3QsXG4gc3RhdGljIGlubGluZSB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKVxuIHtcbiB9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxuK3tcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIE5PVElGWV9ET05FO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9nZXRfcGFja2FnZV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKG91dClcbitcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRpZiAob3V0KVxuK1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbitcdHJldHVybiAtRU5PRU5UO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKG91dClcbitcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKG91dClcbitcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuK3tcbitcdGlmIChvdXQpXG4rXHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1x0cmV0dXJuIC1FTk9FTlQ7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbit7XG4rXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuK31cbiAjZW5kaWZcdC8qIENPTkZJR19OVU1BICovXG4gI2VuZGlmICAvKiBfTElOVVhfTUVNT1JZX1RJRVJTX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L251bWEuaCBiL2luY2x1ZGUvbGludXgvbnVtYS5oXG5pbmRleCBlNmJhYWY2MDUxYmNmLi40ZjJhMGMzNDQxMjJhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9udW1hLmhcbisrKyBiL2luY2x1ZGUvbGludXgvbnVtYS5oXG5AQCAtMzMsNiArMzMsOCBAQCBpbnQgbnVtYV9uZWFyZXN0X25vZGUoaW50IG5vZGUsIHVuc2lnbmVkIGludCBzdGF0ZSk7XG4gXG4gaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzayk7XG4gXG4raW50IG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2soaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKm1hc2ssIG5vZGVtYXNrX3QgKm91dCk7XG4rXG4gI2lmbmRlZiBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZFxuIGludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgc3RhcnQpO1xuICNlbmRpZlxuQEAgLTU0LDYgKzU2LDE1IEBAIHN0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzaylcbiBcdHJldHVybiBOVU1BX05PX05PREU7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2soaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKm1hc2ssXG4rXHRcdFx0XHRcdCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKCFvdXQpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gc3RhdGljIGlubGluZSBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KVxuIHtcbiBcdHJldHVybiAwO1xuZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmNcbmluZGV4IDU0ODUxZDhhMTk1YjAuLjU5MzJkZjMxNTYwNGEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xuKysrIGIvbW0vbWVtb3J5LXRpZXJzLmNcbkBAIC0xLDQgKzEsNSBAQFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbG9ja2RlcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3lzZnMuaFx1MDAzZVxuQEAgLTUxLDYgKzUyLDExIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xuIFx0LmRldl9uYW1lID0gXCJtZW1vcnlfdGllclwiLFxuIH07XG4gXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBwYWNrYWdlX3N1YnN5cyA9IHtcbitcdC5uYW1lID0gXCJwYWNrYWdlXCIsXG4rXHQuZGV2X25hbWUgPSBcInBhY2thZ2VcIixcbit9O1xuK1xuICNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbiAvKipcbiAgKiBmb2xpb191c2VfYWNjZXNzX3RpbWUgLSBjaGVjayBpZiBhIGZvbGlvIHJldXNlcyBjcHVwaWQgZm9yIHBhZ2UgYWNjZXNzIHRpbWVcbkBAIC0xMDA3LDMgKzEwMTMsMTAwNiBAQCBzdGF0aWMgaW50IF9faW5pdCBudW1hX2luaXRfc3lzZnModm9pZClcbiBzdWJzeXNfaW5pdGNhbGwobnVtYV9pbml0X3N5c2ZzKTtcbiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovXG4gI2VuZGlmXG4rXG4rLyoqXG4rICogZW51bSBtcF9ub2Rlc190eXBlIC0gU2VsZWN0b3IgZm9yIHdoaWNoIHN1YnNldCBvZiBhIHBhY2thZ2UgdG8gcmV0dXJuXG4rICogQE1QX05PREVTX0FMTDogICAgICAgQWxsIE5VTUEgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhlIHBhY2thZ2UuXG4rICogQE1QX05PREVTX0NQVTogICAgICAgT25seSBDUFUgbm9kZXMgaW4gdGhlIHBhY2thZ2UuXG4rICogQE1QX05PREVTX01FTV9PTkxZOiAgT25seSBtZW1vcnktb25seSBub2RlcyAoZS5nLiBDWEwvSEJNKSBpbiB0aGUgcGFja2FnZS5cbisgKlxuKyAqIFVzZWQgaW50ZXJuYWxseSB0byBjaG9vc2Ugd2hpY2ggbm9kZW1hc2sgdG8gZXhwb3NlIGZvciBhIGdpdmVuIHBhY2thZ2UuXG4rICovXG4rZW51bSBtcF9ub2Rlc190eXBlIHtcbitcdE1QX05PREVTX0FMTCxcbitcdE1QX05PREVTX0NQVSxcbitcdE1QX05PREVTX01FTV9PTkxZXG4rfTtcbitcbisvKipcbisgKiBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgLSBQZXItcGh5c2ljYWwtcGFja2FnZSBjb250YWluZXJcbisgKiBAcGFja2FnZV9pZDogICAgICAgICAgUGh5c2ljYWwgcGFja2FnZSBpZCAoZnJvbSB0b3BvbG9neSkuXG4rICogQG5vZGVzOiAgICAgICAgICAgICAgIE5vZGVtYXNrIG9mIGFsbCBtZW1iZXIgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxuKyAqIEBjcHVfbm9kZXM6ICAgICAgICAgICBOb2RlbWFzayBvZiBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxuKyAqIEBtZW1vcnlfb25seV9ub2RlczogICBOb2RlbWFzayBvZiBtZW1vcnktb25seSBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXG4rICogQGNwdV9saXN0OiAgICAgICAgICAgIExpc3QgaGVhZCBvZiBDUFUtdHlwZSBtZW1iZXJzLlxuKyAqIEBtZW1vcnlfb25seV9saXN0OiAgICBMaXN0IGhlYWQgb2YgbWVtb3J5LW9ubHkgbWVtYmVycy5cbisgKiBAbGlzdDogICAgICAgICAgICAgICAgTGlua2FnZSBvbiB0aGUgZ2xvYmFsIEBtZW1vcnlfcGFja2FnZXMgbGlzdC5cbisgKiBAZGV2OiAgICAgICAgICAgICAgICAgc3lzZnMgZGV2aWNlIGZvciB0aGlzIHBhY2thZ2UuXG4rICpcbisgKiBBIG1lbW9yeV9wYWNrYWdlIGdyb3VwcyBOVU1BIG5vZGVzIHRoYXQgc2hhcmUgdGhlIHNhbWUgcGh5c2ljYWwgQ1BVIHBhY2thZ2UuXG4rICogVGhlIG1hc2tzIGFyZSB1c2VkIHRvIGltcGxlbWVudCBwYWNrYWdlLWxvY2FsIHBsYWNlbWVudC9kZW1vdGlvbi9wcm9tb3Rpb24uXG4rICovXG4rc3RydWN0IG1lbW9yeV9wYWNrYWdlIHtcbitcdGludCBwYWNrYWdlX2lkO1xuK1x0bm9kZW1hc2tfdCBub2RlcztcbitcdG5vZGVtYXNrX3QgY3B1X25vZGVzO1xuK1x0bm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlcztcbitcdHN0cnVjdCBsaXN0X2hlYWQgY3B1X2xpc3Q7XG4rXHRzdHJ1Y3QgbGlzdF9oZWFkIG1lbW9yeV9vbmx5X2xpc3Q7XG4rXHRzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7XG4rXHRzdHJ1Y3QgZGV2aWNlIGRldjtcbit9O1xuK1xuKy8qKlxuKyAqIGVudW0gbXBuX3NvdXJjZV9mbGFncyAtIFNvdXJjZSB1c2VkIHRvIHJlc29sdmUgYSBub2RlJ3MgcGFja2FnZSBtZW1iZXJzaGlwXG4rICogQE1QTl9TUkNfVU5LTk9XTjogICAgIFVua25vd24vdW5zcGVjaWZpZWQuXG4rICogQE1QTl9TUkNfQ1BVOiAgICAgICAgIERpcmVjdGx5IHJlc29sdmVkIGZyb20gYSBDUFUgbm9kZSAoMToxKS5cbisgKiBATVBOX1NSQ19JTklUSUFUT1I6ICAgUmVzb2x2ZWQgdmlhIGFuIGluaXRpYXRvciBDUFUgbm9kZSBwcm92aWRlZCBieSBhIGRyaXZlci5cbisgKiBATVBOX1NSQ19TTElUOiAgICAgICAgUmVzb2x2ZWQgdmlhIFNMSVQvbmVhcmVzdC1ub2RlLlxuKyAqXG4rICogVGhlc2UgZmxhZ3MgYXJlIGluZm9ybWF0aW9uYWw7IHRoZXkgZGVzY3JpYmUgaG93IGEgZ2l2ZW4gbm9kZSB3YXMgYm91bmQgdG9cbisgKiBpdHMgcGFja2FnZSBhbmQgaGVscCB3aXRoIHBvbGljeSBkZWNpc2lvbnMgbGF0ZXIuXG4rICovXG4rZW51bSBtcG5fc291cmNlX2ZsYWdzIHtcbitcdE1QTl9TUkNfVU5LTk9XTlx0XHQ9IDAsXG4rXHRNUE5fU1JDX0NQVVx0XHQ9IEJJVCgxKSxcbitcdE1QTl9TUkNfSU5JVElBVE9SXHQ9IEJJVCgyKSxcbitcdE1QTl9TUkNfU0xJVFx0XHQ9IEJJVCgzKVxuK307XG4rXG4rLyoqXG4rICogc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgLSBQZXItbm9kZSBtZW1iZXJzaGlwIGFuZCBwcmVmZXJlbmNlc1xuKyAqIEBuaWQ6ICAgICAgICAgICAgICBOVU1BIG5vZGUgaWQgZm9yIHRoaXMgZW50cnkuXG4rICogQGluaXRpYXRvcl9uaWQ6ICAgIENQVSBuaWQgdGhhdCBzZXJ2ZWQgYXMgdGhlIGluaXRpYXRvciB3aGVuIHJlc29sdmluZyBAbmlkLlxuKyAqIEBwYWNrYWdlX2lkOiAgICAgICBSZXNvbHZlZCBwYWNrYWdlIGlkIHRoYXQgQG5pZCBiZWxvbmdzIHRvLlxuKyAqIEBzb3VyY2VfZmxhZ3M6ICAgICBPbmUgb2YgXHUwMDI2ZW51bSBtcG5fc291cmNlX2ZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlc29sdXRpb24uXG4rICogQHByZWZlcnJlZDogICAgICAgIE9wcG9zaXRlLXR5cGUgbmVhcmVzdCBjYW5kaWRhdGVzIGluc2lkZSB0aGUgc2FtZSBwYWNrYWdlLlxuKyAqIEBwYWNrYWdlOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvd25pbmcgXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlIChOVUxMIHVudGlsIGJvdW5kKS5cbisgKiBAcGFja2FnZV9lbnRyeTogICAgTGlua2FnZSBvbiB0aGUgb3duaW5nIHBhY2thZ2UncyB0eXBlIGxpc3QuXG4rICpcbisgKiBFYWNoIE5VTUEgbm9kZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBwYWNrYWdlLWF3YXJlIHBvbGljeSBnZXRzIGEgd3JhcHBlciBlbnRyeVxuKyAqIHRoYXQgY2FjaGVzIHBhY2thZ2UgbWVtYmVyc2hpcCBhbmQgdGhlIHByZWNvbXB1dGVkIHNldCBvZiBwcmVmZXJyZWQgdGFyZ2V0cy5cbisgKi9cbitzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSB7XG4rXHRpbnQgbmlkO1xuK1x0aW50IGluaXRpYXRvcl9uaWQ7XG4rXHRpbnQgcGFja2FnZV9pZDtcbitcdGludCBzb3VyY2VfZmxhZ3M7XG4rXHRub2RlbWFza190IHByZWZlcnJlZDtcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqcGFja2FnZTtcbitcdHN0cnVjdCBsaXN0X2hlYWQgcGFja2FnZV9lbnRyeTtcbit9O1xuK1xuKyNkZWZpbmUgbm9kZV9pc19tZW1vcnlfb25seShfbmlkKSBcXFxuK1x0KG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgXHUwMDI2XHUwMDI2ICFub2RlX3N0YXRlKChfbmlkKSwgTl9DUFUpKVxuK1xuK3N0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKG1wX3BhY2thZ2VfYWxnb3JpdGhtcyk7XG4rXG4rc3RhdGljIExJU1RfSEVBRChtZW1vcnlfcGFja2FnZXMpO1xuK3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuc1tNQVhfTlVNTk9ERVNdO1xuK3N0YXRpYyBERUZJTkVfTVVURVgobWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXG4rLypcbisgKiBSQ1Ugc25hcHNob3Qgb2YgdGhlIHBhY2thZ2UgdG9wb2xvZ3kuIFRoZSBhbGxvY2F0aW9uIHBhdGggcmVhZHMgaXRcbisgKiBvZnRlbiwgc28gaXQgaXMgcHVibGlzaGVkIGZvciBsb2NrbGVzcyByZWFkcyBpbnN0ZWFkIG9mIGxvY2tpbmcgb25cbisgKiBldmVyeSBhY2Nlc3MuXG4rICovXG4rc3RydWN0IG1wX3NuYXBzaG90IHtcbitcdHN0cnVjdCByY3VfaGVhZCByY3U7XG4rXHRpbnQgbnJfcGFja2FnZXM7XG4rXHRpbnQgcGtnX29mW01BWF9OVU1OT0RFU107XG4rXHRzdHJ1Y3Qge1xuK1x0XHRub2RlbWFza190IG5vZGVzO1xuK1x0XHRub2RlbWFza190IGNwdV9ub2RlcztcbitcdFx0bm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlcztcbitcdH0gcGtnW107XG4rfTtcbitcbitzdGF0aWMgc3RydWN0IG1wX3NuYXBzaG90IF9fcmN1ICptcF9zbmFwc2hvdDtcbitcbisvKipcbisgKiByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gUmVnaXN0ZXIgYSBwYWNrYWdlIHJlc29sdXRpb24gYWxnb3JpdGhtXG4rICogQG5vdGlmaWVyOiBOb3RpZmllciBjYWxsZWQgd2l0aCB0aGUgbmlkIHRvIHJlc29sdmUgKHNlZSBtcF9wcm9iZV9wYWNrYWdlX2lkKCkpLlxuKyAqXG4rICogRHJpdmVycyAoZS5nLiwgQ1hMIHJlZ2lvbi9kZWNvZGVyIGNvZGUpIHJlZ2lzdGVyIGhlcmUgdG8gc3VwcGx5IGEgcGFja2FnZVxuKyAqIGhpbnQgZm9yIG5ld2x5IGFwcGVhcmluZyBub2Rlcy4gVGhlIG5vdGlmaWVyIGlzIGludm9rZWQgZHVyaW5nIG5pZC1cdTAwM2VwYWNrYWdlXG4rICogcmVzb2x1dGlvbi5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxuKyAqL1xuK2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4re1xuK1x0cmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKFx1MDAyNm1wX3BhY2thZ2VfYWxnb3JpdGhtcywgbm90aWZpZXIpO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKTtcbitcbisvKipcbisgKiB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIgLSBVbnJlZ2lzdGVyIGEgcGFja2FnZSByZXNvbHV0aW9uIGFsZ29yaXRobVxuKyAqIEBub3RpZmllcjogTm90aWZpZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcigpLlxuKyAqL1xuK3ZvaWQgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4re1xuK1x0YmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcihcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKTtcbitcbisvKipcbisgKiBtcF9wcm9iZV9wYWNrYWdlX2lkIC0gSW52b2tlIHJlZ2lzdGVyZWQgbm90aWZpZXJzIHRvIHJlc29sdmUgYSBub2RlJ3MgcGFja2FnZVxuKyAqIEBuaWQ6IE5VTUEgbm9kZSBpZCB0byByZXNvbHZlLlxuKyAqXG4rICogQ2FsbHMgdGhlIGJsb2NraW5nIG5vdGlmaWVyIGNoYWluIHRvIGxldCBzdWJzeXN0ZW1zIHByb3ZpZGUgYW4gaW5pdGlhdG9yIG9yXG4rICogcGFja2FnZSBpZCBmb3IgQG5pZC5cbisgKlxuKyAqIFJldHVybjogTm90aWZpZXIgcmV0dXJuIGNvZGUgKFx1MDAzZT0wIHR5cGljYWxseSk7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXG4rICovXG4raW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZClcbit7XG4rXHRyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbihcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5pZCwgTlVMTCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX3Byb2JlX3BhY2thZ2VfaWQpO1xuK1xuK3N0YXRpYyBpbnQgbXBfbm9kZV90b19wYWNrYWdlX2lkKGludCBuaWQpXG4re1xuK1x0aW50IHBhY2thZ2VfaWQ7XG4rXHR1bnNpZ25lZCBpbnQgZmlyc3RfY3B1O1xuK1x0Y29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXNrO1xuK1xuK1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9DUFUpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGNwdV9tYXNrID0gY3B1bWFza19vZl9ub2RlKG5pZCk7XG4rXHRpZiAoY3B1bWFza19lbXB0eShjcHVfbWFzaykpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0Zmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfbWFzayk7XG4rXHRpZiAoZmlyc3RfY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRwYWNrYWdlX2lkID0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChmaXJzdF9jcHUpO1xuK1x0aWYgKHBhY2thZ2VfaWQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0cmV0dXJuIHBhY2thZ2VfaWQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0LypcbitcdCAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0XG4rXHQgKiBtZW1vcnktb25seSBub2RlKHMpIHdpdGhpbiB0aGUgc2FtZSBwYWNrYWdlLiBJZiB0aGUgcGFja2FnZSBoYXNcbitcdCAqIG5vIG1lbW9yeS1vbmx5IG5vZGVzLCBmYWxsIGJhY2sgdG8gYSBzZWxmLXJlZmVyZW5jZSBzbyBjYWxsZXJzXG4rXHQgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC5cbitcdCAqL1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcG4sIFx1MDAyNm1wLVx1MDAzZWNwdV9saXN0LCBwYWNrYWdlX2VudHJ5KSB7XG4rXHRcdG5vZGVzX2NsZWFyKG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuK1x0XHRpZiAoIW5vZGVzX2VtcHR5KG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKSlcbitcdFx0XHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cdTAwM2VuaWQsIFx1MDAyNm1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2bXBuLVx1MDAzZXByZWZlcnJlZCk7XG4rXHRcdGVsc2VcbitcdFx0XHRub2RlX3NldChtcG4tXHUwMDNlbmlkLCBtcG4tXHUwMDNlcHJlZmVycmVkKTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBTeW1tZXRyaWNhbGx5LCBmb3IgZWFjaCBtZW1vcnktb25seSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0XG4rXHQgKiBhcyB0aGUgbmVhcmVzdCBDUFUgbm9kZShzKSB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZS4gSWYgdGhlIHBhY2thZ2VcbitcdCAqIGhhcyBubyBDUFUgbm9kZXMsIGZhbGwgYmFjayB0byBhIHNlbGYtcmVmZXJlbmNlLlxuK1x0ICovXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wbiwgXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbGlzdCwgcGFja2FnZV9lbnRyeSkge1xuK1x0XHRub2Rlc19jbGVhcihtcG4tXHUwMDNlcHJlZmVycmVkKTtcbitcdFx0aWYgKCFub2Rlc19lbXB0eShtcC1cdTAwM2VjcHVfbm9kZXMpKVxuK1x0XHRcdG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2sobXBuLVx1MDAzZW5pZCwgXHUwMDI2bXAtXHUwMDNlY3B1X25vZGVzLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2bXBuLVx1MDAzZXByZWZlcnJlZCk7XG4rXHRcdGVsc2VcbitcdFx0XHRub2RlX3NldChtcG4tXHUwMDNlbmlkLCBtcG4tXHUwMDNlcHJlZmVycmVkKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG1lbW9yeV9wYWNrYWdlX2lzX2VtcHR5KHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXApXG4re1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdHJldHVybiAobm9kZXNfZW1wdHkobXAtXHUwMDNlY3B1X25vZGVzKSBcdTAwMjZcdTAwMjYgbm9kZXNfZW1wdHkobXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBhY2thZ2Vfbm9kZV9pc192YWxpZChpbnQgbmlkKVxuK3tcbitcdGlmICghbXBuc1tuaWRdKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRpZiAobm9kZXNfZW1wdHkobXBuc1tuaWRdLVx1MDAzZXByZWZlcnJlZCkgfHwgKG1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlID09IE5VTEwpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1lbW9yeV9wYWNrYWdlX2dyb3Vwc1tdO1xuK1xuKy8qIEZyZWVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBwYWNrYWdlJ3Mgc3lzZnMgZGV2aWNlIGlzIGRyb3BwZWQuICovXG4rc3RhdGljIHZvaWQgbWVtb3J5X3BhY2thZ2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1vcnlfcGFja2FnZSwgZGV2KTtcbitcbitcdGtmcmVlKG1wKTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqY3JlYXRlX21lbW9yeV9wYWNrYWdlKGludCBwYWNrYWdlX2lkKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZTtcbitcdGludCByZXQ7XG4rXG4rXHRtZW1wYWNrYWdlID0ga3phbGxvY19vYmooKm1lbXBhY2thZ2UpO1xuK1x0aWYgKCFtZW1wYWNrYWdlKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbitcbitcdG1lbXBhY2thZ2UtXHUwMDNlcGFja2FnZV9pZCA9IHBhY2thZ2VfaWQ7XG4rXHRtZW1wYWNrYWdlLVx1MDAzZW5vZGVzID0gTk9ERV9NQVNLX05PTkU7XG4rXHRtZW1wYWNrYWdlLVx1MDAzZWNwdV9ub2RlcyA9IE5PREVfTUFTS19OT05FO1xuK1x0bWVtcGFja2FnZS1cdTAwM2VtZW1vcnlfb25seV9ub2RlcyA9IE5PREVfTUFTS19OT05FO1xuK1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VjcHVfbGlzdCk7XG4rXHRJTklUX0xJU1RfSEVBRChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZW1lbW9yeV9vbmx5X2xpc3QpO1xuK1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VsaXN0KTtcbitcdGRldmljZV9pbml0aWFsaXplKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbitcdG1lbXBhY2thZ2UtXHUwMDNlZGV2LnJlbGVhc2UgPSBtZW1vcnlfcGFja2FnZV9yZWxlYXNlO1xuK1x0ZGV2X3NldF9kcnZkYXRhKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2LCBtZW1wYWNrYWdlKTtcbitcdG1lbXBhY2thZ2UtXHUwMDNlZGV2LmJ1cyA9IFx1MDAyNnBhY2thZ2Vfc3Vic3lzO1xuK1x0bWVtcGFja2FnZS1cdTAwM2VkZXYuZ3JvdXBzID0gbWVtb3J5X3BhY2thZ2VfZ3JvdXBzO1xuK1x0cmV0ID0gZGV2X3NldF9uYW1lKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2LCBcInBhY2thZ2UlZFwiLCBwYWNrYWdlX2lkKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHV0X2RldmljZShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldik7XG4rXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gbWVtcGFja2FnZTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptZW1wYWNrYWdlLCAqZXhpc3Rpbmc7XG4rXHRpbnQgcmV0O1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtcGFja2FnZSwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XG4rXHRcdGlmIChtZW1wYWNrYWdlLVx1MDAzZXBhY2thZ2VfaWQgPT0gcGFja2FnZV9pZCkge1xuK1x0XHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdFx0XHRyZXR1cm4gbWVtcGFja2FnZTtcbitcdFx0fVxuK1x0fVxuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0bWVtcGFja2FnZSA9IGNyZWF0ZV9tZW1vcnlfcGFja2FnZShwYWNrYWdlX2lkKTtcbitcdGlmIChJU19FUlIobWVtcGFja2FnZSkpXG4rXHRcdHJldHVybiBtZW1wYWNrYWdlO1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnkoZXhpc3RpbmcsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xuK1x0XHRpZiAoZXhpc3RpbmctXHUwMDNlcGFja2FnZV9pZCA9PSBwYWNrYWdlX2lkKSB7XG4rXHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0XHRcdHB1dF9kZXZpY2UoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VkZXYpO1xuK1x0XHRcdHJldHVybiBleGlzdGluZztcbitcdFx0fVxuK1x0fVxuK1x0bGlzdF9hZGQoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VsaXN0LCBcdTAwMjZtZW1vcnlfcGFja2FnZXMpO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0cmV0ID0gZGV2aWNlX2FkZChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldik7XG4rXHRpZiAocmV0KSB7XG4rXHRcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRcdGxpc3RfZGVsKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlbGlzdCk7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdFx0cHV0X2RldmljZShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldik7XG4rXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gbWVtcGFja2FnZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbXBfc25hcHNob3RfcmVidWlsZCh2b2lkKVxuK3tcbitcdHN0cnVjdCBtcF9zbmFwc2hvdCAqbmV3LCAqb2xkO1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcbitcdGludCBuciA9IDAsIGkgPSAwLCBuaWQ7XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcCwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KVxuK1x0XHRucisrO1xuK1xuK1x0bmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIW5ldylcbitcdFx0cmV0dXJuO1xuK1xuK1x0bWVtc2V0KG5ldy1cdTAwM2Vwa2dfb2YsIDB4ZmYsIHNpemVvZihuZXctXHUwMDNlcGtnX29mKSk7XG4rXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcbitcdFx0bmV3LVx1MDAzZXBrZ1tpXS5ub2RlcyA9IG1wLVx1MDAzZW5vZGVzO1xuK1x0XHRuZXctXHUwMDNlcGtnW2ldLmNwdV9ub2RlcyA9IG1wLVx1MDAzZWNwdV9ub2RlcztcbitcdFx0bmV3LVx1MDAzZXBrZ1tpXS5tZW1vcnlfb25seV9ub2RlcyA9IG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzO1xuK1x0XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBtcC1cdTAwM2Vub2RlcylcbitcdFx0XHRuZXctXHUwMDNlcGtnX29mW25pZF0gPSBpO1xuK1x0XHRpKys7XG4rXHR9XG4rXHRuZXctXHUwMDNlbnJfcGFja2FnZXMgPSBucjtcbitcbitcdG9sZCA9IHJjdV9yZXBsYWNlX3BvaW50ZXIobXBfc25hcHNob3QsIG5ldyxcbitcdFx0XHRcdCAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spKTtcbitcdGlmIChvbGQpXG4rXHRcdGt2ZnJlZV9yY3Uob2xkLCByY3UpO1xuK31cbitcbitzdGF0aWMgaW50IGJpbmRfbm9kZV90b19wYWNrYWdlKGludCBuaWQpXG4re1xuK1x0aW50IHBhY2thZ2VfaWQsIHBrZ19pZDtcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXA7XG4rXHRub2RlbWFza190IG5vZGVzLCBjcHUsIG1lbTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRpZiAoIW1wbnNbbmlkXSkge1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1x0cGFja2FnZV9pZCA9IG1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2lkO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0bXAgPSBmaW5kX2NyZWF0ZV9tZW1vcnlfcGFja2FnZShwYWNrYWdlX2lkKTtcbitcdGlmIChJU19FUlIobXApKVxuK1x0XHRyZXR1cm4gUFRSX0VSUihtcCk7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0aWYgKCFtcG5zW25pZF0pIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbitcdG1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlID0gbXA7XG4rXHRub2RlX3NldChtcG5zW25pZF0tXHUwMDNlbmlkLCBtcC1cdTAwM2Vub2Rlcyk7XG4rXHRpZiAobm9kZV9pc19tZW1vcnlfb25seShtcG5zW25pZF0tXHUwMDNlbmlkKSkge1xuK1x0XHRub2RlX3NldChtcG5zW25pZF0tXHUwMDNlbmlkLCBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XG4rXHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VtZW1vcnlfb25seV9saXN0KTtcbitcdH0gZWxzZSB7XG4rXHRcdG5vZGVfc2V0KG1wbnNbbmlkXS1cdTAwM2VuaWQsIG1wLVx1MDAzZWNwdV9ub2Rlcyk7XG4rXHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VjcHVfbGlzdCk7XG4rXHR9XG4rXHR1cGRhdGVfcGFja2FnZV9wcmVmZXJyZWQobXApO1xuK1x0bXBfc25hcHNob3RfcmVidWlsZCgpO1xuK1x0cGtnX2lkID0gbXAtXHUwMDNlcGFja2FnZV9pZDtcbitcdG5vZGVzID0gbXAtXHUwMDNlbm9kZXM7XG4rXHRjcHUgPSBtcC1cdTAwM2VjcHVfbm9kZXM7XG4rXHRtZW0gPSBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2RlcztcbitcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdHByX2luZm8oXCJtZW1vcnlfcGFja2FnZSAlZDogbm9kZXM9JSpwYmwgY3B1PSUqcGJsIG1lbW9yeV9vbmx5PSUqcGJsXFxuXCIsXG4rXHRcdHBrZ19pZCwgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZub2RlcyksXG4rXHRcdG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2Y3B1KSwgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZtZW0pKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCB1bmJpbmRfbm9kZV90b19wYWNrYWdlKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsIGludCBuaWQpXG4re1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2Vub2Rlcyk7XG4rXHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSlcbitcdFx0bm9kZV9jbGVhcihuaWQsIG1wLVx1MDAzZWNwdV9ub2Rlcyk7XG4rXHRlbHNlXG4rXHRcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XG4rXG4rXHRpZiAobXBuc1tuaWRdKVxuK1x0XHRsaXN0X2RlbChcdTAwMjZtcG5zW25pZF0tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4rXG4rXHR1cGRhdGVfcGFja2FnZV9wcmVmZXJyZWQobXApO1xuK31cbitcbitzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKmNyZWF0ZV9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4re1xuK1x0aW50IGNwdV9uaWQsIHBhY2thZ2VfaWQ7XG4rXHRpbnQgc291cmNlX2ZsYWdzO1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjtcbitcbitcdGlmIChub2RlX3N0YXRlKG5pZCwgTl9DUFUpKSB7XG4rXHRcdGNwdV9uaWQgPSBuaWQ7XG4rXHRcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfQ1BVO1xuK1x0fSBlbHNlIHtcbitcdFx0aWYgKGluaXRpYXRvcl9uaWQgXHUwMDNlPSAwKSB7XG4rXHRcdFx0Y3B1X25pZCA9IGluaXRpYXRvcl9uaWQ7XG4rXHRcdFx0c291cmNlX2ZsYWdzID0gTVBOX1NSQ19JTklUSUFUT1I7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBObyBkcml2ZXItc3VwcGxpZWQgaW5pdGlhdG9yOiBmYWxsIGJhY2sgdG8gdGhlXG4rXHRcdFx0ICogbmVhcmVzdCBDUFUgbm9kZSAodmlhIFNMSVQvbnVtYV9kaXN0YW5jZSkuXG4rXHRcdFx0ICovXG4rXHRcdFx0Y3B1X25pZCA9IG51bWFfbmVhcmVzdF9ub2RlKG5pZCwgTl9DUFUpO1xuK1x0XHRcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfU0xJVDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cGFja2FnZV9pZCA9IG1wX25vZGVfdG9fcGFja2FnZV9pZChjcHVfbmlkKTtcbitcdGlmIChwYWNrYWdlX2lkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbitcbitcdG1wbiA9IGt6YWxsb2Nfb2JqKCptcG4pO1xuK1x0aWYgKCFtcG4pXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1xuK1x0bXBuLVx1MDAzZW5pZCA9IG5pZDtcbitcdG1wbi1cdTAwM2Vpbml0aWF0b3JfbmlkID0gY3B1X25pZDtcbitcdG1wbi1cdTAwM2VwYWNrYWdlX2lkID0gcGFja2FnZV9pZDtcbitcdG1wbi1cdTAwM2Vzb3VyY2VfZmxhZ3MgPSBzb3VyY2VfZmxhZ3M7XG4rXHRtcG4tXHUwMDNlcHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7XG4rXHRtcG4tXHUwMDNlcGFja2FnZSA9IE5VTEw7XG4rXHRJTklUX0xJU1RfSEVBRChcdTAwMjZtcG4tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4rXG4rXHRyZXR1cm4gbXBuO1xuK31cbitcbisvKlxuKyAqIFRvcG9sb2d5IHN5bW1ldHJ5IHN0YXR1c1xuKyAqIEluZGljYXRlcyB3aGV0aGVyIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxuKyAqIChzYW1lIG51bWJlciBvZiBDUFUgbm9kZXMgYW5kIG1lbW9yeS1vbmx5IG5vZGVzKS5cbisgKi9cbitzdGF0aWMgYm9vbCB0b3BvbG9neV9zeW1tZXRyaWM7XG4rXG4rc3RhdGljIHZvaWQgdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkodm9pZCk7XG4rXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqX19kZXN0cm95X3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XG4rXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCAqdW5yZWdfbXAgPSBOVUxMO1xuK1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdG1wbiA9IG1wbnNbbmlkXTtcbitcdGlmICghbXBuKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdG1wID0gbXBuLVx1MDAzZXBhY2thZ2U7XG4rXHRpZiAobXApIHtcbitcdFx0dW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTtcbitcdFx0bXBuLVx1MDAzZXBhY2thZ2UgPSBOVUxMO1xuK1xuK1x0XHRpZiAobWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkobXApKSB7XG4rXHRcdFx0bGlzdF9kZWwoXHUwMDI2bXAtXHUwMDNlbGlzdCk7XG4rXHRcdFx0dW5yZWdfbXAgPSBtcDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0bXBuc1tuaWRdID0gTlVMTDtcbitcdGtmcmVlKG1wbik7XG4rXHRtcF9zbmFwc2hvdF9yZWJ1aWxkKCk7XG4rXG4rXHRyZXR1cm4gdW5yZWdfbXA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdGlmICh1bnJlZ19tcClcbitcdFx0ZGV2aWNlX3VucmVnaXN0ZXIoXHUwMDI2dW5yZWdfbXAtXHUwMDNlZGV2KTtcbitcbitcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZmluZF9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcCA9IE5VTEw7XG4rXHRpbnQgcmV0ID0gbmlkO1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGlmICghbXBuc1tuaWRdKSB7XG4rXHRcdHJldCA9IE5VTUFfTk9fTk9ERTtcbitcdH0gZWxzZSBpZiAobXBuc1tuaWRdLVx1MDAzZXNvdXJjZV9mbGFncyA9PSBNUE5fU1JDX1NMSVQgXHUwMDI2XHUwMDI2IGluaXRpYXRvcl9uaWQgXHUwMDNlPSAwKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFNMSVQtZGVyaXZlZCBlbnRyaWVzIGFyZSBwcm92aXNpb25hbDsgaWYgYSBkcml2ZXIgbGF0ZXJcbitcdFx0ICogcHJvdmlkZXMgYW4gZXhwbGljaXQgaW5pdGlhdG9yLCBkcm9wIHRoZSBwcm92aXNpb25hbFxuK1x0XHQgKiBlbnRyeSBhbmQgcmVidWlsZCB3aXRoIHRoZSBzdHJvbmdlciBoaW50LlxuK1x0XHQgKi9cbitcdFx0dW5yZWdfbXAgPSBfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7XG4rXHRcdHJldCA9IE5VTUFfTk9fTk9ERTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdGlmICh1bnJlZ19tcClcbitcdFx0ZGV2aWNlX3VucmVnaXN0ZXIoXHUwMDI2dW5yZWdfbXAtXHUwMDNlZGV2KTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZmluZF9jcmVhdGVfcGFja2FnZV9ub2RlKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxuK3tcbitcdGludCBtcG5fbmlkO1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjtcbitcbitcdG1wbl9uaWQgPSBmaW5kX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xuK1x0aWYgKG1wbl9uaWQgIT0gTlVNQV9OT19OT0RFKVxuK1x0XHRyZXR1cm4gbXBuX25pZDtcbitcbitcdG1wbiA9IGNyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcbitcdGlmIChJU19FUlIobXBuKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIobXBuKTtcbitcbitcdGd1YXJkKG11dGV4KShcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGlmIChtcG5zW25pZF0pIHtcbitcdFx0a2ZyZWUobXBuKTtcbitcdFx0cmV0dXJuIG5pZDtcbitcdH1cbitcdG1wbnNbbmlkXSA9IG1wbjtcbitcbitcdHJldHVybiBuaWQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIE5VTUFfTk9fTk9ERSk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYmluZF9ub2RlX3RvX3BhY2thZ2UobmlkKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yIC0gQWRkIGEgbm9kZSB3aXRoIGFuIGluaXRpYXRvclxuKyAqIEBuaWQ6ICAgICAgICAgICAgVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4rICogQGluaXRpYXRvcl9uaWQ6ICBDUFUgbmlkIHVzZWQgdG8gcmVzb2x2ZSBAbmlkJ3MgcGFja2FnZSAoXHUwMDNlPTApLlxuKyAqXG4rICogRW5zdXJlcyB0aGF0IGEgXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgZXhpc3RzIGZvciBAbmlkIGFuZCB0aGF0IGl0c1xuKyAqIHBhY2thZ2VfaWQgaXMgZGV0ZXJtaW5lZCB1c2luZyBAaW5pdGlhdG9yX25pZCB3aGVuIHByb3ZpZGVkLiBCaW5kaW5nIHRvIHRoZVxuKyAqIHBhY2thZ2UgaXMgbm90IHBlcmZvcm1lZCBoZXJlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXG4rICovXG4raW50IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IpO1xuK1xuKy8qKlxuKyAqIG1wX2FkZF9wYWNrYWdlX25vZGUgLSBBZGQgYSBub2RlLCByZXNvbHZpbmcgcGFja2FnZSBhdXRvbWF0aWNhbGx5XG4rICogQG5pZDogVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4rICpcbisgKiBXcmFwcGVyIG92ZXIgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoKSB0aGF0IHJlcXVlc3RzIGF1dG9tYXRpY1xuKyAqIGluaXRpYXRvciByZXNvbHV0aW9uIChlLmcuLCBuZWFyZXN0IENQVSkuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS5cbisgKi9cbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGUpO1xuK1xuK3N0YXRpYyBpbnQgX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLFxuK1x0XHRcdFx0ICAgICBub2RlbWFza190ICpvdXQpXG4re1xuK1x0c3RydWN0IG1wX3NuYXBzaG90ICpzbmFwO1xuK1x0aW50IHBrZztcbitcbitcdGlmICghb3V0KVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1xuK1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0Z3VhcmQocmN1KSgpO1xuK1xuK1x0c25hcCA9IHJjdV9kZXJlZmVyZW5jZShtcF9zbmFwc2hvdCk7XG4rXHRpZiAoIXNuYXApXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0cGtnID0gc25hcC1cdTAwM2Vwa2dfb2ZbbmlkXTtcbitcdGlmIChwa2cgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0c3dpdGNoIChub2RlX3R5cGUpIHtcbitcdGNhc2UgTVBfTk9ERVNfQUxMOlxuK1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubm9kZXMpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTVBfTk9ERVNfQ1BVOlxuK1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10uY3B1X25vZGVzKTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIE1QX05PREVTX01FTV9PTkxZOlxuK1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubWVtb3J5X29ubHlfbm9kZXMpO1xuK1x0XHRicmVhaztcbitcdGRlZmF1bHQ6XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbitzdGF0aWMgaW50IF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLFxuK1x0XHRcdFx0ICAgIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdC8qIE5vIGhvdC1wYXRoIGNhbGxlcnM6IHRoZSBtdXRleCBpcyBmaW5lIGhlcmUuICovXG4rXHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXG4rXHRpZiAoIW91dCkge1xuK1x0XHRyZXQgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1xuK1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpIHtcbitcdFx0cmV0ID0gLUVJTlZBTDtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAobm9kZV90eXBlID09IE1QX05PREVTX0NQVSkge1xuK1x0XHRpZiAobm9kZV9pc19tZW1vcnlfb25seShuaWQpKSB7XG4rXHRcdFx0cmV0ID0gLUVJTlZBTDtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0fSBlbHNlIGlmIChub2RlX3R5cGUgPT0gTVBfTk9ERVNfTUVNX09OTFkpIHtcbitcdFx0aWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcbitcdFx0XHRyZXQgPSAtRUlOVkFMO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHRyZXQgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHtcbitcdFx0cmV0ID0gLUVOT0VOVDtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRub2Rlc19jb3B5KCpvdXQsIG1wbnNbbmlkXS1cdTAwM2VwcmVmZXJyZWQpO1xuK1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sgLSBEZW1vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2VcbisgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLlxuKyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayBvZiBuZWFyZXN0IG1lbW9yeS1vbmx5IHRhcmdldHMgaW4gdGhlIHNhbWUgcGFja2FnZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuKyAqL1xuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRyZXR1cm4gX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQ1BVLCBvdXQpO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKTtcbitcbisvKipcbisgKiBtcF9uZXh0X2RlbW90aW9uX25vZGUgLSBQaWNrIG9uZSBkZW1vdGlvbiB0YXJnZXRcbisgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLlxuKyAqXG4rICogUGlja3Mgb25lIHRhcmdldCAocmFuZG9tIGFtb25nIHRoZSBuZWFyZXN0KSBmcm9tIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soKS5cbisgKlxuKyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cbisgKi9cbitpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpXG4re1xuK1x0aW50IHRhcmdldF9uaWQ7XG4rXHRub2RlbWFza190IHRhcmdldF9ub2RlbWFzaztcbitcbitcdGlmIChtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKG5pZCwgXHUwMDI2dGFyZ2V0X25vZGVtYXNrKSlcbitcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbitcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxuK1x0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuK1xuK1x0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFx1MDAyNnRhcmdldF9ub2RlbWFzayk7XG4rXG4rXHRyZXR1cm4gdGFyZ2V0X25pZDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9kZW1vdGlvbl9ub2RlKTtcbitcbisvKipcbisgKiBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayAtIFByb21vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2VcbisgKiBAbmlkOiBNZW1vcnktb25seSBub2RlIHRvd2FyZHMgd2hpY2ggcHJvbW90aW9uIHNlZWtzIENQVSBsb2NhbGl0eS5cbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBDUFUgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXG4rICovXG4raW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRyZXR1cm4gX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKTtcbitcbisvKipcbisgKiBtcF9uZXh0X3Byb21vdGlvbl9ub2RlIC0gUGljayBvbmUgcHJvbW90aW9uIHRhcmdldFxuKyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG8gYmUgcHJvbW90ZWQgdG93YXJkcyBDUFVzLlxuKyAqXG4rICogUGlja3Mgb25lIHRhcmdldCAocmFuZG9tIGFtb25nIHRoZSBuZWFyZXN0KSBmcm9tIG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKCkuXG4rICpcbisgKiBSZXR1cm46IHRhcmdldCBuaWQgb24gc3VjY2Vzcywgb3IgTlVNQV9OT19OT0RFIGlmIG5vIGNhbmRpZGF0ZSBpcyBhdmFpbGFibGUuXG4rICovXG4raW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbit7XG4rXHRpbnQgdGFyZ2V0X25pZDtcbitcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xuK1xuK1x0aWYgKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKG5pZCwgXHUwMDI2dGFyZ2V0X25vZGVtYXNrKSlcbitcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbitcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxuK1x0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuK1xuK1x0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFx1MDAyNnRhcmdldF9ub2RlbWFzayk7XG4rXG4rXHRyZXR1cm4gdGFyZ2V0X25pZDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZSk7XG4rI2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xuK1xuKy8qKlxuKyAqIG1wX2dldF9wYWNrYWdlX25vZGVzIC0gUmV0dXJuIGFsbCBtZW1iZXJzIG9mIEBuaWQncyBwYWNrYWdlXG4rICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS5cbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBhbGwgbWVtYmVycy5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuKyAqL1xuK2ludCBtcF9nZXRfcGFja2FnZV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19BTEwsIG91dCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX25vZGVzKTtcbitcbisvKipcbisgKiBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMgLSBSZXR1cm4gQ1BVIG1lbWJlcnMgb2YgQG5pZCdzIHBhY2thZ2VcbisgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLlxuKyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIENQVSBtZW1iZXJzLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXG4rICovXG4raW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlcyk7XG4rXG4rLyoqXG4rICogbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMgLSBSZXR1cm4gbWVtb3J5LW9ubHkgbWVtYmVycyBvZiBAbmlkJ3MgcGFja2FnZVxuKyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuXG4rICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgbWVtb3J5LW9ubHkgbWVtYmVycy5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuKyAqL1xuK2ludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19NRU1fT05MWSwgb3V0KTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMpO1xuK1xuK3N0YXRpYyBpbnQgX19tZW1pbml0IG1wX2hvdHBsdWdfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbitcdFx0dW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKl9hcmcpXG4re1xuK1x0aW50IG5pZDtcbitcdHN0cnVjdCBub2RlX25vdGlmeSAqbm4gPSBfYXJnO1xuK1xuK1x0bmlkID0gbm4tXHUwMDNlbmlkO1xuK1x0aWYgKG5pZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XG4rXG4rXHRzd2l0Y2ggKGFjdGlvbikge1xuK1x0Y2FzZSBOT0RFX1JFTU9WRURfTEFTVF9NRU1PUlk6XG4rXHRcdGRlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0Y2FzZSBOT0RFX0FEREVEX0ZJUlNUX01FTU9SWTpcbitcdFx0Y3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0ZGVmYXVsdDpcbitcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygwKTtcbit9XG4rXG4rLypcbisgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIG1lbW9yeV9wYWNrYWdlIHRvcG9sb2d5XG4rICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6XG4rICogICAtIHBhY2thZ2Vfbm9kZXM6ICAgICAgIEFsbCBOVU1BIG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxuKyAqICAgLSBwYWNrYWdlX2NwdV9ub2RlczogICBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlIChub2RlIG1hc2spXG4rICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxuKyAqICAgLSBwaHlzaWNhbF9wYWNrYWdlX2lkOiBQaHlzaWNhbCBwYWNrYWdlIElEXG4rICovXG4rXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9ub2Rlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcbitcdFx0XHRcdCAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zilcbit7XG4rXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XG4rXG4rXHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFwiJSpwYmxcXG5cIiwgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZtcC1cdTAwM2Vub2RlcykpO1xuK31cbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9ub2Rlcyk7XG4rXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9jcHVfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbitcbitcdGd1YXJkKG11dGV4KShcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdHJldHVybiBzeXNmc19lbWl0KGJ1ZiwgXCIlKnBibFxcblwiLCBub2RlbWFza19wcl9hcmdzKFx1MDAyNm1wLVx1MDAzZWNwdV9ub2RlcykpO1xuK31cbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9jcHVfbm9kZXMpO1xuK1xuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbWVtX29ubHlfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHRcdCAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xuK1xuK1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcIiUqcGJsXFxuXCIsIG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbit9XG4rc3RhdGljIERFVklDRV9BVFRSX1JPKHBhY2thZ2VfbWVtX29ubHlfbm9kZXMpO1xuK1xuK3N0YXRpYyBzc2l6ZV90IHBoeXNpY2FsX3BhY2thZ2VfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHRcdHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xuK1xuK1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcIiVkXFxuXCIsIG1wLVx1MDAzZXBhY2thZ2VfaWQpO1xuK31cbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGh5c2ljYWxfcGFja2FnZV9pZCk7XG4rXG4rc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1lbW9yeV9wYWNrYWdlX2F0dHJzW10gPSB7XG4rXHRcdTAwMjZkZXZfYXR0cl9wYWNrYWdlX25vZGVzLmF0dHIsXG4rXHRcdTAwMjZkZXZfYXR0cl9wYWNrYWdlX2NwdV9ub2Rlcy5hdHRyLFxuK1x0XHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9tZW1fb25seV9ub2Rlcy5hdHRyLFxuK1x0XHUwMDI2ZGV2X2F0dHJfcGh5c2ljYWxfcGFja2FnZV9pZC5hdHRyLFxuK1x0TlVMTCxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1lbW9yeV9wYWNrYWdlX2dyb3VwID0ge1xuK1x0LmF0dHJzID0gbWVtb3J5X3BhY2thZ2VfYXR0cnMsXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW10gPSB7XG4rXHRcdTAwMjZtZW1vcnlfcGFja2FnZV9ncm91cCxcbitcdE5VTEwsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KHZvaWQpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHN1YnN5c19zeXN0ZW1fcmVnaXN0ZXIoXHUwMDI2cGFja2FnZV9zdWJzeXMsIE5VTEwpO1xuK1x0aWYgKHJldCkge1xuK1x0XHRwcl9lcnIoXCJtZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcXG5cIiwgcmV0KTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbitjb3JlX2luaXRjYWxsKG1lbW9yeV9wYWNrYWdlX3N5c2ZzX2luaXQpO1xuK1xuKy8qKlxuKyAqIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyAtIENoZWNrIGlmIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxuKyAqXG4rICogUmV0dXJucyB0cnVlIGlmIGFsbCBtZW1vcnkgcGFja2FnZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgQ1BVIG5vZGVzXG4rICogYW5kIG1lbW9yeS1vbmx5IG5vZGVzLCBpbmRpY2F0aW5nIGEgc3ltbWV0cmljIHRvcG9sb2d5LlxuKyAqXG4rICogVGhlIHRvcG9sb2d5X3N5bW1ldHJpYyB2YXJpYWJsZSBpcyBwcm90ZWN0ZWQgYnkgbWVtb3J5X3BhY2thZ2VfbG9jayBmb3JcbisgKiB3cml0ZXMgKGluIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KS5cbisgKi9cbitib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKVxuK3tcbitcdHJldHVybiBSRUFEX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKTtcbitcbisvKiBXYWxrIHRoZSBwYWNrYWdlIGxpc3QgYW5kIGNvbXBhcmUgbm9kZSBjb3VudHM7IHRoZSBjYWxsZXIgaG9sZHMgdGhlIGxvY2suICovXG4rc3RhdGljIGJvb2wgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSh2b2lkKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXA7XG4rXHRpbnQgcmVmX2NwdV9ub2RlX2NvdW50ID0gMCwgcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSAwO1xuK1x0aW50IHBhY2thZ2VfY291bnQgPSAwO1xuK1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdGxpc3RfZm9yX2VhY2hfZW50cnkobXAsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xuK1x0XHRpbnQgY3B1X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXHUwMDNlY3B1X25vZGVzKTtcbitcdFx0aW50IG1lbW9yeV9vbmx5X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpO1xuK1x0XHRpbnQgdG90YWxfbm9kZV9jb3VudCA9IGNwdV9ub2RlX2NvdW50ICsgbWVtb3J5X29ubHlfbm9kZV9jb3VudDtcbitcbitcdFx0cGFja2FnZV9jb3VudCsrO1xuK1xuK1x0XHQvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi9cbitcdFx0aWYgKHRvdGFsX25vZGVfY291bnQgXHUwMDNjIDIpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRpZiAocGFja2FnZV9jb3VudCA9PSAxKSB7XG4rXHRcdFx0cmVmX2NwdV9ub2RlX2NvdW50ID0gY3B1X25vZGVfY291bnQ7XG4rXHRcdFx0cmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSBtZW1vcnlfb25seV9ub2RlX2NvdW50O1xuK1x0XHR9IGVsc2UgaWYgKGNwdV9ub2RlX2NvdW50ICE9IHJlZl9jcHVfbm9kZV9jb3VudCB8fFxuK1x0XHRcdCAgIG1lbW9yeV9vbmx5X25vZGVfY291bnQgIT0gcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQpIHtcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChwYWNrYWdlX2NvdW50IFx1MDAzYyAyKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rLyoqXG4rICogdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkgLSBWYWxpZGF0ZSB0b3BvbG9neSBmb3IgcGFja2FnZS1hd2FyZSBmZWF0dXJlc1xuKyAqXG4rICogVmFsaWRhdGVzIHRvcG9sb2d5IHN5bW1ldHJ5IGJ5IGNoZWNraW5nIGFsbCBtZW1vcnkgcGFja2FnZXMgaGF2ZSBpZGVudGljYWxcbisgKiBub2RlIHN0cnVjdHVyZS4gVXBkYXRlcyB0aGUgZ2xvYmFsIHRvcG9sb2d5X3N5bW1ldHJpYyB2YXJpYWJsZS5cbisgKlxuKyAqIFRvcG9sb2d5IGlzIHZhbGlkIG9ubHkgd2hlbiBhbGwgY29uZGl0aW9ucyBhcmUgbWV0OlxuKyAqIDEuIEF0IGxlYXN0IDIgcGFja2FnZXMgZXhpc3QgKG11bHRpLXBhY2thZ2Ugc3lzdGVtKVxuKyAqIDIuIEFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBjcHVfbm9kZSBhbmQgbWVtb3J5X29ubHlfbm9kZSBjb3VudHNcbisgKiAzLiBFYWNoIHBhY2thZ2UgaGFzIGF0IGxlYXN0IDIgdG90YWwgbm9kZXMgKGNwdV9ub2RlICsgbWVtb3J5X29ubHlfbm9kZSBcdTAwM2U9IDIpXG4rICpcbisgKiBWYWxpZCBjb25maWd1cmF0aW9ucyBwZXIgcGFja2FnZTpcbisgKiAtIDEgY3B1X25vZGUgKyAxIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZClcbisgKiAtIDIgY3B1X25vZGVzICsgMCBtZW1vcnlfb25seV9ub2RlID0gMiBub2RlcyAodmFsaWQpXG4rICogLSAwIGNwdV9ub2RlICsgMiBtZW1vcnlfb25seV9ub2RlcyA9IDIgbm9kZXMgKHZhbGlkKVxuKyAqIC0gMSBjcHVfbm9kZSArIDAgbWVtb3J5X29ubHlfbm9kZSA9IDEgbm9kZSAoaW52YWxpZCAtIHNpbmdsZSBub2RlIHBhY2thZ2UpXG4rICovXG4rc3RhdGljIHZvaWQgdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkodm9pZClcbit7XG4rXHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXG4rXHRXUklURV9PTkNFKHRvcG9sb2d5X3N5bW1ldHJpYywgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSgpKTtcbit9XG4rXG4rc3RhdGljIGludCBfX2luaXQgbWVtb3J5X3BhY2thZ2VfaW5pdCh2b2lkKVxuK3tcbitcdGludCByZXQgPSAwLCBuaWQ7XG4rXG4rXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHtcbitcdFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRyZXQgPSBjcmVhdGVfbm9kZV93aXRoX3BhY2thZ2UobmlkKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGhvdHBsdWdfbm9kZV9ub3RpZmllcihtcF9ob3RwbHVnX2NhbGxiYWNrLCBNRU1USUVSX0hPVFBMVUdfUFJJKTtcbitcbitcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4rXG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rbGF0ZV9pbml0Y2FsbChtZW1vcnlfcGFja2FnZV9pbml0KTtcbmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jXG5pbmRleCA0ZTQ0MjFiMjJiNTlmLi42NmJjY2I5YTBhMTkxIDEwMDY0NFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcbisrKyBiL21tL21lbXBvbGljeS5jXG5AQCAtMTE3LDYgKzExNyw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3RsYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdWFjY2Vzcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gXG5AQCAtMTY3LDYgKzE2OCw4IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgKm5vZGVfYndfdGFibGU7XG4gICovXG4gc3RhdGljIERFRklORV9NVVRFWCh3aV9zdGF0ZV9sb2NrKTtcbiBcbitzdGF0aWMgYm9vbCBwYWNrYWdlX21vZGVfZW5hYmxlZDtcbitcbiBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcbiB7XG4gXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XG5AQCAtMTgwLDYgKzE4MywxMSBAQCBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcbiBcdHJldHVybiB3ZWlnaHQ7XG4gfVxuIFxuK3N0YXRpYyBib29sIHdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKHZvaWQpXG4re1xuK1x0cmV0dXJuIFJFQURfT05DRShwYWNrYWdlX21vZGVfZW5hYmxlZCkgXHUwMDI2XHUwMDI2IG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYygpO1xuK31cbitcbiAvKlxuICAqIENvbnZlcnQgYmFuZHdpZHRoIHZhbHVlcyBpbnRvIHdlaWdodGVkIGludGVybGVhdmUgd2VpZ2h0cy5cbiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay5cbkBAIC0zMzcsNiArMzQ1LDQ3IEBAIGludCBuZWFyZXN0X25vZGVfbm9kZW1hc2soaW50IG5vZGUsIG5vZGVtYXNrX3QgKm1hc2spXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKG5lYXJlc3Rfbm9kZV9ub2RlbWFzayk7XG4gXG4rLyoqXG4rICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGVcbisgKiBAbm9kZTogVGhlIHJlZmVyZW5jZSBub2RlIElEIHRvIG1lYXN1cmUgZGlzdGFuY2UgZnJvbVxuKyAqIEBtYXNrOiBUaGUgc2V0IG9mIGNhbmRpZGF0ZSBub2RlcyB0byBjb21wYXJlIGFnYWluc3RcbisgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgYWxsIG5vZGVzIGluIEBtYXNrIGFuZCBtZWFzdXJlcyB0aGUgZGlzdGFuY2VcbisgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuXG4rICogSXQgZmluZHMgdGhlIG1pbmltdW0gZGlzdGFuY2UgYW5kIHRoZW4gcmVjb3JkcyBhbGwgbm9kZXMgaW4gQG1hc2sgdGhhdFxuKyAqIHNoYXJlIHRoYXQgc2FtZSBtaW5pbXVtIGRpc3RhbmNlIGludG8gdGhlIG91dHB1dCBtYXNrIEBvdXQuXG4rICpcbisgKiBGb3IgZXhhbXBsZSwgaWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSBlcXVhbCBtaW5pbWFsIGRpc3RhbmNlIHRvIEBub2RlLCBhbGxcbisgKiBvZiB0aGVtIGFyZSBpbmNsdWRlZCBpbiBAb3V0LlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIC1FSU5WQUwgaWYgQG91dCBpcyBOVUxMLlxuKyAqL1xuK2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aW50IGRpc3QsIG4sIG1pbl9kaXN0ID0gSU5UX01BWDtcbitcbitcdGlmICghb3V0KVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1xuK1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7XG4rXHRcdGRpc3QgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pO1xuK1xuK1x0XHRpZiAoZGlzdCBcdTAwM2MgbWluX2Rpc3QpIHtcbitcdFx0XHRtaW5fZGlzdCA9IGRpc3Q7XG4rXHRcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRcdFx0bm9kZV9zZXQobiwgKm91dCk7XG4rXHRcdH0gZWxzZSBpZiAoZGlzdCA9PSBtaW5fZGlzdCkge1xuK1x0XHRcdG5vZGVfc2V0KG4sICpvdXQpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobmVhcmVzdF9ub2Rlc19ub2RlbWFzayk7XG4rXG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBwLVx1MDAzZW1lbXBvbGljeTtcbkBAIC0yMDk3LDE3ICsyMTQ2LDk3IEBAIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKVxuIFx0cmV0dXJuIHpvbmUgXHUwMDNlPSBkeW5hbWljX3BvbGljeV96b25lO1xuIH1cbiBcbisvKipcbisgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2VcbisgKiBAcG9saWN5OiBUYXJnZXQgbWVtcG9saWN5IHdob3NlIHVzZXItc2VsZWN0ZWQgbm9kZXMgYXJlIGluIEBwb2xpY3ktXHUwMDNlbm9kZXMuXG4rICogQG1hc2s6ICAgT3V0cHV0IG5vZGVtYXNrLiBPbiBzdWNjZXNzLCBjb250YWlucyBwb2xpY3ktXHUwMDNlbm9kZXMgbGltaXRlZCB0b1xuKyAqICAgICAgICAgIHRoZSBwYWNrYWdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBhbGxvY2F0aW9uLlxuKyAqXG4rICogVGhpcyBoZWxwZXIgY29tYmluZXMgdHdvIGNvbnN0cmFpbnRzIHRvIGRlY2lkZSB3aGVyZSB3aXRoaW4gYSBwYWNrYWdlXG4rICogbWVtb3J5IG1heSBiZSBhbGxvY2F0ZWQ6XG4rICpcbisgKiAgIDEpIFRoZSBjYWxsZXIncyBwYWNrYWdlOiBkZXJpdmVkIHZpYSBtcF9nZXRfcGFja2FnZV9ub2RlcyhudW1hX25vZGVfaWQoKSkuXG4rICogICAyKSBUaGUgdXNlcidzIHByZXNlbGVjdGVkIHNldCBAcG9saWN5LVx1MDAzZW5vZGVzIChjcHVzZXRzL21lbXBvbGljeSkuXG4rICpcbisgKiBUaGUgZnVuY3Rpb24gb2J0YWlucyB0aGUgbm9kZW1hc2sgb2YgdGhlIGN1cnJlbnQgQ1BVJ3MgcGFja2FnZSBhbmRcbisgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS1cdTAwM2Vub2Rlcy4gSWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSAoZS5nLiB0aGVcbisgKiB1c2VyIGV4Y2x1ZGVkIGV2ZXJ5IG5vZGUgb2YgdGhlIGN1cnJlbnQgcGFja2FnZSksIGl0IGZhbGxzIGJhY2sgdG8gdGhlXG4rICogbm9kZSBpbiBAcG9saWN5LVx1MDAzZW5vZGVzLCBkZXJpdmVzIHRoYXQgbm9kZSdzIHBhY2thZ2UsIGFuZCBpbnRlcnNlY3RzXG4rICogYWdhaW4uIElmIHRoZSBmYWxsYmFjayBhbHNvIHlpZWxkcyBhbiBlbXB0eSBzZXQsIEBtYXNrIHN0YXlzIGVtcHR5IGFuZCBhXG4rICogbm9uLXplcm8gZXJyb3IgaXMgcmV0dXJuZWQuXG4rICpcbisgKiBFeGFtcGxlcyAocGFja2FnZXM6IFAwPXtDUFU6MCwgTUVNOjJ9LCBQMT17Q1BVOjEsIE1FTTozfSk6XG4rICogICAtIHBvbGljeS1cdTAwM2Vub2RlcyA9IHswLDEsMiwzfVxuKyAqICAgICAgIG9uIFAwOiBtYXNrID0gezAsMn07IG9uIFAxOiBtYXNrID0gezEsM30uXG4rICogICAtIHBvbGljeS1cdTAwM2Vub2RlcyA9IHswLDEsM31cbisgKiAgICAgICBvbiBQMDogbWFzayA9IHswfSAgICAgIChvbmx5IG5vZGUgMCBmcm9tIFAwIGlzIGFsbG93ZWQpLlxuKyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MSwyLDN9XG4rICogICAgICAgb24gUDA6IG1hc2sgPSB7Mn0gICAgICAob25seSBub2RlIDIgZnJvbSBQMCBpcyBhbGxvd2VkKS5cbisgKiAgIC0gcG9saWN5LVx1MDAzZW5vZGVzID0gezEsM31cbisgKiAgICAgICBvbiBQMDogY3VycmVudCBwYWNrYWdlIChQMCkgXHUwMDI2IHBvbGljeSA9IE5VTEwgLVx1MDAzZSBmYWxsYmFjayB0byBwb2xpY3k9MSxcbisgKiAgICAgICAgICAgICAgIHBhY2thZ2UoMSk9UDEsIG1hc2sgPSB7MSwzfS4gKFVzZXIgZWZmZWN0aXZlbHkgb3B0ZWQgb3V0IG9mIFAwLilcbisgKlxuKyAqIElmIHRoZSBzZWxlY3RlZCBub2RlIGlzIGxvdyBvbiBtZW1vcnksIHRoZSBhbGxvY2F0aW9uIG1heSB1c2UgYW5vdGhlciBub2RlLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgMCBvbiBzdWNjZXNzIHdpdGggQG1hc2sgc2V0IGFzIGFib3ZlO1xuKyAqICAgLUVJTlZBTCBpZiBAcG9saWN5L0BtYXNrIGlzIE5VTEw7XG4rICogICAtRU5PRU5UIGlmIGV2ZW4gdGhlIGZhbGxiYWNrIGludGVyc2VjdGlvbiBpcyBlbXB0eTtcbisgKiAgIFByb3BhZ2F0ZWQgZXJyb3IgZnJvbSBtcF9nZXRfcGFja2FnZV9ub2RlcygpIG9uIGZhaWx1cmUuXG4rICovXG4rc3RhdGljIGludCBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgbm9kZW1hc2tfdCAqbWFzaylcbit7XG4rXHRub2RlbWFza190IHBhY2thZ2VfbWFzaztcbitcdGludCBub2RlLCByZXQ7XG4rXG4rXHRpZiAoIXBvbGljeSB8fCAhbWFzaylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRub2Rlc19jbGVhcigqbWFzayk7XG4rXG4rXHRub2RlID0gbnVtYV9ub2RlX2lkKCk7XG4rXHRyZXQgPSBtcF9nZXRfcGFja2FnZV9ub2Rlcyhub2RlLCBcdTAwMjZwYWNrYWdlX21hc2spO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdG5vZGVzX2FuZCgqbWFzaywgcGFja2FnZV9tYXNrLCBwb2xpY3ktXHUwMDNlbm9kZXMpO1xuK1x0aWYgKCFub2Rlc19lbXB0eSgqbWFzaykpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LypcbitcdCAqIFRoZSB1c2VyJ3Mgbm9kZW1hc2sgZXhjbHVkZXMgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlO1xuK1x0ICogZmFsbCBiYWNrIHRvIHRoZSBwYWNrYWdlIHNwYW5uZWQgYnkgdGhlIHVzZXIncyBvd24gZmlyc3Qgbm9kZS5cbitcdCAqL1xuK1x0bm9kZSA9IGZpcnN0X25vZGUocG9saWN5LVx1MDAzZW5vZGVzKTtcbitcdHJldCA9IG1wX2dldF9wYWNrYWdlX25vZGVzKG5vZGUsIFx1MDAyNnBhY2thZ2VfbWFzayk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0bm9kZXNfYW5kKCptYXNrLCBwYWNrYWdlX21hc2ssIHBvbGljeS1cdTAwM2Vub2Rlcyk7XG4rXHRpZiAobm9kZXNfZW1wdHkoKm1hc2spKVxuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KVxuIHtcbiBcdHVuc2lnbmVkIGludCBub2RlO1xuIFx0dW5zaWduZWQgaW50IGNwdXNldF9tZW1zX2Nvb2tpZTtcbitcdG5vZGVtYXNrX3QgbWFzaztcbiBcbiByZXRyeTpcbiBcdC8qIHRvIHByZXZlbnQgbWlzY291bnQgdXNlIHRzay1cdTAwM2VtZW1zX2FsbG93ZWRfc2VxIHRvIGRldGVjdCByZWJpbmQgKi9cbiBcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XG4gXHRub2RlID0gY3VycmVudC1cdTAwM2VpbF9wcmV2O1xuLVx0aWYgKCFjdXJyZW50LVx1MDAzZWlsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBwb2xpY3ktXHUwMDNlbm9kZXMpKSB7XG4tXHRcdG5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgcG9saWN5LVx1MDAzZW5vZGVzKTtcbitcbitcdC8qIFBhY2thZ2UgbW9kZSBvZmYgb3IgdW5yZXNvbHZlZDogZmFsbCBiYWNrIHRvIHRoZSBmdWxsIHBvbGljeSBub2RlbWFzay4gKi9cbitcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fFxuK1x0ICAgIHBvbGljeV9yZXNvbHZlX3BhY2thZ2Vfbm9kZXMocG9saWN5LCBcdTAwMjZtYXNrKSlcbitcdFx0bWFzayA9IHBvbGljeS1cdTAwM2Vub2RlcztcbitcbitcdGlmICghY3VycmVudC1cdTAwM2VpbF93ZWlnaHQgfHwgIW5vZGVfaXNzZXQobm9kZSwgbWFzaykpIHtcbitcdFx0bm9kZSA9IG5leHRfbm9kZV9pbihub2RlLCBtYXNrKTtcbiBcdFx0aWYgKHJlYWRfbWVtc19hbGxvd2VkX3JldHJ5KGNwdXNldF9tZW1zX2Nvb2tpZSkpXG4gXHRcdFx0Z290byByZXRyeTtcbiBcdFx0aWYgKG5vZGUgPT0gTUFYX05VTU5PREVTKVxuQEAgLTIyMDAsNiArMjMyOSwzMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuIFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4gfVxuIFxuKy8qXG4rICogUGFja2FnZS1hd2FyZSBjb3VudGVycGFydCBvZiByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKCk6IHJlc29sdmUgdGhlXG4rICogY3VycmVudCBwYWNrYWdlJ3Mgbm9kZXMgaW50ZXJzZWN0ZWQgd2l0aCB0aGUgcG9saWN5LCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4rICogZnVsbCBwb2xpY3kgbm9kZW1hc2sgd2hlbiBwYWNrYWdlIG1vZGUgaXMgb2ZmIG9yIHJlc29sdXRpb24gZmFpbHMuXG4rICovXG4rc3RhdGljIHVuc2lnbmVkIGludCByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuK1x0XHRcdFx0XHRcdCAgICAgIG5vZGVtYXNrX3QgKm1hc2spXG4re1xuK1x0bm9kZW1hc2tfdCBwYWNrYWdlX21hc2s7XG4rXG4rXHRiYXJyaWVyKCk7XG4rXHRpZiAoIXdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKCkpIHtcbitcdFx0bWVtY3B5KG1hc2ssIFx1MDAyNnBvbC1cdTAwM2Vub2Rlcywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcbitcdFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4rXHR9XG4rXHRpZiAocG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2wsIFx1MDAyNnBhY2thZ2VfbWFzaykpXG4rXHRcdG1lbWNweShtYXNrLCBcdTAwMjZwb2wtXHUwMDNlbm9kZXMsIHNpemVvZihub2RlbWFza190KSk7XG4rXHRlbHNlXG4rXHRcdG1lbWNweShtYXNrLCBcdTAwMjZwYWNrYWdlX21hc2ssIHNpemVvZihub2RlbWFza190KSk7XG4rXHRiYXJyaWVyKCk7XG4rXG4rXHRyZXR1cm4gbm9kZXNfd2VpZ2h0KCptYXNrKTtcbit9XG4rXG4gc3RhdGljIHVuc2lnbmVkIGludCB3ZWlnaHRlZF9pbnRlcmxlYXZlX25pZChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHBnb2ZmX3QgaWx4KVxuIHtcbiBcdHN0cnVjdCB3ZWlnaHRlZF9pbnRlcmxlYXZlX3N0YXRlICpzdGF0ZTtcbkBAIC0yMjEwLDcgKzIzNjMsNyBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbmlkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgcGdvZmZfdCBpbHgpXG4gXHR1OCB3ZWlnaHQ7XG4gXHRpbnQgbmlkID0gMDtcbiBcbi1cdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9ub2RlbWFzayhwb2wsIFx1MDAyNm5vZGVtYXNrKTtcbitcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZW1hc2spO1xuIFx0aWYgKCFucl9ub2RlcylcbiBcdFx0cmV0dXJuIG51bWFfbm9kZV9pZCgpO1xuIFxuQEAgLTI2NTQsNyArMjgwNyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShnZnBfdCBnZnAsXG4gXHQvKiByZWFkIHRoZSBub2RlcyBvbnRvIHRoZSBzdGFjaywgcmV0cnkgaWYgZG9uZSBkdXJpbmcgcmViaW5kICovXG4gXHRkbyB7XG4gXHRcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XG4tXHRcdG5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCBcdTAwMjZub2Rlcyk7XG4rXHRcdG5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfcGFja2FnZV9ub2RlbWFzayhwb2wsIFx1MDAyNm5vZGVzKTtcbiBcdH0gd2hpbGUgKHJlYWRfbWVtc19hbGxvd2VkX3JldHJ5KGNwdXNldF9tZW1zX2Nvb2tpZSkpO1xuIFxuIFx0LyogaWYgdGhlIG5vZGVtYXNrIGhhcyBiZWNvbWUgaW52YWxpZCwgd2UgY2Fubm90IGRvIGFueXRoaW5nICovXG5AQCAtMzc5NCw3ICszOTQ3LDQyIEBAIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfYXV0b19hdHRyID0ge1xuIFx0LnN0b3JlID0gd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9hdXRvX3N0b3JlLFxuIH07XG4gXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9tb2RlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosXG4rXHRcdHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuK3tcbitcdHJldHVybiBzeXNmc19lbWl0KGJ1ZiwgXCIlc1xcblwiLCBzdHJfdHJ1ZV9mYWxzZShSRUFEX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQpKSk7XG4rfVxuK1xuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbitcdFx0c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbit7XG4rXHRib29sIGlucHV0O1xuK1x0aW50IGVycjtcbitcbitcdGVyciA9IGtzdHJ0b2Jvb2woYnVmLCBcdTAwMjZpbnB1dCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0LypcbitcdCAqIERpc2FibGUgcGFja2FnZS1hd2FyZSB3ZWlnaHRlZCBpbnRlcmxlYXZlIG9uIG5vbi1zeW1tZXRyaWMgdG9wb2xvZ2llcy5cbitcdCAqIE5vbi1zeW1tZXRyaWMgdG9wb2xvZ3kgKGUuZy4sIGFzeW1tZXRyaWMgQ1hMIG1lbW9yeSBhdHRhY2htZW50KSBjYW5cbitcdCAqIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlmIHBhY2thZ2UtYXdhcmUgYWxsb2NhdGlvbiBpcyB1c2VkLlxuK1x0ICogUmVqZWN0IGVuYWJsZSByZXF1ZXN0IGlmIHRvcG9sb2d5IGlzIG5vdCBzeW1tZXRyaWMuXG4rXHQgKi9cbitcdGlmIChpbnB1dCBcdTAwMjZcdTAwMjYgIW1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYygpKSB7XG4rXHRcdHByX3dhcm4oXCJwYWNrYWdlX21vZGUgY2Fubm90IGJlIGVuYWJsZWQgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9neVxcblwiKTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRXUklURV9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkLCBpbnB1dCk7XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfcGFja2FnZV9tb2RlX2F0dHIgPVxuK1x0X19BVFRSKHBhY2thZ2VfbW9kZSwgMDY2NCwgcGFja2FnZV9tb2RlX3Nob3csIHBhY2thZ2VfbW9kZV9zdG9yZSk7XG4rXG4gc3RhdGljIHZvaWQgd2lfY2xlYW51cCh2b2lkKSB7XG4rXHRzeXNmc19yZW1vdmVfZmlsZShcdTAwMjZ3aV9ncm91cC1cdTAwM2V3aV9rb2JqLCBcdTAwMjZ3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3JlbW92ZV9maWxlKFx1MDAyNndpX2dyb3VwLVx1MDAzZXdpX2tvYmosIFx1MDAyNndpX2F1dG9fYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3dpX25vZGVfZGVsZXRlX2FsbCgpO1xuIFx0d2lfc3RhdGVfZnJlZSgpO1xuQEAgLTM5MDAsNiArNDA4OCwxMCBAQCBzdGF0aWMgaW50IF9faW5pdCBhZGRfd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ncm91cChzdHJ1Y3Qga29iamVjdCAqbWVtcG9saWN5X2tvYmopXG4gXHRpZiAoZXJyKVxuIFx0XHRnb3RvIGVycl9wdXRfa29iajtcbiBcbitcdGVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKFx1MDAyNndpX2dyb3VwLVx1MDAzZXdpX2tvYmosIFx1MDAyNndpX3BhY2thZ2VfbW9kZV9hdHRyLmF0dHIpO1xuK1x0aWYgKGVycilcbitcdFx0Z290byBlcnJfY2xlYW51cF9rb2JqO1xuK1xuIFx0Zm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7XG4gXHRcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSlcbiBcdFx0XHRjb250aW51ZTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI4OjI5LjE2MjMzMTk5NFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwOTU4OTI4NzM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2VybmVsIE1lbW9yeSBQYWNrYWdlIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBpbnRyb2R1Y2luZyBhIFwibWVtb3J5IHBhY2thZ2VcIiB0b3BvbG9neSBjb25jZXB0IHdpdGhpbiB0aGUga2VybmVsLCBwcmltYXJpbHkgZm9yIE5VTUEgbm9kZXMgYW5kLCBpbXBvcnRhbnRseSwgQ1hML0hCTSBtZW1vcnkgY29uZmlndXJhdGlvbnMuIEl0J3MgdG91Y2hpbmcgc29tZSBjcml0aWNhbCBhcmVhczogYG1tL21lbW9yeS10aWVycy5jYCwgYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgLCBgZHJpdmVycy9kYXgva21lbS5jYCwgYW5kIGBtbS9tZW1wb2xpY3kuY2AuIFRoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2Ug4oCTIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmYgaGVyZSwgZGVhbGluZyB3aXRoIE5VTUEgbWVtb3J5IHRpZXJzLCBDWEwgcmVnaW9ucywgYW5kIHRoZSBtZW1wb2xpY3kgc3Vic3lzdGVtLiBJdOKAmXMgZGVmaW5pdGVseSB0b3VjaGluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIG1ha2luZyBmdXp6aW5nIGEgaGlnaCBwcmlvcml0eS5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGRpdmUgaW50byBpdCBhbmQgaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgYWRkZWQgb3IgbW9kaWZpZWQsIGZvY3VzaW5nIG9uIHBvdGVudGlhbCBhcmVhcyBvZiB2dWxuZXJhYmlsaXR5IG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIExldCdzIHNlZS4uLiB0aGUgcGF0Y2ggaXMgaW50cm9kdWNpbmcgYSBzeXNmcyBpbnRlcmZhY2UgZm9yIHRoZXNlIG1lbW9yeSBwYWNrYWdlcyB1bmRlciBgL3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL2AgYW5kIGEgbmV3IHdlaWdodGVkIGludGVybGVhdmUgbW9kZSBmb3IgbWVtcG9saWN5LCBhY2Nlc3NpYmxlIHZpYSBgL3N5cy9rZXJuZWwvbW0vbWVtcG9saWN5L3dlaWdodGVkX2ludGVybGVhdmUvcGFja2FnZV9tb2RlYC5cblxuSSdtIG1ha2luZyBhIGxpc3Qgb2YgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBpbXBhY3RlZDogYGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9wcm9iZV9wYWNrYWdlX2lkYCwgdGhlIG5vdGlmaWVyIGZ1bmN0aW9ucywgdGhlIHBhY2thZ2Ugbm9kZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIChgbXBfYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AsIGV0Yy4pLCBhbmQgdGhlIGludGVybGVhdmUgYW5kIHByb21vdGlvbi9kZW1vdGlvbiBmdW5jdGlvbnMuIEkgc2VlIGEgbG90IG9mIGFjdGl2aXR5IHdpdGhpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vbWVtcG9saWN5LmNgLCBzbyBJJ2xsIG5lZWQgdG8gc2NydXRpbml6ZSB0aG9zZSBtb2R1bGVzIGNhcmVmdWxseSB0byB1bmRlcnN0YW5kIHRoZSBjYWxsIHBhdGhzIGFuZCBkZXBlbmRlbmNpZXMuXG5cbk5vdywgbXkgZm9jdXMgbmFycm93cyB0byB0aGUgZXhwb3J0ZWQgYW5kIHJlYWNoYWJsZSBmdW5jdGlvbnMgd2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9tZW1wb2xpY3kuY2AsIG5hbWVseTogYG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yYCwgYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzYCwgYG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzYCwgYG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tgLCBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVgLCBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYCBhbmQgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgLiBUaGVzZSBhcmUgbXkgcHJpbWFyeSB0YXJnZXRzLlxuXG5HaXZlbiB0aGUgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzLCBlc3BlY2lhbGx5IHRoZSBOVU1BIGZvY3VzLCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiBOYXR1cmFsbHksIHRoaXMgY29kZSBpcyBoZWF2aWx5IE5VTUEtZGVwZW5kZW50LiBMZXQncyBtYWtlIHN1cmUgYENPTkZJR19OVU1BYCBpcyBlbmFibGVkLiBGdXJ0aGVyLCBJIHNob3VsZCBzZWUgaWYgYENPTkZJR19OVU1BX0JBTEFOQ0lOR2AsIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gLCBgQ09ORklHX01FTU9SWV9USUVSU2AsIG9yIGBDT05GSUdfQ1hMX0JVU2AgYXJlIGRlcGVuZGVuY2llcy4gSSdsbCBxdWlja2x5IGdyZXAgZm9yIHRoZSBtb3N0IHJlbGV2YW50IG9uZXMuIE9rYXksIHNvIHRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB3aGVyZSB0byBmb2N1cyBteSBpbml0aWFsIGZ1enppbmcgZWZmb3J0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk4MTYsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyODo0MC4xMjEyNjM4OFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTQ5ODg0NjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX05VTUFfTUlHUkFUSU9OXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnktdGllcnMuYz03MT1ib29sIGZvbGlvX3VzZV9hY2Nlc3NfdGltZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNzctXFxubW0vbWVtb3J5LXRpZXJzLmM6Nzg6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTc5LXN0YXRpYyBpbnQgdG9wX3RpZXJfYWRpc3RhbmNlO1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9MTM3PXN0YXRpYyBzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMgKm5vZGVfZGVtb3Rpb24gX19yZWFkX21vc3RseTtcXG5tbS9tZW1vcnktdGllcnMuYzoxMzg6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xcbm1tL21lbW9yeS10aWVycy5jLTEzOS1cXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTI2Nj1zdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtMjgxLVxcbm1tL21lbW9yeS10aWVycy5jOjI4MjojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxubW0vbWVtb3J5LXRpZXJzLmMtMjgzLWJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9NTI3PXN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxcbm1tL21lbW9yeS10aWVycy5jOjUyODojZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXFxubW0vbWVtb3J5LXRpZXJzLmMtNTI5LVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9OTEyPXN0YXRpYyBpbnQgX19pbml0IG1lbW9yeV90aWVyX2luaXQodm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTkxOS1cXG5tbS9tZW1vcnktdGllcnMuYzo5MjA6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTkyMS1cXHRub2RlX2RlbW90aW9uID0ga3phbGxvY19vYmpzKHN0cnVjdCBkZW1vdGlvbl9ub2RlcywgbnJfbm9kZV9pZHMpO1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9OTQ1PWJvb2wgbnVtYV9kZW1vdGlvbl9lbmFibGVkID0gZmFsc2U7XFxubW0vbWVtb3J5LXRpZXJzLmMtOTQ2LVxcbm1tL21lbW9yeS10aWVycy5jOjk0NzojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxubW0vbWVtb3J5LXRpZXJzLmMtOTQ4LSNpZmRlZiBDT05GSUdfU1lTRlNcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTE2MTg9c3RhdGljIGludCBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKGludCBuaWQsIGVudW0gbXBfbm9kZXNfdHlwZSBub2RlX3R5cGUsXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy0xNjU4LVxcbm1tL21lbW9yeS10aWVycy5jOjE2NTk6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTE2NjAtc3RhdGljIGludCBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTE3Nzg9RVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZSk7XFxubW0vbWVtb3J5LXRpZXJzLmM6MTc3OTojZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXFxubW0vbWVtb3J5LXRpZXJzLmMtMTc4MC1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTExOTY9c3RhdGljIGxvbmcgZG9fZ2V0X21lbXBvbGljeShpbnQgKnBvbGljeSwgbm9kZW1hc2tfdCAqbm1hc2ssXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMjk2LVxcbm1tL21lbXBvbGljeS5jOjEyOTc6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbXBvbGljeS5jLTEyOTgtc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxcbi0tXFxubW0vbWlncmF0ZS5jPTIxODg9c3RydWN0IGZvbGlvICphbGxvY19taWdyYXRpb25fdGFyZ2V0KHN0cnVjdCBmb2xpbyAqc3JjLCB1bnNpZ25lZCBsb25nIHByaXZhdGUpXFxuLS1cXG5tbS9taWdyYXRlLmMtMjIyNi1cXG5tbS9taWdyYXRlLmM6MjIyNzojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxubW0vbWlncmF0ZS5jLTIyMjgtc3RhdGljIGludCBzdG9yZV9zdGF0dXMoaW50IF9fdXNlciAqc3RhdHVzLCBpbnQgc3RhcnQsIGludCB2YWx1ZSwgaW50IG5yKVxcbi0tXFxubW0vbWlncmF0ZS5jPTI2MTk9U1lTQ0FMTF9ERUZJTkU2KG1vdmVfcGFnZXMsIHBpZF90LCBwaWQsIHVuc2lnbmVkIGxvbmcsIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWlncmF0ZS5jLTI2MjUtfVxcbm1tL21pZ3JhdGUuYzoyNjI2OiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG5tbS9taWdyYXRlLmMtMjYyNy1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6NDAuMjM2MjU3NTAyWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDc5MjM3MTI5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgY29uZmlnIG9wdGlvbnMsIHRoaW5raW5nIGFib3V0IHRoZW0gYXMgYSBzZWFzb25lZCBleHBlcnQ6XG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgQXJjaGl0ZWN0dXJlIENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSSdtIGltbWVkaWF0ZWx5IHRoaW5raW5nIGFib3V0IGhvdyB0aGV5IGludGVycGxheSBhbmQgd2hhdCBhcmNoaXRlY3R1cmFsIGltcGxpY2F0aW9ucyB0aGV5IHN1Z2dlc3QuIEZpcnN0LCBgQ09ORklHX05VTUFgLiBUaGF0J3MgYSBmdW5kYW1lbnRhbCBnaXZlbiB0aGVzZSBkYXlzLCBidXQgaXQncyBhbHdheXMgd29ydGggdmVyaWZ5aW5nIGl0J3MgZW5hYmxlZCBhbmQgY29uZmlndXJlZCBjb3JyZWN0bHkgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiBOVU1BIGZ1bmRhbWVudGFsbHkgaW1wYWN0cyBtZW1vcnkgYWNjZXNzIGxhdGVuY3ksIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBpbXBsaWNhdGlvbnMgaXMgY3J1Y2lhbCBmb3IgcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucy4gSSBuZWVkIHRvIGtlZXAgaW4gbWluZCBob3cgdGhlIG1lbW9yeSBwb2xpY2llcyB3aWxsIGJlIGRlZmluZWQsIGhvdyB0aGUgc2NoZWR1bGVyIHdpbGwgd29yaywgYW5kIGhvdyB0aGUgT1Mgd2lsbCBtYW5hZ2UgbWVtb3J5IGFsbG9jYXRpb24gYWNyb3NzIGRpZmZlcmVudCBOVU1BIG5vZGVzLlxuXG5OZXh0LCBgQ09ORklHX01FTU9SWV9USUVSU2AuIFRoaXMgaXMgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gVGhpcyBzdWdnZXN0cyBhIG11bHRpLXRpZXJlZCBtZW1vcnkgYXJjaGl0ZWN0dXJlIGlzIGluIHBsYXkg4oCTIHRoaW5rIERSQU0sIHBlcnNpc3RlbnQgbWVtb3J5LCBvciBldmVuIGRpZmZlcmVudCB0eXBlcyBvZiBEUkFNIHdpdGggdmFyeWluZyBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MuIElmIHRoaXMgaXMgZW5hYmxlZCwgSSBpbW1lZGlhdGVseSBzdGFydCBjb25zaWRlcmluZyB0aGUgaW1wbGljYXRpb25zIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgZGF0YSBwbGFjZW1lbnQsIGFuZCBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHRoZSBkaWZmZXJlbmNlcyBpbiBhY2Nlc3Mgc3BlZWQgYW5kIHBlcnNpc3RlbmNlLiBUaGUgcG90ZW50aWFsIGZvciBjYWNoZS1hd2FyZSBhbGdvcml0aG1zIGFuZCBOVU1BLWF3YXJlIHBsYWNlbWVudCBiZWNvbWVzIGV4dHJlbWVseSBpbXBvcnRhbnQuXG5cbkZpbmFsbHksIGBDT05GSUdfQ1hMX0JVU2AuIE5vdywgdGhpcyBpcyBleGNpdGluZy4gQ1hMIChDb21wdXRlIEV4cHJlc3MgTGluaykgb3BlbnMgdXAgYSB3aG9sZSBuZXcgd29ybGQgb2YgcG9zc2liaWxpdGllcywgZW5hYmxpbmcgY29oZXJlbnQgbWVtb3J5IHNoYXJpbmcgYW5kIGFjY2VsZXJhdGlvbiBiZXR3ZWVuIHRoZSBDUFUgYW5kIGRldmljZXMuIFdpdGggQ1hMIGVuYWJsZWQsIEkgaGF2ZSB0byB0aGluayBhYm91dCBob3cgQ1hMIGRldmljZXMgd2lsbCBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIEFyZSB3ZSB0YWxraW5nIGFib3V0IENYTC1hdHRhY2hlZCBtZW1vcnksIGFjY2VsZXJhdG9ycywgb3IgYSBjb21iaW5hdGlvbj8gVGhpcyBjb25maWcgb3B0aW9uIHJhaXNlcyBxdWVzdGlvbnMgYWJvdXQgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgdGhlIGltcGxpY2F0aW9ucyBmb3IgRE1BLCBhbmQgaG93IHRoaXMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHN5c3RlbS4gSXQgYWxzbyBtZWFucyBJIG5lZWQgdG8gY2FyZWZ1bGx5IGFuYWx5emUgdGhlIGRyaXZlciBzdXBwb3J0IGFuZCBhbnkgcmVsZXZhbnQgZmlybXdhcmUgY29uc2lkZXJhdGlvbnMuIFRoaXMgaGFzIHNvbWUgdmVyeSBkZWVwIGltcGxpY2F0aW9ucyBmb3Igc3lzdGVtIGRlc2lnbiwgYW5kIEkgbmVlZCB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgQ1hMLWJhc2VkIG1lbW9yeSBhbmQgdGhlIGV4aXN0aW5nIE5VTUEgdG9wb2xvZ3kuIFRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHdob2xlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBzdGFjay5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIyMjcsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyODo0NS4wMjg2MzE5NDFaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc4MTM2NTAyOCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTU9SWV9USUVSU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI4OjQ3LjgxMDAwNjExWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzM2MDU4ODE2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqS2NvbmZpZyBEaXZlIGZvciBOVU1BL01FTU9SWV9USUVSUyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0aGVzZSBOVU1BIGFuZCBNRU1PUllfVElFUlMgY29uZmlndXJhdGlvbnMgYXJlIGhhbmRsZWQuIEdpdmVuIG15IGV4cGVyaWVuY2UsIHRoZSBmaXJzdCBwbGFjZSBJIGFsd2F5cyBnbyBpbiBhIGtlcm5lbCBidWlsZCBpcyB0aGUgYEtjb25maWdgIGZpbGVzLiBUaGF0J3MgdGhlIGNlbnRyYWwgY29uZmlndXJhdGlvbiBodWIsIHJpZ2h0PyBTbywgSSdtIHRoaW5raW5nLCBcIkxldCdzIGNoZWNrIGBtbS9LY29uZmlnYC5cIiBUaGF0J3MgdGhlIG1vc3QgbG9naWNhbCBzdGFydGluZyBwb2ludCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4gSSdsbCBzZWFyY2ggZm9yIGJvdGggYE5VTUFgIGFuZCBgTUVNT1JZX1RJRVJTYCB0byBzZWUgd2hhdCBJIGNhbiBmaW5kLiBJdCdzIGFsbW9zdCBndWFyYW50ZWVkIHRoZSBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIHdpbGwgYmUgcmlnaHQgdGhlcmUuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgcmVsZXZhbnQgc3ltYm9scywgZGVzY3JpcHRpb25zLCBhbmQgYW55IGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzLCBsaWtlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpb25zIG9yIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZlYXR1cmVzIHRoYXQgbWlnaHQgYmUgaW50ZXJ0d2luZWQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGVzZSBmZWF0dXJlcyBhcmUgZW5hYmxlZCBhbmQgbWFuYWdlZCB3aXRoaW4gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uIEZyb20gdGhlcmUsIEkgY2FuIHRyYWNrIGRvd24gdGhlIHNvdXJjZSBmaWxlcyB0aGV5IGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI3MTEsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyODo1NS4xNzA1OTg0MjJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEzMTc2MTkyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBOVU1BXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz00NDI9Y29uZmlnIEFSQ0hfS0VFUF9NRU1CTE9DS1xcbi0tXFxubW0vS2NvbmZpZy00NDUtIyBLZWVwIGFyY2ggTlVNQSBtYXBwaW5nIGluZnJhc3RydWN0dXJlIHBvc3QtaW5pdC5cXG5tbS9LY29uZmlnOjQ0Njpjb25maWcgTlVNQV9LRUVQX01FTUlORk9cXG5tbS9LY29uZmlnLTQ0Ny1cXHRib29sXFxuLS1cXG5tbS9LY29uZmlnPTYyND1jb25maWcgUEFHRV9SRVBPUlRJTkdcXG4tLVxcbm1tL0tjb25maWctNjMxLVxcbm1tL0tjb25maWc6NjMyOmNvbmZpZyBOVU1BX01JR1JBVElPTlxcbm1tL0tjb25maWctNjMzLVxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuLS1cXG5tbS9LY29uZmlnPTE0MTg9Y29uZmlnIEVYRUNNRU1cXG4tLVxcbm1tL0tjb25maWctMTQyMC1cXG5tbS9LY29uZmlnOjE0MjE6Y29uZmlnIE5VTUFfTUVNQkxLU1xcbm1tL0tjb25maWctMTQyMi1cXHRib29sXFxubW0vS2NvbmZpZy0xNDIzLVxcbm1tL0tjb25maWc6MTQyNDpjb25maWcgTlVNQV9FTVVcXG5tbS9LY29uZmlnLTE0MjUtXFx0Ym9vbCBcXFwiTlVNQSBlbXVsYXRpb25cXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI4OjU1LjI4Mzc3OTg2NVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxOTA3MzAzNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOlxuXG4qKktjb25maWcgTG9jYXRpb24gQ2hlY2sqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgYENPTkZJR19OVU1BYC4gVGhhdCBvbmUgc2hvdWxkIGJlIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCBJIG5lZWQgdG8gcXVpY2tseSByZWNhbGwgd2hlcmUgaXQgdHlwaWNhbGx5IHJlc2lkZXMgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuIE15IG1lbnRhbCBtYXAgdXN1YWxseSBwbGFjZXMgdGhlc2UgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIOKAkyBwYXJ0aWN1bGFybHkgdGhvc2UgcmVsYXRlZCB0byBOVU1BIOKAkyBpbiBlaXRoZXIgYGFyY2gvS2NvbmZpZ2AgKHVuZGVyIHRoZSByZWxldmFudCBhcmNoaXRlY3R1cmUgZGlyZWN0b3J5LCBuYXR1cmFsbHkpIG9yLCBpZiBpdCdzIG1vcmUgZ2VuZXJhbCBpbml0aWFsaXphdGlvbiByZWxhdGVkLCBgaW5pdC9LY29uZmlnYC4gSSdkIHN0YXJ0IHRoZXJlLCBzaW5jZSB0aGF0J3Mgd2hlcmUgSSdkIGV4cGVjdCBpdCwgZ2l2ZW4gaXRzIGZ1bmN0aW9uLiBObyBzZW5zZSBpbiB3YXN0aW5nIHRpbWUgc2VhcmNoaW5nIG90aGVyIGFyZWFzIGlmIHRoZSBsb2dpY2FsIGxvY2F0aW9ucyBhcmUga25vd24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMjI4LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6NTkuNDc0NTEzOTk2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MjY4NDM5ODg2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBOVU1BXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL2FybTY0L0tjb25maWc9MTUxNT1jb25maWcgSE9UUExVR19DUFVcXG4tLVxcbmFyY2gvYXJtNjQvS2NvbmZpZy0xNTIyLSMgQ29tbW9uIE5VTUEgRmVhdHVyZXNcXG5hcmNoL2FybTY0L0tjb25maWc6MTUyMzpjb25maWcgTlVNQVxcbmFyY2gvYXJtNjQvS2NvbmZpZy0xNTI0LVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9sb29uZ2FyY2gvS2NvbmZpZz01NDM9Y29uZmlnIE5SX0NQVVNcXG4tLVxcbmFyY2gvbG9vbmdhcmNoL0tjb25maWctNTUxLVxcbmFyY2gvbG9vbmdhcmNoL0tjb25maWc6NTUyOmNvbmZpZyBOVU1BXFxuYXJjaC9sb29uZ2FyY2gvS2NvbmZpZy01NTMtXFx0Ym9vbCBcXFwiTlVNQSBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9taXBzL0tjb25maWc9MjYwOT1jb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFXFxuLS1cXG5hcmNoL21pcHMvS2NvbmZpZy0yNjExLVxcbmFyY2gvbWlwcy9LY29uZmlnOjI2MTI6Y29uZmlnIE5VTUFcXG5hcmNoL21pcHMvS2NvbmZpZy0yNjEzLVxcdGJvb2wgXFxcIk5VTUEgU3VwcG9ydFxcXCJcXG4tLVxcbmFyY2gvcG93ZXJwYy9LY29uZmlnPTc1NT1jb25maWcgSVJRX0FMTF9DUFVTXFxuLS1cXG5hcmNoL3Bvd2VycGMvS2NvbmZpZy03NjMtXFxuYXJjaC9wb3dlcnBjL0tjb25maWc6NzY0OmNvbmZpZyBOVU1BXFxuYXJjaC9wb3dlcnBjL0tjb25maWctNzY1LVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9yaXNjdi9LY29uZmlnPTQ3OD1lbmRjaG9pY2VcXG4tLVxcbmFyY2gvcmlzY3YvS2NvbmZpZy00ODAtIyBDb21tb24gTlVNQSBGZWF0dXJlc1xcbmFyY2gvcmlzY3YvS2NvbmZpZzo0ODE6Y29uZmlnIE5VTUFcXG5hcmNoL3Jpc2N2L0tjb25maWctNDgyLVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9zMzkwL0tjb25maWc9NTM3PWNvbmZpZyBIT1RQTFVHX0NQVVxcbi0tXFxuYXJjaC9zMzkwL0tjb25maWctNTM5LVxcbmFyY2gvczM5MC9LY29uZmlnOjU0MDpjb25maWcgTlVNQVxcbmFyY2gvczM5MC9LY29uZmlnLTU0MS1cXHRib29sIFxcXCJOVU1BIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3NoL21tL0tjb25maWc9MTAyPWNvbmZpZyBWU1lTQ0FMTFxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTExNC1cXG5hcmNoL3NoL21tL0tjb25maWc6MTE1OmNvbmZpZyBOVU1BXFxuYXJjaC9zaC9tbS9LY29uZmlnLTExNi1cXHRib29sIFxcXCJOb24tVW5pZm9ybSBNZW1vcnkgQWNjZXNzIChOVU1BKSBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9zcGFyYy9LY29uZmlnPTI1NT1jb25maWcgR0VORVJJQ19MT0NLQlJFQUtcXG4tLVxcbmFyY2gvc3BhcmMvS2NvbmZpZy0yNTktXFxuYXJjaC9zcGFyYy9LY29uZmlnOjI2MDpjb25maWcgTlVNQVxcbmFyY2gvc3BhcmMvS2NvbmZpZy0yNjEtXFx0Ym9vbCBcXFwiTlVNQSBzdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC94ODYvS2NvbmZpZz0xNTAxPWNvbmZpZyBBTURfTUVNX0VOQ1JZUFRcXG4tLVxcbmFyY2gveDg2L0tjb25maWctMTUxNy0jIENvbW1vbiBOVU1BIEZlYXR1cmVzXFxuYXJjaC94ODYvS2NvbmZpZzoxNTE4OmNvbmZpZyBOVU1BXFxuYXJjaC94ODYvS2NvbmZpZy0xNTE5LVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuaW5pdC9LY29uZmlnPTEwMDc9Y29uZmlnIEFSQ0hfV0FOVF9OVU1BX1ZBUklBQkxFX0xPQ0FMSVRZXFxuLS1cXG5pbml0L0tjb25maWctMTAwOS1cXG5pbml0L0tjb25maWc6MTAxMDpjb25maWcgTlVNQV9CQUxBTkNJTkdcXG5pbml0L0tjb25maWctMTAxMS1cXHRib29sIFxcXCJNZW1vcnkgcGxhY2VtZW50IGF3YXJlIE5VTUEgc2NoZWR1bGVyXFxcIlxcbi0tXFxuaW5pdC9LY29uZmlnLTEwMjEtXFxuaW5pdC9LY29uZmlnOjEwMjI6Y29uZmlnIE5VTUFfQkFMQU5DSU5HX0RFRkFVTFRfRU5BQkxFRFxcbmluaXQvS2NvbmZpZy0xMDIzLVxcdGJvb2wgXFxcIkF1dG9tYXRpY2FsbHkgZW5hYmxlIE5VTUEgYXdhcmUgbWVtb3J5L3Rhc2sgcGxhY2VtZW50XFxcIlxcbi0tXFxubW0vS2NvbmZpZz00NDI9Y29uZmlnIEFSQ0hfS0VFUF9NRU1CTE9DS1xcbi0tXFxubW0vS2NvbmZpZy00NDUtIyBLZWVwIGFyY2ggTlVNQSBtYXBwaW5nIGluZnJhc3RydWN0dXJlIHBvc3QtaW5pdC5cXG5tbS9LY29uZmlnOjQ0Njpjb25maWcgTlVNQV9LRUVQX01FTUlORk9cXG5tbS9LY29uZmlnLTQ0Ny1cXHRib29sXFxuLS1cXG5tbS9LY29uZmlnPTYyND1jb25maWcgUEFHRV9SRVBPUlRJTkdcXG4tLVxcbm1tL0tjb25maWctNjMxLVxcbm1tL0tjb25maWc6NjMyOmNvbmZpZyBOVU1BX01JR1JBVElPTlxcbm1tL0tjb25maWctNjMzLVxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuLS1cXG5tbS9LY29uZmlnPTE0MTg9Y29uZmlnIEVYRUNNRU1cXG4tLVxcbm1tL0tjb25maWctMTQyMC1cXG5tbS9LY29uZmlnOjE0MjE6Y29uZmlnIE5VTUFfTUVNQkxLU1xcbm1tL0tjb25maWctMTQyMi1cXHRib29sXFxubW0vS2NvbmZpZy0xNDIzLVxcbm1tL0tjb25maWc6MTQyNDpjb25maWcgTlVNQV9FTVVcXG5tbS9LY29uZmlnLTE0MjUtXFx0Ym9vbCBcXFwiTlVNQSBlbXVsYXRpb25cXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjAzLjc0Mjk2MzY5MloiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDU1MjE3MDIzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUuIEhlcmUncyBob3cgSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpczpcblxuKipDaGVja2luZyBOVU1BIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzKipcblxuQWxyaWdodCwgZmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgc3RhdHVzIG9mIGBDT05GSUdfTlVNQWAgYW5kIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gLiBHb3R0YSBnZXQgdGhvc2UgYmFzZSBkZXBlbmRlbmNpZXMgc3RyYWlnaHQgYmVmb3JlIEkgZGlnIGFueSBkZWVwZXIuIFRoZXNlIGFyZSBmdW5kYW1lbnRhbCBmb3IgTlVNQSBzdXBwb3J0LCBzbyBJJ20gYXNzdW1pbmcgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZXkncmUgc2V0IHRvIHdoYXQgSSBhbnRpY2lwYXRlLiBOb3csIGhvbGQgb24gYSBzZWNvbmQuLi4gd2hlcmUgZG9lcyBgbW0vbWVtb3J5LXRpZXJzLmNgIGFjdHVhbGx5IGNvbWUgaW50byBwbGF5PyBXaGVuIGlzIHRoYXQgdGhpbmcgY29tcGlsZWQ/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBidWlsZC10aW1lIGNvbnRleHQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBsaW5lZCB1cCBjb3JyZWN0bHkgd2l0aCB3aGF0ZXZlciBOVU1BIGZlYXR1cmVzIGFyZSBpbiB0aGUgbWl4LiBVbmRlcnN0YW5kaW5nIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIGlzIGVzc2VudGlhbCBoZXJlLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGF0IHRoZSBidWlsZCBjb25maWd1cmF0aW9ucyB3b3JrIGFzIGludGVuZGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDUzMiwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjA5Ljc5ODE4NDE1NFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcyNzU0NzU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1lbW9yeS10aWVyc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT05OD1vYmotJChDT05GSUdfTUlHUkFUSU9OKSArPSBtaWdyYXRlLm9cXG5tbS9NYWtlZmlsZTo5OTpvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9cXG5tbS9NYWtlZmlsZS0xMDAtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MDkuOTcwOTQzNzkzWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NDA4NzkwMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzIGZvciBDWEwgUmVnaW9uIERyaXZlciBNb2RpZmljYXRpb25zKipcblxuQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIHRoZSBhYnNvbHV0ZSByZXF1aXJlbWVudCBvZiBgQ09ORklHX05VTUFgLiBObyBzdXJwcmlzZXMgdGhlcmUuIENYTCwgZXNwZWNpYWxseSB0aGUgbWVtb3J5IHNlbWFudGljcywgaXMgZnVuZGFtZW50YWxseSBpbnRlcnR3aW5lZCB3aXRoIE5vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MuIFRoYXQncyBhIGdpdmVuLlxuXG5Ob3csIGxldCdzIGRyaWxsIGRvd24gYSBiaXQgZGVlcGVyLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hhdCdzIHRoZSBkZWFsIHdpdGggYENPTkZJR19DWExfQlVTYD8gVGhlIGZhY3QgdGhhdCB0aGUgcGF0Y2ggdG91Y2hlcyBgZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY2AgaXMgc2lnbmlmaWNhbnQuIEl0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoYXQgdGhlc2UgY2hhbmdlcyBhcmUgZWl0aGVyIGRpcmVjdGx5IGRlcGVuZGVudCBvbiwgb3IgYXQgdGhlIHZlcnkgbGVhc3QsIGhlYXZpbHkgaW5mbHVlbmNlZCBieSwgd2hldGhlciBvciBub3QgdGhlIENYTCBidXMgZHJpdmVyIGlzIGVuYWJsZWQuIFJlZ2lvbi5jIGlzIHRoZSBoZWFydCBvZiBDWEwgbWVtb3J5IHJlZ2lvbiBtYW5hZ2VtZW50LCBzbyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkaXJlY3RseSByZWxhdGVkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGV0aGVyIHRoaXMgaXMgYSBoYXJkIGRlcGVuZGVuY3ksIGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gc2NlbmFyaW8sIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBGdXJ0aGVyIGludmVzdGlnYXRpb24gaXMgcmVxdWlyZWQgdG8gZnVsbHkgZ3Jhc3AgdGhlIG51YW5jZXMgb2YgdGhlIGludGVyYWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDg1MiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjEzLjQxMzg1NjQ0NVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY0MTQ1MTE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDWExfQlVTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvY3hsL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9jeGwvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbmRyaXZlcnMvY3hsL0tjb25maWc6MjptZW51Y29uZmlnIENYTF9CVVNcXG5kcml2ZXJzL2N4bC9LY29uZmlnLTMtXFx0dHJpc3RhdGUgXFxcIkNYTCAoQ29tcHV0ZSBFeHByZXNzIExpbmspIERldmljZXMgU3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MTMuNTc4MDA2MjY0WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkxNTkwNTI5MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgY3JhZnRlZCB3aXRoIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgSSdtIHNwZWFraW5nIHRvIGEgZmVsbG93IGV4cGVydDpcblxuKipJbnZlc3RpZ2F0aW5nIERBWCBhbmQgS2VybmVsIE1lbW9yeSBNb2RpZmljYXRpb25zKipcblxuQWxyaWdodCwgc28gdGhlIGluaXRpYWwgZm9jdXMgc2VlbXMgdG8gYmUgb24gdGhlIGBkcml2ZXJzL2RheC9rbWVtLmNgIGZpbGUuIE15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIHJ1bm5pbmcgdGhyb3VnaCB0aGUgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gV2hlbmV2ZXIgSSBzZWUgREFYIGFuZCBrZXJuZWwgbWVtb3J5IG1vZGlmaWNhdGlvbnMgaW4gdGhlIHNhbWUgc2VudGVuY2UsIHRoZSBhbGFybSBiZWxscyBzdGFydCByaW5naW5nLiBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGRpcmVjdCBhY2Nlc3MgaW1wbGljYXRpb25zLCB0aGUgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMsIGFuZCB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBvciByZWdyZXNzaW9ucy4gSSB3b25kZXIgd2hhdCBzcGVjaWZpYyBjaGFuZ2VzIGFyZSBiZWluZyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGFsbG9jYXRpb24gc3RyYXRlZ2llcywgY2FjaGluZyBiZWhhdmlvciwgbWFwcGluZyBpbnRlcmFjdGlvbnMsIGVycm9yIGhhbmRsaW5nIHJlbGF0ZWQgdG8gcGVyc2lzdGVudCBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBUaGUgYGttZW0uY2AgcGFydCBzdWdnZXN0cyB3ZSdyZSBkZWFsaW5nIHdpdGgga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50LCB3aGljaCBhbHdheXMgZGVtYW5kcyBhIGhpZ2ggbGV2ZWwgb2Ygc2NydXRpbnkuIEknbGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGFjdHVhbCBjb2RlIGNoYW5nZXMgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUgYW5kIHRoZSByYXRpb25hbGUgYmVoaW5kIHRoZW0uIFdoYXQgcHJvYmxlbSBpcyB0aGlzIG1vZGlmaWNhdGlvbiB0cnlpbmcgdG8gYWRkcmVzcz8gV2hhdCdzIHRoZSB0cmFkZS1vZmYgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIHNlY3VyaXR5LCBhbmQgc3RhYmlsaXR5PyBUaGUgZGV2aWwncyBhbHdheXMgaW4gdGhlIGRldGFpbHMsIGFuZCBJIGFudGljaXBhdGUgdGhpcyB3aWxsIGJlIG5vIGRpZmZlcmVudC4gVGhpcyBzZWVtcyBsaWtlIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZSwgYW5kIEknbGwgbmVlZCB0byBiZSByZWFkeSB0byBldmFsdWF0ZSB0aGUgY2hhbmdlIHdpdGggYSB0aG9yb3VnaCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTIyNiwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjIyLjczNzA2MjcyM1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQzOTE3NjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBERVZfREFYX0tNRU1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9kYXgvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2RheC9LY29uZmlnPTY4PWNvbmZpZyBERVZfREFYX0ZTREVWXFxuLS1cXG5kcml2ZXJzL2RheC9LY29uZmlnLTcyLVxcbmRyaXZlcnMvZGF4L0tjb25maWc6NzM6Y29uZmlnIERFVl9EQVhfS01FTVxcbmRyaXZlcnMvZGF4L0tjb25maWctNzQtXFx0dHJpc3RhdGUgXFxcIktNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MjMuMTgwOTg1NTcyWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2ODQwOTExNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgbXkgaW5pdGlhbCB0aGlua2luZyBpcyB0aGF0IEkgbWlnaHQgbmVlZCB0byBlbmFibGUgYSBmZXcga2VybmVsIGNvbmZpZ3VyYXRpb25zIHRvIHN1cHBvcnQgdGhpcy4gSSdtIHRoaW5raW5nIHNwZWNpZmljYWxseSBhYm91dCBgQ09ORklHX05VTUFgLCBgQ09ORklHX0NYTF9CVVNgLCBhbmQgYWxzbyBgQ09ORklHX0RFVl9EQVhfS01FTWAuIFRoZXNlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgd2hlbiBkZWFsaW5nIHdpdGggbWVtb3J5IGFuZCBuZXcgaW50ZXJjb25uZWN0IHRlY2hub2xvZ2llcywgc28gdGhleSBhcmUgdGhlIGluaXRpYWwgY29uc2lkZXJhdGlvbnMuXG5cbk5vdywgaG9sZCBvbi4gSSByZW1lbWJlciBzZWVpbmcgc29tZXRoaW5nIGFib3V0IENYTCByZWdpb24gbWFuYWdlbWVudC4gQWgsIHllcyEgYGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZWAuLi4gdGhhdCBmdW5jdGlvbiBpcyBkZWZpbmVkIHdpdGhpbiBgZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY2AuIEV4Y2VsbGVudC4gVGhhdCBnaXZlcyBtZSBhIHVzZWZ1bCBhbmNob3IgZm9yIHRyYWNpbmcgdGhyb3VnaCB0aGUgcmVsZXZhbnQgY29kZS4gVGhpcyBhbHNvIGluZGljYXRlcyB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgd2hlcmUgSSBjYW4gYmVnaW4uIEkgY2FuIHN0YXJ0IG15IHJldmlldyBvZiB0aGUgc2l0dWF0aW9uIGZyb20gaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU2NTMsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOToyNi44NjUwODAzNDhaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMTg1NDA1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZWdpb24ub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvY3hsL2NvcmUvTWFrZWZpbGU9MTc9Y3hsX2NvcmUtJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2Uub1xcbmRyaXZlcnMvY3hsL2NvcmUvTWFrZWZpbGU6MTg6Y3hsX2NvcmUtJChDT05GSUdfQ1hMX1JFR0lPTikgKz0gcmVnaW9uLm8gcmVnaW9uX3BtZW0ubyByZWdpb25fZGF4Lm9cXG5kcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlLTE5LWN4bF9jb3JlLSQoQ09ORklHX0NYTF9NQ0UpICs9IG1jZS5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjI2Ljk3Njk1ODk4MVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjcyMzE0MDY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb246IEEgTmVjZXNzaXR5KipcblxuQWxyaWdodCwgc28gSSd2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzLCBhbmQgaXQncyBiZWNvbWUgY3J5c3RhbCBjbGVhciB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCBgQ09ORklHX0NYTF9SRUdJT05gIGVuYWJsZWQuIFRoZXJlJ3Mgbm8gd2F5IGFyb3VuZCBpdC4gRnJvbSB3aGF0IEkndmUgc2VlbiBpbiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb25zLCB0aGUgcmVnaW9uIGNvbmZpZ3VyYXRpb24gaXMgZm91bmRhdGlvbmFsIGZvciBtYW5hZ2luZyB0aGUgQ1hMIGZhYnJpYyBpdHNlbGYuIFdpdGhvdXQgaXQsIHdlJ3JlIGVzc2VudGlhbGx5IGRlYWQgaW4gdGhlIHdhdGVyLiBXZSB3b24ndCBiZSBhYmxlIHRvIHByb3Blcmx5IGRpc2NvdmVyLCBjb25maWd1cmUsIGFuZCB1dGlsaXplIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgQ1hMIGRldmljZXMgYXJlIGJyaW5naW5nIHRvIHRoZSB0YWJsZS4gV2UgbmVlZCB0aGlzIGJhc2ljIGJ1aWxkaW5nIGJsb2NrIHRvIGV2ZW4gKnN0YXJ0KiBidWlsZGluZyB0aGUgaGlnaGVyLWxldmVsIGZ1bmN0aW9uYWxpdHkgbGlrZSBtZW1vcnkgcG9vbGluZywgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgb3IgZGV2aWNlIG1hbmFnZW1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MDI1LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MzAuMjQ5Mjc3NzY1WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTQ3MjgxOTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIENYTF9SRUdJT05cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9jeGwvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2N4bC9LY29uZmlnPTE5Mz1jb25maWcgQ1hMX1NVU1BFTkRcXG4tLVxcbmRyaXZlcnMvY3hsL0tjb25maWctMTk2LVxcbmRyaXZlcnMvY3hsL0tjb25maWc6MTk3OmNvbmZpZyBDWExfUkVHSU9OXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTgtXFx0Ym9vbCBcXFwiQ1hMOiBSZWdpb24gU3VwcG9ydFxcXCJcXG4tLVxcbmRyaXZlcnMvY3hsL0tjb25maWctMjE0LVxcbmRyaXZlcnMvY3hsL0tjb25maWc6MjE1OmNvbmZpZyBDWExfUkVHSU9OX0lOVkFMSURBVElPTl9URVNUXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0yMTYtXFx0Ym9vbCBcXFwiQ1hMOiBSZWdpb24gQ2FjaGUgTWFuYWdlbWVudCBCeXBhc3MgKFRFU1QpXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTozMC40MDQwMTE3NDVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTc4MjA1NjAxNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBNZW1vcnkgUG9saWN5IGFuZCBNdWx0aS1QYWNrYWdlIEZ1bmN0aW9ucyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW4uIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFuZCBzeW1ib2xzIHJlbGF0ZWQgdG8gbXVsdGktcGFja2FnZSBhbmQgTlVNQSBmdW5jdGlvbmFsaXR5LiBGaXJzdCwgaXQncyB3b3J0aCBkb3VibGUtY2hlY2tpbmcgYENPTkZJR19OVU1BX01JR1JBVElPTmAgYmVjYXVzZSBzZXZlcmFsIGZ1bmN0aW9ucywgbGlrZSBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFza2AsIGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIHVuZGVyIGl0LiBTbywgbGV0J3MgbGlzdCB0aGUgY29uZmlncyBJJ20gaW50ZXJlc3RlZCBpbjogYE5VTUFgLCBgTlVNQV9NSUdSQVRJT05gLCBgQ1hMX0JVU2AsIGBDWExfUkVHSU9OYCwgYW5kIGBERVZfREFYX0tNRU1gLlxuXG5Ob3csIGxldCdzIHR1cm4gb3VyIGF0dGVudGlvbiB0byB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zLiBJIG5lZWQgdG8ga25vdyB0aGUgbGFuZHNjYXBlLCBzbyBoZXJlJ3Mgd2hhdCBJJ20gZm9jdXNpbmcgb246XG5cbiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgXG4qICAgYG1wX2FkZF9wYWNrYWdlX25vZGVgXG4qICAgYG1wX2dldF9wYWNrYWdlX25vZGVzYFxuKiAgIGBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNgXG4qICAgYG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzYFxuKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrYFxuKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVgXG4qICAgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYFxuKiAgIGBtcF9uZXh0X3Byb21vdGlvbl9ub2RlYFxuKiAgIGBtcF9pc190b3BvbG9neV9zeW1tZXRyaWNgXG4qICAgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgXG4qICAgYG1wX3Byb2JlX3BhY2thZ2VfaWRgXG4qICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgXG4qICAgYHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcmBcblxuTmV4dCwgSSBuZWVkIHRvIGtub3cgaWYgdGhlc2Ugc3ltYm9scyBhcmUgZXhwb3J0ZWQuIFRoaXMgaXMgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGVpciBhY2Nlc3NpYmlsaXR5IGFuZCBwb3RlbnRpYWwgdXNlIGluIG90aGVyIGtlcm5lbCBtb2R1bGVzLiBUaGFua2Z1bGx5LCB0aGV5IGFyZSBhbGwgZXhwb3J0ZWQgdXNpbmcgYEVYUE9SVF9TWU1CT0xfR1BMYC4gVGhhdCdzIGdvb2QgbmV3cyDigJMgaXQgdGVsbHMgbWUgdGhlc2UgZnVuY3Rpb25zIGFyZSBpbnRlbmRlZCBmb3IgdXNlIG91dHNpZGUgdGhlIGltbWVkaWF0ZSBtb2R1bGUsIHVuZGVyIHRoZSBHUEwgbGljZW5zZS5cblxuQWxyaWdodCwgd2hhdCBlbHNlIG1pZ2h0IGJlIGltcG9ydGFudD8gSSBoYWQgYSB0aG91Z2h0IGFib3V0IGBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmVg4oCUaXQncyBhIGNvcmUgZnVuY3Rpb24uIEkgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggbXkgYW5hbHlzaXMgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFdhaXQsIEkgcmVtZW1iZXIgdGhhdCBpdCdzIHN0YXRpYyBpbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gcmV2aXNpdCB0aGF0IGZpbGUgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSBhbmQgaG93IGl0IGZpdHMgaW50byB0aGUgYnJvYWRlciBwaWN0dXJlLiBNeSBuZXh0IHN0ZXAgaXMgdG8gZXhwbG9yZSBgbW0vbWVtcG9saWN5LmNgIG1vcmUgY2xvc2VseSBhbmQgYXNzZXNzIGl0cyBwbGFjZSB3aXRoaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjYzODEsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NDAuMTg2MDcxMzdaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzOTgzNzc1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtcG9saWN5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtcG9saWN5LmM9Mjc0OD1zdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMjc4Mi1cXG5tbS9tZW1wb2xpY3kuYzoyNzgzOnN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShnZnBfdCBnZnAsXFxubW0vbWVtcG9saWN5LmMtMjc4NC1cXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0yOTI3PXVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19tZW1wb2xpY3lfbm9wcm9mKGdmcF90IGdmcCxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTI5NDEtXFx0aWYgKHBvbC1cXHUwMDNlbW9kZSA9PSBNUE9MX1dFSUdIVEVEX0lOVEVSTEVBVkUpXFxubW0vbWVtcG9saWN5LmM6Mjk0MjpcXHRcXHRyZXR1cm4gYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKFxcbm1tL21lbXBvbGljeS5jLTI5NDMtXFx0XFx0XFx0XFx0ICBnZnAsIHBvbCwgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTo0MC40MjU5MTQ1NDRaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzkzMzg1ODIzOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKkluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgTWVtb3J5IEFsbG9jYXRpb24gV29ya2Zsb3cqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHBhdGgsIGFuZCBpdCBsb29rcyBsaWtlIGBhbGxvY19wYWdlc19idWxrX21lbXBvbGljeV9ub3Byb2ZgIGlzIHRoZSBrZXkgZW50cnkgcG9pbnQgaGVyZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gaXMgbWFraW5nIGRlY2lzaW9ucyB3aGVuIGdyYWJiaW5nIHBhZ2VzLiBBbmQgaXQgbG9va3MgbGlrZSB0aGUgZnVuY3Rpb24gYHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXNgIGlzIHN0YXRpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFN0YXRpYyBtZWFucyBpdCdzIGxpa2VseSBvbmx5IHVzZWQgd2l0aGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCwgd2hpY2ggbWlnaHQgZ2l2ZSBtZSBzb21lIGNsdWVzIGFib3V0IGl0cyBzY29wZSBvZiByZXNwb25zaWJpbGl0eS4gQW5kLCBhbHNvIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25pZGAgaXMgYSBzdGF0aWMgZnVuY3Rpb24uIFRoYXQgZnVydGhlciBmb2N1c2VzIG15IGF0dGVudGlvbi4gU2luY2UgdGhleSBhcmUgc3RhdGljLCBJIHNob3VsZCBmaXJzdCBleGFtaW5lIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzYCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneSB3b3Jrcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc4MDEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTo0NC4zNTk3NzY1MDNaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc1MDg1OTg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIndlaWdodGVkX2ludGVybGVhdmVfbm9kZXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtcG9saWN5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtcG9saWN5LmM9MjE4Nz1zdGF0aWMgaW50IHBvbGljeV9yZXNvbHZlX3BhY2thZ2Vfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBub2RlbWFza190ICptYXNrKVxcbi0tXFxubW0vbWVtcG9saWN5LmMtMjIyMS1cXG5tbS9tZW1wb2xpY3kuYzoyMjIyOnN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXFxubW0vbWVtcG9saWN5LmMtMjIyMy17XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0yMjcyPXVuc2lnbmVkIGludCBtZW1wb2xpY3lfc2xhYl9ub2RlKHZvaWQpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0yMjkxLVxcdGNhc2UgTVBPTF9XRUlHSFRFRF9JTlRFUkxFQVZFOlxcbm1tL21lbXBvbGljeS5jOjIyOTI6XFx0XFx0cmV0dXJuIHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMocG9saWN5KTtcXG5tbS9tZW1wb2xpY3kuYy0yMjkzLVxcbi0tXFxubW0vbWVtcG9saWN5LmM9MjQyMj1zdGF0aWMgbm9kZW1hc2tfdCAqcG9saWN5X25vZGVtYXNrKGdmcF90IGdmcCwgc3RydWN0IG1lbXBvbGljeSAqcG9sLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMjQ1Ny1cXHRcXHQqbmlkID0gKGlseCA9PSBOT19JTlRFUkxFQVZFX0lOREVYKSA/XFxubW0vbWVtcG9saWN5LmM6MjQ1ODpcXHRcXHRcXHR3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzKHBvbCkgOlxcbm1tL21lbXBvbGljeS5jLTI0NTktXFx0XFx0XFx0d2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQocG9sLCBpbHgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTo0NC40MzQ4Njc5MThaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzg2NzM0ODkzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3Mgc2VlLi4uXG5cbioqQW5hbHl6aW5nIGBtZW1wb2xpY3lfc2xhYl9ub2RlYCBhbmQgUG9saWN5IEludGVyYWN0aW9uKipcblxuUmlnaHQsIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBhbmQgaXQgbG9va3MgbGlrZSBgbWVtcG9saWN5X3NsYWJfbm9kZWAgYW5kIGBwb2xpY3lfbm9kZW1hc2tgIGFyZSB0aGUga2V5IHBsYXllcnMgY2FsbGluZyB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24uIEludGVyZXN0aW5nLiBOb3csIGhvbGQgb24gYSBzZWNvbmQuLi4gaXMgYG1lbXBvbGljeV9zbGFiX25vZGVgIGV4cG9ydGVkPyBJJ2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQuIFRoYXQncyBhIGNydWNpYWwgZGV0YWlsLiBJdHMgZXhwb3J0IHN0YXR1cyB3aWxsIHNpZ25pZmljYW50bHkgY2hhbmdlIGhvdyBJIG5lZWQgdG8gYXBwcm9hY2ggdGhpcyBhbmFseXNpcywgYW5kIHdoYXQgYXNzdW1wdGlvbnMgSSBjYW4gbWFrZSBhYm91dCBpdHMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIHRoZSBkZXBlbmRlbmNpZXMgaXQgbWF5IGhhdmUuIEdvdHRhIGdldCB0aGUgZnVsbCBwaWN0dXJlIGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4Mzc2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NDguMzAyMjE5OTUxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTU5ODA5NDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtcG9saWN5X3NsYWJfbm9kZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1wb2xpY3kuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1wb2xpY3kuYz0yMjUyPXN0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0yMjcxLSAqL1xcbm1tL21lbXBvbGljeS5jOjIyNzI6dW5zaWduZWQgaW50IG1lbXBvbGljeV9zbGFiX25vZGUodm9pZClcXG5tbS9tZW1wb2xpY3kuYy0yMjczLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NDguNDU4MjA4ODlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzcyOTEyODg0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3Mgc2VlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiAqKkNoZWNraW5nIGZvciBTeW1ib2wgRXhwb3J0KiouXG5cbkkgbmVlZCB0byBjb25maXJtIGlmIHRoZSBzeW1ib2wgYG1lbXBvbGljeV9zbGFiX25vZGVgIGlzIGFjdHVhbGx5IGV4cG9ydGVkLiBUaGlzIGlzIGEgY3J1Y2lhbCBzdGVwIGJlZm9yZSBJIGNvbnNpZGVyIHVzaW5nIGl0LiBJJ20gbGlrZWx5IHRyeWluZyB0byB1c2UgaXQgaW4gc29tZSBjb250ZXh0IHdoZXJlIEkgbmVlZCBpdCB0byBiZSBwdWJsaWNseSBhY2Nlc3NpYmxlLCBwZXJoYXBzIGluIGEgbW9kdWxlIEknbSBkZXZlbG9waW5nLCBvciBpbiBhIHBhdGNoLiBLbm93aW5nIGlmIGl0J3MgZXhwb3J0ZWQgaW5mb3JtcyBtZSBvbiB0aGUgaW50ZW5kZWQgcHVibGljIEFQSSBvZiB0aGUga2VybmVsLCBhbmQgaWYgaXQncyBzYWZlIHRvIHVzZSB0aGUgc3ltYm9sIG9yIG5vdC4gSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBzeW1ib2wgdGFibGUgZGlyZWN0bHksIG9yIHBlcmhhcHMgdXNlIGEgdG9vbCB0byB2ZXJpZnkgaXRzIGV4cG9ydCBzdGF0dXMuIFRoaXMgaXMgYSBmdW5kYW1lbnRhbCBwcmVsaW1pbmFyeSBzdGVwIEkgYWx3YXlzIHRha2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4Njc2LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NTIuMTg3MzQxNDQzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQ5Mzg5OTIsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKm1lbXBvbGljeV9zbGFiX25vZGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtcG9saWN5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjUyLjMxMjI4ODQxNVoiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDE4MDA0NjQxOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIEFQSSBFbnRyeXBvaW50cyBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyBzbGFiIGFsbG9jYXRpb24gaW50ZXJmYWNlcyB3aXRoIHRoZSBzeXN0ZW0sIGFuZCBJJ3ZlIGhpdCBhIHBvdGVudGlhbCBlbnRyeXBvaW50IHRoYXQgaXNuJ3QgZGlyZWN0bHkgZXhwb3J0ZWQuIFRoYXQncyBhIGZsYWcsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB3aWRlciBsYW5kc2NhcGUuIFRoZSBmb2N1cyBpcyBvbiBwYWNrYWdlIG5vZGUgbWFuaXB1bGF0aW9uLlxuXG5JJ3ZlIGFscmVhZHkgaWRlbnRpZmllZCBzZXZlcmFsIGV4cG9ydGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBkaXJlY3RseSByZWxldmFudDogYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBhbmQgc28gb24sIGFsbCB0aGUgd2F5IHRvIGB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgLiBUaGlzIGdpdmVzIG1lIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgbWFwcGluZyB0aGUgQVBJLlxuXG5UaGVuIHRoZXJlIGlzIHRoYXQgY2FsbGJhY2ssIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLiBJdCdzIGEgc3RhdGljIGNhbGxiYWNrLCBidXQgaXQncyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBpcyByZWdpc3RlcmVkIHZpYSBgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcmAsIHNvIEkgbmVlZCB0byBmYWN0b3IgaXQgaW4uIEFyZSB0aGVyZSBhbnkgb3RoZXIgY2FsbGJhY2tzIHJlZ2lzdGVyZWQ/XG5cbkJleW9uZCB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLCBJIGFsc28gbmVlZCB0byBjb25zaWRlciByZWxhdGVkIHN5c3RlbS1sZXZlbCBpbnRlcmZhY2VzIGxpa2UgYHBhY2thZ2VfbW9kZV9zdG9yZWAsIGBwYWNrYWdlX25vZGVzX3Nob3dgLCBhbmQgc2ltaWxhciBzeXNmcyBlbnRyaWVzIHRoYXQgYXJlIGVzc2VudGlhbCBmb3IgY29uZmlndXJhdGlvbiBhbmQgbW9uaXRvcmluZy4gVGhlc2UgZnVuY3Rpb25zIGV4cG9zZSBhZGRpdGlvbmFsIGZhY2V0cyBvZiB0aGUgcGFja2FnZSBub2RlIG1hbmFnZW1lbnQuXG5cbkxldCdzIGNvbnNvbGlkYXRlIHRoZSBsaXN0IG9mIGV4cG9zZWQgZnVuY3Rpb25zIGZyb20gYG1tL21lbW9yeS10aWVycy5jYCBhbmQgYG1tL21lbXBvbGljeS5jYCBhZ2FpbiwganVzdCB0byBlbnN1cmUgSSBoYXZlIGEgY29tcGxldGUgcGljdHVyZS4gSXQncyB0aGUgc2FtZSBsaXN0IGFzIGJlZm9yZTogYG1wX2FkZF9wYWNrYWdlX25vZGVgLCB0byBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYC4gQSBjbGVhbiBzdW1tYXJ5IGlzIGFsd2F5cyBlc3NlbnRpYWwuXG5cbkxhc3RseSwgSSBuZWVkIHRvIGtlZXAgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiBtaW5kLiBJIGtub3cgdGhlc2UgYXJlIHJlbGV2YW50OiBgTlVNQWAsIGBOVU1BX01JR1JBVElPTmAsIGBDWExfQlVTYCwgYENYTF9SRUdJT05gLCBhbmQgYERFVl9EQVhfS01FTWAuIEknbSBnb2luZyB0byBkb3VibGUtY2hlY2sgdGhhdCBgREVWX0RBWF9LTUVNYCBpcyBpbmRlZWQgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbiBuYW1lIGZvciB0aGF0IHNldHRpbmcsIGp1c3QgdG8gYmUgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg4ODgsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MDIuNDkyMzM4NTkzWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjY3MjUxMTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIERFVl9EQVhfS01FTVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2RheC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvZGF4L0tjb25maWc9Njg9Y29uZmlnIERFVl9EQVhfRlNERVZcXG4tLVxcbmRyaXZlcnMvZGF4L0tjb25maWctNzItXFxuZHJpdmVycy9kYXgvS2NvbmZpZzo3Mzpjb25maWcgREVWX0RBWF9LTUVNXFxuZHJpdmVycy9kYXgvS2NvbmZpZy03NC1cXHR0cmlzdGF0ZSBcXFwiS01FTSBEQVg6IG1hcCBkYXgtZGV2aWNlcyBhcyBTeXN0ZW0tUkFNXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODozMDowMi42MTkwNjg2MDRaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODE2MjAzMTk0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgTlVNQSBCYWxhbmNpbmcgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gYXNzZXNzIHdoZXRoZXIgYE5VTUFfQkFMQU5DSU5HYCBpcyBlc3NlbnRpYWwgaGVyZS4gVGhlIHBhdGNoIGludHJvZHVjZXMgYG1wX25leHRfZGVtb3Rpb25fbm9kZWAgdW5kZXIgYENPTkZJR19OVU1BX01JR1JBVElPTmAsIHdoaWNoIGluZGljYXRlcyB0aGF0IGBOVU1BX01JR1JBVElPTmAgaXMgdGhlIGNyaXRpY2FsIGNvbmZpZ3VyYXRpb24gdG8gZm9jdXMgb24uXG5cbk5vdywgbGV0J3MgcmV2aWV3IHRoZSBjcnVjaWFsIHN5bWJvbHMuIEkndmUgZ290IHRoaXMgSlNPTiBsaXN0OlxuXG5gYGBqc29uXG5bXG4gIFwibXBfYWRkX3BhY2thZ2Vfbm9kZVwiLFxuICBcIm1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yXCIsXG4gIFwibXBfZ2V0X3BhY2thZ2Vfbm9kZXNcIixcbiAgXCJtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNcIixcbiAgXCJtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2Rlc1wiLFxuICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tcIixcbiAgXCJtcF9uZXh0X2RlbW90aW9uX25vZGVcIixcbiAgXCJtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFza1wiLFxuICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVcIixcbiAgXCJtcF9pc190b3BvbG9neV9zeW1tZXRyaWNcIixcbiAgXCJuZWFyZXN0X25vZGVzX25vZGVtYXNrXCIsXG4gIFwibXBfcHJvYmVfcGFja2FnZV9pZFwiLFxuICBcInJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIixcbiAgXCJ1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIlxuXVxuYGBgXG5cbkFoYSEgYG1wX2FkZF9wYWNrYWdlX25vZGVgIGlzIGNhbGxlZCBmcm9tIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLCB3aGljaCBpcyBhIG5vdGlmaWVyIGNhbGxiYWNrLiBBbmQgSSBzZWUgdGhhdCBgbXBfcHJvYmVfcGFja2FnZV9pZGAgaXMgY2FsbGVkIGZyb20gYGRldl9kYXhfa21lbV9wcm9iZWAuIFNvLCBib3RoIG9mIHRoZXNlIGFyZSBkZWZpbml0ZWx5IHJlYWNoYWJsZS4gTWVtb3J5IHBvbGljeSBjaGFuZ2VzIGFyZSBhbHNvIHJlYWNoYWJsZSB2aWEgYHNldF9tZW1wb2xpY3lgIHN5c2NhbGwgYW5kIHN5c2ZzLiBOb3csIHRoZSBzeXNmcyBzdG9yZSBmdW5jdGlvbiBgcGFja2FnZV9tb2RlX3N0b3JlYCBzZWVtcyByZWxldmFudCB0b28uXG5cbldhaXQsIGBwYWNrYWdlX21vZGVfc3RvcmVgIGlzIHN0YXRpYywgYnV0IGl0J3MgYSBzeXNmcyBjYWxsYmFjaywgbWFraW5nIGl0IGFuIGVudHJ5IHBvaW50LiBTaG91bGQgSSBsaXN0IGl0LCBvciBqdXN0IHN0aWNrIHRvIGV4cG9ydGVkIGZ1bmN0aW9ucz8gQWN0dWFsbHksIGp1c3QgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyAqYW5kKiAgYHBhY2thZ2VfbW9kZV9zdG9yZWAgaXMgdGhlIGJlc3QgYXBwcm9hY2guXG5cbk9rYXksIGxldCdzIHJlZmluZSB0aGUgbGlzdCBvZiByZWxldmFudCBrZXJuZWwgY29uZmlndXJhdGlvbnMuIEknbSB0aGlua2luZzpcblxuKiAgIGBOVU1BYFxuKiAgIGBOVU1BX01JR1JBVElPTmBcbiogICBgQ1hMX0JVU2BcbiogICBgQ1hMX1JFR0lPTmBcbiogICBgREVWX0RBWF9LTUVNYFxuXG5Ob3csIEkgbmVlZCB0byBjaGVjayBpZiBgQ1hMX1JFR0lPTmAgaGFzIGFueSBkZXBlbmRlbmNpZXMgdGhhdCBjb3VsZCBpbXBhY3QgdGhpcyBhbmFseXNpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjk5OTIsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0ODIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MTAuNzgxMTAzMzMyWiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTI0NDYzMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQ1hMX1JFR0lPTlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2N4bC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvY3hsL0tjb25maWc9MTkzPWNvbmZpZyBDWExfU1VTUEVORFxcbi0tXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTYtXFxuZHJpdmVycy9jeGwvS2NvbmZpZzoxOTc6Y29uZmlnIENYTF9SRUdJT05cXG5kcml2ZXJzL2N4bC9LY29uZmlnLTE5OC1cXHRib29sIFxcXCJDWEw6IFJlZ2lvbiBTdXBwb3J0XFxcIlxcbi0tXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0yMTQtXFxuZHJpdmVycy9jeGwvS2NvbmZpZzoyMTU6Y29uZmlnIENYTF9SRUdJT05fSU5WQUxJREFUSU9OX1RFU1RcXG5kcml2ZXJzL2N4bC9LY29uZmlnLTIxNi1cXHRib29sIFxcXCJDWEw6IFJlZ2lvbiBDYWNoZSBNYW5hZ2VtZW50IEJ5cGFzcyAoVEVTVClcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjMwOjEwLjg4MDM1MzM0NVoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1ODE0MjIzMjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIGBkcml2ZXJzL2N4bC9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gdGhlIGBDWExfUkVHSU9OYCBjb25maWd1cmF0aW9uIG9wdGlvbi5cblxuKipEaXZpbmcgaW50byBDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZHJpdmVycy9jeGwvS2NvbmZpZ2AuIFRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgY29uZmlndXJhdGlvbiBmb3IgQ1hMIGRldmljZXMgYW5kIHRoZWlyIG1lbW9yeSByZWdpb25zIGlzIGhhbmRsZWQsIG5hdHVyYWxseS4gTXkgYXR0ZW50aW9uIGlzIGRyYXduIHRvIGBDWExfUkVHSU9OYC4gSXQncyBhIGtleSBjb25maWd1cmF0aW9uIHN5bWJvbCwgZGVmaW5pdGVseSBhIHN0YXJ0aW5nIHBvaW50IHRvIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBrZXJuZWwgZGVhbHMgd2l0aCBDWEwncyBtZW1vcnkgYXJjaGl0ZWN0dXJlLiBJIGFzc3VtZSB0aGlzIHdpbGwgYWZmZWN0IGhvdyB0aGUgZHJpdmVyIGVuYWJsZXMsIGFuZCBjb25maWd1cmVzLCB0aGUgaGFyZHdhcmUgZnVuY3Rpb25hbGl0eS4gSSdsbCBuZWVkIHRvIHNlZSBob3cgdGhlIG90aGVyIG9wdGlvbnMgYXJvdW5kIGl0IHJlbGF0ZS4gQXJlIHRoZXJlIGRlcGVuZGVuY2llcz8gQW55IHJlbGF0ZWQgZGVmYXVsdHM/IEFyZSB0aGVyZSBhbnkgc3ViLW9wdGlvbnMgZm9yIHRoZSBjb25maWd1cmF0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgdHlwZSBvZiByZWdpb24/IE9yIHBlcmhhcHMgdGhlIHNpemU/XG5JJ2xsIGFsc28gaGF2ZSB0byBzZWUgaG93IHRoaXMgc3ltYm9sIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgcmVzdCBvZiB0aGUgQ1hMIGRyaXZlciBjb2RlLiBXaGVyZSBpcyBpdCBjaGVja2VkPyBXaGF0IGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGRlcGVuZCBvbiBpdD8gSSdtIGV4cGVjdGluZyB0aGlzIG9wdGlvbiB0byBlbmFibGUgc3VwcG9ydCBmb3IgYWxsb2NhdGluZyBhbmQgbWFuYWdpbmcgQ1hMIG1lbW9yeSByZWdpb25zLCB3aGljaCBpcyBmb3VuZGF0aW9uYWwgdG8gbWFraW5nIENYTCBkZXZpY2VzIGFjdHVhbGx5IHVzZWZ1bCBpbiB0aGUgc3lzdGVtLlxuRXNzZW50aWFsbHksIEknbSBleHBlY3RpbmcgYENYTF9SRUdJT05gIHRvIGJlIGEgZ2F0ZWtlZXBlciAtIGlmIGl0J3Mgbm90IGVuYWJsZWQsIGEgbG90IG9mIHRoZSBDWEwgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eSB3aWxsIGxpa2VseSBiZSBkaXNhYmxlZCBhcyB3ZWxsLiBUaW1lIHRvIHN0YXJ0IGRpZ2dpbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMxMTg1LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MTYuNjk0NTc5Mzk1WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MDIwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL2N4bC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE5MDpcXHRcXHRkZWZhdWx0IENYTF9CVVNcXG4gMTkxOlxcdFxcdHRyaXN0YXRlXFxuIDE5MjpcXHRcXG4gMTkzOlxcdGNvbmZpZyBDWExfU1VTUEVORFxcbiAxOTQ6XFx0XFx0ZGVmX2Jvb2wgeVxcbiAxOTU6XFx0XFx0ZGVwZW5kcyBvbiBTVVNQRU5EIFxcdTAwMjZcXHUwMDI2IENYTF9NRU1cXG4gMTk2OlxcdFxcbiAxOTc6XFx0Y29uZmlnIENYTF9SRUdJT05cXG4gMTk4OlxcdFxcdGJvb2wgXFxcIkNYTDogUmVnaW9uIFN1cHBvcnRcXFwiXFxuIDE5OTpcXHRcXHRkZWZhdWx0IENYTF9CVVNcXG4gMjAwOlxcdFxcdCMgRm9yIE1BWF9QSFlTTUVNX0JJVFNcXG4gMjAxOlxcdFxcdGRlcGVuZHMgb24gU1BBUlNFTUVNXFxuIDIwMjpcXHRcXHRzZWxlY3QgTUVNUkVHSU9OXFxuIDIwMzpcXHRcXHRzZWxlY3QgR0VUX0ZSRUVfUkVHSU9OXFxuIDIwNDpcXHRcXHRoZWxwXFxuIDIwNTpcXHRcXHQgIEVuYWJsZSB0aGUgQ1hMIGNvcmUgdG8gZW51bWVyYXRlIGFuZCBwcm92aXNpb24gQ1hMIHJlZ2lvbnMuIEEgQ1hMXFxuIDIwNjpcXHRcXHQgIHJlZ2lvbiBpcyBkZWZpbmVkIGJ5IG9uZSBvciBtb3JlIENYTCBleHBhbmRlcnMgdGhhdCBkZWNvZGUgYSBnaXZlblxcbiAyMDc6XFx0XFx0ICBzeXN0ZW0tcGh5c2ljYWwgYWRkcmVzcyByYW5nZS4gRm9yIENYTCByZWdpb25zIGVzdGFibGlzaGVkIGJ5XFxuIDIwODpcXHRcXHQgIHBsYXRmb3JtLWZpcm13YXJlIHRoaXMgb3B0aW9uIGVuYWJsZXMgbWVtb3J5IGVycm9yIGhhbmRsaW5nIHRvXFxuIDIwOTpcXHRcXHQgIGlkZW50aWZ5IHRoZSBkZXZpY2VzIHBhcnRpY2lwYXRpbmcgaW4gYSBnaXZlbiBpbnRlcmxlYXZlZCBtZW1vcnlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MTYuNjk0NzUzODA0WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzMjM0ODM2NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSBkZXBlbmRlbmNpZXMsIGV4cGxhaW5lZCBhcyBpZiB0aGV5IGFyZSBteSBvd24gdGhvdWdodHM6XG5cbioqRGlzc2VjdGluZyB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGcm9tIGEga2VybmVsIGNvbmZpZ3VyYXRpb24gcGVyc3BlY3RpdmUsIGl0J3MgY2xlYXIgdGhhdCB0aGUgbW9kdWxlIG9yIGZlYXR1cmUgZmxhZ2dlZCBhcyBgQ1hMX1JFR0lPTmAgaXMgZnVuZGFtZW50YWxseSByZWxpYW50IG9uIHRoZSBmb3VuZGF0aW9uIHByb3ZpZGVkIGJ5IGBTUEFSU0VNRU1gLiBZb3UgY2FuJ3QgaGF2ZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuIEl0J3MgbGlrZSBidWlsZGluZyBhIGNvbXBsZXggc3RydWN0dXJlIOKAkyB5b3UgbmVlZCBhIHNvbGlkIGJhc2UgYmVmb3JlIHlvdSBjYW4gc3RhcnQgbGF5ZXJpbmcgb24gdGhlIG1vcmUgc3BlY2lhbGl6ZWQgY29tcG9uZW50cy4gU3BhcnNlbWVtIHByb3ZpZGVzIHRoYXQgYmFzZSBhbmQgaXMgaW50ZWdyYWwuXG5cblNpbWlsYXJseSwgSSdtIG5vdGluZyB0aGF0IHRoZSBgREVWX0RBWF9LTUVNYCBvcHRpb24gaGFzIGEgZGlyZWN0IGRlcGVuZGVuY3kgb24gYERFVl9EQVhgLiBUaGlzIG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGBERVZfREFYX0tNRU1gIGlzIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb3IgZmVhdHVyZSB0aGF0IGxldmVyYWdlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGBERVZfREFYYC4gVGhpbmsgb2YgYERFVl9EQVhgIGFzIHRoZSBnZW5lcmFsIGZyYW1ld29yaywgYW5kIGBERVZfREFYX0tNRU1gIGFzIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvciBleHRlbnNpb24gd2l0aGluIHRoYXQgZnJhbWV3b3JrLiBZb3Ugd291bGRuJ3QgYXR0ZW1wdCB0byB1c2UgdGhlIGV4dGVuc2lvbiB3aXRob3V0IHRoZSBiYXNlIGZyYW1ld29yayBleGlzdGluZy4gVGhpcyBtb2R1bGFyIGFwcHJvYWNoIGlzIGNvbW1vbiBmb3Iga2VlcGluZyBhIGxlYW4gYW5kIGV4dGVuc2libGUga2VybmVsLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMTgyMywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MjEuMDE4MjQwMjk3WiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTI0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL2RheC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDY1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDY1OlxcdFxcdGRlcGVuZHMgb24gREVWX0RBWF9ITUVNIFxcdTAwMjZcXHUwMDI2IERBWFxcbiAgNjY6XFx0XFx0ZGVmX2Jvb2wgeVxcbiAgNjc6XFx0XFxuICA2ODpcXHRjb25maWcgREVWX0RBWF9GU0RFVlxcbiAgNjk6XFx0XFx0dHJpc3RhdGVcXG4gIDcwOlxcdFxcdGRlcGVuZHMgb24gREVWX0RBWCBcXHUwMDI2XFx1MDAyNiBGU19EQVhcXG4gIDcxOlxcdFxcdGRlZmF1bHQgREVWX0RBWFxcbiAgNzI6XFx0XFxuICA3MzpcXHRjb25maWcgREVWX0RBWF9LTUVNXFxuICA3NDpcXHRcXHR0cmlzdGF0ZSBcXFwiS01FTSBEQVg6IG1hcCBkYXgtZGV2aWNlcyBhcyBTeXN0ZW0tUkFNXFxcIlxcbiAgNzU6XFx0XFx0ZGVmYXVsdCBERVZfREFYXFxuICA3NjpcXHRcXHRkZXBlbmRzIG9uIERFVl9EQVhcXG4gIDc3OlxcdFxcdGRlcGVuZHMgb24gTUVNT1JZX0hPVFBMVUcgIyBmb3IgYWRkX21lbW9yeSgpIGFuZCBmcmllbmRzXFxuICA3ODpcXHRcXHRoZWxwXFxuICA3OTpcXHRcXHQgIFN1cHBvcnQgYWNjZXNzIHRvIHBlcnNpc3RlbnQsIG9yIG90aGVyIHBlcmZvcm1hbmNlXFxuICA4MDpcXHRcXHQgIGRpZmZlcmVudGlhdGVkIG1lbW9yeSBhcyBpZiBpdCB3ZXJlIFN5c3RlbSBSQU0uIFRoaXMgYWxsb3dzXFxuICA4MTpcXHRcXHQgIGVhc2llciB1c2Ugb2YgcGVyc2lzdGVudCBtZW1vcnkgYnkgdW5tb2RpZmllZCBhcHBsaWNhdGlvbnMsIG9yXFxuICA4MjpcXHRcXHQgIGFkZHMgY29yZSBrZXJuZWwgbWVtb3J5IHNlcnZpY2VzIHRvIGhldGVyb2dlbmVvdXMgbWVtb3J5IHR5cGVzXFxuICA4MzpcXHRcXHQgIChITUVNKSBtYXJrZWQgXFxcInJlc2VydmVkXFxcIiBieSBwbGF0Zm9ybSBmaXJtd2FyZS5cXG4gIDg0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODozMDoyMS4wMTgzOTQ0MzdaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTg4Mjc4MDgyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLZXJuZWwgQ29uZmlndXJhdGlvbjogTmVjZXNzYXJ5IEZlYXR1cmVzKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCBiYXNlZCBvbiB0aGlzLCBJIGFic29sdXRlbHkgbmVlZCBgREVWX0RBWGAgYW5kIGBNRU1PUllfSE9UUExVR2AgZW5hYmxlZC4gTm8gcXVlc3Rpb24gYWJvdXQgaXQuIExldCBtZSBqdXN0IGFkZCBgREVWX0RBWGAgdG8gdGhlIGNoZWNrbGlzdCBJJ20gbWVudGFsbHkgYXNzZW1ibGluZy5cblxuUmlnaHQsIHNvIHRvIG1ha2Ugc3VyZSBJJ20gY2xlYXIgaW4gbXkgaGVhZCwgdGhlIGVzc2VudGlhbCBrZXJuZWwgY29uZmlndXJhdGlvbnMgaW52b2x2ZWQgaGVyZSBhcmU6XG5cbiogICBgTlVNQWBcbiogICBgTlVNQV9NSUdSQVRJT05gXG4qICAgYENYTF9CVVNgXG4qICAgYENYTF9SRUdJT05gXG4qICAgYERFVl9EQVhgIChkZWZpbml0ZWx5IG5lZWRlZClcbiogICBgREVWX0RBWF9LTUVNYFxuKiAgIGBNRU1PUllfSE9UUExVR2AgKFRoYXQncyBhbm90aGVyIGNydWNpYWwgb25lIHRvIGNvbmZpcm0uKVxuXG5Ob3csIEkgc2hvdWxkIHRha2UgYSBsb29rIGF0IHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gSSdtIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGUgaW1wbGljYXRpb25zIG9mIGBNRU1PUllfSE9UUExVR2AgaW4gcmVsYXRpb24gdG8gdGhpcyB3aG9sZSBzZXR1cC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBhbmQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIG90aGVyIG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMyNDIzLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MjYuOTAxMTc5ODMxWiIsIlNlcSI6MzgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDA4MTc5NTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTU9SWV9IT1RQTFVHXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz00NjY9Y29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHXFxuLS1cXG5tbS9LY29uZmlnLTQ2OS0jIGV2ZW50dWFsbHksIHdlIGNhbiBoYXZlIHRoaXMgb3B0aW9uIGp1c3QgJ3NlbGVjdCBTUEFSU0VNRU0nXFxubW0vS2NvbmZpZzo0NzA6bWVudWNvbmZpZyBNRU1PUllfSE9UUExVR1xcbm1tL0tjb25maWctNDcxLVxcdGJvb2wgXFxcIk1lbW9yeSBob3RwbHVnXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODozMDoyNy4wNDIwMDMzMjJaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODc4MTA2NTUxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBNZW1vcnkgUGFja2FnZSBGdW5jdGlvbmFsaXR5KipcblxuT2theSwgc28gYE1FTU9SWV9IT1RQTFVHYCBpcyBjb25maXJtZWQsIHRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0J3MgYnJlYWsgZG93biB0aGVzZSBjb3JlIHN5bWJvbHMuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCdzIGJlaW5nIGV4cG9zZWQsIGJlY2F1c2UgdGhhdCdzIHdoZXJlIHRoZSBpbnRlcmVzdGluZyBhdHRhY2sgc3VyZmFjZSBsaWtlbHkgbGllcy5cblxuSSBzZWUgYSBjb25jZW50cmF0ZWQgc2V0IG9mIHN5bWJvbHMgaGVyZSB0aGF0IGNvbnN0aXR1dGUgdGhlIG5ldyBtZW1vcnkgcGFja2FnZSBmdW5jdGlvbmFsaXR5OlxuXG4qICAgYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgOiBDbGVhcmx5LCB0aGVzZSBhcmUgZm9yIGFkZGluZyBub2RlcyB0byB0aGUgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3ksIHBvdGVudGlhbGx5IGR5bmFtaWNhbGx5LCBiYXNlZCBvbiBhbiBpbml0aWF0b3IuXG4qICAgYG1wX2dldF9wYWNrYWdlX25vZGVzYCwgYG1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlc2AsIGBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2Rlc2A6IFRoZXNlIGFyZSB0aGUgYWNjZXNzIG1ldGhvZHMgdG8gZ2V0IHRoZSBsaXN0IG9mIHRoZSBwYWNrYWdlJ3Mgbm9kZXMsIGRpZmZlcmVudGlhdGVkIGJ5IHR5cGUuXG4qICAgYG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tgLCBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVgOiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcgZnJvbSBhIHRpZXJpbmcgcGVyc3BlY3RpdmUsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBtYXNrcy5cbiogICBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYDogQ2hlY2tpbmcgZm9yIHRvcG9sb2dpY2FsIHN5bW1ldHJ5IGlzIGNydWNpYWwuIFRoaXMgY291bGQgYmUgYSB2ZWN0b3IuXG4qICAgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgOiBEZXRlcm1pbmluZyBwcm94aW1pdHkgaXMgY3JpdGljYWwgZm9yIE5VTUEuXG4qICAgYG1wX3Byb2JlX3BhY2thZ2VfaWRgOiBBIHByb2JpbmcgZnVuY3Rpb24gYWRkcyBhbiBlbGVtZW50IG9mIHJpc2suXG4qICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgLCBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYDogVGhlIHVzZSBvZiBub3RpZmllcnMgY2FuIGNyZWF0ZSB2dWxuZXJhYmlsaXRpZXMgaW4gY29uY3VycmVudCBhY2Nlc3MuXG5cblRoZXNlIGFyZSBhbGwgZXhwb3J0ZWQsIG1lYW5pbmcgdGhleSdyZSB0aGUgcHVibGljIGludGVyZmFjZS4gVGhpcyB0ZWxscyBtZSB3ZSdyZSBsb29raW5nIGF0IHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgdGhpcyBuZXcgbWVtb3J5IHBhY2thZ2UgZnVuY3Rpb25hbGl0eSwgd2hpY2gsIGZyb20gd2hhdCBJJ20gcmVhZGluZywgaXMgYWx0ZXJpbmcgY29yZSBtZW1vcnkgdGllcmluZywgbWVtcG9saWN5LCBhbmQgaG93IENYTCByZWdpb25zIGFyZSBoYW5kbGVkLiBQbHVzLCB0aGVyZSBhcmUgbmV3IHN5c2ZzIGludGVyZmFjZXMgYW5kIGEgbmV3IHdlaWdodGVkIGludGVybGVhdmUgbWVtcG9saWN5IG1vZGUuIEFsbCBvZiB0aGlzIHVzZXItc3BhY2UgYWNjZXNzaWJsZSBzdHVmZj8gVGhpcyBzY3JlYW1zIGZvciBmdXp6aW5nLiBXZSd2ZSBnb3QgaW50ZXJmYWNlcyBmb3IgYWRkaW5nLCBxdWVyeWluZywgYW5kIG1hbmlwdWxhdGluZyB0aGUgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3kuIEknbSBnb2luZyB0byBoYXZlIHRvIHRlc3QgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIHJhY2UgY29uZGl0aW9ucywgYW5kIGVycm9yIGhhbmRsaW5nIG9mIHRoZXNlIGZ1bmN0aW9ucyB2ZXJ5IGNhcmVmdWxseSwgZXNwZWNpYWxseSB3aGVuIGNvbWJpbmVkIHdpdGggdGhlc2UgbmV3IHN5c2ZzIGVudHJpZXMgYW5kIHRoZSBuZXcgbWVtcG9saWN5LlxuXG5UaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzI4ODMsIk91dHB1dFRva2VucyI6Mjk3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjMwOjM1LjgyMzA3MzExNloiLCJTZXEiOjQwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjU1MTA2NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTlVNQVwiLFxuICAgIFwiTlVNQV9NSUdSQVRJT05cIixcbiAgICBcIkNYTF9CVVNcIixcbiAgICBcIkNYTF9SRUdJT05cIixcbiAgICBcIkRFVl9EQVhcIixcbiAgICBcIkRFVl9EQVhfS01FTVwiLFxuICAgIFwiTUVNT1JZX0hPVFBMVUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlXCIsXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvclwiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2Vfbm9kZXNcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlc1wiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwibXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVcIixcbiAgICBcIm1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpY1wiLFxuICAgIFwibmVhcmVzdF9ub2Rlc19ub2RlbWFza1wiLFxuICAgIFwibXBfcHJvYmVfcGFja2FnZV9pZFwiLFxuICAgIFwicmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllclwiLFxuICAgIFwidW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBtZW1vcnkgcGFja2FnZSB0b3BvbG9neSBjb25jZXB0IGZvciBOVU1BIG5vZGVzLCBtb2RpZnlpbmcgY29yZSBtZW1vcnkgdGllcmluZywgbWVtcG9saWN5LCBhbmQgQ1hMIHJlZ2lvbiBoYW5kbGluZy4gSXQgYWRkcyBuZXcgc3lzZnMgaW50ZXJmYWNlcyBhbmQgYSBuZXcgbWVtcG9saWN5IHdlaWdodGVkIGludGVybGVhdmUgbW9kZSwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOVU1BXCIsXG4gICAgXCJOVU1BX01JR1JBVElPTlwiLFxuICAgIFwiQ1hMX0JVU1wiLFxuICAgIFwiQ1hMX1JFR0lPTlwiLFxuICAgIFwiREVWX0RBWFwiLFxuICAgIFwiREVWX0RBWF9LTUVNXCIsXG4gICAgXCJNRU1PUllfSE9UUExVR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1wX2FkZF9wYWNrYWdlX25vZGVcIixcbiAgICBcIm1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yXCIsXG4gICAgXCJtcF9nZXRfcGFja2FnZV9ub2Rlc1wiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzXCIsXG4gICAgXCJtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2Rlc1wiLFxuICAgIFwibXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFza1wiLFxuICAgIFwibXBfbmV4dF9kZW1vdGlvbl9ub2RlXCIsXG4gICAgXCJtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFza1wiLFxuICAgIFwibXBfbmV4dF9wcm9tb3Rpb25fbm9kZVwiLFxuICAgIFwibXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljXCIsXG4gICAgXCJuZWFyZXN0X25vZGVzX25vZGVtYXNrXCIsXG4gICAgXCJtcF9wcm9iZV9wYWNrYWdlX2lkXCIsXG4gICAgXCJyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyXCIsXG4gICAgXCJ1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-06 08:26:09 +0000 UTC FinishedAt: 2026-08-06 08:30:38 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "8cd9520d35a6c38db6567e97dd93b1f11f185dc6", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION", "CXL_BUS", "CXL_REGION", "DEV_DAX", "DEV_DAX_KMEM", "MEMORY_HOTPLUG" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "8cd9520d35a6c38db6567e97dd93b1f11f185dc6", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NUMA", "NUMA_MIGRATION", "CXL_BUS", "CXL_REGION", "DEV_DAX", "DEV_DAX_KMEM", "MEMORY_HOTPLUG" ], "series_id": "9d000881-72ed-42e7-9fb5-8f981b017848" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "mp_add_package_node", "mp_add_package_node_by_initiator", "mp_get_package_nodes", "mp_get_package_cpu_nodes", "mp_get_package_memory_only_nodes", "mp_next_demotion_nodemask", "mp_next_demotion_node", "mp_next_promotion_nodemask", "mp_next_promotion_node", "mp_is_topology_symmetric", "nearest_nodes_nodemask", "mp_probe_package_id", "register_mp_package_notifier", "unregister_mp_package_notifier" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05VTUEmIzM0OywKICAgICYjMzQ7TlVNQV9NSUdSQVRJT04mIzM0OywKICAgICYjMzQ7Q1hMX0JVUyYjMzQ7LAogICAgJiMzNDtDWExfUkVHSU9OJiMzNDssCiAgICAmIzM0O0RFVl9EQVgmIzM0OywKICAgICYjMzQ7REVWX0RBWF9LTUVNJiMzNDssCiAgICAmIzM0O01FTU9SWV9IT1RQTFVHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZSYjMzQ7LAogICAgJiMzNDttcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvciYjMzQ7LAogICAgJiMzNDttcF9nZXRfcGFja2FnZV9ub2RlcyYjMzQ7LAogICAgJiMzNDttcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayYjMzQ7LAogICAgJiMzNDttcF9uZXh0X2RlbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9wcm9tb3Rpb25fbm9kZSYjMzQ7LAogICAgJiMzNDttcF9pc190b3BvbG9neV9zeW1tZXRyaWMmIzM0OywKICAgICYjMzQ7bmVhcmVzdF9ub2Rlc19ub2RlbWFzayYjMzQ7LAogICAgJiMzNDttcF9wcm9iZV9wYWNrYWdlX2lkJiMzNDssCiAgICAmIzM0O3JlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXImIzM0OywKICAgICYjMzQ7dW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3kgY29uY2VwdCBmb3IgTlVNQSBub2RlcywgbW9kaWZ5aW5nIGNvcmUgbWVtb3J5IHRpZXJpbmcsIG1lbXBvbGljeSwgYW5kIENYTCByZWdpb24gaGFuZGxpbmcuIEl0IGFkZHMgbmV3IHN5c2ZzIGludGVyZmFjZXMgYW5kIGEgbmV3IG1lbXBvbGljeSB3ZWlnaHRlZCBpbnRlcmxlYXZlIG1vZGUsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyNWEyYTJhYWM2NDliY2FiNmY0MGMxZGM2ZmZhYTM1MTEwZWRhYjdhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgNiAwODoyODoyNSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2UgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2Vcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTAwZjllNWZmMTllXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2VcbkBAIC0wLDAgJiM0MzsxLDM1IEBAXG4mIzQzO1doYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9cbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRNZW1vcnkgcGFja2FnZSB0b3BvbG9neVxuJiM0MztcbiYjNDM7XHRcdEEgXCYjMzQ7bWVtb3J5IHBhY2thZ2VcJiMzNDsgZ3JvdXBzIHRoZSBOVU1BIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBvbmVcbiYjNDM7XHRcdHBoeXNpY2FsIENQVSBwYWNrYWdlIChzb2NrZXQpOiB0aGUgbm9kZXMgdGhhdCBoYXZlIENQVXMgYW5kXG4mIzQzO1x0XHR0aGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTCBvciBIQk0pLlxuJiM0MztcbiYjNDM7XHRcdEFsbCBhdHRyaWJ1dGVzIGFyZSByZWFkLW9ubHk7IHRoZSB0b3BvbG9neSBjYW5ub3QgYmVcbiYjNDM7XHRcdG92ZXJyaWRkZW4gZnJvbSB1c2VyIHNwYWNlLlxuJiM0MztcbiYjNDM7V2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXNcbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0IGZvcm1hdFxuJiM0MztcdFx0KGUuZy4gXCYjMzQ7MCwyXCYjMzQ7KS5cbiYjNDM7XG4mIzQzO1doYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9wYWNrYWdlX2NwdV9ub2Rlc1xuJiM0MztEYXRlOlx0XHRBdWd1c3QgMjAyNlxuJiM0MztDb250YWN0Olx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuJiM0MztEZXNjcmlwdGlvbjpcdFRoZSBub2RlcyB0aGF0IGhhdmUgQ1BVcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0XG4mIzQzO1x0XHRmb3JtYXQuXG4mIzQzO1xuJiM0MztXaGF0Olx0XHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGFja2FnZV9tZW1fb25seV9ub2Rlc1xuJiM0MztEYXRlOlx0XHRBdWd1c3QgMjAyNlxuJiM0MztDb250YWN0Olx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuJiM0MztEZXNjcmlwdGlvbjpcdFRoZSBub2RlcyB0aGF0IG9ubHkgaGF2ZSBtZW1vcnkgKGUuZy4gQ1hML0hCTSkgaW4gdGhpc1xuJiM0MztcdFx0cGFja2FnZSwgaW4gbm9kZWxpc3QgZm9ybWF0LlxuJiM0MztcbiYjNDM7V2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BoeXNpY2FsX3BhY2thZ2VfaWRcbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRUaGUgcGh5c2ljYWwgcGFja2FnZSBpZCB0aGlzIGdyb3VwIGNvcnJlc3BvbmRzIHRvLCBhc1xuJiM0MztcdFx0cmVwb3J0ZWQgYnkgQ1BVIHRvcG9sb2d5LlxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbkBAIC01MiwzICYjNDM7NTIsMjAgQEAgRGVzY3JpcHRpb246XHRBdXRvLXdlaWdodGluZyBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuIFxuIFx0XHRXcml0aW5nIGEgbmV3IHdlaWdodCB0byBhIG5vZGUgZGlyZWN0bHkgdmlhIHRoZSBub2RlTiBpbnRlcmZhY2VcbiBcdFx0d2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRoZSBzeXN0ZW0gdG8gbWFudWFsIG1vZGUuXG4mIzQzO1xuJiM0MztXaGF0Olx0XHQvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVcbiYjNDM7RGF0ZTpcdFx0QXVndXN0IDIwMjZcbiYjNDM7Q29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbiYjNDM7RGVzY3JpcHRpb246XHRQYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgdG9nZ2xlXG4mIzQzO1xuJiM0MztcdFx0JiMzOTt0cnVlJiMzOTsgcmVzdHJpY3RzIHdlaWdodGVkIGludGVybGVhdmUgbm9kZSBzZWxlY3Rpb24gdG8gdGhlXG4mIzQzO1x0XHROVU1BIG5vZGVzIG9mIHRoZSBwYWNrYWdlIChDUFUgc29ja2V0KSB0aGUgYWxsb2NhdGluZyB0YXNrXG4mIzQzO1x0XHRpcyBydW5uaW5nIG9uLiAmIzM5O2ZhbHNlJiMzOTsgKHRoZSBkZWZhdWx0KSB1c2VzIHRoZSBleGlzdGluZ1xuJiM0MztcdFx0d2VpZ2h0ZWQgaW50ZXJsZWF2ZSBiZWhhdmlvci5cbiYjNDM7XG4mIzQzO1x0XHRFbmFibGluZyBpcyByZWplY3RlZCB3aXRoIC1FSU5WQUwgd2hpbGUgdGhlIHBhY2thZ2UgdG9wb2xvZ3lcbiYjNDM7XHRcdGlzIG5vdCBzeW1tZXRyaWMuXG4mIzQzO1xuJiM0MztcdFx0V3JpdGluZyBhbnkgdHJ1ZSB2YWx1ZSBzdHJpbmcgKGUuZy4gWSBvciAxKSBlbmFibGVzIHRoZVxuJiM0MztcdFx0cmVzdHJpY3Rpb24sIGFueSBmYWxzZSB2YWx1ZSBzdHJpbmcgKGUuZy4gTiBvciAwKSBkaXNhYmxlc1xuJiM0MztcdFx0aXQuIEFsbCBvdGhlciBzdHJpbmdzIHJldHVybiAtRUlOVkFMLlxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXG5pbmRleCBlNTBkYzcxNmQ0ZTgyLi5hZjY2ZTJlMDZjNjI0IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY1xuQEAgLTI2NzMsNiAmIzQzOzI2NzMsNTUgQEAgc3RhdGljIGludCBjeGxfcmVnaW9uX2NhbGN1bGF0ZV9hZGlzdGFuY2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbiBcdHJldHVybiBOT1RJRllfU1RPUDtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIEZpbmQgYSBOVU1BIG5vZGUgdG8gYWN0IGFzIHRoZSBpbml0aWF0b3IgZm9yIHRoaXMgcmVnaW9uOiBzY2FuIHRoZVxuJiM0MzsgKiByZWdpb24mIzM5O3MgZW5kcG9pbnQgdGFyZ2V0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCByZXNvbHZlcyB0byBhXG4mIzQzOyAqIHZhbGlkIE5VTUEgbm9kZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hscilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjeGxfcmVnaW9uX3BhcmFtcyAqcCA9IFx1MDAyNmN4bHItXHUwMDNlcGFyYW1zO1xuJiM0MztcdHN0cnVjdCBjeGxfZW5kcG9pbnRfZGVjb2RlciAqY3hsZWQgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBjeGxfbWVtZGV2ICpjeGxtZCA9IE5VTEw7XG4mIzQzO1x0aW50IGksIG51bWFfbm9kZTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcC1cdTAwM2Vucl90YXJnZXRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y3hsZWQgPSBwLVx1MDAzZXRhcmdldHNbaV07XG4mIzQzO1x0XHRjeGxtZCA9IGN4bGVkX3RvX21lbWRldihjeGxlZCk7XG4mIzQzO1x0XHRudW1hX25vZGUgPSBkZXZfdG9fbm9kZShcdTAwMjZjeGxtZC1cdTAwM2VkZXYpO1xuJiM0MztcdFx0aWYgKG51bWFfbm9kZSAhPSBOVU1BX05PX05PREUpXG4mIzQzO1x0XHRcdHJldHVybiBudW1hX25vZGU7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFBhY2thZ2Ugbm90aWZpZXIgY2FsbGJhY2s6IHdoZW4gYSBuZXcgbWVtb3J5IG5vZGUgaXMgb25saW5lZCB2aWEgZGF4XG4mIzQzOyAqIGttZW0sIGJpbmQgdGhlIG5vZGUgdGhpcyBDWEwgcmVnaW9uIGJhY2tzIHRvIGl0cyBtZW1vcnkgcGFja2FnZSwgdXNpbmdcbiYjNDM7ICogdGhlIG5lYXJlc3QgcmVnaW9uIHRhcmdldCBhcyB0aGUgaW5pdGlhdG9yLiBOb3RpZmljYXRpb25zIGZvciBvdGhlclxuJiM0MzsgKiBub2RlcyBhcmUgaWdub3JlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9hZGRfcGFja2FnZV9ub2RlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgZGF4X25pZCwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGludCByZWdpb25fbmlkLCBuZWFyZXN0X25pZCwgcmV0O1xuJiM0MztcdHN0cnVjdCBjeGxfcmVnaW9uICpjeGxyID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgY3hsX3JlZ2lvbiwgcGFja2FnZV9ub3RpZmllcik7XG4mIzQzO1xuJiM0MztcdHJlZ2lvbl9uaWQgPSBwaHlzX3RvX3RhcmdldF9ub2RlKGN4bHItXHUwMDNlcGFyYW1zLnJlcy1cdTAwM2VzdGFydCk7XG4mIzQzO1x0aWYgKHJlZ2lvbl9uaWQgIT0gZGF4X25pZClcbiYjNDM7XHRcdHJldHVybiBOT1RJRllfRE9ORTtcbiYjNDM7XG4mIzQzO1x0bmVhcmVzdF9uaWQgPSBjeGxfcmVnaW9uX2ZpbmRfbmVhcmVzdF9ub2RlKGN4bHIpO1xuJiM0MztcdGlmIChuZWFyZXN0X25pZCA9PSBOVU1BX05PX05PREUpXG4mIzQzO1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4mIzQzO1xuJiM0MztcdHJldCA9IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGRheF9uaWQsIG5lYXJlc3RfbmlkKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIE5PVElGWV9ET05FO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gTk9USUZZX09LO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIGRldm1fY3hsX2FkZF9yZWdpb24gLSBBZGRzIGEgcmVnaW9uIHRvIGEgZGVjb2RlclxuICAqIEBjeGxyZDogcm9vdCBkZWNvZGVyXG5AQCAtMzg1Miw2ICYjNDM7MzkwMSw3IEBAIHN0YXRpYyB2b2lkIHNodXRkb3duX25vdGlmaWVycyh2b2lkICpfY3hscilcbiBcbiBcdHVucmVnaXN0ZXJfbm9kZV9ub3RpZmllcihcdTAwMjZjeGxyLVx1MDAzZW5vZGVfbm90aWZpZXIpO1xuIFx0dW5yZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKFx1MDAyNmN4bHItXHUwMDNlYWRpc3Rfbm90aWZpZXIpO1xuJiM0MztcdHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihcdTAwMjZjeGxyLVx1MDAzZXBhY2thZ2Vfbm90aWZpZXIpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCByZW1vdmVfZGVidWdmcyh2b2lkICpkZW50cnkpXG5AQCAtNDA2Niw2ICYjNDM7NDExNiwxMCBAQCBzdGF0aWMgaW50IGN4bF9yZWdpb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KVxuIFx0Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllci5wcmlvcml0eSA9IDEwMDtcbiBcdHJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oXHUwMDI2Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllcik7XG4gXG4mIzQzO1x0Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGU7XG4mIzQzO1x0Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyLnByaW9yaXR5ID0gMTAwO1xuJiM0MztcdHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXHUwMDI2Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyKTtcbiYjNDM7XG4gXHRyYyA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChcdTAwMjZjeGxyLVx1MDAzZWRldiwgc2h1dGRvd25fbm90aWZpZXJzLCBjeGxyKTtcbiBcdGlmIChyYylcbiBcdFx0cmV0dXJuIHJjO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2N4bC5oIGIvZHJpdmVycy9jeGwvY3hsLmhcbmluZGV4IDEyOTc1OTRiZWFlYzMuLjkyODFjYTNhNWYwZjggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2N4bC9jeGwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9jeGwvY3hsLmhcbkBAIC00NzcsNiAmIzQzOzQ3Nyw3IEBAIHN0cnVjdCBjeGxfcmVnaW9uIHtcbiBcdHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSBjb29yZFtBQ0NFU1NfQ09PUkRJTkFURV9NQVhdO1xuIFx0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vZGVfbm90aWZpZXI7XG4gXHRzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWRpc3Rfbm90aWZpZXI7XG4mIzQzO1x0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhY2thZ2Vfbm90aWZpZXI7XG4gfTtcbiBcbiBzdHJ1Y3QgY3hsX252ZGltbV9icmlkZ2Uge1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGF4L2ttZW0uYyBiL2RyaXZlcnMvZGF4L2ttZW0uY1xuaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZGF4L2ttZW0uY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9kYXgva21lbS5jXG5AQCAtOTQsNiAmIzQzOzk0LDkgQEAgc3RhdGljIGludCBkZXZfZGF4X2ttZW1fcHJvYmUoc3RydWN0IGRldl9kYXggKmRldl9kYXgpXG4gXHRpZiAoSVNfRVJSKG10eXBlKSlcbiBcdFx0cmV0dXJuIFBUUl9FUlIobXR5cGUpO1xuIFxuJiM0MztcdC8qIFJlc29sdmUgdGhlIG1lbW9yeSBwYWNrYWdlIGZvciB0aGlzIG5ld2x5IG9ubGluZWQga21lbSBub2RlLiAqL1xuJiM0MztcdG1wX3Byb2JlX3BhY2thZ2VfaWQobnVtYV9ub2RlKTtcbiYjNDM7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXZfZGF4LVx1MDAzZW5yX3JhbmdlOyBpJiM0MzsmIzQzOykge1xuIFx0XHRzdHJ1Y3QgcmFuZ2UgcmFuZ2U7XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmhcbmluZGV4IDc5OTljNTg2MjllZWIuLmY4Nzc4YzQzNDI5ZmIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG5AQCAtNTIsMTAgJiM0Mzs1MiwyNSBAQCBpbnQgbXRfcGVyZl90b19hZGlzdGFuY2Uoc3RydWN0IGFjY2Vzc19jb29yZGluYXRlICpwZXJmLCBpbnQgKmFkaXN0KTtcbiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCxcbiBcdFx0XHRcdFx0XHQgIHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XG4gdm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcyk7XG4mIzQzO1xuJiM0MztpbnQgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcbiYjNDM7dm9pZCB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcik7XG4mIzQzO2ludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpO1xuJiM0MztpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpO1xuJiM0MztpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKTtcbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XG4mIzQzO2ludCBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XG4mIzQzO2Jvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpO1xuICNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbiBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spO1xuIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpO1xuIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcbiYjNDM7XG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCk7XG4mIzQzO2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xuJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKTtcbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxuIHtcbkBAIC03MSw2ICYjNDM7ODYsMzAgQEAgc3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSlcbiB7XG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRpZiAob3V0KVxuJiM0MztcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4mIzQzO1x0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO31cbiAjZW5kaWZcbiBcbiAjZWxzZVxuQEAgLTE1MSw1ICYjNDM7MTkwLDc5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3QsXG4gc3RhdGljIGlubGluZSB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKVxuIHtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOT1RJRllfRE9ORTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG91dClcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuJiM0MztcdHJldHVybiAtRU5PRU5UO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG91dClcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuJiM0MztcdHJldHVybiAtRU5PRU5UO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiYjNDM7fVxuICNlbmRpZlx0LyogQ09ORklHX05VTUEgKi9cbiAjZW5kaWYgIC8qIF9MSU5VWF9NRU1PUllfVElFUlNfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnVtYS5oIGIvaW5jbHVkZS9saW51eC9udW1hLmhcbmluZGV4IGU2YmFhZjYwNTFiY2YuLjRmMmEwYzM0NDEyMmEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L251bWEuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9udW1hLmhcbkBAIC0zMyw2ICYjNDM7MzMsOCBAQCBpbnQgbnVtYV9uZWFyZXN0X25vZGUoaW50IG5vZGUsIHVuc2lnbmVkIGludCBzdGF0ZSk7XG4gXG4gaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzayk7XG4gXG4mIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpO1xuJiM0MztcbiAjaWZuZGVmIG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkXG4gaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCk7XG4gI2VuZGlmXG5AQCAtNTQsNiAmIzQzOzU2LDE1IEBAIHN0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzaylcbiBcdHJldHVybiBOVU1BX05PX05PREU7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLFxuJiM0MztcdFx0XHRcdFx0IG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdGlmICghb3V0KVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0bm9kZXNfY2xlYXIoKm91dCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGlubGluZSBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KVxuIHtcbiBcdHJldHVybiAwO1xuZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmNcbmluZGV4IDU0ODUxZDhhMTk1YjAuLjU5MzJkZjMxNTYwNGEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmNcbkBAIC0xLDQgJiM0MzsxLDUgQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jbGVhbnVwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9sb2NrZGVwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNmcy5oXHUwMDNlXG5AQCAtNTEsNiAmIzQzOzUyLDExIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xuIFx0LmRldl9uYW1lID0gXCYjMzQ7bWVtb3J5X3RpZXJcJiMzNDssXG4gfTtcbiBcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBwYWNrYWdlX3N1YnN5cyA9IHtcbiYjNDM7XHQubmFtZSA9IFwmIzM0O3BhY2thZ2VcJiMzNDssXG4mIzQzO1x0LmRldl9uYW1lID0gXCYjMzQ7cGFja2FnZVwmIzM0OyxcbiYjNDM7fTtcbiYjNDM7XG4gI2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xuIC8qKlxuICAqIGZvbGlvX3VzZV9hY2Nlc3NfdGltZSAtIGNoZWNrIGlmIGEgZm9saW8gcmV1c2VzIGNwdXBpZCBmb3IgcGFnZSBhY2Nlc3MgdGltZVxuQEAgLTEwMDcsMyAmIzQzOzEwMTMsMTAwNiBAQCBzdGF0aWMgaW50IF9faW5pdCBudW1hX2luaXRfc3lzZnModm9pZClcbiBzdWJzeXNfaW5pdGNhbGwobnVtYV9pbml0X3N5c2ZzKTtcbiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovXG4gI2VuZGlmXG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogZW51bSBtcF9ub2Rlc190eXBlIC0gU2VsZWN0b3IgZm9yIHdoaWNoIHN1YnNldCBvZiBhIHBhY2thZ2UgdG8gcmV0dXJuXG4mIzQzOyAqIEBNUF9OT0RFU19BTEw6ICAgICAgIEFsbCBOVU1BIG5vZGVzIHRoYXQgYmVsb25nIHRvIHRoZSBwYWNrYWdlLlxuJiM0MzsgKiBATVBfTk9ERVNfQ1BVOiAgICAgICBPbmx5IENQVSBub2RlcyBpbiB0aGUgcGFja2FnZS5cbiYjNDM7ICogQE1QX05PREVTX01FTV9PTkxZOiAgT25seSBtZW1vcnktb25seSBub2RlcyAoZS5nLiBDWEwvSEJNKSBpbiB0aGUgcGFja2FnZS5cbiYjNDM7ICpcbiYjNDM7ICogVXNlZCBpbnRlcm5hbGx5IHRvIGNob29zZSB3aGljaCBub2RlbWFzayB0byBleHBvc2UgZm9yIGEgZ2l2ZW4gcGFja2FnZS5cbiYjNDM7ICovXG4mIzQzO2VudW0gbXBfbm9kZXNfdHlwZSB7XG4mIzQzO1x0TVBfTk9ERVNfQUxMLFxuJiM0MztcdE1QX05PREVTX0NQVSxcbiYjNDM7XHRNUF9OT0RFU19NRU1fT05MWVxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAtIFBlci1waHlzaWNhbC1wYWNrYWdlIGNvbnRhaW5lclxuJiM0MzsgKiBAcGFja2FnZV9pZDogICAgICAgICAgUGh5c2ljYWwgcGFja2FnZSBpZCAoZnJvbSB0b3BvbG9neSkuXG4mIzQzOyAqIEBub2RlczogICAgICAgICAgICAgICBOb2RlbWFzayBvZiBhbGwgbWVtYmVyIG5vZGVzIGluIHRoaXMgcGFja2FnZS5cbiYjNDM7ICogQGNwdV9ub2RlczogICAgICAgICAgIE5vZGVtYXNrIG9mIENQVSBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXG4mIzQzOyAqIEBtZW1vcnlfb25seV9ub2RlczogICBOb2RlbWFzayBvZiBtZW1vcnktb25seSBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXG4mIzQzOyAqIEBjcHVfbGlzdDogICAgICAgICAgICBMaXN0IGhlYWQgb2YgQ1BVLXR5cGUgbWVtYmVycy5cbiYjNDM7ICogQG1lbW9yeV9vbmx5X2xpc3Q6ICAgIExpc3QgaGVhZCBvZiBtZW1vcnktb25seSBtZW1iZXJzLlxuJiM0MzsgKiBAbGlzdDogICAgICAgICAgICAgICAgTGlua2FnZSBvbiB0aGUgZ2xvYmFsIEBtZW1vcnlfcGFja2FnZXMgbGlzdC5cbiYjNDM7ICogQGRldjogICAgICAgICAgICAgICAgIHN5c2ZzIGRldmljZSBmb3IgdGhpcyBwYWNrYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBBIG1lbW9yeV9wYWNrYWdlIGdyb3VwcyBOVU1BIG5vZGVzIHRoYXQgc2hhcmUgdGhlIHNhbWUgcGh5c2ljYWwgQ1BVIHBhY2thZ2UuXG4mIzQzOyAqIFRoZSBtYXNrcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgcGFja2FnZS1sb2NhbCBwbGFjZW1lbnQvZGVtb3Rpb24vcHJvbW90aW9uLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IG1lbW9yeV9wYWNrYWdlIHtcbiYjNDM7XHRpbnQgcGFja2FnZV9pZDtcbiYjNDM7XHRub2RlbWFza190IG5vZGVzO1xuJiM0MztcdG5vZGVtYXNrX3QgY3B1X25vZGVzO1xuJiM0MztcdG5vZGVtYXNrX3QgbWVtb3J5X29ubHlfbm9kZXM7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBjcHVfbGlzdDtcbiYjNDM7XHRzdHJ1Y3QgbGlzdF9oZWFkIG1lbW9yeV9vbmx5X2xpc3Q7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuJiM0MztcdHN0cnVjdCBkZXZpY2UgZGV2O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGVudW0gbXBuX3NvdXJjZV9mbGFncyAtIFNvdXJjZSB1c2VkIHRvIHJlc29sdmUgYSBub2RlJiMzOTtzIHBhY2thZ2UgbWVtYmVyc2hpcFxuJiM0MzsgKiBATVBOX1NSQ19VTktOT1dOOiAgICAgVW5rbm93bi91bnNwZWNpZmllZC5cbiYjNDM7ICogQE1QTl9TUkNfQ1BVOiAgICAgICAgIERpcmVjdGx5IHJlc29sdmVkIGZyb20gYSBDUFUgbm9kZSAoMToxKS5cbiYjNDM7ICogQE1QTl9TUkNfSU5JVElBVE9SOiAgIFJlc29sdmVkIHZpYSBhbiBpbml0aWF0b3IgQ1BVIG5vZGUgcHJvdmlkZWQgYnkgYSBkcml2ZXIuXG4mIzQzOyAqIEBNUE5fU1JDX1NMSVQ6ICAgICAgICBSZXNvbHZlZCB2aWEgU0xJVC9uZWFyZXN0LW5vZGUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZXNlIGZsYWdzIGFyZSBpbmZvcm1hdGlvbmFsOyB0aGV5IGRlc2NyaWJlIGhvdyBhIGdpdmVuIG5vZGUgd2FzIGJvdW5kIHRvXG4mIzQzOyAqIGl0cyBwYWNrYWdlIGFuZCBoZWxwIHdpdGggcG9saWN5IGRlY2lzaW9ucyBsYXRlci5cbiYjNDM7ICovXG4mIzQzO2VudW0gbXBuX3NvdXJjZV9mbGFncyB7XG4mIzQzO1x0TVBOX1NSQ19VTktOT1dOXHRcdD0gMCxcbiYjNDM7XHRNUE5fU1JDX0NQVVx0XHQ9IEJJVCgxKSxcbiYjNDM7XHRNUE5fU1JDX0lOSVRJQVRPUlx0PSBCSVQoMiksXG4mIzQzO1x0TVBOX1NSQ19TTElUXHRcdD0gQklUKDMpXG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgLSBQZXItbm9kZSBtZW1iZXJzaGlwIGFuZCBwcmVmZXJlbmNlc1xuJiM0MzsgKiBAbmlkOiAgICAgICAgICAgICAgTlVNQSBub2RlIGlkIGZvciB0aGlzIGVudHJ5LlxuJiM0MzsgKiBAaW5pdGlhdG9yX25pZDogICAgQ1BVIG5pZCB0aGF0IHNlcnZlZCBhcyB0aGUgaW5pdGlhdG9yIHdoZW4gcmVzb2x2aW5nIEBuaWQuXG4mIzQzOyAqIEBwYWNrYWdlX2lkOiAgICAgICBSZXNvbHZlZCBwYWNrYWdlIGlkIHRoYXQgQG5pZCBiZWxvbmdzIHRvLlxuJiM0MzsgKiBAc291cmNlX2ZsYWdzOiAgICAgT25lIG9mIFx1MDAyNmVudW0gbXBuX3NvdXJjZV9mbGFncyBkZXNjcmliaW5nIHRoZSByZXNvbHV0aW9uLlxuJiM0MzsgKiBAcHJlZmVycmVkOiAgICAgICAgT3Bwb3NpdGUtdHlwZSBuZWFyZXN0IGNhbmRpZGF0ZXMgaW5zaWRlIHRoZSBzYW1lIHBhY2thZ2UuXG4mIzQzOyAqIEBwYWNrYWdlOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvd25pbmcgXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlIChOVUxMIHVudGlsIGJvdW5kKS5cbiYjNDM7ICogQHBhY2thZ2VfZW50cnk6ICAgIExpbmthZ2Ugb24gdGhlIG93bmluZyBwYWNrYWdlJiMzOTtzIHR5cGUgbGlzdC5cbiYjNDM7ICpcbiYjNDM7ICogRWFjaCBOVU1BIG5vZGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gcGFja2FnZS1hd2FyZSBwb2xpY3kgZ2V0cyBhIHdyYXBwZXIgZW50cnlcbiYjNDM7ICogdGhhdCBjYWNoZXMgcGFja2FnZSBtZW1iZXJzaGlwIGFuZCB0aGUgcHJlY29tcHV0ZWQgc2V0IG9mIHByZWZlcnJlZCB0YXJnZXRzLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUge1xuJiM0MztcdGludCBuaWQ7XG4mIzQzO1x0aW50IGluaXRpYXRvcl9uaWQ7XG4mIzQzO1x0aW50IHBhY2thZ2VfaWQ7XG4mIzQzO1x0aW50IHNvdXJjZV9mbGFncztcbiYjNDM7XHRub2RlbWFza190IHByZWZlcnJlZDtcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKnBhY2thZ2U7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBwYWNrYWdlX2VudHJ5O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBub2RlX2lzX21lbW9yeV9vbmx5KF9uaWQpIFxcXG4mIzQzO1x0KG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgXHUwMDI2XHUwMDI2ICFub2RlX3N0YXRlKChfbmlkKSwgTl9DUFUpKVxuJiM0MztcbiYjNDM7c3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQobXBfcGFja2FnZV9hbGdvcml0aG1zKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBMSVNUX0hFQUQobWVtb3J5X3BhY2thZ2VzKTtcbiYjNDM7c3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG5zW01BWF9OVU1OT0RFU107XG4mIzQzO3N0YXRpYyBERUZJTkVfTVVURVgobWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSQ1Ugc25hcHNob3Qgb2YgdGhlIHBhY2thZ2UgdG9wb2xvZ3kuIFRoZSBhbGxvY2F0aW9uIHBhdGggcmVhZHMgaXRcbiYjNDM7ICogb2Z0ZW4sIHNvIGl0IGlzIHB1Ymxpc2hlZCBmb3IgbG9ja2xlc3MgcmVhZHMgaW5zdGVhZCBvZiBsb2NraW5nIG9uXG4mIzQzOyAqIGV2ZXJ5IGFjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBtcF9zbmFwc2hvdCB7XG4mIzQzO1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbiYjNDM7XHRpbnQgbnJfcGFja2FnZXM7XG4mIzQzO1x0aW50IHBrZ19vZltNQVhfTlVNTk9ERVNdO1xuJiM0MztcdHN0cnVjdCB7XG4mIzQzO1x0XHRub2RlbWFza190IG5vZGVzO1xuJiM0MztcdFx0bm9kZW1hc2tfdCBjcHVfbm9kZXM7XG4mIzQzO1x0XHRub2RlbWFza190IG1lbW9yeV9vbmx5X25vZGVzO1xuJiM0MztcdH0gcGtnW107XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IG1wX3NuYXBzaG90IF9fcmN1ICptcF9zbmFwc2hvdDtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gUmVnaXN0ZXIgYSBwYWNrYWdlIHJlc29sdXRpb24gYWxnb3JpdGhtXG4mIzQzOyAqIEBub3RpZmllcjogTm90aWZpZXIgY2FsbGVkIHdpdGggdGhlIG5pZCB0byByZXNvbHZlIChzZWUgbXBfcHJvYmVfcGFja2FnZV9pZCgpKS5cbiYjNDM7ICpcbiYjNDM7ICogRHJpdmVycyAoZS5nLiwgQ1hMIHJlZ2lvbi9kZWNvZGVyIGNvZGUpIHJlZ2lzdGVyIGhlcmUgdG8gc3VwcGx5IGEgcGFja2FnZVxuJiM0MzsgKiBoaW50IGZvciBuZXdseSBhcHBlYXJpbmcgbm9kZXMuIFRoZSBub3RpZmllciBpcyBpbnZva2VkIGR1cmluZyBuaWQtXHUwMDNlcGFja2FnZVxuJiM0MzsgKiByZXNvbHV0aW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoXHUwMDI2bXBfcGFja2FnZV9hbGdvcml0aG1zLCBub3RpZmllcik7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcik7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gVW5yZWdpc3RlciBhIHBhY2thZ2UgcmVzb2x1dGlvbiBhbGdvcml0aG1cbiYjNDM7ICogQG5vdGlmaWVyOiBOb3RpZmllciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKCkuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxuJiM0Mzt7XG4mIzQzO1x0YmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcihcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX3Byb2JlX3BhY2thZ2VfaWQgLSBJbnZva2UgcmVnaXN0ZXJlZCBub3RpZmllcnMgdG8gcmVzb2x2ZSBhIG5vZGUmIzM5O3MgcGFja2FnZVxuJiM0MzsgKiBAbmlkOiBOVU1BIG5vZGUgaWQgdG8gcmVzb2x2ZS5cbiYjNDM7ICpcbiYjNDM7ICogQ2FsbHMgdGhlIGJsb2NraW5nIG5vdGlmaWVyIGNoYWluIHRvIGxldCBzdWJzeXN0ZW1zIHByb3ZpZGUgYW4gaW5pdGlhdG9yIG9yXG4mIzQzOyAqIHBhY2thZ2UgaWQgZm9yIEBuaWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogTm90aWZpZXIgcmV0dXJuIGNvZGUgKFx1MDAzZT0wIHR5cGljYWxseSk7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oXHUwMDI2bXBfcGFja2FnZV9hbGdvcml0aG1zLCBuaWQsIE5VTEwpO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX3Byb2JlX3BhY2thZ2VfaWQpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdGludCBwYWNrYWdlX2lkO1xuJiM0MztcdHVuc2lnbmVkIGludCBmaXJzdF9jcHU7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXNrO1xuJiM0MztcbiYjNDM7XHRpZiAobmlkIFx1MDAzYyAwIHx8IG5pZCBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX0NQVSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0Y3B1X21hc2sgPSBjcHVtYXNrX29mX25vZGUobmlkKTtcbiYjNDM7XHRpZiAoY3B1bWFza19lbXB0eShjcHVfbWFzaykpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0Zmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfbWFzayk7XG4mIzQzO1x0aWYgKGZpcnN0X2NwdSBcdTAwM2U9IG5yX2NwdV9pZHMpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0cGFja2FnZV9pZCA9IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoZmlyc3RfY3B1KTtcbiYjNDM7XHRpZiAocGFja2FnZV9pZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcGFja2FnZV9pZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xuJiM0MztcbiYjNDM7XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0XG4mIzQzO1x0ICogbWVtb3J5LW9ubHkgbm9kZShzKSB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZS4gSWYgdGhlIHBhY2thZ2UgaGFzXG4mIzQzO1x0ICogbm8gbWVtb3J5LW9ubHkgbm9kZXMsIGZhbGwgYmFjayB0byBhIHNlbGYtcmVmZXJlbmNlIHNvIGNhbGxlcnNcbiYjNDM7XHQgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wbiwgXHUwMDI2bXAtXHUwMDNlY3B1X2xpc3QsIHBhY2thZ2VfZW50cnkpIHtcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuJiM0MztcdFx0aWYgKCFub2Rlc19lbXB0eShtcC1cdTAwM2VtZW1vcnlfb25seV9ub2RlcykpXG4mIzQzO1x0XHRcdG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2sobXBuLVx1MDAzZW5pZCwgXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2bXBuLVx1MDAzZXByZWZlcnJlZCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdG5vZGVfc2V0KG1wbi1cdTAwM2VuaWQsIG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTeW1tZXRyaWNhbGx5LCBmb3IgZWFjaCBtZW1vcnktb25seSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0XG4mIzQzO1x0ICogYXMgdGhlIG5lYXJlc3QgQ1BVIG5vZGUocykgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UuIElmIHRoZSBwYWNrYWdlXG4mIzQzO1x0ICogaGFzIG5vIENQVSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcG4sIFx1MDAyNm1wLVx1MDAzZW1lbW9yeV9vbmx5X2xpc3QsIHBhY2thZ2VfZW50cnkpIHtcbiYjNDM7XHRcdG5vZGVzX2NsZWFyKG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuJiM0MztcdFx0aWYgKCFub2Rlc19lbXB0eShtcC1cdTAwM2VjcHVfbm9kZXMpKVxuJiM0MztcdFx0XHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cdTAwM2VuaWQsIFx1MDAyNm1wLVx1MDAzZWNwdV9ub2RlcyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBcdTAwMjZtcG4tXHUwMDNlcHJlZmVycmVkKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0bm9kZV9zZXQobXBuLVx1MDAzZW5pZCwgbXBuLVx1MDAzZXByZWZlcnJlZCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkoc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcClcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAobm9kZXNfZW1wdHkobXAtXHUwMDNlY3B1X25vZGVzKSBcdTAwMjZcdTAwMjYgbm9kZXNfZW1wdHkobXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBhY2thZ2Vfbm9kZV9pc192YWxpZChpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFtcG5zW25pZF0pXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGlmIChub2Rlc19lbXB0eShtcG5zW25pZF0tXHUwMDNlcHJlZmVycmVkKSB8fCAobXBuc1tuaWRdLVx1MDAzZXBhY2thZ2UgPT0gTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW107XG4mIzQzO1xuJiM0MzsvKiBGcmVlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgcGFja2FnZSYjMzk7cyBzeXNmcyBkZXZpY2UgaXMgZHJvcHBlZC4gKi9cbiYjNDM7c3RhdGljIHZvaWQgbWVtb3J5X3BhY2thZ2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1lbW9yeV9wYWNrYWdlLCBkZXYpO1xuJiM0MztcbiYjNDM7XHRrZnJlZShtcCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKmNyZWF0ZV9tZW1vcnlfcGFja2FnZShpbnQgcGFja2FnZV9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRtZW1wYWNrYWdlID0ga3phbGxvY19vYmooKm1lbXBhY2thZ2UpO1xuJiM0MztcdGlmICghbWVtcGFja2FnZSlcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuJiM0MztcbiYjNDM7XHRtZW1wYWNrYWdlLVx1MDAzZXBhY2thZ2VfaWQgPSBwYWNrYWdlX2lkO1xuJiM0MztcdG1lbXBhY2thZ2UtXHUwMDNlbm9kZXMgPSBOT0RFX01BU0tfTk9ORTtcbiYjNDM7XHRtZW1wYWNrYWdlLVx1MDAzZWNwdV9ub2RlcyA9IE5PREVfTUFTS19OT05FO1xuJiM0MztcdG1lbXBhY2thZ2UtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMgPSBOT0RFX01BU0tfTk9ORTtcbiYjNDM7XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWNwdV9saXN0KTtcbiYjNDM7XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZW1lbW9yeV9vbmx5X2xpc3QpO1xuJiM0MztcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlbGlzdCk7XG4mIzQzO1x0ZGV2aWNlX2luaXRpYWxpemUoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VkZXYpO1xuJiM0MztcdG1lbXBhY2thZ2UtXHUwMDNlZGV2LnJlbGVhc2UgPSBtZW1vcnlfcGFja2FnZV9yZWxlYXNlO1xuJiM0MztcdGRldl9zZXRfZHJ2ZGF0YShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldiwgbWVtcGFja2FnZSk7XG4mIzQzO1x0bWVtcGFja2FnZS1cdTAwM2VkZXYuYnVzID0gXHUwMDI2cGFja2FnZV9zdWJzeXM7XG4mIzQzO1x0bWVtcGFja2FnZS1cdTAwM2VkZXYuZ3JvdXBzID0gbWVtb3J5X3BhY2thZ2VfZ3JvdXBzO1xuJiM0MztcdHJldCA9IGRldl9zZXRfbmFtZShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldiwgXCYjMzQ7cGFja2FnZSVkXCYjMzQ7LCBwYWNrYWdlX2lkKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRwdXRfZGV2aWNlKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gbWVtcGFja2FnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1lbXBhY2thZ2UsICpleGlzdGluZztcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtcGFja2FnZSwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XG4mIzQzO1x0XHRpZiAobWVtcGFja2FnZS1cdTAwM2VwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHtcbiYjNDM7XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdFx0XHRyZXR1cm4gbWVtcGFja2FnZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRtZW1wYWNrYWdlID0gY3JlYXRlX21lbW9yeV9wYWNrYWdlKHBhY2thZ2VfaWQpO1xuJiM0MztcdGlmIChJU19FUlIobWVtcGFja2FnZSkpXG4mIzQzO1x0XHRyZXR1cm4gbWVtcGFja2FnZTtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV4aXN0aW5nLCBcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcbiYjNDM7XHRcdGlmIChleGlzdGluZy1cdTAwM2VwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHtcbiYjNDM7XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdFx0XHRwdXRfZGV2aWNlKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbiYjNDM7XHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRsaXN0X2FkZChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWxpc3QsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcyk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBkZXZpY2VfYWRkKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdFx0bGlzdF9kZWwoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VsaXN0KTtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRcdHB1dF9kZXZpY2UoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VkZXYpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBtZW1wYWNrYWdlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBtcF9zbmFwc2hvdF9yZWJ1aWxkKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbXBfc25hcHNob3QgKm5ldywgKm9sZDtcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wO1xuJiM0MztcdGludCBuciA9IDAsIGkgPSAwLCBuaWQ7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdGxpc3RfZm9yX2VhY2hfZW50cnkobXAsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdClcbiYjNDM7XHRcdG5yJiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0bmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFuZXcpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdG1lbXNldChuZXctXHUwMDNlcGtnX29mLCAweGZmLCBzaXplb2YobmV3LVx1MDAzZXBrZ19vZikpO1xuJiM0MztcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcbiYjNDM7XHRcdG5ldy1cdTAwM2Vwa2dbaV0ubm9kZXMgPSBtcC1cdTAwM2Vub2RlcztcbiYjNDM7XHRcdG5ldy1cdTAwM2Vwa2dbaV0uY3B1X25vZGVzID0gbXAtXHUwMDNlY3B1X25vZGVzO1xuJiM0MztcdFx0bmV3LVx1MDAzZXBrZ1tpXS5tZW1vcnlfb25seV9ub2RlcyA9IG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzO1xuJiM0MztcdFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbXAtXHUwMDNlbm9kZXMpXG4mIzQzO1x0XHRcdG5ldy1cdTAwM2Vwa2dfb2ZbbmlkXSA9IGk7XG4mIzQzO1x0XHRpJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0bmV3LVx1MDAzZW5yX3BhY2thZ2VzID0gbnI7XG4mIzQzO1xuJiM0MztcdG9sZCA9IHJjdV9yZXBsYWNlX3BvaW50ZXIobXBfc25hcHNob3QsIG5ldyxcbiYjNDM7XHRcdFx0XHQgIGxvY2tkZXBfaXNfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKSk7XG4mIzQzO1x0aWYgKG9sZClcbiYjNDM7XHRcdGt2ZnJlZV9yY3Uob2xkLCByY3UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJpbmRfbm9kZV90b19wYWNrYWdlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcGFja2FnZV9pZCwgcGtnX2lkO1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXA7XG4mIzQzO1x0bm9kZW1hc2tfdCBub2RlcywgY3B1LCBtZW07XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1x0aWYgKCFtcG5zW25pZF0pIHtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XHRwYWNrYWdlX2lkID0gbXBuc1tuaWRdLVx1MDAzZXBhY2thZ2VfaWQ7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRtcCA9IGZpbmRfY3JlYXRlX21lbW9yeV9wYWNrYWdlKHBhY2thZ2VfaWQpO1xuJiM0MztcdGlmIChJU19FUlIobXApKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIobXApO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGlmICghbXBuc1tuaWRdKSB7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1x0bXBuc1tuaWRdLVx1MDAzZXBhY2thZ2UgPSBtcDtcbiYjNDM7XHRub2RlX3NldChtcG5zW25pZF0tXHUwMDNlbmlkLCBtcC1cdTAwM2Vub2Rlcyk7XG4mIzQzO1x0aWYgKG5vZGVfaXNfbWVtb3J5X29ubHkobXBuc1tuaWRdLVx1MDAzZW5pZCkpIHtcbiYjNDM7XHRcdG5vZGVfc2V0KG1wbnNbbmlkXS1cdTAwM2VuaWQsIG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcbiYjNDM7XHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VtZW1vcnlfb25seV9saXN0KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0bm9kZV9zZXQobXBuc1tuaWRdLVx1MDAzZW5pZCwgbXAtXHUwMDNlY3B1X25vZGVzKTtcbiYjNDM7XHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VjcHVfbGlzdCk7XG4mIzQzO1x0fVxuJiM0MztcdHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChtcCk7XG4mIzQzO1x0bXBfc25hcHNob3RfcmVidWlsZCgpO1xuJiM0MztcdHBrZ19pZCA9IG1wLVx1MDAzZXBhY2thZ2VfaWQ7XG4mIzQzO1x0bm9kZXMgPSBtcC1cdTAwM2Vub2RlcztcbiYjNDM7XHRjcHUgPSBtcC1cdTAwM2VjcHVfbm9kZXM7XG4mIzQzO1x0bWVtID0gbXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXM7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O21lbW9yeV9wYWNrYWdlICVkOiBub2Rlcz0lKnBibCBjcHU9JSpwYmwgbWVtb3J5X29ubHk9JSpwYmxcXG5cJiMzNDssXG4mIzQzO1x0XHRwa2dfaWQsIG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2bm9kZXMpLFxuJiM0MztcdFx0bm9kZW1hc2tfcHJfYXJncyhcdTAwMjZjcHUpLCBub2RlbWFza19wcl9hcmdzKFx1MDAyNm1lbSkpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdW5iaW5kX25vZGVfdG9fcGFja2FnZShzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCBpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0bm9kZV9jbGVhcihuaWQsIG1wLVx1MDAzZW5vZGVzKTtcbiYjNDM7XHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSlcbiYjNDM7XHRcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2VjcHVfbm9kZXMpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChtcG5zW25pZF0pXG4mIzQzO1x0XHRsaXN0X2RlbChcdTAwMjZtcG5zW25pZF0tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4mIzQzO1xuJiM0MztcdHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChtcCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqY3JlYXRlX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbiYjNDM7e1xuJiM0MztcdGludCBjcHVfbmlkLCBwYWNrYWdlX2lkO1xuJiM0MztcdGludCBzb3VyY2VfZmxhZ3M7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjtcbiYjNDM7XG4mIzQzO1x0aWYgKG5vZGVfc3RhdGUobmlkLCBOX0NQVSkpIHtcbiYjNDM7XHRcdGNwdV9uaWQgPSBuaWQ7XG4mIzQzO1x0XHRzb3VyY2VfZmxhZ3MgPSBNUE5fU1JDX0NQVTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKGluaXRpYXRvcl9uaWQgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRcdGNwdV9uaWQgPSBpbml0aWF0b3JfbmlkO1xuJiM0MztcdFx0XHRzb3VyY2VfZmxhZ3MgPSBNUE5fU1JDX0lOSVRJQVRPUjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE5vIGRyaXZlci1zdXBwbGllZCBpbml0aWF0b3I6IGZhbGwgYmFjayB0byB0aGVcbiYjNDM7XHRcdFx0ICogbmVhcmVzdCBDUFUgbm9kZSAodmlhIFNMSVQvbnVtYV9kaXN0YW5jZSkuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRjcHVfbmlkID0gbnVtYV9uZWFyZXN0X25vZGUobmlkLCBOX0NQVSk7XG4mIzQzO1x0XHRcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfU0xJVDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHBhY2thZ2VfaWQgPSBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoY3B1X25pZCk7XG4mIzQzO1x0aWYgKHBhY2thZ2VfaWQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiYjNDM7XG4mIzQzO1x0bXBuID0ga3phbGxvY19vYmooKm1wbik7XG4mIzQzO1x0aWYgKCFtcG4pXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiYjNDM7XG4mIzQzO1x0bXBuLVx1MDAzZW5pZCA9IG5pZDtcbiYjNDM7XHRtcG4tXHUwMDNlaW5pdGlhdG9yX25pZCA9IGNwdV9uaWQ7XG4mIzQzO1x0bXBuLVx1MDAzZXBhY2thZ2VfaWQgPSBwYWNrYWdlX2lkO1xuJiM0MztcdG1wbi1cdTAwM2Vzb3VyY2VfZmxhZ3MgPSBzb3VyY2VfZmxhZ3M7XG4mIzQzO1x0bXBuLVx1MDAzZXByZWZlcnJlZCA9IE5PREVfTUFTS19OT05FO1xuJiM0MztcdG1wbi1cdTAwM2VwYWNrYWdlID0gTlVMTDtcbiYjNDM7XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtcG4tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBtcG47XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRvcG9sb2d5IHN5bW1ldHJ5IHN0YXR1c1xuJiM0MzsgKiBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgbm9kZSBzdHJ1Y3R1cmVcbiYjNDM7ICogKHNhbWUgbnVtYmVyIG9mIENQVSBub2RlcyBhbmQgbWVtb3J5LW9ubHkgbm9kZXMpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgdG9wb2xvZ3lfc3ltbWV0cmljO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkodm9pZCk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlICpfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsICp1bnJlZ19tcCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdG1wbiA9IG1wbnNbbmlkXTtcbiYjNDM7XHRpZiAoIW1wbilcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRtcCA9IG1wbi1cdTAwM2VwYWNrYWdlO1xuJiM0MztcdGlmIChtcCkge1xuJiM0MztcdFx0dW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTtcbiYjNDM7XHRcdG1wbi1cdTAwM2VwYWNrYWdlID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkobXApKSB7XG4mIzQzO1x0XHRcdGxpc3RfZGVsKFx1MDAyNm1wLVx1MDAzZWxpc3QpO1xuJiM0MztcdFx0XHR1bnJlZ19tcCA9IG1wO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bXBuc1tuaWRdID0gTlVMTDtcbiYjNDM7XHRrZnJlZShtcG4pO1xuJiM0MztcdG1wX3NuYXBzaG90X3JlYnVpbGQoKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHVucmVnX21wO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBkZXN0cm95X3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcDtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmICh1bnJlZ19tcClcbiYjNDM7XHRcdGRldmljZV91bnJlZ2lzdGVyKFx1MDAyNnVucmVnX21wLVx1MDAzZWRldik7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZmluZF9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKnVucmVnX21wID0gTlVMTDtcbiYjNDM7XHRpbnQgcmV0ID0gbmlkO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGlmICghbXBuc1tuaWRdKSB7XG4mIzQzO1x0XHRyZXQgPSBOVU1BX05PX05PREU7XG4mIzQzO1x0fSBlbHNlIGlmIChtcG5zW25pZF0tXHUwMDNlc291cmNlX2ZsYWdzID09IE1QTl9TUkNfU0xJVCBcdTAwMjZcdTAwMjYgaW5pdGlhdG9yX25pZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBTTElULWRlcml2ZWQgZW50cmllcyBhcmUgcHJvdmlzaW9uYWw7IGlmIGEgZHJpdmVyIGxhdGVyXG4mIzQzO1x0XHQgKiBwcm92aWRlcyBhbiBleHBsaWNpdCBpbml0aWF0b3IsIGRyb3AgdGhlIHByb3Zpc2lvbmFsXG4mIzQzO1x0XHQgKiBlbnRyeSBhbmQgcmVidWlsZCB3aXRoIHRoZSBzdHJvbmdlciBoaW50LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbiYjNDM7XHRcdHJldCA9IE5VTUFfTk9fTk9ERTtcbiYjNDM7XHR9XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAodW5yZWdfbXApXG4mIzQzO1x0XHRkZXZpY2VfdW5yZWdpc3RlcihcdTAwMjZ1bnJlZ19tcC1cdTAwM2VkZXYpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbiYjNDM7e1xuJiM0MztcdGludCBtcG5fbmlkO1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XG4mIzQzO1xuJiM0MztcdG1wbl9uaWQgPSBmaW5kX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xuJiM0MztcdGlmIChtcG5fbmlkICE9IE5VTUFfTk9fTk9ERSlcbiYjNDM7XHRcdHJldHVybiBtcG5fbmlkO1xuJiM0MztcbiYjNDM7XHRtcG4gPSBjcmVhdGVfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7XG4mIzQzO1x0aWYgKElTX0VSUihtcG4pKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIobXBuKTtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdGlmIChtcG5zW25pZF0pIHtcbiYjNDM7XHRcdGtmcmVlKG1wbik7XG4mIzQzO1x0XHRyZXR1cm4gbmlkO1xuJiM0MztcdH1cbiYjNDM7XHRtcG5zW25pZF0gPSBtcG47XG4mIzQzO1xuJiM0MztcdHJldHVybiBuaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBOVU1BX05PX05PREUpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBiaW5kX25vZGVfdG9fcGFja2FnZShuaWQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IgLSBBZGQgYSBub2RlIHdpdGggYW4gaW5pdGlhdG9yXG4mIzQzOyAqIEBuaWQ6ICAgICAgICAgICAgVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4mIzQzOyAqIEBpbml0aWF0b3JfbmlkOiAgQ1BVIG5pZCB1c2VkIHRvIHJlc29sdmUgQG5pZCYjMzk7cyBwYWNrYWdlIChcdTAwM2U9MCkuXG4mIzQzOyAqXG4mIzQzOyAqIEVuc3VyZXMgdGhhdCBhIFx1MDAyNnN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlIGV4aXN0cyBmb3IgQG5pZCBhbmQgdGhhdCBpdHNcbiYjNDM7ICogcGFja2FnZV9pZCBpcyBkZXRlcm1pbmVkIHVzaW5nIEBpbml0aWF0b3JfbmlkIHdoZW4gcHJvdmlkZWQuIEJpbmRpbmcgdG8gdGhlXG4mIzQzOyAqIHBhY2thZ2UgaXMgbm90IHBlcmZvcm1lZCBoZXJlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcik7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfYWRkX3BhY2thZ2Vfbm9kZSAtIEFkZCBhIG5vZGUsIHJlc29sdmluZyBwYWNrYWdlIGF1dG9tYXRpY2FsbHlcbiYjNDM7ICogQG5pZDogVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4mIzQzOyAqXG4mIzQzOyAqIFdyYXBwZXIgb3ZlciBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcigpIHRoYXQgcmVxdWVzdHMgYXV0b21hdGljXG4mIzQzOyAqIGluaXRpYXRvciByZXNvbHV0aW9uIChlLmcuLCBuZWFyZXN0IENQVSkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfYWRkX3BhY2thZ2Vfbm9kZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcbiYjNDM7XHRcdFx0XHQgICAgIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtcF9zbmFwc2hvdCAqc25hcDtcbiYjNDM7XHRpbnQgcGtnO1xuJiM0MztcbiYjNDM7XHRpZiAoIW91dClcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQocmN1KSgpO1xuJiM0MztcbiYjNDM7XHRzbmFwID0gcmN1X2RlcmVmZXJlbmNlKG1wX3NuYXBzaG90KTtcbiYjNDM7XHRpZiAoIXNuYXApXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0cGtnID0gc25hcC1cdTAwM2Vwa2dfb2ZbbmlkXTtcbiYjNDM7XHRpZiAocGtnIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAobm9kZV90eXBlKSB7XG4mIzQzO1x0Y2FzZSBNUF9OT0RFU19BTEw6XG4mIzQzO1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubm9kZXMpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBNUF9OT0RFU19DUFU6XG4mIzQzO1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10uY3B1X25vZGVzKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgTVBfTk9ERVNfTUVNX09OTFk6XG4mIzQzO1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubWVtb3J5X29ubHlfbm9kZXMpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbiYjNDM7c3RhdGljIGludCBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcbiYjNDM7XHRcdFx0XHQgICAgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4mIzQzO1xuJiM0MztcdC8qIE5vIGhvdC1wYXRoIGNhbGxlcnM6IHRoZSBtdXRleCBpcyBmaW5lIGhlcmUuICovXG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAoIW91dCkge1xuJiM0MztcdFx0cmV0ID0gLUVJTlZBTDtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bm9kZXNfY2xlYXIoKm91dCk7XG4mIzQzO1xuJiM0MztcdGlmIChuaWQgXHUwMDNjIDAgfHwgbmlkIFx1MDAzZT0gTUFYX05VTU5PREVTKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUlOVkFMO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobm9kZV90eXBlID09IE1QX05PREVTX0NQVSkge1xuJiM0MztcdFx0aWYgKG5vZGVfaXNfbWVtb3J5X29ubHkobmlkKSkge1xuJiM0MztcdFx0XHRyZXQgPSAtRUlOVkFMO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9IGVsc2UgaWYgKG5vZGVfdHlwZSA9PSBNUF9OT0RFU19NRU1fT05MWSkge1xuJiM0MztcdFx0aWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHtcbiYjNDM7XHRcdHJldCA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5vZGVzX2NvcHkoKm91dCwgbXBuc1tuaWRdLVx1MDAzZXByZWZlcnJlZCk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sgLSBEZW1vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2VcbiYjNDM7ICogQG5pZDogQ1BVIG5vZGUgZnJvbSB3aGljaCBtZW1vcnkgd291bGQgYmUgZGVtb3RlZC5cbiYjNDM7ICogQG91dDogT3V0cHV0IG5vZGVtYXNrIG9mIG5lYXJlc3QgbWVtb3J5LW9ubHkgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfbmV4dF9kZW1vdGlvbl9ub2RlIC0gUGljayBvbmUgZGVtb3Rpb24gdGFyZ2V0XG4mIzQzOyAqIEBuaWQ6IENQVSBub2RlIGZyb20gd2hpY2ggbWVtb3J5IHdvdWxkIGJlIGRlbW90ZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFBpY2tzIG9uZSB0YXJnZXQgKHJhbmRvbSBhbW9uZyB0aGUgbmVhcmVzdCkgZnJvbSBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKCkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdGludCB0YXJnZXRfbmlkO1xuJiM0MztcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xuJiM0MztcbiYjNDM7XHRpZiAobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhuaWQsIFx1MDAyNnRhcmdldF9ub2RlbWFzaykpXG4mIzQzO1x0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuJiM0MztcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxuJiM0MztcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiYjNDM7XG4mIzQzO1x0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFx1MDAyNnRhcmdldF9ub2RlbWFzayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0YXJnZXRfbmlkO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfZGVtb3Rpb25fbm9kZSk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2sgLSBQcm9tb3Rpb24gY2FuZGlkYXRlcyB3aXRoaW4gYSBwYWNrYWdlXG4mIzQzOyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG93YXJkcyB3aGljaCBwcm9tb3Rpb24gc2Vla3MgQ1BVIGxvY2FsaXR5LlxuJiM0MzsgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBDUFUgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC5cbiYjNDM7ICovXG4mIzQzO2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2spO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX25leHRfcHJvbW90aW9uX25vZGUgLSBQaWNrIG9uZSBwcm9tb3Rpb24gdGFyZ2V0XG4mIzQzOyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG8gYmUgcHJvbW90ZWQgdG93YXJkcyBDUFVzLlxuJiM0MzsgKlxuJiM0MzsgKiBQaWNrcyBvbmUgdGFyZ2V0IChyYW5kb20gYW1vbmcgdGhlIG5lYXJlc3QpIGZyb20gbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soKS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0YXJnZXQgbmlkIG9uIHN1Y2Nlc3MsIG9yIE5VTUFfTk9fTk9ERSBpZiBubyBjYW5kaWRhdGUgaXMgYXZhaWxhYmxlLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdGludCB0YXJnZXRfbmlkO1xuJiM0MztcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xuJiM0MztcbiYjNDM7XHRpZiAobXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2sobmlkLCBcdTAwMjZ0YXJnZXRfbm9kZW1hc2spKVxuJiM0MztcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiYjNDM7XHRpZiAobm9kZXNfZW1wdHkodGFyZ2V0X25vZGVtYXNrKSlcbiYjNDM7XHRcdHJldHVybiBOVU1BX05PX05PREU7XG4mIzQzO1xuJiM0MztcdHRhcmdldF9uaWQgPSBub2RlX3JhbmRvbShcdTAwMjZ0YXJnZXRfbm9kZW1hc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdGFyZ2V0X25pZDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X3Byb21vdGlvbl9ub2RlKTtcbiYjNDM7I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2dldF9wYWNrYWdlX25vZGVzIC0gUmV0dXJuIGFsbCBtZW1iZXJzIG9mIEBuaWQmIzM5O3MgcGFja2FnZVxuJiM0MzsgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLlxuJiM0MzsgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBhbGwgbWVtYmVycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19BTEwsIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2Vfbm9kZXMpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyAtIFJldHVybiBDUFUgbWVtYmVycyBvZiBAbmlkJiMzOTtzIHBhY2thZ2VcbiYjNDM7ICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS5cbiYjNDM7ICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgQ1BVIG1lbWJlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhuaWQsIE1QX05PREVTX0NQVSwgb3V0KTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzIC0gUmV0dXJuIG1lbW9yeS1vbmx5IG1lbWJlcnMgb2YgQG5pZCYjMzk7cyBwYWNrYWdlXG4mIzQzOyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuXG4mIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIG1lbW9yeS1vbmx5IG1lbWJlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuJiM0MzsgKi9cbiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX21lbWluaXQgbXBfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKl9hcmcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgbmlkO1xuJiM0MztcdHN0cnVjdCBub2RlX25vdGlmeSAqbm4gPSBfYXJnO1xuJiM0MztcbiYjNDM7XHRuaWQgPSBubi1cdTAwM2VuaWQ7XG4mIzQzO1x0aWYgKG5pZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKDApO1xuJiM0MztcbiYjNDM7XHRzd2l0Y2ggKGFjdGlvbikge1xuJiM0MztcdGNhc2UgTk9ERV9SRU1PVkVEX0xBU1RfTUVNT1JZOlxuJiM0MztcdFx0ZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRjYXNlIE5PREVfQURERURfRklSU1RfTUVNT1JZOlxuJiM0MztcdFx0Y3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHN5c2ZzIGludGVyZmFjZSBmb3IgbWVtb3J5X3BhY2thZ2UgdG9wb2xvZ3lcbiYjNDM7ICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6XG4mIzQzOyAqICAgLSBwYWNrYWdlX25vZGVzOiAgICAgICBBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcbiYjNDM7ICogICAtIHBhY2thZ2VfY3B1X25vZGVzOiAgIENQVSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcbiYjNDM7ICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxuJiM0MzsgKiAgIC0gcGh5c2ljYWxfcGFja2FnZV9pZDogUGh5c2ljYWwgcGFja2FnZSBJRFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2Vfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xuJiM0MztcbiYjNDM7XHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4mIzQzO1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcJiMzNDslKnBibFxcblwmIzM0Oywgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZtcC1cdTAwM2Vub2RlcykpO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwYWNrYWdlX25vZGVzKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfY3B1X25vZGVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XG4mIzQzO1xuJiM0MztcdGd1YXJkKG11dGV4KShcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFwmIzM0OyUqcGJsXFxuXCYjMzQ7LCBub2RlbWFza19wcl9hcmdzKFx1MDAyNm1wLVx1MDAzZWNwdV9ub2RlcykpO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwYWNrYWdlX2NwdV9ub2Rlcyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21lbV9vbmx5X25vZGVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdFx0ICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcdHJldHVybiBzeXNmc19lbWl0KGJ1ZiwgXCYjMzQ7JSpwYmxcXG5cJiMzNDssIG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbiYjNDM7fVxuJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9tZW1fb25seV9ub2Rlcyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3NpemVfdCBwaHlzaWNhbF9wYWNrYWdlX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdFx0c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcJiMzNDslZFxcblwmIzM0OywgbXAtXHUwMDNlcGFja2FnZV9pZCk7XG4mIzQzO31cbiYjNDM7c3RhdGljIERFVklDRV9BVFRSX1JPKHBoeXNpY2FsX3BhY2thZ2VfaWQpO1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1lbW9yeV9wYWNrYWdlX2F0dHJzW10gPSB7XG4mIzQzO1x0XHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9ub2Rlcy5hdHRyLFxuJiM0MztcdFx1MDAyNmRldl9hdHRyX3BhY2thZ2VfY3B1X25vZGVzLmF0dHIsXG4mIzQzO1x0XHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9tZW1fb25seV9ub2Rlcy5hdHRyLFxuJiM0MztcdFx1MDAyNmRldl9hdHRyX3BoeXNpY2FsX3BhY2thZ2VfaWQuYXR0cixcbiYjNDM7XHROVUxMLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWVtb3J5X3BhY2thZ2VfZ3JvdXAgPSB7XG4mIzQzO1x0LmF0dHJzID0gbWVtb3J5X3BhY2thZ2VfYXR0cnMsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW10gPSB7XG4mIzQzO1x0XHUwMDI2bWVtb3J5X3BhY2thZ2VfZ3JvdXAsXG4mIzQzO1x0TlVMTCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgX19pbml0IG1lbW9yeV9wYWNrYWdlX3N5c2ZzX2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHN1YnN5c19zeXN0ZW1fcmVnaXN0ZXIoXHUwMDI2cGFja2FnZV9zdWJzeXMsIE5VTEwpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDttZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcXG5cJiMzNDssIHJldCk7XG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0Mztjb3JlX2luaXRjYWxsKG1lbW9yeV9wYWNrYWdlX3N5c2ZzX2luaXQpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyAtIENoZWNrIGlmIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG1lbW9yeSBwYWNrYWdlcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBDUFUgbm9kZXNcbiYjNDM7ICogYW5kIG1lbW9yeS1vbmx5IG5vZGVzLCBpbmRpY2F0aW5nIGEgc3ltbWV0cmljIHRvcG9sb2d5LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgdG9wb2xvZ3lfc3ltbWV0cmljIHZhcmlhYmxlIGlzIHByb3RlY3RlZCBieSBtZW1vcnlfcGFja2FnZV9sb2NrIGZvclxuJiM0MzsgKiB3cml0ZXMgKGluIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KS5cbiYjNDM7ICovXG4mIzQzO2Jvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gUkVBRF9PTkNFKHRvcG9sb2d5X3N5bW1ldHJpYyk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKTtcbiYjNDM7XG4mIzQzOy8qIFdhbGsgdGhlIHBhY2thZ2UgbGlzdCBhbmQgY29tcGFyZSBub2RlIGNvdW50czsgdGhlIGNhbGxlciBob2xkcyB0aGUgbG9jay4gKi9cbiYjNDM7c3RhdGljIGJvb2wgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcbiYjNDM7XHRpbnQgcmVmX2NwdV9ub2RlX2NvdW50ID0gMCwgcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSAwO1xuJiM0MztcdGludCBwYWNrYWdlX2NvdW50ID0gMDtcbiYjNDM7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcCwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XG4mIzQzO1x0XHRpbnQgY3B1X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXHUwMDNlY3B1X25vZGVzKTtcbiYjNDM7XHRcdGludCBtZW1vcnlfb25seV9ub2RlX2NvdW50ID0gbm9kZXNfd2VpZ2h0KG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcbiYjNDM7XHRcdGludCB0b3RhbF9ub2RlX2NvdW50ID0gY3B1X25vZGVfY291bnQgJiM0MzsgbWVtb3J5X29ubHlfbm9kZV9jb3VudDtcbiYjNDM7XG4mIzQzO1x0XHRwYWNrYWdlX2NvdW50JiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0XHQvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi9cbiYjNDM7XHRcdGlmICh0b3RhbF9ub2RlX2NvdW50IFx1MDAzYyAyKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBhY2thZ2VfY291bnQgPT0gMSkge1xuJiM0MztcdFx0XHRyZWZfY3B1X25vZGVfY291bnQgPSBjcHVfbm9kZV9jb3VudDtcbiYjNDM7XHRcdFx0cmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSBtZW1vcnlfb25seV9ub2RlX2NvdW50O1xuJiM0MztcdFx0fSBlbHNlIGlmIChjcHVfbm9kZV9jb3VudCAhPSByZWZfY3B1X25vZGVfY291bnQgfHxcbiYjNDM7XHRcdFx0ICAgbWVtb3J5X29ubHlfbm9kZV9jb3VudCAhPSByZWZfbWVtb3J5X29ubHlfbm9kZV9jb3VudCkge1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAocGFja2FnZV9jb3VudCBcdTAwM2MgMilcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSAtIFZhbGlkYXRlIHRvcG9sb2d5IGZvciBwYWNrYWdlLWF3YXJlIGZlYXR1cmVzXG4mIzQzOyAqXG4mIzQzOyAqIFZhbGlkYXRlcyB0b3BvbG9neSBzeW1tZXRyeSBieSBjaGVja2luZyBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsXG4mIzQzOyAqIG5vZGUgc3RydWN0dXJlLiBVcGRhdGVzIHRoZSBnbG9iYWwgdG9wb2xvZ3lfc3ltbWV0cmljIHZhcmlhYmxlLlxuJiM0MzsgKlxuJiM0MzsgKiBUb3BvbG9neSBpcyB2YWxpZCBvbmx5IHdoZW4gYWxsIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiYjNDM7ICogMS4gQXQgbGVhc3QgMiBwYWNrYWdlcyBleGlzdCAobXVsdGktcGFja2FnZSBzeXN0ZW0pXG4mIzQzOyAqIDIuIEFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBjcHVfbm9kZSBhbmQgbWVtb3J5X29ubHlfbm9kZSBjb3VudHNcbiYjNDM7ICogMy4gRWFjaCBwYWNrYWdlIGhhcyBhdCBsZWFzdCAyIHRvdGFsIG5vZGVzIChjcHVfbm9kZSAmIzQzOyBtZW1vcnlfb25seV9ub2RlIFx1MDAzZT0gMilcbiYjNDM7ICpcbiYjNDM7ICogVmFsaWQgY29uZmlndXJhdGlvbnMgcGVyIHBhY2thZ2U6XG4mIzQzOyAqIC0gMSBjcHVfbm9kZSAmIzQzOyAxIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZClcbiYjNDM7ICogLSAyIGNwdV9ub2RlcyAmIzQzOyAwIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZClcbiYjNDM7ICogLSAwIGNwdV9ub2RlICYjNDM7IDIgbWVtb3J5X29ubHlfbm9kZXMgPSAyIG5vZGVzICh2YWxpZClcbiYjNDM7ICogLSAxIGNwdV9ub2RlICYjNDM7IDAgbWVtb3J5X29ubHlfbm9kZSA9IDEgbm9kZSAoaW52YWxpZCAtIHNpbmdsZSBub2RlIHBhY2thZ2UpXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRXUklURV9PTkNFKHRvcG9sb2d5X3N5bW1ldHJpYywgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSgpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3BhY2thZ2VfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IDAsIG5pZDtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7XG4mIzQzO1x0XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IGNyZWF0ZV9ub2RlX3dpdGhfcGFja2FnZShuaWQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRob3RwbHVnX25vZGVfbm90aWZpZXIobXBfaG90cGx1Z19jYWxsYmFjaywgTUVNVElFUl9IT1RQTFVHX1BSSSk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztsYXRlX2luaXRjYWxsKG1lbW9yeV9wYWNrYWdlX2luaXQpO1xuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcbmluZGV4IDRlNDQyMWIyMmI1OWYuLjY2YmNjYjlhMGExOTEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1wb2xpY3kuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtcG9saWN5LmNcbkBAIC0xMTcsNiAmIzQzOzExNyw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3RsYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdWFjY2Vzcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gXG5AQCAtMTY3LDYgJiM0MzsxNjgsOCBAQCBzdGF0aWMgdW5zaWduZWQgaW50ICpub2RlX2J3X3RhYmxlO1xuICAqL1xuIHN0YXRpYyBERUZJTkVfTVVURVgod2lfc3RhdGVfbG9jayk7XG4gXG4mIzQzO3N0YXRpYyBib29sIHBhY2thZ2VfbW9kZV9lbmFibGVkO1xuJiM0MztcbiBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcbiB7XG4gXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XG5AQCAtMTgwLDYgJiM0MzsxODMsMTEgQEAgc3RhdGljIHU4IGdldF9pbF93ZWlnaHQoaW50IG5vZGUpXG4gXHRyZXR1cm4gd2VpZ2h0O1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBSRUFEX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQpIFx1MDAyNlx1MDAyNiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIENvbnZlcnQgYmFuZHdpZHRoIHZhbHVlcyBpbnRvIHdlaWdodGVkIGludGVybGVhdmUgd2VpZ2h0cy5cbiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay5cbkBAIC0zMzcsNiAmIzQzOzM0NSw0NyBAQCBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChuZWFyZXN0X25vZGVfbm9kZW1hc2spO1xuIFxuJiM0MzsvKipcbiYjNDM7ICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGVcbiYjNDM7ICogQG5vZGU6IFRoZSByZWZlcmVuY2Ugbm9kZSBJRCB0byBtZWFzdXJlIGRpc3RhbmNlIGZyb21cbiYjNDM7ICogQG1hc2s6IFRoZSBzZXQgb2YgY2FuZGlkYXRlIG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdFxuJiM0MzsgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciBhbGwgbm9kZXMgaW4gQG1hc2sgYW5kIG1lYXN1cmVzIHRoZSBkaXN0YW5jZVxuJiM0MzsgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuXG4mIzQzOyAqIEl0IGZpbmRzIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGFuZCB0aGVuIHJlY29yZHMgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXRcbiYjNDM7ICogc2hhcmUgdGhhdCBzYW1lIG1pbmltdW0gZGlzdGFuY2UgaW50byB0aGUgb3V0cHV0IG1hc2sgQG91dC5cbiYjNDM7ICpcbiYjNDM7ICogRm9yIGV4YW1wbGUsIGlmIG11bHRpcGxlIG5vZGVzIGhhdmUgZXF1YWwgbWluaW1hbCBkaXN0YW5jZSB0byBAbm9kZSwgYWxsXG4mIzQzOyAqIG9mIHRoZW0gYXJlIGluY2x1ZGVkIGluIEBvdXQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciAtRUlOVkFMIGlmIEBvdXQgaXMgTlVMTC5cbiYjNDM7ICovXG4mIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZGlzdCwgbiwgbWluX2Rpc3QgPSBJTlRfTUFYO1xuJiM0MztcbiYjNDM7XHRpZiAoIW91dClcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7XG4mIzQzO1x0XHRkaXN0ID0gbm9kZV9kaXN0YW5jZShub2RlLCBuKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoZGlzdCBcdTAwM2MgbWluX2Rpc3QpIHtcbiYjNDM7XHRcdFx0bWluX2Rpc3QgPSBkaXN0O1xuJiM0MztcdFx0XHRub2Rlc19jbGVhcigqb3V0KTtcbiYjNDM7XHRcdFx0bm9kZV9zZXQobiwgKm91dCk7XG4mIzQzO1x0XHR9IGVsc2UgaWYgKGRpc3QgPT0gbWluX2Rpc3QpIHtcbiYjNDM7XHRcdFx0bm9kZV9zZXQobiwgKm91dCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChuZWFyZXN0X25vZGVzX25vZGVtYXNrKTtcbiYjNDM7XG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBwLVx1MDAzZW1lbXBvbGljeTtcbkBAIC0yMDk3LDE3ICYjNDM7MjE0Niw5NyBAQCBib29sIGFwcGx5X3BvbGljeV96b25lKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgZW51bSB6b25lX3R5cGUgem9uZSlcbiBcdHJldHVybiB6b25lIFx1MDAzZT0gZHluYW1pY19wb2xpY3lfem9uZTtcbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2VcbiYjNDM7ICogQHBvbGljeTogVGFyZ2V0IG1lbXBvbGljeSB3aG9zZSB1c2VyLXNlbGVjdGVkIG5vZGVzIGFyZSBpbiBAcG9saWN5LVx1MDAzZW5vZGVzLlxuJiM0MzsgKiBAbWFzazogICBPdXRwdXQgbm9kZW1hc2suIE9uIHN1Y2Nlc3MsIGNvbnRhaW5zIHBvbGljeS1cdTAwM2Vub2RlcyBsaW1pdGVkIHRvXG4mIzQzOyAqICAgICAgICAgIHRoZSBwYWNrYWdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBhbGxvY2F0aW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGhlbHBlciBjb21iaW5lcyB0d28gY29uc3RyYWludHMgdG8gZGVjaWRlIHdoZXJlIHdpdGhpbiBhIHBhY2thZ2VcbiYjNDM7ICogbWVtb3J5IG1heSBiZSBhbGxvY2F0ZWQ6XG4mIzQzOyAqXG4mIzQzOyAqICAgMSkgVGhlIGNhbGxlciYjMzk7cyBwYWNrYWdlOiBkZXJpdmVkIHZpYSBtcF9nZXRfcGFja2FnZV9ub2RlcyhudW1hX25vZGVfaWQoKSkuXG4mIzQzOyAqICAgMikgVGhlIHVzZXImIzM5O3MgcHJlc2VsZWN0ZWQgc2V0IEBwb2xpY3ktXHUwMDNlbm9kZXMgKGNwdXNldHMvbWVtcG9saWN5KS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGZ1bmN0aW9uIG9idGFpbnMgdGhlIG5vZGVtYXNrIG9mIHRoZSBjdXJyZW50IENQVSYjMzk7cyBwYWNrYWdlIGFuZFxuJiM0MzsgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS1cdTAwM2Vub2Rlcy4gSWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSAoZS5nLiB0aGVcbiYjNDM7ICogdXNlciBleGNsdWRlZCBldmVyeSBub2RlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UpLCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuJiM0MzsgKiBub2RlIGluIEBwb2xpY3ktXHUwMDNlbm9kZXMsIGRlcml2ZXMgdGhhdCBub2RlJiMzOTtzIHBhY2thZ2UsIGFuZCBpbnRlcnNlY3RzXG4mIzQzOyAqIGFnYWluLiBJZiB0aGUgZmFsbGJhY2sgYWxzbyB5aWVsZHMgYW4gZW1wdHkgc2V0LCBAbWFzayBzdGF5cyBlbXB0eSBhbmQgYVxuJiM0MzsgKiBub24temVybyBlcnJvciBpcyByZXR1cm5lZC5cbiYjNDM7ICpcbiYjNDM7ICogRXhhbXBsZXMgKHBhY2thZ2VzOiBQMD17Q1BVOjAsIE1FTToyfSwgUDE9e0NQVToxLCBNRU06M30pOlxuJiM0MzsgKiAgIC0gcG9saWN5LVx1MDAzZW5vZGVzID0gezAsMSwyLDN9XG4mIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezAsMn07IG9uIFAxOiBtYXNrID0gezEsM30uXG4mIzQzOyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MCwxLDN9XG4mIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezB9ICAgICAgKG9ubHkgbm9kZSAwIGZyb20gUDAgaXMgYWxsb3dlZCkuXG4mIzQzOyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MSwyLDN9XG4mIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezJ9ICAgICAgKG9ubHkgbm9kZSAyIGZyb20gUDAgaXMgYWxsb3dlZCkuXG4mIzQzOyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MSwzfVxuJiM0MzsgKiAgICAgICBvbiBQMDogY3VycmVudCBwYWNrYWdlIChQMCkgXHUwMDI2IHBvbGljeSA9IE5VTEwgLVx1MDAzZSBmYWxsYmFjayB0byBwb2xpY3k9MSxcbiYjNDM7ICogICAgICAgICAgICAgICBwYWNrYWdlKDEpPVAxLCBtYXNrID0gezEsM30uIChVc2VyIGVmZmVjdGl2ZWx5IG9wdGVkIG91dCBvZiBQMC4pXG4mIzQzOyAqXG4mIzQzOyAqIElmIHRoZSBzZWxlY3RlZCBub2RlIGlzIGxvdyBvbiBtZW1vcnksIHRoZSBhbGxvY2F0aW9uIG1heSB1c2UgYW5vdGhlciBub2RlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46XG4mIzQzOyAqICAgMCBvbiBzdWNjZXNzIHdpdGggQG1hc2sgc2V0IGFzIGFib3ZlO1xuJiM0MzsgKiAgIC1FSU5WQUwgaWYgQHBvbGljeS9AbWFzayBpcyBOVUxMO1xuJiM0MzsgKiAgIC1FTk9FTlQgaWYgZXZlbiB0aGUgZmFsbGJhY2sgaW50ZXJzZWN0aW9uIGlzIGVtcHR5O1xuJiM0MzsgKiAgIFByb3BhZ2F0ZWQgZXJyb3IgZnJvbSBtcF9nZXRfcGFja2FnZV9ub2RlcygpIG9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHBvbGljeV9yZXNvbHZlX3BhY2thZ2Vfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBub2RlbWFza190ICptYXNrKVxuJiM0Mzt7XG4mIzQzO1x0bm9kZW1hc2tfdCBwYWNrYWdlX21hc2s7XG4mIzQzO1x0aW50IG5vZGUsIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwb2xpY3kgfHwgIW1hc2spXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0bm9kZXNfY2xlYXIoKm1hc2spO1xuJiM0MztcbiYjNDM7XHRub2RlID0gbnVtYV9ub2RlX2lkKCk7XG4mIzQzO1x0cmV0ID0gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMobm9kZSwgXHUwMDI2cGFja2FnZV9tYXNrKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0bm9kZXNfYW5kKCptYXNrLCBwYWNrYWdlX21hc2ssIHBvbGljeS1cdTAwM2Vub2Rlcyk7XG4mIzQzO1x0aWYgKCFub2Rlc19lbXB0eSgqbWFzaykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdXNlciYjMzk7cyBub2RlbWFzayBleGNsdWRlcyBldmVyeSBub2RlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2U7XG4mIzQzO1x0ICogZmFsbCBiYWNrIHRvIHRoZSBwYWNrYWdlIHNwYW5uZWQgYnkgdGhlIHVzZXImIzM5O3Mgb3duIGZpcnN0IG5vZGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0bm9kZSA9IGZpcnN0X25vZGUocG9saWN5LVx1MDAzZW5vZGVzKTtcbiYjNDM7XHRyZXQgPSBtcF9nZXRfcGFja2FnZV9ub2Rlcyhub2RlLCBcdTAwMjZwYWNrYWdlX21hc2spO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRub2Rlc19hbmQoKm1hc2ssIHBhY2thZ2VfbWFzaywgcG9saWN5LVx1MDAzZW5vZGVzKTtcbiYjNDM7XHRpZiAobm9kZXNfZW1wdHkoKm1hc2spKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXG4ge1xuIFx0dW5zaWduZWQgaW50IG5vZGU7XG4gXHR1bnNpZ25lZCBpbnQgY3B1c2V0X21lbXNfY29va2llO1xuJiM0MztcdG5vZGVtYXNrX3QgbWFzaztcbiBcbiByZXRyeTpcbiBcdC8qIHRvIHByZXZlbnQgbWlzY291bnQgdXNlIHRzay1cdTAwM2VtZW1zX2FsbG93ZWRfc2VxIHRvIGRldGVjdCByZWJpbmQgKi9cbiBcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XG4gXHRub2RlID0gY3VycmVudC1cdTAwM2VpbF9wcmV2O1xuLVx0aWYgKCFjdXJyZW50LVx1MDAzZWlsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBwb2xpY3ktXHUwMDNlbm9kZXMpKSB7XG4tXHRcdG5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgcG9saWN5LVx1MDAzZW5vZGVzKTtcbiYjNDM7XG4mIzQzO1x0LyogUGFja2FnZSBtb2RlIG9mZiBvciB1bnJlc29sdmVkOiBmYWxsIGJhY2sgdG8gdGhlIGZ1bGwgcG9saWN5IG5vZGVtYXNrLiAqL1xuJiM0MztcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fFxuJiM0MztcdCAgICBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHBvbGljeSwgXHUwMDI2bWFzaykpXG4mIzQzO1x0XHRtYXNrID0gcG9saWN5LVx1MDAzZW5vZGVzO1xuJiM0MztcbiYjNDM7XHRpZiAoIWN1cnJlbnQtXHUwMDNlaWxfd2VpZ2h0IHx8ICFub2RlX2lzc2V0KG5vZGUsIG1hc2spKSB7XG4mIzQzO1x0XHRub2RlID0gbmV4dF9ub2RlX2luKG5vZGUsIG1hc2spO1xuIFx0XHRpZiAocmVhZF9tZW1zX2FsbG93ZWRfcmV0cnkoY3B1c2V0X21lbXNfY29va2llKSlcbiBcdFx0XHRnb3RvIHJldHJ5O1xuIFx0XHRpZiAobm9kZSA9PSBNQVhfTlVNTk9ERVMpXG5AQCAtMjIwMCw2ICYjNDM7MjMyOSwzMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuIFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBQYWNrYWdlLWF3YXJlIGNvdW50ZXJwYXJ0IG9mIHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soKTogcmVzb2x2ZSB0aGVcbiYjNDM7ICogY3VycmVudCBwYWNrYWdlJiMzOTtzIG5vZGVzIGludGVyc2VjdGVkIHdpdGggdGhlIHBvbGljeSwgZmFsbGluZyBiYWNrIHRvIHRoZVxuJiM0MzsgKiBmdWxsIHBvbGljeSBub2RlbWFzayB3aGVuIHBhY2thZ2UgbW9kZSBpcyBvZmYgb3IgcmVzb2x1dGlvbiBmYWlscy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgbm9kZW1hc2tfdCAqbWFzaylcbiYjNDM7e1xuJiM0MztcdG5vZGVtYXNrX3QgcGFja2FnZV9tYXNrO1xuJiM0MztcbiYjNDM7XHRiYXJyaWVyKCk7XG4mIzQzO1x0aWYgKCF3aV9wYWNrYWdlX21vZGVfZW5hYmxlZCgpKSB7XG4mIzQzO1x0XHRtZW1jcHkobWFzaywgXHUwMDI2cG9sLVx1MDAzZW5vZGVzLCBzaXplb2Yobm9kZW1hc2tfdCkpO1xuJiM0MztcdFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHBvbCwgXHUwMDI2cGFja2FnZV9tYXNrKSlcbiYjNDM7XHRcdG1lbWNweShtYXNrLCBcdTAwMjZwb2wtXHUwMDNlbm9kZXMsIHNpemVvZihub2RlbWFza190KSk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0bWVtY3B5KG1hc2ssIFx1MDAyNnBhY2thZ2VfbWFzaywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcbiYjNDM7XHRiYXJyaWVyKCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBub2Rlc193ZWlnaHQoKm1hc2spO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcbiB7XG4gXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XG5AQCAtMjIxMCw3ICYjNDM7MjM2Myw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcbiBcdHU4IHdlaWdodDtcbiBcdGludCBuaWQgPSAwO1xuIFxuLVx0bnJfbm9kZXMgPSByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZW1hc2spO1xuJiM0MztcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZW1hc2spO1xuIFx0aWYgKCFucl9ub2RlcylcbiBcdFx0cmV0dXJuIG51bWFfbm9kZV9pZCgpO1xuIFxuQEAgLTI2NTQsNyAmIzQzOzI4MDcsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxuIFx0LyogcmVhZCB0aGUgbm9kZXMgb250byB0aGUgc3RhY2ssIHJldHJ5IGlmIGRvbmUgZHVyaW5nIHJlYmluZCAqL1xuIFx0ZG8ge1xuIFx0XHRjcHVzZXRfbWVtc19jb29raWUgPSByZWFkX21lbXNfYWxsb3dlZF9iZWdpbigpO1xuLVx0XHRubm9kZXMgPSByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZXMpO1xuJiM0MztcdFx0bm5vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZXMpO1xuIFx0fSB3aGlsZSAocmVhZF9tZW1zX2FsbG93ZWRfcmV0cnkoY3B1c2V0X21lbXNfY29va2llKSk7XG4gXG4gXHQvKiBpZiB0aGUgbm9kZW1hc2sgaGFzIGJlY29tZSBpbnZhbGlkLCB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgKi9cbkBAIC0zNzk0LDcgJiM0MzszOTQ3LDQyIEBAIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfYXV0b19hdHRyID0ge1xuIFx0LnN0b3JlID0gd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9hdXRvX3N0b3JlLFxuIH07XG4gXG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxuJiM0MztcdFx0c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFwmIzM0OyVzXFxuXCYjMzQ7LCBzdHJfdHJ1ZV9mYWxzZShSRUFEX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQpKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbiYjNDM7XHRcdHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRib29sIGlucHV0O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IGtzdHJ0b2Jvb2woYnVmLCBcdTAwMjZpbnB1dCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRGlzYWJsZSBwYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9naWVzLlxuJiM0MztcdCAqIE5vbi1zeW1tZXRyaWMgdG9wb2xvZ3kgKGUuZy4sIGFzeW1tZXRyaWMgQ1hMIG1lbW9yeSBhdHRhY2htZW50KSBjYW5cbiYjNDM7XHQgKiBjYXVzZSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpZiBwYWNrYWdlLWF3YXJlIGFsbG9jYXRpb24gaXMgdXNlZC5cbiYjNDM7XHQgKiBSZWplY3QgZW5hYmxlIHJlcXVlc3QgaWYgdG9wb2xvZ3kgaXMgbm90IHN5bW1ldHJpYy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaW5wdXQgXHUwMDI2XHUwMDI2ICFtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKSkge1xuJiM0MztcdFx0cHJfd2FybihcJiMzNDtwYWNrYWdlX21vZGUgY2Fubm90IGJlIGVuYWJsZWQgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9neVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdFdSSVRFX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQsIGlucHV0KTtcbiYjNDM7XHRyZXR1cm4gY291bnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfcGFja2FnZV9tb2RlX2F0dHIgPVxuJiM0MztcdF9fQVRUUihwYWNrYWdlX21vZGUsIDA2NjQsIHBhY2thZ2VfbW9kZV9zaG93LCBwYWNrYWdlX21vZGVfc3RvcmUpO1xuJiM0MztcbiBzdGF0aWMgdm9pZCB3aV9jbGVhbnVwKHZvaWQpIHtcbiYjNDM7XHRzeXNmc19yZW1vdmVfZmlsZShcdTAwMjZ3aV9ncm91cC1cdTAwM2V3aV9rb2JqLCBcdTAwMjZ3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3JlbW92ZV9maWxlKFx1MDAyNndpX2dyb3VwLVx1MDAzZXdpX2tvYmosIFx1MDAyNndpX2F1dG9fYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3dpX25vZGVfZGVsZXRlX2FsbCgpO1xuIFx0d2lfc3RhdGVfZnJlZSgpO1xuQEAgLTM5MDAsNiAmIzQzOzQwODgsMTAgQEAgc3RhdGljIGludCBfX2luaXQgYWRkX3dlaWdodGVkX2ludGVybGVhdmVfZ3JvdXAoc3RydWN0IGtvYmplY3QgKm1lbXBvbGljeV9rb2JqKVxuIFx0aWYgKGVycilcbiBcdFx0Z290byBlcnJfcHV0X2tvYmo7XG4gXG4mIzQzO1x0ZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoXHUwMDI2d2lfZ3JvdXAtXHUwMDNld2lfa29iaiwgXHUwMDI2d2lfcGFja2FnZV9tb2RlX2F0dHIuYXR0cik7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdGdvdG8gZXJyX2NsZWFudXBfa29iajtcbiYjNDM7XG4gXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHtcbiBcdFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtOVU1BJiMzNDssCiAgICAmIzM0O05VTUFfTUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0NYTF9CVVMmIzM0OywKICAgICYjMzQ7Q1hMX1JFR0lPTiYjMzQ7LAogICAgJiMzNDtERVZfREFYJiMzNDssCiAgICAmIzM0O0RFVl9EQVhfS01FTSYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wX2FkZF9wYWNrYWdlX25vZGUmIzM0OywKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2Vfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzJiMzNDssCiAgICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgICAmIzM0O21wX25leHRfZGVtb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljJiMzNDssCiAgICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfcHJvYmVfcGFja2FnZV9pZCYjMzQ7LAogICAgJiMzNDtyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDssCiAgICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjVhMmEyYWFjNjQ5YmNhYjZmNDBjMWRjNmZmYWEzNTExMGVkYWI3YQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgQXVnIDYgMDg6Mjg6MjUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2UgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLXBhY2thZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUwMGY5ZTVmZjE5ZQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tcGFja2FnZQpAQCAtMCwwICYjNDM7MSwzNSBAQAomIzQzO1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvCiYjNDM7RGF0ZToJCUF1Z3VzdCAyMDI2CiYjNDM7Q29udGFjdDoJTGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0ICZsdDtsaW51eC1tbUBrdmFjay5vcmcmZ3Q7CiYjNDM7RGVzY3JpcHRpb246CU1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5CiYjNDM7CiYjNDM7CQlBICYjMzQ7bWVtb3J5IHBhY2thZ2UmIzM0OyBncm91cHMgdGhlIE5VTUEgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIG9uZQomIzQzOwkJcGh5c2ljYWwgQ1BVIHBhY2thZ2UgKHNvY2tldCk6IHRoZSBub2RlcyB0aGF0IGhhdmUgQ1BVcyBhbmQKJiM0MzsJCXRoZSBub2RlcyB0aGF0IG9ubHkgaGF2ZSBtZW1vcnkgKGUuZy4gQ1hMIG9yIEhCTSkuCiYjNDM7CiYjNDM7CQlBbGwgYXR0cmlidXRlcyBhcmUgcmVhZC1vbmx5OyB0aGUgdG9wb2xvZ3kgY2Fubm90IGJlCiYjNDM7CQlvdmVycmlkZGVuIGZyb20gdXNlciBzcGFjZS4KJiM0MzsKJiM0MztXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXMKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJQWxsIE5VTUEgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLCBpbiBub2RlbGlzdCBmb3JtYXQKJiM0MzsJCShlLmcuICYjMzQ7MCwyJiMzNDspLgomIzQzOwomIzQzO1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGFja2FnZV9jcHVfbm9kZXMKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJVGhlIG5vZGVzIHRoYXQgaGF2ZSBDUFVzIGluIHRoaXMgcGFja2FnZSwgaW4gbm9kZWxpc3QKJiM0MzsJCWZvcm1hdC4KJiM0MzsKJiM0MztXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2VfbWVtX29ubHlfbm9kZXMKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJVGhlIG5vZGVzIHRoYXQgb25seSBoYXZlIG1lbW9yeSAoZS5nLiBDWEwvSEJNKSBpbiB0aGlzCiYjNDM7CQlwYWNrYWdlLCBpbiBub2RlbGlzdCBmb3JtYXQuCiYjNDM7CiYjNDM7V2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9waHlzaWNhbF9wYWNrYWdlX2lkCiYjNDM7RGF0ZToJCUF1Z3VzdCAyMDI2CiYjNDM7Q29udGFjdDoJTGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0ICZsdDtsaW51eC1tbUBrdmFjay5vcmcmZ3Q7CiYjNDM7RGVzY3JpcHRpb246CVRoZSBwaHlzaWNhbCBwYWNrYWdlIGlkIHRoaXMgZ3JvdXAgY29ycmVzcG9uZHMgdG8sIGFzCiYjNDM7CQlyZXBvcnRlZCBieSBDUFUgdG9wb2xvZ3kuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlCmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlCiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlCkBAIC01MiwzICYjNDM7NTIsMjAgQEAgRGVzY3JpcHRpb246CUF1dG8td2VpZ2h0aW5nIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCiAKIAkJV3JpdGluZyBhIG5ldyB3ZWlnaHQgdG8gYSBub2RlIGRpcmVjdGx5IHZpYSB0aGUgbm9kZU4gaW50ZXJmYWNlCiAJCXdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0aGUgc3lzdGVtIHRvIG1hbnVhbCBtb2RlLgomIzQzOwomIzQzO1doYXQ6CQkvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGUKJiM0MztEYXRlOgkJQXVndXN0IDIwMjYKJiM0MztDb250YWN0OglMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgJmx0O2xpbnV4LW1tQGt2YWNrLm9yZyZndDsKJiM0MztEZXNjcmlwdGlvbjoJUGFja2FnZS1hd2FyZSB3ZWlnaHRlZCBpbnRlcmxlYXZlIHRvZ2dsZQomIzQzOwomIzQzOwkJJiMzOTt0cnVlJiMzOTsgcmVzdHJpY3RzIHdlaWdodGVkIGludGVybGVhdmUgbm9kZSBzZWxlY3Rpb24gdG8gdGhlCiYjNDM7CQlOVU1BIG5vZGVzIG9mIHRoZSBwYWNrYWdlIChDUFUgc29ja2V0KSB0aGUgYWxsb2NhdGluZyB0YXNrCiYjNDM7CQlpcyBydW5uaW5nIG9uLiAmIzM5O2ZhbHNlJiMzOTsgKHRoZSBkZWZhdWx0KSB1c2VzIHRoZSBleGlzdGluZwomIzQzOwkJd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBiZWhhdmlvci4KJiM0MzsKJiM0MzsJCUVuYWJsaW5nIGlzIHJlamVjdGVkIHdpdGggLUVJTlZBTCB3aGlsZSB0aGUgcGFja2FnZSB0b3BvbG9neQomIzQzOwkJaXMgbm90IHN5bW1ldHJpYy4KJiM0MzsKJiM0MzsJCVdyaXRpbmcgYW55IHRydWUgdmFsdWUgc3RyaW5nIChlLmcuIFkgb3IgMSkgZW5hYmxlcyB0aGUKJiM0MzsJCXJlc3RyaWN0aW9uLCBhbnkgZmFsc2UgdmFsdWUgc3RyaW5nIChlLmcuIE4gb3IgMCkgZGlzYWJsZXMKJiM0MzsJCWl0LiBBbGwgb3RoZXIgc3RyaW5ncyByZXR1cm4gLUVJTlZBTC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jCmluZGV4IGU1MGRjNzE2ZDRlODIuLmFmNjZlMmUwNmM2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uYwpAQCAtMjY3Myw2ICYjNDM7MjY3Myw1NSBAQCBzdGF0aWMgaW50IGN4bF9yZWdpb25fY2FsY3VsYXRlX2FkaXN0YW5jZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCXJldHVybiBOT1RJRllfU1RPUDsKIH0KIAomIzQzOy8qCiYjNDM7ICogRmluZCBhIE5VTUEgbm9kZSB0byBhY3QgYXMgdGhlIGluaXRpYXRvciBmb3IgdGhpcyByZWdpb246IHNjYW4gdGhlCiYjNDM7ICogcmVnaW9uJiMzOTtzIGVuZHBvaW50IHRhcmdldHMgYW5kIHJldHVybiB0aGUgZmlyc3Qgb25lIHRoYXQgcmVzb2x2ZXMgdG8gYQomIzQzOyAqIHZhbGlkIE5VTUEgbm9kZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGN4bF9yZWdpb25fZmluZF9uZWFyZXN0X25vZGUoc3RydWN0IGN4bF9yZWdpb24gKmN4bHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY3hsX3JlZ2lvbl9wYXJhbXMgKnAgPSAmYW1wO2N4bHItJmd0O3BhcmFtczsKJiM0MzsJc3RydWN0IGN4bF9lbmRwb2ludF9kZWNvZGVyICpjeGxlZCA9IE5VTEw7CiYjNDM7CXN0cnVjdCBjeGxfbWVtZGV2ICpjeGxtZCA9IE5VTEw7CiYjNDM7CWludCBpLCBudW1hX25vZGU7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBwLSZndDtucl90YXJnZXRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY3hsZWQgPSBwLSZndDt0YXJnZXRzW2ldOwomIzQzOwkJY3hsbWQgPSBjeGxlZF90b19tZW1kZXYoY3hsZWQpOwomIzQzOwkJbnVtYV9ub2RlID0gZGV2X3RvX25vZGUoJmFtcDtjeGxtZC0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChudW1hX25vZGUgIT0gTlVNQV9OT19OT0RFKQomIzQzOwkJCXJldHVybiBudW1hX25vZGU7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTUFfTk9fTk9ERTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBQYWNrYWdlIG5vdGlmaWVyIGNhbGxiYWNrOiB3aGVuIGEgbmV3IG1lbW9yeSBub2RlIGlzIG9ubGluZWQgdmlhIGRheAomIzQzOyAqIGttZW0sIGJpbmQgdGhlIG5vZGUgdGhpcyBDWEwgcmVnaW9uIGJhY2tzIHRvIGl0cyBtZW1vcnkgcGFja2FnZSwgdXNpbmcKJiM0MzsgKiB0aGUgbmVhcmVzdCByZWdpb24gdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IuIE5vdGlmaWNhdGlvbnMgZm9yIG90aGVyCiYjNDM7ICogbm9kZXMgYXJlIGlnbm9yZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF4X25pZCwgdm9pZCAqZGF0YSkKJiM0Mzt7CiYjNDM7CWludCByZWdpb25fbmlkLCBuZWFyZXN0X25pZCwgcmV0OwomIzQzOwlzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hsciA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGN4bF9yZWdpb24sIHBhY2thZ2Vfbm90aWZpZXIpOwomIzQzOwomIzQzOwlyZWdpb25fbmlkID0gcGh5c190b190YXJnZXRfbm9kZShjeGxyLSZndDtwYXJhbXMucmVzLSZndDtzdGFydCk7CiYjNDM7CWlmIChyZWdpb25fbmlkICE9IGRheF9uaWQpCiYjNDM7CQlyZXR1cm4gTk9USUZZX0RPTkU7CiYjNDM7CiYjNDM7CW5lYXJlc3RfbmlkID0gY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShjeGxyKTsKJiM0MzsJaWYgKG5lYXJlc3RfbmlkID09IE5VTUFfTk9fTk9ERSkKJiM0MzsJCXJldHVybiBOT1RJRllfRE9ORTsKJiM0MzsKJiM0MzsJcmV0ID0gbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoZGF4X25pZCwgbmVhcmVzdF9uaWQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIE5PVElGWV9ET05FOwomIzQzOwomIzQzOwlyZXR1cm4gTk9USUZZX09LOwomIzQzO30KJiM0MzsKIC8qKgogICogZGV2bV9jeGxfYWRkX3JlZ2lvbiAtIEFkZHMgYSByZWdpb24gdG8gYSBkZWNvZGVyCiAgKiBAY3hscmQ6IHJvb3QgZGVjb2RlcgpAQCAtMzg1Miw2ICYjNDM7MzkwMSw3IEBAIHN0YXRpYyB2b2lkIHNodXRkb3duX25vdGlmaWVycyh2b2lkICpfY3hscikKIAogCXVucmVnaXN0ZXJfbm9kZV9ub3RpZmllcigmYW1wO2N4bHItJmd0O25vZGVfbm90aWZpZXIpOwogCXVucmVnaXN0ZXJfbXRfYWRpc3RhbmNlX2FsZ29yaXRobSgmYW1wO2N4bHItJmd0O2FkaXN0X25vdGlmaWVyKTsKJiM0MzsJdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKCZhbXA7Y3hsci0mZ3Q7cGFja2FnZV9ub3RpZmllcik7CiB9CiAKIHN0YXRpYyB2b2lkIHJlbW92ZV9kZWJ1Z2ZzKHZvaWQgKmRlbnRyeSkKQEAgLTQwNjYsNiAmIzQzOzQxMTYsMTAgQEAgc3RhdGljIGludCBjeGxfcmVnaW9uX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIAljeGxyLSZndDthZGlzdF9ub3RpZmllci5wcmlvcml0eSA9IDEwMDsKIAlyZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKCZhbXA7Y3hsci0mZ3Q7YWRpc3Rfbm90aWZpZXIpOwogCiYjNDM7CWN4bHItJmd0O3BhY2thZ2Vfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZTsKJiM0MzsJY3hsci0mZ3Q7cGFja2FnZV9ub3RpZmllci5wcmlvcml0eSA9IDEwMDsKJiM0MzsJcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcigmYW1wO2N4bHItJmd0O3BhY2thZ2Vfbm90aWZpZXIpOwomIzQzOwogCXJjID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KCZhbXA7Y3hsci0mZ3Q7ZGV2LCBzaHV0ZG93bl9ub3RpZmllcnMsIGN4bHIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jeGwvY3hsLmggYi9kcml2ZXJzL2N4bC9jeGwuaAppbmRleCAxMjk3NTk0YmVhZWMzLi45MjgxY2EzYTVmMGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2N4bC9jeGwuaAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2N4bC9jeGwuaApAQCAtNDc3LDYgJiM0Mzs0NzcsNyBAQCBzdHJ1Y3QgY3hsX3JlZ2lvbiB7CiAJc3RydWN0IGFjY2Vzc19jb29yZGluYXRlIGNvb3JkW0FDQ0VTU19DT09SRElOQVRFX01BWF07CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vZGVfbm90aWZpZXI7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFkaXN0X25vdGlmaWVyOwomIzQzOwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFja2FnZV9ub3RpZmllcjsKIH07CiAKIHN0cnVjdCBjeGxfbnZkaW1tX2JyaWRnZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RheC9rbWVtLmMgYi9kcml2ZXJzL2RheC9rbWVtLmMKaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kYXgva21lbS5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZGF4L2ttZW0uYwpAQCAtOTQsNiAmIzQzOzk0LDkgQEAgc3RhdGljIGludCBkZXZfZGF4X2ttZW1fcHJvYmUoc3RydWN0IGRldl9kYXggKmRldl9kYXgpCiAJaWYgKElTX0VSUihtdHlwZSkpCiAJCXJldHVybiBQVFJfRVJSKG10eXBlKTsKIAomIzQzOwkvKiBSZXNvbHZlIHRoZSBtZW1vcnkgcGFja2FnZSBmb3IgdGhpcyBuZXdseSBvbmxpbmVkIGttZW0gbm9kZS4gKi8KJiM0MzsJbXBfcHJvYmVfcGFja2FnZV9pZChudW1hX25vZGUpOwomIzQzOwogCWZvciAoaSA9IDA7IGkgJmx0OyBkZXZfZGF4LSZndDtucl9yYW5nZTsgaSYjNDM7JiM0MzspIHsKIAkJc3RydWN0IHJhbmdlIHJhbmdlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaAppbmRleCA3OTk5YzU4NjI5ZWViLi5mODc3OGM0MzQyOWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmgKQEAgLTUyLDEwICYjNDM7NTIsMjUgQEAgaW50IG10X3BlcmZfdG9fYWRpc3RhbmNlKHN0cnVjdCBhY2Nlc3NfY29vcmRpbmF0ZSAqcGVyZiwgaW50ICphZGlzdCk7CiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCwKIAkJCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTsKIHZvaWQgbXRfcHV0X21lbW9yeV90eXBlcyhzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpOwomIzQzOwomIzQzO2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwomIzQzO3ZvaWQgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwomIzQzO2ludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpOwomIzQzO2ludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCk7CiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGUoaW50IG5pZCk7CiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7CiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpOwomIzQzO2ludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpOwomIzQzO2Jvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpOwogI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTgogaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTsKIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpOwogYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpOwomIzQzOwomIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7CiYjNDM7aW50IG1wX25leHRfZGVtb3Rpb25fbm9kZShpbnQgbmlkKTsKJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTsKJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaykKIHsKQEAgLTcxLDYgJiM0Mzs4NiwzMCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKQogewogCXJldHVybiB0cnVlOwogfQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaWYgKG91dCkKJiM0MzsJCW5vZGVzX2NsZWFyKCpvdXQpOwomIzQzOwlyZXR1cm4gLUVOT0VOVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gTlVNQV9OT19OT0RFOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpCiYjNDM7ewomIzQzOwlpZiAob3V0KQomIzQzOwkJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CXJldHVybiAtRU5PRU5UOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gTlVNQV9OT19OT0RFOwomIzQzO30KICNlbmRpZgogCiAjZWxzZQpAQCAtMTUxLDUgJiM0MzsxOTAsNzkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCwKIHN0YXRpYyBpbmxpbmUgdm9pZCBtdF9wdXRfbWVtb3J5X3R5cGVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lbW9yeV90eXBlcykKIHsKIH0KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKQomIzQzO3sKJiM0MzsJcmV0dXJuIE5PVElGWV9ET05FOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaWYgKG91dCkKJiM0MzsJCW5vZGVzX2NsZWFyKCpvdXQpOwomIzQzOwlyZXR1cm4gLUVOT0VOVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBtcF9pc190b3BvbG9neV9zeW1tZXRyaWModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpCiYjNDM7ewomIzQzOwlpZiAob3V0KQomIzQzOwkJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CXJldHVybiAtRU5PRU5UOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7fQogI2VuZGlmCS8qIENPTkZJR19OVU1BICovCiAjZW5kaWYgIC8qIF9MSU5VWF9NRU1PUllfVElFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9udW1hLmggYi9pbmNsdWRlL2xpbnV4L251bWEuaAppbmRleCBlNmJhYWY2MDUxYmNmLi40ZjJhMGMzNDQxMjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L251bWEuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L251bWEuaApAQCAtMzMsNiAmIzQzOzMzLDggQEAgaW50IG51bWFfbmVhcmVzdF9ub2RlKGludCBub2RlLCB1bnNpZ25lZCBpbnQgc3RhdGUpOwogCiBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKTsKIAomIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpOwomIzQzOwogI2lmbmRlZiBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZAogaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCk7CiAjZW5kaWYKQEAgLTU0LDYgJiM0Mzs1NiwxNSBAQCBzdGF0aWMgaW5saW5lIGludCBuZWFyZXN0X25vZGVfbm9kZW1hc2soaW50IG5vZGUsIG5vZGVtYXNrX3QgKm1hc2spCiAJcmV0dXJuIE5VTUFfTk9fTk9ERTsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2soaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKm1hc2ssCiYjNDM7CQkJCQkgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaWYgKCFvdXQpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmMKaW5kZXggNTQ4NTFkOGExOTViMC4uNTkzMmRmMzE1NjA0YSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LXRpZXJzLmMKQEAgLTEsNCAmIzQzOzEsNSBAQAogLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY2xlYW51cC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9sb2NrZGVwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc3lzZnMuaCZndDsKQEAgLTUxLDYgJiM0Mzs1MiwxMSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ1c190eXBlIG1lbW9yeV90aWVyX3N1YnN5cyA9IHsKIAkuZGV2X25hbWUgPSAmIzM0O21lbW9yeV90aWVyJiMzNDssCiB9OwogCiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBwYWNrYWdlX3N1YnN5cyA9IHsKJiM0MzsJLm5hbWUgPSAmIzM0O3BhY2thZ2UmIzM0OywKJiM0MzsJLmRldl9uYW1lID0gJiMzNDtwYWNrYWdlJiMzNDssCiYjNDM7fTsKJiM0MzsKICNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkcKIC8qKgogICogZm9saW9fdXNlX2FjY2Vzc190aW1lIC0gY2hlY2sgaWYgYSBmb2xpbyByZXVzZXMgY3B1cGlkIGZvciBwYWdlIGFjY2VzcyB0aW1lCkBAIC0xMDA3LDMgJiM0MzsxMDEzLDEwMDYgQEAgc3RhdGljIGludCBfX2luaXQgbnVtYV9pbml0X3N5c2ZzKHZvaWQpCiBzdWJzeXNfaW5pdGNhbGwobnVtYV9pbml0X3N5c2ZzKTsKICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KICNlbmRpZgomIzQzOwomIzQzOy8qKgomIzQzOyAqIGVudW0gbXBfbm9kZXNfdHlwZSAtIFNlbGVjdG9yIGZvciB3aGljaCBzdWJzZXQgb2YgYSBwYWNrYWdlIHRvIHJldHVybgomIzQzOyAqIEBNUF9OT0RFU19BTEw6ICAgICAgIEFsbCBOVU1BIG5vZGVzIHRoYXQgYmVsb25nIHRvIHRoZSBwYWNrYWdlLgomIzQzOyAqIEBNUF9OT0RFU19DUFU6ICAgICAgIE9ubHkgQ1BVIG5vZGVzIGluIHRoZSBwYWNrYWdlLgomIzQzOyAqIEBNUF9OT0RFU19NRU1fT05MWTogIE9ubHkgbWVtb3J5LW9ubHkgbm9kZXMgKGUuZy4gQ1hML0hCTSkgaW4gdGhlIHBhY2thZ2UuCiYjNDM7ICoKJiM0MzsgKiBVc2VkIGludGVybmFsbHkgdG8gY2hvb3NlIHdoaWNoIG5vZGVtYXNrIHRvIGV4cG9zZSBmb3IgYSBnaXZlbiBwYWNrYWdlLgomIzQzOyAqLwomIzQzO2VudW0gbXBfbm9kZXNfdHlwZSB7CiYjNDM7CU1QX05PREVTX0FMTCwKJiM0MzsJTVBfTk9ERVNfQ1BVLAomIzQzOwlNUF9OT0RFU19NRU1fT05MWQomIzQzO307CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogc3RydWN0IG1lbW9yeV9wYWNrYWdlIC0gUGVyLXBoeXNpY2FsLXBhY2thZ2UgY29udGFpbmVyCiYjNDM7ICogQHBhY2thZ2VfaWQ6ICAgICAgICAgIFBoeXNpY2FsIHBhY2thZ2UgaWQgKGZyb20gdG9wb2xvZ3kpLgomIzQzOyAqIEBub2RlczogICAgICAgICAgICAgICBOb2RlbWFzayBvZiBhbGwgbWVtYmVyIG5vZGVzIGluIHRoaXMgcGFja2FnZS4KJiM0MzsgKiBAY3B1X25vZGVzOiAgICAgICAgICAgTm9kZW1hc2sgb2YgQ1BVIG5vZGVzIGluIHRoaXMgcGFja2FnZS4KJiM0MzsgKiBAbWVtb3J5X29ubHlfbm9kZXM6ICAgTm9kZW1hc2sgb2YgbWVtb3J5LW9ubHkgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLgomIzQzOyAqIEBjcHVfbGlzdDogICAgICAgICAgICBMaXN0IGhlYWQgb2YgQ1BVLXR5cGUgbWVtYmVycy4KJiM0MzsgKiBAbWVtb3J5X29ubHlfbGlzdDogICAgTGlzdCBoZWFkIG9mIG1lbW9yeS1vbmx5IG1lbWJlcnMuCiYjNDM7ICogQGxpc3Q6ICAgICAgICAgICAgICAgIExpbmthZ2Ugb24gdGhlIGdsb2JhbCBAbWVtb3J5X3BhY2thZ2VzIGxpc3QuCiYjNDM7ICogQGRldjogICAgICAgICAgICAgICAgIHN5c2ZzIGRldmljZSBmb3IgdGhpcyBwYWNrYWdlLgomIzQzOyAqCiYjNDM7ICogQSBtZW1vcnlfcGFja2FnZSBncm91cHMgTlVNQSBub2RlcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHBoeXNpY2FsIENQVSBwYWNrYWdlLgomIzQzOyAqIFRoZSBtYXNrcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgcGFja2FnZS1sb2NhbCBwbGFjZW1lbnQvZGVtb3Rpb24vcHJvbW90aW9uLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtZW1vcnlfcGFja2FnZSB7CiYjNDM7CWludCBwYWNrYWdlX2lkOwomIzQzOwlub2RlbWFza190IG5vZGVzOwomIzQzOwlub2RlbWFza190IGNwdV9ub2RlczsKJiM0MzsJbm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlczsKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCBjcHVfbGlzdDsKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCBtZW1vcnlfb25seV9saXN0OwomIzQzOwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiYjNDM7CXN0cnVjdCBkZXZpY2UgZGV2OwomIzQzO307CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogZW51bSBtcG5fc291cmNlX2ZsYWdzIC0gU291cmNlIHVzZWQgdG8gcmVzb2x2ZSBhIG5vZGUmIzM5O3MgcGFja2FnZSBtZW1iZXJzaGlwCiYjNDM7ICogQE1QTl9TUkNfVU5LTk9XTjogICAgIFVua25vd24vdW5zcGVjaWZpZWQuCiYjNDM7ICogQE1QTl9TUkNfQ1BVOiAgICAgICAgIERpcmVjdGx5IHJlc29sdmVkIGZyb20gYSBDUFUgbm9kZSAoMToxKS4KJiM0MzsgKiBATVBOX1NSQ19JTklUSUFUT1I6ICAgUmVzb2x2ZWQgdmlhIGFuIGluaXRpYXRvciBDUFUgbm9kZSBwcm92aWRlZCBieSBhIGRyaXZlci4KJiM0MzsgKiBATVBOX1NSQ19TTElUOiAgICAgICAgUmVzb2x2ZWQgdmlhIFNMSVQvbmVhcmVzdC1ub2RlLgomIzQzOyAqCiYjNDM7ICogVGhlc2UgZmxhZ3MgYXJlIGluZm9ybWF0aW9uYWw7IHRoZXkgZGVzY3JpYmUgaG93IGEgZ2l2ZW4gbm9kZSB3YXMgYm91bmQgdG8KJiM0MzsgKiBpdHMgcGFja2FnZSBhbmQgaGVscCB3aXRoIHBvbGljeSBkZWNpc2lvbnMgbGF0ZXIuCiYjNDM7ICovCiYjNDM7ZW51bSBtcG5fc291cmNlX2ZsYWdzIHsKJiM0MzsJTVBOX1NSQ19VTktOT1dOCQk9IDAsCiYjNDM7CU1QTl9TUkNfQ1BVCQk9IEJJVCgxKSwKJiM0MzsJTVBOX1NSQ19JTklUSUFUT1IJPSBCSVQoMiksCiYjNDM7CU1QTl9TUkNfU0xJVAkJPSBCSVQoMykKJiM0Mzt9OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlIC0gUGVyLW5vZGUgbWVtYmVyc2hpcCBhbmQgcHJlZmVyZW5jZXMKJiM0MzsgKiBAbmlkOiAgICAgICAgICAgICAgTlVNQSBub2RlIGlkIGZvciB0aGlzIGVudHJ5LgomIzQzOyAqIEBpbml0aWF0b3JfbmlkOiAgICBDUFUgbmlkIHRoYXQgc2VydmVkIGFzIHRoZSBpbml0aWF0b3Igd2hlbiByZXNvbHZpbmcgQG5pZC4KJiM0MzsgKiBAcGFja2FnZV9pZDogICAgICAgUmVzb2x2ZWQgcGFja2FnZSBpZCB0aGF0IEBuaWQgYmVsb25ncyB0by4KJiM0MzsgKiBAc291cmNlX2ZsYWdzOiAgICAgT25lIG9mICZhbXA7ZW51bSBtcG5fc291cmNlX2ZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlc29sdXRpb24uCiYjNDM7ICogQHByZWZlcnJlZDogICAgICAgIE9wcG9zaXRlLXR5cGUgbmVhcmVzdCBjYW5kaWRhdGVzIGluc2lkZSB0aGUgc2FtZSBwYWNrYWdlLgomIzQzOyAqIEBwYWNrYWdlOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvd25pbmcgJmFtcDtzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKE5VTEwgdW50aWwgYm91bmQpLgomIzQzOyAqIEBwYWNrYWdlX2VudHJ5OiAgICBMaW5rYWdlIG9uIHRoZSBvd25pbmcgcGFja2FnZSYjMzk7cyB0eXBlIGxpc3QuCiYjNDM7ICoKJiM0MzsgKiBFYWNoIE5VTUEgbm9kZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBwYWNrYWdlLWF3YXJlIHBvbGljeSBnZXRzIGEgd3JhcHBlciBlbnRyeQomIzQzOyAqIHRoYXQgY2FjaGVzIHBhY2thZ2UgbWVtYmVyc2hpcCBhbmQgdGhlIHByZWNvbXB1dGVkIHNldCBvZiBwcmVmZXJyZWQgdGFyZ2V0cy4KJiM0MzsgKi8KJiM0MztzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSB7CiYjNDM7CWludCBuaWQ7CiYjNDM7CWludCBpbml0aWF0b3JfbmlkOwomIzQzOwlpbnQgcGFja2FnZV9pZDsKJiM0MzsJaW50IHNvdXJjZV9mbGFnczsKJiM0MzsJbm9kZW1hc2tfdCBwcmVmZXJyZWQ7CiYjNDM7CXN0cnVjdCBtZW1vcnlfcGFja2FnZSAqcGFja2FnZTsKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCBwYWNrYWdlX2VudHJ5OwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBub2RlX2lzX21lbW9yeV9vbmx5KF9uaWQpIFwKJiM0MzsJKG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgJmFtcDsmYW1wOyAhbm9kZV9zdGF0ZSgoX25pZCksIE5fQ1BVKSkKJiM0MzsKJiM0MztzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChtcF9wYWNrYWdlX2FsZ29yaXRobXMpOwomIzQzOwomIzQzO3N0YXRpYyBMSVNUX0hFQUQobWVtb3J5X3BhY2thZ2VzKTsKJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbnNbTUFYX05VTU5PREVTXTsKJiM0MztzdGF0aWMgREVGSU5FX01VVEVYKG1lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOy8qCiYjNDM7ICogUkNVIHNuYXBzaG90IG9mIHRoZSBwYWNrYWdlIHRvcG9sb2d5LiBUaGUgYWxsb2NhdGlvbiBwYXRoIHJlYWRzIGl0CiYjNDM7ICogb2Z0ZW4sIHNvIGl0IGlzIHB1Ymxpc2hlZCBmb3IgbG9ja2xlc3MgcmVhZHMgaW5zdGVhZCBvZiBsb2NraW5nIG9uCiYjNDM7ICogZXZlcnkgYWNjZXNzLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtcF9zbmFwc2hvdCB7CiYjNDM7CXN0cnVjdCByY3VfaGVhZCByY3U7CiYjNDM7CWludCBucl9wYWNrYWdlczsKJiM0MzsJaW50IHBrZ19vZltNQVhfTlVNTk9ERVNdOwomIzQzOwlzdHJ1Y3QgewomIzQzOwkJbm9kZW1hc2tfdCBub2RlczsKJiM0MzsJCW5vZGVtYXNrX3QgY3B1X25vZGVzOwomIzQzOwkJbm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlczsKJiM0MzsJfSBwa2dbXTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbXBfc25hcHNob3QgX19yY3UgKm1wX3NuYXBzaG90OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIgLSBSZWdpc3RlciBhIHBhY2thZ2UgcmVzb2x1dGlvbiBhbGdvcml0aG0KJiM0MzsgKiBAbm90aWZpZXI6IE5vdGlmaWVyIGNhbGxlZCB3aXRoIHRoZSBuaWQgdG8gcmVzb2x2ZSAoc2VlIG1wX3Byb2JlX3BhY2thZ2VfaWQoKSkuCiYjNDM7ICoKJiM0MzsgKiBEcml2ZXJzIChlLmcuLCBDWEwgcmVnaW9uL2RlY29kZXIgY29kZSkgcmVnaXN0ZXIgaGVyZSB0byBzdXBwbHkgYSBwYWNrYWdlCiYjNDM7ICogaGludCBmb3IgbmV3bHkgYXBwZWFyaW5nIG5vZGVzLiBUaGUgbm90aWZpZXIgaXMgaW52b2tlZCBkdXJpbmcgbmlkLSZndDtwYWNrYWdlCiYjNDM7ICogcmVzb2x1dGlvbi4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCiYjNDM7ewomIzQzOwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmFtcDttcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcik7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gVW5yZWdpc3RlciBhIHBhY2thZ2UgcmVzb2x1dGlvbiBhbGdvcml0aG0KJiM0MzsgKiBAbm90aWZpZXI6IE5vdGlmaWVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoKS4KJiM0MzsgKi8KJiM0Mzt2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKQomIzQzO3sKJiM0MzsJYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmYW1wO21wX3BhY2thZ2VfYWxnb3JpdGhtcywgbm90aWZpZXIpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX3Byb2JlX3BhY2thZ2VfaWQgLSBJbnZva2UgcmVnaXN0ZXJlZCBub3RpZmllcnMgdG8gcmVzb2x2ZSBhIG5vZGUmIzM5O3MgcGFja2FnZQomIzQzOyAqIEBuaWQ6IE5VTUEgbm9kZSBpZCB0byByZXNvbHZlLgomIzQzOyAqCiYjNDM7ICogQ2FsbHMgdGhlIGJsb2NraW5nIG5vdGlmaWVyIGNoYWluIHRvIGxldCBzdWJzeXN0ZW1zIHByb3ZpZGUgYW4gaW5pdGlhdG9yIG9yCiYjNDM7ICogcGFja2FnZSBpZCBmb3IgQG5pZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogTm90aWZpZXIgcmV0dXJuIGNvZGUgKCZndDs9MCB0eXBpY2FsbHkpOyBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO2ludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmYW1wO21wX3BhY2thZ2VfYWxnb3JpdGhtcywgbmlkLCBOVUxMKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfcHJvYmVfcGFja2FnZV9pZCk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CWludCBwYWNrYWdlX2lkOwomIzQzOwl1bnNpZ25lZCBpbnQgZmlyc3RfY3B1OwomIzQzOwljb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hc2s7CiYjNDM7CiYjNDM7CWlmIChuaWQgJmx0OyAwIHx8IG5pZCAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9DUFUpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CWNwdV9tYXNrID0gY3B1bWFza19vZl9ub2RlKG5pZCk7CiYjNDM7CWlmIChjcHVtYXNrX2VtcHR5KGNwdV9tYXNrKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlmaXJzdF9jcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9tYXNrKTsKJiM0MzsJaWYgKGZpcnN0X2NwdSAmZ3Q7PSBucl9jcHVfaWRzKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CXBhY2thZ2VfaWQgPSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGZpcnN0X2NwdSk7CiYjNDM7CWlmIChwYWNrYWdlX2lkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlyZXR1cm4gcGFja2FnZV9pZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0CiYjNDM7CSAqIG1lbW9yeS1vbmx5IG5vZGUocykgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UuIElmIHRoZSBwYWNrYWdlIGhhcwomIzQzOwkgKiBubyBtZW1vcnktb25seSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2Ugc28gY2FsbGVycwomIzQzOwkgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC4KJiM0MzsJICovCiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnkobXBuLCAmYW1wO21wLSZndDtjcHVfbGlzdCwgcGFja2FnZV9lbnRyeSkgewomIzQzOwkJbm9kZXNfY2xlYXIobXBuLSZndDtwcmVmZXJyZWQpOwomIzQzOwkJaWYgKCFub2Rlc19lbXB0eShtcC0mZ3Q7bWVtb3J5X29ubHlfbm9kZXMpKQomIzQzOwkJCW5lYXJlc3Rfbm9kZXNfbm9kZW1hc2sobXBuLSZndDtuaWQsICZhbXA7bXAtJmd0O21lbW9yeV9vbmx5X25vZGVzLAomIzQzOwkJCQkJICAgICAgICZhbXA7bXBuLSZndDtwcmVmZXJyZWQpOwomIzQzOwkJZWxzZQomIzQzOwkJCW5vZGVfc2V0KG1wbi0mZ3Q7bmlkLCBtcG4tJmd0O3ByZWZlcnJlZCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU3ltbWV0cmljYWxseSwgZm9yIGVhY2ggbWVtb3J5LW9ubHkgbm9kZSwgY29tcHV0ZSBpdHMgcHJlZmVycmVkIHNldAomIzQzOwkgKiBhcyB0aGUgbmVhcmVzdCBDUFUgbm9kZShzKSB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZS4gSWYgdGhlIHBhY2thZ2UKJiM0MzsJICogaGFzIG5vIENQVSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2UuCiYjNDM7CSAqLwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wbiwgJmFtcDttcC0mZ3Q7bWVtb3J5X29ubHlfbGlzdCwgcGFja2FnZV9lbnRyeSkgewomIzQzOwkJbm9kZXNfY2xlYXIobXBuLSZndDtwcmVmZXJyZWQpOwomIzQzOwkJaWYgKCFub2Rlc19lbXB0eShtcC0mZ3Q7Y3B1X25vZGVzKSkKJiM0MzsJCQluZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi0mZ3Q7bmlkLCAmYW1wO21wLSZndDtjcHVfbm9kZXMsCiYjNDM7CQkJCQkgICAgICAgJmFtcDttcG4tJmd0O3ByZWZlcnJlZCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbm9kZV9zZXQobXBuLSZndDtuaWQsIG1wbi0mZ3Q7cHJlZmVycmVkKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkoc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCkKJiM0Mzt7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIChub2Rlc19lbXB0eShtcC0mZ3Q7Y3B1X25vZGVzKSAmYW1wOyZhbXA7IG5vZGVzX2VtcHR5KG1wLSZndDttZW1vcnlfb25seV9ub2RlcykpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGFja2FnZV9ub2RlX2lzX3ZhbGlkKGludCBuaWQpCiYjNDM7ewomIzQzOwlpZiAoIW1wbnNbbmlkXSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKG5vZGVzX2VtcHR5KG1wbnNbbmlkXS0mZ3Q7cHJlZmVycmVkKSB8fCAobXBuc1tuaWRdLSZndDtwYWNrYWdlID09IE5VTEwpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1lbW9yeV9wYWNrYWdlX2dyb3Vwc1tdOwomIzQzOwomIzQzOy8qIEZyZWVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBwYWNrYWdlJiMzOTtzIHN5c2ZzIGRldmljZSBpcyBkcm9wcGVkLiAqLwomIzQzO3N0YXRpYyB2b2lkIG1lbW9yeV9wYWNrYWdlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1vcnlfcGFja2FnZSwgZGV2KTsKJiM0MzsKJiM0MzsJa2ZyZWUobXApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlICpjcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1lbXBhY2thZ2U7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW1lbXBhY2thZ2UgPSBremFsbG9jX29iaigqbWVtcGFja2FnZSk7CiYjNDM7CWlmICghbWVtcGFja2FnZSkKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwomIzQzOwomIzQzOwltZW1wYWNrYWdlLSZndDtwYWNrYWdlX2lkID0gcGFja2FnZV9pZDsKJiM0MzsJbWVtcGFja2FnZS0mZ3Q7bm9kZXMgPSBOT0RFX01BU0tfTk9ORTsKJiM0MzsJbWVtcGFja2FnZS0mZ3Q7Y3B1X25vZGVzID0gTk9ERV9NQVNLX05PTkU7CiYjNDM7CW1lbXBhY2thZ2UtJmd0O21lbW9yeV9vbmx5X25vZGVzID0gTk9ERV9NQVNLX05PTkU7CiYjNDM7CUlOSVRfTElTVF9IRUFEKCZhbXA7bWVtcGFja2FnZS0mZ3Q7Y3B1X2xpc3QpOwomIzQzOwlJTklUX0xJU1RfSEVBRCgmYW1wO21lbXBhY2thZ2UtJmd0O21lbW9yeV9vbmx5X2xpc3QpOwomIzQzOwlJTklUX0xJU1RfSEVBRCgmYW1wO21lbXBhY2thZ2UtJmd0O2xpc3QpOwomIzQzOwlkZXZpY2VfaW5pdGlhbGl6ZSgmYW1wO21lbXBhY2thZ2UtJmd0O2Rldik7CiYjNDM7CW1lbXBhY2thZ2UtJmd0O2Rldi5yZWxlYXNlID0gbWVtb3J5X3BhY2thZ2VfcmVsZWFzZTsKJiM0MzsJZGV2X3NldF9kcnZkYXRhKCZhbXA7bWVtcGFja2FnZS0mZ3Q7ZGV2LCBtZW1wYWNrYWdlKTsKJiM0MzsJbWVtcGFja2FnZS0mZ3Q7ZGV2LmJ1cyA9ICZhbXA7cGFja2FnZV9zdWJzeXM7CiYjNDM7CW1lbXBhY2thZ2UtJmd0O2Rldi5ncm91cHMgPSBtZW1vcnlfcGFja2FnZV9ncm91cHM7CiYjNDM7CXJldCA9IGRldl9zZXRfbmFtZSgmYW1wO21lbXBhY2thZ2UtJmd0O2RldiwgJiMzNDtwYWNrYWdlJWQmIzM0OywgcGFja2FnZV9pZCk7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCXB1dF9kZXZpY2UoJmFtcDttZW1wYWNrYWdlLSZndDtkZXYpOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gbWVtcGFja2FnZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1lbXBhY2thZ2UsICpleGlzdGluZzsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbXBhY2thZ2UsICZhbXA7bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7CiYjNDM7CQlpZiAobWVtcGFja2FnZS0mZ3Q7cGFja2FnZV9pZCA9PSBwYWNrYWdlX2lkKSB7CiYjNDM7CQkJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CQkJcmV0dXJuIG1lbXBhY2thZ2U7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW1lbXBhY2thZ2UgPSBjcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7CiYjNDM7CWlmIChJU19FUlIobWVtcGFja2FnZSkpCiYjNDM7CQlyZXR1cm4gbWVtcGFja2FnZTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV4aXN0aW5nLCAmYW1wO21lbW9yeV9wYWNrYWdlcywgbGlzdCkgewomIzQzOwkJaWYgKGV4aXN0aW5nLSZndDtwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHsKJiM0MzsJCQltdXRleF91bmxvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJCQlwdXRfZGV2aWNlKCZhbXA7bWVtcGFja2FnZS0mZ3Q7ZGV2KTsKJiM0MzsJCQlyZXR1cm4gZXhpc3Rpbmc7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJbGlzdF9hZGQoJmFtcDttZW1wYWNrYWdlLSZndDtsaXN0LCAmYW1wO21lbW9yeV9wYWNrYWdlcyk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlyZXQgPSBkZXZpY2VfYWRkKCZhbXA7bWVtcGFja2FnZS0mZ3Q7ZGV2KTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJbXV0ZXhfbG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwkJbGlzdF9kZWwoJmFtcDttZW1wYWNrYWdlLSZndDtsaXN0KTsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwkJcHV0X2RldmljZSgmYW1wO21lbXBhY2thZ2UtJmd0O2Rldik7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUihyZXQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBtZW1wYWNrYWdlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBtcF9zbmFwc2hvdF9yZWJ1aWxkKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbXBfc25hcHNob3QgKm5ldywgKm9sZDsKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDsKJiM0MzsJaW50IG5yID0gMCwgaSA9IDAsIG5pZDsKJiM0MzsKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCAmYW1wO21lbW9yeV9wYWNrYWdlcywgbGlzdCkKJiM0MzsJCW5yJiM0MzsmIzQzOzsKJiM0MzsKJiM0MzsJbmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghbmV3KQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwltZW1zZXQobmV3LSZndDtwa2dfb2YsIDB4ZmYsIHNpemVvZihuZXctJmd0O3BrZ19vZikpOwomIzQzOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCAmYW1wO21lbW9yeV9wYWNrYWdlcywgbGlzdCkgewomIzQzOwkJbmV3LSZndDtwa2dbaV0ubm9kZXMgPSBtcC0mZ3Q7bm9kZXM7CiYjNDM7CQluZXctJmd0O3BrZ1tpXS5jcHVfbm9kZXMgPSBtcC0mZ3Q7Y3B1X25vZGVzOwomIzQzOwkJbmV3LSZndDtwa2dbaV0ubWVtb3J5X29ubHlfbm9kZXMgPSBtcC0mZ3Q7bWVtb3J5X29ubHlfbm9kZXM7CiYjNDM7CQlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBtcC0mZ3Q7bm9kZXMpCiYjNDM7CQkJbmV3LSZndDtwa2dfb2ZbbmlkXSA9IGk7CiYjNDM7CQlpJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwluZXctJmd0O25yX3BhY2thZ2VzID0gbnI7CiYjNDM7CiYjNDM7CW9sZCA9IHJjdV9yZXBsYWNlX3BvaW50ZXIobXBfc25hcHNob3QsIG5ldywKJiM0MzsJCQkJICBsb2NrZGVwX2lzX2hlbGQoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKSk7CiYjNDM7CWlmIChvbGQpCiYjNDM7CQlrdmZyZWVfcmN1KG9sZCwgcmN1KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBiaW5kX25vZGVfdG9fcGFja2FnZShpbnQgbmlkKQomIzQzO3sKJiM0MzsJaW50IHBhY2thZ2VfaWQsIHBrZ19pZDsKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDsKJiM0MzsJbm9kZW1hc2tfdCBub2RlcywgY3B1LCBtZW07CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJaWYgKCFtcG5zW25pZF0pIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsJcGFja2FnZV9pZCA9IG1wbnNbbmlkXS0mZ3Q7cGFja2FnZV9pZDsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW1wID0gZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7CiYjNDM7CWlmIChJU19FUlIobXApKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIobXApOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CWlmICghbXBuc1tuaWRdKSB7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CW1wbnNbbmlkXS0mZ3Q7cGFja2FnZSA9IG1wOwomIzQzOwlub2RlX3NldChtcG5zW25pZF0tJmd0O25pZCwgbXAtJmd0O25vZGVzKTsKJiM0MzsJaWYgKG5vZGVfaXNfbWVtb3J5X29ubHkobXBuc1tuaWRdLSZndDtuaWQpKSB7CiYjNDM7CQlub2RlX3NldChtcG5zW25pZF0tJmd0O25pZCwgbXAtJmd0O21lbW9yeV9vbmx5X25vZGVzKTsKJiM0MzsJCWxpc3RfYWRkKCZhbXA7bXBuc1tuaWRdLSZndDtwYWNrYWdlX2VudHJ5LCAmYW1wO21wLSZndDttZW1vcnlfb25seV9saXN0KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW5vZGVfc2V0KG1wbnNbbmlkXS0mZ3Q7bmlkLCBtcC0mZ3Q7Y3B1X25vZGVzKTsKJiM0MzsJCWxpc3RfYWRkKCZhbXA7bXBuc1tuaWRdLSZndDtwYWNrYWdlX2VudHJ5LCAmYW1wO21wLSZndDtjcHVfbGlzdCk7CiYjNDM7CX0KJiM0MzsJdXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKG1wKTsKJiM0MzsJbXBfc25hcHNob3RfcmVidWlsZCgpOwomIzQzOwlwa2dfaWQgPSBtcC0mZ3Q7cGFja2FnZV9pZDsKJiM0MzsJbm9kZXMgPSBtcC0mZ3Q7bm9kZXM7CiYjNDM7CWNwdSA9IG1wLSZndDtjcHVfbm9kZXM7CiYjNDM7CW1lbSA9IG1wLSZndDttZW1vcnlfb25seV9ub2RlczsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CXByX2luZm8oJiMzNDttZW1vcnlfcGFja2FnZSAlZDogbm9kZXM9JSpwYmwgY3B1PSUqcGJsIG1lbW9yeV9vbmx5PSUqcGJsXG4mIzM0OywKJiM0MzsJCXBrZ19pZCwgbm9kZW1hc2tfcHJfYXJncygmYW1wO25vZGVzKSwKJiM0MzsJCW5vZGVtYXNrX3ByX2FyZ3MoJmFtcDtjcHUpLCBub2RlbWFza19wcl9hcmdzKCZhbXA7bWVtKSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB1bmJpbmRfbm9kZV90b19wYWNrYWdlKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsIGludCBuaWQpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW5vZGVfY2xlYXIobmlkLCBtcC0mZ3Q7bm9kZXMpOwomIzQzOwlpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSkKJiM0MzsJCW5vZGVfY2xlYXIobmlkLCBtcC0mZ3Q7Y3B1X25vZGVzKTsKJiM0MzsJZWxzZQomIzQzOwkJbm9kZV9jbGVhcihuaWQsIG1wLSZndDttZW1vcnlfb25seV9ub2Rlcyk7CiYjNDM7CiYjNDM7CWlmIChtcG5zW25pZF0pCiYjNDM7CQlsaXN0X2RlbCgmYW1wO21wbnNbbmlkXS0mZ3Q7cGFja2FnZV9lbnRyeSk7CiYjNDM7CiYjNDM7CXVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChtcCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqY3JlYXRlX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCkKJiM0Mzt7CiYjNDM7CWludCBjcHVfbmlkLCBwYWNrYWdlX2lkOwomIzQzOwlpbnQgc291cmNlX2ZsYWdzOwomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuOwomIzQzOwomIzQzOwlpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSkgewomIzQzOwkJY3B1X25pZCA9IG5pZDsKJiM0MzsJCXNvdXJjZV9mbGFncyA9IE1QTl9TUkNfQ1BVOwomIzQzOwl9IGVsc2UgewomIzQzOwkJaWYgKGluaXRpYXRvcl9uaWQgJmd0Oz0gMCkgewomIzQzOwkJCWNwdV9uaWQgPSBpbml0aWF0b3JfbmlkOwomIzQzOwkJCXNvdXJjZV9mbGFncyA9IE1QTl9TUkNfSU5JVElBVE9SOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIE5vIGRyaXZlci1zdXBwbGllZCBpbml0aWF0b3I6IGZhbGwgYmFjayB0byB0aGUKJiM0MzsJCQkgKiBuZWFyZXN0IENQVSBub2RlICh2aWEgU0xJVC9udW1hX2Rpc3RhbmNlKS4KJiM0MzsJCQkgKi8KJiM0MzsJCQljcHVfbmlkID0gbnVtYV9uZWFyZXN0X25vZGUobmlkLCBOX0NQVSk7CiYjNDM7CQkJc291cmNlX2ZsYWdzID0gTVBOX1NSQ19TTElUOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXBhY2thZ2VfaWQgPSBtcF9ub2RlX3RvX3BhY2thZ2VfaWQoY3B1X25pZCk7CiYjNDM7CWlmIChwYWNrYWdlX2lkICZsdDsgMCkKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwomIzQzOwomIzQzOwltcG4gPSBremFsbG9jX29iaigqbXBuKTsKJiM0MzsJaWYgKCFtcG4pCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsKJiM0MzsJbXBuLSZndDtuaWQgPSBuaWQ7CiYjNDM7CW1wbi0mZ3Q7aW5pdGlhdG9yX25pZCA9IGNwdV9uaWQ7CiYjNDM7CW1wbi0mZ3Q7cGFja2FnZV9pZCA9IHBhY2thZ2VfaWQ7CiYjNDM7CW1wbi0mZ3Q7c291cmNlX2ZsYWdzID0gc291cmNlX2ZsYWdzOwomIzQzOwltcG4tJmd0O3ByZWZlcnJlZCA9IE5PREVfTUFTS19OT05FOwomIzQzOwltcG4tJmd0O3BhY2thZ2UgPSBOVUxMOwomIzQzOwlJTklUX0xJU1RfSEVBRCgmYW1wO21wbi0mZ3Q7cGFja2FnZV9lbnRyeSk7CiYjNDM7CiYjNDM7CXJldHVybiBtcG47CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVG9wb2xvZ3kgc3ltbWV0cnkgc3RhdHVzCiYjNDM7ICogSW5kaWNhdGVzIHdoZXRoZXIgYWxsIHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsIG5vZGUgc3RydWN0dXJlCiYjNDM7ICogKHNhbWUgbnVtYmVyIG9mIENQVSBub2RlcyBhbmQgbWVtb3J5LW9ubHkgbm9kZXMpLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIHRvcG9sb2d5X3N5bW1ldHJpYzsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSh2b2lkKTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlICpfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuOwomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCAqdW5yZWdfbXAgPSBOVUxMOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CW1wbiA9IG1wbnNbbmlkXTsKJiM0MzsJaWYgKCFtcG4pCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJbXAgPSBtcG4tJmd0O3BhY2thZ2U7CiYjNDM7CWlmIChtcCkgewomIzQzOwkJdW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTsKJiM0MzsJCW1wbi0mZ3Q7cGFja2FnZSA9IE5VTEw7CiYjNDM7CiYjNDM7CQlpZiAobWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkobXApKSB7CiYjNDM7CQkJbGlzdF9kZWwoJmFtcDttcC0mZ3Q7bGlzdCk7CiYjNDM7CQkJdW5yZWdfbXAgPSBtcDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwltcG5zW25pZF0gPSBOVUxMOwomIzQzOwlrZnJlZShtcG4pOwomIzQzOwltcF9zbmFwc2hvdF9yZWJ1aWxkKCk7CiYjNDM7CiYjNDM7CXJldHVybiB1bnJlZ19tcDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZGVzdHJveV9wYWNrYWdlX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1vcnlfcGFja2FnZSAqdW5yZWdfbXA7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJdW5yZWdfbXAgPSBfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlpZiAodW5yZWdfbXApCiYjNDM7CQlkZXZpY2VfdW5yZWdpc3RlcigmYW1wO3VucmVnX21wLSZndDtkZXYpOwomIzQzOwomIzQzOwl2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGZpbmRfcGFja2FnZV9ub2RlKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcCA9IE5VTEw7CiYjNDM7CWludCByZXQgPSBuaWQ7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJaWYgKCFtcG5zW25pZF0pIHsKJiM0MzsJCXJldCA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJfSBlbHNlIGlmIChtcG5zW25pZF0tJmd0O3NvdXJjZV9mbGFncyA9PSBNUE5fU1JDX1NMSVQgJmFtcDsmYW1wOyBpbml0aWF0b3JfbmlkICZndDs9IDApIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBTTElULWRlcml2ZWQgZW50cmllcyBhcmUgcHJvdmlzaW9uYWw7IGlmIGEgZHJpdmVyIGxhdGVyCiYjNDM7CQkgKiBwcm92aWRlcyBhbiBleHBsaWNpdCBpbml0aWF0b3IsIGRyb3AgdGhlIHByb3Zpc2lvbmFsCiYjNDM7CQkgKiBlbnRyeSBhbmQgcmVidWlsZCB3aXRoIHRoZSBzdHJvbmdlciBoaW50LgomIzQzOwkJICovCiYjNDM7CQl1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTsKJiM0MzsJCXJldCA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsKJiM0MzsJaWYgKHVucmVnX21wKQomIzQzOwkJZGV2aWNlX3VucmVnaXN0ZXIoJmFtcDt1bnJlZ19tcC0mZ3Q7ZGV2KTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpCiYjNDM7ewomIzQzOwlpbnQgbXBuX25pZDsKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjsKJiM0MzsKJiM0MzsJbXBuX25pZCA9IGZpbmRfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7CiYjNDM7CWlmIChtcG5fbmlkICE9IE5VTUFfTk9fTk9ERSkKJiM0MzsJCXJldHVybiBtcG5fbmlkOwomIzQzOwomIzQzOwltcG4gPSBjcmVhdGVfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7CiYjNDM7CWlmIChJU19FUlIobXBuKSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKG1wbik7CiYjNDM7CiYjNDM7CWd1YXJkKG11dGV4KSgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlpZiAobXBuc1tuaWRdKSB7CiYjNDM7CQlrZnJlZShtcG4pOwomIzQzOwkJcmV0dXJuIG5pZDsKJiM0MzsJfQomIzQzOwltcG5zW25pZF0gPSBtcG47CiYjNDM7CiYjNDM7CXJldHVybiBuaWQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBOVU1BX05PX05PREUpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJpbmRfbm9kZV90b19wYWNrYWdlKG5pZCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwl2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IgLSBBZGQgYSBub2RlIHdpdGggYW4gaW5pdGlhdG9yCiYjNDM7ICogQG5pZDogICAgICAgICAgICBUYXJnZXQgTlVNQSBub2RlIHRvIGFkZC4KJiM0MzsgKiBAaW5pdGlhdG9yX25pZDogIENQVSBuaWQgdXNlZCB0byByZXNvbHZlIEBuaWQmIzM5O3MgcGFja2FnZSAoJmd0Oz0wKS4KJiM0MzsgKgomIzQzOyAqIEVuc3VyZXMgdGhhdCBhICZhbXA7c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgZXhpc3RzIGZvciBAbmlkIGFuZCB0aGF0IGl0cwomIzQzOyAqIHBhY2thZ2VfaWQgaXMgZGV0ZXJtaW5lZCB1c2luZyBAaW5pdGlhdG9yX25pZCB3aGVuIHByb3ZpZGVkLiBCaW5kaW5nIHRvIHRoZQomIzQzOyAqIHBhY2thZ2UgaXMgbm90IHBlcmZvcm1lZCBoZXJlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gZmluZF9jcmVhdGVfcGFja2FnZV9ub2RlKG5pZCwgaW5pdGlhdG9yX25pZCk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBtcF9hZGRfcGFja2FnZV9ub2RlIC0gQWRkIGEgbm9kZSwgcmVzb2x2aW5nIHBhY2thZ2UgYXV0b21hdGljYWxseQomIzQzOyAqIEBuaWQ6IFRhcmdldCBOVU1BIG5vZGUgdG8gYWRkLgomIzQzOyAqCiYjNDM7ICogV3JhcHBlciBvdmVyIG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKCkgdGhhdCByZXF1ZXN0cyBhdXRvbWF0aWMKJiM0MzsgKiBpbml0aWF0b3IgcmVzb2x1dGlvbiAoZS5nLiwgbmVhcmVzdCBDUFUpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7aW50IG1wX2FkZF9wYWNrYWdlX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGUpOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLAomIzQzOwkJCQkgICAgIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtcF9zbmFwc2hvdCAqc25hcDsKJiM0MzsJaW50IHBrZzsKJiM0MzsKJiM0MzsJaWYgKCFvdXQpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CiYjNDM7CWlmIChuaWQgJmx0OyAwIHx8IG5pZCAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJZ3VhcmQocmN1KSgpOwomIzQzOwomIzQzOwlzbmFwID0gcmN1X2RlcmVmZXJlbmNlKG1wX3NuYXBzaG90KTsKJiM0MzsJaWYgKCFzbmFwKQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CXBrZyA9IHNuYXAtJmd0O3BrZ19vZltuaWRdOwomIzQzOwlpZiAocGtnICZsdDsgMCkKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwomIzQzOwlzd2l0Y2ggKG5vZGVfdHlwZSkgewomIzQzOwljYXNlIE1QX05PREVTX0FMTDoKJiM0MzsJCW5vZGVzX2NvcHkoKm91dCwgc25hcC0mZ3Q7cGtnW3BrZ10ubm9kZXMpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTVBfTk9ERVNfQ1BVOgomIzQzOwkJbm9kZXNfY29weSgqb3V0LCBzbmFwLSZndDtwa2dbcGtnXS5jcHVfbm9kZXMpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTVBfTk9ERVNfTUVNX09OTFk6CiYjNDM7CQlub2Rlc19jb3B5KCpvdXQsIHNuYXAtJmd0O3BrZ1twa2ddLm1lbW9yeV9vbmx5X25vZGVzKTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT04KJiM0MztzdGF0aWMgaW50IF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLAomIzQzOwkJCQkgICAgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJaW50IHJldCA9IDA7CiYjNDM7CiYjNDM7CS8qIE5vIGhvdC1wYXRoIGNhbGxlcnM6IHRoZSBtdXRleCBpcyBmaW5lIGhlcmUuICovCiYjNDM7CWd1YXJkKG11dGV4KSgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwomIzQzOwlpZiAoIW91dCkgewomIzQzOwkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5vZGVzX2NsZWFyKCpvdXQpOwomIzQzOwomIzQzOwlpZiAobmlkICZsdDsgMCB8fCBuaWQgJmd0Oz0gTUFYX05VTU5PREVTKSB7CiYjNDM7CQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG5vZGVfdHlwZSA9PSBNUF9OT0RFU19DUFUpIHsKJiM0MzsJCWlmIChub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHsKJiM0MzsJCQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwl9IGVsc2UgaWYgKG5vZGVfdHlwZSA9PSBNUF9OT0RFU19NRU1fT05MWSkgewomIzQzOwkJaWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHsKJiM0MzsJCQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHsKJiM0MzsJCXJldCA9IC1FTk9FTlQ7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlub2Rlc19jb3B5KCpvdXQsIG1wbnNbbmlkXS0mZ3Q7cHJlZmVycmVkKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sgLSBEZW1vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2UKJiM0MzsgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLgomIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayBvZiBuZWFyZXN0IG1lbW9yeS1vbmx5IHRhcmdldHMgaW4gdGhlIHNhbWUgcGFja2FnZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLgomIzQzOyAqLwomIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2spOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZSAtIFBpY2sgb25lIGRlbW90aW9uIHRhcmdldAomIzQzOyAqIEBuaWQ6IENQVSBub2RlIGZyb20gd2hpY2ggbWVtb3J5IHdvdWxkIGJlIGRlbW90ZWQuCiYjNDM7ICoKJiM0MzsgKiBQaWNrcyBvbmUgdGFyZ2V0IChyYW5kb20gYW1vbmcgdGhlIG5lYXJlc3QpIGZyb20gbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzaygpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0YXJnZXQgbmlkIG9uIHN1Y2Nlc3MsIG9yIE5VTUFfTk9fTk9ERSBpZiBubyBjYW5kaWRhdGUgaXMgYXZhaWxhYmxlLgomIzQzOyAqLwomIzQzO2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CWludCB0YXJnZXRfbmlkOwomIzQzOwlub2RlbWFza190IHRhcmdldF9ub2RlbWFzazsKJiM0MzsKJiM0MzsJaWYgKG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sobmlkLCAmYW1wO3RhcmdldF9ub2RlbWFzaykpCiYjNDM7CQlyZXR1cm4gTlVNQV9OT19OT0RFOwomIzQzOwlpZiAobm9kZXNfZW1wdHkodGFyZ2V0X25vZGVtYXNrKSkKJiM0MzsJCXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7CiYjNDM7CXRhcmdldF9uaWQgPSBub2RlX3JhbmRvbSgmYW1wO3RhcmdldF9ub2RlbWFzayk7CiYjNDM7CiYjNDM7CXJldHVybiB0YXJnZXRfbmlkOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X2RlbW90aW9uX25vZGUpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrIC0gUHJvbW90aW9uIGNhbmRpZGF0ZXMgd2l0aGluIGEgcGFja2FnZQomIzQzOyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG93YXJkcyB3aGljaCBwcm9tb3Rpb24gc2Vla3MgQ1BVIGxvY2FsaXR5LgomIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayBvZiBuZWFyZXN0IENQVSB0YXJnZXRzIGluIHRoZSBzYW1lIHBhY2thZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC4KJiM0MzsgKi8KJiM0MztpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhuaWQsIE1QX05PREVTX01FTV9PTkxZLCBvdXQpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogbXBfbmV4dF9wcm9tb3Rpb25fbm9kZSAtIFBpY2sgb25lIHByb21vdGlvbiB0YXJnZXQKJiM0MzsgKiBAbmlkOiBNZW1vcnktb25seSBub2RlIHRvIGJlIHByb21vdGVkIHRvd2FyZHMgQ1BVcy4KJiM0MzsgKgomIzQzOyAqIFBpY2tzIG9uZSB0YXJnZXQgKHJhbmRvbSBhbW9uZyB0aGUgbmVhcmVzdCkgZnJvbSBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzaygpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0YXJnZXQgbmlkIG9uIHN1Y2Nlc3MsIG9yIE5VTUFfTk9fTk9ERSBpZiBubyBjYW5kaWRhdGUgaXMgYXZhaWxhYmxlLgomIzQzOyAqLwomIzQzO2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlpbnQgdGFyZ2V0X25pZDsKJiM0MzsJbm9kZW1hc2tfdCB0YXJnZXRfbm9kZW1hc2s7CiYjNDM7CiYjNDM7CWlmIChtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhuaWQsICZhbXA7dGFyZ2V0X25vZGVtYXNrKSkKJiM0MzsJCXJldHVybiBOVU1BX05PX05PREU7CiYjNDM7CWlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKQomIzQzOwkJcmV0dXJuIE5VTUFfTk9fTk9ERTsKJiM0MzsKJiM0MzsJdGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKCZhbXA7dGFyZ2V0X25vZGVtYXNrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHRhcmdldF9uaWQ7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfcHJvbW90aW9uX25vZGUpOwomIzQzOyNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi8KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBtcF9nZXRfcGFja2FnZV9ub2RlcyAtIFJldHVybiBhbGwgbWVtYmVycyBvZiBAbmlkJiMzOTtzIHBhY2thZ2UKJiM0MzsgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLgomIzQzOyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIGFsbCBtZW1iZXJzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuCiYjNDM7ICovCiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQUxMLCBvdXQpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9nZXRfcGFja2FnZV9ub2Rlcyk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzIC0gUmV0dXJuIENQVSBtZW1iZXJzIG9mIEBuaWQmIzM5O3MgcGFja2FnZQomIzQzOyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuCiYjNDM7ICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgQ1BVIG1lbWJlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC4KJiM0MzsgKi8KJiM0MztpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQ1BVLCBvdXQpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzIC0gUmV0dXJuIG1lbW9yeS1vbmx5IG1lbWJlcnMgb2YgQG5pZCYjMzk7cyBwYWNrYWdlCiYjNDM7ICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS4KJiM0MzsgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBtZW1vcnktb25seSBtZW1iZXJzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuCiYjNDM7ICovCiYjNDM7aW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9fbWVtaW5pdCBtcF9ob3RwbHVnX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqX2FyZykKJiM0Mzt7CiYjNDM7CWludCBuaWQ7CiYjNDM7CXN0cnVjdCBub2RlX25vdGlmeSAqbm4gPSBfYXJnOwomIzQzOwomIzQzOwluaWQgPSBubi0mZ3Q7bmlkOwomIzQzOwlpZiAobmlkICZsdDsgMCkKJiM0MzsJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKDApOwomIzQzOwomIzQzOwlzd2l0Y2ggKGFjdGlvbikgewomIzQzOwljYXNlIE5PREVfUkVNT1ZFRF9MQVNUX01FTU9SWToKJiM0MzsJCWRlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7CiYjNDM7CQlicmVhazsKJiM0MzsKJiM0MzsJY2FzZSBOT0RFX0FEREVEX0ZJUlNUX01FTU9SWToKJiM0MzsJCWNyZWF0ZV9ub2RlX3dpdGhfcGFja2FnZShuaWQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIG1lbW9yeV9wYWNrYWdlIHRvcG9sb2d5CiYjNDM7ICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6CiYjNDM7ICogICAtIHBhY2thZ2Vfbm9kZXM6ICAgICAgIEFsbCBOVU1BIG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKQomIzQzOyAqICAgLSBwYWNrYWdlX2NwdV9ub2RlczogICBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlIChub2RlIG1hc2spCiYjNDM7ICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKQomIzQzOyAqICAgLSBwaHlzaWNhbF9wYWNrYWdlX2lkOiBQaHlzaWNhbCBwYWNrYWdlIElECiYjNDM7ICovCiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGFja2FnZV9ub2Rlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKJiM0MzsJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwomIzQzOwomIzQzOwlndWFyZChtdXRleCkoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAmIzM0OyUqcGJsXG4mIzM0Oywgbm9kZW1hc2tfcHJfYXJncygmYW1wO21wLSZndDtub2RlcykpOwomIzQzO30KJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9ub2Rlcyk7CiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGFja2FnZV9jcHVfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiYjNDM7CiYjNDM7CWd1YXJkKG11dGV4KSgmYW1wO21lbW9yeV9wYWNrYWdlX2xvY2spOwomIzQzOwlyZXR1cm4gc3lzZnNfZW1pdChidWYsICYjMzQ7JSpwYmxcbiYjMzQ7LCBub2RlbWFza19wcl9hcmdzKCZhbXA7bXAtJmd0O2NwdV9ub2RlcykpOwomIzQzO30KJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9jcHVfbm9kZXMpOwomIzQzOwomIzQzO3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbWVtX29ubHlfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiYjNDM7CQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwomIzQzOwomIzQzOwlndWFyZChtdXRleCkoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsJcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAmIzM0OyUqcGJsXG4mIzM0Oywgbm9kZW1hc2tfcHJfYXJncygmYW1wO21wLSZndDttZW1vcnlfb25seV9ub2RlcykpOwomIzQzO30KJiM0MztzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9tZW1fb25seV9ub2Rlcyk7CiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGh5c2ljYWxfcGFja2FnZV9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKJiM0MzsJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiYjNDM7CiYjNDM7CXJldHVybiBzeXNmc19lbWl0KGJ1ZiwgJiMzNDslZFxuJiMzNDssIG1wLSZndDtwYWNrYWdlX2lkKTsKJiM0Mzt9CiYjNDM7c3RhdGljIERFVklDRV9BVFRSX1JPKHBoeXNpY2FsX3BhY2thZ2VfaWQpOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptZW1vcnlfcGFja2FnZV9hdHRyc1tdID0gewomIzQzOwkmYW1wO2Rldl9hdHRyX3BhY2thZ2Vfbm9kZXMuYXR0ciwKJiM0MzsJJmFtcDtkZXZfYXR0cl9wYWNrYWdlX2NwdV9ub2Rlcy5hdHRyLAomIzQzOwkmYW1wO2Rldl9hdHRyX3BhY2thZ2VfbWVtX29ubHlfbm9kZXMuYXR0ciwKJiM0MzsJJmFtcDtkZXZfYXR0cl9waHlzaWNhbF9wYWNrYWdlX2lkLmF0dHIsCiYjNDM7CU5VTEwsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtZW1vcnlfcGFja2FnZV9ncm91cCA9IHsKJiM0MzsJLmF0dHJzID0gbWVtb3J5X3BhY2thZ2VfYXR0cnMsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW10gPSB7CiYjNDM7CSZhbXA7bWVtb3J5X3BhY2thZ2VfZ3JvdXAsCiYjNDM7CU5VTEwsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyKCZhbXA7cGFja2FnZV9zdWJzeXMsIE5VTEwpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDttZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcbiYjMzQ7LCByZXQpOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7Y29yZV9pbml0Y2FsbChtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMgLSBDaGVjayBpZiBhbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgbm9kZSBzdHJ1Y3R1cmUKJiM0MzsgKgomIzQzOyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIENQVSBub2RlcwomIzQzOyAqIGFuZCBtZW1vcnktb25seSBub2RlcywgaW5kaWNhdGluZyBhIHN5bW1ldHJpYyB0b3BvbG9neS4KJiM0MzsgKgomIzQzOyAqIFRoZSB0b3BvbG9neV9zeW1tZXRyaWMgdmFyaWFibGUgaXMgcHJvdGVjdGVkIGJ5IG1lbW9yeV9wYWNrYWdlX2xvY2sgZm9yCiYjNDM7ICogd3JpdGVzIChpbiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSkuCiYjNDM7ICovCiYjNDM7Ym9vbCBtcF9pc190b3BvbG9neV9zeW1tZXRyaWModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBSRUFEX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKTsKJiM0MzsKJiM0MzsvKiBXYWxrIHRoZSBwYWNrYWdlIGxpc3QgYW5kIGNvbXBhcmUgbm9kZSBjb3VudHM7IHRoZSBjYWxsZXIgaG9sZHMgdGhlIGxvY2suICovCiYjNDM7c3RhdGljIGJvb2wgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDsKJiM0MzsJaW50IHJlZl9jcHVfbm9kZV9jb3VudCA9IDAsIHJlZl9tZW1vcnlfb25seV9ub2RlX2NvdW50ID0gMDsKJiM0MzsJaW50IHBhY2thZ2VfY291bnQgPSAwOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7bWVtb3J5X3BhY2thZ2VfbG9jayk7CiYjNDM7CiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnkobXAsICZhbXA7bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7CiYjNDM7CQlpbnQgY3B1X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtJmd0O2NwdV9ub2Rlcyk7CiYjNDM7CQlpbnQgbWVtb3J5X29ubHlfbm9kZV9jb3VudCA9IG5vZGVzX3dlaWdodChtcC0mZ3Q7bWVtb3J5X29ubHlfbm9kZXMpOwomIzQzOwkJaW50IHRvdGFsX25vZGVfY291bnQgPSBjcHVfbm9kZV9jb3VudCAmIzQzOyBtZW1vcnlfb25seV9ub2RlX2NvdW50OwomIzQzOwomIzQzOwkJcGFja2FnZV9jb3VudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQkvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi8KJiM0MzsJCWlmICh0b3RhbF9ub2RlX2NvdW50ICZsdDsgMikKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlpZiAocGFja2FnZV9jb3VudCA9PSAxKSB7CiYjNDM7CQkJcmVmX2NwdV9ub2RlX2NvdW50ID0gY3B1X25vZGVfY291bnQ7CiYjNDM7CQkJcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSBtZW1vcnlfb25seV9ub2RlX2NvdW50OwomIzQzOwkJfSBlbHNlIGlmIChjcHVfbm9kZV9jb3VudCAhPSByZWZfY3B1X25vZGVfY291bnQgfHwKJiM0MzsJCQkgICBtZW1vcnlfb25seV9ub2RlX2NvdW50ICE9IHJlZl9tZW1vcnlfb25seV9ub2RlX2NvdW50KSB7CiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwYWNrYWdlX2NvdW50ICZsdDsgMikKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5IC0gVmFsaWRhdGUgdG9wb2xvZ3kgZm9yIHBhY2thZ2UtYXdhcmUgZmVhdHVyZXMKJiM0MzsgKgomIzQzOyAqIFZhbGlkYXRlcyB0b3BvbG9neSBzeW1tZXRyeSBieSBjaGVja2luZyBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsCiYjNDM7ICogbm9kZSBzdHJ1Y3R1cmUuIFVwZGF0ZXMgdGhlIGdsb2JhbCB0b3BvbG9neV9zeW1tZXRyaWMgdmFyaWFibGUuCiYjNDM7ICoKJiM0MzsgKiBUb3BvbG9neSBpcyB2YWxpZCBvbmx5IHdoZW4gYWxsIGNvbmRpdGlvbnMgYXJlIG1ldDoKJiM0MzsgKiAxLiBBdCBsZWFzdCAyIHBhY2thZ2VzIGV4aXN0IChtdWx0aS1wYWNrYWdlIHN5c3RlbSkKJiM0MzsgKiAyLiBBbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgY3B1X25vZGUgYW5kIG1lbW9yeV9vbmx5X25vZGUgY291bnRzCiYjNDM7ICogMy4gRWFjaCBwYWNrYWdlIGhhcyBhdCBsZWFzdCAyIHRvdGFsIG5vZGVzIChjcHVfbm9kZSAmIzQzOyBtZW1vcnlfb25seV9ub2RlICZndDs9IDIpCiYjNDM7ICoKJiM0MzsgKiBWYWxpZCBjb25maWd1cmF0aW9ucyBwZXIgcGFja2FnZToKJiM0MzsgKiAtIDEgY3B1X25vZGUgJiM0MzsgMSBtZW1vcnlfb25seV9ub2RlID0gMiBub2RlcyAodmFsaWQpCiYjNDM7ICogLSAyIGNwdV9ub2RlcyAmIzQzOyAwIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZCkKJiM0MzsgKiAtIDAgY3B1X25vZGUgJiM0MzsgMiBtZW1vcnlfb25seV9ub2RlcyA9IDIgbm9kZXMgKHZhbGlkKQomIzQzOyAqIC0gMSBjcHVfbm9kZSAmIzQzOyAwIG1lbW9yeV9vbmx5X25vZGUgPSAxIG5vZGUgKGludmFsaWQgLSBzaW5nbGUgbm9kZSBwYWNrYWdlKQomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KHZvaWQpCiYjNDM7ewomIzQzOwlndWFyZChtdXRleCkoJmFtcDttZW1vcnlfcGFja2FnZV9sb2NrKTsKJiM0MzsKJiM0MzsJV1JJVEVfT05DRSh0b3BvbG9neV9zeW1tZXRyaWMsIF9fY2hlY2tfdG9wb2xvZ3lfc3ltbWV0cnkoKSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IG1lbW9yeV9wYWNrYWdlX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAwLCBuaWQ7CiYjNDM7CiYjNDM7CWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewomIzQzOwkJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJcmV0ID0gY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWhvdHBsdWdfbm9kZV9ub3RpZmllcihtcF9ob3RwbHVnX2NhbGxiYWNrLCBNRU1USUVSX0hPVFBMVUdfUFJJKTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkoKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwobWVtb3J5X3BhY2thZ2VfaW5pdCk7CmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IDRlNDQyMWIyMmI1OWYuLjY2YmNjYjlhMGExOTEgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbXBvbGljeS5jCkBAIC0xMTcsNiAmIzQzOzExNyw3IEBACiAjaW5jbHVkZSAmbHQ7YXNtL3RsYi5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3VhY2Nlc3MuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tZW1vcnkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWVtb3J5LXRpZXJzLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAKQEAgLTE2Nyw2ICYjNDM7MTY4LDggQEAgc3RhdGljIHVuc2lnbmVkIGludCAqbm9kZV9id190YWJsZTsKICAqLwogc3RhdGljIERFRklORV9NVVRFWCh3aV9zdGF0ZV9sb2NrKTsKIAomIzQzO3N0YXRpYyBib29sIHBhY2thZ2VfbW9kZV9lbmFibGVkOwomIzQzOwogc3RhdGljIHU4IGdldF9pbF93ZWlnaHQoaW50IG5vZGUpCiB7CiAJc3RydWN0IHdlaWdodGVkX2ludGVybGVhdmVfc3RhdGUgKnN0YXRlOwpAQCAtMTgwLDYgJiM0MzsxODMsMTEgQEAgc3RhdGljIHU4IGdldF9pbF93ZWlnaHQoaW50IG5vZGUpCiAJcmV0dXJuIHdlaWdodDsKIH0KIAomIzQzO3N0YXRpYyBib29sIHdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSAmYW1wOyZhbXA7IG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYygpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBDb252ZXJ0IGJhbmR3aWR0aCB2YWx1ZXMgaW50byB3ZWlnaHRlZCBpbnRlcmxlYXZlIHdlaWdodHMuCiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay4KQEAgLTMzNyw2ICYjNDM7MzQ1LDQ3IEBAIGludCBuZWFyZXN0X25vZGVfbm9kZW1hc2soaW50IG5vZGUsIG5vZGVtYXNrX3QgKm1hc2spCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZWFyZXN0X25vZGVfbm9kZW1hc2spOwogCiYjNDM7LyoqCiYjNDM7ICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGUKJiM0MzsgKiBAbm9kZTogVGhlIHJlZmVyZW5jZSBub2RlIElEIHRvIG1lYXN1cmUgZGlzdGFuY2UgZnJvbQomIzQzOyAqIEBtYXNrOiBUaGUgc2V0IG9mIGNhbmRpZGF0ZSBub2RlcyB0byBjb21wYXJlIGFnYWluc3QKJiM0MzsgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgYWxsIG5vZGVzIGluIEBtYXNrIGFuZCBtZWFzdXJlcyB0aGUgZGlzdGFuY2UKJiM0MzsgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuCiYjNDM7ICogSXQgZmluZHMgdGhlIG1pbmltdW0gZGlzdGFuY2UgYW5kIHRoZW4gcmVjb3JkcyBhbGwgbm9kZXMgaW4gQG1hc2sgdGhhdAomIzQzOyAqIHNoYXJlIHRoYXQgc2FtZSBtaW5pbXVtIGRpc3RhbmNlIGludG8gdGhlIG91dHB1dCBtYXNrIEBvdXQuCiYjNDM7ICoKJiM0MzsgKiBGb3IgZXhhbXBsZSwgaWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSBlcXVhbCBtaW5pbWFsIGRpc3RhbmNlIHRvIEBub2RlLCBhbGwKJiM0MzsgKiBvZiB0aGVtIGFyZSBpbmNsdWRlZCBpbiBAb3V0LgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIC1FSU5WQUwgaWYgQG91dCBpcyBOVUxMLgomIzQzOyAqLwomIzQzO2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpCiYjNDM7ewomIzQzOwlpbnQgZGlzdCwgbiwgbWluX2Rpc3QgPSBJTlRfTUFYOwomIzQzOwomIzQzOwlpZiAoIW91dCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlub2Rlc19jbGVhcigqb3V0KTsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7CiYjNDM7CQlkaXN0ID0gbm9kZV9kaXN0YW5jZShub2RlLCBuKTsKJiM0MzsKJiM0MzsJCWlmIChkaXN0ICZsdDsgbWluX2Rpc3QpIHsKJiM0MzsJCQltaW5fZGlzdCA9IGRpc3Q7CiYjNDM7CQkJbm9kZXNfY2xlYXIoKm91dCk7CiYjNDM7CQkJbm9kZV9zZXQobiwgKm91dCk7CiYjNDM7CQl9IGVsc2UgaWYgKGRpc3QgPT0gbWluX2Rpc3QpIHsKJiM0MzsJCQlub2RlX3NldChuLCAqb3V0KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwobmVhcmVzdF9ub2Rlc19ub2RlbWFzayk7CiYjNDM7CiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCA9IHAtJmd0O21lbXBvbGljeTsKQEAgLTIwOTcsMTcgJiM0MzsyMTQ2LDk3IEBAIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKQogCXJldHVybiB6b25lICZndDs9IGR5bmFtaWNfcG9saWN5X3pvbmU7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UKJiM0MzsgKiBAcG9saWN5OiBUYXJnZXQgbWVtcG9saWN5IHdob3NlIHVzZXItc2VsZWN0ZWQgbm9kZXMgYXJlIGluIEBwb2xpY3ktJmd0O25vZGVzLgomIzQzOyAqIEBtYXNrOiAgIE91dHB1dCBub2RlbWFzay4gT24gc3VjY2VzcywgY29udGFpbnMgcG9saWN5LSZndDtub2RlcyBsaW1pdGVkIHRvCiYjNDM7ICogICAgICAgICAgdGhlIHBhY2thZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGFsbG9jYXRpb24uCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGhlbHBlciBjb21iaW5lcyB0d28gY29uc3RyYWludHMgdG8gZGVjaWRlIHdoZXJlIHdpdGhpbiBhIHBhY2thZ2UKJiM0MzsgKiBtZW1vcnkgbWF5IGJlIGFsbG9jYXRlZDoKJiM0MzsgKgomIzQzOyAqICAgMSkgVGhlIGNhbGxlciYjMzk7cyBwYWNrYWdlOiBkZXJpdmVkIHZpYSBtcF9nZXRfcGFja2FnZV9ub2RlcyhudW1hX25vZGVfaWQoKSkuCiYjNDM7ICogICAyKSBUaGUgdXNlciYjMzk7cyBwcmVzZWxlY3RlZCBzZXQgQHBvbGljeS0mZ3Q7bm9kZXMgKGNwdXNldHMvbWVtcG9saWN5KS4KJiM0MzsgKgomIzQzOyAqIFRoZSBmdW5jdGlvbiBvYnRhaW5zIHRoZSBub2RlbWFzayBvZiB0aGUgY3VycmVudCBDUFUmIzM5O3MgcGFja2FnZSBhbmQKJiM0MzsgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS0mZ3Q7bm9kZXMuIElmIHRoZSBpbnRlcnNlY3Rpb24gaXMgZW1wdHkgKGUuZy4gdGhlCiYjNDM7ICogdXNlciBleGNsdWRlZCBldmVyeSBub2RlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UpLCBpdCBmYWxscyBiYWNrIHRvIHRoZQomIzQzOyAqIG5vZGUgaW4gQHBvbGljeS0mZ3Q7bm9kZXMsIGRlcml2ZXMgdGhhdCBub2RlJiMzOTtzIHBhY2thZ2UsIGFuZCBpbnRlcnNlY3RzCiYjNDM7ICogYWdhaW4uIElmIHRoZSBmYWxsYmFjayBhbHNvIHlpZWxkcyBhbiBlbXB0eSBzZXQsIEBtYXNrIHN0YXlzIGVtcHR5IGFuZCBhCiYjNDM7ICogbm9uLXplcm8gZXJyb3IgaXMgcmV0dXJuZWQuCiYjNDM7ICoKJiM0MzsgKiBFeGFtcGxlcyAocGFja2FnZXM6IFAwPXtDUFU6MCwgTUVNOjJ9LCBQMT17Q1BVOjEsIE1FTTozfSk6CiYjNDM7ICogICAtIHBvbGljeS0mZ3Q7bm9kZXMgPSB7MCwxLDIsM30KJiM0MzsgKiAgICAgICBvbiBQMDogbWFzayA9IHswLDJ9OyBvbiBQMTogbWFzayA9IHsxLDN9LgomIzQzOyAqICAgLSBwb2xpY3ktJmd0O25vZGVzID0gezAsMSwzfQomIzQzOyAqICAgICAgIG9uIFAwOiBtYXNrID0gezB9ICAgICAgKG9ubHkgbm9kZSAwIGZyb20gUDAgaXMgYWxsb3dlZCkuCiYjNDM7ICogICAtIHBvbGljeS0mZ3Q7bm9kZXMgPSB7MSwyLDN9CiYjNDM7ICogICAgICAgb24gUDA6IG1hc2sgPSB7Mn0gICAgICAob25seSBub2RlIDIgZnJvbSBQMCBpcyBhbGxvd2VkKS4KJiM0MzsgKiAgIC0gcG9saWN5LSZndDtub2RlcyA9IHsxLDN9CiYjNDM7ICogICAgICAgb24gUDA6IGN1cnJlbnQgcGFja2FnZSAoUDApICZhbXA7IHBvbGljeSA9IE5VTEwgLSZndDsgZmFsbGJhY2sgdG8gcG9saWN5PTEsCiYjNDM7ICogICAgICAgICAgICAgICBwYWNrYWdlKDEpPVAxLCBtYXNrID0gezEsM30uIChVc2VyIGVmZmVjdGl2ZWx5IG9wdGVkIG91dCBvZiBQMC4pCiYjNDM7ICoKJiM0MzsgKiBJZiB0aGUgc2VsZWN0ZWQgbm9kZSBpcyBsb3cgb24gbWVtb3J5LCB0aGUgYWxsb2NhdGlvbiBtYXkgdXNlIGFub3RoZXIgbm9kZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAgIDAgb24gc3VjY2VzcyB3aXRoIEBtYXNrIHNldCBhcyBhYm92ZTsKJiM0MzsgKiAgIC1FSU5WQUwgaWYgQHBvbGljeS9AbWFzayBpcyBOVUxMOwomIzQzOyAqICAgLUVOT0VOVCBpZiBldmVuIHRoZSBmYWxsYmFjayBpbnRlcnNlY3Rpb24gaXMgZW1wdHk7CiYjNDM7ICogICBQcm9wYWdhdGVkIGVycm9yIGZyb20gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoKSBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIG5vZGVtYXNrX3QgKm1hc2spCiYjNDM7ewomIzQzOwlub2RlbWFza190IHBhY2thZ2VfbWFzazsKJiM0MzsJaW50IG5vZGUsIHJldDsKJiM0MzsKJiM0MzsJaWYgKCFwb2xpY3kgfHwgIW1hc2spCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJbm9kZXNfY2xlYXIoKm1hc2spOwomIzQzOwomIzQzOwlub2RlID0gbnVtYV9ub2RlX2lkKCk7CiYjNDM7CXJldCA9IG1wX2dldF9wYWNrYWdlX25vZGVzKG5vZGUsICZhbXA7cGFja2FnZV9tYXNrKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CW5vZGVzX2FuZCgqbWFzaywgcGFja2FnZV9tYXNrLCBwb2xpY3ktJmd0O25vZGVzKTsKJiM0MzsJaWYgKCFub2Rlc19lbXB0eSgqbWFzaykpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHVzZXImIzM5O3Mgbm9kZW1hc2sgZXhjbHVkZXMgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlOwomIzQzOwkgKiBmYWxsIGJhY2sgdG8gdGhlIHBhY2thZ2Ugc3Bhbm5lZCBieSB0aGUgdXNlciYjMzk7cyBvd24gZmlyc3Qgbm9kZS4KJiM0MzsJICovCiYjNDM7CW5vZGUgPSBmaXJzdF9ub2RlKHBvbGljeS0mZ3Q7bm9kZXMpOwomIzQzOwlyZXQgPSBtcF9nZXRfcGFja2FnZV9ub2Rlcyhub2RlLCAmYW1wO3BhY2thZ2VfbWFzayk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlub2Rlc19hbmQoKm1hc2ssIHBhY2thZ2VfbWFzaywgcG9saWN5LSZndDtub2Rlcyk7CiYjNDM7CWlmIChub2Rlc19lbXB0eSgqbWFzaykpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogc3RhdGljIHVuc2lnbmVkIGludCB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSkKIHsKIAl1bnNpZ25lZCBpbnQgbm9kZTsKIAl1bnNpZ25lZCBpbnQgY3B1c2V0X21lbXNfY29va2llOwomIzQzOwlub2RlbWFza190IG1hc2s7CiAKIHJldHJ5OgogCS8qIHRvIHByZXZlbnQgbWlzY291bnQgdXNlIHRzay0mZ3Q7bWVtc19hbGxvd2VkX3NlcSB0byBkZXRlY3QgcmViaW5kICovCiAJY3B1c2V0X21lbXNfY29va2llID0gcmVhZF9tZW1zX2FsbG93ZWRfYmVnaW4oKTsKIAlub2RlID0gY3VycmVudC0mZ3Q7aWxfcHJldjsKLQlpZiAoIWN1cnJlbnQtJmd0O2lsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBwb2xpY3ktJmd0O25vZGVzKSkgewotCQlub2RlID0gbmV4dF9ub2RlX2luKG5vZGUsIHBvbGljeS0mZ3Q7bm9kZXMpOwomIzQzOwomIzQzOwkvKiBQYWNrYWdlIG1vZGUgb2ZmIG9yIHVucmVzb2x2ZWQ6IGZhbGwgYmFjayB0byB0aGUgZnVsbCBwb2xpY3kgbm9kZW1hc2suICovCiYjNDM7CWlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fAomIzQzOwkgICAgcG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2xpY3ksICZhbXA7bWFzaykpCiYjNDM7CQltYXNrID0gcG9saWN5LSZndDtub2RlczsKJiM0MzsKJiM0MzsJaWYgKCFjdXJyZW50LSZndDtpbF93ZWlnaHQgfHwgIW5vZGVfaXNzZXQobm9kZSwgbWFzaykpIHsKJiM0MzsJCW5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgbWFzayk7CiAJCWlmIChyZWFkX21lbXNfYWxsb3dlZF9yZXRyeShjcHVzZXRfbWVtc19jb29raWUpKQogCQkJZ290byByZXRyeTsKIAkJaWYgKG5vZGUgPT0gTUFYX05VTU5PREVTKQpAQCAtMjIwMCw2ICYjNDM7MjMyOSwzMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLAogCXJldHVybiBub2Rlc193ZWlnaHQoKm1hc2spOwogfQogCiYjNDM7LyoKJiM0MzsgKiBQYWNrYWdlLWF3YXJlIGNvdW50ZXJwYXJ0IG9mIHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soKTogcmVzb2x2ZSB0aGUKJiM0MzsgKiBjdXJyZW50IHBhY2thZ2UmIzM5O3Mgbm9kZXMgaW50ZXJzZWN0ZWQgd2l0aCB0aGUgcG9saWN5LCBmYWxsaW5nIGJhY2sgdG8gdGhlCiYjNDM7ICogZnVsbCBwb2xpY3kgbm9kZW1hc2sgd2hlbiBwYWNrYWdlIG1vZGUgaXMgb2ZmIG9yIHJlc29sdXRpb24gZmFpbHMuCiYjNDM7ICovCiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLAomIzQzOwkJCQkJCSAgICAgIG5vZGVtYXNrX3QgKm1hc2spCiYjNDM7ewomIzQzOwlub2RlbWFza190IHBhY2thZ2VfbWFzazsKJiM0MzsKJiM0MzsJYmFycmllcigpOwomIzQzOwlpZiAoIXdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKCkpIHsKJiM0MzsJCW1lbWNweShtYXNrLCAmYW1wO3BvbC0mZ3Q7bm9kZXMsIHNpemVvZihub2RlbWFza190KSk7CiYjNDM7CQlyZXR1cm4gbm9kZXNfd2VpZ2h0KCptYXNrKTsKJiM0MzsJfQomIzQzOwlpZiAocG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2wsICZhbXA7cGFja2FnZV9tYXNrKSkKJiM0MzsJCW1lbWNweShtYXNrLCAmYW1wO3BvbC0mZ3Q7bm9kZXMsIHNpemVvZihub2RlbWFza190KSk7CiYjNDM7CWVsc2UKJiM0MzsJCW1lbWNweShtYXNrLCAmYW1wO3BhY2thZ2VfbWFzaywgc2l6ZW9mKG5vZGVtYXNrX3QpKTsKJiM0MzsJYmFycmllcigpOwomIzQzOwomIzQzOwlyZXR1cm4gbm9kZXNfd2VpZ2h0KCptYXNrKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbmlkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgcGdvZmZfdCBpbHgpCiB7CiAJc3RydWN0IHdlaWdodGVkX2ludGVybGVhdmVfc3RhdGUgKnN0YXRlOwpAQCAtMjIxMCw3ICYjNDM7MjM2Myw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseCkKIAl1OCB3ZWlnaHQ7CiAJaW50IG5pZCA9IDA7CiAKLQlucl9ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCAmYW1wO25vZGVtYXNrKTsKJiM0MzsJbnJfbm9kZXMgPSByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2socG9sLCAmYW1wO25vZGVtYXNrKTsKIAlpZiAoIW5yX25vZGVzKQogCQlyZXR1cm4gbnVtYV9ub2RlX2lkKCk7CiAKQEAgLTI2NTQsNyAmIzQzOzI4MDcsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLAogCS8qIHJlYWQgdGhlIG5vZGVzIG9udG8gdGhlIHN0YWNrLCByZXRyeSBpZiBkb25lIGR1cmluZyByZWJpbmQgKi8KIAlkbyB7CiAJCWNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7Ci0JCW5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCAmYW1wO25vZGVzKTsKJiM0MzsJCW5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfcGFja2FnZV9ub2RlbWFzayhwb2wsICZhbXA7bm9kZXMpOwogCX0gd2hpbGUgKHJlYWRfbWVtc19hbGxvd2VkX3JldHJ5KGNwdXNldF9tZW1zX2Nvb2tpZSkpOwogCiAJLyogaWYgdGhlIG5vZGVtYXNrIGhhcyBiZWNvbWUgaW52YWxpZCwgd2UgY2Fubm90IGRvIGFueXRoaW5nICovCkBAIC0zNzk0LDcgJiM0MzszOTQ3LDQyIEBAIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfYXV0b19hdHRyID0gewogCS5zdG9yZSA9IHdlaWdodGVkX2ludGVybGVhdmVfYXV0b19zdG9yZSwKIH07CiAKJiM0MztzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21vZGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKJiM0MzsJCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQomIzQzO3sKJiM0MzsJcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAmIzM0OyVzXG4mIzM0Oywgc3RyX3RydWVfZmFsc2UoUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21vZGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCiYjNDM7CQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQomIzQzO3sKJiM0MzsJYm9vbCBpbnB1dDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJZXJyID0ga3N0cnRvYm9vbChidWYsICZhbXA7aW5wdXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRGlzYWJsZSBwYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9naWVzLgomIzQzOwkgKiBOb24tc3ltbWV0cmljIHRvcG9sb2d5IChlLmcuLCBhc3ltbWV0cmljIENYTCBtZW1vcnkgYXR0YWNobWVudCkgY2FuCiYjNDM7CSAqIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlmIHBhY2thZ2UtYXdhcmUgYWxsb2NhdGlvbiBpcyB1c2VkLgomIzQzOwkgKiBSZWplY3QgZW5hYmxlIHJlcXVlc3QgaWYgdG9wb2xvZ3kgaXMgbm90IHN5bW1ldHJpYy4KJiM0MzsJICovCiYjNDM7CWlmIChpbnB1dCAmYW1wOyZhbXA7ICFtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKSkgewomIzQzOwkJcHJfd2FybigmIzM0O3BhY2thZ2VfbW9kZSBjYW5ub3QgYmUgZW5hYmxlZCBvbiBub24tc3ltbWV0cmljIHRvcG9sb2d5XG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlXUklURV9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkLCBpbnB1dCk7CiYjNDM7CXJldHVybiBjb3VudDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSB3aV9wYWNrYWdlX21vZGVfYXR0ciA9CiYjNDM7CV9fQVRUUihwYWNrYWdlX21vZGUsIDA2NjQsIHBhY2thZ2VfbW9kZV9zaG93LCBwYWNrYWdlX21vZGVfc3RvcmUpOwomIzQzOwogc3RhdGljIHZvaWQgd2lfY2xlYW51cCh2b2lkKSB7CiYjNDM7CXN5c2ZzX3JlbW92ZV9maWxlKCZhbXA7d2lfZ3JvdXAtJmd0O3dpX2tvYmosICZhbXA7d2lfcGFja2FnZV9tb2RlX2F0dHIuYXR0cik7CiAJc3lzZnNfcmVtb3ZlX2ZpbGUoJmFtcDt3aV9ncm91cC0mZ3Q7d2lfa29iaiwgJmFtcDt3aV9hdXRvX2F0dHIuYXR0cik7CiAJc3lzZnNfd2lfbm9kZV9kZWxldGVfYWxsKCk7CiAJd2lfc3RhdGVfZnJlZSgpOwpAQCAtMzkwMCw2ICYjNDM7NDA4OCwxMCBAQCBzdGF0aWMgaW50IF9faW5pdCBhZGRfd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ncm91cChzdHJ1Y3Qga29iamVjdCAqbWVtcG9saWN5X2tvYmopCiAJaWYgKGVycikKIAkJZ290byBlcnJfcHV0X2tvYmo7CiAKJiM0MzsJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmFtcDt3aV9ncm91cC0mZ3Q7d2lfa29iaiwgJmFtcDt3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCWdvdG8gZXJyX2NsZWFudXBfa29iajsKJiM0MzsKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKIAkJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKQogCQkJY29udGludWU7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5ODE2CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNzYwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS2VybmVsIE1lbW9yeSBQYWNrYWdlIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGEgJiMzNDttZW1vcnkgcGFja2FnZSYjMzQ7IHRvcG9sb2d5IGNvbmNlcHQgd2l0aGluIHRoZSBrZXJuZWwsIHByaW1hcmlseSBmb3IgTlVNQSBub2RlcyBhbmQsIGltcG9ydGFudGx5LCBDWEwvSEJNIG1lbW9yeSBjb25maWd1cmF0aW9ucy4gSXQmIzM5O3MgdG91Y2hpbmcgc29tZSBjcml0aWNhbCBhcmVhczogYG1tL21lbW9yeS10aWVycy5jYCwgYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgLCBgZHJpdmVycy9kYXgva21lbS5jYCwgYW5kIGBtbS9tZW1wb2xpY3kuY2AuIFRoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2Ug4oCTIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmYgaGVyZSwgZGVhbGluZyB3aXRoIE5VTUEgbWVtb3J5IHRpZXJzLCBDWEwgcmVnaW9ucywgYW5kIHRoZSBtZW1wb2xpY3kgc3Vic3lzdGVtLiBJdOKAmXMgZGVmaW5pdGVseSB0b3VjaGluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIG1ha2luZyBmdXp6aW5nIGEgaGlnaCBwcmlvcml0eS4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBkaXZlIGludG8gaXQgYW5kIGlkZW50aWZ5IHRoZSBrZXkgZnVuY3Rpb25zIHRoYXQgYXJlIGFkZGVkIG9yIG1vZGlmaWVkLCBmb2N1c2luZyBvbiBwb3RlbnRpYWwgYXJlYXMgb2YgdnVsbmVyYWJpbGl0eSBvciB1bmV4cGVjdGVkIGJlaGF2aW9yLiBMZXQmIzM5O3Mgc2VlLi4uIHRoZSBwYXRjaCBpcyBpbnRyb2R1Y2luZyBhIHN5c2ZzIGludGVyZmFjZSBmb3IgdGhlc2UgbWVtb3J5IHBhY2thZ2VzIHVuZGVyIGAvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvYCBhbmQgYSBuZXcgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlIGZvciBtZW1wb2xpY3ksIGFjY2Vzc2libGUgdmlhIGAvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVgLgoKSSYjMzk7bSBtYWtpbmcgYSBsaXN0IG9mIHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgaW1wYWN0ZWQ6IGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfcHJvYmVfcGFja2FnZV9pZGAsIHRoZSBub3RpZmllciBmdW5jdGlvbnMsIHRoZSBwYWNrYWdlIG5vZGUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAoYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBldGMuKSwgYW5kIHRoZSBpbnRlcmxlYXZlIGFuZCBwcm9tb3Rpb24vZGVtb3Rpb24gZnVuY3Rpb25zLiBJIHNlZSBhIGxvdCBvZiBhY3Rpdml0eSB3aXRoaW4gYG1tL21lbW9yeS10aWVycy5jYCBhbmQgYG1tL21lbXBvbGljeS5jYCwgc28gSSYjMzk7bGwgbmVlZCB0byBzY3J1dGluaXplIHRob3NlIG1vZHVsZXMgY2FyZWZ1bGx5IHRvIHVuZGVyc3RhbmQgdGhlIGNhbGwgcGF0aHMgYW5kIGRlcGVuZGVuY2llcy4KCk5vdywgbXkgZm9jdXMgbmFycm93cyB0byB0aGUgZXhwb3J0ZWQgYW5kIHJlYWNoYWJsZSBmdW5jdGlvbnMgd2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9tZW1wb2xpY3kuY2AsIG5hbWVseTogYG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yYCwgYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzYCwgYG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzYCwgYG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tgLCBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVgLCBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYCBhbmQgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgLiBUaGVzZSBhcmUgbXkgcHJpbWFyeSB0YXJnZXRzLgoKR2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgY2hhbmdlcywgZXNwZWNpYWxseSB0aGUgTlVNQSBmb2N1cywgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gTmF0dXJhbGx5LCB0aGlzIGNvZGUgaXMgaGVhdmlseSBOVU1BLWRlcGVuZGVudC4gTGV0JiMzOTtzIG1ha2Ugc3VyZSBgQ09ORklHX05VTUFgIGlzIGVuYWJsZWQuIEZ1cnRoZXIsIEkgc2hvdWxkIHNlZSBpZiBgQ09ORklHX05VTUFfQkFMQU5DSU5HYCwgYENPTkZJR19OVU1BX01JR1JBVElPTmAsIGBDT05GSUdfTUVNT1JZX1RJRVJTYCwgb3IgYENPTkZJR19DWExfQlVTYCBhcmUgZGVwZW5kZW5jaWVzLiBJJiMzOTtsbCBxdWlja2x5IGdyZXAgZm9yIHRoZSBtb3N0IHJlbGV2YW50IG9uZXMuIE9rYXksIHNvIHRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB3aGVyZSB0byBmb2N1cyBteSBpbml0aWFsIGZ1enppbmcgZWZmb3J0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfTlVNQV9NSUdSQVRJT04mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LXRpZXJzLmM9NzE9Ym9vbCBmb2xpb191c2VfYWNjZXNzX3RpbWUoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9tZW1vcnktdGllcnMuYy03Ny1cbm1tL21lbW9yeS10aWVycy5jOjc4OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTc5LXN0YXRpYyBpbnQgdG9wX3RpZXJfYWRpc3RhbmNlO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTEzNz1zdGF0aWMgc3RydWN0IGRlbW90aW9uX25vZGVzICpub2RlX2RlbW90aW9uIF9fcmVhZF9tb3N0bHk7XG5tbS9tZW1vcnktdGllcnMuYzoxMzg6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWVtb3J5LXRpZXJzLmMtMTM5LVxuLS1cbm1tL21lbW9yeS10aWVycy5jPTI2Nj1zdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTI4MS1cbm1tL21lbW9yeS10aWVycy5jOjI4MjojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy0yODMtYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NTI3PXN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxubW0vbWVtb3J5LXRpZXJzLmM6NTI4OiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbm1tL21lbW9yeS10aWVycy5jLTUyOS1cbi0tXG5tbS9tZW1vcnktdGllcnMuYz05MTI9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfaW5pdCh2b2lkKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTkxOS1cbm1tL21lbW9yeS10aWVycy5jOjkyMDojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy05MjEtXHRub2RlX2RlbW90aW9uID0ga3phbGxvY19vYmpzKHN0cnVjdCBkZW1vdGlvbl9ub2RlcywgbnJfbm9kZV9pZHMpO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTk0NT1ib29sIG51bWFfZGVtb3Rpb25fZW5hYmxlZCA9IGZhbHNlO1xubW0vbWVtb3J5LXRpZXJzLmMtOTQ2LVxubW0vbWVtb3J5LXRpZXJzLmM6OTQ3OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTk0OC0jaWZkZWYgQ09ORklHX1NZU0ZTXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MTYxOD1zdGF0aWMgaW50IF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcbi0tXG5tbS9tZW1vcnktdGllcnMuYy0xNjU4LVxubW0vbWVtb3J5LXRpZXJzLmM6MTY1OTojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy0xNjYwLXN0YXRpYyBpbnQgX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKGludCBuaWQsIGVudW0gbXBfbm9kZXNfdHlwZSBub2RlX3R5cGUsXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MTc3OD1FWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X3Byb21vdGlvbl9ub2RlKTtcbm1tL21lbW9yeS10aWVycy5jOjE3Nzk6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWVtb3J5LXRpZXJzLmMtMTc4MC1cbi0tXG5tbS9tZW1wb2xpY3kuYz0xMTk2PXN0YXRpYyBsb25nIGRvX2dldF9tZW1wb2xpY3koaW50ICpwb2xpY3ksIG5vZGVtYXNrX3QgKm5tYXNrLFxuLS1cbm1tL21lbXBvbGljeS5jLTEyOTYtXG5tbS9tZW1wb2xpY3kuYzoxMjk3OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbXBvbGljeS5jLTEyOTgtc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxuLS1cbm1tL21pZ3JhdGUuYz0yMTg4PXN0cnVjdCBmb2xpbyAqYWxsb2NfbWlncmF0aW9uX3RhcmdldChzdHJ1Y3QgZm9saW8gKnNyYywgdW5zaWduZWQgbG9uZyBwcml2YXRlKVxuLS1cbm1tL21pZ3JhdGUuYy0yMjI2LVxubW0vbWlncmF0ZS5jOjIyMjc6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxubW0vbWlncmF0ZS5jLTIyMjgtc3RhdGljIGludCBzdG9yZV9zdGF0dXMoaW50IF9fdXNlciAqc3RhdHVzLCBpbnQgc3RhcnQsIGludCB2YWx1ZSwgaW50IG5yKVxuLS1cbm1tL21pZ3JhdGUuYz0yNjE5PVNZU0NBTExfREVGSU5FNihtb3ZlX3BhZ2VzLCBwaWRfdCwgcGlkLCB1bnNpZ25lZCBsb25nLCBucl9wYWdlcyxcbi0tXG5tbS9taWdyYXRlLmMtMjYyNS19XG5tbS9taWdyYXRlLmM6MjYyNjojZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXG5tbS9taWdyYXRlLmMtMjYyNy1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjIyNwoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgY29uZmlnIG9wdGlvbnMsIHRoaW5raW5nIGFib3V0IHRoZW0gYXMgYSBzZWFzb25lZCBleHBlcnQ6CgoqKkludmVzdGlnYXRpbmcgTWVtb3J5IEFyY2hpdGVjdHVyZSBDb25maWd1cmF0aW9uKioKClJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCBob3cgdGhleSBpbnRlcnBsYXkgYW5kIHdoYXQgYXJjaGl0ZWN0dXJhbCBpbXBsaWNhdGlvbnMgdGhleSBzdWdnZXN0LiBGaXJzdCwgYENPTkZJR19OVU1BYC4gVGhhdCYjMzk7cyBhIGZ1bmRhbWVudGFsIGdpdmVuIHRoZXNlIGRheXMsIGJ1dCBpdCYjMzk7cyBhbHdheXMgd29ydGggdmVyaWZ5aW5nIGl0JiMzOTtzIGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGZvciB0aGUgdGFyZ2V0IHN5c3RlbS4gTlVNQSBmdW5kYW1lbnRhbGx5IGltcGFjdHMgbWVtb3J5IGFjY2VzcyBsYXRlbmN5LCBhbmQgdW5kZXJzdGFuZGluZyBpdHMgaW1wbGljYXRpb25zIGlzIGNydWNpYWwgZm9yIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMuIEkgbmVlZCB0byBrZWVwIGluIG1pbmQgaG93IHRoZSBtZW1vcnkgcG9saWNpZXMgd2lsbCBiZSBkZWZpbmVkLCBob3cgdGhlIHNjaGVkdWxlciB3aWxsIHdvcmssIGFuZCBob3cgdGhlIE9TIHdpbGwgbWFuYWdlIG1lbW9yeSBhbGxvY2F0aW9uIGFjcm9zcyBkaWZmZXJlbnQgTlVNQSBub2Rlcy4KCk5leHQsIGBDT05GSUdfTUVNT1JZX1RJRVJTYC4gVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBUaGlzIHN1Z2dlc3RzIGEgbXVsdGktdGllcmVkIG1lbW9yeSBhcmNoaXRlY3R1cmUgaXMgaW4gcGxheSDigJMgdGhpbmsgRFJBTSwgcGVyc2lzdGVudCBtZW1vcnksIG9yIGV2ZW4gZGlmZmVyZW50IHR5cGVzIG9mIERSQU0gd2l0aCB2YXJ5aW5nIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcy4gSWYgdGhpcyBpcyBlbmFibGVkLCBJIGltbWVkaWF0ZWx5IHN0YXJ0IGNvbnNpZGVyaW5nIHRoZSBpbXBsaWNhdGlvbnMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCBkYXRhIHBsYWNlbWVudCwgYW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIGRpZmZlcmVuY2VzIGluIGFjY2VzcyBzcGVlZCBhbmQgcGVyc2lzdGVuY2UuIFRoZSBwb3RlbnRpYWwgZm9yIGNhY2hlLWF3YXJlIGFsZ29yaXRobXMgYW5kIE5VTUEtYXdhcmUgcGxhY2VtZW50IGJlY29tZXMgZXh0cmVtZWx5IGltcG9ydGFudC4KCkZpbmFsbHksIGBDT05GSUdfQ1hMX0JVU2AuIE5vdywgdGhpcyBpcyBleGNpdGluZy4gQ1hMIChDb21wdXRlIEV4cHJlc3MgTGluaykgb3BlbnMgdXAgYSB3aG9sZSBuZXcgd29ybGQgb2YgcG9zc2liaWxpdGllcywgZW5hYmxpbmcgY29oZXJlbnQgbWVtb3J5IHNoYXJpbmcgYW5kIGFjY2VsZXJhdGlvbiBiZXR3ZWVuIHRoZSBDUFUgYW5kIGRldmljZXMuIFdpdGggQ1hMIGVuYWJsZWQsIEkgaGF2ZSB0byB0aGluayBhYm91dCBob3cgQ1hMIGRldmljZXMgd2lsbCBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIEFyZSB3ZSB0YWxraW5nIGFib3V0IENYTC1hdHRhY2hlZCBtZW1vcnksIGFjY2VsZXJhdG9ycywgb3IgYSBjb21iaW5hdGlvbj8gVGhpcyBjb25maWcgb3B0aW9uIHJhaXNlcyBxdWVzdGlvbnMgYWJvdXQgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgdGhlIGltcGxpY2F0aW9ucyBmb3IgRE1BLCBhbmQgaG93IHRoaXMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHN5c3RlbS4gSXQgYWxzbyBtZWFucyBJIG5lZWQgdG8gY2FyZWZ1bGx5IGFuYWx5emUgdGhlIGRyaXZlciBzdXBwb3J0IGFuZCBhbnkgcmVsZXZhbnQgZmlybXdhcmUgY29uc2lkZXJhdGlvbnMuIFRoaXMgaGFzIHNvbWUgdmVyeSBkZWVwIGltcGxpY2F0aW9ucyBmb3Igc3lzdGVtIGRlc2lnbiwgYW5kIEkgbmVlZCB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgQ1hMLWJhc2VkIG1lbW9yeSBhbmQgdGhlIGV4aXN0aW5nIE5VTUEgdG9wb2xvZ3kuIFRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHdob2xlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBzdGFjay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNRU1PUllfVElFUlMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNzExCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqS2NvbmZpZyBEaXZlIGZvciBOVU1BL01FTU9SWV9USUVSUyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhlc2UgTlVNQSBhbmQgTUVNT1JZX1RJRVJTIGNvbmZpZ3VyYXRpb25zIGFyZSBoYW5kbGVkLiBHaXZlbiBteSBleHBlcmllbmNlLCB0aGUgZmlyc3QgcGxhY2UgSSBhbHdheXMgZ28gaW4gYSBrZXJuZWwgYnVpbGQgaXMgdGhlIGBLY29uZmlnYCBmaWxlcy4gVGhhdCYjMzk7cyB0aGUgY2VudHJhbCBjb25maWd1cmF0aW9uIGh1YiwgcmlnaHQ/IFNvLCBJJiMzOTttIHRoaW5raW5nLCAmIzM0O0xldCYjMzk7cyBjaGVjayBgbW0vS2NvbmZpZ2AuJiMzNDsgVGhhdCYjMzk7cyB0aGUgbW9zdCBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50IGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJiMzOTtsbCBzZWFyY2ggZm9yIGJvdGggYE5VTUFgIGFuZCBgTUVNT1JZX1RJRVJTYCB0byBzZWUgd2hhdCBJIGNhbiBmaW5kLiBJdCYjMzk7cyBhbG1vc3QgZ3VhcmFudGVlZCB0aGUgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcyB3aWxsIGJlIHJpZ2h0IHRoZXJlLiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSByZWxldmFudCBzeW1ib2xzLCBkZXNjcmlwdGlvbnMsIGFuZCBhbnkgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMsIGxpa2UgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGlvbnMgb3Igb3RoZXIgbWVtb3J5IG1hbmFnZW1lbnQgZmVhdHVyZXMgdGhhdCBtaWdodCBiZSBpbnRlcnR3aW5lZC4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZXNlIGZlYXR1cmVzIGFyZSBlbmFibGVkIGFuZCBtYW5hZ2VkIHdpdGhpbiB0aGUga2VybmVsIGJ1aWxkIHN5c3RlbS4gRnJvbSB0aGVyZSwgSSBjYW4gdHJhY2sgZG93biB0aGUgc291cmNlIGZpbGVzIHRoZXkgaW1wYWN0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBOVU1BJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTQ0Mj1jb25maWcgQVJDSF9LRUVQX01FTUJMT0NLXG4tLVxubW0vS2NvbmZpZy00NDUtIyBLZWVwIGFyY2ggTlVNQSBtYXBwaW5nIGluZnJhc3RydWN0dXJlIHBvc3QtaW5pdC5cbm1tL0tjb25maWc6NDQ2OmNvbmZpZyBOVU1BX0tFRVBfTUVNSU5GT1xubW0vS2NvbmZpZy00NDctXHRib29sXG4tLVxubW0vS2NvbmZpZz02MjQ9Y29uZmlnIFBBR0VfUkVQT1JUSU5HXG4tLVxubW0vS2NvbmZpZy02MzEtXG5tbS9LY29uZmlnOjYzMjpjb25maWcgTlVNQV9NSUdSQVRJT05cbm1tL0tjb25maWctNjMzLVx0Ym9vbCBcJiMzNDtOVU1BIHBhZ2UgbWlncmF0aW9uXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz0xNDE4PWNvbmZpZyBFWEVDTUVNXG4tLVxubW0vS2NvbmZpZy0xNDIwLVxubW0vS2NvbmZpZzoxNDIxOmNvbmZpZyBOVU1BX01FTUJMS1Ncbm1tL0tjb25maWctMTQyMi1cdGJvb2xcbm1tL0tjb25maWctMTQyMy1cbm1tL0tjb25maWc6MTQyNDpjb25maWcgTlVNQV9FTVVcbm1tL0tjb25maWctMTQyNS1cdGJvb2wgXCYjMzQ7TlVNQSBlbXVsYXRpb25cJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzIyOAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKktjb25maWcgTG9jYXRpb24gQ2hlY2sqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgQ09ORklHX05VTUFgLiBUaGF0IG9uZSBzaG91bGQgYmUgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IEkgbmVlZCB0byBxdWlja2x5IHJlY2FsbCB3aGVyZSBpdCB0eXBpY2FsbHkgcmVzaWRlcyB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gTXkgbWVudGFsIG1hcCB1c3VhbGx5IHBsYWNlcyB0aGVzZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMg4oCTIHBhcnRpY3VsYXJseSB0aG9zZSByZWxhdGVkIHRvIE5VTUEg4oCTIGluIGVpdGhlciBgYXJjaC9LY29uZmlnYCAodW5kZXIgdGhlIHJlbGV2YW50IGFyY2hpdGVjdHVyZSBkaXJlY3RvcnksIG5hdHVyYWxseSkgb3IsIGlmIGl0JiMzOTtzIG1vcmUgZ2VuZXJhbCBpbml0aWFsaXphdGlvbiByZWxhdGVkLCBgaW5pdC9LY29uZmlnYC4gSSYjMzk7ZCBzdGFydCB0aGVyZSwgc2luY2UgdGhhdCYjMzk7cyB3aGVyZSBJJiMzOTtkIGV4cGVjdCBpdCwgZ2l2ZW4gaXRzIGZ1bmN0aW9uLiBObyBzZW5zZSBpbiB3YXN0aW5nIHRpbWUgc2VhcmNoaW5nIG90aGVyIGFyZWFzIGlmIHRoZSBsb2dpY2FsIGxvY2F0aW9ucyBhcmUga25vd24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBOVU1BJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvYXJtNjQvS2NvbmZpZz0xNTE1PWNvbmZpZyBIT1RQTFVHX0NQVVxuLS1cbmFyY2gvYXJtNjQvS2NvbmZpZy0xNTIyLSMgQ29tbW9uIE5VTUEgRmVhdHVyZXNcbmFyY2gvYXJtNjQvS2NvbmZpZzoxNTIzOmNvbmZpZyBOVU1BXG5hcmNoL2FybTY0L0tjb25maWctMTUyNC1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL2xvb25nYXJjaC9LY29uZmlnPTU0Mz1jb25maWcgTlJfQ1BVU1xuLS1cbmFyY2gvbG9vbmdhcmNoL0tjb25maWctNTUxLVxuYXJjaC9sb29uZ2FyY2gvS2NvbmZpZzo1NTI6Y29uZmlnIE5VTUFcbmFyY2gvbG9vbmdhcmNoL0tjb25maWctNTUzLVx0Ym9vbCBcJiMzNDtOVU1BIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL21pcHMvS2NvbmZpZz0yNjA5PWNvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEVcbi0tXG5hcmNoL21pcHMvS2NvbmZpZy0yNjExLVxuYXJjaC9taXBzL0tjb25maWc6MjYxMjpjb25maWcgTlVNQVxuYXJjaC9taXBzL0tjb25maWctMjYxMy1cdGJvb2wgXCYjMzQ7TlVNQSBTdXBwb3J0XCYjMzQ7XG4tLVxuYXJjaC9wb3dlcnBjL0tjb25maWc9NzU1PWNvbmZpZyBJUlFfQUxMX0NQVVNcbi0tXG5hcmNoL3Bvd2VycGMvS2NvbmZpZy03NjMtXG5hcmNoL3Bvd2VycGMvS2NvbmZpZzo3NjQ6Y29uZmlnIE5VTUFcbmFyY2gvcG93ZXJwYy9LY29uZmlnLTc2NS1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3Jpc2N2L0tjb25maWc9NDc4PWVuZGNob2ljZVxuLS1cbmFyY2gvcmlzY3YvS2NvbmZpZy00ODAtIyBDb21tb24gTlVNQSBGZWF0dXJlc1xuYXJjaC9yaXNjdi9LY29uZmlnOjQ4MTpjb25maWcgTlVNQVxuYXJjaC9yaXNjdi9LY29uZmlnLTQ4Mi1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3MzOTAvS2NvbmZpZz01Mzc9Y29uZmlnIEhPVFBMVUdfQ1BVXG4tLVxuYXJjaC9zMzkwL0tjb25maWctNTM5LVxuYXJjaC9zMzkwL0tjb25maWc6NTQwOmNvbmZpZyBOVU1BXG5hcmNoL3MzOTAvS2NvbmZpZy01NDEtXHRib29sIFwmIzM0O05VTUEgc3VwcG9ydFwmIzM0O1xuLS1cbmFyY2gvc2gvbW0vS2NvbmZpZz0xMDI9Y29uZmlnIFZTWVNDQUxMXG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTExNC1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxMTU6Y29uZmlnIE5VTUFcbmFyY2gvc2gvbW0vS2NvbmZpZy0xMTYtXHRib29sIFwmIzM0O05vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MgKE5VTUEpIFN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3NwYXJjL0tjb25maWc9MjU1PWNvbmZpZyBHRU5FUklDX0xPQ0tCUkVBS1xuLS1cbmFyY2gvc3BhcmMvS2NvbmZpZy0yNTktXG5hcmNoL3NwYXJjL0tjb25maWc6MjYwOmNvbmZpZyBOVU1BXG5hcmNoL3NwYXJjL0tjb25maWctMjYxLVx0Ym9vbCBcJiMzNDtOVU1BIHN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3g4Ni9LY29uZmlnPTE1MDE9Y29uZmlnIEFNRF9NRU1fRU5DUllQVFxuLS1cbmFyY2gveDg2L0tjb25maWctMTUxNy0jIENvbW1vbiBOVU1BIEZlYXR1cmVzXG5hcmNoL3g4Ni9LY29uZmlnOjE1MTg6Y29uZmlnIE5VTUFcbmFyY2gveDg2L0tjb25maWctMTUxOS1cdGJvb2wgXCYjMzQ7TlVNQSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnRcJiMzNDtcbi0tXG5pbml0L0tjb25maWc9MTAwNz1jb25maWcgQVJDSF9XQU5UX05VTUFfVkFSSUFCTEVfTE9DQUxJVFlcbi0tXG5pbml0L0tjb25maWctMTAwOS1cbmluaXQvS2NvbmZpZzoxMDEwOmNvbmZpZyBOVU1BX0JBTEFOQ0lOR1xuaW5pdC9LY29uZmlnLTEwMTEtXHRib29sIFwmIzM0O01lbW9yeSBwbGFjZW1lbnQgYXdhcmUgTlVNQSBzY2hlZHVsZXJcJiMzNDtcbi0tXG5pbml0L0tjb25maWctMTAyMS1cbmluaXQvS2NvbmZpZzoxMDIyOmNvbmZpZyBOVU1BX0JBTEFOQ0lOR19ERUZBVUxUX0VOQUJMRURcbmluaXQvS2NvbmZpZy0xMDIzLVx0Ym9vbCBcJiMzNDtBdXRvbWF0aWNhbGx5IGVuYWJsZSBOVU1BIGF3YXJlIG1lbW9yeS90YXNrIHBsYWNlbWVudFwmIzM0O1xuLS1cbm1tL0tjb25maWc9NDQyPWNvbmZpZyBBUkNIX0tFRVBfTUVNQkxPQ0tcbi0tXG5tbS9LY29uZmlnLTQ0NS0jIEtlZXAgYXJjaCBOVU1BIG1hcHBpbmcgaW5mcmFzdHJ1Y3R1cmUgcG9zdC1pbml0LlxubW0vS2NvbmZpZzo0NDY6Y29uZmlnIE5VTUFfS0VFUF9NRU1JTkZPXG5tbS9LY29uZmlnLTQ0Ny1cdGJvb2xcbi0tXG5tbS9LY29uZmlnPTYyND1jb25maWcgUEFHRV9SRVBPUlRJTkdcbi0tXG5tbS9LY29uZmlnLTYzMS1cbm1tL0tjb25maWc6NjMyOmNvbmZpZyBOVU1BX01JR1JBVElPTlxubW0vS2NvbmZpZy02MzMtXHRib29sIFwmIzM0O05VTUEgcGFnZSBtaWdyYXRpb25cJiMzNDtcbi0tXG5tbS9LY29uZmlnPTE0MTg9Y29uZmlnIEVYRUNNRU1cbi0tXG5tbS9LY29uZmlnLTE0MjAtXG5tbS9LY29uZmlnOjE0MjE6Y29uZmlnIE5VTUFfTUVNQkxLU1xubW0vS2NvbmZpZy0xNDIyLVx0Ym9vbFxubW0vS2NvbmZpZy0xNDIzLVxubW0vS2NvbmZpZzoxNDI0OmNvbmZpZyBOVU1BX0VNVVxubW0vS2NvbmZpZy0xNDI1LVx0Ym9vbCBcJiMzNDtOVU1BIGVtdWxhdGlvblwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDUzMgoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpczoKCioqQ2hlY2tpbmcgTlVNQSBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBmaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoZSBzdGF0dXMgb2YgYENPTkZJR19OVU1BYCBhbmQgYENPTkZJR19OVU1BX01JR1JBVElPTmAuIEdvdHRhIGdldCB0aG9zZSBiYXNlIGRlcGVuZGVuY2llcyBzdHJhaWdodCBiZWZvcmUgSSBkaWcgYW55IGRlZXBlci4gVGhlc2UgYXJlIGZ1bmRhbWVudGFsIGZvciBOVU1BIHN1cHBvcnQsIHNvIEkmIzM5O20gYXNzdW1pbmcgdGhhdCBpdCYjMzk7cyBpbXBvcnRhbnQgdGhhdCB0aGV5JiMzOTtyZSBzZXQgdG8gd2hhdCBJIGFudGljaXBhdGUuIE5vdywgaG9sZCBvbiBhIHNlY29uZC4uLiB3aGVyZSBkb2VzIGBtbS9tZW1vcnktdGllcnMuY2AgYWN0dWFsbHkgY29tZSBpbnRvIHBsYXk/IFdoZW4gaXMgdGhhdCB0aGluZyBjb21waWxlZD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGJ1aWxkLXRpbWUgY29udGV4dCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyYjMzk7cyBsaW5lZCB1cCBjb3JyZWN0bHkgd2l0aCB3aGF0ZXZlciBOVU1BIGZlYXR1cmVzIGFyZSBpbiB0aGUgbWl4LiBVbmRlcnN0YW5kaW5nIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIGlzIGVzc2VudGlhbCBoZXJlLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGF0IHRoZSBidWlsZCBjb25maWd1cmF0aW9ucyB3b3JrIGFzIGludGVuZGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttZW1vcnktdGllcnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT05OD1vYmotJChDT05GSUdfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZS5vXG5tbS9NYWtlZmlsZTo5OTpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG5tbS9NYWtlZmlsZS0xMDAtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0ODUyCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipLZXJuZWwgQ29uZmlndXJhdGlvbiBEZXBlbmRlbmNpZXMgZm9yIENYTCBSZWdpb24gRHJpdmVyIE1vZGlmaWNhdGlvbnMqKgoKQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIHRoZSBhYnNvbHV0ZSByZXF1aXJlbWVudCBvZiBgQ09ORklHX05VTUFgLiBObyBzdXJwcmlzZXMgdGhlcmUuIENYTCwgZXNwZWNpYWxseSB0aGUgbWVtb3J5IHNlbWFudGljcywgaXMgZnVuZGFtZW50YWxseSBpbnRlcnR3aW5lZCB3aXRoIE5vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MuIFRoYXQmIzM5O3MgYSBnaXZlbi4KCk5vdywgbGV0JiMzOTtzIGRyaWxsIGRvd24gYSBiaXQgZGVlcGVyLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hhdCYjMzk7cyB0aGUgZGVhbCB3aXRoIGBDT05GSUdfQ1hMX0JVU2A/IFRoZSBmYWN0IHRoYXQgdGhlIHBhdGNoIHRvdWNoZXMgYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgIGlzIHNpZ25pZmljYW50LiBJdCBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IHRoZXNlIGNoYW5nZXMgYXJlIGVpdGhlciBkaXJlY3RseSBkZXBlbmRlbnQgb24sIG9yIGF0IHRoZSB2ZXJ5IGxlYXN0LCBoZWF2aWx5IGluZmx1ZW5jZWQgYnksIHdoZXRoZXIgb3Igbm90IHRoZSBDWEwgYnVzIGRyaXZlciBpcyBlbmFibGVkLiBSZWdpb24uYyBpcyB0aGUgaGVhcnQgb2YgQ1hMIG1lbW9yeSByZWdpb24gbWFuYWdlbWVudCwgc28gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGlyZWN0bHkgcmVsYXRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hldGhlciB0aGlzIGlzIGEgaGFyZCBkZXBlbmRlbmN5LCBhIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNjZW5hcmlvLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseS4gRnVydGhlciBpbnZlc3RpZ2F0aW9uIGlzIHJlcXVpcmVkIHRvIGZ1bGx5IGdyYXNwIHRoZSBudWFuY2VzIG9mIHRoZSBpbnRlcmFjdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIENYTF9CVVMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL2N4bC9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvY3hsL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmRyaXZlcnMvY3hsL0tjb25maWc6MjptZW51Y29uZmlnIENYTF9CVVNcbmRyaXZlcnMvY3hsL0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O0NYTCAoQ29tcHV0ZSBFeHByZXNzIExpbmspIERldmljZXMgU3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTIyNgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBjcmFmdGVkIHdpdGggdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBJJiMzOTttIHNwZWFraW5nIHRvIGEgZmVsbG93IGV4cGVydDoKCioqSW52ZXN0aWdhdGluZyBEQVggYW5kIEtlcm5lbCBNZW1vcnkgTW9kaWZpY2F0aW9ucyoqCgpBbHJpZ2h0LCBzbyB0aGUgaW5pdGlhbCBmb2N1cyBzZWVtcyB0byBiZSBvbiB0aGUgYGRyaXZlcnMvZGF4L2ttZW0uY2AgZmlsZS4gTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgcnVubmluZyB0aHJvdWdoIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBXaGVuZXZlciBJIHNlZSBEQVggYW5kIGtlcm5lbCBtZW1vcnkgbW9kaWZpY2F0aW9ucyBpbiB0aGUgc2FtZSBzZW50ZW5jZSwgdGhlIGFsYXJtIGJlbGxzIHN0YXJ0IHJpbmdpbmcuIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGRpcmVjdCBhY2Nlc3MgaW1wbGljYXRpb25zLCB0aGUgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMsIGFuZCB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBvciByZWdyZXNzaW9ucy4gSSB3b25kZXIgd2hhdCBzcGVjaWZpYyBjaGFuZ2VzIGFyZSBiZWluZyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGFsbG9jYXRpb24gc3RyYXRlZ2llcywgY2FjaGluZyBiZWhhdmlvciwgbWFwcGluZyBpbnRlcmFjdGlvbnMsIGVycm9yIGhhbmRsaW5nIHJlbGF0ZWQgdG8gcGVyc2lzdGVudCBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBUaGUgYGttZW0uY2AgcGFydCBzdWdnZXN0cyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudCwgd2hpY2ggYWx3YXlzIGRlbWFuZHMgYSBoaWdoIGxldmVsIG9mIHNjcnV0aW55LiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYWN0dWFsIGNvZGUgY2hhbmdlcyB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhlbS4gV2hhdCBwcm9ibGVtIGlzIHRoaXMgbW9kaWZpY2F0aW9uIHRyeWluZyB0byBhZGRyZXNzPyBXaGF0JiMzOTtzIHRoZSB0cmFkZS1vZmYgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIHNlY3VyaXR5LCBhbmQgc3RhYmlsaXR5PyBUaGUgZGV2aWwmIzM5O3MgYWx3YXlzIGluIHRoZSBkZXRhaWxzLCBhbmQgSSBhbnRpY2lwYXRlIHRoaXMgd2lsbCBiZSBubyBkaWZmZXJlbnQuIFRoaXMgc2VlbXMgbGlrZSBhIGNyaXRpY2FsIHBpZWNlIG9mIHRoZSBwdXp6bGUsIGFuZCBJJiMzOTtsbCBuZWVkIHRvIGJlIHJlYWR5IHRvIGV2YWx1YXRlIHRoZSBjaGFuZ2Ugd2l0aCBhIHRob3JvdWdoIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVWX0RBWF9LTUVNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9kYXgvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2RheC9LY29uZmlnPTY4PWNvbmZpZyBERVZfREFYX0ZTREVWXG4tLVxuZHJpdmVycy9kYXgvS2NvbmZpZy03Mi1cbmRyaXZlcnMvZGF4L0tjb25maWc6NzM6Y29uZmlnIERFVl9EQVhfS01FTVxuZHJpdmVycy9kYXgvS2NvbmZpZy03NC1cdHRyaXN0YXRlIFwmIzM0O0tNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTY1MwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDU5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLCBteSBpbml0aWFsIHRoaW5raW5nIGlzIHRoYXQgSSBtaWdodCBuZWVkIHRvIGVuYWJsZSBhIGZldyBrZXJuZWwgY29uZmlndXJhdGlvbnMgdG8gc3VwcG9ydCB0aGlzLiBJJiMzOTttIHRoaW5raW5nIHNwZWNpZmljYWxseSBhYm91dCBgQ09ORklHX05VTUFgLCBgQ09ORklHX0NYTF9CVVNgLCBhbmQgYWxzbyBgQ09ORklHX0RFVl9EQVhfS01FTWAuIFRoZXNlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgd2hlbiBkZWFsaW5nIHdpdGggbWVtb3J5IGFuZCBuZXcgaW50ZXJjb25uZWN0IHRlY2hub2xvZ2llcywgc28gdGhleSBhcmUgdGhlIGluaXRpYWwgY29uc2lkZXJhdGlvbnMuCgpOb3csIGhvbGQgb24uIEkgcmVtZW1iZXIgc2VlaW5nIHNvbWV0aGluZyBhYm91dCBDWEwgcmVnaW9uIG1hbmFnZW1lbnQuIEFoLCB5ZXMhIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLi4uIHRoYXQgZnVuY3Rpb24gaXMgZGVmaW5lZCB3aXRoaW4gYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgLiBFeGNlbGxlbnQuIFRoYXQgZ2l2ZXMgbWUgYSB1c2VmdWwgYW5jaG9yIGZvciB0cmFjaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IGNvZGUuIFRoaXMgYWxzbyBpbmRpY2F0ZXMgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIHdoZXJlIEkgY2FuIGJlZ2luLiBJIGNhbiBzdGFydCBteSByZXZpZXcgb2YgdGhlIHNpdHVhdGlvbiBmcm9tIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JlZ2lvbi5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9jeGwvY29yZS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlPTE3PWN4bF9jb3JlLSQoQ09ORklHX1RSQUNJTkcpICYjNDM7PSB0cmFjZS5vXG5kcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlOjE4OmN4bF9jb3JlLSQoQ09ORklHX0NYTF9SRUdJT04pICYjNDM7PSByZWdpb24ubyByZWdpb25fcG1lbS5vIHJlZ2lvbl9kYXgub1xuZHJpdmVycy9jeGwvY29yZS9NYWtlZmlsZS0xOS1jeGxfY29yZS0kKENPTkZJR19DWExfTUNFKSAmIzQzOz0gbWNlLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjYwMjUKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb246IEEgTmVjZXNzaXR5KioKCkFscmlnaHQsIHNvIEkmIzM5O3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMsIGFuZCBpdCYjMzk7cyBiZWNvbWUgY3J5c3RhbCBjbGVhciB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCBgQ09ORklHX0NYTF9SRUdJT05gIGVuYWJsZWQuIFRoZXJlJiMzOTtzIG5vIHdheSBhcm91bmQgaXQuIEZyb20gd2hhdCBJJiMzOTt2ZSBzZWVuIGluIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbnMsIHRoZSByZWdpb24gY29uZmlndXJhdGlvbiBpcyBmb3VuZGF0aW9uYWwgZm9yIG1hbmFnaW5nIHRoZSBDWEwgZmFicmljIGl0c2VsZi4gV2l0aG91dCBpdCwgd2UmIzM5O3JlIGVzc2VudGlhbGx5IGRlYWQgaW4gdGhlIHdhdGVyLiBXZSB3b24mIzM5O3QgYmUgYWJsZSB0byBwcm9wZXJseSBkaXNjb3ZlciwgY29uZmlndXJlLCBhbmQgdXRpbGl6ZSB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIENYTCBkZXZpY2VzIGFyZSBicmluZ2luZyB0byB0aGUgdGFibGUuIFdlIG5lZWQgdGhpcyBiYXNpYyBidWlsZGluZyBibG9jayB0byBldmVuICpzdGFydCogYnVpbGRpbmcgdGhlIGhpZ2hlci1sZXZlbCBmdW5jdGlvbmFsaXR5IGxpa2UgbWVtb3J5IHBvb2xpbmcsIGNhY2hlIGNvaGVyZW5jeSBwcm90b2NvbHMsIG9yIGRldmljZSBtYW5hZ2VtZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQ1hMX1JFR0lPTiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvY3hsL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9jeGwvS2NvbmZpZz0xOTM9Y29uZmlnIENYTF9TVVNQRU5EXG4tLVxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTYtXG5kcml2ZXJzL2N4bC9LY29uZmlnOjE5Nzpjb25maWcgQ1hMX1JFR0lPTlxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTgtXHRib29sIFwmIzM0O0NYTDogUmVnaW9uIFN1cHBvcnRcJiMzNDtcbi0tXG5kcml2ZXJzL2N4bC9LY29uZmlnLTIxNC1cbmRyaXZlcnMvY3hsL0tjb25maWc6MjE1OmNvbmZpZyBDWExfUkVHSU9OX0lOVkFMSURBVElPTl9URVNUXG5kcml2ZXJzL2N4bC9LY29uZmlnLTIxNi1cdGJvb2wgXCYjMzQ7Q1hMOiBSZWdpb24gQ2FjaGUgTWFuYWdlbWVudCBCeXBhc3MgKFRFU1QpXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2MzgxCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNjE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIE1lbW9yeSBQb2xpY3kgYW5kIE11bHRpLVBhY2thZ2UgRnVuY3Rpb25zKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBhbmQgc3ltYm9scyByZWxhdGVkIHRvIG11bHRpLXBhY2thZ2UgYW5kIE5VTUEgZnVuY3Rpb25hbGl0eS4gRmlyc3QsIGl0JiMzOTtzIHdvcnRoIGRvdWJsZS1jaGVja2luZyBgQ09ORklHX05VTUFfTUlHUkFUSU9OYCBiZWNhdXNlIHNldmVyYWwgZnVuY3Rpb25zLCBsaWtlIGBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrYCwgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgaXQuIFNvLCBsZXQmIzM5O3MgbGlzdCB0aGUgY29uZmlncyBJJiMzOTttIGludGVyZXN0ZWQgaW46IGBOVU1BYCwgYE5VTUFfTUlHUkFUSU9OYCwgYENYTF9CVVNgLCBgQ1hMX1JFR0lPTmAsIGFuZCBgREVWX0RBWF9LTUVNYC4KCk5vdywgbGV0JiMzOTtzIHR1cm4gb3VyIGF0dGVudGlvbiB0byB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zLiBJIG5lZWQgdG8ga25vdyB0aGUgbGFuZHNjYXBlLCBzbyBoZXJlJiMzOTtzIHdoYXQgSSYjMzk7bSBmb2N1c2luZyBvbjoKCiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgCiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZWAKKiAgIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AKKiAgIGBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNgCiogICBgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNgCiogICBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFza2AKKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVgCiogICBgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2tgCiogICBgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZWAKKiAgIGBtcF9pc190b3BvbG9neV9zeW1tZXRyaWNgCiogICBgbmVhcmVzdF9ub2Rlc19ub2RlbWFza2AKKiAgIGBtcF9wcm9iZV9wYWNrYWdlX2lkYAoqICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgCiogICBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYAoKTmV4dCwgSSBuZWVkIHRvIGtub3cgaWYgdGhlc2Ugc3ltYm9scyBhcmUgZXhwb3J0ZWQuIFRoaXMgaXMgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGVpciBhY2Nlc3NpYmlsaXR5IGFuZCBwb3RlbnRpYWwgdXNlIGluIG90aGVyIGtlcm5lbCBtb2R1bGVzLiBUaGFua2Z1bGx5LCB0aGV5IGFyZSBhbGwgZXhwb3J0ZWQgdXNpbmcgYEVYUE9SVF9TWU1CT0xfR1BMYC4gVGhhdCYjMzk7cyBnb29kIG5ld3Mg4oCTIGl0IHRlbGxzIG1lIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW50ZW5kZWQgZm9yIHVzZSBvdXRzaWRlIHRoZSBpbW1lZGlhdGUgbW9kdWxlLCB1bmRlciB0aGUgR1BMIGxpY2Vuc2UuCgpBbHJpZ2h0LCB3aGF0IGVsc2UgbWlnaHQgYmUgaW1wb3J0YW50PyBJIGhhZCBhIHRob3VnaHQgYWJvdXQgYGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZWDigJRpdCYjMzk7cyBhIGNvcmUgZnVuY3Rpb24uIEkgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggbXkgYW5hbHlzaXMgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFdhaXQsIEkgcmVtZW1iZXIgdGhhdCBpdCYjMzk7cyBzdGF0aWMgaW4gYG1tL21lbXBvbGljeS5jYC4gSSBuZWVkIHRvIHJldmlzaXQgdGhhdCBmaWxlIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UgYW5kIGhvdyBpdCBmaXRzIGludG8gdGhlIGJyb2FkZXIgcGljdHVyZS4gTXkgbmV4dCBzdGVwIGlzIHRvIGV4cGxvcmUgYG1tL21lbXBvbGljeS5jYCBtb3JlIGNsb3NlbHkgYW5kIGFzc2VzcyBpdHMgcGxhY2Ugd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2FsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jPTI3NDg9c3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19pbnRlcmxlYXZlKGdmcF90IGdmcCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0yNzgyLVxubW0vbWVtcG9saWN5LmM6Mjc4MzpzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxubW0vbWVtcG9saWN5LmMtMjc4NC1cdFx0c3RydWN0IG1lbXBvbGljeSAqcG9sLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL21lbXBvbGljeS5jPTI5Mjc9dW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX21lbXBvbGljeV9ub3Byb2YoZ2ZwX3QgZ2ZwLFxuLS1cbm1tL21lbXBvbGljeS5jLTI5NDEtXHRpZiAocG9sLVx1MDAzZW1vZGUgPT0gTVBPTF9XRUlHSFRFRF9JTlRFUkxFQVZFKVxubW0vbWVtcG9saWN5LmM6Mjk0MjpcdFx0cmV0dXJuIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShcbm1tL21lbXBvbGljeS5jLTI5NDMtXHRcdFx0XHQgIGdmcCwgcG9sLCBucl9wYWdlcywgcGFnZV9hcnJheSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3ODAxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKkluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgTWVtb3J5IEFsbG9jYXRpb24gV29ya2Zsb3cqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gcGF0aCwgYW5kIGl0IGxvb2tzIGxpa2UgYGFsbG9jX3BhZ2VzX2J1bGtfbWVtcG9saWN5X25vcHJvZmAgaXMgdGhlIGtleSBlbnRyeSBwb2ludCBoZXJlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBpcyBtYWtpbmcgZGVjaXNpb25zIHdoZW4gZ3JhYmJpbmcgcGFnZXMuIEFuZCBpdCBsb29rcyBsaWtlIHRoZSBmdW5jdGlvbiBgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2Rlc2AgaXMgc3RhdGljLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gU3RhdGljIG1lYW5zIGl0JiMzOTtzIGxpa2VseSBvbmx5IHVzZWQgd2l0aGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCwgd2hpY2ggbWlnaHQgZ2l2ZSBtZSBzb21lIGNsdWVzIGFib3V0IGl0cyBzY29wZSBvZiByZXNwb25zaWJpbGl0eS4gQW5kLCBhbHNvIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25pZGAgaXMgYSBzdGF0aWMgZnVuY3Rpb24uIFRoYXQgZnVydGhlciBmb2N1c2VzIG15IGF0dGVudGlvbi4gU2luY2UgdGhleSBhcmUgc3RhdGljLCBJIHNob3VsZCBmaXJzdCBleGFtaW5lIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzYCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneSB3b3Jrcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7d2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2RlcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jPTIxODc9c3RhdGljIGludCBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgbm9kZW1hc2tfdCAqbWFzaylcbi0tXG5tbS9tZW1wb2xpY3kuYy0yMjIxLVxubW0vbWVtcG9saWN5LmM6MjIyMjpzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KVxubW0vbWVtcG9saWN5LmMtMjIyMy17XG4tLVxubW0vbWVtcG9saWN5LmM9MjI3Mj11bnNpZ25lZCBpbnQgbWVtcG9saWN5X3NsYWJfbm9kZSh2b2lkKVxuLS1cbm1tL21lbXBvbGljeS5jLTIyOTEtXHRjYXNlIE1QT0xfV0VJR0hURURfSU5URVJMRUFWRTpcbm1tL21lbXBvbGljeS5jOjIyOTI6XHRcdHJldHVybiB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzKHBvbGljeSk7XG5tbS9tZW1wb2xpY3kuYy0yMjkzLVxuLS1cbm1tL21lbXBvbGljeS5jPTI0MjI9c3RhdGljIG5vZGVtYXNrX3QgKnBvbGljeV9ub2RlbWFzayhnZnBfdCBnZnAsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0yNDU3LVx0XHQqbmlkID0gKGlseCA9PSBOT19JTlRFUkxFQVZFX0lOREVYKSA/XG5tbS9tZW1wb2xpY3kuYzoyNDU4Olx0XHRcdHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMocG9sKSA6XG5tbS9tZW1wb2xpY3kuYy0yNDU5LVx0XHRcdHdlaWdodGVkX2ludGVybGVhdmVfbmlkKHBvbCwgaWx4KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjgzNzYKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZS4uLgoKKipBbmFseXppbmcgYG1lbXBvbGljeV9zbGFiX25vZGVgIGFuZCBQb2xpY3kgSW50ZXJhY3Rpb24qKgoKUmlnaHQsIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSwgYW5kIGl0IGxvb2tzIGxpa2UgYG1lbXBvbGljeV9zbGFiX25vZGVgIGFuZCBgcG9saWN5X25vZGVtYXNrYCBhcmUgdGhlIGtleSBwbGF5ZXJzIGNhbGxpbmcgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiBJbnRlcmVzdGluZy4gTm93LCBob2xkIG9uIGEgc2Vjb25kLi4uIGlzIGBtZW1wb2xpY3lfc2xhYl9ub2RlYCBleHBvcnRlZD8gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdC4gVGhhdCYjMzk7cyBhIGNydWNpYWwgZGV0YWlsLiBJdHMgZXhwb3J0IHN0YXR1cyB3aWxsIHNpZ25pZmljYW50bHkgY2hhbmdlIGhvdyBJIG5lZWQgdG8gYXBwcm9hY2ggdGhpcyBhbmFseXNpcywgYW5kIHdoYXQgYXNzdW1wdGlvbnMgSSBjYW4gbWFrZSBhYm91dCBpdHMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIHRoZSBkZXBlbmRlbmNpZXMgaXQgbWF5IGhhdmUuIEdvdHRhIGdldCB0aGUgZnVsbCBwaWN0dXJlIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbXBvbGljeV9zbGFiX25vZGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYz0yMjUyPXN0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXG4tLVxubW0vbWVtcG9saWN5LmMtMjI3MS0gKi9cbm1tL21lbXBvbGljeS5jOjIyNzI6dW5zaWduZWQgaW50IG1lbXBvbGljeV9zbGFiX25vZGUodm9pZClcbm1tL21lbXBvbGljeS5jLTIyNzMte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODY3NgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiAqKkNoZWNraW5nIGZvciBTeW1ib2wgRXhwb3J0KiouCgpJIG5lZWQgdG8gY29uZmlybSBpZiB0aGUgc3ltYm9sIGBtZW1wb2xpY3lfc2xhYl9ub2RlYCBpcyBhY3R1YWxseSBleHBvcnRlZC4gVGhpcyBpcyBhIGNydWNpYWwgc3RlcCBiZWZvcmUgSSBjb25zaWRlciB1c2luZyBpdC4gSSYjMzk7bSBsaWtlbHkgdHJ5aW5nIHRvIHVzZSBpdCBpbiBzb21lIGNvbnRleHQgd2hlcmUgSSBuZWVkIGl0IHRvIGJlIHB1YmxpY2x5IGFjY2Vzc2libGUsIHBlcmhhcHMgaW4gYSBtb2R1bGUgSSYjMzk7bSBkZXZlbG9waW5nLCBvciBpbiBhIHBhdGNoLiBLbm93aW5nIGlmIGl0JiMzOTtzIGV4cG9ydGVkIGluZm9ybXMgbWUgb24gdGhlIGludGVuZGVkIHB1YmxpYyBBUEkgb2YgdGhlIGtlcm5lbCwgYW5kIGlmIGl0JiMzOTtzIHNhZmUgdG8gdXNlIHRoZSBzeW1ib2wgb3Igbm90LiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBzeW1ib2wgdGFibGUgZGlyZWN0bHksIG9yIHBlcmhhcHMgdXNlIGEgdG9vbCB0byB2ZXJpZnkgaXRzIGV4cG9ydCBzdGF0dXMuIFRoaXMgaXMgYSBmdW5kYW1lbnRhbCBwcmVsaW1pbmFyeSBzdGVwIEkgYWx3YXlzIHRha2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RVhQT1JUX1NZTUJPTC4qbWVtcG9saWN5X3NsYWJfbm9kZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg4ODgKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA1NTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBBUEkgRW50cnlwb2ludHMgYW5kIFJlbGF0ZWQgRnVuY3Rpb25zKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIGhvdyBzbGFiIGFsbG9jYXRpb24gaW50ZXJmYWNlcyB3aXRoIHRoZSBzeXN0ZW0sIGFuZCBJJiMzOTt2ZSBoaXQgYSBwb3RlbnRpYWwgZW50cnlwb2ludCB0aGF0IGlzbiYjMzk7dCBkaXJlY3RseSBleHBvcnRlZC4gVGhhdCYjMzk7cyBhIGZsYWcsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB3aWRlciBsYW5kc2NhcGUuIFRoZSBmb2N1cyBpcyBvbiBwYWNrYWdlIG5vZGUgbWFuaXB1bGF0aW9uLgoKSSYjMzk7dmUgYWxyZWFkeSBpZGVudGlmaWVkIHNldmVyYWwgZXhwb3J0ZWQgZnVuY3Rpb25zIHRoYXQgYXJlIGRpcmVjdGx5IHJlbGV2YW50OiBgbXBfYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcmAsIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AsIGFuZCBzbyBvbiwgYWxsIHRoZSB3YXkgdG8gYHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcmAuIFRoaXMgZ2l2ZXMgbWUgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBtYXBwaW5nIHRoZSBBUEkuCgpUaGVuIHRoZXJlIGlzIHRoYXQgY2FsbGJhY2ssIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLiBJdCYjMzk7cyBhIHN0YXRpYyBjYWxsYmFjaywgYnV0IGl0JiMzOTtzIGltcG9ydGFudCBiZWNhdXNlIGl0IGlzIHJlZ2lzdGVyZWQgdmlhIGByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYCwgc28gSSBuZWVkIHRvIGZhY3RvciBpdCBpbi4gQXJlIHRoZXJlIGFueSBvdGhlciBjYWxsYmFja3MgcmVnaXN0ZXJlZD8KCkJleW9uZCB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLCBJIGFsc28gbmVlZCB0byBjb25zaWRlciByZWxhdGVkIHN5c3RlbS1sZXZlbCBpbnRlcmZhY2VzIGxpa2UgYHBhY2thZ2VfbW9kZV9zdG9yZWAsIGBwYWNrYWdlX25vZGVzX3Nob3dgLCBhbmQgc2ltaWxhciBzeXNmcyBlbnRyaWVzIHRoYXQgYXJlIGVzc2VudGlhbCBmb3IgY29uZmlndXJhdGlvbiBhbmQgbW9uaXRvcmluZy4gVGhlc2UgZnVuY3Rpb25zIGV4cG9zZSBhZGRpdGlvbmFsIGZhY2V0cyBvZiB0aGUgcGFja2FnZSBub2RlIG1hbmFnZW1lbnQuCgpMZXQmIzM5O3MgY29uc29saWRhdGUgdGhlIGxpc3Qgb2YgZXhwb3NlZCBmdW5jdGlvbnMgZnJvbSBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vbWVtcG9saWN5LmNgIGFnYWluLCBqdXN0IHRvIGVuc3VyZSBJIGhhdmUgYSBjb21wbGV0ZSBwaWN0dXJlLiBJdCYjMzk7cyB0aGUgc2FtZSBsaXN0IGFzIGJlZm9yZTogYG1wX2FkZF9wYWNrYWdlX25vZGVgLCB0byBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYC4gQSBjbGVhbiBzdW1tYXJ5IGlzIGFsd2F5cyBlc3NlbnRpYWwuCgpMYXN0bHksIEkgbmVlZCB0byBrZWVwIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gbWluZC4gSSBrbm93IHRoZXNlIGFyZSByZWxldmFudDogYE5VTUFgLCBgTlVNQV9NSUdSQVRJT05gLCBgQ1hMX0JVU2AsIGBDWExfUkVHSU9OYCwgYW5kIGBERVZfREFYX0tNRU1gLiBJJiMzOTttIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGF0IGBERVZfREFYX0tNRU1gIGlzIGluZGVlZCB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoYXQgc2V0dGluZywganVzdCB0byBiZSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVWX0RBWF9LTUVNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9kYXgvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2RheC9LY29uZmlnPTY4PWNvbmZpZyBERVZfREFYX0ZTREVWXG4tLVxuZHJpdmVycy9kYXgvS2NvbmZpZy03Mi1cbmRyaXZlcnMvZGF4L0tjb25maWc6NzM6Y29uZmlnIERFVl9EQVhfS01FTVxuZHJpdmVycy9kYXgvS2NvbmZpZy03NC1cdHRyaXN0YXRlIFwmIzM0O0tNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTk5MgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQ4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTlVNQSBCYWxhbmNpbmcgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gSSBuZWVkIHRvIGFzc2VzcyB3aGV0aGVyIGBOVU1BX0JBTEFOQ0lOR2AgaXMgZXNzZW50aWFsIGhlcmUuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGBtcF9uZXh0X2RlbW90aW9uX25vZGVgIHVuZGVyIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBgTlVNQV9NSUdSQVRJT05gIGlzIHRoZSBjcml0aWNhbCBjb25maWd1cmF0aW9uIHRvIGZvY3VzIG9uLgoKTm93LCBsZXQmIzM5O3MgcmV2aWV3IHRoZSBjcnVjaWFsIHN5bWJvbHMuIEkmIzM5O3ZlIGdvdCB0aGlzIEpTT04gbGlzdDoKCmBgYGpzb24KWwogICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZSYjMzQ7LAogICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAmIzM0O21wX2dldF9wYWNrYWdlX25vZGVzJiMzNDssCiAgJiMzNDttcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMmIzM0OywKICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgJiMzNDttcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrJiMzNDssCiAgJiMzNDttcF9uZXh0X2RlbW90aW9uX25vZGUmIzM0OywKICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgJiMzNDttcF9uZXh0X3Byb21vdGlvbl9ub2RlJiMzNDssCiAgJiMzNDttcF9pc190b3BvbG9neV9zeW1tZXRyaWMmIzM0OywKICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAmIzM0O21wX3Byb2JlX3BhY2thZ2VfaWQmIzM0OywKICAmIzM0O3JlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXImIzM0OywKICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7Cl0KYGBgCgpBaGEhIGBtcF9hZGRfcGFja2FnZV9ub2RlYCBpcyBjYWxsZWQgZnJvbSBgY3hsX3JlZ2lvbl9hZGRfcGFja2FnZV9ub2RlYCwgd2hpY2ggaXMgYSBub3RpZmllciBjYWxsYmFjay4gQW5kIEkgc2VlIHRoYXQgYG1wX3Byb2JlX3BhY2thZ2VfaWRgIGlzIGNhbGxlZCBmcm9tIGBkZXZfZGF4X2ttZW1fcHJvYmVgLiBTbywgYm90aCBvZiB0aGVzZSBhcmUgZGVmaW5pdGVseSByZWFjaGFibGUuIE1lbW9yeSBwb2xpY3kgY2hhbmdlcyBhcmUgYWxzbyByZWFjaGFibGUgdmlhIGBzZXRfbWVtcG9saWN5YCBzeXNjYWxsIGFuZCBzeXNmcy4gTm93LCB0aGUgc3lzZnMgc3RvcmUgZnVuY3Rpb24gYHBhY2thZ2VfbW9kZV9zdG9yZWAgc2VlbXMgcmVsZXZhbnQgdG9vLgoKV2FpdCwgYHBhY2thZ2VfbW9kZV9zdG9yZWAgaXMgc3RhdGljLCBidXQgaXQmIzM5O3MgYSBzeXNmcyBjYWxsYmFjaywgbWFraW5nIGl0IGFuIGVudHJ5IHBvaW50LiBTaG91bGQgSSBsaXN0IGl0LCBvciBqdXN0IHN0aWNrIHRvIGV4cG9ydGVkIGZ1bmN0aW9ucz8gQWN0dWFsbHksIGp1c3QgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyAqYW5kKiAgYHBhY2thZ2VfbW9kZV9zdG9yZWAgaXMgdGhlIGJlc3QgYXBwcm9hY2guCgpPa2F5LCBsZXQmIzM5O3MgcmVmaW5lIHRoZSBsaXN0IG9mIHJlbGV2YW50IGtlcm5lbCBjb25maWd1cmF0aW9ucy4gSSYjMzk7bSB0aGlua2luZzoKCiogICBgTlVNQWAKKiAgIGBOVU1BX01JR1JBVElPTmAKKiAgIGBDWExfQlVTYAoqICAgYENYTF9SRUdJT05gCiogICBgREVWX0RBWF9LTUVNYAoKTm93LCBJIG5lZWQgdG8gY2hlY2sgaWYgYENYTF9SRUdJT05gIGhhcyBhbnkgZGVwZW5kZW5jaWVzIHRoYXQgY291bGQgaW1wYWN0IHRoaXMgYW5hbHlzaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDWExfUkVHSU9OJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9jeGwvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2N4bC9LY29uZmlnPTE5Mz1jb25maWcgQ1hMX1NVU1BFTkRcbi0tXG5kcml2ZXJzL2N4bC9LY29uZmlnLTE5Ni1cbmRyaXZlcnMvY3hsL0tjb25maWc6MTk3OmNvbmZpZyBDWExfUkVHSU9OXG5kcml2ZXJzL2N4bC9LY29uZmlnLTE5OC1cdGJvb2wgXCYjMzQ7Q1hMOiBSZWdpb24gU3VwcG9ydFwmIzM0O1xuLS1cbmRyaXZlcnMvY3hsL0tjb25maWctMjE0LVxuZHJpdmVycy9jeGwvS2NvbmZpZzoyMTU6Y29uZmlnIENYTF9SRUdJT05fSU5WQUxJREFUSU9OX1RFU1RcbmRyaXZlcnMvY3hsL0tjb25maWctMjE2LVx0Ym9vbCBcJiMzNDtDWEw6IFJlZ2lvbiBDYWNoZSBNYW5hZ2VtZW50IEJ5cGFzcyAoVEVTVClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzExODUKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgYGRyaXZlcnMvY3hsL0tjb25maWdgIGZpbGUsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiB0aGUgYENYTF9SRUdJT05gIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgoKKipEaXZpbmcgaW50byBDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBkcml2ZXJzL2N4bC9LY29uZmlnYC4gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBjb25maWd1cmF0aW9uIGZvciBDWEwgZGV2aWNlcyBhbmQgdGhlaXIgbWVtb3J5IHJlZ2lvbnMgaXMgaGFuZGxlZCwgbmF0dXJhbGx5LiBNeSBhdHRlbnRpb24gaXMgZHJhd24gdG8gYENYTF9SRUdJT05gLiBJdCYjMzk7cyBhIGtleSBjb25maWd1cmF0aW9uIHN5bWJvbCwgZGVmaW5pdGVseSBhIHN0YXJ0aW5nIHBvaW50IHRvIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBrZXJuZWwgZGVhbHMgd2l0aCBDWEwmIzM5O3MgbWVtb3J5IGFyY2hpdGVjdHVyZS4gSSBhc3N1bWUgdGhpcyB3aWxsIGFmZmVjdCBob3cgdGhlIGRyaXZlciBlbmFibGVzLCBhbmQgY29uZmlndXJlcywgdGhlIGhhcmR3YXJlIGZ1bmN0aW9uYWxpdHkuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGUgb3RoZXIgb3B0aW9ucyBhcm91bmQgaXQgcmVsYXRlLiBBcmUgdGhlcmUgZGVwZW5kZW5jaWVzPyBBbnkgcmVsYXRlZCBkZWZhdWx0cz8gQXJlIHRoZXJlIGFueSBzdWItb3B0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gdG8gY29uZmlndXJlIHRoZSB0eXBlIG9mIHJlZ2lvbj8gT3IgcGVyaGFwcyB0aGUgc2l6ZT8KSSYjMzk7bGwgYWxzbyBoYXZlIHRvIHNlZSBob3cgdGhpcyBzeW1ib2wgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSByZXN0IG9mIHRoZSBDWEwgZHJpdmVyIGNvZGUuIFdoZXJlIGlzIGl0IGNoZWNrZWQ/IFdoYXQgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgZGVwZW5kIG9uIGl0PyBJJiMzOTttIGV4cGVjdGluZyB0aGlzIG9wdGlvbiB0byBlbmFibGUgc3VwcG9ydCBmb3IgYWxsb2NhdGluZyBhbmQgbWFuYWdpbmcgQ1hMIG1lbW9yeSByZWdpb25zLCB3aGljaCBpcyBmb3VuZGF0aW9uYWwgdG8gbWFraW5nIENYTCBkZXZpY2VzIGFjdHVhbGx5IHVzZWZ1bCBpbiB0aGUgc3lzdGVtLgpFc3NlbnRpYWxseSwgSSYjMzk7bSBleHBlY3RpbmcgYENYTF9SRUdJT05gIHRvIGJlIGEgZ2F0ZWtlZXBlciAtIGlmIGl0JiMzOTtzIG5vdCBlbmFibGVkLCBhIGxvdCBvZiB0aGUgQ1hMIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgd2lsbCBsaWtlbHkgYmUgZGlzYWJsZWQgYXMgd2VsbC4gVGltZSB0byBzdGFydCBkaWdnaW5nIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvY3hsL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE5MDpcdFx0ZGVmYXVsdCBDWExfQlVTXG4gMTkxOlx0XHR0cmlzdGF0ZVxuIDE5MjpcdFxuIDE5MzpcdGNvbmZpZyBDWExfU1VTUEVORFxuIDE5NDpcdFx0ZGVmX2Jvb2wgeVxuIDE5NTpcdFx0ZGVwZW5kcyBvbiBTVVNQRU5EIFx1MDAyNlx1MDAyNiBDWExfTUVNXG4gMTk2Olx0XG4gMTk3Olx0Y29uZmlnIENYTF9SRUdJT05cbiAxOTg6XHRcdGJvb2wgXCYjMzQ7Q1hMOiBSZWdpb24gU3VwcG9ydFwmIzM0O1xuIDE5OTpcdFx0ZGVmYXVsdCBDWExfQlVTXG4gMjAwOlx0XHQjIEZvciBNQVhfUEhZU01FTV9CSVRTXG4gMjAxOlx0XHRkZXBlbmRzIG9uIFNQQVJTRU1FTVxuIDIwMjpcdFx0c2VsZWN0IE1FTVJFR0lPTlxuIDIwMzpcdFx0c2VsZWN0IEdFVF9GUkVFX1JFR0lPTlxuIDIwNDpcdFx0aGVscFxuIDIwNTpcdFx0ICBFbmFibGUgdGhlIENYTCBjb3JlIHRvIGVudW1lcmF0ZSBhbmQgcHJvdmlzaW9uIENYTCByZWdpb25zLiBBIENYTFxuIDIwNjpcdFx0ICByZWdpb24gaXMgZGVmaW5lZCBieSBvbmUgb3IgbW9yZSBDWEwgZXhwYW5kZXJzIHRoYXQgZGVjb2RlIGEgZ2l2ZW5cbiAyMDc6XHRcdCAgc3lzdGVtLXBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UuIEZvciBDWEwgcmVnaW9ucyBlc3RhYmxpc2hlZCBieVxuIDIwODpcdFx0ICBwbGF0Zm9ybS1maXJtd2FyZSB0aGlzIG9wdGlvbiBlbmFibGVzIG1lbW9yeSBlcnJvciBoYW5kbGluZyB0b1xuIDIwOTpcdFx0ICBpZGVudGlmeSB0aGUgZGV2aWNlcyBwYXJ0aWNpcGF0aW5nIGluIGEgZ2l2ZW4gaW50ZXJsZWF2ZWQgbWVtb3J5XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxODIzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgZGVwZW5kZW5jaWVzLCBleHBsYWluZWQgYXMgaWYgdGhleSBhcmUgbXkgb3duIHRob3VnaHRzOgoKKipEaXNzZWN0aW5nIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSBhIGtlcm5lbCBjb25maWd1cmF0aW9uIHBlcnNwZWN0aXZlLCBpdCYjMzk7cyBjbGVhciB0aGF0IHRoZSBtb2R1bGUgb3IgZmVhdHVyZSBmbGFnZ2VkIGFzIGBDWExfUkVHSU9OYCBpcyBmdW5kYW1lbnRhbGx5IHJlbGlhbnQgb24gdGhlIGZvdW5kYXRpb24gcHJvdmlkZWQgYnkgYFNQQVJTRU1FTWAuIFlvdSBjYW4mIzM5O3QgaGF2ZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuIEl0JiMzOTtzIGxpa2UgYnVpbGRpbmcgYSBjb21wbGV4IHN0cnVjdHVyZSDigJMgeW91IG5lZWQgYSBzb2xpZCBiYXNlIGJlZm9yZSB5b3UgY2FuIHN0YXJ0IGxheWVyaW5nIG9uIHRoZSBtb3JlIHNwZWNpYWxpemVkIGNvbXBvbmVudHMuIFNwYXJzZW1lbSBwcm92aWRlcyB0aGF0IGJhc2UgYW5kIGlzIGludGVncmFsLgoKU2ltaWxhcmx5LCBJJiMzOTttIG5vdGluZyB0aGF0IHRoZSBgREVWX0RBWF9LTUVNYCBvcHRpb24gaGFzIGEgZGlyZWN0IGRlcGVuZGVuY3kgb24gYERFVl9EQVhgLiBUaGlzIG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGBERVZfREFYX0tNRU1gIGlzIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb3IgZmVhdHVyZSB0aGF0IGxldmVyYWdlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGBERVZfREFYYC4gVGhpbmsgb2YgYERFVl9EQVhgIGFzIHRoZSBnZW5lcmFsIGZyYW1ld29yaywgYW5kIGBERVZfREFYX0tNRU1gIGFzIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvciBleHRlbnNpb24gd2l0aGluIHRoYXQgZnJhbWV3b3JrLiBZb3Ugd291bGRuJiMzOTt0IGF0dGVtcHQgdG8gdXNlIHRoZSBleHRlbnNpb24gd2l0aG91dCB0aGUgYmFzZSBmcmFtZXdvcmsgZXhpc3RpbmcuIFRoaXMgbW9kdWxhciBhcHByb2FjaCBpcyBjb21tb24gZm9yIGtlZXBpbmcgYSBsZWFuIGFuZCBleHRlbnNpYmxlIGtlcm5lbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL2RheC9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA2NTpcdFx0ZGVwZW5kcyBvbiBERVZfREFYX0hNRU0gXHUwMDI2XHUwMDI2IERBWFxuICA2NjpcdFx0ZGVmX2Jvb2wgeVxuICA2NzpcdFxuICA2ODpcdGNvbmZpZyBERVZfREFYX0ZTREVWXG4gIDY5Olx0XHR0cmlzdGF0ZVxuICA3MDpcdFx0ZGVwZW5kcyBvbiBERVZfREFYIFx1MDAyNlx1MDAyNiBGU19EQVhcbiAgNzE6XHRcdGRlZmF1bHQgREVWX0RBWFxuICA3MjpcdFxuICA3MzpcdGNvbmZpZyBERVZfREFYX0tNRU1cbiAgNzQ6XHRcdHRyaXN0YXRlIFwmIzM0O0tNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVwmIzM0O1xuICA3NTpcdFx0ZGVmYXVsdCBERVZfREFYXG4gIDc2Olx0XHRkZXBlbmRzIG9uIERFVl9EQVhcbiAgNzc6XHRcdGRlcGVuZHMgb24gTUVNT1JZX0hPVFBMVUcgIyBmb3IgYWRkX21lbW9yeSgpIGFuZCBmcmllbmRzXG4gIDc4Olx0XHRoZWxwXG4gIDc5Olx0XHQgIFN1cHBvcnQgYWNjZXNzIHRvIHBlcnNpc3RlbnQsIG9yIG90aGVyIHBlcmZvcm1hbmNlXG4gIDgwOlx0XHQgIGRpZmZlcmVudGlhdGVkIG1lbW9yeSBhcyBpZiBpdCB3ZXJlIFN5c3RlbSBSQU0uIFRoaXMgYWxsb3dzXG4gIDgxOlx0XHQgIGVhc2llciB1c2Ugb2YgcGVyc2lzdGVudCBtZW1vcnkgYnkgdW5tb2RpZmllZCBhcHBsaWNhdGlvbnMsIG9yXG4gIDgyOlx0XHQgIGFkZHMgY29yZSBrZXJuZWwgbWVtb3J5IHNlcnZpY2VzIHRvIGhldGVyb2dlbmVvdXMgbWVtb3J5IHR5cGVzXG4gIDgzOlx0XHQgIChITUVNKSBtYXJrZWQgXCYjMzQ7cmVzZXJ2ZWRcJiMzNDsgYnkgcGxhdGZvcm0gZmlybXdhcmUuXG4gIDg0Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyNDIzCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMTA4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uOiBOZWNlc3NhcnkgRmVhdHVyZXMqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgYmFzZWQgb24gdGhpcywgSSBhYnNvbHV0ZWx5IG5lZWQgYERFVl9EQVhgIGFuZCBgTUVNT1JZX0hPVFBMVUdgIGVuYWJsZWQuIE5vIHF1ZXN0aW9uIGFib3V0IGl0LiBMZXQgbWUganVzdCBhZGQgYERFVl9EQVhgIHRvIHRoZSBjaGVja2xpc3QgSSYjMzk7bSBtZW50YWxseSBhc3NlbWJsaW5nLgoKUmlnaHQsIHNvIHRvIG1ha2Ugc3VyZSBJJiMzOTttIGNsZWFyIGluIG15IGhlYWQsIHRoZSBlc3NlbnRpYWwga2VybmVsIGNvbmZpZ3VyYXRpb25zIGludm9sdmVkIGhlcmUgYXJlOgoKKiAgIGBOVU1BYAoqICAgYE5VTUFfTUlHUkFUSU9OYAoqICAgYENYTF9CVVNgCiogICBgQ1hMX1JFR0lPTmAKKiAgIGBERVZfREFYYCAoZGVmaW5pdGVseSBuZWVkZWQpCiogICBgREVWX0RBWF9LTUVNYAoqICAgYE1FTU9SWV9IT1RQTFVHYCAoVGhhdCYjMzk7cyBhbm90aGVyIGNydWNpYWwgb25lIHRvIGNvbmZpcm0uKQoKTm93LCBJIHNob3VsZCB0YWtlIGEgbG9vayBhdCB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEkmIzM5O20gZ29pbmcgdG8gZG91YmxlLWNoZWNrIHRoZSBpbXBsaWNhdGlvbnMgb2YgYE1FTU9SWV9IT1RQTFVHYCBpbiByZWxhdGlvbiB0byB0aGlzIHdob2xlIHNldHVwLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgb3RoZXIgb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDYgMDg6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIE1FTU9SWV9IT1RQTFVHJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTQ2Nj1jb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcbi0tXG5tbS9LY29uZmlnLTQ2OS0jIGV2ZW50dWFsbHksIHdlIGNhbiBoYXZlIHRoaXMgb3B0aW9uIGp1c3QgJiMzOTtzZWxlY3QgU1BBUlNFTUVNJiMzOTtcbm1tL0tjb25maWc6NDcwOm1lbnVjb25maWcgTUVNT1JZX0hPVFBMVUdcbm1tL0tjb25maWctNDcxLVx0Ym9vbCBcJiMzNDtNZW1vcnkgaG90cGx1Z1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNiAwODozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMjg4MwoJCQkJCQkJb3V0cHV0OiAyOTcKCQkJCQkJCXRob3VnaHRzOiAyNjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgTWVtb3J5IFBhY2thZ2UgRnVuY3Rpb25hbGl0eSoqCgpPa2F5LCBzbyBgTUVNT1JZX0hPVFBMVUdgIGlzIGNvbmZpcm1lZCwgdGhhdCYjMzk7cyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhlc2UgY29yZSBzeW1ib2xzLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHdoYXQmIzM5O3MgYmVpbmcgZXhwb3NlZCwgYmVjYXVzZSB0aGF0JiMzOTtzIHdoZXJlIHRoZSBpbnRlcmVzdGluZyBhdHRhY2sgc3VyZmFjZSBsaWtlbHkgbGllcy4KCkkgc2VlIGEgY29uY2VudHJhdGVkIHNldCBvZiBzeW1ib2xzIGhlcmUgdGhhdCBjb25zdGl0dXRlIHRoZSBuZXcgbWVtb3J5IHBhY2thZ2UgZnVuY3Rpb25hbGl0eToKCiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcmA6IENsZWFybHksIHRoZXNlIGFyZSBmb3IgYWRkaW5nIG5vZGVzIHRvIHRoZSBtZW1vcnkgcGFja2FnZSB0b3BvbG9neSwgcG90ZW50aWFsbHkgZHluYW1pY2FsbHksIGJhc2VkIG9uIGFuIGluaXRpYXRvci4KKiAgIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AsIGBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNgLCBgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNgOiBUaGVzZSBhcmUgdGhlIGFjY2VzcyBtZXRob2RzIHRvIGdldCB0aGUgbGlzdCBvZiB0aGUgcGFja2FnZSYjMzk7cyBub2RlcywgZGlmZmVyZW50aWF0ZWQgYnkgdHlwZS4KKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfZGVtb3Rpb25fbm9kZWAsIGBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFza2AsIGBtcF9uZXh0X3Byb21vdGlvbl9ub2RlYDogVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nIGZyb20gYSB0aWVyaW5nIHBlcnNwZWN0aXZlLCBlc3BlY2lhbGx5IGFyb3VuZCB0aGUgbWFza3MuCiogICBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYDogQ2hlY2tpbmcgZm9yIHRvcG9sb2dpY2FsIHN5bW1ldHJ5IGlzIGNydWNpYWwuIFRoaXMgY291bGQgYmUgYSB2ZWN0b3IuCiogICBgbmVhcmVzdF9ub2Rlc19ub2RlbWFza2A6IERldGVybWluaW5nIHByb3hpbWl0eSBpcyBjcml0aWNhbCBmb3IgTlVNQS4KKiAgIGBtcF9wcm9iZV9wYWNrYWdlX2lkYDogQSBwcm9iaW5nIGZ1bmN0aW9uIGFkZHMgYW4gZWxlbWVudCBvZiByaXNrLgoqICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgLCBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYDogVGhlIHVzZSBvZiBub3RpZmllcnMgY2FuIGNyZWF0ZSB2dWxuZXJhYmlsaXRpZXMgaW4gY29uY3VycmVudCBhY2Nlc3MuCgpUaGVzZSBhcmUgYWxsIGV4cG9ydGVkLCBtZWFuaW5nIHRoZXkmIzM5O3JlIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiBUaGlzIHRlbGxzIG1lIHdlJiMzOTtyZSBsb29raW5nIGF0IHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgdGhpcyBuZXcgbWVtb3J5IHBhY2thZ2UgZnVuY3Rpb25hbGl0eSwgd2hpY2gsIGZyb20gd2hhdCBJJiMzOTttIHJlYWRpbmcsIGlzIGFsdGVyaW5nIGNvcmUgbWVtb3J5IHRpZXJpbmcsIG1lbXBvbGljeSwgYW5kIGhvdyBDWEwgcmVnaW9ucyBhcmUgaGFuZGxlZC4gUGx1cywgdGhlcmUgYXJlIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyB3ZWlnaHRlZCBpbnRlcmxlYXZlIG1lbXBvbGljeSBtb2RlLiBBbGwgb2YgdGhpcyB1c2VyLXNwYWNlIGFjY2Vzc2libGUgc3R1ZmY/IFRoaXMgc2NyZWFtcyBmb3IgZnV6emluZy4gV2UmIzM5O3ZlIGdvdCBpbnRlcmZhY2VzIGZvciBhZGRpbmcsIHF1ZXJ5aW5nLCBhbmQgbWFuaXB1bGF0aW5nIHRoZSBtZW1vcnkgcGFja2FnZSB0b3BvbG9neS4gSSYjMzk7bSBnb2luZyB0byBoYXZlIHRvIHRlc3QgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIHJhY2UgY29uZGl0aW9ucywgYW5kIGVycm9yIGhhbmRsaW5nIG9mIHRoZXNlIGZ1bmN0aW9ucyB2ZXJ5IGNhcmVmdWxseSwgZXNwZWNpYWxseSB3aGVuIGNvbWJpbmVkIHdpdGggdGhlc2UgbmV3IHN5c2ZzIGVudHJpZXMgYW5kIHRoZSBuZXcgbWVtcG9saWN5LgoKVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA2IDA4OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtOVU1BJiMzNDssCiAgICAmIzM0O05VTUFfTUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0NYTF9CVVMmIzM0OywKICAgICYjMzQ7Q1hMX1JFR0lPTiYjMzQ7LAogICAgJiMzNDtERVZfREFYJiMzNDssCiAgICAmIzM0O0RFVl9EQVhfS01FTSYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wX2FkZF9wYWNrYWdlX25vZGUmIzM0OywKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2Vfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzJiMzNDssCiAgICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgICAmIzM0O21wX25leHRfZGVtb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljJiMzNDssCiAgICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfcHJvYmVfcGFja2FnZV9pZCYjMzQ7LAogICAgJiMzNDtyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDssCiAgICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtOVU1BJiMzNDssCiAgICAmIzM0O05VTUFfTUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0NYTF9CVVMmIzM0OywKICAgICYjMzQ7Q1hMX1JFR0lPTiYjMzQ7LAogICAgJiMzNDtERVZfREFYJiMzNDssCiAgICAmIzM0O0RFVl9EQVhfS01FTSYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wX2FkZF9wYWNrYWdlX25vZGUmIzM0OywKICAgICYjMzQ7bXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3ImIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2Vfbm9kZXMmIzM0OywKICAgICYjMzQ7bXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzJiMzNDssCiAgICAmIzM0O21wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzJiMzNDssCiAgICAmIzM0O21wX25leHRfZGVtb3Rpb25fbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfbmV4dF9kZW1vdGlvbl9ub2RlJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGVtYXNrJiMzNDssCiAgICAmIzM0O21wX25leHRfcHJvbW90aW9uX25vZGUmIzM0OywKICAgICYjMzQ7bXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljJiMzNDssCiAgICAmIzM0O25lYXJlc3Rfbm9kZXNfbm9kZW1hc2smIzM0OywKICAgICYjMzQ7bXBfcHJvYmVfcGFja2FnZV9pZCYjMzQ7LAogICAgJiMzNDtyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyJiMzNDssCiAgICAmIzM0O3VucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6MjcuNDc3NjQ0MjRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjg1Njc5OTcxNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTlVNQVwiLFxuICAgIFwiTlVNQV9NSUdSQVRJT05cIixcbiAgICBcIkNYTF9CVVNcIixcbiAgICBcIkNYTF9SRUdJT05cIixcbiAgICBcIkRFVl9EQVhcIixcbiAgICBcIkRFVl9EQVhfS01FTVwiLFxuICAgIFwiTUVNT1JZX0hPVFBMVUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlXCIsXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvclwiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2Vfbm9kZXNcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlc1wiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwibXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVcIixcbiAgICBcIm1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpY1wiLFxuICAgIFwibmVhcmVzdF9ub2Rlc19ub2RlbWFza1wiLFxuICAgIFwibXBfcHJvYmVfcGFja2FnZV9pZFwiLFxuICAgIFwicmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllclwiLFxuICAgIFwidW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBtZW1vcnkgcGFja2FnZSB0b3BvbG9neSBjb25jZXB0IGZvciBOVU1BIG5vZGVzLCBtb2RpZnlpbmcgY29yZSBtZW1vcnkgdGllcmluZywgbWVtcG9saWN5LCBhbmQgQ1hMIHJlZ2lvbiBoYW5kbGluZy4gSXQgYWRkcyBuZXcgc3lzZnMgaW50ZXJmYWNlcyBhbmQgYSBuZXcgbWVtcG9saWN5IHdlaWdodGVkIGludGVybGVhdmUgbW9kZSwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6MjcuNDc3NjUxNTFaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2ODM3MTg2MDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAyNWEyYTJhYWM2NDliY2FiNmY0MGMxZGM2ZmZhYTM1MTEwZWRhYjdhXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgQXVnIDYgMDg6Mjg6MjUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTAwZjllNWZmMTllXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tcGFja2FnZVxcbkBAIC0wLDAgKzEsMzUgQEBcXG4rV2hhdDpcXHRcXHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvXFxuK0RhdGU6XFx0XFx0QXVndXN0IDIwMjZcXG4rQ29udGFjdDpcXHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1xcdTAwM2VcXG4rRGVzY3JpcHRpb246XFx0TWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3lcXG4rXFxuK1xcdFxcdEEgXFxcIm1lbW9yeSBwYWNrYWdlXFxcIiBncm91cHMgdGhlIE5VTUEgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIG9uZVxcbitcXHRcXHRwaHlzaWNhbCBDUFUgcGFja2FnZSAoc29ja2V0KTogdGhlIG5vZGVzIHRoYXQgaGF2ZSBDUFVzIGFuZFxcbitcXHRcXHR0aGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTCBvciBIQk0pLlxcbitcXG4rXFx0XFx0QWxsIGF0dHJpYnV0ZXMgYXJlIHJlYWQtb25seTsgdGhlIHRvcG9sb2d5IGNhbm5vdCBiZVxcbitcXHRcXHRvdmVycmlkZGVuIGZyb20gdXNlciBzcGFjZS5cXG4rXFxuK1doYXQ6XFx0XFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXNcXG4rRGF0ZTpcXHRcXHRBdWd1c3QgMjAyNlxcbitDb250YWN0OlxcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbitEZXNjcmlwdGlvbjpcXHRBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0IGZvcm1hdFxcbitcXHRcXHQoZS5nLiBcXFwiMCwyXFxcIikuXFxuK1xcbitXaGF0OlxcdFxcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9wYWNrYWdlX2NwdV9ub2Rlc1xcbitEYXRlOlxcdFxcdEF1Z3VzdCAyMDI2XFxuK0NvbnRhY3Q6XFx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFxcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcXHUwMDNlXFxuK0Rlc2NyaXB0aW9uOlxcdFRoZSBub2RlcyB0aGF0IGhhdmUgQ1BVcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0XFxuK1xcdFxcdGZvcm1hdC5cXG4rXFxuK1doYXQ6XFx0XFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2VfbWVtX29ubHlfbm9kZXNcXG4rRGF0ZTpcXHRcXHRBdWd1c3QgMjAyNlxcbitDb250YWN0OlxcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbitEZXNjcmlwdGlvbjpcXHRUaGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTC9IQk0pIGluIHRoaXNcXG4rXFx0XFx0cGFja2FnZSwgaW4gbm9kZWxpc3QgZm9ybWF0LlxcbitcXG4rV2hhdDpcXHRcXHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGh5c2ljYWxfcGFja2FnZV9pZFxcbitEYXRlOlxcdFxcdEF1Z3VzdCAyMDI2XFxuK0NvbnRhY3Q6XFx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFxcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcXHUwMDNlXFxuK0Rlc2NyaXB0aW9uOlxcdFRoZSBwaHlzaWNhbCBwYWNrYWdlIGlkIHRoaXMgZ3JvdXAgY29ycmVzcG9uZHMgdG8sIGFzXFxuK1xcdFxcdHJlcG9ydGVkIGJ5IENQVSB0b3BvbG9neS5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmUgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxcbmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcXG4rKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxcbkBAIC01MiwzICs1MiwyMCBAQCBEZXNjcmlwdGlvbjpcXHRBdXRvLXdlaWdodGluZyBjb25maWd1cmF0aW9uIGludGVyZmFjZVxcbiBcXG4gXFx0XFx0V3JpdGluZyBhIG5ldyB3ZWlnaHQgdG8gYSBub2RlIGRpcmVjdGx5IHZpYSB0aGUgbm9kZU4gaW50ZXJmYWNlXFxuIFxcdFxcdHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0aGUgc3lzdGVtIHRvIG1hbnVhbCBtb2RlLlxcbitcXG4rV2hhdDpcXHRcXHQvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVcXG4rRGF0ZTpcXHRcXHRBdWd1c3QgMjAyNlxcbitDb250YWN0OlxcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbitEZXNjcmlwdGlvbjpcXHRQYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgdG9nZ2xlXFxuK1xcbitcXHRcXHQndHJ1ZScgcmVzdHJpY3RzIHdlaWdodGVkIGludGVybGVhdmUgbm9kZSBzZWxlY3Rpb24gdG8gdGhlXFxuK1xcdFxcdE5VTUEgbm9kZXMgb2YgdGhlIHBhY2thZ2UgKENQVSBzb2NrZXQpIHRoZSBhbGxvY2F0aW5nIHRhc2tcXG4rXFx0XFx0aXMgcnVubmluZyBvbi4gJ2ZhbHNlJyAodGhlIGRlZmF1bHQpIHVzZXMgdGhlIGV4aXN0aW5nXFxuK1xcdFxcdHdlaWdodGVkIGludGVybGVhdmUgYmVoYXZpb3IuXFxuK1xcbitcXHRcXHRFbmFibGluZyBpcyByZWplY3RlZCB3aXRoIC1FSU5WQUwgd2hpbGUgdGhlIHBhY2thZ2UgdG9wb2xvZ3lcXG4rXFx0XFx0aXMgbm90IHN5bW1ldHJpYy5cXG4rXFxuK1xcdFxcdFdyaXRpbmcgYW55IHRydWUgdmFsdWUgc3RyaW5nIChlLmcuIFkgb3IgMSkgZW5hYmxlcyB0aGVcXG4rXFx0XFx0cmVzdHJpY3Rpb24sIGFueSBmYWxzZSB2YWx1ZSBzdHJpbmcgKGUuZy4gTiBvciAwKSBkaXNhYmxlc1xcbitcXHRcXHRpdC4gQWxsIG90aGVyIHN0cmluZ3MgcmV0dXJuIC1FSU5WQUwuXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmMgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXFxuaW5kZXggZTUwZGM3MTZkNGU4Mi4uYWY2NmUyZTA2YzYyNCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXFxuKysrIGIvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY1xcbkBAIC0yNjczLDYgKzI2NzMsNTUgQEAgc3RhdGljIGludCBjeGxfcmVnaW9uX2NhbGN1bGF0ZV9hZGlzdGFuY2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4gXFx0cmV0dXJuIE5PVElGWV9TVE9QO1xcbiB9XFxuIFxcbisvKlxcbisgKiBGaW5kIGEgTlVNQSBub2RlIHRvIGFjdCBhcyB0aGUgaW5pdGlhdG9yIGZvciB0aGlzIHJlZ2lvbjogc2NhbiB0aGVcXG4rICogcmVnaW9uJ3MgZW5kcG9pbnQgdGFyZ2V0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCByZXNvbHZlcyB0byBhXFxuKyAqIHZhbGlkIE5VTUEgbm9kZS5cXG4rICovXFxuK3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hscilcXG4re1xcbitcXHRzdHJ1Y3QgY3hsX3JlZ2lvbl9wYXJhbXMgKnAgPSBcXHUwMDI2Y3hsci1cXHUwMDNlcGFyYW1zO1xcbitcXHRzdHJ1Y3QgY3hsX2VuZHBvaW50X2RlY29kZXIgKmN4bGVkID0gTlVMTDtcXG4rXFx0c3RydWN0IGN4bF9tZW1kZXYgKmN4bG1kID0gTlVMTDtcXG4rXFx0aW50IGksIG51bWFfbm9kZTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBwLVxcdTAwM2Vucl90YXJnZXRzOyBpKyspIHtcXG4rXFx0XFx0Y3hsZWQgPSBwLVxcdTAwM2V0YXJnZXRzW2ldO1xcbitcXHRcXHRjeGxtZCA9IGN4bGVkX3RvX21lbWRldihjeGxlZCk7XFxuK1xcdFxcdG51bWFfbm9kZSA9IGRldl90b19ub2RlKFxcdTAwMjZjeGxtZC1cXHUwMDNlZGV2KTtcXG4rXFx0XFx0aWYgKG51bWFfbm9kZSAhPSBOVU1BX05PX05PREUpXFxuK1xcdFxcdFxcdHJldHVybiBudW1hX25vZGU7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4rfVxcbitcXG4rLypcXG4rICogUGFja2FnZSBub3RpZmllciBjYWxsYmFjazogd2hlbiBhIG5ldyBtZW1vcnkgbm9kZSBpcyBvbmxpbmVkIHZpYSBkYXhcXG4rICoga21lbSwgYmluZCB0aGUgbm9kZSB0aGlzIENYTCByZWdpb24gYmFja3MgdG8gaXRzIG1lbW9yeSBwYWNrYWdlLCB1c2luZ1xcbisgKiB0aGUgbmVhcmVzdCByZWdpb24gdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IuIE5vdGlmaWNhdGlvbnMgZm9yIG90aGVyXFxuKyAqIG5vZGVzIGFyZSBpZ25vcmVkLlxcbisgKi9cXG4rc3RhdGljIGludCBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgZGF4X25pZCwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRpbnQgcmVnaW9uX25pZCwgbmVhcmVzdF9uaWQsIHJldDtcXG4rXFx0c3RydWN0IGN4bF9yZWdpb24gKmN4bHIgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBjeGxfcmVnaW9uLCBwYWNrYWdlX25vdGlmaWVyKTtcXG4rXFxuK1xcdHJlZ2lvbl9uaWQgPSBwaHlzX3RvX3RhcmdldF9ub2RlKGN4bHItXFx1MDAzZXBhcmFtcy5yZXMtXFx1MDAzZXN0YXJ0KTtcXG4rXFx0aWYgKHJlZ2lvbl9uaWQgIT0gZGF4X25pZClcXG4rXFx0XFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbitcXG4rXFx0bmVhcmVzdF9uaWQgPSBjeGxfcmVnaW9uX2ZpbmRfbmVhcmVzdF9ub2RlKGN4bHIpO1xcbitcXHRpZiAobmVhcmVzdF9uaWQgPT0gTlVNQV9OT19OT0RFKVxcbitcXHRcXHRyZXR1cm4gTk9USUZZX0RPTkU7XFxuK1xcbitcXHRyZXQgPSBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihkYXhfbmlkLCBuZWFyZXN0X25pZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiBOT1RJRllfRE9ORTtcXG4rXFxuK1xcdHJldHVybiBOT1RJRllfT0s7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBkZXZtX2N4bF9hZGRfcmVnaW9uIC0gQWRkcyBhIHJlZ2lvbiB0byBhIGRlY29kZXJcXG4gICogQGN4bHJkOiByb290IGRlY29kZXJcXG5AQCAtMzg1Miw2ICszOTAxLDcgQEAgc3RhdGljIHZvaWQgc2h1dGRvd25fbm90aWZpZXJzKHZvaWQgKl9jeGxyKVxcbiBcXG4gXFx0dW5yZWdpc3Rlcl9ub2RlX25vdGlmaWVyKFxcdTAwMjZjeGxyLVxcdTAwM2Vub2RlX25vdGlmaWVyKTtcXG4gXFx0dW5yZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKFxcdTAwMjZjeGxyLVxcdTAwM2VhZGlzdF9ub3RpZmllcik7XFxuK1xcdHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihcXHUwMDI2Y3hsci1cXHUwMDNlcGFja2FnZV9ub3RpZmllcik7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHJlbW92ZV9kZWJ1Z2ZzKHZvaWQgKmRlbnRyeSlcXG5AQCAtNDA2Niw2ICs0MTE2LDEwIEBAIHN0YXRpYyBpbnQgY3hsX3JlZ2lvbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuIFxcdGN4bHItXFx1MDAzZWFkaXN0X25vdGlmaWVyLnByaW9yaXR5ID0gMTAwO1xcbiBcXHRyZWdpc3Rlcl9tdF9hZGlzdGFuY2VfYWxnb3JpdGhtKFxcdTAwMjZjeGxyLVxcdTAwM2VhZGlzdF9ub3RpZmllcik7XFxuIFxcbitcXHRjeGxyLVxcdTAwM2VwYWNrYWdlX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGU7XFxuK1xcdGN4bHItXFx1MDAzZXBhY2thZ2Vfbm90aWZpZXIucHJpb3JpdHkgPSAxMDA7XFxuK1xcdHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXFx1MDAyNmN4bHItXFx1MDAzZXBhY2thZ2Vfbm90aWZpZXIpO1xcbitcXG4gXFx0cmMgPSBkZXZtX2FkZF9hY3Rpb25fb3JfcmVzZXQoXFx1MDAyNmN4bHItXFx1MDAzZWRldiwgc2h1dGRvd25fbm90aWZpZXJzLCBjeGxyKTtcXG4gXFx0aWYgKHJjKVxcbiBcXHRcXHRyZXR1cm4gcmM7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3hsL2N4bC5oIGIvZHJpdmVycy9jeGwvY3hsLmhcXG5pbmRleCAxMjk3NTk0YmVhZWMzLi45MjgxY2EzYTVmMGY4IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvY3hsL2N4bC5oXFxuKysrIGIvZHJpdmVycy9jeGwvY3hsLmhcXG5AQCAtNDc3LDYgKzQ3Nyw3IEBAIHN0cnVjdCBjeGxfcmVnaW9uIHtcXG4gXFx0c3RydWN0IGFjY2Vzc19jb29yZGluYXRlIGNvb3JkW0FDQ0VTU19DT09SRElOQVRFX01BWF07XFxuIFxcdHN0cnVjdCBub3RpZmllcl9ibG9jayBub2RlX25vdGlmaWVyO1xcbiBcXHRzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWRpc3Rfbm90aWZpZXI7XFxuK1xcdHN0cnVjdCBub3RpZmllcl9ibG9jayBwYWNrYWdlX25vdGlmaWVyO1xcbiB9O1xcbiBcXG4gc3RydWN0IGN4bF9udmRpbW1fYnJpZGdlIHtcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgva21lbS5jIGIvZHJpdmVycy9kYXgva21lbS5jXFxuaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL2RheC9rbWVtLmNcXG4rKysgYi9kcml2ZXJzL2RheC9rbWVtLmNcXG5AQCAtOTQsNiArOTQsOSBAQCBzdGF0aWMgaW50IGRldl9kYXhfa21lbV9wcm9iZShzdHJ1Y3QgZGV2X2RheCAqZGV2X2RheClcXG4gXFx0aWYgKElTX0VSUihtdHlwZSkpXFxuIFxcdFxcdHJldHVybiBQVFJfRVJSKG10eXBlKTtcXG4gXFxuK1xcdC8qIFJlc29sdmUgdGhlIG1lbW9yeSBwYWNrYWdlIGZvciB0aGlzIG5ld2x5IG9ubGluZWQga21lbSBub2RlLiAqL1xcbitcXHRtcF9wcm9iZV9wYWNrYWdlX2lkKG51bWFfbm9kZSk7XFxuK1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZGV2X2RheC1cXHUwMDNlbnJfcmFuZ2U7IGkrKykge1xcbiBcXHRcXHRzdHJ1Y3QgcmFuZ2UgcmFuZ2U7XFxuIFxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaFxcbmluZGV4IDc5OTljNTg2MjllZWIuLmY4Nzc4YzQzNDI5ZmIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmhcXG5AQCAtNTIsMTAgKzUyLDI1IEBAIGludCBtdF9wZXJmX3RvX2FkaXN0YW5jZShzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgKnBlcmYsIGludCAqYWRpc3QpO1xcbiBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICptZW1vcnlfdHlwZXMpO1xcbiB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcXG4rXFxuK2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpO1xcbit2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcXG4raW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZCk7XFxuK2ludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZCk7XFxuK2ludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpO1xcbitpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcXG4raW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xcbitpbnQgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcXG4rYm9vbCBtcF9pc190b3BvbG9neV9zeW1tZXRyaWModm9pZCk7XFxuICNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG4gaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTtcXG4gdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cyk7XFxuIGJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKTtcXG4rXFxuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dCk7XFxuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZCk7XFxuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xcbitpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZShpbnQgbmlkKTtcXG4gI2Vsc2VcXG4gc3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuIHtcXG5AQCAtNzEsNiArODYsMzAgQEAgc3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSlcXG4ge1xcbiBcXHRyZXR1cm4gdHJ1ZTtcXG4gfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4rfVxcbiAjZW5kaWZcXG4gXFxuICNlbHNlXFxuQEAgLTE1MSw1ICsxOTAsNzkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtb3J5X2Rldl90eXBlICptdF9maW5kX2FsbG9jX21lbW9yeV90eXBlKGludCBhZGlzdCxcXG4gc3RhdGljIGlubGluZSB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKVxcbiB7XFxuIH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcilcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gTk9USUZZX0RPTkU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAob3V0KVxcbitcXHRcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFx0cmV0dXJuIC1FTk9FTlQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aWYgKG91dClcXG4rXFx0XFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcdHJldHVybiAtRU5PRU5UO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAob3V0KVxcbitcXHRcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFx0cmV0dXJuIC1FTk9FTlQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZShpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiBOVU1BX05PX05PREU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAob3V0KVxcbitcXHRcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFx0cmV0dXJuIC1FTk9FTlQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbit9XFxuICNlbmRpZlxcdC8qIENPTkZJR19OVU1BICovXFxuICNlbmRpZiAgLyogX0xJTlVYX01FTU9SWV9USUVSU19IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnVtYS5oIGIvaW5jbHVkZS9saW51eC9udW1hLmhcXG5pbmRleCBlNmJhYWY2MDUxYmNmLi40ZjJhMGMzNDQxMjJhIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvbnVtYS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9udW1hLmhcXG5AQCAtMzMsNiArMzMsOCBAQCBpbnQgbnVtYV9uZWFyZXN0X25vZGUoaW50IG5vZGUsIHVuc2lnbmVkIGludCBzdGF0ZSk7XFxuIFxcbiBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKTtcXG4gXFxuK2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpO1xcbitcXG4gI2lmbmRlZiBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZFxcbiBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KTtcXG4gI2VuZGlmXFxuQEAgLTU0LDYgKzU2LDE1IEBAIHN0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzaylcXG4gXFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSBpbnQgbmVhcmVzdF9ub2Rlc19ub2RlbWFzayhpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqbWFzayxcXG4rXFx0XFx0XFx0XFx0XFx0IG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRpZiAoIW91dClcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdG5vZGVzX2NsZWFyKCpvdXQpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gc3RhdGljIGlubGluZSBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KVxcbiB7XFxuIFxcdHJldHVybiAwO1xcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnktdGllcnMuYyBiL21tL21lbW9yeS10aWVycy5jXFxuaW5kZXggNTQ4NTFkOGExOTViMC4uNTkzMmRmMzE1NjA0YSAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xcbisrKyBiL21tL21lbW9yeS10aWVycy5jXFxuQEAgLTEsNCArMSw1IEBAXFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jbGVhbnVwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9sb2NrZGVwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zeXNmcy5oXFx1MDAzZVxcbkBAIC01MSw2ICs1MiwxMSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ1c190eXBlIG1lbW9yeV90aWVyX3N1YnN5cyA9IHtcXG4gXFx0LmRldl9uYW1lID0gXFxcIm1lbW9yeV90aWVyXFxcIixcXG4gfTtcXG4gXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgcGFja2FnZV9zdWJzeXMgPSB7XFxuK1xcdC5uYW1lID0gXFxcInBhY2thZ2VcXFwiLFxcbitcXHQuZGV2X25hbWUgPSBcXFwicGFja2FnZVxcXCIsXFxuK307XFxuK1xcbiAjaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxuIC8qKlxcbiAgKiBmb2xpb191c2VfYWNjZXNzX3RpbWUgLSBjaGVjayBpZiBhIGZvbGlvIHJldXNlcyBjcHVwaWQgZm9yIHBhZ2UgYWNjZXNzIHRpbWVcXG5AQCAtMTAwNywzICsxMDEzLDEwMDYgQEAgc3RhdGljIGludCBfX2luaXQgbnVtYV9pbml0X3N5c2ZzKHZvaWQpXFxuIHN1YnN5c19pbml0Y2FsbChudW1hX2luaXRfc3lzZnMpO1xcbiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovXFxuICNlbmRpZlxcbitcXG4rLyoqXFxuKyAqIGVudW0gbXBfbm9kZXNfdHlwZSAtIFNlbGVjdG9yIGZvciB3aGljaCBzdWJzZXQgb2YgYSBwYWNrYWdlIHRvIHJldHVyblxcbisgKiBATVBfTk9ERVNfQUxMOiAgICAgICBBbGwgTlVNQSBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGUgcGFja2FnZS5cXG4rICogQE1QX05PREVTX0NQVTogICAgICAgT25seSBDUFUgbm9kZXMgaW4gdGhlIHBhY2thZ2UuXFxuKyAqIEBNUF9OT0RFU19NRU1fT05MWTogIE9ubHkgbWVtb3J5LW9ubHkgbm9kZXMgKGUuZy4gQ1hML0hCTSkgaW4gdGhlIHBhY2thZ2UuXFxuKyAqXFxuKyAqIFVzZWQgaW50ZXJuYWxseSB0byBjaG9vc2Ugd2hpY2ggbm9kZW1hc2sgdG8gZXhwb3NlIGZvciBhIGdpdmVuIHBhY2thZ2UuXFxuKyAqL1xcbitlbnVtIG1wX25vZGVzX3R5cGUge1xcbitcXHRNUF9OT0RFU19BTEwsXFxuK1xcdE1QX05PREVTX0NQVSxcXG4rXFx0TVBfTk9ERVNfTUVNX09OTFlcXG4rfTtcXG4rXFxuKy8qKlxcbisgKiBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgLSBQZXItcGh5c2ljYWwtcGFja2FnZSBjb250YWluZXJcXG4rICogQHBhY2thZ2VfaWQ6ICAgICAgICAgIFBoeXNpY2FsIHBhY2thZ2UgaWQgKGZyb20gdG9wb2xvZ3kpLlxcbisgKiBAbm9kZXM6ICAgICAgICAgICAgICAgTm9kZW1hc2sgb2YgYWxsIG1lbWJlciBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXFxuKyAqIEBjcHVfbm9kZXM6ICAgICAgICAgICBOb2RlbWFzayBvZiBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxcbisgKiBAbWVtb3J5X29ubHlfbm9kZXM6ICAgTm9kZW1hc2sgb2YgbWVtb3J5LW9ubHkgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxcbisgKiBAY3B1X2xpc3Q6ICAgICAgICAgICAgTGlzdCBoZWFkIG9mIENQVS10eXBlIG1lbWJlcnMuXFxuKyAqIEBtZW1vcnlfb25seV9saXN0OiAgICBMaXN0IGhlYWQgb2YgbWVtb3J5LW9ubHkgbWVtYmVycy5cXG4rICogQGxpc3Q6ICAgICAgICAgICAgICAgIExpbmthZ2Ugb24gdGhlIGdsb2JhbCBAbWVtb3J5X3BhY2thZ2VzIGxpc3QuXFxuKyAqIEBkZXY6ICAgICAgICAgICAgICAgICBzeXNmcyBkZXZpY2UgZm9yIHRoaXMgcGFja2FnZS5cXG4rICpcXG4rICogQSBtZW1vcnlfcGFja2FnZSBncm91cHMgTlVNQSBub2RlcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHBoeXNpY2FsIENQVSBwYWNrYWdlLlxcbisgKiBUaGUgbWFza3MgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHBhY2thZ2UtbG9jYWwgcGxhY2VtZW50L2RlbW90aW9uL3Byb21vdGlvbi5cXG4rICovXFxuK3N0cnVjdCBtZW1vcnlfcGFja2FnZSB7XFxuK1xcdGludCBwYWNrYWdlX2lkO1xcbitcXHRub2RlbWFza190IG5vZGVzO1xcbitcXHRub2RlbWFza190IGNwdV9ub2RlcztcXG4rXFx0bm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlcztcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBjcHVfbGlzdDtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBtZW1vcnlfb25seV9saXN0O1xcbitcXHRzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7XFxuK1xcdHN0cnVjdCBkZXZpY2UgZGV2O1xcbit9O1xcbitcXG4rLyoqXFxuKyAqIGVudW0gbXBuX3NvdXJjZV9mbGFncyAtIFNvdXJjZSB1c2VkIHRvIHJlc29sdmUgYSBub2RlJ3MgcGFja2FnZSBtZW1iZXJzaGlwXFxuKyAqIEBNUE5fU1JDX1VOS05PV046ICAgICBVbmtub3duL3Vuc3BlY2lmaWVkLlxcbisgKiBATVBOX1NSQ19DUFU6ICAgICAgICAgRGlyZWN0bHkgcmVzb2x2ZWQgZnJvbSBhIENQVSBub2RlICgxOjEpLlxcbisgKiBATVBOX1NSQ19JTklUSUFUT1I6ICAgUmVzb2x2ZWQgdmlhIGFuIGluaXRpYXRvciBDUFUgbm9kZSBwcm92aWRlZCBieSBhIGRyaXZlci5cXG4rICogQE1QTl9TUkNfU0xJVDogICAgICAgIFJlc29sdmVkIHZpYSBTTElUL25lYXJlc3Qtbm9kZS5cXG4rICpcXG4rICogVGhlc2UgZmxhZ3MgYXJlIGluZm9ybWF0aW9uYWw7IHRoZXkgZGVzY3JpYmUgaG93IGEgZ2l2ZW4gbm9kZSB3YXMgYm91bmQgdG9cXG4rICogaXRzIHBhY2thZ2UgYW5kIGhlbHAgd2l0aCBwb2xpY3kgZGVjaXNpb25zIGxhdGVyLlxcbisgKi9cXG4rZW51bSBtcG5fc291cmNlX2ZsYWdzIHtcXG4rXFx0TVBOX1NSQ19VTktOT1dOXFx0XFx0PSAwLFxcbitcXHRNUE5fU1JDX0NQVVxcdFxcdD0gQklUKDEpLFxcbitcXHRNUE5fU1JDX0lOSVRJQVRPUlxcdD0gQklUKDIpLFxcbitcXHRNUE5fU1JDX1NMSVRcXHRcXHQ9IEJJVCgzKVxcbit9O1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlIC0gUGVyLW5vZGUgbWVtYmVyc2hpcCBhbmQgcHJlZmVyZW5jZXNcXG4rICogQG5pZDogICAgICAgICAgICAgIE5VTUEgbm9kZSBpZCBmb3IgdGhpcyBlbnRyeS5cXG4rICogQGluaXRpYXRvcl9uaWQ6ICAgIENQVSBuaWQgdGhhdCBzZXJ2ZWQgYXMgdGhlIGluaXRpYXRvciB3aGVuIHJlc29sdmluZyBAbmlkLlxcbisgKiBAcGFja2FnZV9pZDogICAgICAgUmVzb2x2ZWQgcGFja2FnZSBpZCB0aGF0IEBuaWQgYmVsb25ncyB0by5cXG4rICogQHNvdXJjZV9mbGFnczogICAgIE9uZSBvZiBcXHUwMDI2ZW51bSBtcG5fc291cmNlX2ZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlc29sdXRpb24uXFxuKyAqIEBwcmVmZXJyZWQ6ICAgICAgICBPcHBvc2l0ZS10eXBlIG5lYXJlc3QgY2FuZGlkYXRlcyBpbnNpZGUgdGhlIHNhbWUgcGFja2FnZS5cXG4rICogQHBhY2thZ2U6ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG93bmluZyBcXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlIChOVUxMIHVudGlsIGJvdW5kKS5cXG4rICogQHBhY2thZ2VfZW50cnk6ICAgIExpbmthZ2Ugb24gdGhlIG93bmluZyBwYWNrYWdlJ3MgdHlwZSBsaXN0LlxcbisgKlxcbisgKiBFYWNoIE5VTUEgbm9kZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBwYWNrYWdlLWF3YXJlIHBvbGljeSBnZXRzIGEgd3JhcHBlciBlbnRyeVxcbisgKiB0aGF0IGNhY2hlcyBwYWNrYWdlIG1lbWJlcnNoaXAgYW5kIHRoZSBwcmVjb21wdXRlZCBzZXQgb2YgcHJlZmVycmVkIHRhcmdldHMuXFxuKyAqL1xcbitzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSB7XFxuK1xcdGludCBuaWQ7XFxuK1xcdGludCBpbml0aWF0b3JfbmlkO1xcbitcXHRpbnQgcGFja2FnZV9pZDtcXG4rXFx0aW50IHNvdXJjZV9mbGFncztcXG4rXFx0bm9kZW1hc2tfdCBwcmVmZXJyZWQ7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqcGFja2FnZTtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBwYWNrYWdlX2VudHJ5O1xcbit9O1xcbitcXG4rI2RlZmluZSBub2RlX2lzX21lbW9yeV9vbmx5KF9uaWQpIFxcXFxcXG4rXFx0KG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgXFx1MDAyNlxcdTAwMjYgIW5vZGVfc3RhdGUoKF9uaWQpLCBOX0NQVSkpXFxuK1xcbitzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChtcF9wYWNrYWdlX2FsZ29yaXRobXMpO1xcbitcXG4rc3RhdGljIExJU1RfSEVBRChtZW1vcnlfcGFja2FnZXMpO1xcbitzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbnNbTUFYX05VTU5PREVTXTtcXG4rc3RhdGljIERFRklORV9NVVRFWChtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuKy8qXFxuKyAqIFJDVSBzbmFwc2hvdCBvZiB0aGUgcGFja2FnZSB0b3BvbG9neS4gVGhlIGFsbG9jYXRpb24gcGF0aCByZWFkcyBpdFxcbisgKiBvZnRlbiwgc28gaXQgaXMgcHVibGlzaGVkIGZvciBsb2NrbGVzcyByZWFkcyBpbnN0ZWFkIG9mIGxvY2tpbmcgb25cXG4rICogZXZlcnkgYWNjZXNzLlxcbisgKi9cXG4rc3RydWN0IG1wX3NuYXBzaG90IHtcXG4rXFx0c3RydWN0IHJjdV9oZWFkIHJjdTtcXG4rXFx0aW50IG5yX3BhY2thZ2VzO1xcbitcXHRpbnQgcGtnX29mW01BWF9OVU1OT0RFU107XFxuK1xcdHN0cnVjdCB7XFxuK1xcdFxcdG5vZGVtYXNrX3Qgbm9kZXM7XFxuK1xcdFxcdG5vZGVtYXNrX3QgY3B1X25vZGVzO1xcbitcXHRcXHRub2RlbWFza190IG1lbW9yeV9vbmx5X25vZGVzO1xcbitcXHR9IHBrZ1tdO1xcbit9O1xcbitcXG4rc3RhdGljIHN0cnVjdCBtcF9zbmFwc2hvdCBfX3JjdSAqbXBfc25hcHNob3Q7XFxuK1xcbisvKipcXG4rICogcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciAtIFJlZ2lzdGVyIGEgcGFja2FnZSByZXNvbHV0aW9uIGFsZ29yaXRobVxcbisgKiBAbm90aWZpZXI6IE5vdGlmaWVyIGNhbGxlZCB3aXRoIHRoZSBuaWQgdG8gcmVzb2x2ZSAoc2VlIG1wX3Byb2JlX3BhY2thZ2VfaWQoKSkuXFxuKyAqXFxuKyAqIERyaXZlcnMgKGUuZy4sIENYTCByZWdpb24vZGVjb2RlciBjb2RlKSByZWdpc3RlciBoZXJlIHRvIHN1cHBseSBhIHBhY2thZ2VcXG4rICogaGludCBmb3IgbmV3bHkgYXBwZWFyaW5nIG5vZGVzLiBUaGUgbm90aWZpZXIgaXMgaW52b2tlZCBkdXJpbmcgbmlkLVxcdTAwM2VwYWNrYWdlXFxuKyAqIHJlc29sdXRpb24uXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxcbisgKi9cXG4raW50IHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcilcXG4re1xcbitcXHRyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoXFx1MDAyNm1wX3BhY2thZ2VfYWxnb3JpdGhtcywgbm90aWZpZXIpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpO1xcbitcXG4rLyoqXFxuKyAqIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllciAtIFVucmVnaXN0ZXIgYSBwYWNrYWdlIHJlc29sdXRpb24gYWxnb3JpdGhtXFxuKyAqIEBub3RpZmllcjogTm90aWZpZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcigpLlxcbisgKi9cXG4rdm9pZCB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcilcXG4re1xcbitcXHRibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKFxcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIpO1xcbitcXG4rLyoqXFxuKyAqIG1wX3Byb2JlX3BhY2thZ2VfaWQgLSBJbnZva2UgcmVnaXN0ZXJlZCBub3RpZmllcnMgdG8gcmVzb2x2ZSBhIG5vZGUncyBwYWNrYWdlXFxuKyAqIEBuaWQ6IE5VTUEgbm9kZSBpZCB0byByZXNvbHZlLlxcbisgKlxcbisgKiBDYWxscyB0aGUgYmxvY2tpbmcgbm90aWZpZXIgY2hhaW4gdG8gbGV0IHN1YnN5c3RlbXMgcHJvdmlkZSBhbiBpbml0aWF0b3Igb3JcXG4rICogcGFja2FnZSBpZCBmb3IgQG5pZC5cXG4rICpcXG4rICogUmV0dXJuOiBOb3RpZmllciByZXR1cm4gY29kZSAoXFx1MDAzZT0wIHR5cGljYWxseSk7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKFxcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5pZCwgTlVMTCk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfcHJvYmVfcGFja2FnZV9pZCk7XFxuK1xcbitzdGF0aWMgaW50IG1wX25vZGVfdG9fcGFja2FnZV9pZChpbnQgbmlkKVxcbit7XFxuK1xcdGludCBwYWNrYWdlX2lkO1xcbitcXHR1bnNpZ25lZCBpbnQgZmlyc3RfY3B1O1xcbitcXHRjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hc2s7XFxuK1xcbitcXHRpZiAobmlkIFxcdTAwM2MgMCB8fCBuaWQgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRjcHVfbWFzayA9IGNwdW1hc2tfb2Zfbm9kZShuaWQpO1xcbitcXHRpZiAoY3B1bWFza19lbXB0eShjcHVfbWFzaykpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0Zmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfbWFzayk7XFxuK1xcdGlmIChmaXJzdF9jcHUgXFx1MDAzZT0gbnJfY3B1X2lkcylcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRwYWNrYWdlX2lkID0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChmaXJzdF9jcHUpO1xcbitcXHRpZiAocGFja2FnZV9pZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0cmV0dXJuIHBhY2thZ2VfaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XFxuK1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0XFxuK1xcdCAqIG1lbW9yeS1vbmx5IG5vZGUocykgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UuIElmIHRoZSBwYWNrYWdlIGhhc1xcbitcXHQgKiBubyBtZW1vcnktb25seSBub2RlcywgZmFsbCBiYWNrIHRvIGEgc2VsZi1yZWZlcmVuY2Ugc28gY2FsbGVyc1xcbitcXHQgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC5cXG4rXFx0ICovXFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkobXBuLCBcXHUwMDI2bXAtXFx1MDAzZWNwdV9saXN0LCBwYWNrYWdlX2VudHJ5KSB7XFxuK1xcdFxcdG5vZGVzX2NsZWFyKG1wbi1cXHUwMDNlcHJlZmVycmVkKTtcXG4rXFx0XFx0aWYgKCFub2Rlc19lbXB0eShtcC1cXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKVxcbitcXHRcXHRcXHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cXHUwMDNlbmlkLCBcXHUwMDI2bXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNm1wbi1cXHUwMDNlcHJlZmVycmVkKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRub2RlX3NldChtcG4tXFx1MDAzZW5pZCwgbXBuLVxcdTAwM2VwcmVmZXJyZWQpO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTeW1tZXRyaWNhbGx5LCBmb3IgZWFjaCBtZW1vcnktb25seSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0XFxuK1xcdCAqIGFzIHRoZSBuZWFyZXN0IENQVSBub2RlKHMpIHdpdGhpbiB0aGUgc2FtZSBwYWNrYWdlLiBJZiB0aGUgcGFja2FnZVxcbitcXHQgKiBoYXMgbm8gQ1BVIG5vZGVzLCBmYWxsIGJhY2sgdG8gYSBzZWxmLXJlZmVyZW5jZS5cXG4rXFx0ICovXFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkobXBuLCBcXHUwMDI2bXAtXFx1MDAzZW1lbW9yeV9vbmx5X2xpc3QsIHBhY2thZ2VfZW50cnkpIHtcXG4rXFx0XFx0bm9kZXNfY2xlYXIobXBuLVxcdTAwM2VwcmVmZXJyZWQpO1xcbitcXHRcXHRpZiAoIW5vZGVzX2VtcHR5KG1wLVxcdTAwM2VjcHVfbm9kZXMpKVxcbitcXHRcXHRcXHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cXHUwMDNlbmlkLCBcXHUwMDI2bXAtXFx1MDAzZWNwdV9ub2RlcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZtcG4tXFx1MDAzZXByZWZlcnJlZCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0bm9kZV9zZXQobXBuLVxcdTAwM2VuaWQsIG1wbi1cXHUwMDNlcHJlZmVycmVkKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgbWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkoc3RydWN0IG1lbW9yeV9wYWNrYWdlICptcClcXG4re1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdHJldHVybiAobm9kZXNfZW1wdHkobXAtXFx1MDAzZWNwdV9ub2RlcykgXFx1MDAyNlxcdTAwMjYgbm9kZXNfZW1wdHkobXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwYWNrYWdlX25vZGVfaXNfdmFsaWQoaW50IG5pZClcXG4re1xcbitcXHRpZiAoIW1wbnNbbmlkXSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKG5vZGVzX2VtcHR5KG1wbnNbbmlkXS1cXHUwMDNlcHJlZmVycmVkKSB8fCAobXBuc1tuaWRdLVxcdTAwM2VwYWNrYWdlID09IE5VTEwpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1lbW9yeV9wYWNrYWdlX2dyb3Vwc1tdO1xcbitcXG4rLyogRnJlZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIHBhY2thZ2UncyBzeXNmcyBkZXZpY2UgaXMgZHJvcHBlZC4gKi9cXG4rc3RhdGljIHZvaWQgbWVtb3J5X3BhY2thZ2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1vcnlfcGFja2FnZSwgZGV2KTtcXG4rXFxuK1xcdGtmcmVlKG1wKTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqY3JlYXRlX21lbW9yeV9wYWNrYWdlKGludCBwYWNrYWdlX2lkKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG1lbXBhY2thZ2UgPSBremFsbG9jX29iaigqbWVtcGFja2FnZSk7XFxuK1xcdGlmICghbWVtcGFja2FnZSlcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuK1xcbitcXHRtZW1wYWNrYWdlLVxcdTAwM2VwYWNrYWdlX2lkID0gcGFja2FnZV9pZDtcXG4rXFx0bWVtcGFja2FnZS1cXHUwMDNlbm9kZXMgPSBOT0RFX01BU0tfTk9ORTtcXG4rXFx0bWVtcGFja2FnZS1cXHUwMDNlY3B1X25vZGVzID0gTk9ERV9NQVNLX05PTkU7XFxuK1xcdG1lbXBhY2thZ2UtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzID0gTk9ERV9NQVNLX05PTkU7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtZW1wYWNrYWdlLVxcdTAwM2VjcHVfbGlzdCk7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtZW1wYWNrYWdlLVxcdTAwM2VtZW1vcnlfb25seV9saXN0KTtcXG4rXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWxpc3QpO1xcbitcXHRkZXZpY2VfaW5pdGlhbGl6ZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0bWVtcGFja2FnZS1cXHUwMDNlZGV2LnJlbGVhc2UgPSBtZW1vcnlfcGFja2FnZV9yZWxlYXNlO1xcbitcXHRkZXZfc2V0X2RydmRhdGEoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWRldiwgbWVtcGFja2FnZSk7XFxuK1xcdG1lbXBhY2thZ2UtXFx1MDAzZWRldi5idXMgPSBcXHUwMDI2cGFja2FnZV9zdWJzeXM7XFxuK1xcdG1lbXBhY2thZ2UtXFx1MDAzZWRldi5ncm91cHMgPSBtZW1vcnlfcGFja2FnZV9ncm91cHM7XFxuK1xcdHJldCA9IGRldl9zZXRfbmFtZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2LCBcXFwicGFja2FnZSVkXFxcIiwgcGFja2FnZV9pZCk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cHV0X2RldmljZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIG1lbXBhY2thZ2U7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKmZpbmRfY3JlYXRlX21lbW9yeV9wYWNrYWdlKGludCBwYWNrYWdlX2lkKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZSwgKmV4aXN0aW5nO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtcGFja2FnZSwgXFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xcbitcXHRcXHRpZiAobWVtcGFja2FnZS1cXHUwMDNlcGFja2FnZV9pZCA9PSBwYWNrYWdlX2lkKSB7XFxuK1xcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcdFxcdFxcdHJldHVybiBtZW1wYWNrYWdlO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdG1lbXBhY2thZ2UgPSBjcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7XFxuK1xcdGlmIChJU19FUlIobWVtcGFja2FnZSkpXFxuK1xcdFxcdHJldHVybiBtZW1wYWNrYWdlO1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkoZXhpc3RpbmcsIFxcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcXG4rXFx0XFx0aWYgKGV4aXN0aW5nLVxcdTAwM2VwYWNrYWdlX2lkID09IHBhY2thZ2VfaWQpIHtcXG4rXFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0XFx0cHV0X2RldmljZShcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0XFx0XFx0cmV0dXJuIGV4aXN0aW5nO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0bGlzdF9hZGQoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWxpc3QsIFxcdTAwMjZtZW1vcnlfcGFja2FnZXMpO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXG4rXFx0cmV0ID0gZGV2aWNlX2FkZChcXHUwMDI2bWVtcGFja2FnZS1cXHUwMDNlZGV2KTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0bGlzdF9kZWwoXFx1MDAyNm1lbXBhY2thZ2UtXFx1MDAzZWxpc3QpO1xcbitcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRcXHRwdXRfZGV2aWNlKFxcdTAwMjZtZW1wYWNrYWdlLVxcdTAwM2VkZXYpO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUihyZXQpO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gbWVtcGFja2FnZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgbXBfc25hcHNob3RfcmVidWlsZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBtcF9zbmFwc2hvdCAqbmV3LCAqb2xkO1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wO1xcbitcXHRpbnQgbnIgPSAwLCBpID0gMCwgbmlkO1xcbitcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KVxcbitcXHRcXHRucisrO1xcbitcXG4rXFx0bmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghbmV3KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRtZW1zZXQobmV3LVxcdTAwM2Vwa2dfb2YsIDB4ZmYsIHNpemVvZihuZXctXFx1MDAzZXBrZ19vZikpO1xcbitcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShtcCwgXFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xcbitcXHRcXHRuZXctXFx1MDAzZXBrZ1tpXS5ub2RlcyA9IG1wLVxcdTAwM2Vub2RlcztcXG4rXFx0XFx0bmV3LVxcdTAwM2Vwa2dbaV0uY3B1X25vZGVzID0gbXAtXFx1MDAzZWNwdV9ub2RlcztcXG4rXFx0XFx0bmV3LVxcdTAwM2Vwa2dbaV0ubWVtb3J5X29ubHlfbm9kZXMgPSBtcC1cXHUwMDNlbWVtb3J5X29ubHlfbm9kZXM7XFxuK1xcdFxcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG1wLVxcdTAwM2Vub2RlcylcXG4rXFx0XFx0XFx0bmV3LVxcdTAwM2Vwa2dfb2ZbbmlkXSA9IGk7XFxuK1xcdFxcdGkrKztcXG4rXFx0fVxcbitcXHRuZXctXFx1MDAzZW5yX3BhY2thZ2VzID0gbnI7XFxuK1xcbitcXHRvbGQgPSByY3VfcmVwbGFjZV9wb2ludGVyKG1wX3NuYXBzaG90LCBuZXcsXFxuK1xcdFxcdFxcdFxcdCAgbG9ja2RlcF9pc19oZWxkKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKSk7XFxuK1xcdGlmIChvbGQpXFxuK1xcdFxcdGt2ZnJlZV9yY3Uob2xkLCByY3UpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGJpbmRfbm9kZV90b19wYWNrYWdlKGludCBuaWQpXFxuK3tcXG4rXFx0aW50IHBhY2thZ2VfaWQsIHBrZ19pZDtcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcXG4rXFx0bm9kZW1hc2tfdCBub2RlcywgY3B1LCBtZW07XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0aWYgKCFtcG5zW25pZF0pIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFx0cGFja2FnZV9pZCA9IG1wbnNbbmlkXS1cXHUwMDNlcGFja2FnZV9pZDtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdG1wID0gZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UocGFja2FnZV9pZCk7XFxuK1xcdGlmIChJU19FUlIobXApKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihtcCk7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0aWYgKCFtcG5zW25pZF0pIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFx0bXBuc1tuaWRdLVxcdTAwM2VwYWNrYWdlID0gbXA7XFxuK1xcdG5vZGVfc2V0KG1wbnNbbmlkXS1cXHUwMDNlbmlkLCBtcC1cXHUwMDNlbm9kZXMpO1xcbitcXHRpZiAobm9kZV9pc19tZW1vcnlfb25seShtcG5zW25pZF0tXFx1MDAzZW5pZCkpIHtcXG4rXFx0XFx0bm9kZV9zZXQobXBuc1tuaWRdLVxcdTAwM2VuaWQsIG1wLVxcdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XFxuK1xcdFxcdGxpc3RfYWRkKFxcdTAwMjZtcG5zW25pZF0tXFx1MDAzZXBhY2thZ2VfZW50cnksIFxcdTAwMjZtcC1cXHUwMDNlbWVtb3J5X29ubHlfbGlzdCk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdG5vZGVfc2V0KG1wbnNbbmlkXS1cXHUwMDNlbmlkLCBtcC1cXHUwMDNlY3B1X25vZGVzKTtcXG4rXFx0XFx0bGlzdF9hZGQoXFx1MDAyNm1wbnNbbmlkXS1cXHUwMDNlcGFja2FnZV9lbnRyeSwgXFx1MDAyNm1wLVxcdTAwM2VjcHVfbGlzdCk7XFxuK1xcdH1cXG4rXFx0dXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKG1wKTtcXG4rXFx0bXBfc25hcHNob3RfcmVidWlsZCgpO1xcbitcXHRwa2dfaWQgPSBtcC1cXHUwMDNlcGFja2FnZV9pZDtcXG4rXFx0bm9kZXMgPSBtcC1cXHUwMDNlbm9kZXM7XFxuK1xcdGNwdSA9IG1wLVxcdTAwM2VjcHVfbm9kZXM7XFxuK1xcdG1lbSA9IG1wLVxcdTAwM2VtZW1vcnlfb25seV9ub2RlcztcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdHByX2luZm8oXFxcIm1lbW9yeV9wYWNrYWdlICVkOiBub2Rlcz0lKnBibCBjcHU9JSpwYmwgbWVtb3J5X29ubHk9JSpwYmxcXFxcblxcXCIsXFxuK1xcdFxcdHBrZ19pZCwgbm9kZW1hc2tfcHJfYXJncyhcXHUwMDI2bm9kZXMpLFxcbitcXHRcXHRub2RlbWFza19wcl9hcmdzKFxcdTAwMjZjcHUpLCBub2RlbWFza19wcl9hcmdzKFxcdTAwMjZtZW0pKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB1bmJpbmRfbm9kZV90b19wYWNrYWdlKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsIGludCBuaWQpXFxuK3tcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRub2RlX2NsZWFyKG5pZCwgbXAtXFx1MDAzZW5vZGVzKTtcXG4rXFx0aWYgKG5vZGVfc3RhdGUobmlkLCBOX0NQVSkpXFxuK1xcdFxcdG5vZGVfY2xlYXIobmlkLCBtcC1cXHUwMDNlY3B1X25vZGVzKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRub2RlX2NsZWFyKG5pZCwgbXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFxuK1xcdGlmIChtcG5zW25pZF0pXFxuK1xcdFxcdGxpc3RfZGVsKFxcdTAwMjZtcG5zW25pZF0tXFx1MDAzZXBhY2thZ2VfZW50cnkpO1xcbitcXG4rXFx0dXBkYXRlX3BhY2thZ2VfcHJlZmVycmVkKG1wKTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICpjcmVhdGVfcGFja2FnZV9ub2RlKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxcbit7XFxuK1xcdGludCBjcHVfbmlkLCBwYWNrYWdlX2lkO1xcbitcXHRpbnQgc291cmNlX2ZsYWdzO1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xcbitcXG4rXFx0aWYgKG5vZGVfc3RhdGUobmlkLCBOX0NQVSkpIHtcXG4rXFx0XFx0Y3B1X25pZCA9IG5pZDtcXG4rXFx0XFx0c291cmNlX2ZsYWdzID0gTVBOX1NSQ19DUFU7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGlmIChpbml0aWF0b3JfbmlkIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0XFx0Y3B1X25pZCA9IGluaXRpYXRvcl9uaWQ7XFxuK1xcdFxcdFxcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfSU5JVElBVE9SO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBObyBkcml2ZXItc3VwcGxpZWQgaW5pdGlhdG9yOiBmYWxsIGJhY2sgdG8gdGhlXFxuK1xcdFxcdFxcdCAqIG5lYXJlc3QgQ1BVIG5vZGUgKHZpYSBTTElUL251bWFfZGlzdGFuY2UpLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0Y3B1X25pZCA9IG51bWFfbmVhcmVzdF9ub2RlKG5pZCwgTl9DUFUpO1xcbitcXHRcXHRcXHRzb3VyY2VfZmxhZ3MgPSBNUE5fU1JDX1NMSVQ7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cGFja2FnZV9pZCA9IG1wX25vZGVfdG9fcGFja2FnZV9pZChjcHVfbmlkKTtcXG4rXFx0aWYgKHBhY2thZ2VfaWQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4rXFxuK1xcdG1wbiA9IGt6YWxsb2Nfb2JqKCptcG4pO1xcbitcXHRpZiAoIW1wbilcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuK1xcbitcXHRtcG4tXFx1MDAzZW5pZCA9IG5pZDtcXG4rXFx0bXBuLVxcdTAwM2Vpbml0aWF0b3JfbmlkID0gY3B1X25pZDtcXG4rXFx0bXBuLVxcdTAwM2VwYWNrYWdlX2lkID0gcGFja2FnZV9pZDtcXG4rXFx0bXBuLVxcdTAwM2Vzb3VyY2VfZmxhZ3MgPSBzb3VyY2VfZmxhZ3M7XFxuK1xcdG1wbi1cXHUwMDNlcHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7XFxuK1xcdG1wbi1cXHUwMDNlcGFja2FnZSA9IE5VTEw7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtcG4tXFx1MDAzZXBhY2thZ2VfZW50cnkpO1xcbitcXG4rXFx0cmV0dXJuIG1wbjtcXG4rfVxcbitcXG4rLypcXG4rICogVG9wb2xvZ3kgc3ltbWV0cnkgc3RhdHVzXFxuKyAqIEluZGljYXRlcyB3aGV0aGVyIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxcbisgKiAoc2FtZSBudW1iZXIgb2YgQ1BVIG5vZGVzIGFuZCBtZW1vcnktb25seSBub2RlcykuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCB0b3BvbG9neV9zeW1tZXRyaWM7XFxuK1xcbitzdGF0aWMgdm9pZCB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSh2b2lkKTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKl9fZGVzdHJveV9wYWNrYWdlX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuO1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCAqdW5yZWdfbXAgPSBOVUxMO1xcbitcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRtcG4gPSBtcG5zW25pZF07XFxuK1xcdGlmICghbXBuKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdG1wID0gbXBuLVxcdTAwM2VwYWNrYWdlO1xcbitcXHRpZiAobXApIHtcXG4rXFx0XFx0dW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTtcXG4rXFx0XFx0bXBuLVxcdTAwM2VwYWNrYWdlID0gTlVMTDtcXG4rXFxuK1xcdFxcdGlmIChtZW1vcnlfcGFja2FnZV9pc19lbXB0eShtcCkpIHtcXG4rXFx0XFx0XFx0bGlzdF9kZWwoXFx1MDAyNm1wLVxcdTAwM2VsaXN0KTtcXG4rXFx0XFx0XFx0dW5yZWdfbXAgPSBtcDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRtcG5zW25pZF0gPSBOVUxMO1xcbitcXHRrZnJlZShtcG4pO1xcbitcXHRtcF9zbmFwc2hvdF9yZWJ1aWxkKCk7XFxuK1xcbitcXHRyZXR1cm4gdW5yZWdfbXA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcDtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdGlmICh1bnJlZ19tcClcXG4rXFx0XFx0ZGV2aWNlX3VucmVnaXN0ZXIoXFx1MDAyNnVucmVnX21wLVxcdTAwM2VkZXYpO1xcbitcXG4rXFx0dmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkoKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBmaW5kX3BhY2thZ2Vfbm9kZShpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKnVucmVnX21wID0gTlVMTDtcXG4rXFx0aW50IHJldCA9IG5pZDtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRpZiAoIW1wbnNbbmlkXSkge1xcbitcXHRcXHRyZXQgPSBOVU1BX05PX05PREU7XFxuK1xcdH0gZWxzZSBpZiAobXBuc1tuaWRdLVxcdTAwM2Vzb3VyY2VfZmxhZ3MgPT0gTVBOX1NSQ19TTElUIFxcdTAwMjZcXHUwMDI2IGluaXRpYXRvcl9uaWQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBTTElULWRlcml2ZWQgZW50cmllcyBhcmUgcHJvdmlzaW9uYWw7IGlmIGEgZHJpdmVyIGxhdGVyXFxuK1xcdFxcdCAqIHByb3ZpZGVzIGFuIGV4cGxpY2l0IGluaXRpYXRvciwgZHJvcCB0aGUgcHJvdmlzaW9uYWxcXG4rXFx0XFx0ICogZW50cnkgYW5kIHJlYnVpbGQgd2l0aCB0aGUgc3Ryb25nZXIgaGludC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHVucmVnX21wID0gX19kZXN0cm95X3BhY2thZ2Vfbm9kZShuaWQpO1xcbitcXHRcXHRyZXQgPSBOVU1BX05PX05PREU7XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdGlmICh1bnJlZ19tcClcXG4rXFx0XFx0ZGV2aWNlX3VucmVnaXN0ZXIoXFx1MDAyNnVucmVnX21wLVxcdTAwM2VkZXYpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXFxuK3tcXG4rXFx0aW50IG1wbl9uaWQ7XFxuK1xcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XFxuK1xcbitcXHRtcG5fbmlkID0gZmluZF9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcXG4rXFx0aWYgKG1wbl9uaWQgIT0gTlVNQV9OT19OT0RFKVxcbitcXHRcXHRyZXR1cm4gbXBuX25pZDtcXG4rXFxuK1xcdG1wbiA9IGNyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcXG4rXFx0aWYgKElTX0VSUihtcG4pKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihtcG4pO1xcbitcXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0aWYgKG1wbnNbbmlkXSkge1xcbitcXHRcXHRrZnJlZShtcG4pO1xcbitcXHRcXHRyZXR1cm4gbmlkO1xcbitcXHR9XFxuK1xcdG1wbnNbbmlkXSA9IG1wbjtcXG4rXFxuK1xcdHJldHVybiBuaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIE5VTUFfTk9fTk9ERSk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYmluZF9ub2RlX3RvX3BhY2thZ2UobmlkKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IgLSBBZGQgYSBub2RlIHdpdGggYW4gaW5pdGlhdG9yXFxuKyAqIEBuaWQ6ICAgICAgICAgICAgVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXFxuKyAqIEBpbml0aWF0b3JfbmlkOiAgQ1BVIG5pZCB1c2VkIHRvIHJlc29sdmUgQG5pZCdzIHBhY2thZ2UgKFxcdTAwM2U9MCkuXFxuKyAqXFxuKyAqIEVuc3VyZXMgdGhhdCBhIFxcdTAwMjZzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSBleGlzdHMgZm9yIEBuaWQgYW5kIHRoYXQgaXRzXFxuKyAqIHBhY2thZ2VfaWQgaXMgZGV0ZXJtaW5lZCB1c2luZyBAaW5pdGlhdG9yX25pZCB3aGVuIHByb3ZpZGVkLiBCaW5kaW5nIHRvIHRoZVxcbisgKiBwYWNrYWdlIGlzIG5vdCBwZXJmb3JtZWQgaGVyZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9hZGRfcGFja2FnZV9ub2RlIC0gQWRkIGEgbm9kZSwgcmVzb2x2aW5nIHBhY2thZ2UgYXV0b21hdGljYWxseVxcbisgKiBAbmlkOiBUYXJnZXQgTlVNQSBub2RlIHRvIGFkZC5cXG4rICpcXG4rICogV3JhcHBlciBvdmVyIG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKCkgdGhhdCByZXF1ZXN0cyBhdXRvbWF0aWNcXG4rICogaW5pdGlhdG9yIHJlc29sdXRpb24gKGUuZy4sIG5lYXJlc3QgQ1BVKS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfYWRkX3BhY2thZ2Vfbm9kZSk7XFxuK1xcbitzdGF0aWMgaW50IF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcXG4rXFx0XFx0XFx0XFx0ICAgICBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0c3RydWN0IG1wX3NuYXBzaG90ICpzbmFwO1xcbitcXHRpbnQgcGtnO1xcbitcXG4rXFx0aWYgKCFvdXQpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0bm9kZXNfY2xlYXIoKm91dCk7XFxuK1xcbitcXHRpZiAobmlkIFxcdTAwM2MgMCB8fCBuaWQgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGd1YXJkKHJjdSkoKTtcXG4rXFxuK1xcdHNuYXAgPSByY3VfZGVyZWZlcmVuY2UobXBfc25hcHNob3QpO1xcbitcXHRpZiAoIXNuYXApXFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXG4rXFx0cGtnID0gc25hcC1cXHUwMDNlcGtnX29mW25pZF07XFxuK1xcdGlmIChwa2cgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdHN3aXRjaCAobm9kZV90eXBlKSB7XFxuK1xcdGNhc2UgTVBfTk9ERVNfQUxMOlxcbitcXHRcXHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXFx1MDAzZXBrZ1twa2ddLm5vZGVzKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTVBfTk9ERVNfQ1BVOlxcbitcXHRcXHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXFx1MDAzZXBrZ1twa2ddLmNwdV9ub2Rlcyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIE1QX05PREVTX01FTV9PTkxZOlxcbitcXHRcXHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXFx1MDAzZXBrZ1twa2ddLm1lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbitzdGF0aWMgaW50IF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLFxcbitcXHRcXHRcXHRcXHQgICAgbm9kZW1hc2tfdCAqb3V0KVxcbit7XFxuK1xcdGludCByZXQgPSAwO1xcbitcXG4rXFx0LyogTm8gaG90LXBhdGggY2FsbGVyczogdGhlIG11dGV4IGlzIGZpbmUgaGVyZS4gKi9cXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdGlmICghb3V0KSB7XFxuK1xcdFxcdHJldCA9IC1FSU5WQUw7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRub2Rlc19jbGVhcigqb3V0KTtcXG4rXFxuK1xcdGlmIChuaWQgXFx1MDAzYyAwIHx8IG5pZCBcXHUwMDNlPSBNQVhfTlVNTk9ERVMpIHtcXG4rXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChub2RlX3R5cGUgPT0gTVBfTk9ERVNfQ1BVKSB7XFxuK1xcdFxcdGlmIChub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIGlmIChub2RlX3R5cGUgPT0gTVBfTk9ERVNfTUVNX09OTFkpIHtcXG4rXFx0XFx0aWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHtcXG4rXFx0XFx0cmV0ID0gLUVOT0VOVDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG5vZGVzX2NvcHkoKm91dCwgbXBuc1tuaWRdLVxcdTAwM2VwcmVmZXJyZWQpO1xcbitcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayAtIERlbW90aW9uIGNhbmRpZGF0ZXMgd2l0aGluIGEgcGFja2FnZVxcbisgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLlxcbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBtZW1vcnktb25seSB0YXJnZXRzIGluIHRoZSBzYW1lIHBhY2thZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxcbisgKi9cXG4raW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxcbit7XFxuK1xcdHJldHVybiBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayk7XFxuK1xcbisvKipcXG4rICogbXBfbmV4dF9kZW1vdGlvbl9ub2RlIC0gUGljayBvbmUgZGVtb3Rpb24gdGFyZ2V0XFxuKyAqIEBuaWQ6IENQVSBub2RlIGZyb20gd2hpY2ggbWVtb3J5IHdvdWxkIGJlIGRlbW90ZWQuXFxuKyAqXFxuKyAqIFBpY2tzIG9uZSB0YXJnZXQgKHJhbmRvbSBhbW9uZyB0aGUgbmVhcmVzdCkgZnJvbSBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKCkuXFxuKyAqXFxuKyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cXG4rICovXFxuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRpbnQgdGFyZ2V0X25pZDtcXG4rXFx0bm9kZW1hc2tfdCB0YXJnZXRfbm9kZW1hc2s7XFxuK1xcbitcXHRpZiAobXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhuaWQsIFxcdTAwMjZ0YXJnZXRfbm9kZW1hc2spKVxcbitcXHRcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbitcXHRpZiAobm9kZXNfZW1wdHkodGFyZ2V0X25vZGVtYXNrKSlcXG4rXFx0XFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcXG4rXFxuK1xcdHRhcmdldF9uaWQgPSBub2RlX3JhbmRvbShcXHUwMDI2dGFyZ2V0X25vZGVtYXNrKTtcXG4rXFxuK1xcdHJldHVybiB0YXJnZXRfbmlkO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfZGVtb3Rpb25fbm9kZSk7XFxuK1xcbisvKipcXG4rICogbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2sgLSBQcm9tb3Rpb24gY2FuZGlkYXRlcyB3aXRoaW4gYSBwYWNrYWdlXFxuKyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG93YXJkcyB3aGljaCBwcm9tb3Rpb24gc2Vla3MgQ1BVIGxvY2FsaXR5LlxcbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBDUFUgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gaWYgQG5pZCBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZC5cXG4rICovXFxuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0cmV0dXJuIF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhuaWQsIE1QX05PREVTX01FTV9PTkxZLCBvdXQpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9uZXh0X3Byb21vdGlvbl9ub2RlIC0gUGljayBvbmUgcHJvbW90aW9uIHRhcmdldFxcbisgKiBAbmlkOiBNZW1vcnktb25seSBub2RlIHRvIGJlIHByb21vdGVkIHRvd2FyZHMgQ1BVcy5cXG4rICpcXG4rICogUGlja3Mgb25lIHRhcmdldCAocmFuZG9tIGFtb25nIHRoZSBuZWFyZXN0KSBmcm9tIG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKCkuXFxuKyAqXFxuKyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cXG4rICovXFxuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0aW50IHRhcmdldF9uaWQ7XFxuK1xcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xcbitcXG4rXFx0aWYgKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKG5pZCwgXFx1MDAyNnRhcmdldF9ub2RlbWFzaykpXFxuK1xcdFxcdHJldHVybiBOVU1BX05PX05PREU7XFxuK1xcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxcbitcXHRcXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xcbitcXG4rXFx0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFxcdTAwMjZ0YXJnZXRfbm9kZW1hc2spO1xcbitcXG4rXFx0cmV0dXJuIHRhcmdldF9uaWQ7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZSk7XFxuKyNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG4rXFxuKy8qKlxcbisgKiBtcF9nZXRfcGFja2FnZV9ub2RlcyAtIFJldHVybiBhbGwgbWVtYmVycyBvZiBAbmlkJ3MgcGFja2FnZVxcbisgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLlxcbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBhbGwgbWVtYmVycy5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXFxuKyAqL1xcbitpbnQgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxcbit7XFxuK1xcdHJldHVybiBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQUxMLCBvdXQpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX25vZGVzKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMgLSBSZXR1cm4gQ1BVIG1lbWJlcnMgb2YgQG5pZCdzIHBhY2thZ2VcXG4rICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS5cXG4rICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgQ1BVIG1lbWJlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxcbisgKi9cXG4raW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKTtcXG4rXFxuKy8qKlxcbisgKiBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyAtIFJldHVybiBtZW1vcnktb25seSBtZW1iZXJzIG9mIEBuaWQncyBwYWNrYWdlXFxuKyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuXFxuKyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIG1lbW9yeS1vbmx5IG1lbWJlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxcbisgKi9cXG4raW50IG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcXG4re1xcbitcXHRyZXR1cm4gX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhuaWQsIE1QX05PREVTX01FTV9PTkxZLCBvdXQpO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFxuK3N0YXRpYyBpbnQgX19tZW1pbml0IG1wX2hvdHBsdWdfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKl9hcmcpXFxuK3tcXG4rXFx0aW50IG5pZDtcXG4rXFx0c3RydWN0IG5vZGVfbm90aWZ5ICpubiA9IF9hcmc7XFxuK1xcbitcXHRuaWQgPSBubi1cXHUwMDNlbmlkO1xcbitcXHRpZiAobmlkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XFxuK1xcbitcXHRzd2l0Y2ggKGFjdGlvbikge1xcbitcXHRjYXNlIE5PREVfUkVNT1ZFRF9MQVNUX01FTU9SWTpcXG4rXFx0XFx0ZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRjYXNlIE5PREVfQURERURfRklSU1RfTUVNT1JZOlxcbitcXHRcXHRjcmVhdGVfbm9kZV93aXRoX3BhY2thZ2UobmlkKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIHN5c2ZzIGludGVyZmFjZSBmb3IgbWVtb3J5X3BhY2thZ2UgdG9wb2xvZ3lcXG4rICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6XFxuKyAqICAgLSBwYWNrYWdlX25vZGVzOiAgICAgICBBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcXG4rICogICAtIHBhY2thZ2VfY3B1X25vZGVzOiAgIENQVSBub2RlcyBpbiB0aGlzIHBhY2thZ2UgKG5vZGUgbWFzaylcXG4rICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxcbisgKiAgIC0gcGh5c2ljYWxfcGFja2FnZV9pZDogUGh5c2ljYWwgcGFja2FnZSBJRFxcbisgKi9cXG4rXFxuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2Vfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XFxuK1xcbitcXHRndWFyZChtdXRleCkoXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlKnBibFxcXFxuXFxcIiwgbm9kZW1hc2tfcHJfYXJncyhcXHUwMDI2bXAtXFx1MDAzZW5vZGVzKSk7XFxuK31cXG4rc3RhdGljIERFVklDRV9BVFRSX1JPKHBhY2thZ2Vfbm9kZXMpO1xcbitcXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9jcHVfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xcbitcXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFx0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcXFwiJSpwYmxcXFxcblxcXCIsIG5vZGVtYXNrX3ByX2FyZ3MoXFx1MDAyNm1wLVxcdTAwM2VjcHVfbm9kZXMpKTtcXG4rfVxcbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9jcHVfbm9kZXMpO1xcbitcXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9tZW1fb25seV9ub2Rlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XFxuK1xcbitcXHRndWFyZChtdXRleCkoXFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlKnBibFxcXFxuXFxcIiwgbm9kZW1hc2tfcHJfYXJncyhcXHUwMDI2bXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKSk7XFxuK31cXG4rc3RhdGljIERFVklDRV9BVFRSX1JPKHBhY2thZ2VfbWVtX29ubHlfbm9kZXMpO1xcbitcXG4rc3RhdGljIHNzaXplX3QgcGh5c2ljYWxfcGFja2FnZV9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcXG4rXFx0XFx0XFx0XFx0XFx0c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XFxuK1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlZFxcXFxuXFxcIiwgbXAtXFx1MDAzZXBhY2thZ2VfaWQpO1xcbit9XFxuK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwaHlzaWNhbF9wYWNrYWdlX2lkKTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptZW1vcnlfcGFja2FnZV9hdHRyc1tdID0ge1xcbitcXHRcXHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9ub2Rlcy5hdHRyLFxcbitcXHRcXHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9jcHVfbm9kZXMuYXR0cixcXG4rXFx0XFx1MDAyNmRldl9hdHRyX3BhY2thZ2VfbWVtX29ubHlfbm9kZXMuYXR0cixcXG4rXFx0XFx1MDAyNmRldl9hdHRyX3BoeXNpY2FsX3BhY2thZ2VfaWQuYXR0cixcXG4rXFx0TlVMTCxcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1lbW9yeV9wYWNrYWdlX2dyb3VwID0ge1xcbitcXHQuYXR0cnMgPSBtZW1vcnlfcGFja2FnZV9hdHRycyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICptZW1vcnlfcGFja2FnZV9ncm91cHNbXSA9IHtcXG4rXFx0XFx1MDAyNm1lbW9yeV9wYWNrYWdlX2dyb3VwLFxcbitcXHROVUxMLFxcbit9O1xcbitcXG4rc3RhdGljIGludCBfX2luaXQgbWVtb3J5X3BhY2thZ2Vfc3lzZnNfaW5pdCh2b2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyKFxcdTAwMjZwYWNrYWdlX3N1YnN5cywgTlVMTCk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJtZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcXFxcblxcXCIsIHJldCk7XFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rY29yZV9pbml0Y2FsbChtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KTtcXG4rXFxuKy8qKlxcbisgKiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMgLSBDaGVjayBpZiBhbGwgcGFja2FnZXMgaGF2ZSBpZGVudGljYWwgbm9kZSBzdHJ1Y3R1cmVcXG4rICpcXG4rICogUmV0dXJucyB0cnVlIGlmIGFsbCBtZW1vcnkgcGFja2FnZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgQ1BVIG5vZGVzXFxuKyAqIGFuZCBtZW1vcnktb25seSBub2RlcywgaW5kaWNhdGluZyBhIHN5bW1ldHJpYyB0b3BvbG9neS5cXG4rICpcXG4rICogVGhlIHRvcG9sb2d5X3N5bW1ldHJpYyB2YXJpYWJsZSBpcyBwcm90ZWN0ZWQgYnkgbWVtb3J5X3BhY2thZ2VfbG9jayBmb3JcXG4rICogd3JpdGVzIChpbiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSkuXFxuKyAqL1xcbitib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBSRUFEX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChtcF9pc190b3BvbG9neV9zeW1tZXRyaWMpO1xcbitcXG4rLyogV2FsayB0aGUgcGFja2FnZSBsaXN0IGFuZCBjb21wYXJlIG5vZGUgY291bnRzOyB0aGUgY2FsbGVyIGhvbGRzIHRoZSBsb2NrLiAqL1xcbitzdGF0aWMgYm9vbCBfX2NoZWNrX3RvcG9sb2d5X3N5bW1ldHJ5KHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcXG4rXFx0aW50IHJlZl9jcHVfbm9kZV9jb3VudCA9IDAsIHJlZl9tZW1vcnlfb25seV9ub2RlX2NvdW50ID0gMDtcXG4rXFx0aW50IHBhY2thZ2VfY291bnQgPSAwO1xcbitcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XFxuK1xcbitcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XFxuK1xcdFxcdGludCBjcHVfbm9kZV9jb3VudCA9IG5vZGVzX3dlaWdodChtcC1cXHUwMDNlY3B1X25vZGVzKTtcXG4rXFx0XFx0aW50IG1lbW9yeV9vbmx5X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXFx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKTtcXG4rXFx0XFx0aW50IHRvdGFsX25vZGVfY291bnQgPSBjcHVfbm9kZV9jb3VudCArIG1lbW9yeV9vbmx5X25vZGVfY291bnQ7XFxuK1xcbitcXHRcXHRwYWNrYWdlX2NvdW50Kys7XFxuK1xcbitcXHRcXHQvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi9cXG4rXFx0XFx0aWYgKHRvdGFsX25vZGVfY291bnQgXFx1MDAzYyAyKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRpZiAocGFja2FnZV9jb3VudCA9PSAxKSB7XFxuK1xcdFxcdFxcdHJlZl9jcHVfbm9kZV9jb3VudCA9IGNwdV9ub2RlX2NvdW50O1xcbitcXHRcXHRcXHRyZWZfbWVtb3J5X29ubHlfbm9kZV9jb3VudCA9IG1lbW9yeV9vbmx5X25vZGVfY291bnQ7XFxuK1xcdFxcdH0gZWxzZSBpZiAoY3B1X25vZGVfY291bnQgIT0gcmVmX2NwdV9ub2RlX2NvdW50IHx8XFxuK1xcdFxcdFxcdCAgIG1lbW9yeV9vbmx5X25vZGVfY291bnQgIT0gcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQpIHtcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChwYWNrYWdlX2NvdW50IFxcdTAwM2MgMilcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuKy8qKlxcbisgKiB2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSAtIFZhbGlkYXRlIHRvcG9sb2d5IGZvciBwYWNrYWdlLWF3YXJlIGZlYXR1cmVzXFxuKyAqXFxuKyAqIFZhbGlkYXRlcyB0b3BvbG9neSBzeW1tZXRyeSBieSBjaGVja2luZyBhbGwgbWVtb3J5IHBhY2thZ2VzIGhhdmUgaWRlbnRpY2FsXFxuKyAqIG5vZGUgc3RydWN0dXJlLiBVcGRhdGVzIHRoZSBnbG9iYWwgdG9wb2xvZ3lfc3ltbWV0cmljIHZhcmlhYmxlLlxcbisgKlxcbisgKiBUb3BvbG9neSBpcyB2YWxpZCBvbmx5IHdoZW4gYWxsIGNvbmRpdGlvbnMgYXJlIG1ldDpcXG4rICogMS4gQXQgbGVhc3QgMiBwYWNrYWdlcyBleGlzdCAobXVsdGktcGFja2FnZSBzeXN0ZW0pXFxuKyAqIDIuIEFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBjcHVfbm9kZSBhbmQgbWVtb3J5X29ubHlfbm9kZSBjb3VudHNcXG4rICogMy4gRWFjaCBwYWNrYWdlIGhhcyBhdCBsZWFzdCAyIHRvdGFsIG5vZGVzIChjcHVfbm9kZSArIG1lbW9yeV9vbmx5X25vZGUgXFx1MDAzZT0gMilcXG4rICpcXG4rICogVmFsaWQgY29uZmlndXJhdGlvbnMgcGVyIHBhY2thZ2U6XFxuKyAqIC0gMSBjcHVfbm9kZSArIDEgbWVtb3J5X29ubHlfbm9kZSA9IDIgbm9kZXMgKHZhbGlkKVxcbisgKiAtIDIgY3B1X25vZGVzICsgMCBtZW1vcnlfb25seV9ub2RlID0gMiBub2RlcyAodmFsaWQpXFxuKyAqIC0gMCBjcHVfbm9kZSArIDIgbWVtb3J5X29ubHlfbm9kZXMgPSAyIG5vZGVzICh2YWxpZClcXG4rICogLSAxIGNwdV9ub2RlICsgMCBtZW1vcnlfb25seV9ub2RlID0gMSBub2RlIChpbnZhbGlkIC0gc2luZ2xlIG5vZGUgcGFja2FnZSlcXG4rICovXFxuK3N0YXRpYyB2b2lkIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KHZvaWQpXFxuK3tcXG4rXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcXG4rXFxuK1xcdFdSSVRFX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljLCBfX2NoZWNrX3RvcG9sb2d5X3N5bW1ldHJ5KCkpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfcGFja2FnZV9pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldCA9IDAsIG5pZDtcXG4rXFxuK1xcdGZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkge1xcbitcXHRcXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0cmV0ID0gY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRob3RwbHVnX25vZGVfbm90aWZpZXIobXBfaG90cGx1Z19jYWxsYmFjaywgTUVNVElFUl9IT1RQTFVHX1BSSSk7XFxuK1xcbitcXHR2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpO1xcbitcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK2xhdGVfaW5pdGNhbGwobWVtb3J5X3BhY2thZ2VfaW5pdCk7XFxuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcXG5pbmRleCA0ZTQ0MjFiMjJiNTlmLi42NmJjY2I5YTBhMTkxIDEwMDY0NFxcbi0tLSBhL21tL21lbXBvbGljeS5jXFxuKysrIGIvbW0vbWVtcG9saWN5LmNcXG5AQCAtMTE3LDYgKzExNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vdGxiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC91YWNjZXNzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1vcnkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuIFxcbkBAIC0xNjcsNiArMTY4LDggQEAgc3RhdGljIHVuc2lnbmVkIGludCAqbm9kZV9id190YWJsZTtcXG4gICovXFxuIHN0YXRpYyBERUZJTkVfTVVURVgod2lfc3RhdGVfbG9jayk7XFxuIFxcbitzdGF0aWMgYm9vbCBwYWNrYWdlX21vZGVfZW5hYmxlZDtcXG4rXFxuIHN0YXRpYyB1OCBnZXRfaWxfd2VpZ2h0KGludCBub2RlKVxcbiB7XFxuIFxcdHN0cnVjdCB3ZWlnaHRlZF9pbnRlcmxlYXZlX3N0YXRlICpzdGF0ZTtcXG5AQCAtMTgwLDYgKzE4MywxMSBAQCBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcXG4gXFx0cmV0dXJuIHdlaWdodDtcXG4gfVxcbiBcXG4rc3RhdGljIGJvb2wgd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQodm9pZClcXG4re1xcbitcXHRyZXR1cm4gUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSBcXHUwMDI2XFx1MDAyNiBtcF9pc190b3BvbG9neV9zeW1tZXRyaWMoKTtcXG4rfVxcbitcXG4gLypcXG4gICogQ29udmVydCBiYW5kd2lkdGggdmFsdWVzIGludG8gd2VpZ2h0ZWQgaW50ZXJsZWF2ZSB3ZWlnaHRzLlxcbiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay5cXG5AQCAtMzM3LDYgKzM0NSw0NyBAQCBpbnQgbmVhcmVzdF9ub2RlX25vZGVtYXNrKGludCBub2RlLCBub2RlbWFza190ICptYXNrKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKG5lYXJlc3Rfbm9kZV9ub2RlbWFzayk7XFxuIFxcbisvKipcXG4rICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGVcXG4rICogQG5vZGU6IFRoZSByZWZlcmVuY2Ugbm9kZSBJRCB0byBtZWFzdXJlIGRpc3RhbmNlIGZyb21cXG4rICogQG1hc2s6IFRoZSBzZXQgb2YgY2FuZGlkYXRlIG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdFxcbisgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciBhbGwgbm9kZXMgaW4gQG1hc2sgYW5kIG1lYXN1cmVzIHRoZSBkaXN0YW5jZVxcbisgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuXFxuKyAqIEl0IGZpbmRzIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGFuZCB0aGVuIHJlY29yZHMgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXRcXG4rICogc2hhcmUgdGhhdCBzYW1lIG1pbmltdW0gZGlzdGFuY2UgaW50byB0aGUgb3V0cHV0IG1hc2sgQG91dC5cXG4rICpcXG4rICogRm9yIGV4YW1wbGUsIGlmIG11bHRpcGxlIG5vZGVzIGhhdmUgZXF1YWwgbWluaW1hbCBkaXN0YW5jZSB0byBAbm9kZSwgYWxsXFxuKyAqIG9mIHRoZW0gYXJlIGluY2x1ZGVkIGluIEBvdXQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciAtRUlOVkFMIGlmIEBvdXQgaXMgTlVMTC5cXG4rICovXFxuK2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpXFxuK3tcXG4rXFx0aW50IGRpc3QsIG4sIG1pbl9kaXN0ID0gSU5UX01BWDtcXG4rXFxuK1xcdGlmICghb3V0KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdG5vZGVzX2NsZWFyKCpvdXQpO1xcbitcXG4rXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7XFxuK1xcdFxcdGRpc3QgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pO1xcbitcXG4rXFx0XFx0aWYgKGRpc3QgXFx1MDAzYyBtaW5fZGlzdCkge1xcbitcXHRcXHRcXHRtaW5fZGlzdCA9IGRpc3Q7XFxuK1xcdFxcdFxcdG5vZGVzX2NsZWFyKCpvdXQpO1xcbitcXHRcXHRcXHRub2RlX3NldChuLCAqb3V0KTtcXG4rXFx0XFx0fSBlbHNlIGlmIChkaXN0ID09IG1pbl9kaXN0KSB7XFxuK1xcdFxcdFxcdG5vZGVfc2V0KG4sICpvdXQpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2spO1xcbitcXG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcXG4ge1xcbiBcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBwLVxcdTAwM2VtZW1wb2xpY3k7XFxuQEAgLTIwOTcsMTcgKzIxNDYsOTcgQEAgYm9vbCBhcHBseV9wb2xpY3lfem9uZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIGVudW0gem9uZV90eXBlIHpvbmUpXFxuIFxcdHJldHVybiB6b25lIFxcdTAwM2U9IGR5bmFtaWNfcG9saWN5X3pvbmU7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2VcXG4rICogQHBvbGljeTogVGFyZ2V0IG1lbXBvbGljeSB3aG9zZSB1c2VyLXNlbGVjdGVkIG5vZGVzIGFyZSBpbiBAcG9saWN5LVxcdTAwM2Vub2Rlcy5cXG4rICogQG1hc2s6ICAgT3V0cHV0IG5vZGVtYXNrLiBPbiBzdWNjZXNzLCBjb250YWlucyBwb2xpY3ktXFx1MDAzZW5vZGVzIGxpbWl0ZWQgdG9cXG4rICogICAgICAgICAgdGhlIHBhY2thZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGFsbG9jYXRpb24uXFxuKyAqXFxuKyAqIFRoaXMgaGVscGVyIGNvbWJpbmVzIHR3byBjb25zdHJhaW50cyB0byBkZWNpZGUgd2hlcmUgd2l0aGluIGEgcGFja2FnZVxcbisgKiBtZW1vcnkgbWF5IGJlIGFsbG9jYXRlZDpcXG4rICpcXG4rICogICAxKSBUaGUgY2FsbGVyJ3MgcGFja2FnZTogZGVyaXZlZCB2aWEgbXBfZ2V0X3BhY2thZ2Vfbm9kZXMobnVtYV9ub2RlX2lkKCkpLlxcbisgKiAgIDIpIFRoZSB1c2VyJ3MgcHJlc2VsZWN0ZWQgc2V0IEBwb2xpY3ktXFx1MDAzZW5vZGVzIChjcHVzZXRzL21lbXBvbGljeSkuXFxuKyAqXFxuKyAqIFRoZSBmdW5jdGlvbiBvYnRhaW5zIHRoZSBub2RlbWFzayBvZiB0aGUgY3VycmVudCBDUFUncyBwYWNrYWdlIGFuZFxcbisgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS1cXHUwMDNlbm9kZXMuIElmIHRoZSBpbnRlcnNlY3Rpb24gaXMgZW1wdHkgKGUuZy4gdGhlXFxuKyAqIHVzZXIgZXhjbHVkZWQgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlKSwgaXQgZmFsbHMgYmFjayB0byB0aGVcXG4rICogbm9kZSBpbiBAcG9saWN5LVxcdTAwM2Vub2RlcywgZGVyaXZlcyB0aGF0IG5vZGUncyBwYWNrYWdlLCBhbmQgaW50ZXJzZWN0c1xcbisgKiBhZ2Fpbi4gSWYgdGhlIGZhbGxiYWNrIGFsc28geWllbGRzIGFuIGVtcHR5IHNldCwgQG1hc2sgc3RheXMgZW1wdHkgYW5kIGFcXG4rICogbm9uLXplcm8gZXJyb3IgaXMgcmV0dXJuZWQuXFxuKyAqXFxuKyAqIEV4YW1wbGVzIChwYWNrYWdlczogUDA9e0NQVTowLCBNRU06Mn0sIFAxPXtDUFU6MSwgTUVNOjN9KTpcXG4rICogICAtIHBvbGljeS1cXHUwMDNlbm9kZXMgPSB7MCwxLDIsM31cXG4rICogICAgICAgb24gUDA6IG1hc2sgPSB7MCwyfTsgb24gUDE6IG1hc2sgPSB7MSwzfS5cXG4rICogICAtIHBvbGljeS1cXHUwMDNlbm9kZXMgPSB7MCwxLDN9XFxuKyAqICAgICAgIG9uIFAwOiBtYXNrID0gezB9ICAgICAgKG9ubHkgbm9kZSAwIGZyb20gUDAgaXMgYWxsb3dlZCkuXFxuKyAqICAgLSBwb2xpY3ktXFx1MDAzZW5vZGVzID0gezEsMiwzfVxcbisgKiAgICAgICBvbiBQMDogbWFzayA9IHsyfSAgICAgIChvbmx5IG5vZGUgMiBmcm9tIFAwIGlzIGFsbG93ZWQpLlxcbisgKiAgIC0gcG9saWN5LVxcdTAwM2Vub2RlcyA9IHsxLDN9XFxuKyAqICAgICAgIG9uIFAwOiBjdXJyZW50IHBhY2thZ2UgKFAwKSBcXHUwMDI2IHBvbGljeSA9IE5VTEwgLVxcdTAwM2UgZmFsbGJhY2sgdG8gcG9saWN5PTEsXFxuKyAqICAgICAgICAgICAgICAgcGFja2FnZSgxKT1QMSwgbWFzayA9IHsxLDN9LiAoVXNlciBlZmZlY3RpdmVseSBvcHRlZCBvdXQgb2YgUDAuKVxcbisgKlxcbisgKiBJZiB0aGUgc2VsZWN0ZWQgbm9kZSBpcyBsb3cgb24gbWVtb3J5LCB0aGUgYWxsb2NhdGlvbiBtYXkgdXNlIGFub3RoZXIgbm9kZS5cXG4rICpcXG4rICogUmV0dXJuOlxcbisgKiAgIDAgb24gc3VjY2VzcyB3aXRoIEBtYXNrIHNldCBhcyBhYm92ZTtcXG4rICogICAtRUlOVkFMIGlmIEBwb2xpY3kvQG1hc2sgaXMgTlVMTDtcXG4rICogICAtRU5PRU5UIGlmIGV2ZW4gdGhlIGZhbGxiYWNrIGludGVyc2VjdGlvbiBpcyBlbXB0eTtcXG4rICogICBQcm9wYWdhdGVkIGVycm9yIGZyb20gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMoKSBvbiBmYWlsdXJlLlxcbisgKi9cXG4rc3RhdGljIGludCBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgbm9kZW1hc2tfdCAqbWFzaylcXG4re1xcbitcXHRub2RlbWFza190IHBhY2thZ2VfbWFzaztcXG4rXFx0aW50IG5vZGUsIHJldDtcXG4rXFxuK1xcdGlmICghcG9saWN5IHx8ICFtYXNrKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdG5vZGVzX2NsZWFyKCptYXNrKTtcXG4rXFxuK1xcdG5vZGUgPSBudW1hX25vZGVfaWQoKTtcXG4rXFx0cmV0ID0gbXBfZ2V0X3BhY2thZ2Vfbm9kZXMobm9kZSwgXFx1MDAyNnBhY2thZ2VfbWFzayk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRub2Rlc19hbmQoKm1hc2ssIHBhY2thZ2VfbWFzaywgcG9saWN5LVxcdTAwM2Vub2Rlcyk7XFxuK1xcdGlmICghbm9kZXNfZW1wdHkoKm1hc2spKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB1c2VyJ3Mgbm9kZW1hc2sgZXhjbHVkZXMgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlO1xcbitcXHQgKiBmYWxsIGJhY2sgdG8gdGhlIHBhY2thZ2Ugc3Bhbm5lZCBieSB0aGUgdXNlcidzIG93biBmaXJzdCBub2RlLlxcbitcXHQgKi9cXG4rXFx0bm9kZSA9IGZpcnN0X25vZGUocG9saWN5LVxcdTAwM2Vub2Rlcyk7XFxuK1xcdHJldCA9IG1wX2dldF9wYWNrYWdlX25vZGVzKG5vZGUsIFxcdTAwMjZwYWNrYWdlX21hc2spO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0bm9kZXNfYW5kKCptYXNrLCBwYWNrYWdlX21hc2ssIHBvbGljeS1cXHUwMDNlbm9kZXMpO1xcbitcXHRpZiAobm9kZXNfZW1wdHkoKm1hc2spKVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KVxcbiB7XFxuIFxcdHVuc2lnbmVkIGludCBub2RlO1xcbiBcXHR1bnNpZ25lZCBpbnQgY3B1c2V0X21lbXNfY29va2llO1xcbitcXHRub2RlbWFza190IG1hc2s7XFxuIFxcbiByZXRyeTpcXG4gXFx0LyogdG8gcHJldmVudCBtaXNjb3VudCB1c2UgdHNrLVxcdTAwM2VtZW1zX2FsbG93ZWRfc2VxIHRvIGRldGVjdCByZWJpbmQgKi9cXG4gXFx0Y3B1c2V0X21lbXNfY29va2llID0gcmVhZF9tZW1zX2FsbG93ZWRfYmVnaW4oKTtcXG4gXFx0bm9kZSA9IGN1cnJlbnQtXFx1MDAzZWlsX3ByZXY7XFxuLVxcdGlmICghY3VycmVudC1cXHUwMDNlaWxfd2VpZ2h0IHx8ICFub2RlX2lzc2V0KG5vZGUsIHBvbGljeS1cXHUwMDNlbm9kZXMpKSB7XFxuLVxcdFxcdG5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgcG9saWN5LVxcdTAwM2Vub2Rlcyk7XFxuK1xcbitcXHQvKiBQYWNrYWdlIG1vZGUgb2ZmIG9yIHVucmVzb2x2ZWQ6IGZhbGwgYmFjayB0byB0aGUgZnVsbCBwb2xpY3kgbm9kZW1hc2suICovXFxuK1xcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fFxcbitcXHQgICAgcG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2xpY3ksIFxcdTAwMjZtYXNrKSlcXG4rXFx0XFx0bWFzayA9IHBvbGljeS1cXHUwMDNlbm9kZXM7XFxuK1xcbitcXHRpZiAoIWN1cnJlbnQtXFx1MDAzZWlsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBtYXNrKSkge1xcbitcXHRcXHRub2RlID0gbmV4dF9ub2RlX2luKG5vZGUsIG1hc2spO1xcbiBcXHRcXHRpZiAocmVhZF9tZW1zX2FsbG93ZWRfcmV0cnkoY3B1c2V0X21lbXNfY29va2llKSlcXG4gXFx0XFx0XFx0Z290byByZXRyeTtcXG4gXFx0XFx0aWYgKG5vZGUgPT0gTUFYX05VTU5PREVTKVxcbkBAIC0yMjAwLDYgKzIzMjksMzAgQEAgc3RhdGljIHVuc2lnbmVkIGludCByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcXG4gXFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFBhY2thZ2UtYXdhcmUgY291bnRlcnBhcnQgb2YgcmVhZF9vbmNlX3BvbGljeV9ub2RlbWFzaygpOiByZXNvbHZlIHRoZVxcbisgKiBjdXJyZW50IHBhY2thZ2UncyBub2RlcyBpbnRlcnNlY3RlZCB3aXRoIHRoZSBwb2xpY3ksIGZhbGxpbmcgYmFjayB0byB0aGVcXG4rICogZnVsbCBwb2xpY3kgbm9kZW1hc2sgd2hlbiBwYWNrYWdlIG1vZGUgaXMgb2ZmIG9yIHJlc29sdXRpb24gZmFpbHMuXFxuKyAqL1xcbitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfcGFja2FnZV9ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIG5vZGVtYXNrX3QgKm1hc2spXFxuK3tcXG4rXFx0bm9kZW1hc2tfdCBwYWNrYWdlX21hc2s7XFxuK1xcbitcXHRiYXJyaWVyKCk7XFxuK1xcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSkge1xcbitcXHRcXHRtZW1jcHkobWFzaywgXFx1MDAyNnBvbC1cXHUwMDNlbm9kZXMsIHNpemVvZihub2RlbWFza190KSk7XFxuK1xcdFxcdHJldHVybiBub2Rlc193ZWlnaHQoKm1hc2spO1xcbitcXHR9XFxuK1xcdGlmIChwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHBvbCwgXFx1MDAyNnBhY2thZ2VfbWFzaykpXFxuK1xcdFxcdG1lbWNweShtYXNrLCBcXHUwMDI2cG9sLVxcdTAwM2Vub2Rlcywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRtZW1jcHkobWFzaywgXFx1MDAyNnBhY2thZ2VfbWFzaywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcXG4rXFx0YmFycmllcigpO1xcbitcXG4rXFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XFxuK31cXG4rXFxuIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcXG4ge1xcbiBcXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XFxuQEAgLTIyMTAsNyArMjM2Myw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBwZ29mZl90IGlseClcXG4gXFx0dTggd2VpZ2h0O1xcbiBcXHRpbnQgbmlkID0gMDtcXG4gXFxuLVxcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9ub2RlbWFzayhwb2wsIFxcdTAwMjZub2RlbWFzayk7XFxuK1xcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXFx1MDAyNm5vZGVtYXNrKTtcXG4gXFx0aWYgKCFucl9ub2RlcylcXG4gXFx0XFx0cmV0dXJuIG51bWFfbm9kZV9pZCgpO1xcbiBcXG5AQCAtMjY1NCw3ICsyODA3LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKGdmcF90IGdmcCxcXG4gXFx0LyogcmVhZCB0aGUgbm9kZXMgb250byB0aGUgc3RhY2ssIHJldHJ5IGlmIGRvbmUgZHVyaW5nIHJlYmluZCAqL1xcbiBcXHRkbyB7XFxuIFxcdFxcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XFxuLVxcdFxcdG5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCBcXHUwMDI2bm9kZXMpO1xcbitcXHRcXHRubm9kZXMgPSByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2socG9sLCBcXHUwMDI2bm9kZXMpO1xcbiBcXHR9IHdoaWxlIChyZWFkX21lbXNfYWxsb3dlZF9yZXRyeShjcHVzZXRfbWVtc19jb29raWUpKTtcXG4gXFxuIFxcdC8qIGlmIHRoZSBub2RlbWFzayBoYXMgYmVjb21lIGludmFsaWQsIHdlIGNhbm5vdCBkbyBhbnl0aGluZyAqL1xcbkBAIC0zNzk0LDcgKzM5NDcsNDIgQEAgc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSB3aV9hdXRvX2F0dHIgPSB7XFxuIFxcdC5zdG9yZSA9IHdlaWdodGVkX2ludGVybGVhdmVfYXV0b19zdG9yZSxcXG4gfTtcXG4gXFxuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxcbitcXHRcXHRzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4re1xcbitcXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFxcXCIlc1xcXFxuXFxcIiwgc3RyX3RydWVfZmFsc2UoUkVBRF9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkKSkpO1xcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBwYWNrYWdlX21vZGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosXFxuK1xcdFxcdHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0Ym9vbCBpbnB1dDtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdGVyciA9IGtzdHJ0b2Jvb2woYnVmLCBcXHUwMDI2aW5wdXQpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0LypcXG4rXFx0ICogRGlzYWJsZSBwYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9naWVzLlxcbitcXHQgKiBOb24tc3ltbWV0cmljIHRvcG9sb2d5IChlLmcuLCBhc3ltbWV0cmljIENYTCBtZW1vcnkgYXR0YWNobWVudCkgY2FuXFxuK1xcdCAqIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlmIHBhY2thZ2UtYXdhcmUgYWxsb2NhdGlvbiBpcyB1c2VkLlxcbitcXHQgKiBSZWplY3QgZW5hYmxlIHJlcXVlc3QgaWYgdG9wb2xvZ3kgaXMgbm90IHN5bW1ldHJpYy5cXG4rXFx0ICovXFxuK1xcdGlmIChpbnB1dCBcXHUwMDI2XFx1MDAyNiAhbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKCkpIHtcXG4rXFx0XFx0cHJfd2FybihcXFwicGFja2FnZV9tb2RlIGNhbm5vdCBiZSBlbmFibGVkIG9uIG5vbi1zeW1tZXRyaWMgdG9wb2xvZ3lcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0V1JJVEVfT05DRShwYWNrYWdlX21vZGVfZW5hYmxlZCwgaW5wdXQpO1xcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfcGFja2FnZV9tb2RlX2F0dHIgPVxcbitcXHRfX0FUVFIocGFja2FnZV9tb2RlLCAwNjY0LCBwYWNrYWdlX21vZGVfc2hvdywgcGFja2FnZV9tb2RlX3N0b3JlKTtcXG4rXFxuIHN0YXRpYyB2b2lkIHdpX2NsZWFudXAodm9pZCkge1xcbitcXHRzeXNmc19yZW1vdmVfZmlsZShcXHUwMDI2d2lfZ3JvdXAtXFx1MDAzZXdpX2tvYmosIFxcdTAwMjZ3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTtcXG4gXFx0c3lzZnNfcmVtb3ZlX2ZpbGUoXFx1MDAyNndpX2dyb3VwLVxcdTAwM2V3aV9rb2JqLCBcXHUwMDI2d2lfYXV0b19hdHRyLmF0dHIpO1xcbiBcXHRzeXNmc193aV9ub2RlX2RlbGV0ZV9hbGwoKTtcXG4gXFx0d2lfc3RhdGVfZnJlZSgpO1xcbkBAIC0zOTAwLDYgKzQwODgsMTAgQEAgc3RhdGljIGludCBfX2luaXQgYWRkX3dlaWdodGVkX2ludGVybGVhdmVfZ3JvdXAoc3RydWN0IGtvYmplY3QgKm1lbXBvbGljeV9rb2JqKVxcbiBcXHRpZiAoZXJyKVxcbiBcXHRcXHRnb3RvIGVycl9wdXRfa29iajtcXG4gXFxuK1xcdGVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKFxcdTAwMjZ3aV9ncm91cC1cXHUwMDNld2lfa29iaiwgXFx1MDAyNndpX3BhY2thZ2VfbW9kZV9hdHRyLmF0dHIpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRnb3RvIGVycl9jbGVhbnVwX2tvYmo7XFxuK1xcbiBcXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHtcXG4gXFx0XFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6MjkuMTYyMzI5OTY0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTI2ODgzMjk5MDQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5VTUFcIixcbiAgICBcIk5VTUFfTUlHUkFUSU9OXCIsXG4gICAgXCJDWExfQlVTXCIsXG4gICAgXCJDWExfUkVHSU9OXCIsXG4gICAgXCJERVZfREFYXCIsXG4gICAgXCJERVZfREFYX0tNRU1cIixcbiAgICBcIk1FTU9SWV9IT1RQTFVHXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibXBfYWRkX3BhY2thZ2Vfbm9kZVwiLFxuICAgIFwibXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX25vZGVzXCIsXG4gICAgXCJtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzXCIsXG4gICAgXCJtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrXCIsXG4gICAgXCJtcF9uZXh0X2RlbW90aW9uX25vZGVcIixcbiAgICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrXCIsXG4gICAgXCJtcF9uZXh0X3Byb21vdGlvbl9ub2RlXCIsXG4gICAgXCJtcF9pc190b3BvbG9neV9zeW1tZXRyaWNcIixcbiAgICBcIm5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tcIixcbiAgICBcIm1wX3Byb2JlX3BhY2thZ2VfaWRcIixcbiAgICBcInJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIixcbiAgICBcInVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllclwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3kgY29uY2VwdCBmb3IgTlVNQSBub2RlcywgbW9kaWZ5aW5nIGNvcmUgbWVtb3J5IHRpZXJpbmcsIG1lbXBvbGljeSwgYW5kIENYTCByZWdpb24gaGFuZGxpbmcuIEl0IGFkZHMgbmV3IHN5c2ZzIGludGVyZmFjZXMgYW5kIGEgbmV3IG1lbXBvbGljeSB3ZWlnaHRlZCBpbnRlcmxlYXZlIG1vZGUsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDI1YTJhMmFhYzY0OWJjYWI2ZjQwYzFkYzZmZmFhMzUxMTBlZGFiN2FcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyA2IDA4OjI4OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUwMGY5ZTVmZjE5ZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1wYWNrYWdlXG5AQCAtMCwwICsxLDM1IEBAXG4rV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL1xuK0RhdGU6XHRcdEF1Z3VzdCAyMDI2XG4rQ29udGFjdDpcdExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCBcdTAwM2NsaW51eC1tbUBrdmFjay5vcmdcdTAwM2VcbitEZXNjcmlwdGlvbjpcdE1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5XG4rXG4rXHRcdEEgXCJtZW1vcnkgcGFja2FnZVwiIGdyb3VwcyB0aGUgTlVNQSBub2RlcyBhc3NvY2lhdGVkIHdpdGggb25lXG4rXHRcdHBoeXNpY2FsIENQVSBwYWNrYWdlIChzb2NrZXQpOiB0aGUgbm9kZXMgdGhhdCBoYXZlIENQVXMgYW5kXG4rXHRcdHRoZSBub2RlcyB0aGF0IG9ubHkgaGF2ZSBtZW1vcnkgKGUuZy4gQ1hMIG9yIEhCTSkuXG4rXG4rXHRcdEFsbCBhdHRyaWJ1dGVzIGFyZSByZWFkLW9ubHk7IHRoZSB0b3BvbG9neSBjYW5ub3QgYmVcbitcdFx0b3ZlcnJpZGRlbiBmcm9tIHVzZXIgc3BhY2UuXG4rXG4rV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2Vfbm9kZXNcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRBbGwgTlVNQSBub2RlcyBpbiB0aGlzIHBhY2thZ2UsIGluIG5vZGVsaXN0IGZvcm1hdFxuK1x0XHQoZS5nLiBcIjAsMlwiKS5cbitcbitXaGF0Olx0XHQvc3lzL2RldmljZXMvc3lzdGVtL3BhY2thZ2UvcGFja2FnZU4vcGFja2FnZV9jcHVfbm9kZXNcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRUaGUgbm9kZXMgdGhhdCBoYXZlIENQVXMgaW4gdGhpcyBwYWNrYWdlLCBpbiBub2RlbGlzdFxuK1x0XHRmb3JtYXQuXG4rXG4rV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL3BhY2thZ2VOL3BhY2thZ2VfbWVtX29ubHlfbm9kZXNcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRUaGUgbm9kZXMgdGhhdCBvbmx5IGhhdmUgbWVtb3J5IChlLmcuIENYTC9IQk0pIGluIHRoaXNcbitcdFx0cGFja2FnZSwgaW4gbm9kZWxpc3QgZm9ybWF0LlxuK1xuK1doYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vcGFja2FnZS9wYWNrYWdlTi9waHlzaWNhbF9wYWNrYWdlX2lkXG4rRGF0ZTpcdFx0QXVndXN0IDIwMjZcbitDb250YWN0Olx0TGludXggbWVtb3J5IG1hbmFnZW1lbnQgbWFpbGluZyBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuK0Rlc2NyaXB0aW9uOlx0VGhlIHBoeXNpY2FsIHBhY2thZ2UgaWQgdGhpcyBncm91cCBjb3JyZXNwb25kcyB0bywgYXNcbitcdFx0cmVwb3J0ZWQgYnkgQ1BVIHRvcG9sb2d5LlxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLW1tLW1lbXBvbGljeS13ZWlnaHRlZC1pbnRlcmxlYXZlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbmluZGV4IDY0OWMwZTliODk1YzQuLmQyY2NiYTE3MWM1ZWEgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1tbS1tZW1wb2xpY3ktd2VpZ2h0ZWQtaW50ZXJsZWF2ZVxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtbW0tbWVtcG9saWN5LXdlaWdodGVkLWludGVybGVhdmVcbkBAIC01MiwzICs1MiwyMCBAQCBEZXNjcmlwdGlvbjpcdEF1dG8td2VpZ2h0aW5nIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlXG4gXG4gXHRcdFdyaXRpbmcgYSBuZXcgd2VpZ2h0IHRvIGEgbm9kZSBkaXJlY3RseSB2aWEgdGhlIG5vZGVOIGludGVyZmFjZVxuIFx0XHR3aWxsIGFsc28gYXV0b21hdGljYWxseSBzd2l0Y2ggdGhlIHN5c3RlbSB0byBtYW51YWwgbW9kZS5cbitcbitXaGF0Olx0XHQvc3lzL2tlcm5lbC9tbS9tZW1wb2xpY3kvd2VpZ2h0ZWRfaW50ZXJsZWF2ZS9wYWNrYWdlX21vZGVcbitEYXRlOlx0XHRBdWd1c3QgMjAyNlxuK0NvbnRhY3Q6XHRMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBtYWlsaW5nIGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4rRGVzY3JpcHRpb246XHRQYWNrYWdlLWF3YXJlIHdlaWdodGVkIGludGVybGVhdmUgdG9nZ2xlXG4rXG4rXHRcdCd0cnVlJyByZXN0cmljdHMgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBub2RlIHNlbGVjdGlvbiB0byB0aGVcbitcdFx0TlVNQSBub2RlcyBvZiB0aGUgcGFja2FnZSAoQ1BVIHNvY2tldCkgdGhlIGFsbG9jYXRpbmcgdGFza1xuK1x0XHRpcyBydW5uaW5nIG9uLiAnZmFsc2UnICh0aGUgZGVmYXVsdCkgdXNlcyB0aGUgZXhpc3RpbmdcbitcdFx0d2VpZ2h0ZWQgaW50ZXJsZWF2ZSBiZWhhdmlvci5cbitcbitcdFx0RW5hYmxpbmcgaXMgcmVqZWN0ZWQgd2l0aCAtRUlOVkFMIHdoaWxlIHRoZSBwYWNrYWdlIHRvcG9sb2d5XG4rXHRcdGlzIG5vdCBzeW1tZXRyaWMuXG4rXG4rXHRcdFdyaXRpbmcgYW55IHRydWUgdmFsdWUgc3RyaW5nIChlLmcuIFkgb3IgMSkgZW5hYmxlcyB0aGVcbitcdFx0cmVzdHJpY3Rpb24sIGFueSBmYWxzZSB2YWx1ZSBzdHJpbmcgKGUuZy4gTiBvciAwKSBkaXNhYmxlc1xuK1x0XHRpdC4gQWxsIG90aGVyIHN0cmluZ3MgcmV0dXJuIC1FSU5WQUwuXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9jeGwvY29yZS9yZWdpb24uYyBiL2RyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNcbmluZGV4IGU1MGRjNzE2ZDRlODIuLmFmNjZlMmUwNmM2MjQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXG4rKysgYi9kcml2ZXJzL2N4bC9jb3JlL3JlZ2lvbi5jXG5AQCAtMjY3Myw2ICsyNjczLDU1IEBAIHN0YXRpYyBpbnQgY3hsX3JlZ2lvbl9jYWxjdWxhdGVfYWRpc3RhbmNlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsXG4gXHRyZXR1cm4gTk9USUZZX1NUT1A7XG4gfVxuIFxuKy8qXG4rICogRmluZCBhIE5VTUEgbm9kZSB0byBhY3QgYXMgdGhlIGluaXRpYXRvciBmb3IgdGhpcyByZWdpb246IHNjYW4gdGhlXG4rICogcmVnaW9uJ3MgZW5kcG9pbnQgdGFyZ2V0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCByZXNvbHZlcyB0byBhXG4rICogdmFsaWQgTlVNQSBub2RlLlxuKyAqL1xuK3N0YXRpYyBpbnQgY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hscilcbit7XG4rXHRzdHJ1Y3QgY3hsX3JlZ2lvbl9wYXJhbXMgKnAgPSBcdTAwMjZjeGxyLVx1MDAzZXBhcmFtcztcbitcdHN0cnVjdCBjeGxfZW5kcG9pbnRfZGVjb2RlciAqY3hsZWQgPSBOVUxMO1xuK1x0c3RydWN0IGN4bF9tZW1kZXYgKmN4bG1kID0gTlVMTDtcbitcdGludCBpLCBudW1hX25vZGU7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwLVx1MDAzZW5yX3RhcmdldHM7IGkrKykge1xuK1x0XHRjeGxlZCA9IHAtXHUwMDNldGFyZ2V0c1tpXTtcbitcdFx0Y3hsbWQgPSBjeGxlZF90b19tZW1kZXYoY3hsZWQpO1xuK1x0XHRudW1hX25vZGUgPSBkZXZfdG9fbm9kZShcdTAwMjZjeGxtZC1cdTAwM2VkZXYpO1xuK1x0XHRpZiAobnVtYV9ub2RlICE9IE5VTUFfTk9fTk9ERSlcbitcdFx0XHRyZXR1cm4gbnVtYV9ub2RlO1xuK1x0fVxuK1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbit9XG4rXG4rLypcbisgKiBQYWNrYWdlIG5vdGlmaWVyIGNhbGxiYWNrOiB3aGVuIGEgbmV3IG1lbW9yeSBub2RlIGlzIG9ubGluZWQgdmlhIGRheFxuKyAqIGttZW0sIGJpbmQgdGhlIG5vZGUgdGhpcyBDWEwgcmVnaW9uIGJhY2tzIHRvIGl0cyBtZW1vcnkgcGFja2FnZSwgdXNpbmdcbisgKiB0aGUgbmVhcmVzdCByZWdpb24gdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IuIE5vdGlmaWNhdGlvbnMgZm9yIG90aGVyXG4rICogbm9kZXMgYXJlIGlnbm9yZWQuXG4rICovXG4rc3RhdGljIGludCBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGRheF9uaWQsIHZvaWQgKmRhdGEpXG4re1xuK1x0aW50IHJlZ2lvbl9uaWQsIG5lYXJlc3RfbmlkLCByZXQ7XG4rXHRzdHJ1Y3QgY3hsX3JlZ2lvbiAqY3hsciA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGN4bF9yZWdpb24sIHBhY2thZ2Vfbm90aWZpZXIpO1xuK1xuK1x0cmVnaW9uX25pZCA9IHBoeXNfdG9fdGFyZ2V0X25vZGUoY3hsci1cdTAwM2VwYXJhbXMucmVzLVx1MDAzZXN0YXJ0KTtcbitcdGlmIChyZWdpb25fbmlkICE9IGRheF9uaWQpXG4rXHRcdHJldHVybiBOT1RJRllfRE9ORTtcbitcbitcdG5lYXJlc3RfbmlkID0gY3hsX3JlZ2lvbl9maW5kX25lYXJlc3Rfbm9kZShjeGxyKTtcbitcdGlmIChuZWFyZXN0X25pZCA9PSBOVU1BX05PX05PREUpXG4rXHRcdHJldHVybiBOT1RJRllfRE9ORTtcbitcbitcdHJldCA9IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGRheF9uaWQsIG5lYXJlc3RfbmlkKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiBOT1RJRllfRE9ORTtcbitcbitcdHJldHVybiBOT1RJRllfT0s7XG4rfVxuK1xuIC8qKlxuICAqIGRldm1fY3hsX2FkZF9yZWdpb24gLSBBZGRzIGEgcmVnaW9uIHRvIGEgZGVjb2RlclxuICAqIEBjeGxyZDogcm9vdCBkZWNvZGVyXG5AQCAtMzg1Miw2ICszOTAxLDcgQEAgc3RhdGljIHZvaWQgc2h1dGRvd25fbm90aWZpZXJzKHZvaWQgKl9jeGxyKVxuIFxuIFx0dW5yZWdpc3Rlcl9ub2RlX25vdGlmaWVyKFx1MDAyNmN4bHItXHUwMDNlbm9kZV9ub3RpZmllcik7XG4gXHR1bnJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oXHUwMDI2Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllcik7XG4rXHR1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXHUwMDI2Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcmVtb3ZlX2RlYnVnZnModm9pZCAqZGVudHJ5KVxuQEAgLTQwNjYsNiArNDExNiwxMCBAQCBzdGF0aWMgaW50IGN4bF9yZWdpb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KVxuIFx0Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllci5wcmlvcml0eSA9IDEwMDtcbiBcdHJlZ2lzdGVyX210X2FkaXN0YW5jZV9hbGdvcml0aG0oXHUwMDI2Y3hsci1cdTAwM2VhZGlzdF9ub3RpZmllcik7XG4gXG4rXHRjeGxyLVx1MDAzZXBhY2thZ2Vfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZTtcbitcdGN4bHItXHUwMDNlcGFja2FnZV9ub3RpZmllci5wcmlvcml0eSA9IDEwMDtcbitcdHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIoXHUwMDI2Y3hsci1cdTAwM2VwYWNrYWdlX25vdGlmaWVyKTtcbitcbiBcdHJjID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KFx1MDAyNmN4bHItXHUwMDNlZGV2LCBzaHV0ZG93bl9ub3RpZmllcnMsIGN4bHIpO1xuIFx0aWYgKHJjKVxuIFx0XHRyZXR1cm4gcmM7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9jeGwvY3hsLmggYi9kcml2ZXJzL2N4bC9jeGwuaFxuaW5kZXggMTI5NzU5NGJlYWVjMy4uOTI4MWNhM2E1ZjBmOCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvY3hsL2N4bC5oXG4rKysgYi9kcml2ZXJzL2N4bC9jeGwuaFxuQEAgLTQ3Nyw2ICs0NzcsNyBAQCBzdHJ1Y3QgY3hsX3JlZ2lvbiB7XG4gXHRzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgY29vcmRbQUNDRVNTX0NPT1JESU5BVEVfTUFYXTtcbiBcdHN0cnVjdCBub3RpZmllcl9ibG9jayBub2RlX25vdGlmaWVyO1xuIFx0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFkaXN0X25vdGlmaWVyO1xuK1x0c3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhY2thZ2Vfbm90aWZpZXI7XG4gfTtcbiBcbiBzdHJ1Y3QgY3hsX252ZGltbV9icmlkZ2Uge1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGF4L2ttZW0uYyBiL2RyaXZlcnMvZGF4L2ttZW0uY1xuaW5kZXggMmNjODc0OWJjODcxMS4uMWRlMjNmMTk2MzU0MiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZGF4L2ttZW0uY1xuKysrIGIvZHJpdmVycy9kYXgva21lbS5jXG5AQCAtOTQsNiArOTQsOSBAQCBzdGF0aWMgaW50IGRldl9kYXhfa21lbV9wcm9iZShzdHJ1Y3QgZGV2X2RheCAqZGV2X2RheClcbiBcdGlmIChJU19FUlIobXR5cGUpKVxuIFx0XHRyZXR1cm4gUFRSX0VSUihtdHlwZSk7XG4gXG4rXHQvKiBSZXNvbHZlIHRoZSBtZW1vcnkgcGFja2FnZSBmb3IgdGhpcyBuZXdseSBvbmxpbmVkIGttZW0gbm9kZS4gKi9cbitcdG1wX3Byb2JlX3BhY2thZ2VfaWQobnVtYV9ub2RlKTtcbitcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRldl9kYXgtXHUwMDNlbnJfcmFuZ2U7IGkrKykge1xuIFx0XHRzdHJ1Y3QgcmFuZ2UgcmFuZ2U7XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnktdGllcnMuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LXRpZXJzLmhcbmluZGV4IDc5OTljNTg2MjllZWIuLmY4Nzc4YzQzNDI5ZmIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS10aWVycy5oXG5AQCAtNTIsMTAgKzUyLDI1IEBAIGludCBtdF9wZXJmX3RvX2FkaXN0YW5jZShzdHJ1Y3QgYWNjZXNzX2Nvb3JkaW5hdGUgKnBlcmYsIGludCAqYWRpc3QpO1xuIHN0cnVjdCBtZW1vcnlfZGV2X3R5cGUgKm10X2ZpbmRfYWxsb2NfbWVtb3J5X3R5cGUoaW50IGFkaXN0LFxuIFx0XHRcdFx0XHRcdCAgc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcbiB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKTtcbitcbitpbnQgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcbit2b2lkIHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTtcbitpbnQgbXBfcHJvYmVfcGFja2FnZV9pZChpbnQgbmlkKTtcbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpO1xuK2ludCBtcF9hZGRfcGFja2FnZV9ub2RlKGludCBuaWQpO1xuK2ludCBtcF9nZXRfcGFja2FnZV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xuK2ludCBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbitpbnQgbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMoaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbitib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKTtcbiAjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG4gaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKTtcbiB2b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKTtcbiBib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSk7XG4rXG4raW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KTtcbitpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpO1xuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpO1xuK2ludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpO1xuICNlbHNlXG4gc3RhdGljIGlubGluZSBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG4ge1xuQEAgLTcxLDYgKzg2LDMwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXG4ge1xuIFx0cmV0dXJuIHRydWU7XG4gfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuK3tcbitcdGlmIChvdXQpXG4rXHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1x0cmV0dXJuIC1FTk9FTlQ7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfZGVtb3Rpb25fbm9kZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiBOVU1BX05PX05PREU7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRpZiAob3V0KVxuK1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbitcdHJldHVybiAtRU5PRU5UO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9uZXh0X3Byb21vdGlvbl9ub2RlKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbit9XG4gI2VuZGlmXG4gXG4gI2Vsc2VcbkBAIC0xNTEsNSArMTkwLDc5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbW9yeV9kZXZfdHlwZSAqbXRfZmluZF9hbGxvY19tZW1vcnlfdHlwZShpbnQgYWRpc3QsXG4gc3RhdGljIGlubGluZSB2b2lkIG10X3B1dF9tZW1vcnlfdHlwZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVtb3J5X3R5cGVzKVxuIHtcbiB9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKVxuK3tcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9wcm9iZV9wYWNrYWdlX2lkKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIE5PVElGWV9ET05FO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihpbnQgbmlkLCBpbnQgaW5pdGlhdG9yX25pZClcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9nZXRfcGFja2FnZV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKG91dClcbitcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRpZiAob3V0KVxuK1x0XHRub2Rlc19jbGVhcigqb3V0KTtcbitcdHJldHVybiAtRU5PRU5UO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKG91dClcbitcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFzayhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKG91dClcbitcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgbXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2soaW50IG5pZCwgbm9kZW1hc2tfdCAqb3V0KVxuK3tcbitcdGlmIChvdXQpXG4rXHRcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1x0cmV0dXJuIC1FTk9FTlQ7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbit7XG4rXHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuK31cbiAjZW5kaWZcdC8qIENPTkZJR19OVU1BICovXG4gI2VuZGlmICAvKiBfTElOVVhfTUVNT1JZX1RJRVJTX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L251bWEuaCBiL2luY2x1ZGUvbGludXgvbnVtYS5oXG5pbmRleCBlNmJhYWY2MDUxYmNmLi40ZjJhMGMzNDQxMjJhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9udW1hLmhcbisrKyBiL2luY2x1ZGUvbGludXgvbnVtYS5oXG5AQCAtMzMsNiArMzMsOCBAQCBpbnQgbnVtYV9uZWFyZXN0X25vZGUoaW50IG5vZGUsIHVuc2lnbmVkIGludCBzdGF0ZSk7XG4gXG4gaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzayk7XG4gXG4raW50IG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2soaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKm1hc2ssIG5vZGVtYXNrX3QgKm91dCk7XG4rXG4gI2lmbmRlZiBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZFxuIGludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgc3RhcnQpO1xuICNlbmRpZlxuQEAgLTU0LDYgKzU2LDE1IEBAIHN0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZV9ub2RlbWFzayhpbnQgbm9kZSwgbm9kZW1hc2tfdCAqbWFzaylcbiBcdHJldHVybiBOVU1BX05PX05PREU7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgaW50IG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2soaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKm1hc2ssXG4rXHRcdFx0XHRcdCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aWYgKCFvdXQpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gc3RhdGljIGlubGluZSBpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KVxuIHtcbiBcdHJldHVybiAwO1xuZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmNcbmluZGV4IDU0ODUxZDhhMTk1YjAuLjU5MzJkZjMxNTYwNGEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xuKysrIGIvbW0vbWVtb3J5LXRpZXJzLmNcbkBAIC0xLDQgKzEsNSBAQFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbG9ja2RlcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3lzZnMuaFx1MDAzZVxuQEAgLTUxLDYgKzUyLDExIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xuIFx0LmRldl9uYW1lID0gXCJtZW1vcnlfdGllclwiLFxuIH07XG4gXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBwYWNrYWdlX3N1YnN5cyA9IHtcbitcdC5uYW1lID0gXCJwYWNrYWdlXCIsXG4rXHQuZGV2X25hbWUgPSBcInBhY2thZ2VcIixcbit9O1xuK1xuICNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbiAvKipcbiAgKiBmb2xpb191c2VfYWNjZXNzX3RpbWUgLSBjaGVjayBpZiBhIGZvbGlvIHJldXNlcyBjcHVwaWQgZm9yIHBhZ2UgYWNjZXNzIHRpbWVcbkBAIC0xMDA3LDMgKzEwMTMsMTAwNiBAQCBzdGF0aWMgaW50IF9faW5pdCBudW1hX2luaXRfc3lzZnModm9pZClcbiBzdWJzeXNfaW5pdGNhbGwobnVtYV9pbml0X3N5c2ZzKTtcbiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovXG4gI2VuZGlmXG4rXG4rLyoqXG4rICogZW51bSBtcF9ub2Rlc190eXBlIC0gU2VsZWN0b3IgZm9yIHdoaWNoIHN1YnNldCBvZiBhIHBhY2thZ2UgdG8gcmV0dXJuXG4rICogQE1QX05PREVTX0FMTDogICAgICAgQWxsIE5VTUEgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhlIHBhY2thZ2UuXG4rICogQE1QX05PREVTX0NQVTogICAgICAgT25seSBDUFUgbm9kZXMgaW4gdGhlIHBhY2thZ2UuXG4rICogQE1QX05PREVTX01FTV9PTkxZOiAgT25seSBtZW1vcnktb25seSBub2RlcyAoZS5nLiBDWEwvSEJNKSBpbiB0aGUgcGFja2FnZS5cbisgKlxuKyAqIFVzZWQgaW50ZXJuYWxseSB0byBjaG9vc2Ugd2hpY2ggbm9kZW1hc2sgdG8gZXhwb3NlIGZvciBhIGdpdmVuIHBhY2thZ2UuXG4rICovXG4rZW51bSBtcF9ub2Rlc190eXBlIHtcbitcdE1QX05PREVTX0FMTCxcbitcdE1QX05PREVTX0NQVSxcbitcdE1QX05PREVTX01FTV9PTkxZXG4rfTtcbitcbisvKipcbisgKiBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgLSBQZXItcGh5c2ljYWwtcGFja2FnZSBjb250YWluZXJcbisgKiBAcGFja2FnZV9pZDogICAgICAgICAgUGh5c2ljYWwgcGFja2FnZSBpZCAoZnJvbSB0b3BvbG9neSkuXG4rICogQG5vZGVzOiAgICAgICAgICAgICAgIE5vZGVtYXNrIG9mIGFsbCBtZW1iZXIgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxuKyAqIEBjcHVfbm9kZXM6ICAgICAgICAgICBOb2RlbWFzayBvZiBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlLlxuKyAqIEBtZW1vcnlfb25seV9ub2RlczogICBOb2RlbWFzayBvZiBtZW1vcnktb25seSBub2RlcyBpbiB0aGlzIHBhY2thZ2UuXG4rICogQGNwdV9saXN0OiAgICAgICAgICAgIExpc3QgaGVhZCBvZiBDUFUtdHlwZSBtZW1iZXJzLlxuKyAqIEBtZW1vcnlfb25seV9saXN0OiAgICBMaXN0IGhlYWQgb2YgbWVtb3J5LW9ubHkgbWVtYmVycy5cbisgKiBAbGlzdDogICAgICAgICAgICAgICAgTGlua2FnZSBvbiB0aGUgZ2xvYmFsIEBtZW1vcnlfcGFja2FnZXMgbGlzdC5cbisgKiBAZGV2OiAgICAgICAgICAgICAgICAgc3lzZnMgZGV2aWNlIGZvciB0aGlzIHBhY2thZ2UuXG4rICpcbisgKiBBIG1lbW9yeV9wYWNrYWdlIGdyb3VwcyBOVU1BIG5vZGVzIHRoYXQgc2hhcmUgdGhlIHNhbWUgcGh5c2ljYWwgQ1BVIHBhY2thZ2UuXG4rICogVGhlIG1hc2tzIGFyZSB1c2VkIHRvIGltcGxlbWVudCBwYWNrYWdlLWxvY2FsIHBsYWNlbWVudC9kZW1vdGlvbi9wcm9tb3Rpb24uXG4rICovXG4rc3RydWN0IG1lbW9yeV9wYWNrYWdlIHtcbitcdGludCBwYWNrYWdlX2lkO1xuK1x0bm9kZW1hc2tfdCBub2RlcztcbitcdG5vZGVtYXNrX3QgY3B1X25vZGVzO1xuK1x0bm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlcztcbitcdHN0cnVjdCBsaXN0X2hlYWQgY3B1X2xpc3Q7XG4rXHRzdHJ1Y3QgbGlzdF9oZWFkIG1lbW9yeV9vbmx5X2xpc3Q7XG4rXHRzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7XG4rXHRzdHJ1Y3QgZGV2aWNlIGRldjtcbit9O1xuK1xuKy8qKlxuKyAqIGVudW0gbXBuX3NvdXJjZV9mbGFncyAtIFNvdXJjZSB1c2VkIHRvIHJlc29sdmUgYSBub2RlJ3MgcGFja2FnZSBtZW1iZXJzaGlwXG4rICogQE1QTl9TUkNfVU5LTk9XTjogICAgIFVua25vd24vdW5zcGVjaWZpZWQuXG4rICogQE1QTl9TUkNfQ1BVOiAgICAgICAgIERpcmVjdGx5IHJlc29sdmVkIGZyb20gYSBDUFUgbm9kZSAoMToxKS5cbisgKiBATVBOX1NSQ19JTklUSUFUT1I6ICAgUmVzb2x2ZWQgdmlhIGFuIGluaXRpYXRvciBDUFUgbm9kZSBwcm92aWRlZCBieSBhIGRyaXZlci5cbisgKiBATVBOX1NSQ19TTElUOiAgICAgICAgUmVzb2x2ZWQgdmlhIFNMSVQvbmVhcmVzdC1ub2RlLlxuKyAqXG4rICogVGhlc2UgZmxhZ3MgYXJlIGluZm9ybWF0aW9uYWw7IHRoZXkgZGVzY3JpYmUgaG93IGEgZ2l2ZW4gbm9kZSB3YXMgYm91bmQgdG9cbisgKiBpdHMgcGFja2FnZSBhbmQgaGVscCB3aXRoIHBvbGljeSBkZWNpc2lvbnMgbGF0ZXIuXG4rICovXG4rZW51bSBtcG5fc291cmNlX2ZsYWdzIHtcbitcdE1QTl9TUkNfVU5LTk9XTlx0XHQ9IDAsXG4rXHRNUE5fU1JDX0NQVVx0XHQ9IEJJVCgxKSxcbitcdE1QTl9TUkNfSU5JVElBVE9SXHQ9IEJJVCgyKSxcbitcdE1QTl9TUkNfU0xJVFx0XHQ9IEJJVCgzKVxuK307XG4rXG4rLyoqXG4rICogc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgLSBQZXItbm9kZSBtZW1iZXJzaGlwIGFuZCBwcmVmZXJlbmNlc1xuKyAqIEBuaWQ6ICAgICAgICAgICAgICBOVU1BIG5vZGUgaWQgZm9yIHRoaXMgZW50cnkuXG4rICogQGluaXRpYXRvcl9uaWQ6ICAgIENQVSBuaWQgdGhhdCBzZXJ2ZWQgYXMgdGhlIGluaXRpYXRvciB3aGVuIHJlc29sdmluZyBAbmlkLlxuKyAqIEBwYWNrYWdlX2lkOiAgICAgICBSZXNvbHZlZCBwYWNrYWdlIGlkIHRoYXQgQG5pZCBiZWxvbmdzIHRvLlxuKyAqIEBzb3VyY2VfZmxhZ3M6ICAgICBPbmUgb2YgXHUwMDI2ZW51bSBtcG5fc291cmNlX2ZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlc29sdXRpb24uXG4rICogQHByZWZlcnJlZDogICAgICAgIE9wcG9zaXRlLXR5cGUgbmVhcmVzdCBjYW5kaWRhdGVzIGluc2lkZSB0aGUgc2FtZSBwYWNrYWdlLlxuKyAqIEBwYWNrYWdlOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvd25pbmcgXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlIChOVUxMIHVudGlsIGJvdW5kKS5cbisgKiBAcGFja2FnZV9lbnRyeTogICAgTGlua2FnZSBvbiB0aGUgb3duaW5nIHBhY2thZ2UncyB0eXBlIGxpc3QuXG4rICpcbisgKiBFYWNoIE5VTUEgbm9kZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBwYWNrYWdlLWF3YXJlIHBvbGljeSBnZXRzIGEgd3JhcHBlciBlbnRyeVxuKyAqIHRoYXQgY2FjaGVzIHBhY2thZ2UgbWVtYmVyc2hpcCBhbmQgdGhlIHByZWNvbXB1dGVkIHNldCBvZiBwcmVmZXJyZWQgdGFyZ2V0cy5cbisgKi9cbitzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSB7XG4rXHRpbnQgbmlkO1xuK1x0aW50IGluaXRpYXRvcl9uaWQ7XG4rXHRpbnQgcGFja2FnZV9pZDtcbitcdGludCBzb3VyY2VfZmxhZ3M7XG4rXHRub2RlbWFza190IHByZWZlcnJlZDtcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqcGFja2FnZTtcbitcdHN0cnVjdCBsaXN0X2hlYWQgcGFja2FnZV9lbnRyeTtcbit9O1xuK1xuKyNkZWZpbmUgbm9kZV9pc19tZW1vcnlfb25seShfbmlkKSBcXFxuK1x0KG5vZGVfc3RhdGUoKF9uaWQpLCBOX01FTU9SWSkgXHUwMDI2XHUwMDI2ICFub2RlX3N0YXRlKChfbmlkKSwgTl9DUFUpKVxuK1xuK3N0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKG1wX3BhY2thZ2VfYWxnb3JpdGhtcyk7XG4rXG4rc3RhdGljIExJU1RfSEVBRChtZW1vcnlfcGFja2FnZXMpO1xuK3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BhY2thZ2Vfbm9kZSAqbXBuc1tNQVhfTlVNTk9ERVNdO1xuK3N0YXRpYyBERUZJTkVfTVVURVgobWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXG4rLypcbisgKiBSQ1Ugc25hcHNob3Qgb2YgdGhlIHBhY2thZ2UgdG9wb2xvZ3kuIFRoZSBhbGxvY2F0aW9uIHBhdGggcmVhZHMgaXRcbisgKiBvZnRlbiwgc28gaXQgaXMgcHVibGlzaGVkIGZvciBsb2NrbGVzcyByZWFkcyBpbnN0ZWFkIG9mIGxvY2tpbmcgb25cbisgKiBldmVyeSBhY2Nlc3MuXG4rICovXG4rc3RydWN0IG1wX3NuYXBzaG90IHtcbitcdHN0cnVjdCByY3VfaGVhZCByY3U7XG4rXHRpbnQgbnJfcGFja2FnZXM7XG4rXHRpbnQgcGtnX29mW01BWF9OVU1OT0RFU107XG4rXHRzdHJ1Y3Qge1xuK1x0XHRub2RlbWFza190IG5vZGVzO1xuK1x0XHRub2RlbWFza190IGNwdV9ub2RlcztcbitcdFx0bm9kZW1hc2tfdCBtZW1vcnlfb25seV9ub2RlcztcbitcdH0gcGtnW107XG4rfTtcbitcbitzdGF0aWMgc3RydWN0IG1wX3NuYXBzaG90IF9fcmN1ICptcF9zbmFwc2hvdDtcbitcbisvKipcbisgKiByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyIC0gUmVnaXN0ZXIgYSBwYWNrYWdlIHJlc29sdXRpb24gYWxnb3JpdGhtXG4rICogQG5vdGlmaWVyOiBOb3RpZmllciBjYWxsZWQgd2l0aCB0aGUgbmlkIHRvIHJlc29sdmUgKHNlZSBtcF9wcm9iZV9wYWNrYWdlX2lkKCkpLlxuKyAqXG4rICogRHJpdmVycyAoZS5nLiwgQ1hMIHJlZ2lvbi9kZWNvZGVyIGNvZGUpIHJlZ2lzdGVyIGhlcmUgdG8gc3VwcGx5IGEgcGFja2FnZVxuKyAqIGhpbnQgZm9yIG5ld2x5IGFwcGVhcmluZyBub2Rlcy4gVGhlIG5vdGlmaWVyIGlzIGludm9rZWQgZHVyaW5nIG5pZC1cdTAwM2VwYWNrYWdlXG4rICogcmVzb2x1dGlvbi5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxuKyAqL1xuK2ludCByZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4re1xuK1x0cmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKFx1MDAyNm1wX3BhY2thZ2VfYWxnb3JpdGhtcywgbm90aWZpZXIpO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKTtcbitcbisvKipcbisgKiB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXIgLSBVbnJlZ2lzdGVyIGEgcGFja2FnZSByZXNvbHV0aW9uIGFsZ29yaXRobVxuKyAqIEBub3RpZmllcjogTm90aWZpZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcigpLlxuKyAqL1xuK3ZvaWQgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpXG4re1xuK1x0YmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcihcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5vdGlmaWVyKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyKTtcbitcbisvKipcbisgKiBtcF9wcm9iZV9wYWNrYWdlX2lkIC0gSW52b2tlIHJlZ2lzdGVyZWQgbm90aWZpZXJzIHRvIHJlc29sdmUgYSBub2RlJ3MgcGFja2FnZVxuKyAqIEBuaWQ6IE5VTUEgbm9kZSBpZCB0byByZXNvbHZlLlxuKyAqXG4rICogQ2FsbHMgdGhlIGJsb2NraW5nIG5vdGlmaWVyIGNoYWluIHRvIGxldCBzdWJzeXN0ZW1zIHByb3ZpZGUgYW4gaW5pdGlhdG9yIG9yXG4rICogcGFja2FnZSBpZCBmb3IgQG5pZC5cbisgKlxuKyAqIFJldHVybjogTm90aWZpZXIgcmV0dXJuIGNvZGUgKFx1MDAzZT0wIHR5cGljYWxseSk7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXG4rICovXG4raW50IG1wX3Byb2JlX3BhY2thZ2VfaWQoaW50IG5pZClcbit7XG4rXHRyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbihcdTAwMjZtcF9wYWNrYWdlX2FsZ29yaXRobXMsIG5pZCwgTlVMTCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX3Byb2JlX3BhY2thZ2VfaWQpO1xuK1xuK3N0YXRpYyBpbnQgbXBfbm9kZV90b19wYWNrYWdlX2lkKGludCBuaWQpXG4re1xuK1x0aW50IHBhY2thZ2VfaWQ7XG4rXHR1bnNpZ25lZCBpbnQgZmlyc3RfY3B1O1xuK1x0Y29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXNrO1xuK1xuK1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9DUFUpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGNwdV9tYXNrID0gY3B1bWFza19vZl9ub2RlKG5pZCk7XG4rXHRpZiAoY3B1bWFza19lbXB0eShjcHVfbWFzaykpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0Zmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfbWFzayk7XG4rXHRpZiAoZmlyc3RfY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRwYWNrYWdlX2lkID0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChmaXJzdF9jcHUpO1xuK1x0aWYgKHBhY2thZ2VfaWQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0cmV0dXJuIHBhY2thZ2VfaWQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHVwZGF0ZV9wYWNrYWdlX3ByZWZlcnJlZChzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0LypcbitcdCAqIEZvciBlYWNoIENQVSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0IGFzIHRoZSBuZWFyZXN0XG4rXHQgKiBtZW1vcnktb25seSBub2RlKHMpIHdpdGhpbiB0aGUgc2FtZSBwYWNrYWdlLiBJZiB0aGUgcGFja2FnZSBoYXNcbitcdCAqIG5vIG1lbW9yeS1vbmx5IG5vZGVzLCBmYWxsIGJhY2sgdG8gYSBzZWxmLXJlZmVyZW5jZSBzbyBjYWxsZXJzXG4rXHQgKiBuZXZlciBzZWUgYW4gZW1wdHkgcHJlZmVycmVkIHNldC5cbitcdCAqL1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcG4sIFx1MDAyNm1wLVx1MDAzZWNwdV9saXN0LCBwYWNrYWdlX2VudHJ5KSB7XG4rXHRcdG5vZGVzX2NsZWFyKG1wbi1cdTAwM2VwcmVmZXJyZWQpO1xuK1x0XHRpZiAoIW5vZGVzX2VtcHR5KG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzKSlcbitcdFx0XHRuZWFyZXN0X25vZGVzX25vZGVtYXNrKG1wbi1cdTAwM2VuaWQsIFx1MDAyNm1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2bXBuLVx1MDAzZXByZWZlcnJlZCk7XG4rXHRcdGVsc2VcbitcdFx0XHRub2RlX3NldChtcG4tXHUwMDNlbmlkLCBtcG4tXHUwMDNlcHJlZmVycmVkKTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBTeW1tZXRyaWNhbGx5LCBmb3IgZWFjaCBtZW1vcnktb25seSBub2RlLCBjb21wdXRlIGl0cyBwcmVmZXJyZWQgc2V0XG4rXHQgKiBhcyB0aGUgbmVhcmVzdCBDUFUgbm9kZShzKSB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZS4gSWYgdGhlIHBhY2thZ2VcbitcdCAqIGhhcyBubyBDUFUgbm9kZXMsIGZhbGwgYmFjayB0byBhIHNlbGYtcmVmZXJlbmNlLlxuK1x0ICovXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wbiwgXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbGlzdCwgcGFja2FnZV9lbnRyeSkge1xuK1x0XHRub2Rlc19jbGVhcihtcG4tXHUwMDNlcHJlZmVycmVkKTtcbitcdFx0aWYgKCFub2Rlc19lbXB0eShtcC1cdTAwM2VjcHVfbm9kZXMpKVxuK1x0XHRcdG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2sobXBuLVx1MDAzZW5pZCwgXHUwMDI2bXAtXHUwMDNlY3B1X25vZGVzLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2bXBuLVx1MDAzZXByZWZlcnJlZCk7XG4rXHRcdGVsc2VcbitcdFx0XHRub2RlX3NldChtcG4tXHUwMDNlbmlkLCBtcG4tXHUwMDNlcHJlZmVycmVkKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG1lbW9yeV9wYWNrYWdlX2lzX2VtcHR5KHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXApXG4re1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdHJldHVybiAobm9kZXNfZW1wdHkobXAtXHUwMDNlY3B1X25vZGVzKSBcdTAwMjZcdTAwMjYgbm9kZXNfZW1wdHkobXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBhY2thZ2Vfbm9kZV9pc192YWxpZChpbnQgbmlkKVxuK3tcbitcdGlmICghbXBuc1tuaWRdKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRpZiAobm9kZXNfZW1wdHkobXBuc1tuaWRdLVx1MDAzZXByZWZlcnJlZCkgfHwgKG1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlID09IE5VTEwpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1lbW9yeV9wYWNrYWdlX2dyb3Vwc1tdO1xuK1xuKy8qIEZyZWVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBwYWNrYWdlJ3Mgc3lzZnMgZGV2aWNlIGlzIGRyb3BwZWQuICovXG4rc3RhdGljIHZvaWQgbWVtb3J5X3BhY2thZ2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1vcnlfcGFja2FnZSwgZGV2KTtcbitcbitcdGtmcmVlKG1wKTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqY3JlYXRlX21lbW9yeV9wYWNrYWdlKGludCBwYWNrYWdlX2lkKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbWVtcGFja2FnZTtcbitcdGludCByZXQ7XG4rXG4rXHRtZW1wYWNrYWdlID0ga3phbGxvY19vYmooKm1lbXBhY2thZ2UpO1xuK1x0aWYgKCFtZW1wYWNrYWdlKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbitcbitcdG1lbXBhY2thZ2UtXHUwMDNlcGFja2FnZV9pZCA9IHBhY2thZ2VfaWQ7XG4rXHRtZW1wYWNrYWdlLVx1MDAzZW5vZGVzID0gTk9ERV9NQVNLX05PTkU7XG4rXHRtZW1wYWNrYWdlLVx1MDAzZWNwdV9ub2RlcyA9IE5PREVfTUFTS19OT05FO1xuK1x0bWVtcGFja2FnZS1cdTAwM2VtZW1vcnlfb25seV9ub2RlcyA9IE5PREVfTUFTS19OT05FO1xuK1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VjcHVfbGlzdCk7XG4rXHRJTklUX0xJU1RfSEVBRChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZW1lbW9yeV9vbmx5X2xpc3QpO1xuK1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VsaXN0KTtcbitcdGRldmljZV9pbml0aWFsaXplKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2KTtcbitcdG1lbXBhY2thZ2UtXHUwMDNlZGV2LnJlbGVhc2UgPSBtZW1vcnlfcGFja2FnZV9yZWxlYXNlO1xuK1x0ZGV2X3NldF9kcnZkYXRhKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2LCBtZW1wYWNrYWdlKTtcbitcdG1lbXBhY2thZ2UtXHUwMDNlZGV2LmJ1cyA9IFx1MDAyNnBhY2thZ2Vfc3Vic3lzO1xuK1x0bWVtcGFja2FnZS1cdTAwM2VkZXYuZ3JvdXBzID0gbWVtb3J5X3BhY2thZ2VfZ3JvdXBzO1xuK1x0cmV0ID0gZGV2X3NldF9uYW1lKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlZGV2LCBcInBhY2thZ2UlZFwiLCBwYWNrYWdlX2lkKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHV0X2RldmljZShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldik7XG4rXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gbWVtcGFja2FnZTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqZmluZF9jcmVhdGVfbWVtb3J5X3BhY2thZ2UoaW50IHBhY2thZ2VfaWQpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptZW1wYWNrYWdlLCAqZXhpc3Rpbmc7XG4rXHRpbnQgcmV0O1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtcGFja2FnZSwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KSB7XG4rXHRcdGlmIChtZW1wYWNrYWdlLVx1MDAzZXBhY2thZ2VfaWQgPT0gcGFja2FnZV9pZCkge1xuK1x0XHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdFx0XHRyZXR1cm4gbWVtcGFja2FnZTtcbitcdFx0fVxuK1x0fVxuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0bWVtcGFja2FnZSA9IGNyZWF0ZV9tZW1vcnlfcGFja2FnZShwYWNrYWdlX2lkKTtcbitcdGlmIChJU19FUlIobWVtcGFja2FnZSkpXG4rXHRcdHJldHVybiBtZW1wYWNrYWdlO1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnkoZXhpc3RpbmcsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xuK1x0XHRpZiAoZXhpc3RpbmctXHUwMDNlcGFja2FnZV9pZCA9PSBwYWNrYWdlX2lkKSB7XG4rXHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0XHRcdHB1dF9kZXZpY2UoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VkZXYpO1xuK1x0XHRcdHJldHVybiBleGlzdGluZztcbitcdFx0fVxuK1x0fVxuK1x0bGlzdF9hZGQoXHUwMDI2bWVtcGFja2FnZS1cdTAwM2VsaXN0LCBcdTAwMjZtZW1vcnlfcGFja2FnZXMpO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0cmV0ID0gZGV2aWNlX2FkZChcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldik7XG4rXHRpZiAocmV0KSB7XG4rXHRcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRcdGxpc3RfZGVsKFx1MDAyNm1lbXBhY2thZ2UtXHUwMDNlbGlzdCk7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdFx0cHV0X2RldmljZShcdTAwMjZtZW1wYWNrYWdlLVx1MDAzZWRldik7XG4rXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gbWVtcGFja2FnZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbXBfc25hcHNob3RfcmVidWlsZCh2b2lkKVxuK3tcbitcdHN0cnVjdCBtcF9zbmFwc2hvdCAqbmV3LCAqb2xkO1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcDtcbitcdGludCBuciA9IDAsIGkgPSAwLCBuaWQ7XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeShtcCwgXHUwMDI2bWVtb3J5X3BhY2thZ2VzLCBsaXN0KVxuK1x0XHRucisrO1xuK1xuK1x0bmV3ID0ga3Z6YWxsb2Moc3RydWN0X3NpemUobmV3LCBwa2csIG5yKSwgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIW5ldylcbitcdFx0cmV0dXJuO1xuK1xuK1x0bWVtc2V0KG5ldy1cdTAwM2Vwa2dfb2YsIDB4ZmYsIHNpemVvZihuZXctXHUwMDNlcGtnX29mKSk7XG4rXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBcdTAwMjZtZW1vcnlfcGFja2FnZXMsIGxpc3QpIHtcbitcdFx0bmV3LVx1MDAzZXBrZ1tpXS5ub2RlcyA9IG1wLVx1MDAzZW5vZGVzO1xuK1x0XHRuZXctXHUwMDNlcGtnW2ldLmNwdV9ub2RlcyA9IG1wLVx1MDAzZWNwdV9ub2RlcztcbitcdFx0bmV3LVx1MDAzZXBrZ1tpXS5tZW1vcnlfb25seV9ub2RlcyA9IG1wLVx1MDAzZW1lbW9yeV9vbmx5X25vZGVzO1xuK1x0XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBtcC1cdTAwM2Vub2RlcylcbitcdFx0XHRuZXctXHUwMDNlcGtnX29mW25pZF0gPSBpO1xuK1x0XHRpKys7XG4rXHR9XG4rXHRuZXctXHUwMDNlbnJfcGFja2FnZXMgPSBucjtcbitcbitcdG9sZCA9IHJjdV9yZXBsYWNlX3BvaW50ZXIobXBfc25hcHNob3QsIG5ldyxcbitcdFx0XHRcdCAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spKTtcbitcdGlmIChvbGQpXG4rXHRcdGt2ZnJlZV9yY3Uob2xkLCByY3UpO1xuK31cbitcbitzdGF0aWMgaW50IGJpbmRfbm9kZV90b19wYWNrYWdlKGludCBuaWQpXG4re1xuK1x0aW50IHBhY2thZ2VfaWQsIHBrZ19pZDtcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXA7XG4rXHRub2RlbWFza190IG5vZGVzLCBjcHUsIG1lbTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRpZiAoIW1wbnNbbmlkXSkge1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1x0cGFja2FnZV9pZCA9IG1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2lkO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1xuK1x0bXAgPSBmaW5kX2NyZWF0ZV9tZW1vcnlfcGFja2FnZShwYWNrYWdlX2lkKTtcbitcdGlmIChJU19FUlIobXApKVxuK1x0XHRyZXR1cm4gUFRSX0VSUihtcCk7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0aWYgKCFtcG5zW25pZF0pIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbitcdG1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlID0gbXA7XG4rXHRub2RlX3NldChtcG5zW25pZF0tXHUwMDNlbmlkLCBtcC1cdTAwM2Vub2Rlcyk7XG4rXHRpZiAobm9kZV9pc19tZW1vcnlfb25seShtcG5zW25pZF0tXHUwMDNlbmlkKSkge1xuK1x0XHRub2RlX3NldChtcG5zW25pZF0tXHUwMDNlbmlkLCBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XG4rXHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VtZW1vcnlfb25seV9saXN0KTtcbitcdH0gZWxzZSB7XG4rXHRcdG5vZGVfc2V0KG1wbnNbbmlkXS1cdTAwM2VuaWQsIG1wLVx1MDAzZWNwdV9ub2Rlcyk7XG4rXHRcdGxpc3RfYWRkKFx1MDAyNm1wbnNbbmlkXS1cdTAwM2VwYWNrYWdlX2VudHJ5LCBcdTAwMjZtcC1cdTAwM2VjcHVfbGlzdCk7XG4rXHR9XG4rXHR1cGRhdGVfcGFja2FnZV9wcmVmZXJyZWQobXApO1xuK1x0bXBfc25hcHNob3RfcmVidWlsZCgpO1xuK1x0cGtnX2lkID0gbXAtXHUwMDNlcGFja2FnZV9pZDtcbitcdG5vZGVzID0gbXAtXHUwMDNlbm9kZXM7XG4rXHRjcHUgPSBtcC1cdTAwM2VjcHVfbm9kZXM7XG4rXHRtZW0gPSBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2RlcztcbitcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdHByX2luZm8oXCJtZW1vcnlfcGFja2FnZSAlZDogbm9kZXM9JSpwYmwgY3B1PSUqcGJsIG1lbW9yeV9vbmx5PSUqcGJsXFxuXCIsXG4rXHRcdHBrZ19pZCwgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZub2RlcyksXG4rXHRcdG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2Y3B1KSwgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZtZW0pKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCB1bmJpbmRfbm9kZV90b19wYWNrYWdlKHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAsIGludCBuaWQpXG4re1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2Vub2Rlcyk7XG4rXHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fQ1BVKSlcbitcdFx0bm9kZV9jbGVhcihuaWQsIG1wLVx1MDAzZWNwdV9ub2Rlcyk7XG4rXHRlbHNlXG4rXHRcdG5vZGVfY2xlYXIobmlkLCBtcC1cdTAwM2VtZW1vcnlfb25seV9ub2Rlcyk7XG4rXG4rXHRpZiAobXBuc1tuaWRdKVxuK1x0XHRsaXN0X2RlbChcdTAwMjZtcG5zW25pZF0tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4rXG4rXHR1cGRhdGVfcGFja2FnZV9wcmVmZXJyZWQobXApO1xuK31cbitcbitzdGF0aWMgc3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKmNyZWF0ZV9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4re1xuK1x0aW50IGNwdV9uaWQsIHBhY2thZ2VfaWQ7XG4rXHRpbnQgc291cmNlX2ZsYWdzO1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjtcbitcbitcdGlmIChub2RlX3N0YXRlKG5pZCwgTl9DUFUpKSB7XG4rXHRcdGNwdV9uaWQgPSBuaWQ7XG4rXHRcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfQ1BVO1xuK1x0fSBlbHNlIHtcbitcdFx0aWYgKGluaXRpYXRvcl9uaWQgXHUwMDNlPSAwKSB7XG4rXHRcdFx0Y3B1X25pZCA9IGluaXRpYXRvcl9uaWQ7XG4rXHRcdFx0c291cmNlX2ZsYWdzID0gTVBOX1NSQ19JTklUSUFUT1I7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBObyBkcml2ZXItc3VwcGxpZWQgaW5pdGlhdG9yOiBmYWxsIGJhY2sgdG8gdGhlXG4rXHRcdFx0ICogbmVhcmVzdCBDUFUgbm9kZSAodmlhIFNMSVQvbnVtYV9kaXN0YW5jZSkuXG4rXHRcdFx0ICovXG4rXHRcdFx0Y3B1X25pZCA9IG51bWFfbmVhcmVzdF9ub2RlKG5pZCwgTl9DUFUpO1xuK1x0XHRcdHNvdXJjZV9mbGFncyA9IE1QTl9TUkNfU0xJVDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cGFja2FnZV9pZCA9IG1wX25vZGVfdG9fcGFja2FnZV9pZChjcHVfbmlkKTtcbitcdGlmIChwYWNrYWdlX2lkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbitcbitcdG1wbiA9IGt6YWxsb2Nfb2JqKCptcG4pO1xuK1x0aWYgKCFtcG4pXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1xuK1x0bXBuLVx1MDAzZW5pZCA9IG5pZDtcbitcdG1wbi1cdTAwM2Vpbml0aWF0b3JfbmlkID0gY3B1X25pZDtcbitcdG1wbi1cdTAwM2VwYWNrYWdlX2lkID0gcGFja2FnZV9pZDtcbitcdG1wbi1cdTAwM2Vzb3VyY2VfZmxhZ3MgPSBzb3VyY2VfZmxhZ3M7XG4rXHRtcG4tXHUwMDNlcHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7XG4rXHRtcG4tXHUwMDNlcGFja2FnZSA9IE5VTEw7XG4rXHRJTklUX0xJU1RfSEVBRChcdTAwMjZtcG4tXHUwMDNlcGFja2FnZV9lbnRyeSk7XG4rXG4rXHRyZXR1cm4gbXBuO1xuK31cbitcbisvKlxuKyAqIFRvcG9sb2d5IHN5bW1ldHJ5IHN0YXR1c1xuKyAqIEluZGljYXRlcyB3aGV0aGVyIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxuKyAqIChzYW1lIG51bWJlciBvZiBDUFUgbm9kZXMgYW5kIG1lbW9yeS1vbmx5IG5vZGVzKS5cbisgKi9cbitzdGF0aWMgYm9vbCB0b3BvbG9neV9zeW1tZXRyaWM7XG4rXG4rc3RhdGljIHZvaWQgdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkodm9pZCk7XG4rXG4rc3RhdGljIHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqX19kZXN0cm95X3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZV9ub2RlICptcG47XG4rXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wLCAqdW5yZWdfbXAgPSBOVUxMO1xuK1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdG1wbiA9IG1wbnNbbmlkXTtcbitcdGlmICghbXBuKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdG1wID0gbXBuLVx1MDAzZXBhY2thZ2U7XG4rXHRpZiAobXApIHtcbitcdFx0dW5iaW5kX25vZGVfdG9fcGFja2FnZShtcCwgbmlkKTtcbitcdFx0bXBuLVx1MDAzZXBhY2thZ2UgPSBOVUxMO1xuK1xuK1x0XHRpZiAobWVtb3J5X3BhY2thZ2VfaXNfZW1wdHkobXApKSB7XG4rXHRcdFx0bGlzdF9kZWwoXHUwMDI2bXAtXHUwMDNlbGlzdCk7XG4rXHRcdFx0dW5yZWdfbXAgPSBtcDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0bXBuc1tuaWRdID0gTlVMTDtcbitcdGtmcmVlKG1wbik7XG4rXHRtcF9zbmFwc2hvdF9yZWJ1aWxkKCk7XG4rXG4rXHRyZXR1cm4gdW5yZWdfbXA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcGFja2FnZV9ub2RlKGludCBuaWQpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHR1bnJlZ19tcCA9IF9fZGVzdHJveV9wYWNrYWdlX25vZGUobmlkKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdGlmICh1bnJlZ19tcClcbitcdFx0ZGV2aWNlX3VucmVnaXN0ZXIoXHUwMDI2dW5yZWdfbXAtXHUwMDNlZGV2KTtcbitcbitcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZmluZF9wYWNrYWdlX25vZGUoaW50IG5pZCwgaW50IGluaXRpYXRvcl9uaWQpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICp1bnJlZ19tcCA9IE5VTEw7XG4rXHRpbnQgcmV0ID0gbmlkO1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGlmICghbXBuc1tuaWRdKSB7XG4rXHRcdHJldCA9IE5VTUFfTk9fTk9ERTtcbitcdH0gZWxzZSBpZiAobXBuc1tuaWRdLVx1MDAzZXNvdXJjZV9mbGFncyA9PSBNUE5fU1JDX1NMSVQgXHUwMDI2XHUwMDI2IGluaXRpYXRvcl9uaWQgXHUwMDNlPSAwKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFNMSVQtZGVyaXZlZCBlbnRyaWVzIGFyZSBwcm92aXNpb25hbDsgaWYgYSBkcml2ZXIgbGF0ZXJcbitcdFx0ICogcHJvdmlkZXMgYW4gZXhwbGljaXQgaW5pdGlhdG9yLCBkcm9wIHRoZSBwcm92aXNpb25hbFxuK1x0XHQgKiBlbnRyeSBhbmQgcmVidWlsZCB3aXRoIHRoZSBzdHJvbmdlciBoaW50LlxuK1x0XHQgKi9cbitcdFx0dW5yZWdfbXAgPSBfX2Rlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7XG4rXHRcdHJldCA9IE5VTUFfTk9fTk9ERTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdGlmICh1bnJlZ19tcClcbitcdFx0ZGV2aWNlX3VucmVnaXN0ZXIoXHUwMDI2dW5yZWdfbXAtXHUwMDNlZGV2KTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZmluZF9jcmVhdGVfcGFja2FnZV9ub2RlKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxuK3tcbitcdGludCBtcG5fbmlkO1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgKm1wbjtcbitcbitcdG1wbl9uaWQgPSBmaW5kX3BhY2thZ2Vfbm9kZShuaWQsIGluaXRpYXRvcl9uaWQpO1xuK1x0aWYgKG1wbl9uaWQgIT0gTlVNQV9OT19OT0RFKVxuK1x0XHRyZXR1cm4gbXBuX25pZDtcbitcbitcdG1wbiA9IGNyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcbitcdGlmIChJU19FUlIobXBuKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIobXBuKTtcbitcbitcdGd1YXJkKG11dGV4KShcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdGlmIChtcG5zW25pZF0pIHtcbitcdFx0a2ZyZWUobXBuKTtcbitcdFx0cmV0dXJuIG5pZDtcbitcdH1cbitcdG1wbnNbbmlkXSA9IG1wbjtcbitcbitcdHJldHVybiBuaWQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKGludCBuaWQpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IGZpbmRfY3JlYXRlX3BhY2thZ2Vfbm9kZShuaWQsIE5VTUFfTk9fTk9ERSk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYmluZF9ub2RlX3RvX3BhY2thZ2UobmlkKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR2YWxpZGF0ZV90b3BvbG9neV9zeW1tZXRyeSgpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yIC0gQWRkIGEgbm9kZSB3aXRoIGFuIGluaXRpYXRvclxuKyAqIEBuaWQ6ICAgICAgICAgICAgVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4rICogQGluaXRpYXRvcl9uaWQ6ICBDUFUgbmlkIHVzZWQgdG8gcmVzb2x2ZSBAbmlkJ3MgcGFja2FnZSAoXHUwMDNlPTApLlxuKyAqXG4rICogRW5zdXJlcyB0aGF0IGEgXHUwMDI2c3RydWN0IG1lbW9yeV9wYWNrYWdlX25vZGUgZXhpc3RzIGZvciBAbmlkIGFuZCB0aGF0IGl0c1xuKyAqIHBhY2thZ2VfaWQgaXMgZGV0ZXJtaW5lZCB1c2luZyBAaW5pdGlhdG9yX25pZCB3aGVuIHByb3ZpZGVkLiBCaW5kaW5nIHRvIHRoZVxuKyAqIHBhY2thZ2UgaXMgbm90IHBlcmZvcm1lZCBoZXJlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuXG4rICovXG4raW50IG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yKGludCBuaWQsIGludCBpbml0aWF0b3JfbmlkKVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBmaW5kX2NyZWF0ZV9wYWNrYWdlX25vZGUobmlkLCBpbml0aWF0b3JfbmlkKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IpO1xuK1xuKy8qKlxuKyAqIG1wX2FkZF9wYWNrYWdlX25vZGUgLSBBZGQgYSBub2RlLCByZXNvbHZpbmcgcGFja2FnZSBhdXRvbWF0aWNhbGx5XG4rICogQG5pZDogVGFyZ2V0IE5VTUEgbm9kZSB0byBhZGQuXG4rICpcbisgKiBXcmFwcGVyIG92ZXIgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3IoKSB0aGF0IHJlcXVlc3RzIGF1dG9tYXRpY1xuKyAqIGluaXRpYXRvciByZXNvbHV0aW9uIChlLmcuLCBuZWFyZXN0IENQVSkuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS5cbisgKi9cbitpbnQgbXBfYWRkX3BhY2thZ2Vfbm9kZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiBtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvcihuaWQsIE5VTUFfTk9fTk9ERSk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2FkZF9wYWNrYWdlX25vZGUpO1xuK1xuK3N0YXRpYyBpbnQgX19tcF9nZXRfcGFja2FnZV9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLFxuK1x0XHRcdFx0ICAgICBub2RlbWFza190ICpvdXQpXG4re1xuK1x0c3RydWN0IG1wX3NuYXBzaG90ICpzbmFwO1xuK1x0aW50IHBrZztcbitcbitcdGlmICghb3V0KVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1xuK1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0Z3VhcmQocmN1KSgpO1xuK1xuK1x0c25hcCA9IHJjdV9kZXJlZmVyZW5jZShtcF9zbmFwc2hvdCk7XG4rXHRpZiAoIXNuYXApXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0cGtnID0gc25hcC1cdTAwM2Vwa2dfb2ZbbmlkXTtcbitcdGlmIChwa2cgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0c3dpdGNoIChub2RlX3R5cGUpIHtcbitcdGNhc2UgTVBfTk9ERVNfQUxMOlxuK1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubm9kZXMpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTVBfTk9ERVNfQ1BVOlxuK1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10uY3B1X25vZGVzKTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIE1QX05PREVTX01FTV9PTkxZOlxuK1x0XHRub2Rlc19jb3B5KCpvdXQsIHNuYXAtXHUwMDNlcGtnW3BrZ10ubWVtb3J5X29ubHlfbm9kZXMpO1xuK1x0XHRicmVhaztcbitcdGRlZmF1bHQ6XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbitzdGF0aWMgaW50IF9fbXBfZ2V0X3ByZWZlcnJlZF9ub2RlbWFzayhpbnQgbmlkLCBlbnVtIG1wX25vZGVzX3R5cGUgbm9kZV90eXBlLFxuK1x0XHRcdFx0ICAgIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdC8qIE5vIGhvdC1wYXRoIGNhbGxlcnM6IHRoZSBtdXRleCBpcyBmaW5lIGhlcmUuICovXG4rXHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXG4rXHRpZiAoIW91dCkge1xuK1x0XHRyZXQgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1xuK1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMpIHtcbitcdFx0cmV0ID0gLUVJTlZBTDtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAobm9kZV90eXBlID09IE1QX05PREVTX0NQVSkge1xuK1x0XHRpZiAobm9kZV9pc19tZW1vcnlfb25seShuaWQpKSB7XG4rXHRcdFx0cmV0ID0gLUVJTlZBTDtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0fSBlbHNlIGlmIChub2RlX3R5cGUgPT0gTVBfTk9ERVNfTUVNX09OTFkpIHtcbitcdFx0aWYgKCFub2RlX2lzX21lbW9yeV9vbmx5KG5pZCkpIHtcbitcdFx0XHRyZXQgPSAtRUlOVkFMO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHRyZXQgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICghcGFja2FnZV9ub2RlX2lzX3ZhbGlkKG5pZCkpIHtcbitcdFx0cmV0ID0gLUVOT0VOVDtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRub2Rlc19jb3B5KCpvdXQsIG1wbnNbbmlkXS1cdTAwM2VwcmVmZXJyZWQpO1xuK1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2sgLSBEZW1vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2VcbisgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLlxuKyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayBvZiBuZWFyZXN0IG1lbW9yeS1vbmx5IHRhcmdldHMgaW4gdGhlIHNhbWUgcGFja2FnZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuKyAqL1xuK2ludCBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRyZXR1cm4gX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfQ1BVLCBvdXQpO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKTtcbitcbisvKipcbisgKiBtcF9uZXh0X2RlbW90aW9uX25vZGUgLSBQaWNrIG9uZSBkZW1vdGlvbiB0YXJnZXRcbisgKiBAbmlkOiBDUFUgbm9kZSBmcm9tIHdoaWNoIG1lbW9yeSB3b3VsZCBiZSBkZW1vdGVkLlxuKyAqXG4rICogUGlja3Mgb25lIHRhcmdldCAocmFuZG9tIGFtb25nIHRoZSBuZWFyZXN0KSBmcm9tIG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2soKS5cbisgKlxuKyAqIFJldHVybjogdGFyZ2V0IG5pZCBvbiBzdWNjZXNzLCBvciBOVU1BX05PX05PREUgaWYgbm8gY2FuZGlkYXRlIGlzIGF2YWlsYWJsZS5cbisgKi9cbitpbnQgbXBfbmV4dF9kZW1vdGlvbl9ub2RlKGludCBuaWQpXG4re1xuK1x0aW50IHRhcmdldF9uaWQ7XG4rXHRub2RlbWFza190IHRhcmdldF9ub2RlbWFzaztcbitcbitcdGlmIChtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrKG5pZCwgXHUwMDI2dGFyZ2V0X25vZGVtYXNrKSlcbitcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbitcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxuK1x0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuK1xuK1x0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFx1MDAyNnRhcmdldF9ub2RlbWFzayk7XG4rXG4rXHRyZXR1cm4gdGFyZ2V0X25pZDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9kZW1vdGlvbl9ub2RlKTtcbitcbisvKipcbisgKiBtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFzayAtIFByb21vdGlvbiBjYW5kaWRhdGVzIHdpdGhpbiBhIHBhY2thZ2VcbisgKiBAbmlkOiBNZW1vcnktb25seSBub2RlIHRvd2FyZHMgd2hpY2ggcHJvbW90aW9uIHNlZWtzIENQVSBsb2NhbGl0eS5cbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgb2YgbmVhcmVzdCBDUFUgdGFyZ2V0cyBpbiB0aGUgc2FtZSBwYWNrYWdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXG4rICovXG4raW50IG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKGludCBuaWQsIG5vZGVtYXNrX3QgKm91dClcbit7XG4rXHRyZXR1cm4gX19tcF9nZXRfcHJlZmVycmVkX25vZGVtYXNrKG5pZCwgTVBfTk9ERVNfTUVNX09OTFksIG91dCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKTtcbitcbisvKipcbisgKiBtcF9uZXh0X3Byb21vdGlvbl9ub2RlIC0gUGljayBvbmUgcHJvbW90aW9uIHRhcmdldFxuKyAqIEBuaWQ6IE1lbW9yeS1vbmx5IG5vZGUgdG8gYmUgcHJvbW90ZWQgdG93YXJkcyBDUFVzLlxuKyAqXG4rICogUGlja3Mgb25lIHRhcmdldCAocmFuZG9tIGFtb25nIHRoZSBuZWFyZXN0KSBmcm9tIG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKCkuXG4rICpcbisgKiBSZXR1cm46IHRhcmdldCBuaWQgb24gc3VjY2Vzcywgb3IgTlVNQV9OT19OT0RFIGlmIG5vIGNhbmRpZGF0ZSBpcyBhdmFpbGFibGUuXG4rICovXG4raW50IG1wX25leHRfcHJvbW90aW9uX25vZGUoaW50IG5pZClcbit7XG4rXHRpbnQgdGFyZ2V0X25pZDtcbitcdG5vZGVtYXNrX3QgdGFyZ2V0X25vZGVtYXNrO1xuK1xuK1x0aWYgKG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrKG5pZCwgXHUwMDI2dGFyZ2V0X25vZGVtYXNrKSlcbitcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbitcdGlmIChub2Rlc19lbXB0eSh0YXJnZXRfbm9kZW1hc2spKVxuK1x0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuK1xuK1x0dGFyZ2V0X25pZCA9IG5vZGVfcmFuZG9tKFx1MDAyNnRhcmdldF9ub2RlbWFzayk7XG4rXG4rXHRyZXR1cm4gdGFyZ2V0X25pZDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZSk7XG4rI2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xuK1xuKy8qKlxuKyAqIG1wX2dldF9wYWNrYWdlX25vZGVzIC0gUmV0dXJuIGFsbCBtZW1iZXJzIG9mIEBuaWQncyBwYWNrYWdlXG4rICogQG5pZDogQW55IE5VTUEgbm9kZSBpbiB0aGUgcGFja2FnZS5cbisgKiBAb3V0OiBPdXRwdXQgbm9kZW1hc2sgdG8gcmVjZWl2ZSBhbGwgbWVtYmVycy5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuKyAqL1xuK2ludCBtcF9nZXRfcGFja2FnZV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19BTEwsIG91dCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX25vZGVzKTtcbitcbisvKipcbisgKiBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXMgLSBSZXR1cm4gQ1BVIG1lbWJlcnMgb2YgQG5pZCdzIHBhY2thZ2VcbisgKiBAbmlkOiBBbnkgTlVNQSBub2RlIGluIHRoZSBwYWNrYWdlLlxuKyAqIEBvdXQ6IE91dHB1dCBub2RlbWFzayB0byByZWNlaXZlIENQVSBtZW1iZXJzLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIGlmIEBuaWQgaXMgaW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQuXG4rICovXG4raW50IG1wX2dldF9wYWNrYWdlX2NwdV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19DUFUsIG91dCk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKG1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlcyk7XG4rXG4rLyoqXG4rICogbXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMgLSBSZXR1cm4gbWVtb3J5LW9ubHkgbWVtYmVycyBvZiBAbmlkJ3MgcGFja2FnZVxuKyAqIEBuaWQ6IEFueSBOVU1BIG5vZGUgaW4gdGhlIHBhY2thZ2UuXG4rICogQG91dDogT3V0cHV0IG5vZGVtYXNrIHRvIHJlY2VpdmUgbWVtb3J5LW9ubHkgbWVtYmVycy5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBpZiBAbmlkIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkLlxuKyAqL1xuK2ludCBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2RlcyhpbnQgbmlkLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0cmV0dXJuIF9fbXBfZ2V0X3BhY2thZ2Vfbm9kZW1hc2sobmlkLCBNUF9OT0RFU19NRU1fT05MWSwgb3V0KTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXMpO1xuK1xuK3N0YXRpYyBpbnQgX19tZW1pbml0IG1wX2hvdHBsdWdfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbitcdFx0dW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKl9hcmcpXG4re1xuK1x0aW50IG5pZDtcbitcdHN0cnVjdCBub2RlX25vdGlmeSAqbm4gPSBfYXJnO1xuK1xuK1x0bmlkID0gbm4tXHUwMDNlbmlkO1xuK1x0aWYgKG5pZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oMCk7XG4rXG4rXHRzd2l0Y2ggKGFjdGlvbikge1xuK1x0Y2FzZSBOT0RFX1JFTU9WRURfTEFTVF9NRU1PUlk6XG4rXHRcdGRlc3Ryb3lfcGFja2FnZV9ub2RlKG5pZCk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0Y2FzZSBOT0RFX0FEREVEX0ZJUlNUX01FTU9SWTpcbitcdFx0Y3JlYXRlX25vZGVfd2l0aF9wYWNrYWdlKG5pZCk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0ZGVmYXVsdDpcbitcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygwKTtcbit9XG4rXG4rLypcbisgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIG1lbW9yeV9wYWNrYWdlIHRvcG9sb2d5XG4rICogUmVhZC1vbmx5IGF0dHJpYnV0ZXM6XG4rICogICAtIHBhY2thZ2Vfbm9kZXM6ICAgICAgIEFsbCBOVU1BIG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxuKyAqICAgLSBwYWNrYWdlX2NwdV9ub2RlczogICBDUFUgbm9kZXMgaW4gdGhpcyBwYWNrYWdlIChub2RlIG1hc2spXG4rICogICAtIHBhY2thZ2VfbWVtX29ubHlfbm9kZXM6IE1lbW9yeS1vbmx5IG5vZGVzIGluIHRoaXMgcGFja2FnZSAobm9kZSBtYXNrKVxuKyAqICAgLSBwaHlzaWNhbF9wYWNrYWdlX2lkOiBQaHlzaWNhbCBwYWNrYWdlIElEXG4rICovXG4rXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9ub2Rlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcbitcdFx0XHRcdCAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zilcbit7XG4rXHRzdHJ1Y3QgbWVtb3J5X3BhY2thZ2UgKm1wID0gZGV2X2dldF9kcnZkYXRhKGRldik7XG4rXG4rXHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXHRyZXR1cm4gc3lzZnNfZW1pdChidWYsIFwiJSpwYmxcXG5cIiwgbm9kZW1hc2tfcHJfYXJncyhcdTAwMjZtcC1cdTAwM2Vub2RlcykpO1xuK31cbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9ub2Rlcyk7XG4rXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9jcHVfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbitcbitcdGd1YXJkKG11dGV4KShcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcdHJldHVybiBzeXNmc19lbWl0KGJ1ZiwgXCIlKnBibFxcblwiLCBub2RlbWFza19wcl9hcmdzKFx1MDAyNm1wLVx1MDAzZWNwdV9ub2RlcykpO1xuK31cbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGFja2FnZV9jcHVfbm9kZXMpO1xuK1xuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbWVtX29ubHlfbm9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHRcdCAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xuK1xuK1x0Z3VhcmQobXV0ZXgpKFx1MDAyNm1lbW9yeV9wYWNrYWdlX2xvY2spO1xuK1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcIiUqcGJsXFxuXCIsIG5vZGVtYXNrX3ByX2FyZ3MoXHUwMDI2bXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpKTtcbit9XG4rc3RhdGljIERFVklDRV9BVFRSX1JPKHBhY2thZ2VfbWVtX29ubHlfbm9kZXMpO1xuK1xuK3N0YXRpYyBzc2l6ZV90IHBoeXNpY2FsX3BhY2thZ2VfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHRcdHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9wYWNrYWdlICptcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xuK1xuK1x0cmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCBcIiVkXFxuXCIsIG1wLVx1MDAzZXBhY2thZ2VfaWQpO1xuK31cbitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGh5c2ljYWxfcGFja2FnZV9pZCk7XG4rXG4rc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1lbW9yeV9wYWNrYWdlX2F0dHJzW10gPSB7XG4rXHRcdTAwMjZkZXZfYXR0cl9wYWNrYWdlX25vZGVzLmF0dHIsXG4rXHRcdTAwMjZkZXZfYXR0cl9wYWNrYWdlX2NwdV9ub2Rlcy5hdHRyLFxuK1x0XHUwMDI2ZGV2X2F0dHJfcGFja2FnZV9tZW1fb25seV9ub2Rlcy5hdHRyLFxuK1x0XHUwMDI2ZGV2X2F0dHJfcGh5c2ljYWxfcGFja2FnZV9pZC5hdHRyLFxuK1x0TlVMTCxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1lbW9yeV9wYWNrYWdlX2dyb3VwID0ge1xuK1x0LmF0dHJzID0gbWVtb3J5X3BhY2thZ2VfYXR0cnMsXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWVtb3J5X3BhY2thZ2VfZ3JvdXBzW10gPSB7XG4rXHRcdTAwMjZtZW1vcnlfcGFja2FnZV9ncm91cCxcbitcdE5VTEwsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfcGFja2FnZV9zeXNmc19pbml0KHZvaWQpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHN1YnN5c19zeXN0ZW1fcmVnaXN0ZXIoXHUwMDI2cGFja2FnZV9zdWJzeXMsIE5VTEwpO1xuK1x0aWYgKHJldCkge1xuK1x0XHRwcl9lcnIoXCJtZW1vcnlfcGFja2FnZSBzdWJzeXNfc3lzdGVtX3JlZ2lzdGVyIGZhaWxlZDogJWRcXG5cIiwgcmV0KTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbitjb3JlX2luaXRjYWxsKG1lbW9yeV9wYWNrYWdlX3N5c2ZzX2luaXQpO1xuK1xuKy8qKlxuKyAqIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyAtIENoZWNrIGlmIGFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBub2RlIHN0cnVjdHVyZVxuKyAqXG4rICogUmV0dXJucyB0cnVlIGlmIGFsbCBtZW1vcnkgcGFja2FnZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgQ1BVIG5vZGVzXG4rICogYW5kIG1lbW9yeS1vbmx5IG5vZGVzLCBpbmRpY2F0aW5nIGEgc3ltbWV0cmljIHRvcG9sb2d5LlxuKyAqXG4rICogVGhlIHRvcG9sb2d5X3N5bW1ldHJpYyB2YXJpYWJsZSBpcyBwcm90ZWN0ZWQgYnkgbWVtb3J5X3BhY2thZ2VfbG9jayBmb3JcbisgKiB3cml0ZXMgKGluIHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KS5cbisgKi9cbitib29sIG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYyh2b2lkKVxuK3tcbitcdHJldHVybiBSRUFEX09OQ0UodG9wb2xvZ3lfc3ltbWV0cmljKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljKTtcbitcbisvKiBXYWxrIHRoZSBwYWNrYWdlIGxpc3QgYW5kIGNvbXBhcmUgbm9kZSBjb3VudHM7IHRoZSBjYWxsZXIgaG9sZHMgdGhlIGxvY2suICovXG4rc3RhdGljIGJvb2wgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSh2b2lkKVxuK3tcbitcdHN0cnVjdCBtZW1vcnlfcGFja2FnZSAqbXA7XG4rXHRpbnQgcmVmX2NwdV9ub2RlX2NvdW50ID0gMCwgcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSAwO1xuK1x0aW50IHBhY2thZ2VfY291bnQgPSAwO1xuK1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZtZW1vcnlfcGFja2FnZV9sb2NrKTtcbitcbitcdGxpc3RfZm9yX2VhY2hfZW50cnkobXAsIFx1MDAyNm1lbW9yeV9wYWNrYWdlcywgbGlzdCkge1xuK1x0XHRpbnQgY3B1X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXHUwMDNlY3B1X25vZGVzKTtcbitcdFx0aW50IG1lbW9yeV9vbmx5X25vZGVfY291bnQgPSBub2Rlc193ZWlnaHQobXAtXHUwMDNlbWVtb3J5X29ubHlfbm9kZXMpO1xuK1x0XHRpbnQgdG90YWxfbm9kZV9jb3VudCA9IGNwdV9ub2RlX2NvdW50ICsgbWVtb3J5X29ubHlfbm9kZV9jb3VudDtcbitcbitcdFx0cGFja2FnZV9jb3VudCsrO1xuK1xuK1x0XHQvKiBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IDIgbm9kZXMgKi9cbitcdFx0aWYgKHRvdGFsX25vZGVfY291bnQgXHUwMDNjIDIpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRpZiAocGFja2FnZV9jb3VudCA9PSAxKSB7XG4rXHRcdFx0cmVmX2NwdV9ub2RlX2NvdW50ID0gY3B1X25vZGVfY291bnQ7XG4rXHRcdFx0cmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQgPSBtZW1vcnlfb25seV9ub2RlX2NvdW50O1xuK1x0XHR9IGVsc2UgaWYgKGNwdV9ub2RlX2NvdW50ICE9IHJlZl9jcHVfbm9kZV9jb3VudCB8fFxuK1x0XHRcdCAgIG1lbW9yeV9vbmx5X25vZGVfY291bnQgIT0gcmVmX21lbW9yeV9vbmx5X25vZGVfY291bnQpIHtcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChwYWNrYWdlX2NvdW50IFx1MDAzYyAyKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rLyoqXG4rICogdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkgLSBWYWxpZGF0ZSB0b3BvbG9neSBmb3IgcGFja2FnZS1hd2FyZSBmZWF0dXJlc1xuKyAqXG4rICogVmFsaWRhdGVzIHRvcG9sb2d5IHN5bW1ldHJ5IGJ5IGNoZWNraW5nIGFsbCBtZW1vcnkgcGFja2FnZXMgaGF2ZSBpZGVudGljYWxcbisgKiBub2RlIHN0cnVjdHVyZS4gVXBkYXRlcyB0aGUgZ2xvYmFsIHRvcG9sb2d5X3N5bW1ldHJpYyB2YXJpYWJsZS5cbisgKlxuKyAqIFRvcG9sb2d5IGlzIHZhbGlkIG9ubHkgd2hlbiBhbGwgY29uZGl0aW9ucyBhcmUgbWV0OlxuKyAqIDEuIEF0IGxlYXN0IDIgcGFja2FnZXMgZXhpc3QgKG11bHRpLXBhY2thZ2Ugc3lzdGVtKVxuKyAqIDIuIEFsbCBwYWNrYWdlcyBoYXZlIGlkZW50aWNhbCBjcHVfbm9kZSBhbmQgbWVtb3J5X29ubHlfbm9kZSBjb3VudHNcbisgKiAzLiBFYWNoIHBhY2thZ2UgaGFzIGF0IGxlYXN0IDIgdG90YWwgbm9kZXMgKGNwdV9ub2RlICsgbWVtb3J5X29ubHlfbm9kZSBcdTAwM2U9IDIpXG4rICpcbisgKiBWYWxpZCBjb25maWd1cmF0aW9ucyBwZXIgcGFja2FnZTpcbisgKiAtIDEgY3B1X25vZGUgKyAxIG1lbW9yeV9vbmx5X25vZGUgPSAyIG5vZGVzICh2YWxpZClcbisgKiAtIDIgY3B1X25vZGVzICsgMCBtZW1vcnlfb25seV9ub2RlID0gMiBub2RlcyAodmFsaWQpXG4rICogLSAwIGNwdV9ub2RlICsgMiBtZW1vcnlfb25seV9ub2RlcyA9IDIgbm9kZXMgKHZhbGlkKVxuKyAqIC0gMSBjcHVfbm9kZSArIDAgbWVtb3J5X29ubHlfbm9kZSA9IDEgbm9kZSAoaW52YWxpZCAtIHNpbmdsZSBub2RlIHBhY2thZ2UpXG4rICovXG4rc3RhdGljIHZvaWQgdmFsaWRhdGVfdG9wb2xvZ3lfc3ltbWV0cnkodm9pZClcbit7XG4rXHRndWFyZChtdXRleCkoXHUwMDI2bWVtb3J5X3BhY2thZ2VfbG9jayk7XG4rXG4rXHRXUklURV9PTkNFKHRvcG9sb2d5X3N5bW1ldHJpYywgX19jaGVja190b3BvbG9neV9zeW1tZXRyeSgpKTtcbit9XG4rXG4rc3RhdGljIGludCBfX2luaXQgbWVtb3J5X3BhY2thZ2VfaW5pdCh2b2lkKVxuK3tcbitcdGludCByZXQgPSAwLCBuaWQ7XG4rXG4rXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHtcbitcdFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRyZXQgPSBjcmVhdGVfbm9kZV93aXRoX3BhY2thZ2UobmlkKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGhvdHBsdWdfbm9kZV9ub3RpZmllcihtcF9ob3RwbHVnX2NhbGxiYWNrLCBNRU1USUVSX0hPVFBMVUdfUFJJKTtcbitcbitcdHZhbGlkYXRlX3RvcG9sb2d5X3N5bW1ldHJ5KCk7XG4rXG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rbGF0ZV9pbml0Y2FsbChtZW1vcnlfcGFja2FnZV9pbml0KTtcbmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jXG5pbmRleCA0ZTQ0MjFiMjJiNTlmLi42NmJjY2I5YTBhMTkxIDEwMDY0NFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcbisrKyBiL21tL21lbXBvbGljeS5jXG5AQCAtMTE3LDYgKzExNyw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3RsYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdWFjY2Vzcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gXG5AQCAtMTY3LDYgKzE2OCw4IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgKm5vZGVfYndfdGFibGU7XG4gICovXG4gc3RhdGljIERFRklORV9NVVRFWCh3aV9zdGF0ZV9sb2NrKTtcbiBcbitzdGF0aWMgYm9vbCBwYWNrYWdlX21vZGVfZW5hYmxlZDtcbitcbiBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcbiB7XG4gXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XG5AQCAtMTgwLDYgKzE4MywxMSBAQCBzdGF0aWMgdTggZ2V0X2lsX3dlaWdodChpbnQgbm9kZSlcbiBcdHJldHVybiB3ZWlnaHQ7XG4gfVxuIFxuK3N0YXRpYyBib29sIHdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKHZvaWQpXG4re1xuK1x0cmV0dXJuIFJFQURfT05DRShwYWNrYWdlX21vZGVfZW5hYmxlZCkgXHUwMDI2XHUwMDI2IG1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYygpO1xuK31cbitcbiAvKlxuICAqIENvbnZlcnQgYmFuZHdpZHRoIHZhbHVlcyBpbnRvIHdlaWdodGVkIGludGVybGVhdmUgd2VpZ2h0cy5cbiAgKiBDYWxsIHdpdGggd2lfc3RhdGVfbG9jay5cbkBAIC0zMzcsNiArMzQ1LDQ3IEBAIGludCBuZWFyZXN0X25vZGVfbm9kZW1hc2soaW50IG5vZGUsIG5vZGVtYXNrX3QgKm1hc2spXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKG5lYXJlc3Rfbm9kZV9ub2RlbWFzayk7XG4gXG4rLyoqXG4rICogbmVhcmVzdF9ub2Rlc19ub2RlbWFzayAtIEZpbmQgYWxsIG5vZGVzIGluIEBtYXNrIHRoYXQgYXJlIG5lYXJlc3QgdG8gQG5vZGVcbisgKiBAbm9kZTogVGhlIHJlZmVyZW5jZSBub2RlIElEIHRvIG1lYXN1cmUgZGlzdGFuY2UgZnJvbVxuKyAqIEBtYXNrOiBUaGUgc2V0IG9mIGNhbmRpZGF0ZSBub2RlcyB0byBjb21wYXJlIGFnYWluc3RcbisgKiBAb3V0OiAgUG9pbnRlciB0byBhIG5vZGVtYXNrIHRoYXQgd2lsbCBzdG9yZSB0aGUgbmVhcmVzdCBub2RlKHMpXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgYWxsIG5vZGVzIGluIEBtYXNrIGFuZCBtZWFzdXJlcyB0aGUgZGlzdGFuY2VcbisgKiBiZXR3ZWVuIGVhY2ggY2FuZGlkYXRlIG5vZGUgYW5kIHRoZSBnaXZlbiBAbm9kZSB1c2luZyBub2RlX2Rpc3RhbmNlKCkuXG4rICogSXQgZmluZHMgdGhlIG1pbmltdW0gZGlzdGFuY2UgYW5kIHRoZW4gcmVjb3JkcyBhbGwgbm9kZXMgaW4gQG1hc2sgdGhhdFxuKyAqIHNoYXJlIHRoYXQgc2FtZSBtaW5pbXVtIGRpc3RhbmNlIGludG8gdGhlIG91dHB1dCBtYXNrIEBvdXQuXG4rICpcbisgKiBGb3IgZXhhbXBsZSwgaWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSBlcXVhbCBtaW5pbWFsIGRpc3RhbmNlIHRvIEBub2RlLCBhbGxcbisgKiBvZiB0aGVtIGFyZSBpbmNsdWRlZCBpbiBAb3V0LlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIC1FSU5WQUwgaWYgQG91dCBpcyBOVUxMLlxuKyAqL1xuK2ludCBuZWFyZXN0X25vZGVzX25vZGVtYXNrKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICptYXNrLCBub2RlbWFza190ICpvdXQpXG4re1xuK1x0aW50IGRpc3QsIG4sIG1pbl9kaXN0ID0gSU5UX01BWDtcbitcbitcdGlmICghb3V0KVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdG5vZGVzX2NsZWFyKCpvdXQpO1xuK1xuK1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICptYXNrKSB7XG4rXHRcdGRpc3QgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pO1xuK1xuK1x0XHRpZiAoZGlzdCBcdTAwM2MgbWluX2Rpc3QpIHtcbitcdFx0XHRtaW5fZGlzdCA9IGRpc3Q7XG4rXHRcdFx0bm9kZXNfY2xlYXIoKm91dCk7XG4rXHRcdFx0bm9kZV9zZXQobiwgKm91dCk7XG4rXHRcdH0gZWxzZSBpZiAoZGlzdCA9PSBtaW5fZGlzdCkge1xuK1x0XHRcdG5vZGVfc2V0KG4sICpvdXQpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobmVhcmVzdF9ub2Rlc19ub2RlbWFzayk7XG4rXG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcClcbiB7XG4gXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBwLVx1MDAzZW1lbXBvbGljeTtcbkBAIC0yMDk3LDE3ICsyMTQ2LDk3IEBAIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKVxuIFx0cmV0dXJuIHpvbmUgXHUwMDNlPSBkeW5hbWljX3BvbGljeV96b25lO1xuIH1cbiBcbisvKipcbisgKiBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzIC0gUmVzdHJpY3QgcG9saWN5IG5vZGVzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2VcbisgKiBAcG9saWN5OiBUYXJnZXQgbWVtcG9saWN5IHdob3NlIHVzZXItc2VsZWN0ZWQgbm9kZXMgYXJlIGluIEBwb2xpY3ktXHUwMDNlbm9kZXMuXG4rICogQG1hc2s6ICAgT3V0cHV0IG5vZGVtYXNrLiBPbiBzdWNjZXNzLCBjb250YWlucyBwb2xpY3ktXHUwMDNlbm9kZXMgbGltaXRlZCB0b1xuKyAqICAgICAgICAgIHRoZSBwYWNrYWdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBhbGxvY2F0aW9uLlxuKyAqXG4rICogVGhpcyBoZWxwZXIgY29tYmluZXMgdHdvIGNvbnN0cmFpbnRzIHRvIGRlY2lkZSB3aGVyZSB3aXRoaW4gYSBwYWNrYWdlXG4rICogbWVtb3J5IG1heSBiZSBhbGxvY2F0ZWQ6XG4rICpcbisgKiAgIDEpIFRoZSBjYWxsZXIncyBwYWNrYWdlOiBkZXJpdmVkIHZpYSBtcF9nZXRfcGFja2FnZV9ub2RlcyhudW1hX25vZGVfaWQoKSkuXG4rICogICAyKSBUaGUgdXNlcidzIHByZXNlbGVjdGVkIHNldCBAcG9saWN5LVx1MDAzZW5vZGVzIChjcHVzZXRzL21lbXBvbGljeSkuXG4rICpcbisgKiBUaGUgZnVuY3Rpb24gb2J0YWlucyB0aGUgbm9kZW1hc2sgb2YgdGhlIGN1cnJlbnQgQ1BVJ3MgcGFja2FnZSBhbmRcbisgKiBpbnRlcnNlY3RzIGl0IHdpdGggQHBvbGljeS1cdTAwM2Vub2Rlcy4gSWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSAoZS5nLiB0aGVcbisgKiB1c2VyIGV4Y2x1ZGVkIGV2ZXJ5IG5vZGUgb2YgdGhlIGN1cnJlbnQgcGFja2FnZSksIGl0IGZhbGxzIGJhY2sgdG8gdGhlXG4rICogbm9kZSBpbiBAcG9saWN5LVx1MDAzZW5vZGVzLCBkZXJpdmVzIHRoYXQgbm9kZSdzIHBhY2thZ2UsIGFuZCBpbnRlcnNlY3RzXG4rICogYWdhaW4uIElmIHRoZSBmYWxsYmFjayBhbHNvIHlpZWxkcyBhbiBlbXB0eSBzZXQsIEBtYXNrIHN0YXlzIGVtcHR5IGFuZCBhXG4rICogbm9uLXplcm8gZXJyb3IgaXMgcmV0dXJuZWQuXG4rICpcbisgKiBFeGFtcGxlcyAocGFja2FnZXM6IFAwPXtDUFU6MCwgTUVNOjJ9LCBQMT17Q1BVOjEsIE1FTTozfSk6XG4rICogICAtIHBvbGljeS1cdTAwM2Vub2RlcyA9IHswLDEsMiwzfVxuKyAqICAgICAgIG9uIFAwOiBtYXNrID0gezAsMn07IG9uIFAxOiBtYXNrID0gezEsM30uXG4rICogICAtIHBvbGljeS1cdTAwM2Vub2RlcyA9IHswLDEsM31cbisgKiAgICAgICBvbiBQMDogbWFzayA9IHswfSAgICAgIChvbmx5IG5vZGUgMCBmcm9tIFAwIGlzIGFsbG93ZWQpLlxuKyAqICAgLSBwb2xpY3ktXHUwMDNlbm9kZXMgPSB7MSwyLDN9XG4rICogICAgICAgb24gUDA6IG1hc2sgPSB7Mn0gICAgICAob25seSBub2RlIDIgZnJvbSBQMCBpcyBhbGxvd2VkKS5cbisgKiAgIC0gcG9saWN5LVx1MDAzZW5vZGVzID0gezEsM31cbisgKiAgICAgICBvbiBQMDogY3VycmVudCBwYWNrYWdlIChQMCkgXHUwMDI2IHBvbGljeSA9IE5VTEwgLVx1MDAzZSBmYWxsYmFjayB0byBwb2xpY3k9MSxcbisgKiAgICAgICAgICAgICAgIHBhY2thZ2UoMSk9UDEsIG1hc2sgPSB7MSwzfS4gKFVzZXIgZWZmZWN0aXZlbHkgb3B0ZWQgb3V0IG9mIFAwLilcbisgKlxuKyAqIElmIHRoZSBzZWxlY3RlZCBub2RlIGlzIGxvdyBvbiBtZW1vcnksIHRoZSBhbGxvY2F0aW9uIG1heSB1c2UgYW5vdGhlciBub2RlLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgMCBvbiBzdWNjZXNzIHdpdGggQG1hc2sgc2V0IGFzIGFib3ZlO1xuKyAqICAgLUVJTlZBTCBpZiBAcG9saWN5L0BtYXNrIGlzIE5VTEw7XG4rICogICAtRU5PRU5UIGlmIGV2ZW4gdGhlIGZhbGxiYWNrIGludGVyc2VjdGlvbiBpcyBlbXB0eTtcbisgKiAgIFByb3BhZ2F0ZWQgZXJyb3IgZnJvbSBtcF9nZXRfcGFja2FnZV9ub2RlcygpIG9uIGZhaWx1cmUuXG4rICovXG4rc3RhdGljIGludCBwb2xpY3lfcmVzb2x2ZV9wYWNrYWdlX25vZGVzKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSwgbm9kZW1hc2tfdCAqbWFzaylcbit7XG4rXHRub2RlbWFza190IHBhY2thZ2VfbWFzaztcbitcdGludCBub2RlLCByZXQ7XG4rXG4rXHRpZiAoIXBvbGljeSB8fCAhbWFzaylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRub2Rlc19jbGVhcigqbWFzayk7XG4rXG4rXHRub2RlID0gbnVtYV9ub2RlX2lkKCk7XG4rXHRyZXQgPSBtcF9nZXRfcGFja2FnZV9ub2Rlcyhub2RlLCBcdTAwMjZwYWNrYWdlX21hc2spO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdG5vZGVzX2FuZCgqbWFzaywgcGFja2FnZV9tYXNrLCBwb2xpY3ktXHUwMDNlbm9kZXMpO1xuK1x0aWYgKCFub2Rlc19lbXB0eSgqbWFzaykpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LypcbitcdCAqIFRoZSB1c2VyJ3Mgbm9kZW1hc2sgZXhjbHVkZXMgZXZlcnkgbm9kZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlO1xuK1x0ICogZmFsbCBiYWNrIHRvIHRoZSBwYWNrYWdlIHNwYW5uZWQgYnkgdGhlIHVzZXIncyBvd24gZmlyc3Qgbm9kZS5cbitcdCAqL1xuK1x0bm9kZSA9IGZpcnN0X25vZGUocG9saWN5LVx1MDAzZW5vZGVzKTtcbitcdHJldCA9IG1wX2dldF9wYWNrYWdlX25vZGVzKG5vZGUsIFx1MDAyNnBhY2thZ2VfbWFzayk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0bm9kZXNfYW5kKCptYXNrLCBwYWNrYWdlX21hc2ssIHBvbGljeS1cdTAwM2Vub2Rlcyk7XG4rXHRpZiAobm9kZXNfZW1wdHkoKm1hc2spKVxuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KVxuIHtcbiBcdHVuc2lnbmVkIGludCBub2RlO1xuIFx0dW5zaWduZWQgaW50IGNwdXNldF9tZW1zX2Nvb2tpZTtcbitcdG5vZGVtYXNrX3QgbWFzaztcbiBcbiByZXRyeTpcbiBcdC8qIHRvIHByZXZlbnQgbWlzY291bnQgdXNlIHRzay1cdTAwM2VtZW1zX2FsbG93ZWRfc2VxIHRvIGRldGVjdCByZWJpbmQgKi9cbiBcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XG4gXHRub2RlID0gY3VycmVudC1cdTAwM2VpbF9wcmV2O1xuLVx0aWYgKCFjdXJyZW50LVx1MDAzZWlsX3dlaWdodCB8fCAhbm9kZV9pc3NldChub2RlLCBwb2xpY3ktXHUwMDNlbm9kZXMpKSB7XG4tXHRcdG5vZGUgPSBuZXh0X25vZGVfaW4obm9kZSwgcG9saWN5LVx1MDAzZW5vZGVzKTtcbitcbitcdC8qIFBhY2thZ2UgbW9kZSBvZmYgb3IgdW5yZXNvbHZlZDogZmFsbCBiYWNrIHRvIHRoZSBmdWxsIHBvbGljeSBub2RlbWFzay4gKi9cbitcdGlmICghd2lfcGFja2FnZV9tb2RlX2VuYWJsZWQoKSB8fFxuK1x0ICAgIHBvbGljeV9yZXNvbHZlX3BhY2thZ2Vfbm9kZXMocG9saWN5LCBcdTAwMjZtYXNrKSlcbitcdFx0bWFzayA9IHBvbGljeS1cdTAwM2Vub2RlcztcbitcbitcdGlmICghY3VycmVudC1cdTAwM2VpbF93ZWlnaHQgfHwgIW5vZGVfaXNzZXQobm9kZSwgbWFzaykpIHtcbitcdFx0bm9kZSA9IG5leHRfbm9kZV9pbihub2RlLCBtYXNrKTtcbiBcdFx0aWYgKHJlYWRfbWVtc19hbGxvd2VkX3JldHJ5KGNwdXNldF9tZW1zX2Nvb2tpZSkpXG4gXHRcdFx0Z290byByZXRyeTtcbiBcdFx0aWYgKG5vZGUgPT0gTUFYX05VTU5PREVTKVxuQEAgLTIyMDAsNiArMjMyOSwzMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuIFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4gfVxuIFxuKy8qXG4rICogUGFja2FnZS1hd2FyZSBjb3VudGVycGFydCBvZiByZWFkX29uY2VfcG9saWN5X25vZGVtYXNrKCk6IHJlc29sdmUgdGhlXG4rICogY3VycmVudCBwYWNrYWdlJ3Mgbm9kZXMgaW50ZXJzZWN0ZWQgd2l0aCB0aGUgcG9saWN5LCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4rICogZnVsbCBwb2xpY3kgbm9kZW1hc2sgd2hlbiBwYWNrYWdlIG1vZGUgaXMgb2ZmIG9yIHJlc29sdXRpb24gZmFpbHMuXG4rICovXG4rc3RhdGljIHVuc2lnbmVkIGludCByZWFkX29uY2VfcG9saWN5X3BhY2thZ2Vfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuK1x0XHRcdFx0XHRcdCAgICAgIG5vZGVtYXNrX3QgKm1hc2spXG4re1xuK1x0bm9kZW1hc2tfdCBwYWNrYWdlX21hc2s7XG4rXG4rXHRiYXJyaWVyKCk7XG4rXHRpZiAoIXdpX3BhY2thZ2VfbW9kZV9lbmFibGVkKCkpIHtcbitcdFx0bWVtY3B5KG1hc2ssIFx1MDAyNnBvbC1cdTAwM2Vub2Rlcywgc2l6ZW9mKG5vZGVtYXNrX3QpKTtcbitcdFx0cmV0dXJuIG5vZGVzX3dlaWdodCgqbWFzayk7XG4rXHR9XG4rXHRpZiAocG9saWN5X3Jlc29sdmVfcGFja2FnZV9ub2Rlcyhwb2wsIFx1MDAyNnBhY2thZ2VfbWFzaykpXG4rXHRcdG1lbWNweShtYXNrLCBcdTAwMjZwb2wtXHUwMDNlbm9kZXMsIHNpemVvZihub2RlbWFza190KSk7XG4rXHRlbHNlXG4rXHRcdG1lbWNweShtYXNrLCBcdTAwMjZwYWNrYWdlX21hc2ssIHNpemVvZihub2RlbWFza190KSk7XG4rXHRiYXJyaWVyKCk7XG4rXG4rXHRyZXR1cm4gbm9kZXNfd2VpZ2h0KCptYXNrKTtcbit9XG4rXG4gc3RhdGljIHVuc2lnbmVkIGludCB3ZWlnaHRlZF9pbnRlcmxlYXZlX25pZChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHBnb2ZmX3QgaWx4KVxuIHtcbiBcdHN0cnVjdCB3ZWlnaHRlZF9pbnRlcmxlYXZlX3N0YXRlICpzdGF0ZTtcbkBAIC0yMjEwLDcgKzIzNjMsNyBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHdlaWdodGVkX2ludGVybGVhdmVfbmlkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgcGdvZmZfdCBpbHgpXG4gXHR1OCB3ZWlnaHQ7XG4gXHRpbnQgbmlkID0gMDtcbiBcbi1cdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9ub2RlbWFzayhwb2wsIFx1MDAyNm5vZGVtYXNrKTtcbitcdG5yX25vZGVzID0gcmVhZF9vbmNlX3BvbGljeV9wYWNrYWdlX25vZGVtYXNrKHBvbCwgXHUwMDI2bm9kZW1hc2spO1xuIFx0aWYgKCFucl9ub2RlcylcbiBcdFx0cmV0dXJuIG51bWFfbm9kZV9pZCgpO1xuIFxuQEAgLTI2NTQsNyArMjgwNyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShnZnBfdCBnZnAsXG4gXHQvKiByZWFkIHRoZSBub2RlcyBvbnRvIHRoZSBzdGFjaywgcmV0cnkgaWYgZG9uZSBkdXJpbmcgcmViaW5kICovXG4gXHRkbyB7XG4gXHRcdGNwdXNldF9tZW1zX2Nvb2tpZSA9IHJlYWRfbWVtc19hbGxvd2VkX2JlZ2luKCk7XG4tXHRcdG5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfbm9kZW1hc2socG9sLCBcdTAwMjZub2Rlcyk7XG4rXHRcdG5ub2RlcyA9IHJlYWRfb25jZV9wb2xpY3lfcGFja2FnZV9ub2RlbWFzayhwb2wsIFx1MDAyNm5vZGVzKTtcbiBcdH0gd2hpbGUgKHJlYWRfbWVtc19hbGxvd2VkX3JldHJ5KGNwdXNldF9tZW1zX2Nvb2tpZSkpO1xuIFxuIFx0LyogaWYgdGhlIG5vZGVtYXNrIGhhcyBiZWNvbWUgaW52YWxpZCwgd2UgY2Fubm90IGRvIGFueXRoaW5nICovXG5AQCAtMzc5NCw3ICszOTQ3LDQyIEBAIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfYXV0b19hdHRyID0ge1xuIFx0LnN0b3JlID0gd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9hdXRvX3N0b3JlLFxuIH07XG4gXG4rc3RhdGljIHNzaXplX3QgcGFja2FnZV9tb2RlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosXG4rXHRcdHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuK3tcbitcdHJldHVybiBzeXNmc19lbWl0KGJ1ZiwgXCIlc1xcblwiLCBzdHJfdHJ1ZV9mYWxzZShSRUFEX09OQ0UocGFja2FnZV9tb2RlX2VuYWJsZWQpKSk7XG4rfVxuK1xuK3N0YXRpYyBzc2l6ZV90IHBhY2thZ2VfbW9kZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbitcdFx0c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbit7XG4rXHRib29sIGlucHV0O1xuK1x0aW50IGVycjtcbitcbitcdGVyciA9IGtzdHJ0b2Jvb2woYnVmLCBcdTAwMjZpbnB1dCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0LypcbitcdCAqIERpc2FibGUgcGFja2FnZS1hd2FyZSB3ZWlnaHRlZCBpbnRlcmxlYXZlIG9uIG5vbi1zeW1tZXRyaWMgdG9wb2xvZ2llcy5cbitcdCAqIE5vbi1zeW1tZXRyaWMgdG9wb2xvZ3kgKGUuZy4sIGFzeW1tZXRyaWMgQ1hMIG1lbW9yeSBhdHRhY2htZW50KSBjYW5cbitcdCAqIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlmIHBhY2thZ2UtYXdhcmUgYWxsb2NhdGlvbiBpcyB1c2VkLlxuK1x0ICogUmVqZWN0IGVuYWJsZSByZXF1ZXN0IGlmIHRvcG9sb2d5IGlzIG5vdCBzeW1tZXRyaWMuXG4rXHQgKi9cbitcdGlmIChpbnB1dCBcdTAwMjZcdTAwMjYgIW1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpYygpKSB7XG4rXHRcdHByX3dhcm4oXCJwYWNrYWdlX21vZGUgY2Fubm90IGJlIGVuYWJsZWQgb24gbm9uLXN5bW1ldHJpYyB0b3BvbG9neVxcblwiKTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRXUklURV9PTkNFKHBhY2thZ2VfbW9kZV9lbmFibGVkLCBpbnB1dCk7XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgd2lfcGFja2FnZV9tb2RlX2F0dHIgPVxuK1x0X19BVFRSKHBhY2thZ2VfbW9kZSwgMDY2NCwgcGFja2FnZV9tb2RlX3Nob3csIHBhY2thZ2VfbW9kZV9zdG9yZSk7XG4rXG4gc3RhdGljIHZvaWQgd2lfY2xlYW51cCh2b2lkKSB7XG4rXHRzeXNmc19yZW1vdmVfZmlsZShcdTAwMjZ3aV9ncm91cC1cdTAwM2V3aV9rb2JqLCBcdTAwMjZ3aV9wYWNrYWdlX21vZGVfYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3JlbW92ZV9maWxlKFx1MDAyNndpX2dyb3VwLVx1MDAzZXdpX2tvYmosIFx1MDAyNndpX2F1dG9fYXR0ci5hdHRyKTtcbiBcdHN5c2ZzX3dpX25vZGVfZGVsZXRlX2FsbCgpO1xuIFx0d2lfc3RhdGVfZnJlZSgpO1xuQEAgLTM5MDAsNiArNDA4OCwxMCBAQCBzdGF0aWMgaW50IF9faW5pdCBhZGRfd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ncm91cChzdHJ1Y3Qga29iamVjdCAqbWVtcG9saWN5X2tvYmopXG4gXHRpZiAoZXJyKVxuIFx0XHRnb3RvIGVycl9wdXRfa29iajtcbiBcbitcdGVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKFx1MDAyNndpX2dyb3VwLVx1MDAzZXdpX2tvYmosIFx1MDAyNndpX3BhY2thZ2VfbW9kZV9hdHRyLmF0dHIpO1xuK1x0aWYgKGVycilcbitcdFx0Z290byBlcnJfY2xlYW51cF9rb2JqO1xuK1xuIFx0Zm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7XG4gXHRcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSlcbiBcdFx0XHRjb250aW51ZTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI4OjI5LjE2MjMzMTk5NFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwOTU4OTI4NzM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2VybmVsIE1lbW9yeSBQYWNrYWdlIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBpbnRyb2R1Y2luZyBhIFwibWVtb3J5IHBhY2thZ2VcIiB0b3BvbG9neSBjb25jZXB0IHdpdGhpbiB0aGUga2VybmVsLCBwcmltYXJpbHkgZm9yIE5VTUEgbm9kZXMgYW5kLCBpbXBvcnRhbnRseSwgQ1hML0hCTSBtZW1vcnkgY29uZmlndXJhdGlvbnMuIEl0J3MgdG91Y2hpbmcgc29tZSBjcml0aWNhbCBhcmVhczogYG1tL21lbW9yeS10aWVycy5jYCwgYGRyaXZlcnMvY3hsL2NvcmUvcmVnaW9uLmNgLCBgZHJpdmVycy9kYXgva21lbS5jYCwgYW5kIGBtbS9tZW1wb2xpY3kuY2AuIFRoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2Ug4oCTIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmYgaGVyZSwgZGVhbGluZyB3aXRoIE5VTUEgbWVtb3J5IHRpZXJzLCBDWEwgcmVnaW9ucywgYW5kIHRoZSBtZW1wb2xpY3kgc3Vic3lzdGVtLiBJdOKAmXMgZGVmaW5pdGVseSB0b3VjaGluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIG1ha2luZyBmdXp6aW5nIGEgaGlnaCBwcmlvcml0eS5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGRpdmUgaW50byBpdCBhbmQgaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgYWRkZWQgb3IgbW9kaWZpZWQsIGZvY3VzaW5nIG9uIHBvdGVudGlhbCBhcmVhcyBvZiB2dWxuZXJhYmlsaXR5IG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIExldCdzIHNlZS4uLiB0aGUgcGF0Y2ggaXMgaW50cm9kdWNpbmcgYSBzeXNmcyBpbnRlcmZhY2UgZm9yIHRoZXNlIG1lbW9yeSBwYWNrYWdlcyB1bmRlciBgL3N5cy9kZXZpY2VzL3N5c3RlbS9wYWNrYWdlL2AgYW5kIGEgbmV3IHdlaWdodGVkIGludGVybGVhdmUgbW9kZSBmb3IgbWVtcG9saWN5LCBhY2Nlc3NpYmxlIHZpYSBgL3N5cy9rZXJuZWwvbW0vbWVtcG9saWN5L3dlaWdodGVkX2ludGVybGVhdmUvcGFja2FnZV9tb2RlYC5cblxuSSdtIG1ha2luZyBhIGxpc3Qgb2YgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBpbXBhY3RlZDogYGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9wcm9iZV9wYWNrYWdlX2lkYCwgdGhlIG5vdGlmaWVyIGZ1bmN0aW9ucywgdGhlIHBhY2thZ2Ugbm9kZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIChgbXBfYWRkX3BhY2thZ2Vfbm9kZWAsIGBtcF9nZXRfcGFja2FnZV9ub2Rlc2AsIGV0Yy4pLCBhbmQgdGhlIGludGVybGVhdmUgYW5kIHByb21vdGlvbi9kZW1vdGlvbiBmdW5jdGlvbnMuIEkgc2VlIGEgbG90IG9mIGFjdGl2aXR5IHdpdGhpbiBgbW0vbWVtb3J5LXRpZXJzLmNgIGFuZCBgbW0vbWVtcG9saWN5LmNgLCBzbyBJJ2xsIG5lZWQgdG8gc2NydXRpbml6ZSB0aG9zZSBtb2R1bGVzIGNhcmVmdWxseSB0byB1bmRlcnN0YW5kIHRoZSBjYWxsIHBhdGhzIGFuZCBkZXBlbmRlbmNpZXMuXG5cbk5vdywgbXkgZm9jdXMgbmFycm93cyB0byB0aGUgZXhwb3J0ZWQgYW5kIHJlYWNoYWJsZSBmdW5jdGlvbnMgd2l0aGluIGBtbS9tZW1vcnktdGllcnMuY2AgYW5kIGBtbS9tZW1wb2xpY3kuY2AsIG5hbWVseTogYG1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yYCwgYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBgbXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzYCwgYG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzYCwgYG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tgLCBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVgLCBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYCBhbmQgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgLiBUaGVzZSBhcmUgbXkgcHJpbWFyeSB0YXJnZXRzLlxuXG5HaXZlbiB0aGUgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzLCBlc3BlY2lhbGx5IHRoZSBOVU1BIGZvY3VzLCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiBOYXR1cmFsbHksIHRoaXMgY29kZSBpcyBoZWF2aWx5IE5VTUEtZGVwZW5kZW50LiBMZXQncyBtYWtlIHN1cmUgYENPTkZJR19OVU1BYCBpcyBlbmFibGVkLiBGdXJ0aGVyLCBJIHNob3VsZCBzZWUgaWYgYENPTkZJR19OVU1BX0JBTEFOQ0lOR2AsIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gLCBgQ09ORklHX01FTU9SWV9USUVSU2AsIG9yIGBDT05GSUdfQ1hMX0JVU2AgYXJlIGRlcGVuZGVuY2llcy4gSSdsbCBxdWlja2x5IGdyZXAgZm9yIHRoZSBtb3N0IHJlbGV2YW50IG9uZXMuIE9rYXksIHNvIHRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB3aGVyZSB0byBmb2N1cyBteSBpbml0aWFsIGZ1enppbmcgZWZmb3J0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk4MTYsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyODo0MC4xMjEyNjM4OFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTQ5ODg0NjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX05VTUFfTUlHUkFUSU9OXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnktdGllcnMuYz03MT1ib29sIGZvbGlvX3VzZV9hY2Nlc3NfdGltZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNzctXFxubW0vbWVtb3J5LXRpZXJzLmM6Nzg6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTc5LXN0YXRpYyBpbnQgdG9wX3RpZXJfYWRpc3RhbmNlO1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9MTM3PXN0YXRpYyBzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMgKm5vZGVfZGVtb3Rpb24gX19yZWFkX21vc3RseTtcXG5tbS9tZW1vcnktdGllcnMuYzoxMzg6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xcbm1tL21lbW9yeS10aWVycy5jLTEzOS1cXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTI2Nj1zdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtMjgxLVxcbm1tL21lbW9yeS10aWVycy5jOjI4MjojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxubW0vbWVtb3J5LXRpZXJzLmMtMjgzLWJvb2wgbm9kZV9pc190b3B0aWVyKGludCBub2RlKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9NTI3PXN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxcbm1tL21lbW9yeS10aWVycy5jOjUyODojZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXFxubW0vbWVtb3J5LXRpZXJzLmMtNTI5LVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9OTEyPXN0YXRpYyBpbnQgX19pbml0IG1lbW9yeV90aWVyX2luaXQodm9pZClcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTkxOS1cXG5tbS9tZW1vcnktdGllcnMuYzo5MjA6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTkyMS1cXHRub2RlX2RlbW90aW9uID0ga3phbGxvY19vYmpzKHN0cnVjdCBkZW1vdGlvbl9ub2RlcywgbnJfbm9kZV9pZHMpO1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9OTQ1PWJvb2wgbnVtYV9kZW1vdGlvbl9lbmFibGVkID0gZmFsc2U7XFxubW0vbWVtb3J5LXRpZXJzLmMtOTQ2LVxcbm1tL21lbW9yeS10aWVycy5jOjk0NzojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxubW0vbWVtb3J5LXRpZXJzLmMtOTQ4LSNpZmRlZiBDT05GSUdfU1lTRlNcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTE2MTg9c3RhdGljIGludCBfX21wX2dldF9wYWNrYWdlX25vZGVtYXNrKGludCBuaWQsIGVudW0gbXBfbm9kZXNfdHlwZSBub2RlX3R5cGUsXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy0xNjU4LVxcbm1tL21lbW9yeS10aWVycy5jOjE2NTk6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTE2NjAtc3RhdGljIGludCBfX21wX2dldF9wcmVmZXJyZWRfbm9kZW1hc2soaW50IG5pZCwgZW51bSBtcF9ub2Rlc190eXBlIG5vZGVfdHlwZSxcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTE3Nzg9RVhQT1JUX1NZTUJPTF9HUEwobXBfbmV4dF9wcm9tb3Rpb25fbm9kZSk7XFxubW0vbWVtb3J5LXRpZXJzLmM6MTc3OTojZW5kaWYgLyogQ09ORklHX05VTUFfTUlHUkFUSU9OICovXFxubW0vbWVtb3J5LXRpZXJzLmMtMTc4MC1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTExOTY9c3RhdGljIGxvbmcgZG9fZ2V0X21lbXBvbGljeShpbnQgKnBvbGljeSwgbm9kZW1hc2tfdCAqbm1hc2ssXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMjk2LVxcbm1tL21lbXBvbGljeS5jOjEyOTc6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbXBvbGljeS5jLTEyOTgtc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxcbi0tXFxubW0vbWlncmF0ZS5jPTIxODg9c3RydWN0IGZvbGlvICphbGxvY19taWdyYXRpb25fdGFyZ2V0KHN0cnVjdCBmb2xpbyAqc3JjLCB1bnNpZ25lZCBsb25nIHByaXZhdGUpXFxuLS1cXG5tbS9taWdyYXRlLmMtMjIyNi1cXG5tbS9taWdyYXRlLmM6MjIyNzojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXFxubW0vbWlncmF0ZS5jLTIyMjgtc3RhdGljIGludCBzdG9yZV9zdGF0dXMoaW50IF9fdXNlciAqc3RhdHVzLCBpbnQgc3RhcnQsIGludCB2YWx1ZSwgaW50IG5yKVxcbi0tXFxubW0vbWlncmF0ZS5jPTI2MTk9U1lTQ0FMTF9ERUZJTkU2KG1vdmVfcGFnZXMsIHBpZF90LCBwaWQsIHVuc2lnbmVkIGxvbmcsIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWlncmF0ZS5jLTI2MjUtfVxcbm1tL21pZ3JhdGUuYzoyNjI2OiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG5tbS9taWdyYXRlLmMtMjYyNy1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6NDAuMjM2MjU3NTAyWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDc5MjM3MTI5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgY29uZmlnIG9wdGlvbnMsIHRoaW5raW5nIGFib3V0IHRoZW0gYXMgYSBzZWFzb25lZCBleHBlcnQ6XG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgQXJjaGl0ZWN0dXJlIENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSSdtIGltbWVkaWF0ZWx5IHRoaW5raW5nIGFib3V0IGhvdyB0aGV5IGludGVycGxheSBhbmQgd2hhdCBhcmNoaXRlY3R1cmFsIGltcGxpY2F0aW9ucyB0aGV5IHN1Z2dlc3QuIEZpcnN0LCBgQ09ORklHX05VTUFgLiBUaGF0J3MgYSBmdW5kYW1lbnRhbCBnaXZlbiB0aGVzZSBkYXlzLCBidXQgaXQncyBhbHdheXMgd29ydGggdmVyaWZ5aW5nIGl0J3MgZW5hYmxlZCBhbmQgY29uZmlndXJlZCBjb3JyZWN0bHkgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiBOVU1BIGZ1bmRhbWVudGFsbHkgaW1wYWN0cyBtZW1vcnkgYWNjZXNzIGxhdGVuY3ksIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBpbXBsaWNhdGlvbnMgaXMgY3J1Y2lhbCBmb3IgcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucy4gSSBuZWVkIHRvIGtlZXAgaW4gbWluZCBob3cgdGhlIG1lbW9yeSBwb2xpY2llcyB3aWxsIGJlIGRlZmluZWQsIGhvdyB0aGUgc2NoZWR1bGVyIHdpbGwgd29yaywgYW5kIGhvdyB0aGUgT1Mgd2lsbCBtYW5hZ2UgbWVtb3J5IGFsbG9jYXRpb24gYWNyb3NzIGRpZmZlcmVudCBOVU1BIG5vZGVzLlxuXG5OZXh0LCBgQ09ORklHX01FTU9SWV9USUVSU2AuIFRoaXMgaXMgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gVGhpcyBzdWdnZXN0cyBhIG11bHRpLXRpZXJlZCBtZW1vcnkgYXJjaGl0ZWN0dXJlIGlzIGluIHBsYXkg4oCTIHRoaW5rIERSQU0sIHBlcnNpc3RlbnQgbWVtb3J5LCBvciBldmVuIGRpZmZlcmVudCB0eXBlcyBvZiBEUkFNIHdpdGggdmFyeWluZyBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MuIElmIHRoaXMgaXMgZW5hYmxlZCwgSSBpbW1lZGlhdGVseSBzdGFydCBjb25zaWRlcmluZyB0aGUgaW1wbGljYXRpb25zIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgZGF0YSBwbGFjZW1lbnQsIGFuZCBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHRoZSBkaWZmZXJlbmNlcyBpbiBhY2Nlc3Mgc3BlZWQgYW5kIHBlcnNpc3RlbmNlLiBUaGUgcG90ZW50aWFsIGZvciBjYWNoZS1hd2FyZSBhbGdvcml0aG1zIGFuZCBOVU1BLWF3YXJlIHBsYWNlbWVudCBiZWNvbWVzIGV4dHJlbWVseSBpbXBvcnRhbnQuXG5cbkZpbmFsbHksIGBDT05GSUdfQ1hMX0JVU2AuIE5vdywgdGhpcyBpcyBleGNpdGluZy4gQ1hMIChDb21wdXRlIEV4cHJlc3MgTGluaykgb3BlbnMgdXAgYSB3aG9sZSBuZXcgd29ybGQgb2YgcG9zc2liaWxpdGllcywgZW5hYmxpbmcgY29oZXJlbnQgbWVtb3J5IHNoYXJpbmcgYW5kIGFjY2VsZXJhdGlvbiBiZXR3ZWVuIHRoZSBDUFUgYW5kIGRldmljZXMuIFdpdGggQ1hMIGVuYWJsZWQsIEkgaGF2ZSB0byB0aGluayBhYm91dCBob3cgQ1hMIGRldmljZXMgd2lsbCBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIG1lbW9yeSBoaWVyYXJjaHkuIEFyZSB3ZSB0YWxraW5nIGFib3V0IENYTC1hdHRhY2hlZCBtZW1vcnksIGFjY2VsZXJhdG9ycywgb3IgYSBjb21iaW5hdGlvbj8gVGhpcyBjb25maWcgb3B0aW9uIHJhaXNlcyBxdWVzdGlvbnMgYWJvdXQgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgdGhlIGltcGxpY2F0aW9ucyBmb3IgRE1BLCBhbmQgaG93IHRoaXMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHN5c3RlbS4gSXQgYWxzbyBtZWFucyBJIG5lZWQgdG8gY2FyZWZ1bGx5IGFuYWx5emUgdGhlIGRyaXZlciBzdXBwb3J0IGFuZCBhbnkgcmVsZXZhbnQgZmlybXdhcmUgY29uc2lkZXJhdGlvbnMuIFRoaXMgaGFzIHNvbWUgdmVyeSBkZWVwIGltcGxpY2F0aW9ucyBmb3Igc3lzdGVtIGRlc2lnbiwgYW5kIEkgbmVlZCB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgQ1hMLWJhc2VkIG1lbW9yeSBhbmQgdGhlIGV4aXN0aW5nIE5VTUEgdG9wb2xvZ3kuIFRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHdob2xlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBzdGFjay5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIyMjcsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyODo0NS4wMjg2MzE5NDFaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc4MTM2NTAyOCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTU9SWV9USUVSU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI4OjQ3LjgxMDAwNjExWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzM2MDU4ODE2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqS2NvbmZpZyBEaXZlIGZvciBOVU1BL01FTU9SWV9USUVSUyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0aGVzZSBOVU1BIGFuZCBNRU1PUllfVElFUlMgY29uZmlndXJhdGlvbnMgYXJlIGhhbmRsZWQuIEdpdmVuIG15IGV4cGVyaWVuY2UsIHRoZSBmaXJzdCBwbGFjZSBJIGFsd2F5cyBnbyBpbiBhIGtlcm5lbCBidWlsZCBpcyB0aGUgYEtjb25maWdgIGZpbGVzLiBUaGF0J3MgdGhlIGNlbnRyYWwgY29uZmlndXJhdGlvbiBodWIsIHJpZ2h0PyBTbywgSSdtIHRoaW5raW5nLCBcIkxldCdzIGNoZWNrIGBtbS9LY29uZmlnYC5cIiBUaGF0J3MgdGhlIG1vc3QgbG9naWNhbCBzdGFydGluZyBwb2ludCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4gSSdsbCBzZWFyY2ggZm9yIGJvdGggYE5VTUFgIGFuZCBgTUVNT1JZX1RJRVJTYCB0byBzZWUgd2hhdCBJIGNhbiBmaW5kLiBJdCdzIGFsbW9zdCBndWFyYW50ZWVkIHRoZSBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIHdpbGwgYmUgcmlnaHQgdGhlcmUuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgcmVsZXZhbnQgc3ltYm9scywgZGVzY3JpcHRpb25zLCBhbmQgYW55IGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzLCBsaWtlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpb25zIG9yIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZlYXR1cmVzIHRoYXQgbWlnaHQgYmUgaW50ZXJ0d2luZWQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGVzZSBmZWF0dXJlcyBhcmUgZW5hYmxlZCBhbmQgbWFuYWdlZCB3aXRoaW4gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uIEZyb20gdGhlcmUsIEkgY2FuIHRyYWNrIGRvd24gdGhlIHNvdXJjZSBmaWxlcyB0aGV5IGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI3MTEsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyODo1NS4xNzA1OTg0MjJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEzMTc2MTkyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBOVU1BXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz00NDI9Y29uZmlnIEFSQ0hfS0VFUF9NRU1CTE9DS1xcbi0tXFxubW0vS2NvbmZpZy00NDUtIyBLZWVwIGFyY2ggTlVNQSBtYXBwaW5nIGluZnJhc3RydWN0dXJlIHBvc3QtaW5pdC5cXG5tbS9LY29uZmlnOjQ0Njpjb25maWcgTlVNQV9LRUVQX01FTUlORk9cXG5tbS9LY29uZmlnLTQ0Ny1cXHRib29sXFxuLS1cXG5tbS9LY29uZmlnPTYyND1jb25maWcgUEFHRV9SRVBPUlRJTkdcXG4tLVxcbm1tL0tjb25maWctNjMxLVxcbm1tL0tjb25maWc6NjMyOmNvbmZpZyBOVU1BX01JR1JBVElPTlxcbm1tL0tjb25maWctNjMzLVxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuLS1cXG5tbS9LY29uZmlnPTE0MTg9Y29uZmlnIEVYRUNNRU1cXG4tLVxcbm1tL0tjb25maWctMTQyMC1cXG5tbS9LY29uZmlnOjE0MjE6Y29uZmlnIE5VTUFfTUVNQkxLU1xcbm1tL0tjb25maWctMTQyMi1cXHRib29sXFxubW0vS2NvbmZpZy0xNDIzLVxcbm1tL0tjb25maWc6MTQyNDpjb25maWcgTlVNQV9FTVVcXG5tbS9LY29uZmlnLTE0MjUtXFx0Ym9vbCBcXFwiTlVNQSBlbXVsYXRpb25cXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI4OjU1LjI4Mzc3OTg2NVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxOTA3MzAzNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOlxuXG4qKktjb25maWcgTG9jYXRpb24gQ2hlY2sqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgYENPTkZJR19OVU1BYC4gVGhhdCBvbmUgc2hvdWxkIGJlIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCBJIG5lZWQgdG8gcXVpY2tseSByZWNhbGwgd2hlcmUgaXQgdHlwaWNhbGx5IHJlc2lkZXMgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuIE15IG1lbnRhbCBtYXAgdXN1YWxseSBwbGFjZXMgdGhlc2UgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIOKAkyBwYXJ0aWN1bGFybHkgdGhvc2UgcmVsYXRlZCB0byBOVU1BIOKAkyBpbiBlaXRoZXIgYGFyY2gvS2NvbmZpZ2AgKHVuZGVyIHRoZSByZWxldmFudCBhcmNoaXRlY3R1cmUgZGlyZWN0b3J5LCBuYXR1cmFsbHkpIG9yLCBpZiBpdCdzIG1vcmUgZ2VuZXJhbCBpbml0aWFsaXphdGlvbiByZWxhdGVkLCBgaW5pdC9LY29uZmlnYC4gSSdkIHN0YXJ0IHRoZXJlLCBzaW5jZSB0aGF0J3Mgd2hlcmUgSSdkIGV4cGVjdCBpdCwgZ2l2ZW4gaXRzIGZ1bmN0aW9uLiBObyBzZW5zZSBpbiB3YXN0aW5nIHRpbWUgc2VhcmNoaW5nIG90aGVyIGFyZWFzIGlmIHRoZSBsb2dpY2FsIGxvY2F0aW9ucyBhcmUga25vd24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMjI4LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjg6NTkuNDc0NTEzOTk2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MjY4NDM5ODg2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBOVU1BXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL2FybTY0L0tjb25maWc9MTUxNT1jb25maWcgSE9UUExVR19DUFVcXG4tLVxcbmFyY2gvYXJtNjQvS2NvbmZpZy0xNTIyLSMgQ29tbW9uIE5VTUEgRmVhdHVyZXNcXG5hcmNoL2FybTY0L0tjb25maWc6MTUyMzpjb25maWcgTlVNQVxcbmFyY2gvYXJtNjQvS2NvbmZpZy0xNTI0LVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9sb29uZ2FyY2gvS2NvbmZpZz01NDM9Y29uZmlnIE5SX0NQVVNcXG4tLVxcbmFyY2gvbG9vbmdhcmNoL0tjb25maWctNTUxLVxcbmFyY2gvbG9vbmdhcmNoL0tjb25maWc6NTUyOmNvbmZpZyBOVU1BXFxuYXJjaC9sb29uZ2FyY2gvS2NvbmZpZy01NTMtXFx0Ym9vbCBcXFwiTlVNQSBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9taXBzL0tjb25maWc9MjYwOT1jb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFXFxuLS1cXG5hcmNoL21pcHMvS2NvbmZpZy0yNjExLVxcbmFyY2gvbWlwcy9LY29uZmlnOjI2MTI6Y29uZmlnIE5VTUFcXG5hcmNoL21pcHMvS2NvbmZpZy0yNjEzLVxcdGJvb2wgXFxcIk5VTUEgU3VwcG9ydFxcXCJcXG4tLVxcbmFyY2gvcG93ZXJwYy9LY29uZmlnPTc1NT1jb25maWcgSVJRX0FMTF9DUFVTXFxuLS1cXG5hcmNoL3Bvd2VycGMvS2NvbmZpZy03NjMtXFxuYXJjaC9wb3dlcnBjL0tjb25maWc6NzY0OmNvbmZpZyBOVU1BXFxuYXJjaC9wb3dlcnBjL0tjb25maWctNzY1LVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9yaXNjdi9LY29uZmlnPTQ3OD1lbmRjaG9pY2VcXG4tLVxcbmFyY2gvcmlzY3YvS2NvbmZpZy00ODAtIyBDb21tb24gTlVNQSBGZWF0dXJlc1xcbmFyY2gvcmlzY3YvS2NvbmZpZzo0ODE6Y29uZmlnIE5VTUFcXG5hcmNoL3Jpc2N2L0tjb25maWctNDgyLVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9zMzkwL0tjb25maWc9NTM3PWNvbmZpZyBIT1RQTFVHX0NQVVxcbi0tXFxuYXJjaC9zMzkwL0tjb25maWctNTM5LVxcbmFyY2gvczM5MC9LY29uZmlnOjU0MDpjb25maWcgTlVNQVxcbmFyY2gvczM5MC9LY29uZmlnLTU0MS1cXHRib29sIFxcXCJOVU1BIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3NoL21tL0tjb25maWc9MTAyPWNvbmZpZyBWU1lTQ0FMTFxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTExNC1cXG5hcmNoL3NoL21tL0tjb25maWc6MTE1OmNvbmZpZyBOVU1BXFxuYXJjaC9zaC9tbS9LY29uZmlnLTExNi1cXHRib29sIFxcXCJOb24tVW5pZm9ybSBNZW1vcnkgQWNjZXNzIChOVU1BKSBTdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC9zcGFyYy9LY29uZmlnPTI1NT1jb25maWcgR0VORVJJQ19MT0NLQlJFQUtcXG4tLVxcbmFyY2gvc3BhcmMvS2NvbmZpZy0yNTktXFxuYXJjaC9zcGFyYy9LY29uZmlnOjI2MDpjb25maWcgTlVNQVxcbmFyY2gvc3BhcmMvS2NvbmZpZy0yNjEtXFx0Ym9vbCBcXFwiTlVNQSBzdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC94ODYvS2NvbmZpZz0xNTAxPWNvbmZpZyBBTURfTUVNX0VOQ1JZUFRcXG4tLVxcbmFyY2gveDg2L0tjb25maWctMTUxNy0jIENvbW1vbiBOVU1BIEZlYXR1cmVzXFxuYXJjaC94ODYvS2NvbmZpZzoxNTE4OmNvbmZpZyBOVU1BXFxuYXJjaC94ODYvS2NvbmZpZy0xNTE5LVxcdGJvb2wgXFxcIk5VTUEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0XFxcIlxcbi0tXFxuaW5pdC9LY29uZmlnPTEwMDc9Y29uZmlnIEFSQ0hfV0FOVF9OVU1BX1ZBUklBQkxFX0xPQ0FMSVRZXFxuLS1cXG5pbml0L0tjb25maWctMTAwOS1cXG5pbml0L0tjb25maWc6MTAxMDpjb25maWcgTlVNQV9CQUxBTkNJTkdcXG5pbml0L0tjb25maWctMTAxMS1cXHRib29sIFxcXCJNZW1vcnkgcGxhY2VtZW50IGF3YXJlIE5VTUEgc2NoZWR1bGVyXFxcIlxcbi0tXFxuaW5pdC9LY29uZmlnLTEwMjEtXFxuaW5pdC9LY29uZmlnOjEwMjI6Y29uZmlnIE5VTUFfQkFMQU5DSU5HX0RFRkFVTFRfRU5BQkxFRFxcbmluaXQvS2NvbmZpZy0xMDIzLVxcdGJvb2wgXFxcIkF1dG9tYXRpY2FsbHkgZW5hYmxlIE5VTUEgYXdhcmUgbWVtb3J5L3Rhc2sgcGxhY2VtZW50XFxcIlxcbi0tXFxubW0vS2NvbmZpZz00NDI9Y29uZmlnIEFSQ0hfS0VFUF9NRU1CTE9DS1xcbi0tXFxubW0vS2NvbmZpZy00NDUtIyBLZWVwIGFyY2ggTlVNQSBtYXBwaW5nIGluZnJhc3RydWN0dXJlIHBvc3QtaW5pdC5cXG5tbS9LY29uZmlnOjQ0Njpjb25maWcgTlVNQV9LRUVQX01FTUlORk9cXG5tbS9LY29uZmlnLTQ0Ny1cXHRib29sXFxuLS1cXG5tbS9LY29uZmlnPTYyND1jb25maWcgUEFHRV9SRVBPUlRJTkdcXG4tLVxcbm1tL0tjb25maWctNjMxLVxcbm1tL0tjb25maWc6NjMyOmNvbmZpZyBOVU1BX01JR1JBVElPTlxcbm1tL0tjb25maWctNjMzLVxcdGJvb2wgXFxcIk5VTUEgcGFnZSBtaWdyYXRpb25cXFwiXFxuLS1cXG5tbS9LY29uZmlnPTE0MTg9Y29uZmlnIEVYRUNNRU1cXG4tLVxcbm1tL0tjb25maWctMTQyMC1cXG5tbS9LY29uZmlnOjE0MjE6Y29uZmlnIE5VTUFfTUVNQkxLU1xcbm1tL0tjb25maWctMTQyMi1cXHRib29sXFxubW0vS2NvbmZpZy0xNDIzLVxcbm1tL0tjb25maWc6MTQyNDpjb25maWcgTlVNQV9FTVVcXG5tbS9LY29uZmlnLTE0MjUtXFx0Ym9vbCBcXFwiTlVNQSBlbXVsYXRpb25cXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjAzLjc0Mjk2MzY5MloiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDU1MjE3MDIzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUuIEhlcmUncyBob3cgSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpczpcblxuKipDaGVja2luZyBOVU1BIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzKipcblxuQWxyaWdodCwgZmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgc3RhdHVzIG9mIGBDT05GSUdfTlVNQWAgYW5kIGBDT05GSUdfTlVNQV9NSUdSQVRJT05gLiBHb3R0YSBnZXQgdGhvc2UgYmFzZSBkZXBlbmRlbmNpZXMgc3RyYWlnaHQgYmVmb3JlIEkgZGlnIGFueSBkZWVwZXIuIFRoZXNlIGFyZSBmdW5kYW1lbnRhbCBmb3IgTlVNQSBzdXBwb3J0LCBzbyBJJ20gYXNzdW1pbmcgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZXkncmUgc2V0IHRvIHdoYXQgSSBhbnRpY2lwYXRlLiBOb3csIGhvbGQgb24gYSBzZWNvbmQuLi4gd2hlcmUgZG9lcyBgbW0vbWVtb3J5LXRpZXJzLmNgIGFjdHVhbGx5IGNvbWUgaW50byBwbGF5PyBXaGVuIGlzIHRoYXQgdGhpbmcgY29tcGlsZWQ/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBidWlsZC10aW1lIGNvbnRleHQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBsaW5lZCB1cCBjb3JyZWN0bHkgd2l0aCB3aGF0ZXZlciBOVU1BIGZlYXR1cmVzIGFyZSBpbiB0aGUgbWl4LiBVbmRlcnN0YW5kaW5nIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIGlzIGVzc2VudGlhbCBoZXJlLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGF0IHRoZSBidWlsZCBjb25maWd1cmF0aW9ucyB3b3JrIGFzIGludGVuZGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDUzMiwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjA5Ljc5ODE4NDE1NFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcyNzU0NzU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1lbW9yeS10aWVyc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT05OD1vYmotJChDT05GSUdfTUlHUkFUSU9OKSArPSBtaWdyYXRlLm9cXG5tbS9NYWtlZmlsZTo5OTpvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9cXG5tbS9NYWtlZmlsZS0xMDAtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MDkuOTcwOTQzNzkzWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NDA4NzkwMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzIGZvciBDWEwgUmVnaW9uIERyaXZlciBNb2RpZmljYXRpb25zKipcblxuQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIHRoZSBhYnNvbHV0ZSByZXF1aXJlbWVudCBvZiBgQ09ORklHX05VTUFgLiBObyBzdXJwcmlzZXMgdGhlcmUuIENYTCwgZXNwZWNpYWxseSB0aGUgbWVtb3J5IHNlbWFudGljcywgaXMgZnVuZGFtZW50YWxseSBpbnRlcnR3aW5lZCB3aXRoIE5vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MuIFRoYXQncyBhIGdpdmVuLlxuXG5Ob3csIGxldCdzIGRyaWxsIGRvd24gYSBiaXQgZGVlcGVyLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hhdCdzIHRoZSBkZWFsIHdpdGggYENPTkZJR19DWExfQlVTYD8gVGhlIGZhY3QgdGhhdCB0aGUgcGF0Y2ggdG91Y2hlcyBgZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY2AgaXMgc2lnbmlmaWNhbnQuIEl0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoYXQgdGhlc2UgY2hhbmdlcyBhcmUgZWl0aGVyIGRpcmVjdGx5IGRlcGVuZGVudCBvbiwgb3IgYXQgdGhlIHZlcnkgbGVhc3QsIGhlYXZpbHkgaW5mbHVlbmNlZCBieSwgd2hldGhlciBvciBub3QgdGhlIENYTCBidXMgZHJpdmVyIGlzIGVuYWJsZWQuIFJlZ2lvbi5jIGlzIHRoZSBoZWFydCBvZiBDWEwgbWVtb3J5IHJlZ2lvbiBtYW5hZ2VtZW50LCBzbyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkaXJlY3RseSByZWxhdGVkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGV0aGVyIHRoaXMgaXMgYSBoYXJkIGRlcGVuZGVuY3ksIGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gc2NlbmFyaW8sIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBGdXJ0aGVyIGludmVzdGlnYXRpb24gaXMgcmVxdWlyZWQgdG8gZnVsbHkgZ3Jhc3AgdGhlIG51YW5jZXMgb2YgdGhlIGludGVyYWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDg1MiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjEzLjQxMzg1NjQ0NVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY0MTQ1MTE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDWExfQlVTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvY3hsL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9jeGwvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbmRyaXZlcnMvY3hsL0tjb25maWc6MjptZW51Y29uZmlnIENYTF9CVVNcXG5kcml2ZXJzL2N4bC9LY29uZmlnLTMtXFx0dHJpc3RhdGUgXFxcIkNYTCAoQ29tcHV0ZSBFeHByZXNzIExpbmspIERldmljZXMgU3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MTMuNTc4MDA2MjY0WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkxNTkwNTI5MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgY3JhZnRlZCB3aXRoIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgSSdtIHNwZWFraW5nIHRvIGEgZmVsbG93IGV4cGVydDpcblxuKipJbnZlc3RpZ2F0aW5nIERBWCBhbmQgS2VybmVsIE1lbW9yeSBNb2RpZmljYXRpb25zKipcblxuQWxyaWdodCwgc28gdGhlIGluaXRpYWwgZm9jdXMgc2VlbXMgdG8gYmUgb24gdGhlIGBkcml2ZXJzL2RheC9rbWVtLmNgIGZpbGUuIE15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIHJ1bm5pbmcgdGhyb3VnaCB0aGUgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gV2hlbmV2ZXIgSSBzZWUgREFYIGFuZCBrZXJuZWwgbWVtb3J5IG1vZGlmaWNhdGlvbnMgaW4gdGhlIHNhbWUgc2VudGVuY2UsIHRoZSBhbGFybSBiZWxscyBzdGFydCByaW5naW5nLiBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGRpcmVjdCBhY2Nlc3MgaW1wbGljYXRpb25zLCB0aGUgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMsIGFuZCB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBvciByZWdyZXNzaW9ucy4gSSB3b25kZXIgd2hhdCBzcGVjaWZpYyBjaGFuZ2VzIGFyZSBiZWluZyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGFsbG9jYXRpb24gc3RyYXRlZ2llcywgY2FjaGluZyBiZWhhdmlvciwgbWFwcGluZyBpbnRlcmFjdGlvbnMsIGVycm9yIGhhbmRsaW5nIHJlbGF0ZWQgdG8gcGVyc2lzdGVudCBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBUaGUgYGttZW0uY2AgcGFydCBzdWdnZXN0cyB3ZSdyZSBkZWFsaW5nIHdpdGgga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50LCB3aGljaCBhbHdheXMgZGVtYW5kcyBhIGhpZ2ggbGV2ZWwgb2Ygc2NydXRpbnkuIEknbGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGFjdHVhbCBjb2RlIGNoYW5nZXMgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUgYW5kIHRoZSByYXRpb25hbGUgYmVoaW5kIHRoZW0uIFdoYXQgcHJvYmxlbSBpcyB0aGlzIG1vZGlmaWNhdGlvbiB0cnlpbmcgdG8gYWRkcmVzcz8gV2hhdCdzIHRoZSB0cmFkZS1vZmYgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIHNlY3VyaXR5LCBhbmQgc3RhYmlsaXR5PyBUaGUgZGV2aWwncyBhbHdheXMgaW4gdGhlIGRldGFpbHMsIGFuZCBJIGFudGljaXBhdGUgdGhpcyB3aWxsIGJlIG5vIGRpZmZlcmVudC4gVGhpcyBzZWVtcyBsaWtlIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZSwgYW5kIEknbGwgbmVlZCB0byBiZSByZWFkeSB0byBldmFsdWF0ZSB0aGUgY2hhbmdlIHdpdGggYSB0aG9yb3VnaCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTIyNiwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjIyLjczNzA2MjcyM1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQzOTE3NjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBERVZfREFYX0tNRU1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9kYXgvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2RheC9LY29uZmlnPTY4PWNvbmZpZyBERVZfREFYX0ZTREVWXFxuLS1cXG5kcml2ZXJzL2RheC9LY29uZmlnLTcyLVxcbmRyaXZlcnMvZGF4L0tjb25maWc6NzM6Y29uZmlnIERFVl9EQVhfS01FTVxcbmRyaXZlcnMvZGF4L0tjb25maWctNzQtXFx0dHJpc3RhdGUgXFxcIktNRU0gREFYOiBtYXAgZGF4LWRldmljZXMgYXMgU3lzdGVtLVJBTVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MjMuMTgwOTg1NTcyWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2ODQwOTExNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgbXkgaW5pdGlhbCB0aGlua2luZyBpcyB0aGF0IEkgbWlnaHQgbmVlZCB0byBlbmFibGUgYSBmZXcga2VybmVsIGNvbmZpZ3VyYXRpb25zIHRvIHN1cHBvcnQgdGhpcy4gSSdtIHRoaW5raW5nIHNwZWNpZmljYWxseSBhYm91dCBgQ09ORklHX05VTUFgLCBgQ09ORklHX0NYTF9CVVNgLCBhbmQgYWxzbyBgQ09ORklHX0RFVl9EQVhfS01FTWAuIFRoZXNlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgd2hlbiBkZWFsaW5nIHdpdGggbWVtb3J5IGFuZCBuZXcgaW50ZXJjb25uZWN0IHRlY2hub2xvZ2llcywgc28gdGhleSBhcmUgdGhlIGluaXRpYWwgY29uc2lkZXJhdGlvbnMuXG5cbk5vdywgaG9sZCBvbi4gSSByZW1lbWJlciBzZWVpbmcgc29tZXRoaW5nIGFib3V0IENYTCByZWdpb24gbWFuYWdlbWVudC4gQWgsIHllcyEgYGN4bF9yZWdpb25fYWRkX3BhY2thZ2Vfbm9kZWAuLi4gdGhhdCBmdW5jdGlvbiBpcyBkZWZpbmVkIHdpdGhpbiBgZHJpdmVycy9jeGwvY29yZS9yZWdpb24uY2AuIEV4Y2VsbGVudC4gVGhhdCBnaXZlcyBtZSBhIHVzZWZ1bCBhbmNob3IgZm9yIHRyYWNpbmcgdGhyb3VnaCB0aGUgcmVsZXZhbnQgY29kZS4gVGhpcyBhbHNvIGluZGljYXRlcyB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgd2hlcmUgSSBjYW4gYmVnaW4uIEkgY2FuIHN0YXJ0IG15IHJldmlldyBvZiB0aGUgc2l0dWF0aW9uIGZyb20gaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU2NTMsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOToyNi44NjUwODAzNDhaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMTg1NDA1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZWdpb24ub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvY3hsL2NvcmUvTWFrZWZpbGU9MTc9Y3hsX2NvcmUtJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2Uub1xcbmRyaXZlcnMvY3hsL2NvcmUvTWFrZWZpbGU6MTg6Y3hsX2NvcmUtJChDT05GSUdfQ1hMX1JFR0lPTikgKz0gcmVnaW9uLm8gcmVnaW9uX3BtZW0ubyByZWdpb25fZGF4Lm9cXG5kcml2ZXJzL2N4bC9jb3JlL01ha2VmaWxlLTE5LWN4bF9jb3JlLSQoQ09ORklHX0NYTF9NQ0UpICs9IG1jZS5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjI2Ljk3Njk1ODk4MVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjcyMzE0MDY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb246IEEgTmVjZXNzaXR5KipcblxuQWxyaWdodCwgc28gSSd2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzLCBhbmQgaXQncyBiZWNvbWUgY3J5c3RhbCBjbGVhciB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCBgQ09ORklHX0NYTF9SRUdJT05gIGVuYWJsZWQuIFRoZXJlJ3Mgbm8gd2F5IGFyb3VuZCBpdC4gRnJvbSB3aGF0IEkndmUgc2VlbiBpbiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb25zLCB0aGUgcmVnaW9uIGNvbmZpZ3VyYXRpb24gaXMgZm91bmRhdGlvbmFsIGZvciBtYW5hZ2luZyB0aGUgQ1hMIGZhYnJpYyBpdHNlbGYuIFdpdGhvdXQgaXQsIHdlJ3JlIGVzc2VudGlhbGx5IGRlYWQgaW4gdGhlIHdhdGVyLiBXZSB3b24ndCBiZSBhYmxlIHRvIHByb3Blcmx5IGRpc2NvdmVyLCBjb25maWd1cmUsIGFuZCB1dGlsaXplIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgQ1hMIGRldmljZXMgYXJlIGJyaW5naW5nIHRvIHRoZSB0YWJsZS4gV2UgbmVlZCB0aGlzIGJhc2ljIGJ1aWxkaW5nIGJsb2NrIHRvIGV2ZW4gKnN0YXJ0KiBidWlsZGluZyB0aGUgaGlnaGVyLWxldmVsIGZ1bmN0aW9uYWxpdHkgbGlrZSBtZW1vcnkgcG9vbGluZywgY2FjaGUgY29oZXJlbmN5IHByb3RvY29scywgb3IgZGV2aWNlIG1hbmFnZW1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MDI1LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6MzAuMjQ5Mjc3NzY1WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTQ3MjgxOTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIENYTF9SRUdJT05cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9jeGwvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2N4bC9LY29uZmlnPTE5Mz1jb25maWcgQ1hMX1NVU1BFTkRcXG4tLVxcbmRyaXZlcnMvY3hsL0tjb25maWctMTk2LVxcbmRyaXZlcnMvY3hsL0tjb25maWc6MTk3OmNvbmZpZyBDWExfUkVHSU9OXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTgtXFx0Ym9vbCBcXFwiQ1hMOiBSZWdpb24gU3VwcG9ydFxcXCJcXG4tLVxcbmRyaXZlcnMvY3hsL0tjb25maWctMjE0LVxcbmRyaXZlcnMvY3hsL0tjb25maWc6MjE1OmNvbmZpZyBDWExfUkVHSU9OX0lOVkFMSURBVElPTl9URVNUXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0yMTYtXFx0Ym9vbCBcXFwiQ1hMOiBSZWdpb24gQ2FjaGUgTWFuYWdlbWVudCBCeXBhc3MgKFRFU1QpXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTozMC40MDQwMTE3NDVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTc4MjA1NjAxNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBNZW1vcnkgUG9saWN5IGFuZCBNdWx0aS1QYWNrYWdlIEZ1bmN0aW9ucyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW4uIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFuZCBzeW1ib2xzIHJlbGF0ZWQgdG8gbXVsdGktcGFja2FnZSBhbmQgTlVNQSBmdW5jdGlvbmFsaXR5LiBGaXJzdCwgaXQncyB3b3J0aCBkb3VibGUtY2hlY2tpbmcgYENPTkZJR19OVU1BX01JR1JBVElPTmAgYmVjYXVzZSBzZXZlcmFsIGZ1bmN0aW9ucywgbGlrZSBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFza2AsIGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIHVuZGVyIGl0LiBTbywgbGV0J3MgbGlzdCB0aGUgY29uZmlncyBJJ20gaW50ZXJlc3RlZCBpbjogYE5VTUFgLCBgTlVNQV9NSUdSQVRJT05gLCBgQ1hMX0JVU2AsIGBDWExfUkVHSU9OYCwgYW5kIGBERVZfREFYX0tNRU1gLlxuXG5Ob3csIGxldCdzIHR1cm4gb3VyIGF0dGVudGlvbiB0byB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zLiBJIG5lZWQgdG8ga25vdyB0aGUgbGFuZHNjYXBlLCBzbyBoZXJlJ3Mgd2hhdCBJJ20gZm9jdXNpbmcgb246XG5cbiogICBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgXG4qICAgYG1wX2FkZF9wYWNrYWdlX25vZGVgXG4qICAgYG1wX2dldF9wYWNrYWdlX25vZGVzYFxuKiAgIGBtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNgXG4qICAgYG1wX2dldF9wYWNrYWdlX21lbW9yeV9vbmx5X25vZGVzYFxuKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVtYXNrYFxuKiAgIGBtcF9uZXh0X2RlbW90aW9uX25vZGVgXG4qICAgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYFxuKiAgIGBtcF9uZXh0X3Byb21vdGlvbl9ub2RlYFxuKiAgIGBtcF9pc190b3BvbG9neV9zeW1tZXRyaWNgXG4qICAgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgXG4qICAgYG1wX3Byb2JlX3BhY2thZ2VfaWRgXG4qICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgXG4qICAgYHVucmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcmBcblxuTmV4dCwgSSBuZWVkIHRvIGtub3cgaWYgdGhlc2Ugc3ltYm9scyBhcmUgZXhwb3J0ZWQuIFRoaXMgaXMgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGVpciBhY2Nlc3NpYmlsaXR5IGFuZCBwb3RlbnRpYWwgdXNlIGluIG90aGVyIGtlcm5lbCBtb2R1bGVzLiBUaGFua2Z1bGx5LCB0aGV5IGFyZSBhbGwgZXhwb3J0ZWQgdXNpbmcgYEVYUE9SVF9TWU1CT0xfR1BMYC4gVGhhdCdzIGdvb2QgbmV3cyDigJMgaXQgdGVsbHMgbWUgdGhlc2UgZnVuY3Rpb25zIGFyZSBpbnRlbmRlZCBmb3IgdXNlIG91dHNpZGUgdGhlIGltbWVkaWF0ZSBtb2R1bGUsIHVuZGVyIHRoZSBHUEwgbGljZW5zZS5cblxuQWxyaWdodCwgd2hhdCBlbHNlIG1pZ2h0IGJlIGltcG9ydGFudD8gSSBoYWQgYSB0aG91Z2h0IGFib3V0IGBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmVg4oCUaXQncyBhIGNvcmUgZnVuY3Rpb24uIEkgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggbXkgYW5hbHlzaXMgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFdhaXQsIEkgcmVtZW1iZXIgdGhhdCBpdCdzIHN0YXRpYyBpbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gcmV2aXNpdCB0aGF0IGZpbGUgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSBhbmQgaG93IGl0IGZpdHMgaW50byB0aGUgYnJvYWRlciBwaWN0dXJlLiBNeSBuZXh0IHN0ZXAgaXMgdG8gZXhwbG9yZSBgbW0vbWVtcG9saWN5LmNgIG1vcmUgY2xvc2VseSBhbmQgYXNzZXNzIGl0cyBwbGFjZSB3aXRoaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjYzODEsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NDAuMTg2MDcxMzdaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzOTgzNzc1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtcG9saWN5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtcG9saWN5LmM9Mjc0OD1zdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMjc4Mi1cXG5tbS9tZW1wb2xpY3kuYzoyNzgzOnN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShnZnBfdCBnZnAsXFxubW0vbWVtcG9saWN5LmMtMjc4NC1cXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0yOTI3PXVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19tZW1wb2xpY3lfbm9wcm9mKGdmcF90IGdmcCxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTI5NDEtXFx0aWYgKHBvbC1cXHUwMDNlbW9kZSA9PSBNUE9MX1dFSUdIVEVEX0lOVEVSTEVBVkUpXFxubW0vbWVtcG9saWN5LmM6Mjk0MjpcXHRcXHRyZXR1cm4gYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKFxcbm1tL21lbXBvbGljeS5jLTI5NDMtXFx0XFx0XFx0XFx0ICBnZnAsIHBvbCwgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTo0MC40MjU5MTQ1NDRaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzkzMzg1ODIzOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKkluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgTWVtb3J5IEFsbG9jYXRpb24gV29ya2Zsb3cqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHBhdGgsIGFuZCBpdCBsb29rcyBsaWtlIGBhbGxvY19wYWdlc19idWxrX21lbXBvbGljeV9ub3Byb2ZgIGlzIHRoZSBrZXkgZW50cnkgcG9pbnQgaGVyZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gaXMgbWFraW5nIGRlY2lzaW9ucyB3aGVuIGdyYWJiaW5nIHBhZ2VzLiBBbmQgaXQgbG9va3MgbGlrZSB0aGUgZnVuY3Rpb24gYHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXNgIGlzIHN0YXRpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFN0YXRpYyBtZWFucyBpdCdzIGxpa2VseSBvbmx5IHVzZWQgd2l0aGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCwgd2hpY2ggbWlnaHQgZ2l2ZSBtZSBzb21lIGNsdWVzIGFib3V0IGl0cyBzY29wZSBvZiByZXNwb25zaWJpbGl0eS4gQW5kLCBhbHNvIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25pZGAgaXMgYSBzdGF0aWMgZnVuY3Rpb24uIFRoYXQgZnVydGhlciBmb2N1c2VzIG15IGF0dGVudGlvbi4gU2luY2UgdGhleSBhcmUgc3RhdGljLCBJIHNob3VsZCBmaXJzdCBleGFtaW5lIGB3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzYCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneSB3b3Jrcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc4MDEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTo0NC4zNTk3NzY1MDNaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc1MDg1OTg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIndlaWdodGVkX2ludGVybGVhdmVfbm9kZXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtcG9saWN5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtcG9saWN5LmM9MjE4Nz1zdGF0aWMgaW50IHBvbGljeV9yZXNvbHZlX3BhY2thZ2Vfbm9kZXMoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBub2RlbWFza190ICptYXNrKVxcbi0tXFxubW0vbWVtcG9saWN5LmMtMjIyMS1cXG5tbS9tZW1wb2xpY3kuYzoyMjIyOnN0YXRpYyB1bnNpZ25lZCBpbnQgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXFxubW0vbWVtcG9saWN5LmMtMjIyMy17XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0yMjcyPXVuc2lnbmVkIGludCBtZW1wb2xpY3lfc2xhYl9ub2RlKHZvaWQpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0yMjkxLVxcdGNhc2UgTVBPTF9XRUlHSFRFRF9JTlRFUkxFQVZFOlxcbm1tL21lbXBvbGljeS5jOjIyOTI6XFx0XFx0cmV0dXJuIHdlaWdodGVkX2ludGVybGVhdmVfbm9kZXMocG9saWN5KTtcXG5tbS9tZW1wb2xpY3kuYy0yMjkzLVxcbi0tXFxubW0vbWVtcG9saWN5LmM9MjQyMj1zdGF0aWMgbm9kZW1hc2tfdCAqcG9saWN5X25vZGVtYXNrKGdmcF90IGdmcCwgc3RydWN0IG1lbXBvbGljeSAqcG9sLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMjQ1Ny1cXHRcXHQqbmlkID0gKGlseCA9PSBOT19JTlRFUkxFQVZFX0lOREVYKSA/XFxubW0vbWVtcG9saWN5LmM6MjQ1ODpcXHRcXHRcXHR3ZWlnaHRlZF9pbnRlcmxlYXZlX25vZGVzKHBvbCkgOlxcbm1tL21lbXBvbGljeS5jLTI0NTktXFx0XFx0XFx0d2VpZ2h0ZWRfaW50ZXJsZWF2ZV9uaWQocG9sLCBpbHgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODoyOTo0NC40MzQ4Njc5MThaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzg2NzM0ODkzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3Mgc2VlLi4uXG5cbioqQW5hbHl6aW5nIGBtZW1wb2xpY3lfc2xhYl9ub2RlYCBhbmQgUG9saWN5IEludGVyYWN0aW9uKipcblxuUmlnaHQsIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBhbmQgaXQgbG9va3MgbGlrZSBgbWVtcG9saWN5X3NsYWJfbm9kZWAgYW5kIGBwb2xpY3lfbm9kZW1hc2tgIGFyZSB0aGUga2V5IHBsYXllcnMgY2FsbGluZyB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24uIEludGVyZXN0aW5nLiBOb3csIGhvbGQgb24gYSBzZWNvbmQuLi4gaXMgYG1lbXBvbGljeV9zbGFiX25vZGVgIGV4cG9ydGVkPyBJJ2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQuIFRoYXQncyBhIGNydWNpYWwgZGV0YWlsLiBJdHMgZXhwb3J0IHN0YXR1cyB3aWxsIHNpZ25pZmljYW50bHkgY2hhbmdlIGhvdyBJIG5lZWQgdG8gYXBwcm9hY2ggdGhpcyBhbmFseXNpcywgYW5kIHdoYXQgYXNzdW1wdGlvbnMgSSBjYW4gbWFrZSBhYm91dCBpdHMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIHRoZSBkZXBlbmRlbmNpZXMgaXQgbWF5IGhhdmUuIEdvdHRhIGdldCB0aGUgZnVsbCBwaWN0dXJlIGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4Mzc2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NDguMzAyMjE5OTUxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTU5ODA5NDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtcG9saWN5X3NsYWJfbm9kZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1wb2xpY3kuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1wb2xpY3kuYz0yMjUyPXN0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZXJsZWF2ZV9ub2RlcyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0yMjcxLSAqL1xcbm1tL21lbXBvbGljeS5jOjIyNzI6dW5zaWduZWQgaW50IG1lbXBvbGljeV9zbGFiX25vZGUodm9pZClcXG5tbS9tZW1wb2xpY3kuYy0yMjczLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NDguNDU4MjA4ODlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzcyOTEyODg0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3Mgc2VlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiAqKkNoZWNraW5nIGZvciBTeW1ib2wgRXhwb3J0KiouXG5cbkkgbmVlZCB0byBjb25maXJtIGlmIHRoZSBzeW1ib2wgYG1lbXBvbGljeV9zbGFiX25vZGVgIGlzIGFjdHVhbGx5IGV4cG9ydGVkLiBUaGlzIGlzIGEgY3J1Y2lhbCBzdGVwIGJlZm9yZSBJIGNvbnNpZGVyIHVzaW5nIGl0LiBJJ20gbGlrZWx5IHRyeWluZyB0byB1c2UgaXQgaW4gc29tZSBjb250ZXh0IHdoZXJlIEkgbmVlZCBpdCB0byBiZSBwdWJsaWNseSBhY2Nlc3NpYmxlLCBwZXJoYXBzIGluIGEgbW9kdWxlIEknbSBkZXZlbG9waW5nLCBvciBpbiBhIHBhdGNoLiBLbm93aW5nIGlmIGl0J3MgZXhwb3J0ZWQgaW5mb3JtcyBtZSBvbiB0aGUgaW50ZW5kZWQgcHVibGljIEFQSSBvZiB0aGUga2VybmVsLCBhbmQgaWYgaXQncyBzYWZlIHRvIHVzZSB0aGUgc3ltYm9sIG9yIG5vdC4gSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBzeW1ib2wgdGFibGUgZGlyZWN0bHksIG9yIHBlcmhhcHMgdXNlIGEgdG9vbCB0byB2ZXJpZnkgaXRzIGV4cG9ydCBzdGF0dXMuIFRoaXMgaXMgYSBmdW5kYW1lbnRhbCBwcmVsaW1pbmFyeSBzdGVwIEkgYWx3YXlzIHRha2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4Njc2LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6Mjk6NTIuMTg3MzQxNDQzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQ5Mzg5OTIsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKm1lbXBvbGljeV9zbGFiX25vZGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtcG9saWN5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjI5OjUyLjMxMjI4ODQxNVoiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDE4MDA0NjQxOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIEFQSSBFbnRyeXBvaW50cyBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyBzbGFiIGFsbG9jYXRpb24gaW50ZXJmYWNlcyB3aXRoIHRoZSBzeXN0ZW0sIGFuZCBJJ3ZlIGhpdCBhIHBvdGVudGlhbCBlbnRyeXBvaW50IHRoYXQgaXNuJ3QgZGlyZWN0bHkgZXhwb3J0ZWQuIFRoYXQncyBhIGZsYWcsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB3aWRlciBsYW5kc2NhcGUuIFRoZSBmb2N1cyBpcyBvbiBwYWNrYWdlIG5vZGUgbWFuaXB1bGF0aW9uLlxuXG5JJ3ZlIGFscmVhZHkgaWRlbnRpZmllZCBzZXZlcmFsIGV4cG9ydGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBkaXJlY3RseSByZWxldmFudDogYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgLCBgbXBfZ2V0X3BhY2thZ2Vfbm9kZXNgLCBhbmQgc28gb24sIGFsbCB0aGUgd2F5IHRvIGB1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgLiBUaGlzIGdpdmVzIG1lIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgbWFwcGluZyB0aGUgQVBJLlxuXG5UaGVuIHRoZXJlIGlzIHRoYXQgY2FsbGJhY2ssIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLiBJdCdzIGEgc3RhdGljIGNhbGxiYWNrLCBidXQgaXQncyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBpcyByZWdpc3RlcmVkIHZpYSBgcmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllcmAsIHNvIEkgbmVlZCB0byBmYWN0b3IgaXQgaW4uIEFyZSB0aGVyZSBhbnkgb3RoZXIgY2FsbGJhY2tzIHJlZ2lzdGVyZWQ/XG5cbkJleW9uZCB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLCBJIGFsc28gbmVlZCB0byBjb25zaWRlciByZWxhdGVkIHN5c3RlbS1sZXZlbCBpbnRlcmZhY2VzIGxpa2UgYHBhY2thZ2VfbW9kZV9zdG9yZWAsIGBwYWNrYWdlX25vZGVzX3Nob3dgLCBhbmQgc2ltaWxhciBzeXNmcyBlbnRyaWVzIHRoYXQgYXJlIGVzc2VudGlhbCBmb3IgY29uZmlndXJhdGlvbiBhbmQgbW9uaXRvcmluZy4gVGhlc2UgZnVuY3Rpb25zIGV4cG9zZSBhZGRpdGlvbmFsIGZhY2V0cyBvZiB0aGUgcGFja2FnZSBub2RlIG1hbmFnZW1lbnQuXG5cbkxldCdzIGNvbnNvbGlkYXRlIHRoZSBsaXN0IG9mIGV4cG9zZWQgZnVuY3Rpb25zIGZyb20gYG1tL21lbW9yeS10aWVycy5jYCBhbmQgYG1tL21lbXBvbGljeS5jYCBhZ2FpbiwganVzdCB0byBlbnN1cmUgSSBoYXZlIGEgY29tcGxldGUgcGljdHVyZS4gSXQncyB0aGUgc2FtZSBsaXN0IGFzIGJlZm9yZTogYG1wX2FkZF9wYWNrYWdlX25vZGVgLCB0byBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYC4gQSBjbGVhbiBzdW1tYXJ5IGlzIGFsd2F5cyBlc3NlbnRpYWwuXG5cbkxhc3RseSwgSSBuZWVkIHRvIGtlZXAgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiBtaW5kLiBJIGtub3cgdGhlc2UgYXJlIHJlbGV2YW50OiBgTlVNQWAsIGBOVU1BX01JR1JBVElPTmAsIGBDWExfQlVTYCwgYENYTF9SRUdJT05gLCBhbmQgYERFVl9EQVhfS01FTWAuIEknbSBnb2luZyB0byBkb3VibGUtY2hlY2sgdGhhdCBgREVWX0RBWF9LTUVNYCBpcyBpbmRlZWQgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbiBuYW1lIGZvciB0aGF0IHNldHRpbmcsIGp1c3QgdG8gYmUgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg4ODgsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MDIuNDkyMzM4NTkzWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjY3MjUxMTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIERFVl9EQVhfS01FTVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2RheC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvZGF4L0tjb25maWc9Njg9Y29uZmlnIERFVl9EQVhfRlNERVZcXG4tLVxcbmRyaXZlcnMvZGF4L0tjb25maWctNzItXFxuZHJpdmVycy9kYXgvS2NvbmZpZzo3Mzpjb25maWcgREVWX0RBWF9LTUVNXFxuZHJpdmVycy9kYXgvS2NvbmZpZy03NC1cXHR0cmlzdGF0ZSBcXFwiS01FTSBEQVg6IG1hcCBkYXgtZGV2aWNlcyBhcyBTeXN0ZW0tUkFNXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODozMDowMi42MTkwNjg2MDRaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODE2MjAzMTk0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgTlVNQSBCYWxhbmNpbmcgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gYXNzZXNzIHdoZXRoZXIgYE5VTUFfQkFMQU5DSU5HYCBpcyBlc3NlbnRpYWwgaGVyZS4gVGhlIHBhdGNoIGludHJvZHVjZXMgYG1wX25leHRfZGVtb3Rpb25fbm9kZWAgdW5kZXIgYENPTkZJR19OVU1BX01JR1JBVElPTmAsIHdoaWNoIGluZGljYXRlcyB0aGF0IGBOVU1BX01JR1JBVElPTmAgaXMgdGhlIGNyaXRpY2FsIGNvbmZpZ3VyYXRpb24gdG8gZm9jdXMgb24uXG5cbk5vdywgbGV0J3MgcmV2aWV3IHRoZSBjcnVjaWFsIHN5bWJvbHMuIEkndmUgZ290IHRoaXMgSlNPTiBsaXN0OlxuXG5gYGBqc29uXG5bXG4gIFwibXBfYWRkX3BhY2thZ2Vfbm9kZVwiLFxuICBcIm1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yXCIsXG4gIFwibXBfZ2V0X3BhY2thZ2Vfbm9kZXNcIixcbiAgXCJtcF9nZXRfcGFja2FnZV9jcHVfbm9kZXNcIixcbiAgXCJtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2Rlc1wiLFxuICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tcIixcbiAgXCJtcF9uZXh0X2RlbW90aW9uX25vZGVcIixcbiAgXCJtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFza1wiLFxuICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVcIixcbiAgXCJtcF9pc190b3BvbG9neV9zeW1tZXRyaWNcIixcbiAgXCJuZWFyZXN0X25vZGVzX25vZGVtYXNrXCIsXG4gIFwibXBfcHJvYmVfcGFja2FnZV9pZFwiLFxuICBcInJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIixcbiAgXCJ1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIlxuXVxuYGBgXG5cbkFoYSEgYG1wX2FkZF9wYWNrYWdlX25vZGVgIGlzIGNhbGxlZCBmcm9tIGBjeGxfcmVnaW9uX2FkZF9wYWNrYWdlX25vZGVgLCB3aGljaCBpcyBhIG5vdGlmaWVyIGNhbGxiYWNrLiBBbmQgSSBzZWUgdGhhdCBgbXBfcHJvYmVfcGFja2FnZV9pZGAgaXMgY2FsbGVkIGZyb20gYGRldl9kYXhfa21lbV9wcm9iZWAuIFNvLCBib3RoIG9mIHRoZXNlIGFyZSBkZWZpbml0ZWx5IHJlYWNoYWJsZS4gTWVtb3J5IHBvbGljeSBjaGFuZ2VzIGFyZSBhbHNvIHJlYWNoYWJsZSB2aWEgYHNldF9tZW1wb2xpY3lgIHN5c2NhbGwgYW5kIHN5c2ZzLiBOb3csIHRoZSBzeXNmcyBzdG9yZSBmdW5jdGlvbiBgcGFja2FnZV9tb2RlX3N0b3JlYCBzZWVtcyByZWxldmFudCB0b28uXG5cbldhaXQsIGBwYWNrYWdlX21vZGVfc3RvcmVgIGlzIHN0YXRpYywgYnV0IGl0J3MgYSBzeXNmcyBjYWxsYmFjaywgbWFraW5nIGl0IGFuIGVudHJ5IHBvaW50LiBTaG91bGQgSSBsaXN0IGl0LCBvciBqdXN0IHN0aWNrIHRvIGV4cG9ydGVkIGZ1bmN0aW9ucz8gQWN0dWFsbHksIGp1c3QgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyAqYW5kKiAgYHBhY2thZ2VfbW9kZV9zdG9yZWAgaXMgdGhlIGJlc3QgYXBwcm9hY2guXG5cbk9rYXksIGxldCdzIHJlZmluZSB0aGUgbGlzdCBvZiByZWxldmFudCBrZXJuZWwgY29uZmlndXJhdGlvbnMuIEknbSB0aGlua2luZzpcblxuKiAgIGBOVU1BYFxuKiAgIGBOVU1BX01JR1JBVElPTmBcbiogICBgQ1hMX0JVU2BcbiogICBgQ1hMX1JFR0lPTmBcbiogICBgREVWX0RBWF9LTUVNYFxuXG5Ob3csIEkgbmVlZCB0byBjaGVjayBpZiBgQ1hMX1JFR0lPTmAgaGFzIGFueSBkZXBlbmRlbmNpZXMgdGhhdCBjb3VsZCBpbXBhY3QgdGhpcyBhbmFseXNpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjk5OTIsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0ODIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MTAuNzgxMTAzMzMyWiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTI0NDYzMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQ1hMX1JFR0lPTlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2N4bC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvY3hsL0tjb25maWc9MTkzPWNvbmZpZyBDWExfU1VTUEVORFxcbi0tXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0xOTYtXFxuZHJpdmVycy9jeGwvS2NvbmZpZzoxOTc6Y29uZmlnIENYTF9SRUdJT05cXG5kcml2ZXJzL2N4bC9LY29uZmlnLTE5OC1cXHRib29sIFxcXCJDWEw6IFJlZ2lvbiBTdXBwb3J0XFxcIlxcbi0tXFxuZHJpdmVycy9jeGwvS2NvbmZpZy0yMTQtXFxuZHJpdmVycy9jeGwvS2NvbmZpZzoyMTU6Y29uZmlnIENYTF9SRUdJT05fSU5WQUxJREFUSU9OX1RFU1RcXG5kcml2ZXJzL2N4bC9LY29uZmlnLTIxNi1cXHRib29sIFxcXCJDWEw6IFJlZ2lvbiBDYWNoZSBNYW5hZ2VtZW50IEJ5cGFzcyAoVEVTVClcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjMwOjEwLjg4MDM1MzM0NVoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1ODE0MjIzMjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIGBkcml2ZXJzL2N4bC9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gdGhlIGBDWExfUkVHSU9OYCBjb25maWd1cmF0aW9uIG9wdGlvbi5cblxuKipEaXZpbmcgaW50byBDWEwgUmVnaW9uIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZHJpdmVycy9jeGwvS2NvbmZpZ2AuIFRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgY29uZmlndXJhdGlvbiBmb3IgQ1hMIGRldmljZXMgYW5kIHRoZWlyIG1lbW9yeSByZWdpb25zIGlzIGhhbmRsZWQsIG5hdHVyYWxseS4gTXkgYXR0ZW50aW9uIGlzIGRyYXduIHRvIGBDWExfUkVHSU9OYC4gSXQncyBhIGtleSBjb25maWd1cmF0aW9uIHN5bWJvbCwgZGVmaW5pdGVseSBhIHN0YXJ0aW5nIHBvaW50IHRvIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBrZXJuZWwgZGVhbHMgd2l0aCBDWEwncyBtZW1vcnkgYXJjaGl0ZWN0dXJlLiBJIGFzc3VtZSB0aGlzIHdpbGwgYWZmZWN0IGhvdyB0aGUgZHJpdmVyIGVuYWJsZXMsIGFuZCBjb25maWd1cmVzLCB0aGUgaGFyZHdhcmUgZnVuY3Rpb25hbGl0eS4gSSdsbCBuZWVkIHRvIHNlZSBob3cgdGhlIG90aGVyIG9wdGlvbnMgYXJvdW5kIGl0IHJlbGF0ZS4gQXJlIHRoZXJlIGRlcGVuZGVuY2llcz8gQW55IHJlbGF0ZWQgZGVmYXVsdHM/IEFyZSB0aGVyZSBhbnkgc3ViLW9wdGlvbnMgZm9yIHRoZSBjb25maWd1cmF0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgdHlwZSBvZiByZWdpb24/IE9yIHBlcmhhcHMgdGhlIHNpemU/XG5JJ2xsIGFsc28gaGF2ZSB0byBzZWUgaG93IHRoaXMgc3ltYm9sIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgcmVzdCBvZiB0aGUgQ1hMIGRyaXZlciBjb2RlLiBXaGVyZSBpcyBpdCBjaGVja2VkPyBXaGF0IGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGRlcGVuZCBvbiBpdD8gSSdtIGV4cGVjdGluZyB0aGlzIG9wdGlvbiB0byBlbmFibGUgc3VwcG9ydCBmb3IgYWxsb2NhdGluZyBhbmQgbWFuYWdpbmcgQ1hMIG1lbW9yeSByZWdpb25zLCB3aGljaCBpcyBmb3VuZGF0aW9uYWwgdG8gbWFraW5nIENYTCBkZXZpY2VzIGFjdHVhbGx5IHVzZWZ1bCBpbiB0aGUgc3lzdGVtLlxuRXNzZW50aWFsbHksIEknbSBleHBlY3RpbmcgYENYTF9SRUdJT05gIHRvIGJlIGEgZ2F0ZWtlZXBlciAtIGlmIGl0J3Mgbm90IGVuYWJsZWQsIGEgbG90IG9mIHRoZSBDWEwgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eSB3aWxsIGxpa2VseSBiZSBkaXNhYmxlZCBhcyB3ZWxsLiBUaW1lIHRvIHN0YXJ0IGRpZ2dpbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMxMTg1LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MTYuNjk0NTc5Mzk1WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MDIwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL2N4bC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE5MDpcXHRcXHRkZWZhdWx0IENYTF9CVVNcXG4gMTkxOlxcdFxcdHRyaXN0YXRlXFxuIDE5MjpcXHRcXG4gMTkzOlxcdGNvbmZpZyBDWExfU1VTUEVORFxcbiAxOTQ6XFx0XFx0ZGVmX2Jvb2wgeVxcbiAxOTU6XFx0XFx0ZGVwZW5kcyBvbiBTVVNQRU5EIFxcdTAwMjZcXHUwMDI2IENYTF9NRU1cXG4gMTk2OlxcdFxcbiAxOTc6XFx0Y29uZmlnIENYTF9SRUdJT05cXG4gMTk4OlxcdFxcdGJvb2wgXFxcIkNYTDogUmVnaW9uIFN1cHBvcnRcXFwiXFxuIDE5OTpcXHRcXHRkZWZhdWx0IENYTF9CVVNcXG4gMjAwOlxcdFxcdCMgRm9yIE1BWF9QSFlTTUVNX0JJVFNcXG4gMjAxOlxcdFxcdGRlcGVuZHMgb24gU1BBUlNFTUVNXFxuIDIwMjpcXHRcXHRzZWxlY3QgTUVNUkVHSU9OXFxuIDIwMzpcXHRcXHRzZWxlY3QgR0VUX0ZSRUVfUkVHSU9OXFxuIDIwNDpcXHRcXHRoZWxwXFxuIDIwNTpcXHRcXHQgIEVuYWJsZSB0aGUgQ1hMIGNvcmUgdG8gZW51bWVyYXRlIGFuZCBwcm92aXNpb24gQ1hMIHJlZ2lvbnMuIEEgQ1hMXFxuIDIwNjpcXHRcXHQgIHJlZ2lvbiBpcyBkZWZpbmVkIGJ5IG9uZSBvciBtb3JlIENYTCBleHBhbmRlcnMgdGhhdCBkZWNvZGUgYSBnaXZlblxcbiAyMDc6XFx0XFx0ICBzeXN0ZW0tcGh5c2ljYWwgYWRkcmVzcyByYW5nZS4gRm9yIENYTCByZWdpb25zIGVzdGFibGlzaGVkIGJ5XFxuIDIwODpcXHRcXHQgIHBsYXRmb3JtLWZpcm13YXJlIHRoaXMgb3B0aW9uIGVuYWJsZXMgbWVtb3J5IGVycm9yIGhhbmRsaW5nIHRvXFxuIDIwOTpcXHRcXHQgIGlkZW50aWZ5IHRoZSBkZXZpY2VzIHBhcnRpY2lwYXRpbmcgaW4gYSBnaXZlbiBpbnRlcmxlYXZlZCBtZW1vcnlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MTYuNjk0NzUzODA0WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzMjM0ODM2NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSBkZXBlbmRlbmNpZXMsIGV4cGxhaW5lZCBhcyBpZiB0aGV5IGFyZSBteSBvd24gdGhvdWdodHM6XG5cbioqRGlzc2VjdGluZyB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGcm9tIGEga2VybmVsIGNvbmZpZ3VyYXRpb24gcGVyc3BlY3RpdmUsIGl0J3MgY2xlYXIgdGhhdCB0aGUgbW9kdWxlIG9yIGZlYXR1cmUgZmxhZ2dlZCBhcyBgQ1hMX1JFR0lPTmAgaXMgZnVuZGFtZW50YWxseSByZWxpYW50IG9uIHRoZSBmb3VuZGF0aW9uIHByb3ZpZGVkIGJ5IGBTUEFSU0VNRU1gLiBZb3UgY2FuJ3QgaGF2ZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuIEl0J3MgbGlrZSBidWlsZGluZyBhIGNvbXBsZXggc3RydWN0dXJlIOKAkyB5b3UgbmVlZCBhIHNvbGlkIGJhc2UgYmVmb3JlIHlvdSBjYW4gc3RhcnQgbGF5ZXJpbmcgb24gdGhlIG1vcmUgc3BlY2lhbGl6ZWQgY29tcG9uZW50cy4gU3BhcnNlbWVtIHByb3ZpZGVzIHRoYXQgYmFzZSBhbmQgaXMgaW50ZWdyYWwuXG5cblNpbWlsYXJseSwgSSdtIG5vdGluZyB0aGF0IHRoZSBgREVWX0RBWF9LTUVNYCBvcHRpb24gaGFzIGEgZGlyZWN0IGRlcGVuZGVuY3kgb24gYERFVl9EQVhgLiBUaGlzIG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGBERVZfREFYX0tNRU1gIGlzIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb3IgZmVhdHVyZSB0aGF0IGxldmVyYWdlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGBERVZfREFYYC4gVGhpbmsgb2YgYERFVl9EQVhgIGFzIHRoZSBnZW5lcmFsIGZyYW1ld29yaywgYW5kIGBERVZfREFYX0tNRU1gIGFzIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvciBleHRlbnNpb24gd2l0aGluIHRoYXQgZnJhbWV3b3JrLiBZb3Ugd291bGRuJ3QgYXR0ZW1wdCB0byB1c2UgdGhlIGV4dGVuc2lvbiB3aXRob3V0IHRoZSBiYXNlIGZyYW1ld29yayBleGlzdGluZy4gVGhpcyBtb2R1bGFyIGFwcHJvYWNoIGlzIGNvbW1vbiBmb3Iga2VlcGluZyBhIGxlYW4gYW5kIGV4dGVuc2libGUga2VybmVsLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMTgyMywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MjEuMDE4MjQwMjk3WiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTI0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL2RheC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDY1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDY1OlxcdFxcdGRlcGVuZHMgb24gREVWX0RBWF9ITUVNIFxcdTAwMjZcXHUwMDI2IERBWFxcbiAgNjY6XFx0XFx0ZGVmX2Jvb2wgeVxcbiAgNjc6XFx0XFxuICA2ODpcXHRjb25maWcgREVWX0RBWF9GU0RFVlxcbiAgNjk6XFx0XFx0dHJpc3RhdGVcXG4gIDcwOlxcdFxcdGRlcGVuZHMgb24gREVWX0RBWCBcXHUwMDI2XFx1MDAyNiBGU19EQVhcXG4gIDcxOlxcdFxcdGRlZmF1bHQgREVWX0RBWFxcbiAgNzI6XFx0XFxuICA3MzpcXHRjb25maWcgREVWX0RBWF9LTUVNXFxuICA3NDpcXHRcXHR0cmlzdGF0ZSBcXFwiS01FTSBEQVg6IG1hcCBkYXgtZGV2aWNlcyBhcyBTeXN0ZW0tUkFNXFxcIlxcbiAgNzU6XFx0XFx0ZGVmYXVsdCBERVZfREFYXFxuICA3NjpcXHRcXHRkZXBlbmRzIG9uIERFVl9EQVhcXG4gIDc3OlxcdFxcdGRlcGVuZHMgb24gTUVNT1JZX0hPVFBMVUcgIyBmb3IgYWRkX21lbW9yeSgpIGFuZCBmcmllbmRzXFxuICA3ODpcXHRcXHRoZWxwXFxuICA3OTpcXHRcXHQgIFN1cHBvcnQgYWNjZXNzIHRvIHBlcnNpc3RlbnQsIG9yIG90aGVyIHBlcmZvcm1hbmNlXFxuICA4MDpcXHRcXHQgIGRpZmZlcmVudGlhdGVkIG1lbW9yeSBhcyBpZiBpdCB3ZXJlIFN5c3RlbSBSQU0uIFRoaXMgYWxsb3dzXFxuICA4MTpcXHRcXHQgIGVhc2llciB1c2Ugb2YgcGVyc2lzdGVudCBtZW1vcnkgYnkgdW5tb2RpZmllZCBhcHBsaWNhdGlvbnMsIG9yXFxuICA4MjpcXHRcXHQgIGFkZHMgY29yZSBrZXJuZWwgbWVtb3J5IHNlcnZpY2VzIHRvIGhldGVyb2dlbmVvdXMgbWVtb3J5IHR5cGVzXFxuICA4MzpcXHRcXHQgIChITUVNKSBtYXJrZWQgXFxcInJlc2VydmVkXFxcIiBieSBwbGF0Zm9ybSBmaXJtd2FyZS5cXG4gIDg0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODozMDoyMS4wMTgzOTQ0MzdaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTg4Mjc4MDgyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLZXJuZWwgQ29uZmlndXJhdGlvbjogTmVjZXNzYXJ5IEZlYXR1cmVzKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCBiYXNlZCBvbiB0aGlzLCBJIGFic29sdXRlbHkgbmVlZCBgREVWX0RBWGAgYW5kIGBNRU1PUllfSE9UUExVR2AgZW5hYmxlZC4gTm8gcXVlc3Rpb24gYWJvdXQgaXQuIExldCBtZSBqdXN0IGFkZCBgREVWX0RBWGAgdG8gdGhlIGNoZWNrbGlzdCBJJ20gbWVudGFsbHkgYXNzZW1ibGluZy5cblxuUmlnaHQsIHNvIHRvIG1ha2Ugc3VyZSBJJ20gY2xlYXIgaW4gbXkgaGVhZCwgdGhlIGVzc2VudGlhbCBrZXJuZWwgY29uZmlndXJhdGlvbnMgaW52b2x2ZWQgaGVyZSBhcmU6XG5cbiogICBgTlVNQWBcbiogICBgTlVNQV9NSUdSQVRJT05gXG4qICAgYENYTF9CVVNgXG4qICAgYENYTF9SRUdJT05gXG4qICAgYERFVl9EQVhgIChkZWZpbml0ZWx5IG5lZWRlZClcbiogICBgREVWX0RBWF9LTUVNYFxuKiAgIGBNRU1PUllfSE9UUExVR2AgKFRoYXQncyBhbm90aGVyIGNydWNpYWwgb25lIHRvIGNvbmZpcm0uKVxuXG5Ob3csIEkgc2hvdWxkIHRha2UgYSBsb29rIGF0IHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gSSdtIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGUgaW1wbGljYXRpb25zIG9mIGBNRU1PUllfSE9UUExVR2AgaW4gcmVsYXRpb24gdG8gdGhpcyB3aG9sZSBzZXR1cC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBhbmQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIG90aGVyIG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMyNDIzLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDZUMDg6MzA6MjYuOTAxMTc5ODMxWiIsIlNlcSI6MzgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDA4MTc5NTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTU9SWV9IT1RQTFVHXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz00NjY9Y29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHXFxuLS1cXG5tbS9LY29uZmlnLTQ2OS0jIGV2ZW50dWFsbHksIHdlIGNhbiBoYXZlIHRoaXMgb3B0aW9uIGp1c3QgJ3NlbGVjdCBTUEFSU0VNRU0nXFxubW0vS2NvbmZpZzo0NzA6bWVudWNvbmZpZyBNRU1PUllfSE9UUExVR1xcbm1tL0tjb25maWctNDcxLVxcdGJvb2wgXFxcIk1lbW9yeSBob3RwbHVnXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNlQwODozMDoyNy4wNDIwMDMzMjJaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODc4MTA2NTUxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBNZW1vcnkgUGFja2FnZSBGdW5jdGlvbmFsaXR5KipcblxuT2theSwgc28gYE1FTU9SWV9IT1RQTFVHYCBpcyBjb25maXJtZWQsIHRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0J3MgYnJlYWsgZG93biB0aGVzZSBjb3JlIHN5bWJvbHMuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCdzIGJlaW5nIGV4cG9zZWQsIGJlY2F1c2UgdGhhdCdzIHdoZXJlIHRoZSBpbnRlcmVzdGluZyBhdHRhY2sgc3VyZmFjZSBsaWtlbHkgbGllcy5cblxuSSBzZWUgYSBjb25jZW50cmF0ZWQgc2V0IG9mIHN5bWJvbHMgaGVyZSB0aGF0IGNvbnN0aXR1dGUgdGhlIG5ldyBtZW1vcnkgcGFja2FnZSBmdW5jdGlvbmFsaXR5OlxuXG4qICAgYG1wX2FkZF9wYWNrYWdlX25vZGVgLCBgbXBfYWRkX3BhY2thZ2Vfbm9kZV9ieV9pbml0aWF0b3JgOiBDbGVhcmx5LCB0aGVzZSBhcmUgZm9yIGFkZGluZyBub2RlcyB0byB0aGUgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3ksIHBvdGVudGlhbGx5IGR5bmFtaWNhbGx5LCBiYXNlZCBvbiBhbiBpbml0aWF0b3IuXG4qICAgYG1wX2dldF9wYWNrYWdlX25vZGVzYCwgYG1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlc2AsIGBtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2Rlc2A6IFRoZXNlIGFyZSB0aGUgYWNjZXNzIG1ldGhvZHMgdG8gZ2V0IHRoZSBsaXN0IG9mIHRoZSBwYWNrYWdlJ3Mgbm9kZXMsIGRpZmZlcmVudGlhdGVkIGJ5IHR5cGUuXG4qICAgYG1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tgLCBgbXBfbmV4dF9kZW1vdGlvbl9ub2RlYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVtYXNrYCwgYG1wX25leHRfcHJvbW90aW9uX25vZGVgOiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcgZnJvbSBhIHRpZXJpbmcgcGVyc3BlY3RpdmUsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBtYXNrcy5cbiogICBgbXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljYDogQ2hlY2tpbmcgZm9yIHRvcG9sb2dpY2FsIHN5bW1ldHJ5IGlzIGNydWNpYWwuIFRoaXMgY291bGQgYmUgYSB2ZWN0b3IuXG4qICAgYG5lYXJlc3Rfbm9kZXNfbm9kZW1hc2tgOiBEZXRlcm1pbmluZyBwcm94aW1pdHkgaXMgY3JpdGljYWwgZm9yIE5VTUEuXG4qICAgYG1wX3Byb2JlX3BhY2thZ2VfaWRgOiBBIHByb2JpbmcgZnVuY3Rpb24gYWRkcyBhbiBlbGVtZW50IG9mIHJpc2suXG4qICAgYHJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJgLCBgdW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyYDogVGhlIHVzZSBvZiBub3RpZmllcnMgY2FuIGNyZWF0ZSB2dWxuZXJhYmlsaXRpZXMgaW4gY29uY3VycmVudCBhY2Nlc3MuXG5cblRoZXNlIGFyZSBhbGwgZXhwb3J0ZWQsIG1lYW5pbmcgdGhleSdyZSB0aGUgcHVibGljIGludGVyZmFjZS4gVGhpcyB0ZWxscyBtZSB3ZSdyZSBsb29raW5nIGF0IHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgdGhpcyBuZXcgbWVtb3J5IHBhY2thZ2UgZnVuY3Rpb25hbGl0eSwgd2hpY2gsIGZyb20gd2hhdCBJJ20gcmVhZGluZywgaXMgYWx0ZXJpbmcgY29yZSBtZW1vcnkgdGllcmluZywgbWVtcG9saWN5LCBhbmQgaG93IENYTCByZWdpb25zIGFyZSBoYW5kbGVkLiBQbHVzLCB0aGVyZSBhcmUgbmV3IHN5c2ZzIGludGVyZmFjZXMgYW5kIGEgbmV3IHdlaWdodGVkIGludGVybGVhdmUgbWVtcG9saWN5IG1vZGUuIEFsbCBvZiB0aGlzIHVzZXItc3BhY2UgYWNjZXNzaWJsZSBzdHVmZj8gVGhpcyBzY3JlYW1zIGZvciBmdXp6aW5nLiBXZSd2ZSBnb3QgaW50ZXJmYWNlcyBmb3IgYWRkaW5nLCBxdWVyeWluZywgYW5kIG1hbmlwdWxhdGluZyB0aGUgbWVtb3J5IHBhY2thZ2UgdG9wb2xvZ3kuIEknbSBnb2luZyB0byBoYXZlIHRvIHRlc3QgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIHJhY2UgY29uZGl0aW9ucywgYW5kIGVycm9yIGhhbmRsaW5nIG9mIHRoZXNlIGZ1bmN0aW9ucyB2ZXJ5IGNhcmVmdWxseSwgZXNwZWNpYWxseSB3aGVuIGNvbWJpbmVkIHdpdGggdGhlc2UgbmV3IHN5c2ZzIGVudHJpZXMgYW5kIHRoZSBuZXcgbWVtcG9saWN5LlxuXG5UaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzI4ODMsIk91dHB1dFRva2VucyI6Mjk3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA2VDA4OjMwOjM1LjgyMzA3MzExNloiLCJTZXEiOjQwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjU1MTA2NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTlVNQVwiLFxuICAgIFwiTlVNQV9NSUdSQVRJT05cIixcbiAgICBcIkNYTF9CVVNcIixcbiAgICBcIkNYTF9SRUdJT05cIixcbiAgICBcIkRFVl9EQVhcIixcbiAgICBcIkRFVl9EQVhfS01FTVwiLFxuICAgIFwiTUVNT1JZX0hPVFBMVUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlXCIsXG4gICAgXCJtcF9hZGRfcGFja2FnZV9ub2RlX2J5X2luaXRpYXRvclwiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2Vfbm9kZXNcIixcbiAgICBcIm1wX2dldF9wYWNrYWdlX2NwdV9ub2Rlc1wiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2VfbWVtb3J5X29ubHlfbm9kZXNcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfZGVtb3Rpb25fbm9kZVwiLFxuICAgIFwibXBfbmV4dF9wcm9tb3Rpb25fbm9kZW1hc2tcIixcbiAgICBcIm1wX25leHRfcHJvbW90aW9uX25vZGVcIixcbiAgICBcIm1wX2lzX3RvcG9sb2d5X3N5bW1ldHJpY1wiLFxuICAgIFwibmVhcmVzdF9ub2Rlc19ub2RlbWFza1wiLFxuICAgIFwibXBfcHJvYmVfcGFja2FnZV9pZFwiLFxuICAgIFwicmVnaXN0ZXJfbXBfcGFja2FnZV9ub3RpZmllclwiLFxuICAgIFwidW5yZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBtZW1vcnkgcGFja2FnZSB0b3BvbG9neSBjb25jZXB0IGZvciBOVU1BIG5vZGVzLCBtb2RpZnlpbmcgY29yZSBtZW1vcnkgdGllcmluZywgbWVtcG9saWN5LCBhbmQgQ1hMIHJlZ2lvbiBoYW5kbGluZy4gSXQgYWRkcyBuZXcgc3lzZnMgaW50ZXJmYWNlcyBhbmQgYSBuZXcgbWVtcG9saWN5IHdlaWdodGVkIGludGVybGVhdmUgbW9kZSwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOVU1BXCIsXG4gICAgXCJOVU1BX01JR1JBVElPTlwiLFxuICAgIFwiQ1hMX0JVU1wiLFxuICAgIFwiQ1hMX1JFR0lPTlwiLFxuICAgIFwiREVWX0RBWFwiLFxuICAgIFwiREVWX0RBWF9LTUVNXCIsXG4gICAgXCJNRU1PUllfSE9UUExVR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1wX2FkZF9wYWNrYWdlX25vZGVcIixcbiAgICBcIm1wX2FkZF9wYWNrYWdlX25vZGVfYnlfaW5pdGlhdG9yXCIsXG4gICAgXCJtcF9nZXRfcGFja2FnZV9ub2Rlc1wiLFxuICAgIFwibXBfZ2V0X3BhY2thZ2VfY3B1X25vZGVzXCIsXG4gICAgXCJtcF9nZXRfcGFja2FnZV9tZW1vcnlfb25seV9ub2Rlc1wiLFxuICAgIFwibXBfbmV4dF9kZW1vdGlvbl9ub2RlbWFza1wiLFxuICAgIFwibXBfbmV4dF9kZW1vdGlvbl9ub2RlXCIsXG4gICAgXCJtcF9uZXh0X3Byb21vdGlvbl9ub2RlbWFza1wiLFxuICAgIFwibXBfbmV4dF9wcm9tb3Rpb25fbm9kZVwiLFxuICAgIFwibXBfaXNfdG9wb2xvZ3lfc3ltbWV0cmljXCIsXG4gICAgXCJuZWFyZXN0X25vZGVzX25vZGVtYXNrXCIsXG4gICAgXCJtcF9wcm9iZV9wYWNrYWdlX2lkXCIsXG4gICAgXCJyZWdpc3Rlcl9tcF9wYWNrYWdlX25vdGlmaWVyXCIsXG4gICAgXCJ1bnJlZ2lzdGVyX21wX3BhY2thZ2Vfbm90aWZpZXJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IG1lbW9yeSBwYWNrYWdlIHRvcG9sb2d5IGNvbmNlcHQgZm9yIE5VTUEgbm9kZXMsIG1vZGlmeWluZyBjb3JlIG1lbW9yeSB0aWVyaW5nLCBtZW1wb2xpY3ksIGFuZCBDWEwgcmVnaW9uIGhhbmRsaW5nLiBJdCBhZGRzIG5ldyBzeXNmcyBpbnRlcmZhY2VzIGFuZCBhIG5ldyBtZW1wb2xpY3kgd2VpZ2h0ZWQgaW50ZXJsZWF2ZSBtb2RlLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[1] Phase: Succeeded StartedAt: 2026-08-06 08:30:49 +0000 UTC FinishedAt: 2026-08-06 08:30:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-06 08:30:50 +0000 UTC FinishedAt: 2026-08-06 08:30:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2] Phase: Succeeded StartedAt: 2026-08-06 08:30:50 +0000 UTC FinishedAt: 2026-08-06 12:16:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-06 08:30:50 +0000 UTC FinishedAt: 2026-08-06 12:16:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-06 08:30:50 +0000 UTC FinishedAt: 2026-08-06 08:31:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-06 08:30:50 +0000 UTC FinishedAt: 2026-08-06 08:30:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowznqlz/series-workflowznqlz-convert-artifact-1444945586/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-06 08:31:16 +0000 UTC FinishedAt: 2026-08-06 08:50:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-06 08:31:16 +0000 UTC FinishedAt: 2026-08-06 08:50:35 +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:*ca1ddeff-89b9-4ec4-95dd-c10834c3973c,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-workflowznqlz/series-workflowznqlz-convert-artifact-1444945586/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": "f31f6d2f-7f69-433f-b313-ac371d9b281f", "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-workflowznqlz/series-workflowznqlz-build-action-3919343664/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-06 08:31:16 +0000 UTC FinishedAt: 2026-08-06 08:50:25 +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:*ca1ddeff-89b9-4ec4-95dd-c10834c3973c,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-workflowznqlz/series-workflowznqlz-convert-artifact-1444945586/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": "f31f6d2f-7f69-433f-b313-ac371d9b281f", "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-workflowznqlz/series-workflowznqlz-build-action-3919343664/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-06 08:50:35 +0000 UTC FinishedAt: 2026-08-06 08:50:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-06 08:50:35 +0000 UTC FinishedAt: 2026-08-06 08:50:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-06 08:50:35 +0000 UTC FinishedAt: 2026-08-06 08:50:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-06 08:50:35 +0000 UTC FinishedAt: 2026-08-06 08:50:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowznqlz/series-workflowznqlz-convert-artifact-776580557/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-06 08:50:56 +0000 UTC FinishedAt: 2026-08-06 08:53:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-06 08:50:56 +0000 UTC FinishedAt: 2026-08-06 08:53:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*f31f6d2f-7f69-433f-b313-ac371d9b281f,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-workflowznqlz/series-workflowznqlz-build-action-3919343664/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-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-06 08:53:24 +0000 UTC FinishedAt: 2026-08-06 08:53:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-06 08:53:24 +0000 UTC FinishedAt: 2026-08-06 08:53:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-06 08:53:24 +0000 UTC FinishedAt: 2026-08-06 09:11:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-06 08:53:24 +0000 UTC FinishedAt: 2026-08-06 09:11:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*ca1ddeff-89b9-4ec4-95dd-c10834c3973c,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-workflowznqlz/series-workflowznqlz-convert-artifact-776580557/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": "124e905a-ed86-463f-82c0-64653bf7524a", "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-workflowznqlz/series-workflowznqlz-build-action-929094569/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-06 08:53:24 +0000 UTC FinishedAt: 2026-08-06 09:11: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:*ca1ddeff-89b9-4ec4-95dd-c10834c3973c,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-workflowznqlz/series-workflowznqlz-convert-artifact-776580557/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": "124e905a-ed86-463f-82c0-64653bf7524a", "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-workflowznqlz/series-workflowznqlz-build-action-929094569/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-06 09:11:14 +0000 UTC FinishedAt: 2026-08-06 09:11:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-06 09:11:14 +0000 UTC FinishedAt: 2026-08-06 09:11:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-06 09:11:14 +0000 UTC FinishedAt: 2026-08-06 09:13:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-06 09:11:14 +0000 UTC FinishedAt: 2026-08-06 09:13:06 +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:*124e905a-ed86-463f-82c0-64653bf7524a,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-workflowznqlz/series-workflowznqlz-build-action-929094569/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-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-06 09:13:20 +0000 UTC FinishedAt: 2026-08-06 12:16:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-06 09:13:20 +0000 UTC FinishedAt: 2026-08-06 12:16:16 +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-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*f31f6d2f-7f69-433f-b313-ac371d9b281f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*124e905a-ed86-463f-82c0-64653bf7524a,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-workflowznqlz/series-workflowznqlz-build-action-3919343664/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-workflowznqlz/series-workflowznqlz-build-action-929094569/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-06 09:13:20 +0000 UTC FinishedAt: 2026-08-06 09:13:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-06 09:13:20 +0000 UTC FinishedAt: 2026-08-06 09:13:25 +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-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowznqlz/series-workflowznqlz-convert-artifact-1823419058/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-06 09:13:20 +0000 UTC FinishedAt: 2026-08-06 09:13:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-06 09:13:20 +0000 UTC FinishedAt: 2026-08-06 09:13:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-06 09:13:21 +0000 UTC FinishedAt: 2026-08-06 09:13:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-06 09:13:32 +0000 UTC FinishedAt: 2026-08-06 12:16:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowznqlz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["mp_add_package_node","mp_add_package_node_by_initiator","mp_get_package_nodes","mp_get_package_cpu_nodes","mp_get_package_memory_only_nodes","mp_next_demotion_nodemask","mp_next_demotion_node","mp_next_promotion_nodemask","mp_next_promotion_node","mp_is_topology_symmetric","nearest_nodes_nodemask","mp_probe_package_id","register_mp_package_notifier","unregister_mp_package_notifier"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8cd9520d35a6c38db6567e97dd93b1f11f185dc6","config_name":"upstream-apparmor-kasan.config","enable_configs":["NUMA","NUMA_MIGRATION","CXL_BUS","CXL_REGION","DEV_DAX","DEV_DAX_KMEM","MEMORY_HOTPLUG"],"series_id":"9d000881-72ed-42e7-9fb5-8f981b017848","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-06 09:13:32 +0000 UTC FinishedAt: 2026-08-06 12:16:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*f31f6d2f-7f69-433f-b313-ac371d9b281f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*124e905a-ed86-463f-82c0-64653bf7524a,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-workflowznqlz/series-workflowznqlz-build-action-3919343664/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-workflowznqlz/series-workflowznqlz-build-action-929094569/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-workflowznqlz/series-workflowznqlz-convert-artifact-1823419058/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,}