Name: series-workflowzhzk8 Phase: Succeeded StartedAt: 2026-09-14 16:26:49 +0000 UTC FinishedAt: 2026-09-14 20:50:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[0] Phase: Succeeded StartedAt: 2026-09-14 16:26:49 +0000 UTC FinishedAt: 2026-09-14 17:00:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[0].run-triage Phase: Succeeded StartedAt: 2026-09-14 16:26:49 +0000 UTC FinishedAt: 2026-09-14 17:00:46 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "a41c69c6ea14596cfd95978483166d4eff52435e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "a41c69c6ea14596cfd95978483166d4eff52435e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "4bc44d71-b488-4779-9276-5bae55679d77" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "btf_check_ownership_depth", "btf_ownership_depth", "btf_owned_type_idx", "btf_check_and_fixup_fields", "bpf_btf_load" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "a41c69c6ea14596cfd95978483166d4eff52435e", "base_tree": "bpf-next" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MzJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2J0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZWRfdHlwZV9pZHgmIzM0OywKICAgICYjMzQ7YnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMmIzM0OywKICAgICYjMzQ7YnBmX2J0Zl9sb2FkJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBkZXB0aCBhbmQgZGV0ZWN0IGN5Y2xlcyBhY3Jvc3MgZ3JhcGggcm9vdHMgKGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290KSBhbmQgbG9jYWwga3B0cnMgKEJQRl9LUFRSX1JFRiwgQlBGX0tQVFJfUEVSQ1BVKSwgcHJldmVudGluZyBkZWVwIGtlcm5lbCByZWN1cnNpb24gZHVyaW5nIG9iamVjdCBjbGVhbnVwLlxuXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXG4yLiBMb2NhbCB2YXJpYWJsZXMgYW5kIGZpZWxkczogQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0IGZpZWxkcyBpbnNwZWN0ZWQgb3IgcG9wdWxhdGVkIChgcmV0YCwgYG1heF9kZXB0aGAsIGBidGZfaWRgLCBgZGVwdGhbaWR4XWApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBVc2VyLXNwYWNlIGNvcGllczogTm8gZGF0YSBvciBzdHJ1Y3R1cmUgaXMgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZTsgdGhlIHZhbGlkYXRpb24gcmV0dXJucyBzdGFuZGFyZCBlcnJvciBjb2Rlcy5cbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBleHRlbmRzIEJURiBvd25lcnNoaXAgYW5kIGN5Y2xlIHZhbGlkYXRpb24gYnkgaW50cm9kdWNpbmcgZGVwdGgtYm91bmRlZCBncmFwaCB0cmF2ZXJzYWwgKGJ0Zl9vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgpIHRvIHZhbGlkYXRlIG93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGluIHVzZXItbG9hZGVkIEJURiB0eXBlcyAoc3VjaCBhcyBncmFwaCByb290cyBhbmQga3B0cnMpLiBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBpcyBkaXJlY3RseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBicGYoKSBzeXNjYWxsIChCUEZfQlRGX0xPQUQpLiBGdXp6aW5nIGNhbiB2ZXJpZnkgcmVjdXJzaW9uIGJvdW5kcywgY3ljbGUgZGV0ZWN0aW9uIGNvcnJlY3RuZXNzLCBhbmQgZWRnZSBjYXNlcyBpbiBwYXJzaW5nIGFyYml0cmFyeSB1c2VyLXN1cHBsaWVkIEJURiBkYXRhLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZjU4NDUyNWY5OTYwMGY2ZjdhZDdiZGI4OWJlYWVjYzVmYjQ4ZGY4MVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDE2OjI4OjMyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTQyODQsMTMgJiM0Mzs0Mjg0LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4ge1xuIFx0aW50IGk7XG4gXG4tXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XG4tXHQgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LlxuLVx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJiMzOTt0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG4mIzQzO1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuJiM0MztcdCAqIGJlZW4gZml4ZWQgdXAuXG4gXHQgKi9cbiBcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXG4gXHRcdHJldHVybiAwO1xuQEAgLTQzMjEsNTEgJiM0Mzs0MzE4LDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGlmICghbWV0YSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxuLVx0XHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbiYjNDM7XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuJiM0MztcdHUzMiBidGZfaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuJiM0MztcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG4mIzQzO1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuJiM0MztcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG4mIzQzO1x0aWYgKCFtZXRhKVxuJiM0MztcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG4mIzQzO1x0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuJiM0MzsgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuJiM0MzsgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuJiM0MzsgKiBub24tcmVjdXJzaW5nIGRyb3AuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4mIzQzO1x0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4mIzQzO1x0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFkZXB0aF9sZWZ0KVxuJiM0MztcdFx0cmV0dXJuIC1FTE9PUDtcbiYjNDM7XHRpZiAoZGVwdGhbaWR4XSlcbiYjNDM7XHRcdGdvdG8gZG9uZTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG4mIzQzO1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4mIzQzO1x0fVxuJiM0MztcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbiYjNDM7ZG9uZTpcbiYjNDM7XHRyZXR1cm4gZGVwdGhbaWR4XSBcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XG4mIzQzO31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxuLVx0XHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0c1xuLVx0XHQgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eTpcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcFxuLVx0XHQgKiBjaGFpbiBjYW4gYmU6XG4tXHRcdCAqXHRBIC1cdTAwM2UgQiAtXHUwMDNlIENcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC5cbi1cdFx0ICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmRcbi1cdFx0ICogICBicGZfbGlzdF9oZWFkLlxuLVx0XHQgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlXG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHlcbi1cdFx0ICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd25cbi1cdFx0ICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy5cbi1cdFx0ICpcdEEgLVx1MDAzZSBCXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxuLVx0XHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKG1ldGEtXHUwMDNlcmVjb3JkLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxuLVx0XHRcdHJldHVybiAtRUxPT1A7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuJiM0Mzt7XG4mIzQzO1x0dTggKmRlcHRoO1xuJiM0MztcdGludCBpLCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbiYjNDM7XHRpZiAoIWRlcHRoKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbiYjNDM7XHRcdFx0XHRcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRyZXQgPSAwO1xuIFx0fVxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0a3ZmcmVlKGRlcHRoKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbkBAIC02MDYwLDYgJiM0Mzs2MDk0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG4mIzQzO1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyAmIzQzOzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgJiM0Mzs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYTQ4N2FhNjhmMmVlZlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCAmIzQzOzEsMjk2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU1BJTl9MT0NLIDJcbiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgM1xuJiM0MzsjZGVmaW5lIExJU1RfTk9ERSA0XG4mIzQzOy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOFxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkO1xuJiM0MztcbiYjNDM7XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2J0Zl9fbmV3X2VtcHR5XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdGlkID0gYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7aW50XCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEsIFwmIzM0O2J0Zl9fYWRkX2ludFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfc3Bpbl9sb2NrXCYjMzQ7LCA0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfbGlzdF9oZWFkXCYjMzQ7LCAxNik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7YnBmX2xpc3Rfbm9kZVwmIzM0OywgMjQpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyX291dDtcbiYjNDM7XHRyZXR1cm4gYnRmO1xuJiM0MztcbiYjNDM7ZXJyX291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaWQ7XG4mIzQzO1xuJiM0MztcdGlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF90eXBlX3RhZ1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gaWQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4mIzQzO1x0QVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF9wdHJcJiMzNDspO1xuJiM0MztcdHJldHVybiBpZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XG4mIzQzO1x0aWYgKGlkIFx1MDAzYz0gMClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7c2VsZl9jeWNsZVwmIzM0OywgOCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bmV4dFwmIzM0OywgNiwgMCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksIFwmIzM0O2twdHJcJiMzNDspO1xuJiM0MztcdGlmIChpZCBcdTAwM2M9IDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2FcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwmIzM0O2JcJiMzNDssIDYsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2JcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDthXCYjMzQ7LCA4LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkLCBlcnI7XG4mIzQzO1xuJiM0MztcdGJ0ZiA9IGluaXRfYnRmKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7aW5pdF9idGZcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9vd25lclwmIzM0OywgMjApO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtyb290XCYjMzQ7LCBMSVNUX0hFQUQsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtsb2NrXCYjMzQ7LCBTUElOX0xPQ0ssIDEyOCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXCYjMzQ7Y29udGFpbnM6bWl4ZWRfbm9kZTpub2RlXCYjMzQ7LCA3LCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXCYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9ub2RlXCYjMzQ7LCAzMik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bm9kZVwmIzM0OywgTElTVF9OT0RFLCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtvd25lclwmIzM0OywgNiwgMTkyLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgYm9vbCBjaGlsZF9maXJzdCwgYm9vbCBzaGFyZWRfc3VmZml4LCBpbnQgZXhwZWN0ZWRfZXJyKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICYjNDM7IDFdO1xuJiM0MztcdGludCBmaXJzdF9zdHJ1Y3RfaWQ7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmO1xuJiM0MztcdGludCBpZCwgZXJyLCBpLCBuLCBwb2ludGVlX2lkO1xuJiM0MztcbiYjNDM7XHRidGYgPSBpbml0X2J0ZigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2luaXRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRmaXJzdF9zdHJ1Y3RfaWQgPSA1ICYjNDM7IDIgKiBkZXB0aDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChpID09IGRlcHRoIC0gMSlcbiYjNDM7XHRcdFx0cG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aDtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0cG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCAmIzQzOyAoY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDIgLSBpIDogaSAmIzQzOyAxKTtcbiYjNDM7XHRcdHB0cl9pZFtpXSA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgcG9pbnRlZV9pZCwgXCYjMzQ7a3B0clwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAocHRyX2lkW2ldIFx1MDAzYz0gMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAobiA9IDA7IG4gXHUwMDNjIGRlcHRoOyBuJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y2hhciBuYW1lWzMyXTtcbiYjNDM7XHRcdGludCBvZmZzZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdGkgPSBjaGlsZF9maXJzdCA/IGRlcHRoIC0gMSAtIG4gOiBuO1xuJiM0MztcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtvd25lcl8lZFwmIzM0OywgaSk7XG4mIzQzO1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggXHUwMDI2XHUwMDI2ICFpID8gMTYgOiA4KTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgbiwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IG93bmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpZiAoc2hhcmVkX3N1ZmZpeCBcdTAwMjZcdTAwMjYgIWkpIHtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogVmlzaXQgdGhlIHNoYXJlZCBzdWZmaXggdGhyb3VnaCB0aGUgc2hvcnRlciBwYXRoIGJlZm9yZVxuJiM0MztcdFx0XHQgKiByZWFjaGluZyBpdCBhZ2FpbiB3aXRoIGxlc3MgcmVtYWluaW5nIGRlcHRoLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtzdWZmaXhcJiMzNDssIHB0cl9pZFsxXSwgMCwgMCk7XG4mIzQzO1x0XHRcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgb3duZXI6OnN1ZmZpeFwmIzM0OykpXG4mIzQzO1x0XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRcdG9mZnNldCA9IDY0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtuZXh0XCYjMzQ7LCBwdHJfaWRbaV0sIG9mZnNldCwgMCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7cGxhaW5fbGVhZlwmIzM0OywgNCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dyYXBoX2RlcHRoKGJvb2wgcmJ0cmVlLCBpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcm9vdF90eXBlID0gTElTVF9IRUFELCBub2RlX3R5cGUgPSBMSVNUX05PREUsIG5vZGVfc2l6ZSA9IDI0O1xuJiM0MztcdGludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmO1xuJiM0MztcbiYjNDM7XHRidGYgPSBpbml0X2J0ZigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2luaXRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAocmJ0cmVlKSB7XG4mIzQzO1x0XHRyb290X3R5cGUgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfcmJfcm9vdFwmIzM0OywgMTYpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR1Qocm9vdF90eXBlLCAwLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX3Jvb3RcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2JwZl9yYl9ub2RlXCYjMzQ7LCAzMik7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9HVChub2RlX3R5cGUsIDAsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfcmJfbm9kZVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0bm9kZV9zaXplID0gMzI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNoYXIgbmFtZVszMl0sIHRhZ1s2NF07XG4mIzQzO1xuJiM0MztcdFx0bG9ja19vZmYgPSBpID8gbm9kZV9zaXplIDogMDtcbiYjNDM7XHRcdHJvb3Rfb2ZmID0gbG9ja19vZmYgJiM0MzsgODtcbiYjNDM7XHRcdHNpemUgPSBpID09IGRlcHRoIC0gMSA/IG5vZGVfc2l6ZSA6IHJvb3Rfb2ZmICYjNDM7IDE2O1xuJiM0MztcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtncmFwaF9vd25lcl8lZFwmIzM0OywgaSk7XG4mIzQzO1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBncmFwaF9vd25lclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0aWYgKGkpIHtcbiYjNDM7XHRcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtub2RlXCYjMzQ7LCBub2RlX3R5cGUsIDAsIDApO1xuJiM0MztcdFx0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChpID09IGRlcHRoIC0gMSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwmIzM0O2xvY2tcJiMzNDssIFNQSU5fTE9DSywgbG9ja19vZmYgKiA4LCAwKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OmxvY2tcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7cm9vdFwmIzM0Oywgcm9vdF90eXBlLCByb290X29mZiAqIDgsIDApO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c25wcmludGYodGFnLCBzaXplb2YodGFnKSwgXCYjMzQ7Y29udGFpbnM6Z3JhcGhfb3duZXJfJWQ6bm9kZVwmIzM0OywgaSAmIzQzOyAxKTtcbiYjNDM7XHRcdGVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0dUKGVyciwgMCwgXCYjMzQ7YnRmX19hZGRfZGVjbF90YWcgZ3JhcGhfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfbG9jYWxfa3B0cl9vd25lcnNoaXAodm9pZClcbiYjNDM7e1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NlbGZfY3ljbGVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9zZWxmX2N5Y2xlKFwmIzM0O2twdHJcJiMzNDssIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dW50cnVzdGVkX3NlbGZfY3ljbGVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9zZWxmX2N5Y2xlKFwmIzM0O2twdHJfdW50cnVzdGVkXCYjMzQ7LCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwZXJjcHVfc2VsZl9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCYjMzQ7cGVyY3B1X2twdHJcJiMzNDssIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7QUJBX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfYWJhX2N5Y2xlKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X21peGVkX2N5Y2xlKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWF4X2FjeWNsaWNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIGZhbHNlLCBmYWxzZSwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dG9vX2RlZXBfYWN5Y2xpY1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCBmYWxzZSwgZmFsc2UsIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWF4X2FjeWNsaWNfY2hpbGRfZmlyc3RcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIHRydWUsIGZhbHNlLCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICYjNDM7IDEsIHRydWUsIGZhbHNlLCAtRUxPT1ApO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21heF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIGZhbHNlLCB0cnVlLCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgZmFsc2UsIHRydWUsIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bGlzdF90aHJlZV90eXBlc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCAzLCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtsaXN0X2ZvdXJfdHlwZXNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bGlzdF9tYXhfZGVwdGhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bGlzdF90b29fZGVlcFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRIICYjNDM7IDEsIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmJ0cmVlX3RocmVlX3R5cGVzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgMywgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmJ0cmVlX2ZvdXJfdHlwZXNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCA0LCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyYnRyZWVfbWF4X2RlcHRoXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmJ0cmVlX3Rvb19kZWVwXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2JwZl9idGZfbG9hZCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmNTg0NTI1Zjk5NjAwZjZmN2FkN2JkYjg5YmVhZWNjNWZiNDhkZjgxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgMTQgMTY6Mjg6MzIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuYwppbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2J0Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvYnRmLmMKQEAgLTQyODQsMTMgJiM0Mzs0Mjg0LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiB7CiAJaW50IGk7CiAKLQkvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6Ci0JICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC4KLQkgKiBrcHRyX3JlZiBvbmx5IHN1cHBvcnRzIHN0b3Jpbmcga2VybmVsIHR5cGVzLCB3aGljaCBjYW4mIzM5O3Qgc3RvcmUKLQkgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLgotCSAqCi0JICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcAotCSAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLgomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWUKJiM0MzsJICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhcwomIzQzOwkgKiBiZWVuIGZpeGVkIHVwLgogCSAqLwogCWlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLSZndDtmaWVsZF9tYXNrICZhbXA7IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpCiAJCXJldHVybiAwOwpAQCAtNDMyMSw1MSAmIzQzOzQzMTgsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIAkJaWYgKCFtZXRhKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJlYy0mZ3Q7ZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS0mZ3Q7cmVjb3JkOwomIzQzOwl9CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCQkvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZAotCQkgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhCi0JCSAqIG5vZGUgdHlwZS4KLQkJICovCi0JCWlmICghKHJlYy0mZ3Q7ZmllbGRfbWFzayAmYW1wOyBCUEZfR1JBUEhfTk9ERSkpCiYjNDM7c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLAomIzQzOwkJCSAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTsKJiM0MzsJdTMyIGJ0Zl9pZDsKJiM0MzsKJiM0MzsJaWYgKGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UKSB7CiYjNDM7CQlidGZfaWQgPSBmaWVsZC0mZ3Q7Z3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7CiYjNDM7CX0gZWxzZSBpZiAoZmllbGQtJmd0O3R5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLSZndDt0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkgewomIzQzOwkJaWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtJmd0O2twdHIuYnRmKSkKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCWJ0Zl9pZCA9IGZpZWxkLSZndDtrcHRyLmJ0Zl9pZDsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7CiYjNDM7CWlmICghbWV0YSkKJiM0MzsJCXJldHVybiBmaWVsZC0mZ3Q7dHlwZSAmYW1wOyBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UOwomIzQzOwlyZXR1cm4gbWV0YSAtIHRhYi0mZ3Q7dHlwZXM7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kCiYjNDM7ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3QKJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dAomIzQzOyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhCiYjNDM7ICogbm9uLXJlY3Vyc2luZyBkcm9wLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCwKJiM0MzsJCQkgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLSZndDt0eXBlc1tpZHhdLnJlY29yZDsKJiM0MzsJaW50IGksIHJldCwgbWF4X2RlcHRoID0gMDsKJiM0MzsKJiM0MzsJaWYgKCFkZXB0aF9sZWZ0KQomIzQzOwkJcmV0dXJuIC1FTE9PUDsKJiM0MzsJaWYgKGRlcHRoW2lkeF0pCiYjNDM7CQlnb3RvIGRvbmU7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyByZWMtJmd0O2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgJmFtcDtyZWMtJmd0O2ZpZWxkc1tpXSk7CiYjNDM7CQlpZiAocmV0ID09IC1FTk9FTlQpCiAJCQljb250aW51ZTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJbWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTsKJiM0MzsJfQomIzQzOwlkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7CiYjNDM7ZG9uZToKJiM0MzsJcmV0dXJuIGRlcHRoW2lkeF0gJmd0OyBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTsKJiM0Mzt9CiAKLQkJLyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGUKLQkJICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURgotCQkgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlCi0JCSAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZQotCQkgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOgotCQkgKgotCQkgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQKLQkJICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuCi0JCSAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYQotCQkgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0cwotCQkgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eToKLQkJICoKLQkJICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcAotCQkgKiBjaGFpbiBjYW4gYmU6Ci0JCSAqCUEgLSZndDsgQiAtJmd0OyBDCi0JCSAqIFdoZXJlOgotCQkgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuCi0JCSAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kCi0JCSAqICAgYnBmX2xpc3RfaGVhZC4KLQkJICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZQotCQkgKgotCQkgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5Ci0JCSAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duCi0JCSAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuCi0JCSAqCUEgLSZndDsgQgotCQkgKiBXaGVyZToKLQkJICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS4KLQkJICogLSBCIGlzIG9ubHkgYW4gbm9kZS4KLQkJICovCi0JCWlmIChtZXRhLSZndDtyZWNvcmQtJmd0O2ZpZWxkX21hc2sgJmFtcDsgQlBGX0dSQVBIX1JPT1QpCi0JCQlyZXR1cm4gLUVMT09QOwomIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJCSAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYikKJiM0Mzt7CiYjNDM7CXU4ICpkZXB0aDsKJiM0MzsJaW50IGksIHJldCA9IDA7CiYjNDM7CiYjNDM7CWRlcHRoID0ga3ZjYWxsb2ModGFiLSZndDtjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKJiM0MzsJaWYgKCFkZXB0aCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGFiLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSwKJiM0MzsJCQkJCSAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlyZXQgPSAwOwogCX0KLQlyZXR1cm4gMDsKJiM0MzsJa3ZmcmVlKGRlcHRoKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCkBAIC02MDYwLDYgJiM0Mzs2MDk0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLAogCQkJaWYgKGVyciAmbHQ7IDApCiAJCQkJZ290byBlcnJvdXRfbWV0YTsKIAkJfQomIzQzOwomIzQzOwkJZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7CiYjNDM7CQlpZiAoZXJyICZsdDsgMCkKJiM0MzsJCQlnb3RvIGVycm91dF9tZXRhOwogCX0KIAogCWVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgJmFtcDtlbnYtJmd0O2xvZyk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwppbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKQEAgLTcxNCw3ICYjNDM7NzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZCkKIAkJCWJyZWFrOwogCiAJCWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwotCQlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGVyciwgMCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiAJCWJ0Zl9fZnJlZShidGYpOwogCQlicmVhazsKIAl9CkBAIC03NzMsNyAmIzQzOzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpCiAJCQlicmVhazsKIAogCQllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKLQkJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShlcnIsIDAsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwogCQlidGZfX2ZyZWUoYnRmKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYTQ4N2FhNjhmMmVlZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKQEAgLTAsMCAmIzQzOzEsMjk2IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFNQSU5fTE9DSyAyCiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgMwomIzQzOyNkZWZpbmUgTElTVF9OT0RFIDQKJiM0MzsvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi8KJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX19uZXdfZW1wdHkmIzM0OykpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWQgPSBidGZfX2FkZF9pbnQoYnRmLCAmIzM0O2ludCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCAxLCAmIzM0O2J0Zl9fYWRkX2ludCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9zcGluX2xvY2smIzM0OywgNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBTUElOX0xPQ0ssICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2smIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfbGlzdF9oZWFkJiMzNDssIDE2KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9saXN0X25vZGUmIzM0OywgMjQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlyZXR1cm4gYnRmOwomIzQzOwomIzQzO2Vycl9vdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpCiYjNDM7ewomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF90eXBlX3RhZyYjMzQ7KSkKJiM0MzsJCXJldHVybiBpZDsKJiM0MzsJaWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7CiYjNDM7CUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF9wdHImIzM0Oyk7CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7c2VsZl9jeWNsZSYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDcsICYjMzQ7YnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25leHQmIzM0OywgNiwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgMTAsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2N5Y2xlX2EmIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA5LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtiJiMzNDssIDYsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7Y3ljbGVfYiYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDEwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDthJiMzNDssIDgsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7bWl4ZWRfb3duZXImIzM0OywgMjApOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgNywgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O3Jvb3QmIzM0OywgTElTVF9IRUFELCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtsb2NrJiMzNDssIFNQSU5fTE9DSywgMTI4LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCAmIzM0O2NvbnRhaW5zOm1peGVkX25vZGU6bm9kZSYjMzQ7LCA3LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDgsICYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O21peGVkX25vZGUmIzM0OywgMzIpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bm9kZSYjMzQ7LCBMSVNUX05PREUsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7b3duZXImIzM0OywgNiwgMTkyLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGJvb2wgY2hpbGRfZmlyc3QsIGJvb2wgc2hhcmVkX3N1ZmZpeCwgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CWludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxXTsKJiM0MzsJaW50IGZpcnN0X3N0cnVjdF9pZDsKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVyciwgaSwgbiwgcG9pbnRlZV9pZDsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJZmlyc3Rfc3RydWN0X2lkID0gNSAmIzQzOyAyICogZGVwdGg7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChpID09IGRlcHRoIC0gMSkKJiM0MzsJCQlwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoOwomIzQzOwkJZWxzZQomIzQzOwkJCXBvaW50ZWVfaWQgPSBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgKGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAyIC0gaSA6IGkgJiM0MzsgMSk7CiYjNDM7CQlwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIHBvaW50ZWVfaWQsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJCWlmIChwdHJfaWRbaV0gJmx0Oz0gMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKG4gPSAwOyBuICZsdDsgZGVwdGg7IG4mIzQzOyYjNDM7KSB7CiYjNDM7CQljaGFyIG5hbWVbMzJdOwomIzQzOwkJaW50IG9mZnNldCA9IDA7CiYjNDM7CiYjNDM7CQlpID0gY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDEgLSBuIDogbjsKJiM0MzsJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgJiMzNDtvd25lcl8lZCYjMzQ7LCBpKTsKJiM0MzsJCWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgbmFtZSwgc2hhcmVkX3N1ZmZpeCAmYW1wOyZhbXA7ICFpID8gMTYgOiA4KTsKJiM0MzsJCWlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgbiwgJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgb3duZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZiAoc2hhcmVkX3N1ZmZpeCAmYW1wOyZhbXA7ICFpKSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBWaXNpdCB0aGUgc2hhcmVkIHN1ZmZpeCB0aHJvdWdoIHRoZSBzaG9ydGVyIHBhdGggYmVmb3JlCiYjNDM7CQkJICogcmVhY2hpbmcgaXQgYWdhaW4gd2l0aCBsZXNzIHJlbWFpbmluZyBkZXB0aC4KJiM0MzsJCQkgKi8KJiM0MzsJCQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7c3VmZml4JiMzNDssIHB0cl9pZFsxXSwgMCwgMCk7CiYjNDM7CQkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpzdWZmaXgmIzM0OykpCiYjNDM7CQkJCWdvdG8gb3V0OwomIzQzOwkJCW9mZnNldCA9IDY0OwomIzQzOwkJfQomIzQzOwkJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25leHQmIzM0OywgcHRyX2lkW2ldLCBvZmZzZXQsIDApOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0JiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtwbGFpbl9sZWFmJiMzNDssIDQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ3JhcGhfZGVwdGgoYm9vbCByYnRyZWUsIGludCBkZXB0aCwgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CWludCByb290X3R5cGUgPSBMSVNUX0hFQUQsIG5vZGVfdHlwZSA9IExJU1RfTk9ERSwgbm9kZV9zaXplID0gMjQ7CiYjNDM7CWludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKHJidHJlZSkgewomIzQzOwkJcm9vdF90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfcmJfcm9vdCYjMzQ7LCAxNik7CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChyb290X3R5cGUsIDAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9yYl9yb290JiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbm9kZV90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfcmJfbm9kZSYjMzQ7LCAzMik7CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChub2RlX3R5cGUsIDAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9yYl9ub2RlJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbm9kZV9zaXplID0gMzI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGRlcHRoOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY2hhciBuYW1lWzMyXSwgdGFnWzY0XTsKJiM0MzsKJiM0MzsJCWxvY2tfb2ZmID0gaSA/IG5vZGVfc2l6ZSA6IDA7CiYjNDM7CQlyb290X29mZiA9IGxvY2tfb2ZmICYjNDM7IDg7CiYjNDM7CQlzaXplID0gaSA9PSBkZXB0aCAtIDEgPyBub2RlX3NpemUgOiByb290X29mZiAmIzQzOyAxNjsKJiM0MzsJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgJiMzNDtncmFwaF9vd25lcl8lZCYjMzQ7LCBpKTsKJiM0MzsJCWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgbmFtZSwgc2l6ZSk7CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgZ3JhcGhfb3duZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZiAoaSkgewomIzQzOwkJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtub2RlJiMzNDssIG5vZGVfdHlwZSwgMCwgMCk7CiYjNDM7CQkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlJiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmIChpID09IGRlcHRoIC0gMSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtsb2NrJiMzNDssIFNQSU5fTE9DSywgbG9ja19vZmYgKiA4LCAwKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6bG9jayYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtyb290JiMzNDssIHJvb3RfdHlwZSwgcm9vdF9vZmYgKiA4LCAwKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXNucHJpbnRmKHRhZywgc2l6ZW9mKHRhZyksICYjMzQ7Y29udGFpbnM6Z3JhcGhfb3duZXJfJWQ6bm9kZSYjMzQ7LCBpICYjNDM7IDEpOwomIzQzOwkJZXJyID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCB0YWcsIGlkLCBpID8gMiA6IDEpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1QoZXJyLCAwLCAmIzM0O2J0Zl9fYWRkX2RlY2xfdGFnIGdyYXBoX293bmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VudHJ1c3RlZF9zZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0cl91bnRydXN0ZWQmIzM0OywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGVyY3B1X3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtwZXJjcHVfa3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O0FCQV9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfYWJhX2N5Y2xlKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfbWl4ZWRfY3ljbGUoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYXhfYWN5Y2xpYyYjMzQ7KSkKJiM0MzsJCXRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgZmFsc2UsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Rvb19kZWVwX2FjeWNsaWMmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCBmYWxzZSwgZmFsc2UsIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWF4X2FjeWNsaWNfY2hpbGRfZmlyc3QmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgdHJ1ZSwgZmFsc2UsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Rvb19kZWVwX2FjeWNsaWNfY2hpbGRfZmlyc3QmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCB0cnVlLCBmYWxzZSwgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYXhfYWN5Y2xpY19zaGFyZWRfc3VmZml4JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIGZhbHNlLCB0cnVlLCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXgmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCBmYWxzZSwgdHJ1ZSwgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtsaXN0X3RocmVlX3R5cGVzJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgMywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF9mb3VyX3R5cGVzJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF9tYXhfZGVwdGgmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtsaXN0X3Rvb19kZWVwJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV90aHJlZV90eXBlcyYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgMywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmJ0cmVlX2ZvdXJfdHlwZXMmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIDQsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV9tYXhfZGVwdGgmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIE1BWF9PV05FUlNISVBfREVQVEgsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV90b29fZGVlcCYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTM0OAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDMzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQlBGIEJURiBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggYW5kIHJldmlldyByZXF1ZXN0LiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCB0YXJnZXRzIG1vZGlmaWNhdGlvbnMgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCBhbmQgYWxzbyB0b3VjaGVzIHRoZSBzZWxmdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBUaGF0JiMzOTtzIGEgcmVhc29uYWJsZSBzY29wZTsgQlRGIGNoYW5nZXMgb2Z0ZW4gbmVjZXNzaXRhdGUgdGVzdCBhZGp1c3RtZW50cy4KCk5vdywgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGRpZmYuIFNwZWNpZmljYWxseSwgSSBzZWUgY2hhbmdlcyB3aXRoaW4gYGtlcm5lbC9icGYvYnRmLmNgIGltcGFjdGluZyB0aGUgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBmdW5jdGlvbi4gTm90YWJseSwgdGhleSYjMzk7dmUgcmVtb3ZlZCBzb21lIG9sZCBjeWNsZS1jaGVja2luZyBsb2dpYyBhbmQgaW50cm9kdWNlZCBuZXcgZnVuY3Rpb25zOiBgYnRmX293bmVkX3R5cGVfaWR4YCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBhbmQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBDcnVjaWFsbHksIEkgc2VlIHRoYXQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGlzIG5vdyBjYWxsZWQgd2l0aGluIGBidGZfcGFyc2VgOgoKYGBgYwoJCWVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpOwoJCWlmIChlcnIgJmx0OyAwKQoJCQlnb3RvIGVycm91dF9tZXRhOwpgYGAKClRoaXMgaXMgc2lnbmlmaWNhbnQuIGBidGZfcGFyc2VgIGlzIHBhcnQgb2YgdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSwgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCwgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIEJURiBsb2FkaW5nIGFuZCB2YWxpZGF0aW9uLiBSZW1lbWJlciwgYGJ0Zl9wYXJzZWAgaXMgaW52b2tlZCB3aGVuIGxvYWRpbmcgQlRGIGRhdGEgdmlhIHRoZSBgYnBmYCBzeXNjYWxsJiMzOTtzIGBCUEZfQlRGX0xPQURgIG9wZXJhdGlvbi4gVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBUaGlzIGZ1bmN0aW9uIGlzICpkaXJlY3RseSogaW52b2x2ZWQgaW4gcHJvY2Vzc2luZyB1bnRydXN0ZWQgdXNlciBpbnB1dCB0aGF0IGNvbWVzIGZyb20gdXNlcnNwYWNlIHdoZW4gY2FsbGluZyBgc3lzX2JwZihCUEZfQlRGX0xPQUQsIC4uLilgISBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBhIGNyaXRpY2FsIHZhbGlkYXRpb24gcG9pbnQuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gcXVpY2tseSBldmFsdWF0ZSByZWFjaGFiaWxpdHkuIE5vIHN1cnByaXNlcyBoZXJlLCBJIGV4cGVjdCB0aGF0IHRoaXMgYEJQRl9CVEZfTE9BRGAgc3lzY2FsbCBpcyByZWFkaWx5IHJlYWNoYWJsZSBpbiBzdGFuZGFyZCBRRU1VL3N5emthbGxlciBzZXR1cHMuICBTeXprYWxsZXIgaXMga25vd24gdG8gYWdncmVzc2l2ZWx5IGZ1enogdGhpcyBzeXNjYWxsLCB3aGljaCBtYWtlcyB0aGlzIGNoYW5nZSBwb3RlbnRpYWxseSBoaWdoLWltcGFjdC4KCkkmIzM5O2xsIG5vdyBuZWVkIHRvIHJlYWQgYXJvdW5kIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSByZWxhdGVkIGNoYW5nZXMgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCB0byBnZXQgYSBiZXR0ZXIgc2Vuc2Ugb2YgdGhlIGNvbnRleHQgYW5kIGltcGFjdCB1c2luZyBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmM9NDM1Nj1zdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDM4My1cbmtlcm5lbC9icGYvYnRmLmM6NDM4NDpzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxua2VybmVsL2JwZi9idGYuYy00Mzg1LVx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjAxND1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwOTctXG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTg6XHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xua2VybmVsL2JwZi9idGYuYy02MDk5LVx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNDUxCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IG1lbnRhbCB3YWxrdGhyb3VnaCwgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGUgY29kZToKCioqRGl2aW5nIGludG8gQlRGIEludGVybmFscyoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBmb2N1c2luZyBvbiBga2VybmVsL2JwZi9idGYuY2AsIHNwZWNpZmljYWxseSBhcm91bmQgdGhlIDQzMTAgdG8gNDQwNSBsaW5lIHJhbmdlLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGluIHRoaXMgc2VjdGlvbi4gSSBiZXQgaXQmIzM5O3MgcmVsYXRlZCB0byBzb21lIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBtZXRhZGF0YSBoYW5kbGluZywgbGlrZWx5IGRlYWxpbmcgd2l0aCBob3cgdHlwZXMgYXJlIHJlcHJlc2VudGVkIG9yIG1hbmlwdWxhdGVkLiBHaXZlbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBCVEYgY29kZSwgaXQmIzM5O3MgcHJvYmFibHkgcmVsYXRlZCB0byBlaXRoZXIgcGFyc2luZywgZ2VuZXJhdGluZywgb3IgY29uc3VtaW5nIEJURiBpbmZvcm1hdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCBmdW5jdGlvbihzKSBvciBsb2dpYyBiZWluZyBpbXBsZW1lbnRlZCBpbiB0aGF0IHNlY3Rpb24uIEFyZSB3ZSB2YWxpZGF0aW5nIHNvbWV0aGluZz8gRGVjb2RpbmcgdHlwZSBpbmZvcm1hdGlvbj8gQnVpbGRpbmcgQlRGIHN0cnVjdHVyZXM/IE9yIHBlcmhhcHMsIG1vZGlmeWluZyBCVEYgZGF0YSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzIGxpa2Uga2VybmVsIHVwZ3JhZGVzPyBJJiMzOTtsbCBzdGFydCBieSByZWFkaW5nIHRoZSBzdXJyb3VuZGluZyBjb21tZW50cyBjbG9zZWx5IGZvciBjb250ZXh0LCB0aGVuIGRpZyBpbnRvIHRoZSBjb2RlIGl0c2VsZiwgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB2YXJpYWJsZSBuYW1lcyBhbmQgZnVuY3Rpb24gY2FsbHMuIEtub3dpbmcgbWUsIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgYSBmZXcgY2FsbHMgZG93biB0byBiZSBjZXJ0YWluIG9mIGl0cyB0cnVlIGZ1bmN0aW9uIGFuZCBwdXJwb3NlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgc2VjcmV0cyB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgaG9sZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDMxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NDMxMDpcdFx0XHRcdFx0cmV0dXJuIC1FMkJJRztcbjQzMTE6XHRcdFx0XHRjb250aW51ZTtcbjQzMTI6XHRcdFx0fVxuNDMxMzpcdFxuNDMxNDpcdFx0XHRpZiAoIShyZWMtXHUwMDNlZmllbGRzW2ldLnR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSlcbjQzMTU6XHRcdFx0XHRjb250aW51ZTtcbjQzMTY6XHRcdFx0YnRmX2lkID0gcmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcbjQzMTc6XHRcdFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcbjQzMTg6XHRcdFx0aWYgKCFtZXRhKVxuNDMxOTpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuNDMyMDpcdFx0XHRyZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cdTAwM2VyZWNvcmQ7XG40MzIxOlx0XHR9XG40MzIyOlx0XHRyZXR1cm4gMDtcbjQzMjM6XHR9XG40MzI0Olx0XG40MzI1Olx0c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxuNDMyNjpcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxuNDMyNzpcdHtcbjQzMjg6XHRcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG40MzI5Olx0XHR1MzIgYnRmX2lkO1xuNDMzMDpcdFxuNDMzMTpcdFx0aWYgKGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XG40MzMyOlx0XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuNDMzMzpcdFx0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuNDMzNDpcdFx0XHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cdTAwM2VrcHRyLmJ0ZikpXG40MzM1Olx0XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG40MzM2Olx0XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuNDMzNzpcdFx0fSBlbHNlIHtcbjQzMzg6XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG40MzM5Olx0XHR9XG40MzQwOlx0XG40MzQxOlx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuNDM0MjpcdFx0aWYgKCFtZXRhKVxuNDM0MzpcdFx0XHRyZXR1cm4gZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcbjQzNDQ6XHRcdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuNDM0NTpcdH1cbjQzNDY6XHRcbjQzNDc6XHQvKlxuNDM0ODpcdCAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuNDM0OTpcdCAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XG40MzUwOlx0ICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcbjQzNTE6XHQgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuNDM1MjpcdCAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cbjQzNTM6XHQgKi9cbjQzNTQ6XHQjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbjQzNTU6XHRcbjQzNTY6XHRzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuNDM1NzpcdFx0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG40MzU4Olx0XHRcdFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxuNDM1OTpcdHtcbjQzNjA6XHRcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG40MzYxOlx0XHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xuNDM2MjpcdFxuNDM2MzpcdFx0aWYgKCFkZXB0aF9sZWZ0KVxuNDM2NDpcdFx0XHRyZXR1cm4gLUVMT09QO1xuNDM2NTpcdFx0aWYgKGRlcHRoW2lkeF0pXG40MzY2Olx0XHRcdGdvdG8gZG9uZTtcbjQzNjc6XHRcbjQzNjg6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40MzY5Olx0XHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG40MzcwOlx0XHRcdGlmIChyZXQgPT0gLUVOT0VOVClcbjQzNzE6XHRcdFx0XHRjb250aW51ZTtcbjQzNzI6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzNzM6XHRcdFx0XHRyZXR1cm4gcmV0O1xuNDM3NDpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XG40Mzc1Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40Mzc2Olx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNzc6XHRcdFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcbjQzNzg6XHRcdH1cbjQzNzk6XHRcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbjQzODA6XHRkb25lOlxuNDM4MTpcdFx0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuNDM4MjpcdH1cbjQzODM6XHRcbjQzODQ6XHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuNDM4NTpcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuNDM4NjpcdHtcbjQzODc6XHRcdHU4ICpkZXB0aDtcbjQzODg6XHRcdGludCBpLCByZXQgPSAwO1xuNDM4OTpcdFxuNDM5MDpcdFx0ZGVwdGggPSBrdmNhbGxvYyh0YWItXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XG40MzkxOlx0XHRpZiAoIWRlcHRoKVxuNDM5MjpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjQzOTM6XHRcbjQzOTQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40Mzk1Olx0XHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuNDM5NjpcdFx0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbjQzOTc6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzOTg6XHRcdFx0XHRicmVhaztcbjQzOTk6XHRcdFx0cmV0ID0gMDtcbjQ0MDA6XHRcdH1cbjQ0MDE6XHRcdGt2ZnJlZShkZXB0aCk7XG40NDAyOlx0XHRyZXR1cm4gcmV0O1xuNDQwMzpcdH1cbjQ0MDQ6XHRcbjQ0MDU6XHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbjQ0MDY6XHRcdFx0XHQgICAgICB1MzIgdHlwZV9pZCwgdm9pZCAqZGF0YSwgdTggYml0c19vZmZzZXQsXG40NDA3Olx0XHRcdFx0ICAgICAgc3RydWN0IGJ0Zl9zaG93ICpzaG93KVxuNDQwODpcdHtcbjQ0MDk6XHRcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIzNDYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyB0aGUgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIENvbnRleHQqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgYXJvdW5kIHRoYXQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGNhbGwuIExldCBtZSBxdWlja2x5IGV4YW1pbmUgdGhlIGNvZGUgZnJvbSBsaW5lIDYwODAgdG8gNjExNS4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgaW1tZWRpYXRlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGFyZ3VtZW50cyBiZWluZyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLCB0aGUgdmFyaWFibGVzIGJlaW5nIHVzZWQsIGFuZCBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBtaWdodCBpbmZsdWVuY2UgaXRzIGJlaGF2aW9yLiBIb3BlZnVsbHkgdGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIG93bmVyc2hpcCBkZXB0aCBjaGVjayBpcyB0cmlnZ2VyZWQgYW5kIHdoYXQgaXQmIzM5O3MgdHJ5aW5nIHRvIGFjY29tcGxpc2ggd2l0aGluIHRoYXQgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgY29kZS4gVGhpcyBpcyBsaWtlbHkgcmVsYXRlZCB0byBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgcGFzc2VkIGluIGZyb20gc29tZXdoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjA4MDpcdFx0XHRnb3RvIGVycm91dDtcbjYwODE6XHRcbjYwODI6XHRcdHN0cnVjdF9tZXRhX3RhYiA9IGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoXHUwMDI2ZW52LVx1MDAzZWxvZywgYnRmKTtcbjYwODM6XHRcdGlmIChJU19FUlIoc3RydWN0X21ldGFfdGFiKSkge1xuNjA4NDpcdFx0XHRlcnIgPSBQVFJfRVJSKHN0cnVjdF9tZXRhX3RhYik7XG42MDg1Olx0XHRcdGdvdG8gZXJyb3V0O1xuNjA4NjpcdFx0fVxuNjA4NzpcdFx0YnRmLVx1MDAzZXN0cnVjdF9tZXRhX3RhYiA9IHN0cnVjdF9tZXRhX3RhYjtcbjYwODg6XHRcbjYwODk6XHRcdGlmIChzdHJ1Y3RfbWV0YV90YWIpIHtcbjYwOTA6XHRcdFx0aW50IGk7XG42MDkxOlx0XG42MDkyOlx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG42MDkzOlx0XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbjYwOTQ6XHRcdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuNjA5NTpcdFx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbjYwOTY6XHRcdFx0fVxuNjA5NzpcdFxuNjA5ODpcdFx0XHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcbjYwOTk6XHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbjYxMDA6XHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuNjEwMTpcdFx0fVxuNjEwMjpcdFxuNjEwMzpcdFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbjYxMDQ6XHRcdGlmIChlcnIpXG42MTA1Olx0XHRcdGdvdG8gZXJyb3V0X2ZyZWU7XG42MTA2Olx0XG42MTA3Olx0XHRidGZfdmVyaWZpZXJfZW52X2ZyZWUoZW52KTtcbjYxMDg6XHRcdHJlZmNvdW50X3NldChcdTAwMjZidGYtXHUwMDNlcmVmY250LCAxKTtcbjYxMDk6XHRcdHJldHVybiBidGY7XG42MTEwOlx0XG42MTExOlx0ZXJyb3V0X21ldGE6XG42MTEyOlx0XHRidGZfZnJlZV9zdHJ1Y3RfbWV0YV90YWIoYnRmKTtcbjYxMTM6XHRlcnJvdXQ6XG42MTE0Olx0XHQvKiBvdmVyd3JpdGUgZXJyIHdpdGggLUVOT1NQQyBvciAtRUZBVUxUICovXG42MTE1Olx0XHRyZXQgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFx1MDAyNmVudi1cdTAwM2Vsb2cpO1xuNjExNjpcdFx0aWYgKHJldClcbjYxMTc6XHRcdFx0ZXJyID0gcmV0O1xuNjExODpcdGVycm91dF9mcmVlOlxuNjExOTpcdFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMxODgKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiA1OTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb246IEJQRi9CVEYgT3duZXJzaGlwIERlcHRoIENoZWNrKioKCk9rYXksIHRoaXMgaXMgZGVmaW5pdGVseSBwcm9taXNpbmcuIFRoZSBCUEYvQlRGIHN1YnN5c3RlbSBpcyBhIGNyaXRpY2FsIHBpZWNlLCBhbmQgdGhpcyBjb2RlIHBhdGggaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggdGhlIGBCUEZfQlRGX0xPQURgIHN5c2NhbGwuIEl0JiMzOTtzIG1vZGlmeWluZyB0aGUgQlRGIG93bmVyc2hpcCBncmFwaCB2YWxpZGF0aW9uIGxvZ2ljLCBzcGVjaWZpY2FsbHkgcmVwbGFjaW5nIGFuIGFkLWhvYyBjeWNsZSBjaGVjayB3aXRoIGEgZGVwdGgtY2hlY2tpbmcgcmVjdXJzaXZlIGFsZ29yaXRobSAoYGJ0Zl9vd25lcnNoaXBfZGVwdGhgKS4gVGhhdCYjMzk7cyBhIHJlZCBmbGFnIOKAkyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gb3BlcmF0aW5nIG9uIHVzZXItY29udHJvbGxlZCBpbnB1dC4gVGhpcyBzY3JlYW1zIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXM6IGJ1Z3MgaW4gdGhlIHJlY3Vyc2l2ZSBsb2dpYyBpdHNlbGYsIHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3dzLCBsb29wIGRldGVjdGlvbiBmYWlsdXJlcywgbWVtb3J5IGxlYWtzLCBvdXQtb2YtYm91bmRzIHJlYWRzL3dyaXRlcywgb3IgZXZlbiBzdGFjayBvdmVyZmxvd3MuIGBXb3J0aEZ1enppbmcgPSB0cnVlYC4gTm8gcXVlc3Rpb24uCgpOb3csIGxldCYjMzk7cyBuYWlsIGRvd24gdGhlIGNyaXRpY2FsIHN5bWJvbHMuIEkgbmVlZCB0byBrbm93IHdoaWNoIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIG1vZGlmaWVkIG9yIG5ld2x5IGludHJvZHVjZWQuIExldCYjMzk7cyBzZWUuLi4KClRoZSBrZXkgc3VzcGVjdHMgYXJlOiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lZF90eXBlX2lkeGAsIGFuZCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBgYnRmX3BhcnNlYCBpcyB3aGVyZSB0aGlzIG5ldyBjb2RlIGlzIGNhbGxlZCwgYW5kIHBlcmhhcHMgYGJwZl9idGZfbG9hZGAgYXMgd2VsbCwgYnV0IHRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIHRoZSBvbmVzIGRvaW5nIHRoZSBjb3JlIHdvcmsuCgpXYWl0IGEgc2Vjb25kLi4uIGFyZSBgYnRmX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfb3duZWRfdHlwZV9pZHhgIHN0YXRpYz8gWWVzLCB0aGV5IGFyZS4gVGhhdCBjb3VsZCBjb21wbGljYXRlIHRoaW5ncy4gVGhlIGluc3RydWN0aW9ucyByZWdhcmRpbmcgc3RhdGljIGZ1bmN0aW9ucyBjb21lIHRvIG1pbmQ6ICYjMzQ7Q29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjayBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4mIzM0OwoKSG93ZXZlciwgdGhleSBhcmUgaW4gYSAuYyBmaWxlLCBidXQgdGhleSBhcmUgbm90IGlubGluZWQgaW4gYSBoZWFkZXIuIExldCYjMzk7cyB0aGluay4uLiBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYW5ub3QgYmUgaW5saW5lZCwgdGhhdCYjMzk7cyBjZXJ0YWluISBCdXQgaXMgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGlubGluZWQ/IEl0IGlzIGNhbGxlZCBvbmx5IG9uY2UgZnJvbSBgYnRmX3BhcnNlYCwgc28gaXQgbWlnaHQgYmUgaW5saW5lZCBvciBub3QuCgpCdXQgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBpcyBub24tc3RhdGljISBPa2F5LCBnb29kLiBMZXQmIzM5O3MganVzdCBjb25maXJtIHRoYXQgaXQmIzM5O3MgZWl0aGVyIGV4cG9ydGVkIG9yIGRlY2xhcmVkIGluIGEgaGVhZGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2J0Zi5oPTIzND1zdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM1LVx0XHRcdFx0ICAgIHUzMiBmaWVsZF9tYXNrLCB1MzIgdmFsdWVfc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjIzNjppbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKTtcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM3LWJvb2wgYnRmX3R5cGVfaXNfdm9pZChjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NDE1MD1zdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQyODItXG5rZXJuZWwvYnBmL2J0Zi5jOjQyODM6aW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbmtlcm5lbC9icGYvYnRmLmMtNDI4NC17XG4tLVxua2VybmVsL2JwZi9idGYuYz02MDE0PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjA5Mi1cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbmtlcm5lbC9icGYvYnRmLmM6NjA5MzpcdFx0XHRlcnIgPSBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhidGYsIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2V0eXBlc1tpXS5yZWNvcmQpO1xua2VybmVsL2JwZi9idGYuYy02MDk0LVx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2My1cbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEzNjQ6XHRyZXQgPSBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhidGYsIG1hcC1cdTAwM2VyZWNvcmQpO1xua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2NS1cdGlmIChyZXQgXHUwMDNjIDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODQ2CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogOTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIEJURiBTeW1ib2wgUmVzb2x1dGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBCVEYgc3R1ZmYuIEZpcnN0IHRoaW5ncyBmaXJzdCwgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYC4uLiBwcmV0dHkgc3VyZSB0aGF0JiMzOTtzIGEgZ2xvYmFsIHN5bWJvbCwgbm90IHN0YXRpYy4gTmVlZCB0byBrZWVwIHRoYXQgaW4gbWluZCB3aGVuIEkgc3RhcnQgdHJhY2luZyB0aGluZ3MuIE5vdywgSSByZWNhbGwgdGhvc2UgdHdvIGZ1bmN0aW9ucywgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGFuZCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIHRoYXQgd2VyZSBhZGRlZCBpbiBga2VybmVsL2JwZi9idGYuY2AuIFRoZXkgc2VlbSByZWxldmFudCB0byB3aGF0ZXZlciBJJiMzOTttIHRyb3VibGVzaG9vdGluZy4KClRoZSByZWFsIHF1ZXN0aW9uIEkgbmVlZCB0byBhbnN3ZXIsIHRob3VnaCwgaXMgd2hhdCBjYWxscyBgYnRmX3BhcnNlYD8gVW5kZXJzdGFuZGluZyBpdHMgY2FsbCBjaGFpbiBpcyBnb2luZyB0byBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgbGFyZ2VyIHBpY3R1cmUgaGVyZS4gQWx0ZXJuYXRpdmVseSwgd2hhdCYjMzk7cyBjYWxsaW5nIGBicGZfYnRmX2xvYWRgIHdvdWxkIGFsc28gZ2l2ZSBtZSBjbHVlcy4gR290dGEgZ28gY2hlY2sgdGhlIGNhbGwgZ3JhcGhzIGZvciB0aG9zZSB0d28gbm93LiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBlbnRyeSBwb2ludCBhbmQgdGhlIGZsb3cgdG8gZm9sbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfcGFyc2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTM5NzY9c3RhdGljIGludCBidGZfZmluZF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTM5ODktLyogQ2FsbGVycyBoYXZlIHRvIGVuc3VyZSB0aGUgbGlmZSBjeWNsZSBvZiBidGYgaWYgaXQgaXMgcHJvZ3JhbSBCVEYgKi9cbmtlcm5lbC9icGYvYnRmLmM6Mzk5MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9rcHRyKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQsXG5rZXJuZWwvYnBmL2J0Zi5jLTM5OTEtXHRcdFx0ICBzdHJ1Y3QgYnRmX2ZpZWxkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL2JwZi9idGYuYy00MDA4LVx0aWYgKGlkID09IC1FTk9FTlQpIHtcbmtlcm5lbC9icGYvYnRmLmM6NDAwOTpcdFx0LyogYnRmX3BhcnNlX2twdHIgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHcvIGJ0ZiA9IHByb2dyYW0gQlRGICovXG5rZXJuZWwvYnBmL2J0Zi5jLTQwMTAtXHRcdFdBUk5fT05fT05DRShidGZfaXNfa2VybmVsKGJ0ZikpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDA3OS1cbmtlcm5lbC9icGYvYnRmLmM6NDA4MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9ncmFwaF9yb290KGNvbnN0IHN0cnVjdCBidGYgKmJ0Zixcbmtlcm5lbC9icGYvYnRmLmMtNDA4MS1cdFx0XHRcdHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDEyMy1cbmtlcm5lbC9icGYvYnRmLmM6NDEyNDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9saXN0X2hlYWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCxcbmtlcm5lbC9icGYvYnRmLmMtNDEyNS1cdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxua2VybmVsL2JwZi9idGYuYy00MTI2LXtcbmtlcm5lbC9icGYvYnRmLmM6NDEyNzpcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcJiMzNDticGZfbGlzdF9ub2RlXCYjMzQ7LFxua2VybmVsL2JwZi9idGYuYy00MTI4LVx0XHRcdFx0XHQgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9saXN0X25vZGUpKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQxMzAtXG5rZXJuZWwvYnBmL2J0Zi5jOjQxMzE6c3RhdGljIGludCBidGZfcGFyc2VfcmJfcm9vdChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLFxua2VybmVsL2JwZi9idGYuYy00MTMyLVx0XHRcdCAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxua2VybmVsL2JwZi9idGYuYy00MTMzLXtcbmtlcm5lbC9icGYvYnRmLmM6NDEzNDpcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcJiMzNDticGZfcmJfbm9kZVwmIzM0Oyxcbmtlcm5lbC9icGYvYnRmLmMtNDEzNS1cdFx0XHRcdFx0ICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfcmJfbm9kZSkpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NDEzOD1zdGF0aWMgaW50IGJ0Zl9maWVsZF9jbXAoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iLCBjb25zdCB2b2lkICpwcml2KVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDE0OS1cbmtlcm5lbC9icGYvYnRmLmM6NDE1MDpzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbmtlcm5lbC9icGYvYnRmLmMtNDE1MS1cdFx0XHRcdCAgICB1MzIgZmllbGRfbWFzaywgdTMyIHZhbHVlX3NpemUpXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjI5LVx0XHRjYXNlIEJQRl9VUFRSOlxua2VybmVsL2JwZi9idGYuYzo0MjMwOlx0XHRcdHJldCA9IGJ0Zl9wYXJzZV9rcHRyKGJ0ZiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSwgXHUwMDI2aW5mb19hcnJbaV0pO1xua2VybmVsL2JwZi9idGYuYy00MjMxLVx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjM0LVx0XHRjYXNlIEJQRl9MSVNUX0hFQUQ6XG5rZXJuZWwvYnBmL2J0Zi5jOjQyMzU6XHRcdFx0cmV0ID0gYnRmX3BhcnNlX2xpc3RfaGVhZChidGYsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0sIFx1MDAyNmluZm9fYXJyW2ldKTtcbmtlcm5lbC9icGYvYnRmLmMtNDIzNi1cdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDIzOS1cdFx0Y2FzZSBCUEZfUkJfUk9PVDpcbmtlcm5lbC9icGYvYnRmLmM6NDI0MDpcdFx0XHRyZXQgPSBidGZfcGFyc2VfcmJfcm9vdChidGYsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0sIFx1MDAyNmluZm9fYXJyW2ldKTtcbmtlcm5lbC9icGYvYnRmLmMtNDI0MS1cdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTU3ND1zdGF0aWMgaW50IGJ0Zl9jaGVja19hbGxfdHlwZXMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU2MDctXG5rZXJuZWwvYnBmL2J0Zi5jOjU2MDg6c3RhdGljIGludCBidGZfcGFyc2VfdHlwZV9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbmtlcm5lbC9icGYvYnRmLmMtNTYwOS17XG4tLVxua2VybmVsL2JwZi9idGYuYy01NjMwLVxua2VybmVsL2JwZi9idGYuYzo1NjMxOnN0YXRpYyBpbnQgYnRmX3BhcnNlX3N0cl9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbmtlcm5lbC9icGYvYnRmLmMtNTYzMi17XG4tLVxua2VybmVsL2JwZi9idGYuYy01NjYyLVxua2VybmVsL2JwZi9idGYuYzo1NjYzOnN0YXRpYyBpbnQgYnRmX3BhcnNlX2xheW91dF9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbmtlcm5lbC9icGYvYnRmLmMtNTY2NC17XG4tLVxua2VybmVsL2JwZi9idGYuYz01NzEzPXN0YXRpYyBpbnQgYnRmX2NoZWNrX3NlY19pbmZvKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi9idGYuYy01NzY5LVxua2VybmVsL2JwZi9idGYuYzo1NzcwOnN0YXRpYyBpbnQgYnRmX3BhcnNlX2hkcihzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52KVxua2VybmVsL2JwZi9idGYuYy01NzcxLXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTU4NDM9c3RhdGljIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICpcbmtlcm5lbC9icGYvYnRmLmM6NTg0NDpidGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0Zilcbmtlcm5lbC9icGYvYnRmLmMtNTg0NS17XG4tLVxua2VybmVsL2JwZi9idGYuYy01OTQ0LVx0XHR0eXBlLVx1MDAzZWJ0Zl9pZCA9IGk7XG5rZXJuZWwvYnBmL2J0Zi5jOjU5NDU6XHRcdHJlY29yZCA9IGJ0Zl9wYXJzZV9maWVsZHMoYnRmLCB0LCBCUEZfU1BJTl9MT0NLIHwgQlBGX1JFU19TUElOX0xPQ0sgfCBCUEZfTElTVF9IRUFEIHwgQlBGX0xJU1RfTk9ERSB8XG5rZXJuZWwvYnBmL2J0Zi5jLTU5NDYtXHRcdFx0XHRcdFx0ICBCUEZfUkJfUk9PVCB8IEJQRl9SQl9OT0RFIHwgQlBGX1JFRkNPVU5UIHxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTU5NzY9c3RhdGljIGludCBidGZfY2hlY2tfbW9kaWZpZXJfY2hhaW5fbGVuZ3RoKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi9idGYuYy02MDEzLVxua2VybmVsL2JwZi9idGYuYzo2MDE0OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxua2VybmVsL2JwZi9idGYuYy02MDE1LVx0XHRcdCAgICAgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXG4tLVxua2VybmVsL2JwZi9idGYuYy02MDU5LVxua2VybmVsL2JwZi9idGYuYzo2MDYwOlx0ZXJyID0gYnRmX3BhcnNlX2hkcihlbnYpO1xua2VybmVsL2JwZi9idGYuYy02MDYxLVx0aWYgKGVycilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjUtXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNjY6XHRlcnIgPSBidGZfcGFyc2Vfc3RyX3NlYyhlbnYpO1xua2VybmVsL2JwZi9idGYuYy02MDY3LVx0aWYgKGVycilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjktXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzA6XHRlcnIgPSBidGZfcGFyc2VfbGF5b3V0X3NlYyhlbnYpO1xua2VybmVsL2JwZi9idGYuYy02MDcxLVx0aWYgKGVycilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzMtXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzQ6XHRlcnIgPSBidGZfcGFyc2VfdHlwZV9zZWMoZW52KTtcbmtlcm5lbC9icGYvYnRmLmMtNjA3NS1cdGlmIChlcnIpXG4tLVxua2VybmVsL2JwZi9idGYuYy02MDgxLVxua2VybmVsL2JwZi9idGYuYzo2MDgyOlx0c3RydWN0X21ldGFfdGFiID0gYnRmX3BhcnNlX3N0cnVjdF9tZXRhcyhcdTAwMjZlbnYtXHUwMDNlbG9nLCBidGYpO1xua2VybmVsL2JwZi9idGYuYy02MDgzLVx0aWYgKElTX0VSUihzdHJ1Y3RfbWV0YV90YWIpKSB7XG4tLVxua2VybmVsL2JwZi9idGYuYz02NDUyPUJURl9JRF9MSVNUX1NJTkdMRShicGZfY3R4X2NvbnZlcnRfYnRmX2lkLCBzdHJ1Y3QsIGJwZl9jdHhfY29udmVydClcbmtlcm5lbC9icGYvYnRmLmMtNjQ1My1cbmtlcm5lbC9icGYvYnRmLmM6NjQ1NDpzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcbmtlcm5lbC9icGYvYnRmLmMtNjQ1NS1cdFx0XHRcdCAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSlcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NzUtXG5rZXJuZWwvYnBmL2J0Zi5jOjY0NzY6XHRlcnIgPSBidGZfcGFyc2VfaGRyKGVudik7XG5rZXJuZWwvYnBmL2J0Zi5jLTY0NzctXHRpZiAoZXJyKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjQ4MS1cbmtlcm5lbC9icGYvYnRmLmM6NjQ4MjpcdGVyciA9IGJ0Zl9wYXJzZV9zdHJfc2VjKGVudik7XG5rZXJuZWwvYnBmL2J0Zi5jLTY0ODMtXHRpZiAoZXJyKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjUwNi1cbmtlcm5lbC9icGYvYnRmLmM6NjUwNzpzdHJ1Y3QgYnRmICpidGZfcGFyc2Vfdm1saW51eCh2b2lkKVxua2VybmVsL2JwZi9idGYuYy02NTA4LXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1MTktXHRsb2ctXHUwMDNlbGV2ZWwgPSBCUEZfTE9HX0tFUk5FTDtcbmtlcm5lbC9icGYvYnRmLmM6NjUyMDpcdGJ0ZiA9IGJ0Zl9wYXJzZV9iYXNlKGVudiwgXCYjMzQ7dm1saW51eFwmIzM0OywgX19zdGFydF9CVEYsIF9fc3RvcF9CVEYgLSBfX3N0YXJ0X0JURik7XG5rZXJuZWwvYnBmL2J0Zi5jLTY1MjEtXHRpZiAoSVNfRVJSKGJ0ZikpXG4tLVxua2VybmVsL2JwZi9idGYuYy02NTIzLVxua2VybmVsL2JwZi9idGYuYzo2NTI0Olx0LyogYnRmX3BhcnNlX3ZtbGludXgoKSBydW5zIHVuZGVyIGJ0Zl92bWxpbnV4X2xvY2sgKi9cbmtlcm5lbC9icGYvYnRmLmMtNjUyNS1cdGJwZl9jdHhfY29udmVydC50ID0gYnRmX3R5cGVfYnlfaWQoYnRmLCBicGZfY3R4X2NvbnZlcnRfYnRmX2lkWzBdKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY1NDA9X191MzIgYnRmX3JlbG9jYXRlX2lkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgX191MzIgaWQpXG4tLVxua2VybmVsL2JwZi9idGYuYy02NTQ4LVxua2VybmVsL2JwZi9idGYuYzo2NTQ5OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBjb25zdCB2b2lkICpkYXRhLFxua2VybmVsL2JwZi9idGYuYy02NTUwLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBkYXRhX3NpemUsIHZvaWQgKmJhc2VfZGF0YSxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NzEtXHRpZiAoYmFzZV9kYXRhKSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjY1NzI6XHRcdGJhc2VfYnRmID0gYnRmX3BhcnNlX2Jhc2UoZW52LCBcJiMzNDsuQlRGLmJhc2VcJiMzNDssIGJhc2VfZGF0YSwgYmFzZV9kYXRhX3NpemUpO1xua2VybmVsL2JwZi9idGYuYy02NTczLVx0XHRpZiAoSVNfRVJSKGJhc2VfYnRmKSkge1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjYwMS1cbmtlcm5lbC9icGYvYnRmLmM6NjYwMjpcdGVyciA9IGJ0Zl9wYXJzZV9oZHIoZW52KTtcbmtlcm5lbC9icGYvYnRmLmMtNjYwMy1cdGlmIChlcnIpXG4tLVxua2VybmVsL2JwZi9idGYuYy02NjA3LVxua2VybmVsL2JwZi9idGYuYzo2NjA4Olx0ZXJyID0gYnRmX3BhcnNlX3N0cl9zZWMoZW52KTtcbmtlcm5lbC9icGYvYnRmLmMtNjYwOS1cdGlmIChlcnIpXG4tLVxua2VybmVsL2JwZi9idGYuYz04NDg2PWludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NDkwLVxua2VybmVsL2JwZi9idGYuYzo4NDkxOlx0YnRmID0gYnRmX3BhcnNlKGF0dHIsIHVhdHRyLCBhdHRyX2xvZyk7XG5rZXJuZWwvYnBmL2J0Zi5jLTg0OTItXHRpZiAoSVNfRVJSKGJ0ZikpXG4tLVxua2VybmVsL2JwZi9idGYuYz04NjQwPXN0YXRpYyBpbnQgYnRmX21vZHVsZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBvcCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NTktXHRcdH1cbmtlcm5lbC9icGYvYnRmLmM6ODY2MDpcdFx0YnRmID0gYnRmX3BhcnNlX21vZHVsZShtb2QtXHUwMDNlbmFtZSwgbW9kLVx1MDAzZWJ0Zl9kYXRhLCBtb2QtXHUwMDNlYnRmX2RhdGFfc2l6ZSxcbmtlcm5lbC9icGYvYnRmLmMtODY2MS1cdFx0XHRcdCAgICAgICBtb2QtXHUwMDNlYnRmX2Jhc2VfZGF0YSwgbW9kLVx1MDAzZWJ0Zl9iYXNlX2RhdGFfc2l6ZSk7XG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9NzU5PWJvb2wgYnRmX3JlY29yZF9lcXVhbChjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjX2EsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYilcbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy03NzAtXHRzaXplID0gc3RydWN0X3NpemUocmVjX2EsIGZpZWxkcywgcmVjX2EtXHUwMDNlY250KTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjc3MTpcdC8qIGJ0Zl9wYXJzZV9maWVsZHMgdXNlcyBremFsbG9jIHRvIGFsbG9jYXRlIGEgYnRmX3JlY29yZCwgc28gdW51c2VkXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy03NzItXHQgKiBtZW1iZXJzIGFyZSB6ZXJvZWQgb3V0LiBTbyBtZW1jbXAgaXMgc2FmZSB0byBkbyB3aXRob3V0IHdvcnJ5aW5nXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTI3Ni1cbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEyNzc6XHRtYXAtXHUwMDNlcmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHZhbHVlX3R5cGUsXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xMjc4LVx0XHRcdFx0ICAgICAgIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9USU1FUiB8IEJQRl9LUFRSIHwgQlBGX0xJU1RfSEVBRCB8XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTIwOTc5PXN0cnVjdCBidGYgKmJwZl9nZXRfYnRmX3ZtbGludXgodm9pZClcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODctXHRcdGlmICghYnRmKSB7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjA5ODg6XHRcdFx0YnRmID0gYnRmX3BhcnNlX3ZtbGludXgoKTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4OS1cdFx0XHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODk3MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IExpbmUgb2YgSW5xdWlyeTogQlRGIEZpbGUgRGVzY3JpcHRvciBDcmVhdGlvbioqCgpPa2F5LCBzbyBgYnRmX25ld19mZGAgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgdWx0aW1hdGVseSBnZXRzIGNhbGxlZCB0byBjcmVhdGUgYSBCVEYgZmlsZSBkZXNjcmlwdG9yLiBUaGUgaW1tZWRpYXRlIGZ1bmN0aW9uIHRvIGNhbGwgaXQsIGl0IHNlZW1zLCBpcyBgYnRmX3BhcnNlYCwgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvbi4gSW50ZXJlc3RpbmcuIE5vdywgd2hlcmUgaXMgYGJ0Zl9uZXdfZmRgIGJlaW5nIGludm9rZWQ/IFRoZSB0ZXh0IG1lbnRpb25zIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AsIGFuZCBzcGVjaWZpY2FsbHkgdGhlIGhhbmRsaW5nIG9mIGBCUEZfQlRGX0xPQURgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGxvYWRpbmcgQlRGIGRhdGEgaXMgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBpdC4KCkhvd2V2ZXIsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsYXJnZXIgY29udGV4dC4gVG8gc29saWRpZnkgdGhpcyB1bmRlcnN0YW5kaW5nLCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIGNhbGxlcnMgb2YgYGJ0Zl9uZXdfZmRgLiBUcmFjaW5nIHRoZSBjYWxsIGdyYXBoIHdpbGwgaGVscCBtZSBlbnN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55dGhpbmcgY3J1Y2lhbCBhbmQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgb3ZlcmFsbCBCVEYgbG9hZGluZyBwcm9jZXNzLiBJdCBpcyBpbXBvcnRhbnQgdG8ga25vdyB3aGljaCBjb2RlIHBhdGhzIGFyZSByZWxhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfbmV3X2ZkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvYnRmLmg9MTQ5PXN0cnVjdCBicGZfbG9nX2F0dHI7XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjE1MDppbnQgYnRmX25ld19mZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKTtcbmluY2x1ZGUvbGludXgvYnRmLmgtMTUxLXN0cnVjdCBidGYgKmJ0Zl9nZXRfYnlfZmQoaW50IGZkKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg0NzQ9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0ODAtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0ODE6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxua2VybmVsL2JwZi9idGYuYy04NDgyLXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0ODUtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0ODY6aW50IGJ0Zl9uZXdfZmQoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbmtlcm5lbC9icGYvYnRmLmMtODQ4Ny17XG4tLVxua2VybmVsL2JwZi9idGYuYy04NTA2LVxua2VybmVsL2JwZi9idGYuYzo4NTA3Olx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg1MDgtXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODU4Nj1pbnQgYnRmX2dldF9mZF9ieV9pZCh1MzIgaWQpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NTk5LVxua2VybmVsL2JwZi9idGYuYzo4NjAwOlx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcbmtlcm5lbC9icGYvYnRmLmMtODYwMS1cdGlmIChmZCBcdTAwM2MgMClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg4Mzg9QlBGX0NBTExfNChicGZfYnRmX2ZpbmRfYnlfbmFtZV9raW5kLCBjaGFyICosIG5hbWUsIGludCwgbmFtZV9zeiwgdTMyLCBraW5kLCBpbnQsIGZsYWdzKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtODg1MS1cdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IGJ0Zl9pc19tb2R1bGUoYnRmKSkge1xua2VybmVsL2JwZi9idGYuYzo4ODUyOlx0XHRidGZfb2JqX2ZkID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTMtXHRcdGlmIChidGZfb2JqX2ZkIFx1MDAzYyAwKSB7XG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9NTU2ND1zdGF0aWMgaW50IGJwZl9idGZfbG9hZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTAtXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzo1NTkxOlx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTItfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDAxOAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDEyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqTXkgQW5hbHlzaXMgb2YgQlRGIExvYWRpbmcgYW5kIEFzc29jaWF0ZWQgQ2hlY2tzKioKCkFscmlnaHQsIHNvIHRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBsb2FkaW5nIHByb2Nlc3MuIE15IG1lbnRhbCBtb2RlbCBpcyB0cmFjaW5nIHRoZSBmbG93OiBgYnBmX2J0Zl9sb2FkYCBraWNrcyB0aGluZ3Mgb2ZmLCB3aGljaCB0aGVuIGZlZWRzIGludG8gYGJ0Zl9uZXdfZmRgLiBGcm9tIHRoZXJlLCBpdCBkaXZlcyBpbnRvIHRoZSBwYXJzaW5nIHN0YWdlIHdpdGggYGJ0Zl9wYXJzZWAsIHdoaWNoIHNlZW1zIHRvIGJlIHRoZSB3b3JraG9yc2UuCgpXaXRoaW4gYGJ0Zl9wYXJzZWAsIEkgc2VlIHR3byBjcnVjaWFsIHZhbGlkYXRpb24gZnVuY3Rpb25zIGJlaW5nIGNhbGxlZC4gT25lIGlzIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgd2hpY2ggdW5kb3VidGVkbHkgZGVhbHMgd2l0aCB0aGUgY29tcGxleCByZWxhdGlvbnNoaXBzIGFuZCBwb3RlbnRpYWwgbmVzdGVkIG93bmVyc2hpcCBpbXBsaWVkIGJ5IEJURiYjMzk7cyB0eXBlIGluZm9ybWF0aW9uLiBJdCBsb29rcyBsaWtlIGBidGZfb3duZXJzaGlwX2RlcHRoYCBhbmQgYGJ0Zl9vd25lZF90eXBlX2lkeGAgYXJlIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB3aXRoaW4gdGhpcyBvd25lcnNoaXAgY2hlY2suCgpDcnVjaWFsbHksIGl0IGlzIGFsc28gY2FsbGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIHdpdGhpbiBgYnRmX3BhcnNlYCwgbWVhbmluZyB0aGF0IGFzIHR5cGVzIGFyZSBwYXJzZWQgYW5kIGluc3BlY3RlZCwgYW55IGlzc3VlcyB3aXRoIHN0cnVjdCBvciB1bmlvbiBmaWVsZHMgd2lsbCBhbHNvIGJlIGRlYWx0IHdpdGguIEFuZCBvZiBjb3Vyc2UsIHRoZXJlJiMzOTtzIGBtYXBfY2hlY2tfYnRmYCB3aGljaCB3aWxsIGhhbmRsZSBhbnkgQlRGIGlzc3VlcyBmb3IgbWFwcy4KCk5vdywgSSYjMzk7bSB0aGlua2luZyBhYm91dCBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIGNvbmZpZ3VyYXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgc2V0dGluZ3MgZm9yIGBrZXJuZWwvYnBmL2J0Zi5jYCB0byB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIEJURiBzdXBwb3J0IGlzIGVuYWJsZWQuIEFuZCB0aGUgYE1ha2VmaWxlYCBpbiBga2VybmVsL2JwZi9gIHdpbGwgdGVsbCBtZSBob3cgdGhlc2UgbW9kdWxlcyBhcmUgYnVpbHQgYW5kIGxpbmtlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgYXJlIGFueSBzcGVjaWZpYyBvcHRpb25zIG9yIG1vZHVsZXMgdGhhdCB0aGlzIEJURiBoYW5kbGluZyBkZXBlbmRzIG9uLiBUaGlzIGlzIGEgY29tbW9uIHByYWN0aWNlIHdoZW4gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBvZiBhbnkga2VybmVsIGZlYXR1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0ZlxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL01ha2VmaWxlPTEzPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9sb2NhbF9zdG9yYWdlLm8gYnBmX3Rhc2tfc3RvcmFnZS5vXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE0Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGZpeHVwcy5vIGNmZy5vIHN0YXRlcy5vIGJhY2t0cmFjay5vIGNoZWNrX2J0Zi5vXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE1LW9iai0ke0NPTkZJR19CUEZfTFNNfVx0ICAmIzQzOz0gYnBmX2lub2RlX3N0b3JhZ2Uub1xuLS1cbmtlcm5lbC9icGYvTWFrZWZpbGU9MTc9b2JqLSQoQ09ORklHX0JQRl9KSVQpICYjNDM7PSB0cmFtcG9saW5lLm9cbmtlcm5lbC9icGYvTWFrZWZpbGU6MTg6b2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnRmLm8gbWVtYWxsb2MubyBycXNwaW5sb2NrLm8gc3RyZWFtLm9cbmtlcm5lbC9icGYvTWFrZWZpbGUtMTktaWZlcSAoJChDT05GSUdfTU1VKSQoQ09ORklHXzY0QklUKSx5eSlcbi0tXG5rZXJuZWwvYnBmL01ha2VmaWxlPTQzPWlmZXEgKCQoQ09ORklHX1NZU0ZTKSx5KVxua2VybmVsL2JwZi9NYWtlZmlsZTo0NDpvYmotJChDT05GSUdfREVCVUdfSU5GT19CVEYpICYjNDM7PSBzeXNmc19idGYub1xua2VybmVsL2JwZi9NYWtlZmlsZS00NS1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDgyMgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4YW1pbmluZyB0aGUgQlBGIFN5c2NhbGwgQ29tcGlsYXRpb24qKgoKT2theSwgc28gSSBzZWUgdGhpcyBsaW5lOiBgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnRmLm9gLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzIHRvIGltbWVkaWF0ZWx5IGRpc3NlY3Qgd2hhdCYjMzk7cyBnb2luZyBvbi4gVGhpcyB0ZWxscyB0aGUgYnVpbGQgc3lzdGVtIHRoYXQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIGVuYWJsZWQsIHRoZW4gYGJ0Zi5vYCBzaG91bGQgYmUgY29tcGlsZWQgYW5kIGxpbmtlZC4gVGhhdCYjMzk7cyBwcmV0dHkgc3RhbmRhcmQsIGJ1dCB0aGUga2V5IGlzIHRoYXQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgYENPTkZJR19CUEZfU1lTQ0FMTGAuCgpTbywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcy4gSSBuZWVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgYEJQRl9TWVNDQUxMYC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3Igd2hlcmUgdGhpcyBvcHRpb24gaXMgZGVmaW5lZCwgaXRzIGRlZmF1bHQgdmFsdWUgKGlmIGFueSksIHdoYXQgZGVwZW5kZW5jaWVzIGl0IGhhcywgYW5kIG1vc3QgaW1wb3J0YW50bHksIHdoYXQgaXQgKm1lYW5zKiBpbiB0aGUgYnJvYWRlciBjb250ZXh0IG9mIEJQRiBhbmQgdGhlIGtlcm5lbC4gSXMgdGhpcyByZWxhdGVkIHRvIHRoZSBCUEYgc3lzdGVtIGNhbGwgaXRzZWxmPyBEb2VzIGl0IGVuYWJsZSBleHRlbnNpb25zLCBvciBwZXJoYXBzIHNwZWNpZmljIGZlYXR1cmVzIGxpa2UgQlRGIGdlbmVyYXRpb24gb3IgdXNhZ2Ugb2YgQlBGIHByb2dyYW1zIHdpdGggc3lzY2FsbHM/IFRoYXQmIzM5O3Mgd2hhdCBJIGhhdmUgdG8gZmlndXJlIG91dCB0byB1bmRlcnN0YW5kIHRoZSBpbXBhY3Qgb2YgdGhpcyBidWlsZCBydWxlLiBVbmRlcnN0YW5kaW5nIHRoZSBjb250ZXh0IG9mIHRoYXQgS2NvbmZpZyBvcHRpb24gd2lsbCB0ZWxsIG1lIHRoZSBzaWduaWZpY2FuY2Ugb2YgYGJ0Zi5vYCYjMzk7cyBjb21waWxhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMjMxCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipFeGFtaW5pbmcgQlBGIEtlcm5lbCBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqCgpPa2F5LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgQlBGIGNvbmZpZ3VyYXRpb24uIEkga25vdyBga2VybmVsL2JwZi9LY29uZmlnYCBpcyB1c3VhbGx5IHRoZSBwbGFjZSBmb3IgdGhlc2Ugc29ydHMgb2YgZGVjbGFyYXRpb25zLCBzbyB0aGF0JiMzOTtzIHdoZXJlIEkgc2hvdWxkIHN0YXJ0LiBJJiMzOTttIHRoaW5raW5nIGFyb3VuZCBsaW5lIDMxIGlzIGxpa2VseSBhIGdvb2QgcGxhY2UgdG8gbG9vayDigJMgdGhhdCYjMzk7cyBvZnRlbiB3aGVyZSB0aGUgY29yZSBvciBkZWZhdWx0IG9wdGlvbnMgcmVzaWRlLiBMZXQmIzM5O3MgZGlnIGluIHRoZXJlIGFuZCBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSBleHBlY3QgdG8gc2VlIHRoZSB0eXBpY2FsIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIGxpbmtpbmcgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIG90aGVyIGtlcm5lbCBmZWF0dXJlcy4gTXkgZ29hbCBpcyB0byBtYXAgb3V0IHdoaWNoIHByZXJlcXVpc2l0ZXMgYXJlIHJlcXVpcmVkIGZvciBpdCB0byBiZSBlbmFibGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMjk6XHRtZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbiAgMzA6XHRcbiAgMzE6XHRjb25maWcgQlBGX1NZU0NBTExcbiAgMzI6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4gIDMzOlx0XHRzZWxlY3QgQlBGXG4gIDM0Olx0XHRzZWxlY3QgSVJRX1dPUktcbiAgMzU6XHRcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxuICAzNjpcdFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxuICAzNzpcdFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcbiAgMzg6XHRcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXG4gIDM5Olx0XHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcbiAgNDA6XHRcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXG4gIDQxOlx0XHRkZWZhdWx0IG5cbiAgNDI6XHRcdGhlbHBcbiAgNDM6XHRcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xuICA0NDpcdFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cbiAgNDU6XHRcbiAgNDY6XHRjb25maWcgQlBGX0pJVFxuICA0NzpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIEp1c3QgSW4gVGltZSBjb21waWxlclwmIzM0O1xuICA0ODpcdFx0ZGVwZW5kcyBvbiBCUEZcbiAgNDk6XHRcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXG4gIDUwOlx0XHRzZWxlY3QgRVhFQ01FTVxuICA1MTpcdFx0aGVscFxuICA1MjpcdFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXG4gIDUzOlx0XHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxuICA1NDpcdFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXG4gIDU1Olx0XHQgIHByb2dyYW1zLlxuICA1NjpcdFxuICA1NzpcdFx0ICBOb3RlLCBhbiBhZG1pbiBzaG91bGQgZW5hYmxlIHRoaXMgZmVhdHVyZSBjaGFuZ2luZzpcbiAgNTg6XHRcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfZW5hYmxlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxODQ0CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjA3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkJQRiAmYW1wOyBCVEYgRGVwZW5kZW5jeSBEZWVwIERpdmUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhlIGtlcm5lbCBidWlsZCBjb25maWd1cmF0aW9uLCBzcGVjaWZpY2FsbHkgYXJvdW5kIEJQRiBhbmQgQlRGLiBNeSBpbml0aWFsIHVuZGVyc3RhbmRpbmcgd2FzIHRoYXQgYEJQRl9TWVNDQUxMYCB3YXMgZmFpcmx5IGlzb2xhdGVkLCBtYXliZSBqdXN0IGRlcGVuZGVudCBvbiB0aGUgYXJjaGl0ZWN0dXJlIG9yIGEgcGFyZW50IG1lbnUuIEl0ICpzZWxlY3RzKiB0aGluZ3MgbGlrZSBCUEYgY29yZSBmZWF0dXJlcywgYElSUV9XT1JLYCwgYW5kIHN1Y2guIEJ1dCBJJiMzOTttIHN0YXJ0aW5nIHRvIHdvbmRlciBhYm91dCB0aGUgQlRGIGNvbXBpbGF0aW9uIHBhdGgsIGFuZCB3aGV0aGVyIGl0JiMzOTtzIHVuY29uZGl0aW9uYWxseSBidWlsdCB3aGVuIGBCUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZC4KClJpZ2h0LCBsZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBga2VybmVsL2JwZi9NYWtlZmlsZWAuIEFoLCB0aGVyZSBpdCBpcyBvbiBsaW5lIDE4OiBgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnRmLm8gbWVtYWxsb2MubyBycXNwaW5sb2NrLm8gc3RyZWFtLm9gLiBTbywgKnllcyosIGVuYWJsaW5nIGBCUEZfU1lTQ0FMTGAgKmRvZXMqIGNvbXBpbGUgYGJ0Zi5vYC4gTm8gc3VycHJpc2VzIHRoZXJlLCByZWFsbHksIGJ1dCBnb29kIHRvIGhhdmUgY29uZmlybWVkIGl0IGRlZmluaXRpdmVseS4KCk5vdywgYSBtb3JlIG51YW5jZWQgcXVlc3Rpb246IERvZXMgQlRGICpyZXF1aXJlKiBgREVCVUdfSU5GT19CVEZgPyBJcyB0aGF0IGEgaGFyZCBkZXBlbmRlbmN5LCBvciBpcyBpdCBhIGNvbmRpdGlvbmFsIGJ1aWxkLXRpbWUgcmVxdWlyZW1lbnQ/IERvZXMgYGJ0Zl9wYXJzZWAgb3IgYW55IG9mIHRoZSBCUEYgQlRGIGxvYWRpbmcgbWVjaGFuaXNtcyBoYXZlIGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdGhhdCBpcyBkZXBlbmRlbnQgb24gYERFQlVHX0lORk9fQlRGYD8KCkkmIzM5O2xsIHF1ZXJ5IGBncmVwcGVyYCBhbmQgc2VlIGhvdyBgREVCVUdfSU5GT19CVEZgIGlzIHVzZWQgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgZmluYWwgYW5zd2VyLiBHb3R0YSBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBvcHRpbWl6ZWQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcbmtlcm5lbC9icGYvTWFrZWZpbGU6NDQ6b2JqLSQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSAmIzQzOz0gc3lzZnNfYnRmLm9cbmtlcm5lbC9icGYvTWFrZWZpbGUtNDUtZW5kaWZcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY0NTQ9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV9iYXNlKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUsXG4tLVxua2VybmVsL2JwZi9idGYuYy02NDU5LVxua2VybmVsL2JwZi9idGYuYzo2NDYwOlx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NjEtXHRcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjU0MD1fX3UzMiBidGZfcmVsb2NhdGVfaWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBfX3UzMiBpZClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NDYtXG5rZXJuZWwvYnBmL2J0Zi5jOjY1NDc6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NDgtXG5rZXJuZWwvYnBmL2J0Zi5jPTY1NDk9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIGNvbnN0IHZvaWQgKmRhdGEsXG4tLVxua2VybmVsL2JwZi9idGYuYy02NjQ0LVxua2VybmVsL2JwZi9idGYuYzo2NjQ1OiNlbmRpZiAvKiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUyAqL1xua2VybmVsL2JwZi9idGYuYy02NjQ2LVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODYyMj1lbnVtIHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg2MjUtXG5rZXJuZWwvYnBmL2J0Zi5jOjg2MjY6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTg2Mjctc3RydWN0IGJ0Zl9tb2R1bGUge1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODc2ND1mc19pbml0Y2FsbChidGZfbW9kdWxlX2luaXQpO1xua2VybmVsL2JwZi9idGYuYzo4NzY1OiNlbmRpZiAvKiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUyAqL1xua2VybmVsL2JwZi9idGYuYy04NzY2LVxua2VybmVsL2JwZi9idGYuYz04NzY3PXN0cnVjdCBtb2R1bGUgKmJ0Zl90cnlfZ2V0X21vZHVsZShjb25zdCBzdHJ1Y3QgYnRmICpidGYpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NzY5LVx0c3RydWN0IG1vZHVsZSAqcmVzID0gTlVMTDtcbmtlcm5lbC9icGYvYnRmLmM6ODc3MDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODc3MS1cdHN0cnVjdCBidGZfbW9kdWxlICpidGZfbW9kLCAqdG1wO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODc5Nz1zdHJ1Y3QgYnRmICpidGZfZ2V0X21vZHVsZV9idGYoY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kdWxlKVxua2VybmVsL2JwZi9idGYuYy04Nzk4LXtcbmtlcm5lbC9icGYvYnRmLmM6ODc5OTojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODgwMC1cdHN0cnVjdCBidGZfbW9kdWxlICpidGZfbW9kLCAqdG1wO1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtODgxMC1cbmtlcm5lbC9icGYvYnRmLmM6ODgxMTojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODgxMi1cdG11dGV4X2xvY2soXHUwMDI2YnRmX21vZHVsZV9tdXRleCk7XG4tLVxua2VybmVsL2JwZi9idGYuYz04ODI3PXN0YXRpYyBpbnQgY2hlY2tfYnRmX2tjb25maWdzKGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgY29uc3QgY2hhciAqZmVhdHVyZSlcbmtlcm5lbC9icGYvYnRmLmMtODgyOC17XG5rZXJuZWwvYnBmL2J0Zi5jOjg4Mjk6XHRpZiAoIW1vZHVsZSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKSB7XG5rZXJuZWwvYnBmL2J0Zi5jLTg4MzAtXHRcdHByX2VycihcJiMzNDttaXNzaW5nIHZtbGludXggQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXG5cJiMzNDssIGZlYXR1cmUpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtODgzMi1cdH1cbmtlcm5lbC9icGYvYnRmLmM6ODgzMzpcdGlmIChtb2R1bGUgXHUwMDI2XHUwMDI2IElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVMpKVxua2VybmVsL2JwZi9idGYuYy04ODM0LVx0XHRwcl93YXJuKFwmIzM0O21pc3NpbmcgbW9kdWxlIEJURiwgY2Fubm90IHJlZ2lzdGVyICVzXFxuXCYjMzQ7LCBmZWF0dXJlKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg5NzU9c3RhdGljIGludCBidGZfY2hlY2tfa2Z1bmNfbmFtZShzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgdTMyIGtpbmQpXG5rZXJuZWwvYnBmL2J0Zi5jLTg5NzYte1xua2VybmVsL2JwZi9idGYuYzo4OTc3OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04OTc4LVx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XG4tLVxua2VybmVsL2JwZi9idGYuYy04OTkxLVxua2VybmVsL2JwZi9idGYuYzo4OTkyOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04OTkzLVx0Z3VhcmQobXV0ZXgpKFx1MDAyNmJ0Zl9tb2R1bGVfbXV0ZXgpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9OTY0MD1zdGF0aWMgc3RydWN0IGJwZl9jYW5kX2NhY2hlICpwb3B1bGF0ZV9jYW5kX2NhY2hlKHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqY2FuZHMsXG4tLVxua2VybmVsL2JwZi9idGYuYy05NjY3LVxua2VybmVsL2JwZi9idGYuYzo5NjY4OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy05NjY5LXN0YXRpYyB2b2lkIF9fcHVyZ2VfY2FuZF9jYWNoZShzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqKmNhY2hlLFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yODQ5PWludCBicGZfYWRkX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGZ1bmNfaWQsIHUxNiBvZmZzZXQpXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NjUtXHRcdGlmICghYnRmX3ZtbGludXgpIHtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyODY2Olx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtjYWxsaW5nIGtlcm5lbCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgQ09ORklHX0RFQlVHX0lORk9fQlRGXFxuXCYjMzQ7KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yODY3LVx0XHRcdHJldHVybiAtRU5PVFNVUFA7XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTYyMzA9c3RhdGljIGludCBjaGVja19wdHJfdG9fbWFwX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjQ0LVx0aWYgKCFidGZfdm1saW51eCkge1xua2VybmVsL2JwZi92ZXJpZmllci5jOjYyNDU6XHRcdHZlcmJvc2UoZW52LCBcJiMzNDttYXBfcHRyIGFjY2VzcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgQ09ORklHX0RFQlVHX0lORk9fQlRGXFxuXCYjMzQ7KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjQ2LVx0XHRyZXR1cm4gLUVOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTA2OD1zdGF0aWMgaW50IGNoZWNrX3BzZXVkb19idGZfaWQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTkwODQtXHRcdGlmICghYnRmX3ZtbGludXgpIHtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTA4NTpcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7a2VybmVsIGlzIG1pc3NpbmcgQlRGLCBtYWtlIHN1cmUgQ09ORklHX0RFQlVHX0lORk9fQlRGPXkgaXMgc3BlY2lmaWVkIGluIEtjb25maWcuXFxuXCYjMzQ7KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTA4Ni1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjA5Nzk9c3RydWN0IGJ0ZiAqYnBmX2dldF9idGZfdm1saW51eCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4My1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyMDk4NDpcdGlmICghYnRmIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpIHtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4NS1cdFx0bXV0ZXhfbG9jayhcdTAwMjZidGZfdm1saW51eF9sb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQzNjgKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQlRGIFBhcnNpbmcgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhpcyBCVEYgcGFyc2luZyByb3V0aW5lLCBzcGVjaWZpY2FsbHkgYGJ0Zl9wYXJzZSgpYC4gSSBrbm93IHdlICpkb24mIzM5O3QqIG5lZWQgYERFQlVHX0lORk9fQlRGYCBmb3IgaXQsIHdoaWNoIGlzIGdvb2QuIEJ1dCBJIG5lZWQgdG8gbmFpbCBkb3duIHdoZXRoZXIgaXQgcmVsaWVzIG9uIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2Agb3IgbWF5YmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8ga3B0ciwgbGlzdF9oZWFkLCBvciByYl9yb290LiBJIHRoaW5rIEkgd2lsbCBzdGFydCBieSBmb2N1c2luZyBvbiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBUaGVuLCBJJiMzOTtsbCBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCBgYnRmX2ZpbmRfc3RydWN0X21ldGFgIGFuZCBgYnRmX3BhcnNlX3N0cnVjdF9tZXRhc2AgdG8gdW5kZXJzdGFuZCBob3cgdGhleSBhcmUgaW52b2x2ZWQuIFRoZSBuZXh0IG9idmlvdXMgc3RlcCBpcyB0byBmaWd1cmUgb3V0IHdoZXJlIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAgbGl2ZXMgYW5kIGhvdyBpdCYjMzk7cyBhY3R1YWxseSAqdXNlZCouIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBwcmV0dHkgY2xlYXIgcGljdHVyZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9maW5kX3N0cnVjdF9tZXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYz00MjgzPWludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4tLVxua2VybmVsL2JwZi9idGYuYy00MzE2LVx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xua2VybmVsL2JwZi9idGYuYzo0MzE3Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzE4LVx0XHRpZiAoIW1ldGEpXG4tLVxua2VybmVsL2JwZi9idGYuYz00MzI1PXN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNDAtXG5rZXJuZWwvYnBmL2J0Zi5jOjQzNDE6XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzQyLVx0aWYgKCFtZXRhKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTg0ND1idGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0Zilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjQtXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NjU6c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxua2VybmVsL2JwZi9idGYuYy01OTY2LXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTc0NDg9aW50IGJ0Zl9zdHJ1Y3RfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csXG4tLVxua2VybmVsL2JwZi9idGYuYy03NDY0LVxua2VybmVsL2JwZi9idGYuYzo3NDY1Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBpZCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjYtXHRcdGlmICghbWV0YSlcbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYz04MTQ9dm9pZCBicGZfb2JqX2ZyZWVfZmllbGRzKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iailcbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy04NTAtXHRcdFx0aWYgKCFidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSkge1xua2VybmVsL2JwZi9zeXNjYWxsLmM6ODUxOlx0XHRcdFx0cG9pbnRlZV9zdHJ1Y3RfbWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGZpZWxkLVx1MDAzZWtwdHIuYnRmLFxua2VybmVsL2JwZi9zeXNjYWxsLmMtODUyLVx0XHRcdFx0XHRcdFx0XHRcdCAgIGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkKTtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9Mzc2PXN0YXRpYyBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVnX2J0Zl9yZWNvcmQoY29uc3Qgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMzgzLVx0fSBlbHNlIGlmICh0eXBlX2lzX3B0cl9hbGxvY19vYmoocmVnLVx1MDAzZXR5cGUpKSB7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6Mzg0Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEocmVnLVx1MDAzZWJ0ZiwgcmVnLVx1MDAzZWJ0Zl9pZCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMzg1LVx0XHRpZiAobWV0YSlcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9NDY3Nj1zdGF0aWMgc3RydWN0IGJ0Zl9yZWNvcmQgKmtwdHJfcG9pbnRlZV9idGZfcmVjb3JkKHN0cnVjdCBidGZfZmllbGQgKmtwdHJfZmllbGQpXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTQ2ODItXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6NDY4MzpcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShrcHRyX2ZpZWxkLVx1MDAzZWtwdHIuYnRmLFxua2VybmVsL2JwZi92ZXJpZmllci5jLTQ2ODQtXHRcdFx0XHQgICAga3B0cl9maWVsZC1cdTAwM2VrcHRyLmJ0Zl9pZCk7XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTEzODcyPXN0YXRpYyBpbnQgY2hlY2tfc3BlY2lhbF9rZnVuYyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTM4LVxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTM5Olx0XHRzdHJ1Y3RfbWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKHJldF9idGYsIHJldF9idGZfaWQpO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTQwLVx0XHRpZiAoaXNfYnBmX3BlcmNwdV9vYmpfbmV3X2tmdW5jKG1ldGEtXHUwMDNlZnVuY19pZCkpIHtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTM5NjctXHRcdGluc25fYXV4LVx1MDAzZWtwdHJfc3RydWN0X21ldGEgPVxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTY4Olx0XHRcdGJ0Zl9maW5kX3N0cnVjdF9tZXRhKG1ldGEtXHUwMDNlYXJnX2J0Zixcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xMzk2OS1cdFx0XHRcdFx0ICAgICBtZXRhLVx1MDAzZWFyZ19idGZfaWQpO1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xNDA0Mz1zdGF0aWMgaW50IGNoZWNrX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDE0OS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNDE1MDpcdFx0c3RydWN0X21ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShtZXRhLmFyZ19idGYsIG1ldGEuYXJnX2J0Zl9pZCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTQxNTEtXHRcdGlmIChzdHJ1Y3RfbWV0YSBcdTAwMjZcdTAwMjYgYnRmX3JlY29yZF9oYXNfbm1pX3Vuc2FmZV9maWVsZHMoc3RydWN0X21ldGEtXHUwMDNlcmVjb3JkKSkge1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDI2My1cdFx0aW5zbl9hdXgtXHUwMDNlaW5zZXJ0X29mZiA9IHJlZ3NbQlBGX1JFR18yXS52YXJfb2ZmLnZhbHVlO1xua2VybmVsL2JwZi92ZXJpZmllci5jOjE0MjY0Olx0XHRpbnNuX2F1eC1cdTAwM2VrcHRyX3N0cnVjdF9tZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEobWV0YS5hcmdfYnRmLCBtZXRhLmFyZ19idGZfaWQpO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTE0MjY1LVx0XHRyZWZfY29udmVydF9vd25pbmdfbm9uX293bmluZyhlbnYsIGlkKTtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTQ0NzEtXHRcdFx0XHRpbnNuX2F1eC1cdTAwM2VrcHRyX3N0cnVjdF9tZXRhID1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNDQ3MjpcdFx0XHRcdFx0YnRmX2ZpbmRfc3RydWN0X21ldGEobWV0YS5hcmdfYnRmLFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE0NDczLVx0XHRcdFx0XHRcdFx0ICAgICBtZXRhLmFyZ19idGZfaWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjIzOQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIEJURiBTdHJ1Y3R1cmUgTWV0YWRhdGEgUGFyc2luZyoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIGBidGZfcGFyc2Vfc3RydWN0X21ldGFzYC4gTXkgaW5pdGlhbCBodW5jaCBpcyB0aGF0IGl0JiMzOTtzIGdvaW5nIHRvIGJlIHRoZSBjZW50cmFsIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBhY3R1YWxseSBleHRyYWN0aW5nIHRoZSBzdHJ1Y3R1cmUgbWV0YWRhdGEgZnJvbSB0aGUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIGRhdGEgaW4gYGtlcm5lbC9icGYvYnRmLmNgLiBHaXZlbiB0aGF0IEJURiBpcyB0aGUgZm91bmRhdGlvbiBmb3IgZW5oYW5jZWQgZGVidWdnaW5nIGFuZCBpbnRyb3NwZWN0aW9uIG9mIEJQRiBwcm9ncmFtcywgYSBkZWVwZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIHN0cnVjdHVyZSBtZXRhZGF0YSBpcyBoYW5kbGVkIGlzIGNydWNpYWwuIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGludm9sdmUgc29tZSBjbGV2ZXIgcG9pbnRlciBhcml0aG1ldGljLCBiaXRmaWVsZCBpbnRlcnByZXRhdGlvbiwgYW5kIHBvdGVudGlhbCB1c2Ugb2YgaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVjdXJzaXZlIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHVyZXMgYW5kIHVuaW9ucy4gSSYjMzk7bSBleHBlY3Rpbmcgc29tZSBlcnJvciBoYW5kbGluZyBhcm91bmQgbWFsZm9ybWVkIEJURiBkYXRhLCBhbmQgcHJvYmFibHkgc29tZSBjaGVja3MgZm9yIGFsaWdubWVudCBjb25zdHJhaW50cywgZXNwZWNpYWxseSBjb25zaWRlcmluZyBob3cgQlBGIHdvcmtzLiBJdCYjMzk7bGwgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGhvdyBpdCByZWNvbmNpbGVzIHRoZSBCVEYgaW5mb3JtYXRpb24gd2l0aCB0aGUgY3VycmVudCBrZXJuZWwmIzM5O3MgZGF0YSBsYXlvdXQuIEkmIzM5O20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGhhbmRsZXMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgYW5kIGFueSBwb3RlbnRpYWwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGluIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gTGV0JiMzOTtzIHNlZSBpZiBteSBwcmVsaW1pbmFyeSBhc3N1bXB0aW9ucyBhcmUgb24gdGhlIG1vbmV5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1ODQ0LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzU4NDQ6XHRidGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0ZilcbjU4NDU6XHR7XG41ODQ2Olx0XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiID0gTlVMTDtcbjU4NDc6XHRcdHN0cnVjdCBidGZfaWRfc2V0ICphb2Y7XG41ODQ4Olx0XHRpbnQgaSwgbiwgaWQsIHJldDtcbjU4NDk6XHRcbjU4NTA6XHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnRmX2lkX3NldCwgY250KSAhPSAwKTtcbjU4NTE6XHRcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJ0Zl9pZF9zZXQpICE9IHNpemVvZih1MzIpKTtcbjU4NTI6XHRcbjU4NTM6XHRcdGFvZiA9IGttYWxsb2Nfb2JqKCphb2YsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuNTg1NDpcdFx0aWYgKCFhb2YpXG41ODU1Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuNTg1NjpcdFx0YW9mLVx1MDAzZWNudCA9IDA7XG41ODU3Olx0XG41ODU4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGFsbG9jX29ial9maWVsZHMpOyBpJiM0MzsmIzQzOykge1xuNTg1OTpcdFx0XHQvKiBUcnkgdG8gZmluZCB3aGV0aGVyIHRoaXMgc3BlY2lhbCB0eXBlIGV4aXN0cyBpbiB1c2VyIEJURiwgYW5kXG41ODYwOlx0XHRcdCAqIGlmIHNvIHJlbWVtYmVyIGl0cyBJRCBzbyB3ZSBjYW4gZWFzaWx5IGZpbmQgaXQgYW1vbmcgbWVtYmVyc1xuNTg2MTpcdFx0XHQgKiBvZiBzdHJ1Y3RzIHRoYXQgd2UgaXRlcmF0ZSBpbiB0aGUgbmV4dCBsb29wLlxuNTg2MjpcdFx0XHQgKi9cbjU4NjM6XHRcdFx0c3RydWN0IGJ0Zl9pZF9zZXQgKm5ld19hb2Y7XG41ODY0Olx0XG41ODY1Olx0XHRcdGlkID0gYnRmX2ZpbmRfYnlfbmFtZV9raW5kKGJ0ZiwgYWxsb2Nfb2JqX2ZpZWxkc1tpXSwgQlRGX0tJTkRfU1RSVUNUKTtcbjU4NjY6XHRcdFx0aWYgKGlkIFx1MDAzYyAwKVxuNTg2NzpcdFx0XHRcdGNvbnRpbnVlO1xuNTg2ODpcdFxuNTg2OTpcdFx0XHRuZXdfYW9mID0ga3JlYWxsb2MoYW9mLCBzdHJ1Y3Rfc2l6ZShuZXdfYW9mLCBpZHMsIGFvZi1cdTAwM2VjbnQgJiM0MzsgMSksXG41ODcwOlx0XHRcdFx0XHQgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbjU4NzE6XHRcdFx0aWYgKCFuZXdfYW9mKSB7XG41ODcyOlx0XHRcdFx0cmV0ID0gLUVOT01FTTtcbjU4NzM6XHRcdFx0XHRnb3RvIGZyZWVfYW9mO1xuNTg3NDpcdFx0XHR9XG41ODc1Olx0XHRcdGFvZiA9IG5ld19hb2Y7XG41ODc2Olx0XHRcdGFvZi1cdTAwM2VpZHNbYW9mLVx1MDAzZWNudCYjNDM7JiM0MztdID0gaWQ7XG41ODc3Olx0XHR9XG41ODc4Olx0XG41ODc5Olx0XHRuID0gYnRmX25yX3R5cGVzKGJ0Zik7XG41ODgwOlx0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOykge1xuNTg4MTpcdFx0XHQvKiBUcnkgdG8gZmluZCBpZiB0aGVyZSBhcmUga3B0cnMgaW4gdXNlciBCVEYgYW5kIHJlbWVtYmVyIHRoZWlyIElEICovXG41ODgyOlx0XHRcdHN0cnVjdCBidGZfaWRfc2V0ICpuZXdfYW9mO1xuNTg4MzpcdFx0XHRzdHJ1Y3QgYnRmX2ZpZWxkX2luZm8gdG1wO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzI1MAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDc4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgQlRGIExvYWRpbmcgYW5kIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byBob3cgYGFsbG9jX29ial9maWVsZHNgIHdvcmtzIGFuZCBob3cgQlRGIGxvYWRpbmcgcGxheXMgYSByb2xlLiBJdCBsb29rcyBsaWtlIHdoZW4gYSBCVEYgYmxvYiBpcyBsb2FkZWQgdXNpbmcgYGJwZihCUEZfQlRGX0xPQUQsIC4uLilgLCB0aGUga2VybmVsIGNhbGxzIGBidGZfcGFyc2UoKWAuIFdpdGhpbiBgYnRmX3BhcnNlKClgLCBgYnRmX3BhcnNlX3N0cnVjdF9tZXRhcygpYCBydW5zIG9uIHRoZSB1c2VyLXByb3ZpZGVkIEJURiBkYXRhLiBUaGF0JiMzOTtzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIElmIHN0cnVjdCBtZXRhZGF0YSBpcyBmb3VuZCwgdGhlIGNvZGUgaXRlcmF0ZXMgdGhyb3VnaCBpdCwgY2FsbGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoKWAgYW5kIHRoZW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAuCgpJIHNlZSB0aGF0IHRoZSBgbG9jYWxfa3B0cl9vd25lcnNoaXAuY2Agc2VsZnRlc3QgZGVtb25zdHJhdGVzIHRoaXMgZXhhY3QgZmxvdy4gSXQgY3JlYXRlcyBhbiBlbXB0eSBCVEYsIGFkZHMgZGlmZmVyZW50IHR5cGVzIChpbnQsIGJwZl9zcGluX2xvY2ssIGJwZl9saXN0X2hlYWQsIGV0Yy4pLCBhbmQgbG9hZHMgaXQgd2l0aCBgYnRmX19sb2FkX2ludG9fa2VybmVsKClgLCB3aGljaCB0cmlnZ2VycyB0aGF0IGBicGYoQlBGX0JURl9MT0FELCAuLi4pYCBjYWxsLCB1bHRpbWF0ZWx5IGhpdHRpbmcgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAuCgpOb3csIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS4gQ2xlYXJseSwgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgZXNzZW50aWFsLiBCdXQgZG9lcyBgQlBGX1NZU0NBTExgIGhhdmUgYW55IGRlcGVuZGVuY2llcz8gTGV0IG1lIGNoZWNrIHRoZSBga2VybmVsL2JwZi9LY29uZmlnYC4gQWgsIGBCUEZfU1lTQ0FMTGAgc2VsZWN0cyBgQlBGYC4gTm8gZGlyZWN0IGBkZXBlbmRzIG9uYCB0aG91Z2guCgpXaGF0IGFib3V0IGBERUJVR19JTkZPX0JURmA/IElzIHRoYXQgbmVjZXNzYXJ5IGZvciBgQlBGX0JURl9MT0FEYD8gTGV0IG1lIGxvb2sgYXQgYGJwZl9idGZfbG9hZGAgaW4gYGtlcm5lbC9icGYvc3lzY2FsbC5jYC4gSXQgZ29lcyB0byBgYnRmX25ld19mZCgpYCB0aGVuIHRvIGBidGZfcGFyc2UoKWAuIFRoZSBgYnRmX3BhcnNlYCBmdW5jdGlvbiBkb2VzbiYjMzk7dCBzZWVtIHRvIGNoZWNrIGZvciBgQ09ORklHX0RFQlVHX0lORk9fQlRGYC4gIEludGVyZXN0aW5nLiBBbHRob3VnaCBjb21tb25seSBlbmFibGVkIGZvciBCUEYgZnV6emluZywgaXQgc2VlbXMgc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgY3JpdGljYWwgY29uZmlnLCBhcyBpdCBidWlsZHMgYGJ0Zi5jYC4KCkkmIzM5O2xsIGRvdWJsZS1jaGVjayB0byBlbnN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgY29uZmlncyBuZWVkZWQuIElzIGBCUEZfU1lTQ0FMTGAgcGFydCBvZiBhICYjMzQ7QlBGIHN1YnN5c3RlbSYjMzQ7IG1lbnUsIGFzIHRoYXQgaXMgc29tZXRpbWVzIGEgZmFjdG9yPyBJJiMzOTtsbCBjaGVjayBga2VybmVsL2JwZi9LY29uZmlnYCwgc3RhcnRpbmcgYXQgdGhlIHRvcC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRcbiAgIDM6XHQjIEJQRiBpbnRlcnByZXRlciB0aGF0LCBmb3IgZXhhbXBsZSwgY2xhc3NpYyBzb2NrZXQgZmlsdGVycyBkZXBlbmQgb24uXG4gICA0Olx0Y29uZmlnIEJQRlxuICAgNTpcdFx0Ym9vbFxuICAgNjpcdFx0c2VsZWN0IENSWVBUT19MSUJfU0hBMjU2XG4gICA3Olx0XG4gICA4Olx0IyBVc2VkIGJ5IGFyY2hzIHRvIHRlbGwgdGhhdCB0aGV5IHN1cHBvcnQgQlBGIEpJVCBjb21waWxlciBwbHVzIHdoaWNoXG4gICA5Olx0IyBmbGF2b3VyLiBPbmx5IG9uZSBvZiB0aGUgdHdvIGNhbiBiZSBzZWxlY3RlZCBmb3IgYSBzcGVjaWZpYyBhcmNoIHNpbmNlXG4gIDEwOlx0IyBlQlBGIEpJVCBzdXBlcnNlZGVzIHRoZSBjQlBGIEpJVC5cbiAgMTE6XHRcbiAgMTI6XHQjIENsYXNzaWMgQlBGIEpJVCAoY0JQRilcbiAgMTM6XHRjb25maWcgSEFWRV9DQlBGX0pJVFxuICAxNDpcdFx0Ym9vbFxuICAxNTpcdFxuICAxNjpcdCMgRXh0ZW5kZWQgQlBGIEpJVCAoZUJQRilcbiAgMTc6XHRjb25maWcgSEFWRV9FQlBGX0pJVFxuICAxODpcdFx0Ym9vbFxuICAxOTpcdFxuICAyMDpcdCMgS0FTQU4gc3VwcG9ydCBmb3IgSklUIGNvbXBpbGVyXG4gIDIxOlx0Y29uZmlnIEhBVkVfRUJQRl9KSVRfS0FTQU5cbiAgMjI6XHRcdGJvb2xcbiAgMjM6XHRcbiAgMjQ6XHQjIFVzZWQgYnkgYXJjaHMgdG8gdGVsbCB0aGF0IHRoZXkgd2FudCB0aGUgQlBGIEpJVCBjb21waWxlciBlbmFibGVkIGJ5XG4gIDI1Olx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cbiAgMjY6XHRjb25maWcgQVJDSF9XQU5UX0RFRkFVTFRfQlBGX0pJVFxuICAyNzpcdFx0Ym9vbFxuICAyODpcdFxuICAyOTpcdG1lbnUgXCYjMzQ7QlBGIHN1YnN5c3RlbVwmIzM0O1xuICAzMDpcdFxuICAzMTpcdGNvbmZpZyBCUEZfU1lTQ0FMTFxuICAzMjpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcJiMzNDtcbiAgMzM6XHRcdHNlbGVjdCBCUEZcbiAgMzQ6XHRcdHNlbGVjdCBJUlFfV09SS1xuICAzNTpcdFx0c2VsZWN0IE5FRURfVEFTS1NfUkNVXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5MDQyCgkJCQkJCQlvdXRwdXQ6IDIwNwoJCQkJCQkJdGhvdWdodHM6IDg5MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGlzIEJQRiBQYXRjaCBmb3IgRnV6emluZyoqCgpBbHJpZ2h0LCBzbyBJJiMzOTt2ZSBnb3QgYSBnb29kIGhhbmRsZSBvbiB0aGlzIHBhdGNoLiBgQlBGX1NZU0NBTExgIGlzIHRoZSBrZXkgY29uZmlndXJhdGlvbiBoZXJlLCB0aGF0JiMzOTtzIHRoZSBkaXJlY3QgY29uZmlnLiBOb3csIGxldCYjMzk7cyBuYWlsIGRvd24gdGhlc2UgRm9jdXNTeW1ib2xzLiBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIG5vbi11YmlxdWl0b3VzIGZ1bmN0aW9ucyB0aGF0IGFyZSAqYWx0ZXJlZCogb3IgKmFkZGVkKiBpbiB0aGlzIHBhdGNoLCBhcyBwZXIgdGhlIGd1aWRlbGluZXMuIEkgbmVlZCB0byBhdm9pZCBsaXN0aW5nIGNvbW1vbiBmdW5jdGlvbnMgdGhhdCB3b3VsZCBqdXN0IGRpbHV0ZSB0aGUgZnV6emluZyBlZmZvcnQuCgpPa2F5LCBsZXQmIzM5O3Mgc2VlLi4uIGxvb2tpbmcgYXQgdGhlIGNvZGUgY2hhbmdlczoKCiogICBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGA6IEFkZGVkLCBzdGF0aWMgaW4gYGJ0Zi5jYC4gWWVwLCB0aGF0JiMzOTtzIHNwZWNpZmljLgoqICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgOiBBZGRlZCwgcmVjdXJzaXZlIHN0YXRpYyBpbiBgYnRmLmNgLiBTb3VuZHMgc3BlY2lmaWMgdG8gdGhpcyBuZXcgbG9naWMuCiogICBgYnRmX293bmVkX3R5cGVfaWR4YDogQWRkZWQsIHN0YXRpYyBpbiBgYnRmLmNgLiBBbm90aGVyIG5ldyBmdW5jdGlvbiByZWxhdGVkIHRvIHRoZSBvd25lcnNoaXAgdHJhY2tpbmcuCiogICBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgOiBNb2RpZmllZCwgbm9uLXN0YXRpYyBpbiBgYnRmLmNgLiBDcnVjaWFsLCB0aGUgY3ljbGUgY2hlY2sgbG9naWMgd2FzIHNpbXBsaWZpZWQgaW4gdGhpcy4KKiAgIGBidGZfcGFyc2VgOiBNb2RpZmllZCwgY2FsbGVyIGluIGBidGYuY2AuIEFkZGVkIGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBEZWZpbml0ZWx5IHJlbGV2YW50LCBzaW5jZSBpdCYjMzk7cyB0aGUgY2FsbGVyLgoqICAgYGJ0Zl9uZXdfZmRgIG9yIGBicGZfYnRmX2xvYWRgOiBUaGUgZW50cnkgcG9pbnQgZm9yIGxvYWRpbmcgQlRGLiBOb3csIHRoYXQmIzM5O3MgYSBrZXkgZW50cnkgcG9pbnQuIExldCYjMzk7cyB1c2UgYGJwZl9idGZfbG9hZGAuCgpTbywgaXQmIzM5O3MgY2xlYXIgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCB3YXMgaW5kZWVkIG1vZGlmaWVkLiBHb29kLiBBbmQgdGhvc2UgdGhyZWUgYWRkZWQgZnVuY3Rpb25zIChgYnRmX293bmVkX3R5cGVfaWR4YCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGApIGFyZSBhbGwgbmV3LCBzbywgdGhleSBhcmUgbm90IHViaXF1aXRvdXMuIGBidGZfcGFyc2VgIGlzIGFsc28gYWRkZWQgYW5kIHJlbGV2YW50IGJlY2F1c2UgaXQgY2FsbHMgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLgoKTm93LCBhY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9ucywgSSBuZWVkIHRvIGZvY3VzIG9uIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgdGhlIG5ldyBsb2dpYyBvciBlbnRyeXBvaW50cy4gVGhlc2UgZnVuY3Rpb25zIGFsbCBmaXQgdGhhdCBiaWxsIHBlcmZlY3RseToKLSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAKLSBgYnRmX293bmVyc2hpcF9kZXB0aGAKLSBgYnRmX293bmVkX3R5cGVfaWR4YAotIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AKLSBgYnBmX2J0Zl9sb2FkYAoKTGV0JiMzOTtzIG1ha2Ugc3VyZSB0aGVzZSBhcmUgdmFsaWQgZnVuY3Rpb24gc3ltYm9sczogWWVzLCBhbGwgb2YgdGhlbSBhcmUgcmVhbCBmdW5jdGlvbiBzeW1ib2xzIGluIGBidGYuY2AgYW5kIGBzeXNjYWxsLmNgLgoKT2theSwgbGV0JiMzOTtzIGRvIGEgZmluYWwgY2hlY2s6IElzIHRoaXMgcGF0Y2ggYFdvcnRoRnV6emluZ2A/IEFic29sdXRlbHkuIEl0JiMzOTtzIG1vZGlmeWluZyBga2VybmVsL2JwZi9idGYuY2AsIGltcGxlbWVudGluZyBhIG5ldyBvd25lcnNoaXAgZ3JhcGggZGVwdGgtY2hlY2tpbmcgYWxnb3JpdGhtIHRvIHByZXZlbnQgY3ljbGVzIHdoZW4gcGFyc2luZyBCVEYgb2JqZWN0cyBsb2FkZWQgdmlhIGBicGYoQlBGX0JURl9MT0FELCAuLi4pYC4gVXNlci1zdXBwbGllZCBCVEYgaW5wdXQsIHJlYWNoYWJsZSBrZXJuZWwgY29kZSwgbm8gc3BlY2lhbCBoYXJkd2FyZS4gVGhpcyBpcyBwcmltZSBmdXp6aW5nIHRlcnJpdG9yeS4KCkFuZCBmaW5hbGx5LCBgRW5hYmxlQ29uZmlnc2A6IGBCUEZfU1lTQ0FMTGAuIFNpbmNlIGBCUEZfU1lTQ0FMTGAgc2VsZWN0cyBgQlBGYCwgaXQmIzM5O3MgZ29vZCBwcmFjdGljZSB0byBlbmFibGUgYm90aCwgYWx0aG91Z2ggaXQmIzM5O3MgcmVkdW5kYW50LgoKU28sIGJlZm9yZSBJIGNhbGwgYHNldC1yZXN1bHRzYCwgbGV0JiMzOTtzIHZlcmlmeToKCiogICBgV29ydGhGdXp6aW5nYDogVHJ1ZQoqICAgYEVuYWJsZUNvbmZpZ3NgOiBgWyYjMzQ7QlBGX1NZU0NBTEwmIzM0O11gCiogICBgRm9jdXNTeW1ib2xzYDogYFsmIzM0O2J0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgmIzM0OywgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssICYjMzQ7YnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMmIzM0OywgJiMzNDticGZfYnRmX2xvYWQmIzM0O11gCiogICBSZWFzb25pbmc6IENvbmNpc2UgYW5kIGNvbXBsZXRlLgoKUmVhZHkgdG8gcm9sbC4gTGV0JiMzOTtzIGludm9rZSBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2JwZl9idGZfbG9hZCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lZF90eXBlX2lkeCYjMzQ7LAogICAgJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7LAogICAgJiMzNDticGZfYnRmX2xvYWQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBleHRlbmRzIEJURiBvd25lcnNoaXAgYW5kIGN5Y2xlIHZhbGlkYXRpb24gYnkgaW50cm9kdWNpbmcgZGVwdGgtYm91bmRlZCBncmFwaCB0cmF2ZXJzYWwgKGJ0Zl9vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgpIHRvIHZhbGlkYXRlIG93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGluIHVzZXItbG9hZGVkIEJURiB0eXBlcyAoc3VjaCBhcyBncmFwaCByb290cyBhbmQga3B0cnMpLiBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBpcyBkaXJlY3RseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBicGYoKSBzeXNjYWxsIChCUEZfQlRGX0xPQUQpLiBGdXp6aW5nIGNhbiB2ZXJpZnkgcmVjdXJzaW9uIGJvdW5kcywgY3ljbGUgZGV0ZWN0aW9uIGNvcnJlY3RuZXNzLCBhbmQgZWRnZSBjYXNlcyBpbiBwYXJzaW5nIGFyYml0cmFyeSB1c2VyLXN1cHBsaWVkIEJURiBkYXRhLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4yOW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4yOW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGRlcHRoIGFuZCBkZXRlY3QgY3ljbGVzIGFjcm9zcyBncmFwaCByb290cyAoYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QpIGFuZCBsb2NhbCBrcHRycyAoQlBGX0tQVFJfUkVGLCBCUEZfS1BUUl9QRVJDUFUpLCBwcmV2ZW50aW5nIGRlZXAga2VybmVsIHJlY3Vyc2lvbiBkdXJpbmcgb2JqZWN0IGNsZWFudXAuXG5cbjEuIE1lbW9yeSBhbGxvY2F0aW9uOiBUaGUgb25seSBkeW5hbWljIGFsbG9jYXRpb24gaW50cm9kdWNlZCBpcyB0aGUgdGVtcG9yYXJ5IGBkZXB0aGAgYXJyYXkgaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAsIHdoaWNoIGlzIGFsbG9jYXRlZCB1c2luZyBga3ZjYWxsb2MoKWAgKGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQpIGFuZCBmcmVlZCB3aXRoIGBrdmZyZWUoKWAgYmVmb3JlIHJldHVybmluZy5cbjIuIExvY2FsIHZhcmlhYmxlcyBhbmQgZmllbGRzOiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBzdHJ1Y3QgZmllbGRzIGluc3BlY3RlZCBvciBwb3B1bGF0ZWQgKGByZXRgLCBgbWF4X2RlcHRoYCwgYGJ0Zl9pZGAsIGBkZXB0aFtpZHhdYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxuNC4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoc3VjaCBhcyBpbmRleGluZyBpc3N1ZXMsIHBvaW50ZXIgYXJpdGhtZXRpYywgb3IgcmVjdXJzaW9uIGxpbWl0cykgd291bGQgYmUgY292ZXJlZCBieSBLQVNBTiBvciBzdGFuZGFyZCBrZXJuZWwgY2hlY2tzLCBub3QgS01TQU4uXG5cblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZjU4NDUyNWY5OTYwMGY2ZjdhZDdiZGI4OWJlYWVjYzVmYjQ4ZGY4MQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDE2OjI4OjMyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmMKaW5kZXggN2RhZjRjMjg2YzliMi4uOTIyMTdhMTRiOWQzZCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9idGYuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2J0Zi5jCkBAIC00Mjg0LDEzICYjNDM7NDI4NCwxMCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKQogewogCWludCBpOwogCi0JLyogVGhlcmUgYXJlIHRocmVlIHR5cGVzIHRoYXQgc2lnbmlmeSBvd25lcnNoaXAgb2Ygc29tZSBvdGhlciB0eXBlOgotCSAqICBrcHRyX3JlZiwgYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QuCi0JICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJiMzOTt0IHN0b3JlCi0JICogcmVmZXJlbmNlcyB0byBwcm9ncmFtIGFsbG9jYXRlZCBsb2NhbCB0eXBlcy4KLQkgKgotCSAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXAKLQkgKiBkb2VzIG5vdCBmb3JtIGN5Y2xlcy4KJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lCiYjNDM7CSAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXMKJiM0MzsJICogYmVlbiBmaXhlZCB1cC4KIAkgKi8KIAlpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy0mZ3Q7ZmllbGRfbWFzayAmYW1wOyAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKQogCQlyZXR1cm4gMDsKQEAgLTQzMjEsNTEgJiM0Mzs0MzE4LDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiAJCWlmICghbWV0YSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZWMtJmd0O2ZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtJmd0O3JlY29yZDsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkJLyogV2UgbmVlZCB0byBzZXQgdmFsdWVfcmVjIGZvciBhbGwgcm9vdCB0eXBlcywgYnV0IG5vIG5lZWQKLQkJICogdG8gY2hlY2sgb3duZXJzaGlwIGN5Y2xlIGZvciBhIHR5cGUgdW5sZXNzIGl0JiMzOTtzIGFsc28gYQotCQkgKiBub2RlIHR5cGUuCi0JCSAqLwotCQlpZiAoIShyZWMtJmd0O2ZpZWxkX21hc2sgJmFtcDsgQlBGX0dSQVBIX05PREUpKQomIzQzO3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwKJiM0MzsJCQkgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7CiYjNDM7CXUzMiBidGZfaWQ7CiYjNDM7CiYjNDM7CWlmIChmaWVsZC0mZ3Q7dHlwZSAmYW1wOyBCUEZfR1JBUEhfUk9PVCkgewomIzQzOwkJYnRmX2lkID0gZmllbGQtJmd0O2dyYXBoX3Jvb3QudmFsdWVfYnRmX2lkOwomIzQzOwl9IGVsc2UgaWYgKGZpZWxkLSZndDt0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC0mZ3Q7dHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHsKJiM0MzsJCWlmIChidGZfaXNfa2VybmVsKGZpZWxkLSZndDtrcHRyLmJ0ZikpCiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQlidGZfaWQgPSBmaWVsZC0mZ3Q7a3B0ci5idGZfaWQ7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQomIzQzOwomIzQzOwltZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpOwomIzQzOwlpZiAoIW1ldGEpCiYjNDM7CQlyZXR1cm4gZmllbGQtJmd0O3R5cGUgJmFtcDsgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDsKJiM0MzsJcmV0dXJuIG1ldGEgLSB0YWItJmd0O3R5cGVzOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZAomIzQzOyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0CiYjNDM7ICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXQKJiM0MzsgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYQomIzQzOyAqIG5vbi1yZWN1cnNpbmcgZHJvcC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDgKJiM0MzsKJiM0MztzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsCiYjNDM7CQkJICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi0mZ3Q7dHlwZXNbaWR4XS5yZWNvcmQ7CiYjNDM7CWludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7CiYjNDM7CiYjNDM7CWlmICghZGVwdGhfbGVmdCkKJiM0MzsJCXJldHVybiAtRUxPT1A7CiYjNDM7CWlmIChkZXB0aFtpZHhdKQomIzQzOwkJZ290byBkb25lOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgcmVjLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsICZhbXA7cmVjLSZndDtmaWVsZHNbaV0pOwomIzQzOwkJaWYgKHJldCA9PSAtRU5PRU5UKQogCQkJY29udGludWU7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJcmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCW1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7CiYjNDM7CX0KJiM0MzsJZGVwdGhbaWR4XSA9IG1heF9kZXB0aCAmIzQzOyAxOwomIzQzO2RvbmU6CiYjNDM7CXJldHVybiBkZXB0aFtpZHhdICZndDsgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07CiYjNDM7fQogCi0JCS8qIFdlIG5lZWQgdG8gZW5zdXJlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFtb25nIGFsbCB0eXBlcy4gVGhlCi0JCSAqIHByb3BlciB3YXkgdG8gZG8gaXQgd291bGQgYmUgdG8gdG9wb2xvZ2ljYWxseSBzb3J0IGFsbCBCVEYKLQkJICogSURzIGJhc2VkIG9uIHRoZSBvd25lcnNoaXAgZWRnZXMsIHNpbmNlIHRoZXJlIGNhbiBiZSBtdWx0aXBsZQotCQkgKiBicGZfe2xpc3RfaGVhZCxyYl9ub2RlfSBpbiBhIHR5cGUuIEluc3RlYWQsIHdlIHVzZSB0aGUKLQkJICogZm9sbG93aW5nIHJlc2FvbmluZzoKLQkJICoKLQkJICogLSBBIHR5cGUgY2FuIG9ubHkgYmUgb3duZWQgYnkgYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0Ci0JCSAqICAgaGFzIGEgYnBmX3tsaXN0LHJifV9ub2RlLiBMZXQmIzM5O3MgY2FsbCB0aGVzZSBub2RlIHR5cGVzLgotCQkgKiAtIEEgdHlwZSBjYW4gb25seSBfb3duXyBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQgaGFzIGEKLQkJICogICBicGZfe2xpc3RfaGVhZCxyYl9yb290fS4gTGV0JiMzOTtzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy4KLQkJICoKLQkJICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHMKLQkJICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy4KLQkJICoKLQkJICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6Ci0JCSAqCi0JCSAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXAKLQkJICogY2hhaW4gY2FuIGJlOgotCQkgKglBIC0mZ3Q7IEIgLSZndDsgQwotCQkgKiBXaGVyZToKLQkJICogLSBBIGlzIGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9yYl9yb290LgotCQkgKiAtIEIgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGUuZy4gaGFzIGJwZl9yYl9ub2RlIGFuZAotCQkgKiAgIGJwZl9saXN0X2hlYWQuCi0JCSAqIC0gQyBpcyBvbmx5IGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9saXN0X25vZGUKLQkJICoKLQkJICogV2hlbiBBIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBzb21lIG90aGVyIHR5cGUgYWxyZWFkeQotCQkgKiBvd25zIGl0IGluIHRoZSBCVEYgZG9tYWluLCBoZW5jZSBpdCBjYW4gbm90IG93bgotCQkgKiBhbm90aGVyIHJvb3QgdHlwZSB0aHJvdWdoIGFueSBvZiB0aGUgb3duZXJzaGlwIGVkZ2VzLgotCQkgKglBIC0mZ3Q7IEIKLQkJICogV2hlcmU6Ci0JCSAqIC0gQSBpcyBib3RoIGFuIHJvb3QgYW5kIG5vZGUuCi0JCSAqIC0gQiBpcyBvbmx5IGFuIG5vZGUuCi0JCSAqLwotCQlpZiAobWV0YS0mZ3Q7cmVjb3JkLSZndDtmaWVsZF9tYXNrICZhbXA7IEJQRl9HUkFQSF9ST09UKQotCQkJcmV0dXJuIC1FTE9PUDsKJiM0MztzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCQkgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpCiYjNDM7ewomIzQzOwl1OCAqZGVwdGg7CiYjNDM7CWludCBpLCByZXQgPSAwOwomIzQzOwomIzQzOwlkZXB0aCA9IGt2Y2FsbG9jKHRhYi0mZ3Q7Y250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7CiYjNDM7CWlmICghZGVwdGgpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHRhYi0mZ3Q7Y250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJcmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksCiYjNDM7CQkJCQkgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmV0ID0gMDsKIAl9Ci0JcmV0dXJuIDA7CiYjNDM7CWt2ZnJlZShkZXB0aCk7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LApAQCAtNjA2MCw2ICYjNDM7NjA5NCwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwKIAkJCWlmIChlcnIgJmx0OyAwKQogCQkJCWdvdG8gZXJyb3V0X21ldGE7CiAJCX0KJiM0MzsKJiM0MzsJCWVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpOwomIzQzOwkJaWYgKGVyciAmbHQ7IDApCiYjNDM7CQkJZ290byBlcnJvdXRfbWV0YTsKIAl9CiAKIAllcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csICZhbXA7ZW52LSZndDtsb2cpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCkBAIC03MTQsNyAmIzQzOzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpCiAJCQlicmVhazsKIAogCQllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKLQkJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShlcnIsIDAsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwogCQlidGZfX2ZyZWUoYnRmKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzczLDcgJiM0Mzs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKQogCQkJYnJlYWs7CiAKIAkJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7Ci0JCUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoZXJyLCAwLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKIAkJYnRmX19mcmVlKGJ0Zik7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmE0ODdhYTY4ZjJlZWYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jCkBAIC0wLDAgJiM0MzsxLDI5NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDticGYvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTUElOX0xPQ0sgMgomIzQzOyNkZWZpbmUgTElTVF9IRUFEIDMKJiM0MzsjZGVmaW5lIExJU1RfTk9ERSA0CiYjNDM7LyogS2VlcCBpbiBzeW5jIHdpdGggQlRGX01BWF9PV05FUlNISVBfREVQVEguICovCiYjNDM7I2RlZmluZSBNQVhfT1dORVJTSElQX0RFUFRIIDgKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJ0ZiAqaW5pdF9idGYodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkOwomIzQzOwomIzQzOwlidGYgPSBidGZfX25ld19lbXB0eSgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2J0Zl9fbmV3X2VtcHR5JiMzNDspKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CWlkID0gYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDtpbnQmIzM0OywgNCwgQlRGX0lOVF9TSUdORUQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgMSwgJiMzNDtidGZfX2FkZF9pbnQmIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfc3Bpbl9sb2NrJiMzNDssIDQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfc3Bpbl9sb2NrJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX2xpc3RfaGVhZCYjMzQ7LCAxNik7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBMSVNUX0hFQUQsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWQmIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfbGlzdF9ub2RlJiMzNDssIDI0KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3Rfbm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJcmV0dXJuIGJ0ZjsKJiM0MzsKJiM0MztlcnJfb3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYWRkX2xvY2FsX2twdHIoc3RydWN0IGJ0ZiAqYnRmLCBpbnQgcG9pbnRlZV9pZCwgY29uc3QgY2hhciAqdGFnKQomIzQzO3sKJiM0MzsJaW50IGlkOwomIzQzOwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3R5cGVfdGFnKGJ0ZiwgdGFnLCBwb2ludGVlX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoaWQsIDAsICYjMzQ7YnRmX19hZGRfdHlwZV90YWcmIzM0OykpCiYjNDM7CQlyZXR1cm4gaWQ7CiYjNDM7CWlkID0gYnRmX19hZGRfcHRyKGJ0ZiwgaWQpOwomIzQzOwlBU1NFUlRfR1QoaWQsIDAsICYjMzQ7YnRmX19hZGRfcHRyJiMzNDspOwomIzQzOwlyZXR1cm4gaWQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3Rfc2VsZl9jeWNsZShjb25zdCBjaGFyICp0YWcsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgdGFnKTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O3NlbGZfY3ljbGUmIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA3LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtuZXh0JiMzNDssIDYsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgc2VsZl9jeWNsZTo6bmV4dCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2FiYV9jeWNsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVycjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA5LCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtjeWNsZV9hJiMzNDssIDgpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7YiYjMzQ7LCA2LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2E6OmImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2N5Y2xlX2ImIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCAxMCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7YSYjMzQ7LCA4LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmEmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9taXhlZF9jeWNsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVycjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O21peGVkX293bmVyJiMzNDssIDIwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDcsICYjMzQ7YnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtyb290JiMzNDssIExJU1RfSEVBRCwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6cm9vdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bG9jayYjMzQ7LCBTUElOX0xPQ0ssIDEyOCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9jayYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgJiMzNDtjb250YWluczptaXhlZF9ub2RlOm5vZGUmIzM0OywgNywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA4LCAmIzM0O2J0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDttaXhlZF9ub2RlJiMzNDssIDMyKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDksICYjMzQ7YnRmX19hZGRfc3RydWN0IG1peGVkX25vZGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25vZGUmIzM0OywgTElTVF9OT0RFLCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O293bmVyJiMzNDssIDYsIDE5MiwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2FjeWNsaWNfZGVwdGgoaW50IGRlcHRoLCBib29sIGNoaWxkX2ZpcnN0LCBib29sIHNoYXJlZF9zdWZmaXgsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlpbnQgcHRyX2lkW01BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMV07CiYjNDM7CWludCBmaXJzdF9zdHJ1Y3RfaWQ7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnIsIGksIG4sIHBvaW50ZWVfaWQ7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWZpcnN0X3N0cnVjdF9pZCA9IDUgJiM0MzsgMiAqIGRlcHRoOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgZGVwdGg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoaSA9PSBkZXB0aCAtIDEpCiYjNDM7CQkJcG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aDsKJiM0MzsJCWVsc2UKJiM0MzsJCQlwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICYjNDM7IChjaGlsZF9maXJzdCA/IGRlcHRoIC0gMiAtIGkgOiBpICYjNDM7IDEpOwomIzQzOwkJcHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBwb2ludGVlX2lkLCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CQlpZiAocHRyX2lkW2ldICZsdDs9IDApCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZm9yIChuID0gMDsgbiAmbHQ7IGRlcHRoOyBuJiM0MzsmIzQzOykgewomIzQzOwkJY2hhciBuYW1lWzMyXTsKJiM0MzsJCWludCBvZmZzZXQgPSAwOwomIzQzOwomIzQzOwkJaSA9IGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAxIC0gbiA6IG47CiYjNDM7CQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7b3duZXJfJWQmIzM0OywgaSk7CiYjNDM7CQlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggJmFtcDsmYW1wOyAhaSA/IDE2IDogOCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IG4sICYjMzQ7YnRmX19hZGRfc3RydWN0IG93bmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKHNoYXJlZF9zdWZmaXggJmFtcDsmYW1wOyAhaSkgewomIzQzOwkJCS8qCiYjNDM7CQkJICogVmlzaXQgdGhlIHNoYXJlZCBzdWZmaXggdGhyb3VnaCB0aGUgc2hvcnRlciBwYXRoIGJlZm9yZQomIzQzOwkJCSAqIHJlYWNoaW5nIGl0IGFnYWluIHdpdGggbGVzcyByZW1haW5pbmcgZGVwdGguCiYjNDM7CQkJICovCiYjNDM7CQkJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O3N1ZmZpeCYjMzQ7LCBwdHJfaWRbMV0sIDAsIDApOwomIzQzOwkJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBvd25lcjo6c3VmZml4JiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQlvZmZzZXQgPSA2NDsKJiM0MzsJCX0KJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtuZXh0JiMzNDssIHB0cl9pZFtpXSwgb2Zmc2V0LCAwKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7cGxhaW5fbGVhZiYjMzQ7LCA0KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgcGxhaW5fbGVhZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dyYXBoX2RlcHRoKGJvb2wgcmJ0cmVlLCBpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlpbnQgcm9vdF90eXBlID0gTElTVF9IRUFELCBub2RlX3R5cGUgPSBMSVNUX05PREUsIG5vZGVfc2l6ZSA9IDI0OwomIzQzOwlpbnQgaWQsIGVyciwgaSwgbG9ja19vZmYsIHJvb3Rfb2ZmLCBzaXplOwomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChyYnRyZWUpIHsKJiM0MzsJCXJvb3RfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX3JiX3Jvb3QmIzM0OywgMTYpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1Qocm9vdF90eXBlLCAwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfcmJfcm9vdCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCW5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX3JiX25vZGUmIzM0OywgMzIpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1Qobm9kZV90eXBlLCAwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfcmJfbm9kZSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCW5vZGVfc2l6ZSA9IDMyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNoYXIgbmFtZVszMl0sIHRhZ1s2NF07CiYjNDM7CiYjNDM7CQlsb2NrX29mZiA9IGkgPyBub2RlX3NpemUgOiAwOwomIzQzOwkJcm9vdF9vZmYgPSBsb2NrX29mZiAmIzQzOyA4OwomIzQzOwkJc2l6ZSA9IGkgPT0gZGVwdGggLSAxID8gbm9kZV9zaXplIDogcm9vdF9vZmYgJiM0MzsgMTY7CiYjNDM7CQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7Z3JhcGhfb3duZXJfJWQmIzM0OywgaSk7CiYjNDM7CQlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1QoaWQsIDAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGdyYXBoX293bmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKGkpIHsKJiM0MzsJCQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bm9kZSYjMzQ7LCBub2RlX3R5cGUsIDAsIDApOwomIzQzOwkJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6bm9kZSYjMzQ7KSkKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CQlpZiAoaSA9PSBkZXB0aCAtIDEpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bG9jayYjMzQ7LCBTUElOX0xPQ0ssIGxvY2tfb2ZmICogOCwgMCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OmxvY2smIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7cm9vdCYjMzQ7LCByb290X3R5cGUsIHJvb3Rfb2ZmICogOCwgMCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OnJvb3QmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlzbnByaW50Zih0YWcsIHNpemVvZih0YWcpLCAmIzM0O2NvbnRhaW5zOmdyYXBoX293bmVyXyVkOm5vZGUmIzM0OywgaSAmIzQzOyAxKTsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTsKJiM0MzsJCWlmICghQVNTRVJUX0dUKGVyciwgMCwgJiMzNDtidGZfX2FkZF9kZWNsX3RhZyBncmFwaF9vd25lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbG9jYWxfa3B0cl9vd25lcnNoaXAodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2VsZl9jeWNsZSgmIzM0O2twdHImIzM0OywgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt1bnRydXN0ZWRfc2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2VsZl9jeWNsZSgmIzM0O2twdHJfdW50cnVzdGVkJiMzNDssIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3BlcmNwdV9zZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7cGVyY3B1X2twdHImIzM0OywgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtBQkFfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X2FiYV9jeWNsZSgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21peGVkX2dyYXBoX3Jvb3RfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X21peGVkX2N5Y2xlKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWF4X2FjeWNsaWMmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgZmFsc2UsIGZhbHNlLCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljJiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgZmFsc2UsIGZhbHNlLCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21heF9hY3ljbGljX2NoaWxkX2ZpcnN0JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIHRydWUsIGZhbHNlLCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgdHJ1ZSwgZmFsc2UsIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWF4X2FjeWNsaWNfc2hhcmVkX3N1ZmZpeCYjMzQ7KSkKJiM0MzsJCXRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgdHJ1ZSwgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dG9vX2RlZXBfYWN5Y2xpY19zaGFyZWRfc3VmZml4JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgZmFsc2UsIHRydWUsIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF90aHJlZV90eXBlcyYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDMsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xpc3RfZm91cl90eXBlcyYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDQsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xpc3RfbWF4X2RlcHRoJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF90b29fZGVlcCYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyYnRyZWVfdGhyZWVfdHlwZXMmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIDMsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV9mb3VyX3R5cGVzJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aCh0cnVlLCA0LCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyYnRyZWVfbWF4X2RlcHRoJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aCh0cnVlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyYnRyZWVfdG9vX2RlZXAmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgLUVMT09QKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTdtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODU2MAoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDU1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFdmFsdWF0aW5nIHRoZSBLTVNBTiBGdXp6aW5nIEp1c3RpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSB0YWtpbmcgYSBsb29rIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIHRvIHNlZSBpZiBpdCB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0JiMzOTtzIHByb2JhYmx5IHdvcnRoIGl0LCBnaXZlbiB0aGUgY2hhbmdlcy4KCkkgbmVlZCB0byBkaXZlIGludG8gdGhlIHNwZWNpZmljcywgc28gbGV0JiMzOTtzIHN0YXJ0IHdpdGggdGhlIGRpZmYgaXRzZWxmLiBJdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBhZGRyZXNzaW5nIGEgY3ljbGUgY2hlY2sgaXNzdWUgaW4gYGtlcm5lbC9icGYvYnRmLmNgLiBTcGVjaWZpY2FsbHksIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgYmVpbmcgdXBkYXRlZC4gVGhlIG9yaWdpbmFsIHNpbXBsZSBgQlBGX0dSQVBIX1JPT1RgIGN5Y2xlIGNoZWNrIGlzIGdvbmUsIHJlcGxhY2VkIHdpdGggYSBtb3JlIGNvbXByZWhlbnNpdmUgb3duZXJzaGlwIGRlcHRoIGFuZCBjeWNsZSBjaGVjayB0aGF0IGNvbnNpZGVycyBhbGwgb3duZXJzaGlwIHR5cGVzOiBgQlBGX0dSQVBIX1JPT1RgLCBgQlBGX0tQVFJfUkVGYCwgYW5kIGBCUEZfS1BUUl9QRVJDUFVgLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQsIHJlcGxhY2luZyBhIHBvdGVudGlhbGx5IGluY29tcGxldGUgY2hlY2sgd2l0aCBzb21ldGhpbmcgbW9yZSByb2J1c3QuCgpJIHNlZSBuZXcgaGVscGVyIGZ1bmN0aW9ucyBiZWluZyBhZGRlZDogYGJ0Zl9vd25lZF90eXBlX2lkeCgpYCwgd2hpY2ggYXBwZWFycyB0byBkZXRlcm1pbmUgdGhlIGluZGV4IG9mIGEgcG9pbnRlZSBzdHJ1Y3QgYmFzZWQgb24gdGhlIG93bmVyc2hpcCB0eXBlLCBhbmQgYGJ0Zl9vd25lcnNoaXBfZGVwdGgoKWAsIHdoaWNoIHBlcmZvcm1zIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIChERlMpIHdpdGggbWVtb2l6YXRpb24gdG8gY2FsY3VsYXRlIG93bmVyc2hpcCBkZXB0aC4gSXQgbG9va3MgbGlrZSBpdCB1c2VzIGEgYGRlcHRoYCBhcnJheSBhbGxvY2F0ZWQgYnkgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgdG8gdHJhY2sgdGhlIGRlcHRoLiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCBpdHNlbGYgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgc3RydWN0IG1ldGFzLCBjYWxscyBgYnRmX293bmVyc2hpcF9kZXB0aCgpYCwgYW5kIG1hbmFnZXMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBkZXB0aCB0cmFja2luZyBhcnJheS4KClRoZSBrZXkgaW50ZWdyYXRpb24gcG9pbnQgc2VlbXMgdG8gYmUgaW4gYGJ0Zl9wYXJzZSgpYCwgd2hlcmUgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgbm93IGNhbGxlZC4gVGhpcyBzdWdnZXN0cyB0aGUgb3duZXJzaGlwIGRlcHRoIGNoZWNrIGlzIGJlaW5nIHBlcmZvcm1lZCBkdXJpbmcgQlRGIHBhcnNpbmcsIHdoaWNoIGlzIGEgY3JpdGljYWwgc3RlcC4KCkZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB0aGlzIGlzIGludGVyZXN0aW5nLiBJJiMzOTtsbCBuZWVkIHRvIGV4YW1pbmUgdGhlIGNvZGUgc3Vycm91bmRpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBhbmQgYGJ0Zl9wYXJzZWAgbW9yZSBjbG9zZWx5IHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgYW5kIHBvdGVudGlhbCBhcmVhcyB3aGVyZSBLTVNBTiBtaWdodCBiZSB1c2VmdWwuIFRoZSBuZXcgZnVuY3Rpb25zIGFuZCB0aGUgYWRkZWQgY2hlY2tzIGNvdWxkIHJldmVhbCBzdWJ0bGUgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgdGhhdCBmdXp6aW5nIGNhbiB1bmNvdmVyLiBUaGUgZmFjdCB0aGF0IHRoZSBwYXRjaCBpbmNsdWRlcyBzZWxmdGVzdHMgaXMgYSBnb29kIHNpZ24sIGJ1dCB0aGUgbmF0dXJlIG9mIHRoZXNlIGNoZWNrcyBtYWtlcyBtZSBiZWxpZXZlIHRoYXQgS01TQU4gbWlnaHQgYmUgcGFydGljdWxhcmx5IHZhbHVhYmxlIGhlcmUsIHBvdGVudGlhbGx5IGZpbmRpbmcgY29tcGxleCBjeWNsZSBwcm9ibGVtcyB0aGF0IGV2ZW4gd2VsbC1jcmFmdGVkIHRlc3RzIG1pZ2h0IG1pc3MuIEl0IGlzIGdvaW5nIHRvIGJlIGdvb2QgdG8gdHJ5IGFuZCBjcmVhdGUgZnV6emVyIHNlZWRzIHRoYXQgdGFyZ2V0IHRoZXNlIG5ldyBmdW5jdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTQxNTA9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjgyLVxua2VybmVsL2JwZi9idGYuYzo0MjgzOmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG5rZXJuZWwvYnBmL2J0Zi5jLTQyODQte1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjAxND1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwOTItXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTM6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbmtlcm5lbC9icGYvYnRmLmMtNjA5NC1cdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTYwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIGNvZGUgc25pcHBldHMsIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdCB0aHJvdWdoOgoKKipBbmFseXppbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBhbmQgYGJ0Zl9wYXJzZWAqKgoKT2theSwgc28gSSBuZWVkIHRvIGRpdmUgaW50byBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBzZWN0aW9ucyBhcm91bmQgbGluZXMgNDI4MC00MzUwIGFuZCA2MDgwLTYxMTAuIEZyb20gcGFzdCBleHBlcmllbmNlLCBJJiMzOTttIGd1ZXNzaW5nIHRoZXNlIHNlY3Rpb25zIGFyZSBjcml0aWNhbCBmb3IgaGFuZGxpbmcgZmllbGQgdmFsaWRhdGlvbiBhbmQgcGFyc2luZyB3aXRoaW4gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBtZXRhZGF0YS4gR2l2ZW4gdGhlIGxpbmUgbnVtYmVycywgSSYjMzk7ZCBiZXQgdGhleSYjMzk7cmUgbGlrZWx5IHJlbGF0ZWQgdG8gZXJyb3IgaGFuZGxpbmcsIHR5cGUgc2l6ZSBjb25zaXN0ZW5jeSwgb3IgcGVyaGFwcyBldmVuIHBvaW50ZXIgZGVyZWZlcmVuY2luZyB3aXRoaW4gdGhlIEJURiBkYXRhIHN0cnVjdHVyZS4gVGhpcyBpcyBwcmV0dHkgc3RhbmRhcmQgZm9yIEJURiBwcm9jZXNzaW5nIOKAkyBlbnN1cmluZyBkYXRhIGludGVncml0eSBpcyBwYXJhbW91bnQuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCBob3cgdGhlc2UgZnVuY3Rpb25zIGhhbmRsZSBwb3RlbnRpYWwgaW5jb25zaXN0ZW5jaWVzIG9yIHZpb2xhdGlvbnMgb2YgdGhlIEJURiBzcGVjaWZpY2F0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIHVuZGVybHlpbmcgbG9naWMgYW5kIHBvdGVudGlhbCBhcmVhcyBmb3IgaW1wcm92ZW1lbnQgb3IgZGVidWdnaW5nLiBJJiMzOTtsbCBhbHNvIGJlIHdhdGNoaW5nIGZvciBhbnkgbnVhbmNlcyBvciBjbGV2ZXIgdHJpY2tzIHRoZSBkZXZlbG9wZXJzIGhhdmUgdXNlZCB0byBvcHRpbWl6ZSBtZW1vcnkgdXNhZ2Ugb3IgcGVyZm9ybWFuY2Ugd2l0aGluIHRoZXNlIHJvdXRpbmVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzQyODA6XHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG40MjgxOlx0fVxuNDI4MjpcdFxuNDI4MzpcdGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG40Mjg0Olx0e1xuNDI4NTpcdFx0aW50IGk7XG40Mjg2Olx0XG40Mjg3Olx0XHQvKlxuNDI4ODpcdFx0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG40Mjg5Olx0XHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXG40MjkwOlx0XHQgKiBiZWVuIGZpeGVkIHVwLlxuNDI5MTpcdFx0ICovXG40MjkyOlx0XHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxuNDI5MzpcdFx0XHRyZXR1cm4gMDtcbjQyOTQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40Mjk1Olx0XHRcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG40Mjk2Olx0XHRcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcbjQyOTc6XHRcdFx0dTMyIGJ0Zl9pZDtcbjQyOTg6XHRcbjQyOTk6XHRcdFx0aWYgKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSA9PSBCUEZfVVBUUikge1xuNDMwMDpcdFx0XHRcdC8qIFRoZSB1cHRyIG9ubHkgc3VwcG9ydHMgcGlubmluZyBvbmUgcGFnZSBhbmQgY2Fubm90XG40MzAxOlx0XHRcdFx0ICogcG9pbnQgdG8gYSBrZXJuZWwgc3RydWN0XG40MzAyOlx0XHRcdFx0ICovXG40MzAzOlx0XHRcdFx0aWYgKGJ0Zl9pc19rZXJuZWwocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZikpXG40MzA0Olx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQzMDU6XHRcdFx0XHR0ID0gYnRmX3R5cGVfYnlfaWQocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZixcbjQzMDY6XHRcdFx0XHRcdFx0ICAgcmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0Zl9pZCk7XG40MzA3Olx0XHRcdFx0aWYgKCF0LVx1MDAzZXNpemUpXG40MzA4Olx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQzMDk6XHRcdFx0XHRpZiAodC1cdTAwM2VzaXplIFx1MDAzZSBQQUdFX1NJWkUpXG40MzEwOlx0XHRcdFx0XHRyZXR1cm4gLUUyQklHO1xuNDMxMTpcdFx0XHRcdGNvbnRpbnVlO1xuNDMxMjpcdFx0XHR9XG40MzEzOlx0XG40MzE0Olx0XHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpKVxuNDMxNTpcdFx0XHRcdGNvbnRpbnVlO1xuNDMxNjpcdFx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuNDMxNzpcdFx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuNDMxODpcdFx0XHRpZiAoIW1ldGEpXG40MzE5Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG40MzIwOlx0XHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbjQzMjE6XHRcdH1cbjQzMjI6XHRcdHJldHVybiAwO1xuNDMyMzpcdH1cbjQzMjQ6XHRcbjQzMjU6XHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXG40MzI2Olx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG40MzI3Olx0e1xuNDMyODpcdFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcbjQzMjk6XHRcdHUzMiBidGZfaWQ7XG40MzMwOlx0XG40MzMxOlx0XHRpZiAoZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcbjQzMzI6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG40MzMzOlx0XHR9IGVsc2UgaWYgKGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XG40MzM0Olx0XHRcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSlcbjQzMzU6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMzY6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNla3B0ci5idGZfaWQ7XG40MzM3Olx0XHR9IGVsc2Uge1xuNDMzODpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMzk6XHRcdH1cbjQzNDA6XHRcbjQzNDE6XHRcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG40MzQyOlx0XHRpZiAoIW1ldGEpXG40MzQzOlx0XHRcdHJldHVybiBmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xuNDM0NDpcdFx0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG40MzQ1Olx0fVxuNDM0NjpcdFxuNDM0NzpcdC8qXG40MzQ4Olx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXG40MzQ5Olx0ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MjMKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHJlcXVlc3QsIGZvcm1hdHRlZCBhcyByZXF1ZXN0ZWQ6CgoqKkRpZ2dpbmcgRGVlcGVyIGludG8gdGhlIERhdGEqKgoKQWxyaWdodCwgSSBuZWVkIHRvIGZvY3VzIG15IGF0dGVudGlvbi4gSXQgbG9va3MgbGlrZSBJJiMzOTttIGJlaW5nIGFza2VkIHRvIGRlbHZlIGZ1cnRoZXIgaW50byB0aGlzIGRhdGEgc2V0LiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIHRha2UgYSBsb29rIGF0IHRoZSBjb250ZW50IGZyb20gbGluZXMgNDM1MCB0byA0NDAwLCBhbmQgdGhlbiBhZ2FpbiBmcm9tIGxpbmVzIDYwODAgdG8gNjExMC4gVGhpcyBzaWduYWxzIHRoYXQgdGhlcmUmIzM5O3MgbGlrZWx5IHNvbWUgY3J1Y2lhbCBpbmZvcm1hdGlvbiBvciBhIGNyaXRpY2FsIHBvaW50IGJlaW5nIG1hZGUgd2l0aGluIHRob3NlIHNwZWNpZmljIHJhbmdlcy4gSSYjMzk7bGwgbmVlZCB0byBhbmFseXplIHRoZW0gY2FyZWZ1bGx5LCBsb29raW5nIGZvciBwYXR0ZXJucywgaW5jb25zaXN0ZW5jaWVzLCBvciBhbnl0aGluZyB0aGF0IHN0YW5kcyBvdXQgaW4gcmVsYXRpb24gdG8gdGhlIGJyb2FkZXIgc2NvcGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIHRob3NlIHNwZWNpZmljIGxpbmVzIGFyZSBpbXBvcnRhbnQgdG8gdGhlIGNvbnRleHQuIEl0JiMzOTtzIHRpbWUgdG8gcHV0IG9uIG15IGNyaXRpY2FsIHRoaW5raW5nIGhhdCBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSBjYW4gZ2xlYW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQzNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NDM1MDpcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XG40MzUxOlx0ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcbjQzNTI6XHQgKiBub24tcmVjdXJzaW5nIGRyb3AuXG40MzUzOlx0ICovXG40MzU0Olx0I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XG40MzU1Olx0XG40MzU2Olx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzNTc6XHRcdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxuNDM1ODpcdFx0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbjQzNTk6XHR7XG40MzYwOlx0XHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xuNDM2MTpcdFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbjQzNjI6XHRcbjQzNjM6XHRcdGlmICghZGVwdGhfbGVmdClcbjQzNjQ6XHRcdFx0cmV0dXJuIC1FTE9PUDtcbjQzNjU6XHRcdGlmIChkZXB0aFtpZHhdKVxuNDM2NjpcdFx0XHRnb3RvIGRvbmU7XG40MzY3Olx0XG40MzY4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyByZWMtXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM2OTpcdFx0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuNDM3MDpcdFx0XHRpZiAocmV0ID09IC1FTk9FTlQpXG40MzcxOlx0XHRcdFx0Y29udGludWU7XG40MzcyOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzczOlx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNzQ6XHRcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuNDM3NTpcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuNDM3NjpcdFx0XHRcdHJldHVybiByZXQ7XG40Mzc3Olx0XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG40Mzc4Olx0XHR9XG40Mzc5Olx0XHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7XG40MzgwOlx0ZG9uZTpcbjQzODE6XHRcdHJldHVybiBkZXB0aFtpZHhdIFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcbjQzODI6XHR9XG40MzgzOlx0XG40Mzg0Olx0c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzODU6XHRcdFx0XHRcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcbjQzODY6XHR7XG40Mzg3Olx0XHR1OCAqZGVwdGg7XG40Mzg4Olx0XHRpbnQgaSwgcmV0ID0gMDtcbjQzODk6XHRcbjQzOTA6XHRcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuNDM5MTpcdFx0aWYgKCFkZXB0aClcbjQzOTI6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG40MzkzOlx0XG40Mzk0Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM5NTpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbjQzOTY6XHRcdFx0XHRcdFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XG40Mzk3Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40Mzk4Olx0XHRcdFx0YnJlYWs7XG40Mzk5Olx0XHRcdHJldCA9IDA7XG40NDAwOlx0XHR9XG40NDAxOlx0XHRrdmZyZWUoZGVwdGgpO1xuNDQwMjpcdFx0cmV0dXJuIHJldDtcbjQ0MDM6XHR9XG40NDA0Olx0XG40NDA1Olx0c3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG40NDA2Olx0XHRcdFx0ICAgICAgdTMyIHR5cGVfaWQsIHZvaWQgKmRhdGEsIHU4IGJpdHNfb2Zmc2V0LFxuNDQwNzpcdFx0XHRcdCAgICAgIHN0cnVjdCBidGZfc2hvdyAqc2hvdylcbjQ0MDg6XHR7XG40NDA5Olx0XHRjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjU5OAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgcGVyc3BlY3RpdmUgb24gdGhhdCBzZWdtZW50OgoKKipBbmFseXppbmcgYGJ0Zl9wYXJzZWAgKExpbmVzIDYwODUtNjExNSkqKgoKUmlnaHQsIGxldCYjMzk7cyB6ZXJvIGluIG9uIGBidGZfcGFyc2VgIGJldHdlZW4gdGhvc2UgbGluZSBudW1iZXJzLCA2MDg1IGFuZCA2MTE1LiBUaGF0IGFyZWEgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBjb250ZXh0IG9mIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGp1c3QgYmVmb3JlIGFuZCBhZnRlciB0aGlzIHNlY3Rpb24uIEkmIzM5O20gYXNzdW1pbmcgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBwYXJzaW5nIEJURiBkYXRhLiBTbywgd2hhdCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYXJlIGJlaW5nIGhhbmRsZWQgYXJvdW5kIHRob3NlIGxpbmVzPyBBcmUgd2UgbG9va2luZyBhdCB0aGUgY29yZSBwYXJzaW5nIGxvZ2ljLCBlcnJvciBoYW5kbGluZywgb3IgcGVyaGFwcyB0eXBlIGRlZmluaXRpb24gcmVzb2x1dGlvbj8gVGhlIGZ1bmN0aW9uJiMzOTtzIHN0cnVjdHVyZSBpdHNlbGYgd2lsbCB0ZWxsIGEgbG90LiBJJiMzOTtsbCBuZWVkIHRvIGNvbmZpcm0gd2hhdCB0aGUgaW5wdXQgcGFyYW1ldGVycyBhcmUgYW5kIGhvdyB0aGV5JiMzOTtyZSBiZWluZyB1c2VkIHdpdGhpbiB0aGlzIHNuaXBwZXQuIEFueSBwb3RlbnRpYWwgZm9yIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgaW5jb3JyZWN0IHR5cGUgY2FzdGluZyBsZWFwcyBvdXQgaW1tZWRpYXRlbHkuIEFyZSB0aGVyZSBhbnkgaW5kaXJlY3QganVtcHMgb3IgcG9pbnRlciBtYW5pcHVsYXRpb24gb2NjdXJyaW5nIGhlcmU/IFRob3NlIGFyZSBhbHdheXMgd29ydGggYSBjbG9zZXIgaW5zcGVjdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBwaW5wb2ludCBhbnkgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyB0byBlbnN1cmUgdGhpcyBjcml0aWNhbCBmdW5jdGlvbiBpcyByb2J1c3QgYW5kIHNhZmUgZnJvbSBtaXN1c2UuIFRoZW4sIEkgbmVlZCB0byBjb25zaWRlciBhbnkgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIOKAkyBjb3VsZCB0aGlzIGJlIGEgYm90dGxlbmVjayBpbiB0aGUgb3ZlcmFsbCBwcm9jZXNzPyBBbnkgb3B0aW1pemF0aW9ucyBJIGNhbiBtYWtlPyBSaWdodCwgdGltZSB0byBkaXZlIGluIGFuZCBnZXQgbXkgaGFuZHMgZGlydHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjA4NTpcdFx0XHRnb3RvIGVycm91dDtcbjYwODY6XHRcdH1cbjYwODc6XHRcdGJ0Zi1cdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XG42MDg4Olx0XG42MDg5Olx0XHRpZiAoc3RydWN0X21ldGFfdGFiKSB7XG42MDkwOlx0XHRcdGludCBpO1xuNjA5MTpcdFxuNjA5MjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzdHJ1Y3RfbWV0YV90YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNjA5MzpcdFx0XHRcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XG42MDk0Olx0XHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbjYwOTU6XHRcdFx0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG42MDk2Olx0XHRcdH1cbjYwOTc6XHRcbjYwOTg6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG42MDk5Olx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG42MTAwOlx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbjYxMDE6XHRcdH1cbjYxMDI6XHRcbjYxMDM6XHRcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXHUwMDI2ZW52LVx1MDAzZWxvZyk7XG42MTA0Olx0XHRpZiAoZXJyKVxuNjEwNTpcdFx0XHRnb3RvIGVycm91dF9mcmVlO1xuNjEwNjpcdFxuNjEwNzpcdFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XG42MTA4Olx0XHRyZWZjb3VudF9zZXQoXHUwMDI2YnRmLVx1MDAzZXJlZmNudCwgMSk7XG42MTA5Olx0XHRyZXR1cm4gYnRmO1xuNjExMDpcdFxuNjExMTpcdGVycm91dF9tZXRhOlxuNjExMjpcdFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XG42MTEzOlx0ZXJyb3V0OlxuNjExNDpcdFx0Lyogb3ZlcndyaXRlIGVyciB3aXRoIC1FTk9TUEMgb3IgLUVGQVVMVCAqL1xuNjExNTpcdFx0cmV0ID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbjYxMTY6XHRcdGlmIChyZXQpXG42MTE3Olx0XHRcdGVyciA9IHJldDtcbjYxMTg6XHRlcnJvdXRfZnJlZTpcbjYxMTk6XHRcdGJ0Zl92ZXJpZmllcl9lbnZfZnJlZShlbnYpO1xuNjEyMDpcdFx0aWYgKGJ0ZilcbjYxMjE6XHRcdFx0YnRmX2ZyZWUoYnRmKTtcbjYxMjI6XHRcdHJldHVybiBFUlJfUFRSKGVycik7XG42MTIzOlx0fVxuNjEyNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzUxMAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDU0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEJURiBTdHJ1Y3QgT3duZXJzaGlwIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIGl0cyBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBJdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBjaGFuZ2luZyBob3cgd2UgdmFsaWRhdGUgdGhlIG93bmVyc2hpcCBsb2dpYyB3aXRoaW4gdGhlIEJURiBzdHJ1Y3R1cmUuIFByZXZpb3VzbHksIHRoZSBzeXN0ZW0gd2FzIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGEgbm9kZSB3YXMgYWxzbyBhIHJvb3QgaW4gdGhlIGdyYXBoIHN0cnVjdHVyZSwgd2Ugd2VyZW4mIzM5O3QgaW50cm9kdWNpbmcgY3ljbGVzLCBlc3BlY2lhbGx5IHdpdGhpbiBgYnBmX2xpc3RfaGVhZGAgYW5kIGBicGZfcmJfcm9vdGAuIFRoZSBvbGQgbWV0aG9kIHdhcyB0byBjaGVjayBgbWV0YS0mZ3Q7cmVjb3JkLSZndDtmaWVsZF9tYXNrICZhbXA7IEJQRl9HUkFQSF9ST09UYC4gVGhlIG5ldyBhcHByb2FjaCBicmluZ3MgaW4gYSByZWN1cnNpb24gZGVwdGggY2hlY2sgZm9yIG93bmVyc2hpcC4KCkVzc2VudGlhbGx5LCB0aGV5JiMzOTtyZSBpbnRyb2R1Y2luZyBhIGxpbWl0LCBgQlRGX01BWF9PV05FUlNISVBfREVQVEhgIChzZXQgdG8gOCwgd2hpY2ggc2VlbXMgcmVhc29uYWJsZSksIHRvIHByZXZlbnQgaXNzdWVzIGxpa2Uga2VybmVsIHN0YWNrIG92ZXJmbG93IG9yIGV4Y2Vzc2l2ZWx5IGxvbmcgcmVjdXJzaW9uIGR1cmluZyB0aGUgYGJwZl9vYmpfZnJlZV9maWVsZHMoKWAgb3IgYF9fYnBmX29ial9kcm9wX2ltcGwoKWAgcHJvY2Vzc2VzLiBUaGUgcGF0Y2ggbm93IGFsc28gY2hlY2tzIGZvciBvd25lcnNoaXAgY3ljbGVzIGludm9sdmluZyBgQlBGX0dSQVBIX1JPT1RgLCBgQlBGX0tQVFJfUkVGYCwgYW5kIGBCUEZfS1BUUl9QRVJDUFVgLiBUaGlzIHNlZW1zIGxpa2UgYSBnb29kIHByb2FjdGl2ZSBtZWFzdXJlLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCwgdmFyaWFibGVzLCBwb2ludGVycywgYW5kIHVzZXItc3BhY2UgY29waWVzIGludm9sdmVkLgoKRmlyc3QsIHdlIGhhdmUgdGhpcyBhbGxvY2F0aW9uOiBgZGVwdGggPSBrdmNhbGxvYyh0YWItJmd0O2NudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO2AuIGBrdmNhbGxvY2AgaXMgYWxsb2NhdGluZyB6ZXJvZWQgbWVtb3J5LiBXZSYjMzk7cmUgYWxsb2NhdGluZyBgdGFiLSZndDtjbnRgIGVsZW1lbnRzLCBlYWNoIGBzaXplb2YodTgpYCBpbiBzaXplLiBZZXMsIGBrdmNhbGxvY2AgZ3VhcmFudGVlcyB0aGF0IGBkZXB0aGAgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC4gSW1wb3J0YW50bHksIGl0JiMzOTtzIGZyZWVkIGxhdGVyIHdpdGggYGt2ZnJlZShkZXB0aClgLiBBbHdheXMgZ29vZCB0byBzZWUgdGhhdCBwYWlyZWQgdXAuCgpXZSBoYXZlIHRvIGNvbnNpZGVyIGFycmF5IGJvdW5kcyBmb3IgdGhpcyBhbGxvY2F0aW9uLCBlc3BlY2lhbGx5IGFzIGBkZXB0aGAgaXMgaW5kZXhlZCBhcyBgZGVwdGhbaWR4XWAuCmBpZHhgIG9yaWdpbmF0ZXMgaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIHdoZXJlIHdlIGhhdmUgdGhlIGxvb3A6IGBmb3IgKGkgPSAwOyBpICZsdDsgdGFiLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7IC4uLiBidGZfb3duZXJzaGlwX2RlcHRoKC4uLiwgaSwgLi4uKTsgfWAuCkluc2lkZSBgYnRmX293bmVyc2hpcF9kZXB0aGA6IGByZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsICZhbXA7cmVjLSZndDtmaWVsZHNbaV0pO2AgdGhlbiB3ZSBjYWxsOiBgcmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO2AuIEFuZCB0aGVuIHdpdGhpbiBgYnRmX293bmVkX3R5cGVfaWR4YCB3ZSBoYXZlIHRoaXM6CmBgYGMKCW1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7CglpZiAoIW1ldGEpCgkJcmV0dXJuIGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7CglyZXR1cm4gbWV0YSAtIHRhYi0mZ3Q7dHlwZXM7CmBgYApJdCBsb29rcyBsaWtlIGBtZXRhYCBjb21lcyBmcm9tIGBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZClgLiBXZSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgaG93IHRoaXMgd29ya3MuCmBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIEkmIzM5O2xsIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhhdCBmdW5jdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgb2Zmc2V0cyBhbmQgaW5kZXhpbmcgYXJlIHNhZmUgYW5kIGRvbiYjMzk7dCBpbnRyb2R1Y2UgdnVsbmVyYWJpbGl0aWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfZmluZF9zdHJ1Y3RfbWV0YSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYz00MjgzPWludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4tLVxua2VybmVsL2JwZi9idGYuYy00MzE2LVx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xua2VybmVsL2JwZi9idGYuYzo0MzE3Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzE4LVx0XHRpZiAoIW1ldGEpXG4tLVxua2VybmVsL2JwZi9idGYuYz00MzI1PXN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNDAtXG5rZXJuZWwvYnBmL2J0Zi5jOjQzNDE6XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzQyLVx0aWYgKCFtZXRhKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTg0ND1idGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0Zilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjQtXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NjU6c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxua2VybmVsL2JwZi9idGYuYy01OTY2LXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTc0NDg9aW50IGJ0Zl9zdHJ1Y3RfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csXG4tLVxua2VybmVsL2JwZi9idGYuYy03NDY0LVxua2VybmVsL2JwZi9idGYuYzo3NDY1Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBpZCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjYtXHRcdGlmICghbWV0YSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUyNzMKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHRob3VnaCBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAgaW1wbGVtZW50YXRpb24sIGtlZXBpbmcgaW4gbWluZCBJJiMzOTttIGFuIGV4cGVydCBpbiB0aGlzIGZpZWxkLgoKKipEZWVwIERpdmUgaW50byBgYnRmX2ZpbmRfc3RydWN0X21ldGFgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoaXMgZnVuY3Rpb24gd29ya3MuIEl0JiMzOTtzIGNydWNpYWwgZm9yIGVmZmljaWVudGx5IG5hdmlnYXRpbmcgYW5kIGludGVycHJldGluZyBCVEYgaW5mb3JtYXRpb24sIGFuZCBJIHdhbnQgdG8gYmUgY2VydGFpbiBhYm91dCB0aGUgZWRnZSBjYXNlcyBhbmQgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBJJiMzOTttIGFzc3VtaW5nLCBvZiBjb3Vyc2UsIHRoYXQgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYSB3ZWxsLWZvcm1lZCBCVEYgZGF0YSBzdHJ1Y3R1cmUg4oCTIGJ1dCBpdCYjMzk7cyBhbHdheXMgZ29vZCB0byBjb25zaWRlciBlcnJvciBoYW5kbGluZyBpbXBsaWNpdGx5LgoKTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgcnVubmluZyB0aHJvdWdoIHRoZSB2YXJpb3VzIGFzcGVjdHMuIFdoYXQgYXJlIHRoZSBrZXkgc2VhcmNoIHBhcmFtZXRlcnM/IElzIGl0IGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QsIHRoZSBzaXplLCB0aGUgbWVtYmVyIGxheW91dCwgb3Igc29tZSBjb21iaW5hdGlvbiB0aGVyZW9mPyBJIG5lZWQgdG8gbG9vayBmb3IgYW55IG9wdGltaXphdGlvbnMgZW1wbG95ZWQgaGVyZS4gQXJlIHRoZXJlIGFueSBjYWNoaW5nIG1lY2hhbmlzbXMgdG8gc3BlZWQgdXAgcmVwZWF0ZWQgbG9va3Vwcz8gSXMgaXQgdXNpbmcgYSBoYXNoIHRhYmxlLCBsaW5lYXIgc2VhcmNoLCBvciBzb21lIG90aGVyIG1ldGhvZCBmb3IgZmluZGluZyB0aGUgY29ycmVjdCBzdHJ1Y3QgZGVmaW5pdGlvbj8gSSB3YW50IHRvIHNlZSBpZiB0aGUgY2hvc2VuIGFsZ29yaXRobSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGV4cGVjdGVkIHNpemUgYW5kIGNvbXBsZXhpdHkgb2YgdGhlIEJURiBkYXRhLgoKSSYjMzk7bGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucy4gRG9lcyBpdCB0cmF2ZXJzZSB0aGUgQlRGIHNlY3Rpb24gbGluZWFybHksIG9yIGRvZXMgaXQganVtcCBhcm91bmQ/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIGNhY2hlIG1pc3NlcyB0aGF0IGNvdWxkIGltcGFjdCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSB3aXRoIGxhcmdlIEJURiBibG9icz8gQW5kIGhvdyBkb2VzIGl0IGhhbmRsZSBuZXN0ZWQgc3RydWN0cyBhbmQgYW5vbnltb3VzIHVuaW9ucz8gVGhhdCYjMzk7cyBhbHdheXMgYSB0cmlja3kgYXJlYSwgYW5kIEkgZXhwZWN0IHRoZXJlIGlzIGEgd2VsbCB0aG91Z2h0LW91dCB0cmF2ZXJzYWwgc3RyYXRlZ3kgdGhlcmUuCgpJJiMzOTtsbCBhbHNvIGtlZXAgaW4gbWluZCB0aGUgcG90ZW50aWFsIGZvciBjb3JuZXIgY2FzZXMuIFdoYXQgaGFwcGVucyBpZiB0aGUgc3RydWN0IGlzbiYjMzk7dCBmb3VuZD8gRG9lcyBpdCByZXR1cm4gYW4gZXJyb3IgY29kZSwgYE5VTExgLCBvciBzb21ldGhpbmcgZWxzZT8gRG9lcyBpdCBoYXZlIGFueSBpbXBsaWNhdGlvbnMgZm9yIHdoYXQgaGFwcGVucyBpbiB0aGUgY2FsbGVyPyBJJiMzOTttIGN1cmlvdXMgaG93IGl0IGludGVyYWN0cyB3aXRoIEJURiB0eXBlIElEcywgYW5kIGhvdyBpdCBoYW5kbGVzIGR1cGxpY2F0ZSBzdHJ1Y3QgZGVmaW5pdGlvbnMsIGlmIGF0IGFsbC4KCkZpbmFsbHksIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBhYm91dCBmdXR1cmUgc2NhbGFiaWxpdHkuIElzIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXNpZ25lZCB0byBoYW5kbGUgdmVyeSBsYXJnZSBCVEYgZGF0YWJhc2VzPyBEb2VzIGl0IGFsbG93IGZvciBpbmNyZW1lbnRhbCB1cGRhdGVzIG9yIHBhcnRpYWwgQlRGIGxvYWRpbmc/IFRoZXNlIGFyZSBjcnVjaWFsIGFzcGVjdHMgdG8gY29uc2lkZXIgZm9yIGxvbmctdGVybSBtYWludGFpbmFiaWxpdHkgYW5kIHBlcmZvcm1hbmNlLiBUaGUgbW9yZSBJIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiwgdGhlIG1vcmUgY29uZmlkZW5jZSBJJiMzOTtsbCBoYXZlIGluIHRoZSBzdGFiaWxpdHkgb2YgdGhlIG92ZXJhbGwgZnJhbWV3b3JrLiBMZXQmIzM5O3Mgc2VlIGhvdyBpdCYjMzk7cyBkb25lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1OTYwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzU5NjA6XHRmcmVlX2FvZjpcbjU5NjE6XHRcdGtmcmVlKGFvZik7XG41OTYyOlx0XHRyZXR1cm4gRVJSX1BUUihyZXQpO1xuNTk2MzpcdH1cbjU5NjQ6XHRcbjU5NjU6XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICpidGZfZmluZF9zdHJ1Y3RfbWV0YShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBidGZfaWQpXG41OTY2Olx0e1xuNTk2NzpcdFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYjtcbjU5Njg6XHRcbjU5Njk6XHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhLCBidGZfaWQpICE9IDApO1xuNTk3MDpcdFx0dGFiID0gYnRmLVx1MDAzZXN0cnVjdF9tZXRhX3RhYjtcbjU5NzE6XHRcdGlmICghdGFiKVxuNTk3MjpcdFx0XHRyZXR1cm4gTlVMTDtcbjU5NzM6XHRcdHJldHVybiBic2VhcmNoKFx1MDAyNmJ0Zl9pZCwgdGFiLVx1MDAzZXR5cGVzLCB0YWItXHUwMDNlY250LCBzaXplb2YodGFiLVx1MDAzZXR5cGVzWzBdKSwgYnRmX2lkX2NtcF9mdW5jKTtcbjU5NzQ6XHR9XG41OTc1Olx0XG41OTc2Olx0c3RhdGljIGludCBidGZfY2hlY2tfbW9kaWZpZXJfY2hhaW5fbGVuZ3RoKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXG41OTc3Olx0XHRcdFx0XHRcdCAgIHN0cnVjdCBidGYgKmJ0ZiwgaW50IHN0YXJ0X2lkKVxuNTk3ODpcdHtcbjU5Nzk6XHRcdGludCBpLCBuLCBnb29kX2lkID0gc3RhcnRfaWQgLSAxO1xuNTk4MDpcdFxuNTk4MTpcdFx0biA9IGJ0Zl9ucl90eXBlcyhidGYpO1xuNTk4MjpcdFx0Zm9yIChpID0gc3RhcnRfaWQ7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG41OTgzOlx0XHRcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcbjU5ODQ6XHRcdFx0aW50IGNoYWluX2xpbWl0ID0gMzI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xMW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjI2MAoJCQkJCQkJb3V0cHV0OiAyODQKCQkJCQkJCXRob3VnaHRzOiAxNzY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIEJURiBPd25lcnNoaXAgRGVwdGggQ2hlY2sgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IHByaW1hcnkgY29uY2VybiBoZXJlIGlzIHdoZXRoZXIgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIG9yIGV4cG9zZXMgYW55IHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gYmUgcmVhZCwgd2hpY2ggY291bGQgbGVhZCB0byBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIEkmIzM5O20gZ29pbmcgdG8gZm9sbG93IHRoZSBlc3RhYmxpc2hlZCBjcml0ZXJpYSBmb3IgS01TQU4gYW5hbHlzaXMuCgpGaXJzdCwgSSBleGFtaW5lIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGJpbmFyeSBzZWFyY2ggd2l0aGluIHRoZSBgYnRmLSZndDtzdHJ1Y3RfbWV0YV90YWItJmd0O3R5cGVzYCBhcnJheS4gSWYgdGhlIHNlYXJjaCBpcyBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZm91bmQgbWV0YWRhdGEsIGBtZXRhYC4gVGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50IGlzIHRoZW4gY2FsY3VsYXRlZCBhcyBgbWV0YSAtIHRhYi0mZ3Q7dHlwZXNgLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSwgc3BlY2lmaWNhbGx5IGAwYCB0byBgdGFiLSZndDtjbnQgLSAxYC4gSWYgdGhlIHNlYXJjaCBmYWlscywgaXQgcmV0dXJucyBgTlVMTGAuCgpOb3csIGxvb2tpbmcgYXQgYGJ0Zl9vd25lZF90eXBlX2lkeGAuIEl0IGNhbGxzIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAsIGFuZCBpZiBhIHZhbGlkIGBtZXRhYCBpcyBmb3VuZCwgdGhlIGluZGV4IGNhbGN1bGF0aW9uIGBtZXRhIC0gdGFiLSZndDt0eXBlc2AgZ2l2ZXMgdXMgdGhlIGluZGV4LCBhbmQgYSBjaGVjayBpcyBwZXJmb3JtZWQgdG8gdmVyaWZ5IHRoZSByb290LiBJZiBgYnRmX2ZpbmRfc3RydWN0X21ldGFgIHJldHVybnMgYE5VTExgLCB0aGVuIHdlIGNoZWNrIHRoZSByb290IGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZSwgd2hpY2ggZG9lcyBub3QgaW50cm9kdWNlIGEgcmlzay4gVGhlcmVmb3JlLCBpdCBpcyBpbXBvcnRhbnQgdG8gcG9pbnQgb3V0IHRoYXQgYHRhYmAgaXMgYW4gYXJndW1lbnQsIHdoaWNoIGluIG91ciBjb250ZXh0IGlzIGBzdHJ1Y3RfbWV0YV90YWJgLiBUaGVyZWZvcmUsIHRoZSByZXR1cm5lZCBpbmRleCBpcyB3aXRoaW4gYm91bmRzIChpLmUuLCBgMGAgdG8gYHRhYi0mZ3Q7Y250IC0gMWApLgoKTXkgYW5hbHlzaXMgaXMgZ3VpZGVkIGJ5IHRoZXNlIHBvdGVudGlhbCByaXNrczoKCjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZToqKiBBcmUgYW55IGtlcm5lbCBzdHJ1Y3R1cmVzIGJlaW5nIHBhc3NlZCBiYWNrIHRvIHVzZXIgc3BhY2U/IE5vLCBub3QgaW4gdGhpcyBwYXRjaC4gVGhlIGZ1bmN0aW9ucyBgYnRmX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCBhcmUgaW50ZXJuYWwgdmVyaWZpY2F0aW9uIGZ1bmN0aW9ucyBhbmQgb25seSByZXR1cm4gYW4gZXJyb3IgY29kZSBvciBCVEYgZmQuIFRoaXMgZWxpbWluYXRlcyB0aGUgcG9zc2liaWxpdHkgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkLgoKMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlczoqKiBJIGNhcmVmdWxseSBleGFtaW5lZCB0aGUgbG9jYWwgdmFyaWFibGVzLiBJbiBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGFsbCB2YXJpYWJsZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLCBpbmNsdWRpbmcgYG1heF9kZXB0aGAsIGBpYCwgYW5kIGByZXRgLiBDcml0aWNhbGx5LCB0aGUgYGRlcHRoYCBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCBga3ZjYWxsb2NgLCB3aGljaCBlbnN1cmVzIGFsbCBlbGVtZW50cyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4gSW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLCB0aGUgYHJldGAgdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQgdG8gYDBgLiBgYnRmX2lkYCBpcyBhc3NpZ25lZCBpbiBib3RoIGJyYW5jaGVzIG9mIHRoZSBgYnRmX293bmVkX3R5cGVfaWR4YCBmdW5jdGlvbiB3aGVyZSBjb250cm9sIGRvZXMgbm90IHJldHVybi4KCjMuICAqKkFsbG9jYXRpb24vSW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXM6KiogVGhlIGBkZXB0aGAgYXJyYXksIHdoaWNoIGlzIGNyaXRpY2FsIHRvIHRoaXMgY2hlY2ssIGlzIGFsbG9jYXRlZCB1c2luZyBga3ZjYWxsb2NgLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCBhbGwgaXRzIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvLiBJIGRpZCB2ZXJpZnkgdGhhdCBgZGVwdGhgIGlzIHByb3Blcmx5IGZyZWVkIHZpYSBga3ZmcmVlYCB3aXRoaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLgoKNC4gICoqQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgYWxsb3dpbmcgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgYnVmZmVyIGJ5dGVzOioqIFRoZSBmb2N1cyBvZiB0aGlzIHBhdGNoIGlzIGltcHJvdmluZyBCVEYgb3duZXJzaGlwIHZhbGlkYXRpb24sIHNwZWNpZmljYWxseSBwcmV2ZW50aW5nIGN5Y2xpY2FsIG9yIGV4Y2Vzc2l2ZWx5IGRlZXAgb3duZXJzaGlwIHN0cnVjdHVyZXMuIFRoZSBjb2RlIGRvZXMgbm90IG1vZGlmeSBhbnkgYnVmZmVyIHJlYWRzIG9yIGNvcGllcy4gVGhlIGluZGV4IGBpZHhgIHBhc3NlZCB0byBgZGVwdGhbaWR4XWAgaXMgY2FsY3VsYXRlZCB2aWEgYG1ldGEgLSB0YWItJmd0O3R5cGVzYCBmcm9tIGEgc3VjY2Vzc2Z1bCBiaW5hcnkgc2VhcmNoLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgZWxlbWVudCBpcyB2YWxpZCBhbmQgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZWZvcmUgaXQgaXMgYWx3YXlzIHdpdGhpbiB0aGUgdmFsaWQgYm91bmRzLgoKSSByZS1jaGVja2VkIHRoZSBlc3RhYmxpc2hlZCBLTVNBTiBydWxlczogVGhlIHBhdGNoIGludHJvZHVjZXMgYSByZWN1cnNpb24gZGVwdGggY2hlY2sgZm9yIEJURiBzdHJ1Y3Qgb3duZXJzaGlwLCB1dGlsaXplcyB6ZXJvZWQgbWVtb3J5IGZyb20gYGt2Y2FsbG9jYCwgYW5kIHdvcmtzIHNvbGVseSBvbiBpbml0aWFsaXplZCB2ZXJpZmllciBtZXRhZGF0YS4gSXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFsbCBwb3RlbnRpYWwgcmlza3MgKGUuZy4sIG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzIGluIGBkZXB0aFtpZHhdYCwgaW5maW5pdGUgcmVjdXJzaW9uLCBvciBtZW1vcnkgbGVha3MpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuIFRoaXMgcGF0Y2ggY2xlYXJseSBhbGlnbnMgd2l0aCB0aGUgY3JpdGVyaWEgZm9yIHNldHRpbmcgYE5lZWRzS01TQU49ZmFsc2VgLiBUaGVyZWZvcmUsIEkgYW0gcmVhZHkgdG8gZm9ybXVsYXRlIHRoZSBmaW5hbCByZXN1bHQgYW5kIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTc6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBkZXB0aCBhbmQgZGV0ZWN0IGN5Y2xlcyBhY3Jvc3MgZ3JhcGggcm9vdHMgKGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290KSBhbmQgbG9jYWwga3B0cnMgKEJQRl9LUFRSX1JFRiwgQlBGX0tQVFJfUEVSQ1BVKSwgcHJldmVudGluZyBkZWVwIGtlcm5lbCByZWN1cnNpb24gZHVyaW5nIG9iamVjdCBjbGVhbnVwLlxuXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXG4yLiBMb2NhbCB2YXJpYWJsZXMgYW5kIGZpZWxkczogQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0IGZpZWxkcyBpbnNwZWN0ZWQgb3IgcG9wdWxhdGVkIChgcmV0YCwgYG1heF9kZXB0aGAsIGBidGZfaWRgLCBgZGVwdGhbaWR4XWApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBVc2VyLXNwYWNlIGNvcGllczogTm8gZGF0YSBvciBzdHJ1Y3R1cmUgaXMgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZTsgdGhlIHZhbGlkYXRpb24gcmV0dXJucyBzdGFuZGFyZCBlcnJvciBjb2Rlcy5cbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cblxuMS4gTWVtb3J5IGFsbG9jYXRpb246IFRoZSBvbmx5IGR5bmFtaWMgYWxsb2NhdGlvbiBpbnRyb2R1Y2VkIGlzIHRoZSB0ZW1wb3JhcnkgYGRlcHRoYCBhcnJheSBpbiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCwgd2hpY2ggaXMgYWxsb2NhdGVkIHVzaW5nIGBrdmNhbGxvYygpYCAoZnVsbHkgemVyby1pbml0aWFsaXplZCkgYW5kIGZyZWVkIHdpdGggYGt2ZnJlZSgpYCBiZWZvcmUgcmV0dXJuaW5nLlxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxuMy4gVXNlci1zcGFjZSBjb3BpZXM6IE5vIGRhdGEgb3Igc3RydWN0dXJlIGlzIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2U7IHRoZSB2YWxpZGF0aW9uIHJldHVybnMgc3RhbmRhcmQgZXJyb3IgY29kZXMuXG40LiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIChzdWNoIGFzIGluZGV4aW5nIGlzc3VlcywgcG9pbnRlciBhcml0aG1ldGljLCBvciByZWN1cnNpb24gbGltaXRzKSB3b3VsZCBiZSBjb3ZlcmVkIGJ5IEtBU0FOIG9yIHN0YW5kYXJkIGtlcm5lbCBjaGVja3MsIG5vdCBLTVNBTi5cblxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI4OjM0LjY3NDAyNTk2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkyMTAxNTE5NzAzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lZF90eXBlX2lkeFwiLFxuICAgIFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgICBcImJwZl9idGZfbG9hZFwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBkZXB0aCBhbmQgZGV0ZWN0IGN5Y2xlcyBhY3Jvc3MgZ3JhcGggcm9vdHMgKGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290KSBhbmQgbG9jYWwga3B0cnMgKEJQRl9LUFRSX1JFRiwgQlBGX0tQVFJfUEVSQ1BVKSwgcHJldmVudGluZyBkZWVwIGtlcm5lbCByZWN1cnNpb24gZHVyaW5nIG9iamVjdCBjbGVhbnVwLlxcblxcbjEuIE1lbW9yeSBhbGxvY2F0aW9uOiBUaGUgb25seSBkeW5hbWljIGFsbG9jYXRpb24gaW50cm9kdWNlZCBpcyB0aGUgdGVtcG9yYXJ5IGBkZXB0aGAgYXJyYXkgaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAsIHdoaWNoIGlzIGFsbG9jYXRlZCB1c2luZyBga3ZjYWxsb2MoKWAgKGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQpIGFuZCBmcmVlZCB3aXRoIGBrdmZyZWUoKWAgYmVmb3JlIHJldHVybmluZy5cXG4yLiBMb2NhbCB2YXJpYWJsZXMgYW5kIGZpZWxkczogQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0IGZpZWxkcyBpbnNwZWN0ZWQgb3IgcG9wdWxhdGVkIChgcmV0YCwgYG1heF9kZXB0aGAsIGBidGZfaWRgLCBgZGVwdGhbaWR4XWApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gVXNlci1zcGFjZSBjb3BpZXM6IE5vIGRhdGEgb3Igc3RydWN0dXJlIGlzIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2U7IHRoZSB2YWxpZGF0aW9uIHJldHVybnMgc3RhbmRhcmQgZXJyb3IgY29kZXMuXFxuNC4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoc3VjaCBhcyBpbmRleGluZyBpc3N1ZXMsIHBvaW50ZXIgYXJpdGhtZXRpYywgb3IgcmVjdXJzaW9uIGxpbWl0cykgd291bGQgYmUgY292ZXJlZCBieSBLQVNBTiBvciBzdGFuZGFyZCBrZXJuZWwgY2hlY2tzLCBub3QgS01TQU4uXFxuXFxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBleHRlbmRzIEJURiBvd25lcnNoaXAgYW5kIGN5Y2xlIHZhbGlkYXRpb24gYnkgaW50cm9kdWNpbmcgZGVwdGgtYm91bmRlZCBncmFwaCB0cmF2ZXJzYWwgKGJ0Zl9vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgpIHRvIHZhbGlkYXRlIG93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGluIHVzZXItbG9hZGVkIEJURiB0eXBlcyAoc3VjaCBhcyBncmFwaCByb290cyBhbmQga3B0cnMpLiBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBpcyBkaXJlY3RseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBicGYoKSBzeXNjYWxsIChCUEZfQlRGX0xPQUQpLiBGdXp6aW5nIGNhbiB2ZXJpZnkgcmVjdXJzaW9uIGJvdW5kcywgY3ljbGUgZGV0ZWN0aW9uIGNvcnJlY3RuZXNzLCBhbmQgZWRnZSBjYXNlcyBpbiBwYXJzaW5nIGFyYml0cmFyeSB1c2VyLXN1cHBsaWVkIEJURiBkYXRhLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjoyODozNC42NzQwMzEzN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyMDc1OTUwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGY1ODQ1MjVmOTk2MDBmNmY3YWQ3YmRiODliZWFlY2M1ZmI0OGRmODFcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTY6Mjg6MzIgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmNcXG5pbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvYnRmLmNcXG4rKysgYi9rZXJuZWwvYnBmL2J0Zi5jXFxuQEAgLTQyODQsMTMgKzQyODQsMTAgQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG4ge1xcbiBcXHRpbnQgaTtcXG4gXFxuLVxcdC8qIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyB0aGF0IHNpZ25pZnkgb3duZXJzaGlwIG9mIHNvbWUgb3RoZXIgdHlwZTpcXG4tXFx0ICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC5cXG4tXFx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJ3Qgc3RvcmVcXG4tXFx0ICogcmVmZXJlbmNlcyB0byBwcm9ncmFtIGFsbG9jYXRlZCBsb2NhbCB0eXBlcy5cXG4tXFx0ICpcXG4tXFx0ICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcFxcbi1cXHQgKiBkb2VzIG5vdCBmb3JtIGN5Y2xlcy5cXG4rXFx0LypcXG4rXFx0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXFxuK1xcdCAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXNcXG4rXFx0ICogYmVlbiBmaXhlZCB1cC5cXG4gXFx0ICovXFxuIFxcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVxcdTAwM2VmaWVsZF9tYXNrIFxcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuQEAgLTQzMjEsNTEgKzQzMTgsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG4gXFx0XFx0aWYgKCFtZXRhKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFx0XFx0cmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVxcdTAwM2VyZWNvcmQ7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4gXFxuLVxcdFxcdC8qIFdlIG5lZWQgdG8gc2V0IHZhbHVlX3JlYyBmb3IgYWxsIHJvb3QgdHlwZXMsIGJ1dCBubyBuZWVkXFxuLVxcdFxcdCAqIHRvIGNoZWNrIG93bmVyc2hpcCBjeWNsZSBmb3IgYSB0eXBlIHVubGVzcyBpdCdzIGFsc28gYVxcbi1cXHRcXHQgKiBub2RlIHR5cGUuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoIShyZWMtXFx1MDAzZWZpZWxkX21hc2sgXFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXFxuK3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcXG4rXFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXFxuK3tcXG4rXFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcXG4rXFx0dTMyIGJ0Zl9pZDtcXG4rXFxuK1xcdGlmIChmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XFxuK1xcdFxcdGJ0Zl9pZCA9IGZpZWxkLVxcdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcXG4rXFx0fSBlbHNlIGlmIChmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XFxuK1xcdFxcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVxcdTAwM2VrcHRyLmJ0ZikpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNla3B0ci5idGZfaWQ7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHR9XFxuK1xcbitcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbitcXHRpZiAoIW1ldGEpXFxuK1xcdFxcdHJldHVybiBmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XFxuK1xcdHJldHVybiBtZXRhIC0gdGFiLVxcdTAwM2V0eXBlcztcXG4rfVxcbitcXG4rLypcXG4rICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXFxuKyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XFxuKyAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XFxuKyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXFxuKyAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cXG4rICovXFxuKyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxcbitcXG4rc3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcXG4rXFx0XFx0XFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxcbit7XFxuK1xcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXFx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xcbitcXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xcbitcXG4rXFx0aWYgKCFkZXB0aF9sZWZ0KVxcbitcXHRcXHRyZXR1cm4gLUVMT09QO1xcbitcXHRpZiAoZGVwdGhbaWR4XSlcXG4rXFx0XFx0Z290byBkb25lO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG4rXFx0XFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0pO1xcbitcXHRcXHRpZiAocmV0ID09IC1FTk9FTlQpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcXG4rXFx0fVxcbitcXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcXG4rZG9uZTpcXG4rXFx0cmV0dXJuIGRlcHRoW2lkeF0gXFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcXG4rfVxcbiBcXG4tXFx0XFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcXG4tXFx0XFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxcbi1cXHRcXHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXFxuLVxcdFxcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxcbi1cXHRcXHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcXG4tXFx0XFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCdzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy5cXG4tXFx0XFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhXFxuLVxcdFxcdCAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCdzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy5cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHNcXG4tXFx0XFx0ICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy5cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6XFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXBcXG4tXFx0XFx0ICogY2hhaW4gY2FuIGJlOlxcbi1cXHRcXHQgKlxcdEEgLVxcdTAwM2UgQiAtXFx1MDAzZSBDXFxuLVxcdFxcdCAqIFdoZXJlOlxcbi1cXHRcXHQgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuXFxuLVxcdFxcdCAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kXFxuLVxcdFxcdCAqICAgYnBmX2xpc3RfaGVhZC5cXG4tXFx0XFx0ICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZVxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5XFxuLVxcdFxcdCAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duXFxuLVxcdFxcdCAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuXFxuLVxcdFxcdCAqXFx0QSAtXFx1MDAzZSBCXFxuLVxcdFxcdCAqIFdoZXJlOlxcbi1cXHRcXHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxcbi1cXHRcXHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKG1ldGEtXFx1MDAzZXJlY29yZC1cXHUwMDNlZmllbGRfbWFzayBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxcbi1cXHRcXHRcXHRyZXR1cm4gLUVMT09QO1xcbitzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbitcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXFxuK3tcXG4rXFx0dTggKmRlcHRoO1xcbitcXHRpbnQgaSwgcmV0ID0gMDtcXG4rXFxuK1xcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVxcdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG4rXFx0aWYgKCFkZXB0aClcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbitcXHRcXHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0cmV0ID0gMDtcXG4gXFx0fVxcbi1cXHRyZXR1cm4gMDtcXG4rXFx0a3ZmcmVlKGRlcHRoKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxuQEAgLTYwNjAsNiArNjA5NCwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcXG4gXFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuIFxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuIFxcdFxcdH1cXG4rXFxuK1xcdFxcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xcbitcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBlcnJvdXRfbWV0YTtcXG4gXFx0fVxcbiBcXG4gXFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcXHUwMDI2ZW52LVxcdTAwM2Vsb2cpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xcbmluZGV4IGMzZDEzM2M2YTAwZDQuLjUyZmFiYmVlM2RkNWEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcXG5AQCAtNzE0LDcgKzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXG4gXFx0XFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XFxuLVxcdFxcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbitcXHRcXHRBU1NFUlRfRVEoZXJyLCAwLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0fVxcbkBAIC03NzMsNyArNzczLDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcbiBcXHRcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4tXFx0XFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShlcnIsIDAsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4gXFx0XFx0YnRmX19mcmVlKGJ0Zik7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHR9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5hNDg3YWE2OGYyZWVmXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmNcXG5AQCAtMCwwICsxLDI5NiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFNQSU5fTE9DSyAyXFxuKyNkZWZpbmUgTElTVF9IRUFEIDNcXG4rI2RlZmluZSBMSVNUX05PREUgNFxcbisvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi9cXG4rI2RlZmluZSBNQVhfT1dORVJTSElQX0RFUFRIIDhcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFx0aW50IGlkO1xcbitcXG4rXFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImJ0Zl9fbmV3X2VtcHR5XFxcIikpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRpZCA9IGJ0Zl9fYWRkX2ludChidGYsIFxcXCJpbnRcXFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCAxLCBcXFwiYnRmX19hZGRfaW50XFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiYnBmX3NwaW5fbG9ja1xcXCIsIDQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2tcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJicGZfbGlzdF9oZWFkXFxcIiwgMTYpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9IRUFELCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJicGZfbGlzdF9ub2RlXFxcIiwgMjQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X25vZGVcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHRyZXR1cm4gYnRmO1xcbitcXG4rZXJyX291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGFkZF9sb2NhbF9rcHRyKHN0cnVjdCBidGYgKmJ0ZiwgaW50IHBvaW50ZWVfaWQsIGNvbnN0IGNoYXIgKnRhZylcXG4re1xcbitcXHRpbnQgaWQ7XFxuK1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3R5cGVfdGFnKGJ0ZiwgdGFnLCBwb2ludGVlX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFxcXCJidGZfX2FkZF90eXBlX3RhZ1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gaWQ7XFxuK1xcdGlkID0gYnRmX19hZGRfcHRyKGJ0ZiwgaWQpO1xcbitcXHRBU1NFUlRfR1QoaWQsIDAsIFxcXCJidGZfX2FkZF9wdHJcXFwiKTtcXG4rXFx0cmV0dXJuIGlkO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKVxcbit7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFx0aW50IGlkLCBlcnI7XFxuK1xcbitcXHRidGYgPSBpbml0X2J0ZigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiaW5pdF9idGZcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgdGFnKTtcXG4rXFx0aWYgKGlkIFxcdTAwM2M9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJzZWxmX2N5Y2xlXFxcIiwgOCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcXFwiYnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcIm5leHRcXFwiLCA2LCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgc2VsZl9jeWNsZTo6bmV4dFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcXFwia3B0clxcXCIpO1xcbitcXHRpZiAoaWQgXFx1MDAzYz0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA5LCBcXFwia3B0clxcXCIpO1xcbitcXHRpZiAoaWQgXFx1MDAzYz0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcImN5Y2xlX2FcXFwiLCA4KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFxcXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwiYlxcXCIsIDYsIDAsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBjeWNsZV9hOjpiXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJjeWNsZV9iXFxcIiwgOCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJhXFxcIiwgOCwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIFxcXCJrcHRyXFxcIik7XFxuK1xcdGlmIChpZCBcXHUwMDNjPSAwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwibWl4ZWRfb3duZXJcXFwiLCAyMCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcXFwiYnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJyb290XFxcIiwgTElTVF9IRUFELCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcImxvY2tcXFwiLCBTUElOX0xPQ0ssIDEyOCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXFxcImNvbnRhaW5zOm1peGVkX25vZGU6bm9kZVxcXCIsIDcsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXFxcImJ0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJtaXhlZF9ub2RlXFxcIiwgMzIpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgOSwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJub2RlXFxcIiwgTElTVF9OT0RFLCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwib3duZXJcXFwiLCA2LCAxOTIsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgYm9vbCBjaGlsZF9maXJzdCwgYm9vbCBzaGFyZWRfc3VmZml4LCBpbnQgZXhwZWN0ZWRfZXJyKVxcbit7XFxuK1xcdGludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCArIDFdO1xcbitcXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyLCBpLCBuLCBwb2ludGVlX2lkO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRlcHRoOyBpKyspIHtcXG4rXFx0XFx0aWYgKGkgPT0gZGVwdGggLSAxKVxcbitcXHRcXHRcXHRwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICsgZGVwdGg7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0cG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCArIChjaGlsZF9maXJzdCA/IGRlcHRoIC0gMiAtIGkgOiBpICsgMSk7XFxuK1xcdFxcdHB0cl9pZFtpXSA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgcG9pbnRlZV9pZCwgXFxcImtwdHJcXFwiKTtcXG4rXFx0XFx0aWYgKHB0cl9pZFtpXSBcXHUwMDNjPSAwKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRmb3IgKG4gPSAwOyBuIFxcdTAwM2MgZGVwdGg7IG4rKykge1xcbitcXHRcXHRjaGFyIG5hbWVbMzJdO1xcbitcXHRcXHRpbnQgb2Zmc2V0ID0gMDtcXG4rXFxuK1xcdFxcdGkgPSBjaGlsZF9maXJzdCA/IGRlcHRoIC0gMSAtIG4gOiBuO1xcbitcXHRcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJvd25lcl8lZFxcXCIsIGkpO1xcbitcXHRcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggXFx1MDAyNlxcdTAwMjYgIWkgPyAxNiA6IDgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgbiwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBvd25lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWYgKHNoYXJlZF9zdWZmaXggXFx1MDAyNlxcdTAwMjYgIWkpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogVmlzaXQgdGhlIHNoYXJlZCBzdWZmaXggdGhyb3VnaCB0aGUgc2hvcnRlciBwYXRoIGJlZm9yZVxcbitcXHRcXHRcXHQgKiByZWFjaGluZyBpdCBhZ2FpbiB3aXRoIGxlc3MgcmVtYWluaW5nIGRlcHRoLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwic3VmZml4XFxcIiwgcHRyX2lkWzFdLCAwLCAwKTtcXG4rXFx0XFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgb3duZXI6OnN1ZmZpeFxcXCIpKVxcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0b2Zmc2V0ID0gNjQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibmV4dFxcXCIsIHB0cl9pZFtpXSwgb2Zmc2V0LCAwKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgb3duZXI6Om5leHRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwicGxhaW5fbGVhZlxcXCIsIDQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgZGVwdGgsIFxcXCJidGZfX2FkZF9zdHJ1Y3QgcGxhaW5fbGVhZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9ncmFwaF9kZXB0aChib29sIHJidHJlZSwgaW50IGRlcHRoLCBpbnQgZXhwZWN0ZWRfZXJyKVxcbit7XFxuK1xcdGludCByb290X3R5cGUgPSBMSVNUX0hFQUQsIG5vZGVfdHlwZSA9IExJU1RfTk9ERSwgbm9kZV9zaXplID0gMjQ7XFxuK1xcdGludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFxuK1xcdGJ0ZiA9IGluaXRfYnRmKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJpbml0X2J0ZlxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChyYnRyZWUpIHtcXG4rXFx0XFx0cm9vdF90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcImJwZl9yYl9yb290XFxcIiwgMTYpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HVChyb290X3R5cGUsIDAsIFxcXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX3Jvb3RcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJicGZfcmJfbm9kZVxcXCIsIDMyKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1Qobm9kZV90eXBlLCAwLCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9yYl9ub2RlXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRub2RlX3NpemUgPSAzMjtcXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRlcHRoOyBpKyspIHtcXG4rXFx0XFx0Y2hhciBuYW1lWzMyXSwgdGFnWzY0XTtcXG4rXFxuK1xcdFxcdGxvY2tfb2ZmID0gaSA/IG5vZGVfc2l6ZSA6IDA7XFxuK1xcdFxcdHJvb3Rfb2ZmID0gbG9ja19vZmYgKyA4O1xcbitcXHRcXHRzaXplID0gaSA9PSBkZXB0aCAtIDEgPyBub2RlX3NpemUgOiByb290X29mZiArIDE2O1xcbitcXHRcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJncmFwaF9vd25lcl8lZFxcXCIsIGkpO1xcbitcXHRcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBncmFwaF9vd25lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWYgKGkpIHtcXG4rXFx0XFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibm9kZVxcXCIsIG5vZGVfdHlwZSwgMCwgMCk7XFxuK1xcdFxcdFxcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlXFxcIikpXFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChpID09IGRlcHRoIC0gMSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcImxvY2tcXFwiLCBTUElOX0xPQ0ssIGxvY2tfb2ZmICogOCwgMCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpsb2NrXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJyb290XFxcIiwgcm9vdF90eXBlLCByb290X29mZiAqIDgsIDApO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c25wcmludGYodGFnLCBzaXplb2YodGFnKSwgXFxcImNvbnRhaW5zOmdyYXBoX293bmVyXyVkOm5vZGVcXFwiLCBpICsgMSk7XFxuK1xcdFxcdGVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1QoZXJyLCAwLCBcXFwiYnRmX19hZGRfZGVjbF90YWcgZ3JhcGhfb3duZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNlbGZfY3ljbGVcXFwiKSlcXG4rXFx0XFx0dGVzdF9zZWxmX2N5Y2xlKFxcXCJrcHRyXFxcIiwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInVudHJ1c3RlZF9zZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2VsZl9jeWNsZShcXFwia3B0cl91bnRydXN0ZWRcXFwiLCAwKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBlcmNwdV9zZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2VsZl9jeWNsZShcXFwicGVyY3B1X2twdHJcXFwiLCAtRUxPT1ApO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiQUJBX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3RfYWJhX2N5Y2xlKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtaXhlZF9ncmFwaF9yb290X2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3RfbWl4ZWRfY3ljbGUoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1heF9hY3ljbGljXFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgZmFsc2UsIDApO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidG9vX2RlZXBfYWN5Y2xpY1xcXCIpKVxcbitcXHRcXHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIGZhbHNlLCBmYWxzZSwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1heF9hY3ljbGljX2NoaWxkX2ZpcnN0XFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCB0cnVlLCBmYWxzZSwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0XFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgdHJ1ZSwgZmFsc2UsIC1FTE9PUCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYXhfYWN5Y2xpY19zaGFyZWRfc3VmZml4XFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgdHJ1ZSwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcXFwiKSlcXG4rXFx0XFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggKyAxLCBmYWxzZSwgdHJ1ZSwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxpc3RfdGhyZWVfdHlwZXNcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgMywgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJsaXN0X2ZvdXJfdHlwZXNcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJsaXN0X21heF9kZXB0aFxcXCIpKVxcbitcXHRcXHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxpc3RfdG9vX2RlZXBcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyYnRyZWVfdGhyZWVfdHlwZXNcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCAzLCAwKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJidHJlZV9mb3VyX3R5cGVzXFxcIikpXFxuK1xcdFxcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgNCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyYnRyZWVfbWF4X2RlcHRoXFxcIikpXFxuK1xcdFxcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyYnRyZWVfdG9vX2RlZXBcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCBNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgLUVMT09QKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjoyODozNi4xOTU0NjE2NzVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE1MDUyNjU5MTk5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lZF90eXBlX2lkeFwiLFxuICAgIFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgICBcImJwZl9idGZfbG9hZFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZXh0ZW5kcyBCVEYgb3duZXJzaGlwIGFuZCBjeWNsZSB2YWxpZGF0aW9uIGJ5IGludHJvZHVjaW5nIGRlcHRoLWJvdW5kZWQgZ3JhcGggdHJhdmVyc2FsIChidGZfb3duZXJzaGlwX2RlcHRoIGFuZCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKSB0byB2YWxpZGF0ZSBvd25lcnNoaXAgcmVsYXRpb25zaGlwcyBpbiB1c2VyLWxvYWRlZCBCVEYgdHlwZXMgKHN1Y2ggYXMgZ3JhcGggcm9vdHMgYW5kIGtwdHJzKS4gVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSBhbmQgaXMgZGlyZWN0bHkgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYnBmKCkgc3lzY2FsbCAoQlBGX0JURl9MT0FEKS4gRnV6emluZyBjYW4gdmVyaWZ5IHJlY3Vyc2lvbiBib3VuZHMsIGN5Y2xlIGRldGVjdGlvbiBjb3JyZWN0bmVzcywgYW5kIGVkZ2UgY2FzZXMgaW4gcGFyc2luZyBhcmJpdHJhcnkgdXNlci1zdXBwbGllZCBCVEYgZGF0YS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBmNTg0NTI1Zjk5NjAwZjZmN2FkN2JkYjg5YmVhZWNjNWZiNDhkZjgxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTY6Mjg6MzIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuY1xuaW5kZXggN2RhZjRjMjg2YzliMi4uOTIyMTdhMTRiOWQzZCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvYnRmLmNcbisrKyBiL2tlcm5lbC9icGYvYnRmLmNcbkBAIC00Mjg0LDEzICs0Mjg0LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4ge1xuIFx0aW50IGk7XG4gXG4tXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XG4tXHQgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LlxuLVx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJ3Qgc3RvcmVcbi1cdCAqIHJlZmVyZW5jZXMgdG8gcHJvZ3JhbSBhbGxvY2F0ZWQgbG9jYWwgdHlwZXMuXG4tXHQgKlxuLVx0ICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcFxuLVx0ICogZG9lcyBub3QgZm9ybSBjeWNsZXMuXG4rXHQvKlxuK1x0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG4rXHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXG4rXHQgKiBiZWVuIGZpeGVkIHVwLlxuIFx0ICovXG4gXHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxuIFx0XHRyZXR1cm4gMDtcbkBAIC00MzIxLDUxICs0MzE4LDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGlmICghbWV0YSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuK1x0fVxuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxuLVx0XHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQncyBhbHNvIGFcbi1cdFx0ICogbm9kZSB0eXBlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9OT0RFKSlcbitzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXG4rXHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG4re1xuK1x0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcbitcdHUzMiBidGZfaWQ7XG4rXG4rXHRpZiAoZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcbitcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG4rXHR9IGVsc2UgaWYgKGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XG4rXHRcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSlcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNla3B0ci5idGZfaWQ7XG4rXHR9IGVsc2Uge1xuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbitcbitcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG4rXHRpZiAoIW1ldGEpXG4rXHRcdHJldHVybiBmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xuK1x0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG4rfVxuK1xuKy8qXG4rICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXG4rICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcbisgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuKyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXG4rICogbm9uLXJlY3Vyc2luZyBkcm9wLlxuKyAqL1xuKyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxuK1xuK3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcbitcdFx0XHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi1cdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcbitcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XG4rXG4rXHRpZiAoIWRlcHRoX2xlZnQpXG4rXHRcdHJldHVybiAtRUxPT1A7XG4rXHRpZiAoZGVwdGhbaWR4XSlcbitcdFx0Z290byBkb25lO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSsrKSB7XG4rXHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG4rXHRcdGlmIChyZXQgPT0gLUVOT0VOVClcbiBcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcbitcdH1cbitcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggKyAxO1xuK2RvbmU6XG4rXHRyZXR1cm4gZGVwdGhbaWR4XSBcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XG4rfVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIGVuc3VyZSBvd25lcnNoaXAgYWN5Y2xpY2l0eSBhbW9uZyBhbGwgdHlwZXMuIFRoZVxuLVx0XHQgKiBwcm9wZXIgd2F5IHRvIGRvIGl0IHdvdWxkIGJlIHRvIHRvcG9sb2dpY2FsbHkgc29ydCBhbGwgQlRGXG4tXHRcdCAqIElEcyBiYXNlZCBvbiB0aGUgb3duZXJzaGlwIGVkZ2VzLCBzaW5jZSB0aGVyZSBjYW4gYmUgbXVsdGlwbGVcbi1cdFx0ICogYnBmX3tsaXN0X2hlYWQscmJfbm9kZX0gaW4gYSB0eXBlLiBJbnN0ZWFkLCB3ZSB1c2UgdGhlXG4tXHRcdCAqIGZvbGxvd2luZyByZXNhb25pbmc6XG4tXHRcdCAqXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IGJlIG93bmVkIGJ5IGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdFxuLVx0XHQgKiAgIGhhcyBhIGJwZl97bGlzdCxyYn1fbm9kZS4gTGV0J3MgY2FsbCB0aGVzZSBub2RlIHR5cGVzLlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBfb3duXyBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQgaGFzIGFcbi1cdFx0ICogICBicGZfe2xpc3RfaGVhZCxyYl9yb290fS4gTGV0J3MgY2FsbCB0aGVzZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0c1xuLVx0XHQgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eTpcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcFxuLVx0XHQgKiBjaGFpbiBjYW4gYmU6XG4tXHRcdCAqXHRBIC1cdTAwM2UgQiAtXHUwMDNlIENcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC5cbi1cdFx0ICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmRcbi1cdFx0ICogICBicGZfbGlzdF9oZWFkLlxuLVx0XHQgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlXG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHlcbi1cdFx0ICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd25cbi1cdFx0ICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy5cbi1cdFx0ICpcdEEgLVx1MDAzZSBCXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxuLVx0XHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKG1ldGEtXHUwMDNlcmVjb3JkLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxuLVx0XHRcdHJldHVybiAtRUxPT1A7XG4rc3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHRcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcbit7XG4rXHR1OCAqZGVwdGg7XG4rXHRpbnQgaSwgcmV0ID0gMDtcbitcbitcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuK1x0aWYgKCFkZXB0aClcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWItXHUwMDNlY250OyBpKyspIHtcbitcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksXG4rXHRcdFx0XHRcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRyZXQgPSAwO1xuIFx0fVxuLVx0cmV0dXJuIDA7XG4rXHRrdmZyZWUoZGVwdGgpO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG5AQCAtNjA2MCw2ICs2MDk0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0XHR9XG4rXG4rXHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xuK1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG4gXHR9XG4gXG4gXHRlcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFx1MDAyNmVudi1cdTAwM2Vsb2cpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXG5pbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuQEAgLTcxNCw3ICs3MTQsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCJjaGVjayBidGZcIik7XG4gXHRcdGJ0Zl9fZnJlZShidGYpO1xuIFx0XHRicmVhaztcbiBcdH1cbkBAIC03NzMsNyArNzczLDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcbiBcdFx0XHRicmVhaztcbiBcbiBcdFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4tXHRcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rXHRcdEFTU0VSVF9FUShlcnIsIDAsIFwiY2hlY2sgYnRmXCIpO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5hNDg3YWE2OGYyZWVmXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5AQCAtMCwwICsxLDI5NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rXG4rI2RlZmluZSBTUElOX0xPQ0sgMlxuKyNkZWZpbmUgTElTVF9IRUFEIDNcbisjZGVmaW5lIExJU1RfTk9ERSA0XG4rLyogS2VlcCBpbiBzeW5jIHdpdGggQlRGX01BWF9PV05FUlNISVBfREVQVEguICovXG4rI2RlZmluZSBNQVhfT1dORVJTSElQX0RFUFRIIDhcbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqaW5pdF9idGYodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQ7XG4rXG4rXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJidGZfX25ld19lbXB0eVwiKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZCA9IGJ0Zl9fYWRkX2ludChidGYsIFwiaW50XCIsIDQsIEJURl9JTlRfU0lHTkVEKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCAxLCBcImJ0Zl9fYWRkX2ludFwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9zcGluX2xvY2tcIiwgNCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfc3Bpbl9sb2NrXCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX2xpc3RfaGVhZFwiLCAxNik7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9IRUFELCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9oZWFkXCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX2xpc3Rfbm9kZVwiLCAyNCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRyZXR1cm4gYnRmO1xuK1xuK2Vycl9vdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgaW50IGFkZF9sb2NhbF9rcHRyKHN0cnVjdCBidGYgKmJ0ZiwgaW50IHBvaW50ZWVfaWQsIGNvbnN0IGNoYXIgKnRhZylcbit7XG4rXHRpbnQgaWQ7XG4rXG4rXHRpZCA9IGJ0Zl9fYWRkX3R5cGVfdGFnKGJ0ZiwgdGFnLCBwb2ludGVlX2lkKTtcbitcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcImJ0Zl9fYWRkX3R5cGVfdGFnXCIpKVxuK1x0XHRyZXR1cm4gaWQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3B0cihidGYsIGlkKTtcbitcdEFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF9wdHJcIik7XG4rXHRyZXR1cm4gaWQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2VsZl9jeWNsZShjb25zdCBjaGFyICp0YWcsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnI7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJzZWxmX2N5Y2xlXCIsIDgpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwiYnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm5leHRcIiwgNiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgc2VsZl9jeWNsZTo6bmV4dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnI7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcImtwdHJcIik7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA5LCBcImtwdHJcIik7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJjeWNsZV9hXCIsIDgpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2FcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImJcIiwgNiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiY3ljbGVfYlwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwiYVwiLCA4LCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBjeWNsZV9iOjphXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9taXhlZF9jeWNsZSh2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcImtwdHJcIik7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJtaXhlZF9vd25lclwiLCAyMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXCJidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcInJvb3RcIiwgTElTVF9IRUFELCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6cm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibG9ja1wiLCBTUElOX0xPQ0ssIDEyOCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OmxvY2tcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9kZWNsX3RhZyhidGYsIFwiY29udGFpbnM6bWl4ZWRfbm9kZTpub2RlXCIsIDcsIDApO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDgsIFwiYnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcIm1peGVkX25vZGVcIiwgMzIpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwiYnRmX19hZGRfc3RydWN0IG1peGVkX25vZGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm5vZGVcIiwgTElTVF9OT0RFLCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpub2RlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJvd25lclwiLCA2LCAxOTIsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgYm9vbCBjaGlsZF9maXJzdCwgYm9vbCBzaGFyZWRfc3VmZml4LCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdGludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCArIDFdO1xuK1x0aW50IGZpcnN0X3N0cnVjdF9pZDtcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyLCBpLCBuLCBwb2ludGVlX2lkO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGZpcnN0X3N0cnVjdF9pZCA9IDUgKyAyICogZGVwdGg7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSsrKSB7XG4rXHRcdGlmIChpID09IGRlcHRoIC0gMSlcbitcdFx0XHRwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICsgZGVwdGg7XG4rXHRcdGVsc2VcbitcdFx0XHRwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICsgKGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAyIC0gaSA6IGkgKyAxKTtcbitcdFx0cHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBwb2ludGVlX2lkLCBcImtwdHJcIik7XG4rXHRcdGlmIChwdHJfaWRbaV0gXHUwMDNjPSAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0Zm9yIChuID0gMDsgbiBcdTAwM2MgZGVwdGg7IG4rKykge1xuK1x0XHRjaGFyIG5hbWVbMzJdO1xuK1x0XHRpbnQgb2Zmc2V0ID0gMDtcbitcbitcdFx0aSA9IGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAxIC0gbiA6IG47XG4rXHRcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCJvd25lcl8lZFwiLCBpKTtcbitcdFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBuYW1lLCBzaGFyZWRfc3VmZml4IFx1MDAyNlx1MDAyNiAhaSA/IDE2IDogOCk7XG4rXHRcdGlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgKyBuLCBcImJ0Zl9fYWRkX3N0cnVjdCBvd25lclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWYgKHNoYXJlZF9zdWZmaXggXHUwMDI2XHUwMDI2ICFpKSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBWaXNpdCB0aGUgc2hhcmVkIHN1ZmZpeCB0aHJvdWdoIHRoZSBzaG9ydGVyIHBhdGggYmVmb3JlXG4rXHRcdFx0ICogcmVhY2hpbmcgaXQgYWdhaW4gd2l0aCBsZXNzIHJlbWFpbmluZyBkZXB0aC5cbitcdFx0XHQgKi9cbitcdFx0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwic3VmZml4XCIsIHB0cl9pZFsxXSwgMCwgMCk7XG4rXHRcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG93bmVyOjpzdWZmaXhcIikpXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHRvZmZzZXQgPSA2NDtcbitcdFx0fVxuK1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibmV4dFwiLCBwdHJfaWRbaV0sIG9mZnNldCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJwbGFpbl9sZWFmXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcImJ0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9ncmFwaF9kZXB0aChib29sIHJidHJlZSwgaW50IGRlcHRoLCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdGludCByb290X3R5cGUgPSBMSVNUX0hFQUQsIG5vZGVfdHlwZSA9IExJU1RfTk9ERSwgbm9kZV9zaXplID0gMjQ7XG4rXHRpbnQgaWQsIGVyciwgaSwgbG9ja19vZmYsIHJvb3Rfb2ZmLCBzaXplO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlmIChyYnRyZWUpIHtcbitcdFx0cm9vdF90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfcmJfcm9vdFwiLCAxNik7XG4rXHRcdGlmICghQVNTRVJUX0dUKHJvb3RfdHlwZSwgMCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX3Jvb3RcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdG5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX3JiX25vZGVcIiwgMzIpO1xuK1x0XHRpZiAoIUFTU0VSVF9HVChub2RlX3R5cGUsIDAsIFwiYnRmX19hZGRfc3RydWN0IGJwZl9yYl9ub2RlXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRub2RlX3NpemUgPSAzMjtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0Y2hhciBuYW1lWzMyXSwgdGFnWzY0XTtcbitcbitcdFx0bG9ja19vZmYgPSBpID8gbm9kZV9zaXplIDogMDtcbitcdFx0cm9vdF9vZmYgPSBsb2NrX29mZiArIDg7XG4rXHRcdHNpemUgPSBpID09IGRlcHRoIC0gMSA/IG5vZGVfc2l6ZSA6IHJvb3Rfb2ZmICsgMTY7XG4rXHRcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCJncmFwaF9vd25lcl8lZFwiLCBpKTtcbitcdFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBuYW1lLCBzaXplKTtcbitcdFx0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfc3RydWN0IGdyYXBoX293bmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRpZiAoaSkge1xuK1x0XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJub2RlXCIsIG5vZGVfdHlwZSwgMCwgMCk7XG4rXHRcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlXCIpKVxuK1x0XHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0aWYgKGkgPT0gZGVwdGggLSAxKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibG9ja1wiLCBTUElOX0xPQ0ssIGxvY2tfb2ZmICogOCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6bG9ja1wiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcInJvb3RcIiwgcm9vdF90eXBlLCByb290X29mZiAqIDgsIDApO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OnJvb3RcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNucHJpbnRmKHRhZywgc2l6ZW9mKHRhZyksIFwiY29udGFpbnM6Z3JhcGhfb3duZXJfJWQ6bm9kZVwiLCBpICsgMSk7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTtcbitcdFx0aWYgKCFBU1NFUlRfR1QoZXJyLCAwLCBcImJ0Zl9fYWRkX2RlY2xfdGFnIGdyYXBoX293bmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbit2b2lkIHRlc3RfbG9jYWxfa3B0cl9vd25lcnNoaXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcImtwdHJcIiwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidW50cnVzdGVkX3NlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcImtwdHJfdW50cnVzdGVkXCIsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwZXJjcHVfc2VsZl9jeWNsZVwiKSlcbitcdFx0dGVzdF9zZWxmX2N5Y2xlKFwicGVyY3B1X2twdHJcIiwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiQUJBX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X2FiYV9jeWNsZSgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtaXhlZF9ncmFwaF9yb290X2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X21peGVkX2N5Y2xlKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1heF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgZmFsc2UsIGZhbHNlLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidG9vX2RlZXBfYWN5Y2xpY1wiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggKyAxLCBmYWxzZSwgZmFsc2UsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1heF9hY3ljbGljX2NoaWxkX2ZpcnN0XCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgdHJ1ZSwgZmFsc2UsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0XCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIHRydWUsIGZhbHNlLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYXhfYWN5Y2xpY19zaGFyZWRfc3VmZml4XCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgZmFsc2UsIHRydWUsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgZmFsc2UsIHRydWUsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfdGhyZWVfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDMsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJsaXN0X2ZvdXJfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDQsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJsaXN0X21heF9kZXB0aFwiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfdG9vX2RlZXBcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIE1BWF9PV05FUlNISVBfREVQVEggKyAxLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyYnRyZWVfdGhyZWVfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgMywgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV9mb3VyX3R5cGVzXCIpKVxuK1x0XHR0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIDQsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyYnRyZWVfbWF4X2RlcHRoXCIpKVxuK1x0XHR0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIE1BWF9PV05FUlNISVBfREVQVEgsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyYnRyZWVfdG9vX2RlZXBcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjg6MzYuMTk1NDYzMTc1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTYwMTUxNzQxNDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEJQRiBCVEYgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgcmV2aWV3IHJlcXVlc3QuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0IHRhcmdldHMgbW9kaWZpY2F0aW9ucyB3aXRoaW4gYGtlcm5lbC9icGYvYnRmLmNgIGFuZCBhbHNvIHRvdWNoZXMgdGhlIHNlbGZ0ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2AuIFRoYXQncyBhIHJlYXNvbmFibGUgc2NvcGU7IEJURiBjaGFuZ2VzIG9mdGVuIG5lY2Vzc2l0YXRlIHRlc3QgYWRqdXN0bWVudHMuXG5cbk5vdywgbGV0J3MgbG9vayBhdCB0aGUgZGlmZi4gU3BlY2lmaWNhbGx5LCBJIHNlZSBjaGFuZ2VzIHdpdGhpbiBga2VybmVsL2JwZi9idGYuY2AgaW1wYWN0aW5nIHRoZSBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGZ1bmN0aW9uLiBOb3RhYmx5LCB0aGV5J3ZlIHJlbW92ZWQgc29tZSBvbGQgY3ljbGUtY2hlY2tpbmcgbG9naWMgYW5kIGludHJvZHVjZWQgbmV3IGZ1bmN0aW9uczogYGJ0Zl9vd25lZF90eXBlX2lkeGAsIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYW5kIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYC4gQ3J1Y2lhbGx5LCBJIHNlZSB0aGF0IGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCBpcyBub3cgY2FsbGVkIHdpdGhpbiBgYnRmX3BhcnNlYDpcblxuYGBgY1xuXHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xuXHRcdGlmIChlcnIgXHUwMDNjIDApXG5cdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuYGBgXG5cblRoaXMgaXMgc2lnbmlmaWNhbnQuIGBidGZfcGFyc2VgIGlzIHBhcnQgb2YgdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSwgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCwgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIEJURiBsb2FkaW5nIGFuZCB2YWxpZGF0aW9uLiBSZW1lbWJlciwgYGJ0Zl9wYXJzZWAgaXMgaW52b2tlZCB3aGVuIGxvYWRpbmcgQlRGIGRhdGEgdmlhIHRoZSBgYnBmYCBzeXNjYWxsJ3MgYEJQRl9CVEZfTE9BRGAgb3BlcmF0aW9uLiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIFRoaXMgZnVuY3Rpb24gaXMgKmRpcmVjdGx5KiBpbnZvbHZlZCBpbiBwcm9jZXNzaW5nIHVudHJ1c3RlZCB1c2VyIGlucHV0IHRoYXQgY29tZXMgZnJvbSB1c2Vyc3BhY2Ugd2hlbiBjYWxsaW5nIGBzeXNfYnBmKEJQRl9CVEZfTE9BRCwgLi4uKWAhIFdlJ3JlIHRhbGtpbmcgYWJvdXQgYSBjcml0aWNhbCB2YWxpZGF0aW9uIHBvaW50LlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gcXVpY2tseSBldmFsdWF0ZSByZWFjaGFiaWxpdHkuIE5vIHN1cnByaXNlcyBoZXJlLCBJIGV4cGVjdCB0aGF0IHRoaXMgYEJQRl9CVEZfTE9BRGAgc3lzY2FsbCBpcyByZWFkaWx5IHJlYWNoYWJsZSBpbiBzdGFuZGFyZCBRRU1VL3N5emthbGxlciBzZXR1cHMuICBTeXprYWxsZXIgaXMga25vd24gdG8gYWdncmVzc2l2ZWx5IGZ1enogdGhpcyBzeXNjYWxsLCB3aGljaCBtYWtlcyB0aGlzIGNoYW5nZSBwb3RlbnRpYWxseSBoaWdoLWltcGFjdC5cblxuSSdsbCBub3cgbmVlZCB0byByZWFkIGFyb3VuZCB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgcmVsYXRlZCBjaGFuZ2VzIHdpdGhpbiBga2VybmVsL2JwZi9idGYuY2AgdG8gZ2V0IGEgYmV0dGVyIHNlbnNlIG9mIHRoZSBjb250ZXh0IGFuZCBpbXBhY3QgdXNpbmcgYHJlYWQtZmlsZWAgb3IgYGdyZXBwZXJgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzQ4LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzM1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjg6NTIuMjEwNjQwMTE5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwNDMzMDUyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9idGYuYz00MzU2PXN0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQzODMtXFxua2VybmVsL2JwZi9idGYuYzo0Mzg0OnN0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxua2VybmVsL2JwZi9idGYuYy00Mzg1LVxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjAxND1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA5Ny1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTg6XFx0XFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XFxua2VybmVsL2JwZi9idGYuYy02MDk5LVxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjoyODo1Mi4yNjEwNzg2NTFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNzgxNjE5MDMyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSBtZW50YWwgd2Fsa3Rocm91Z2gsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhlIGNvZGU6XG5cbioqRGl2aW5nIGludG8gQlRGIEludGVybmFscyoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gZm9jdXNpbmcgb24gYGtlcm5lbC9icGYvYnRmLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSA0MzEwIHRvIDQ0MDUgbGluZSByYW5nZS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB3aGF0J3MgaGFwcGVuaW5nIGluIHRoaXMgc2VjdGlvbi4gSSBiZXQgaXQncyByZWxhdGVkIHRvIHNvbWUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIG1ldGFkYXRhIGhhbmRsaW5nLCBsaWtlbHkgZGVhbGluZyB3aXRoIGhvdyB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgb3IgbWFuaXB1bGF0ZWQuIEdpdmVuIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIEJURiBjb2RlLCBpdCdzIHByb2JhYmx5IHJlbGF0ZWQgdG8gZWl0aGVyIHBhcnNpbmcsIGdlbmVyYXRpbmcsIG9yIGNvbnN1bWluZyBCVEYgaW5mb3JtYXRpb24uIEknbGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCBmdW5jdGlvbihzKSBvciBsb2dpYyBiZWluZyBpbXBsZW1lbnRlZCBpbiB0aGF0IHNlY3Rpb24uIEFyZSB3ZSB2YWxpZGF0aW5nIHNvbWV0aGluZz8gRGVjb2RpbmcgdHlwZSBpbmZvcm1hdGlvbj8gQnVpbGRpbmcgQlRGIHN0cnVjdHVyZXM/IE9yIHBlcmhhcHMsIG1vZGlmeWluZyBCVEYgZGF0YSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzIGxpa2Uga2VybmVsIHVwZ3JhZGVzPyBJJ2xsIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIHN1cnJvdW5kaW5nIGNvbW1lbnRzIGNsb3NlbHkgZm9yIGNvbnRleHQsIHRoZW4gZGlnIGludG8gdGhlIGNvZGUgaXRzZWxmLCBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIHZhcmlhYmxlIG5hbWVzIGFuZCBmdW5jdGlvbiBjYWxscy4gS25vd2luZyBtZSwgSSdsbCBuZWVkIHRvIHRyYWNlIGEgZmV3IGNhbGxzIGRvd24gdG8gYmUgY2VydGFpbiBvZiBpdHMgdHJ1ZSBmdW5jdGlvbiBhbmQgcHVycG9zZS4gTGV0J3Mgc2VlIHdoYXQgc2VjcmV0cyB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgaG9sZHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNDUxLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6MTAuMDc3MjcxNTY5WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkyMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvYnRmLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDMxMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjQzMTA6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FMkJJRztcXG40MzExOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzMTI6XFx0XFx0XFx0fVxcbjQzMTM6XFx0XFxuNDMxNDpcXHRcXHRcXHRpZiAoIShyZWMtXFx1MDAzZWZpZWxkc1tpXS50eXBlIFxcdTAwMjYgQlBGX0dSQVBIX1JPT1QpKVxcbjQzMTU6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuNDMxNjpcXHRcXHRcXHRidGZfaWQgPSByZWMtXFx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcXG40MzE3OlxcdFxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxuNDMxODpcXHRcXHRcXHRpZiAoIW1ldGEpXFxuNDMxOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG40MzIwOlxcdFxcdFxcdHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cXHUwMDNlcmVjb3JkO1xcbjQzMjE6XFx0XFx0fVxcbjQzMjI6XFx0XFx0cmV0dXJuIDA7XFxuNDMyMzpcXHR9XFxuNDMyNDpcXHRcXG40MzI1OlxcdHN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcXG40MzI2OlxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxcbjQzMjc6XFx0e1xcbjQzMjg6XFx0XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcXG40MzI5OlxcdFxcdHUzMiBidGZfaWQ7XFxuNDMzMDpcXHRcXG40MzMxOlxcdFxcdGlmIChmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XFxuNDMzMjpcXHRcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuNDMzMzpcXHRcXHR9IGVsc2UgaWYgKGZpZWxkLVxcdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHtcXG40MzM0OlxcdFxcdFxcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVxcdTAwM2VrcHRyLmJ0ZikpXFxuNDMzNTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG40MzM2OlxcdFxcdFxcdGJ0Zl9pZCA9IGZpZWxkLVxcdTAwM2VrcHRyLmJ0Zl9pZDtcXG40MzM3OlxcdFxcdH0gZWxzZSB7XFxuNDMzODpcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG40MzM5OlxcdFxcdH1cXG40MzQwOlxcdFxcbjQzNDE6XFx0XFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcXG40MzQyOlxcdFxcdGlmICghbWV0YSlcXG40MzQzOlxcdFxcdFxcdHJldHVybiBmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XFxuNDM0NDpcXHRcXHRyZXR1cm4gbWV0YSAtIHRhYi1cXHUwMDNldHlwZXM7XFxuNDM0NTpcXHR9XFxuNDM0NjpcXHRcXG40MzQ3OlxcdC8qXFxuNDM0ODpcXHQgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmRcXG40MzQ5OlxcdCAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XFxuNDM1MDpcXHQgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxcbjQzNTE6XFx0ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcXG40MzUyOlxcdCAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cXG40MzUzOlxcdCAqL1xcbjQzNTQ6XFx0I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XFxuNDM1NTpcXHRcXG40MzU2OlxcdHN0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuNDM1NzpcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxcbjQzNTg6XFx0XFx0XFx0XFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxcbjQzNTk6XFx0e1xcbjQzNjA6XFx0XFx0Y29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi1cXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XFxuNDM2MTpcXHRcXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xcbjQzNjI6XFx0XFxuNDM2MzpcXHRcXHRpZiAoIWRlcHRoX2xlZnQpXFxuNDM2NDpcXHRcXHRcXHRyZXR1cm4gLUVMT09QO1xcbjQzNjU6XFx0XFx0aWYgKGRlcHRoW2lkeF0pXFxuNDM2NjpcXHRcXHRcXHRnb3RvIGRvbmU7XFxuNDM2NzpcXHRcXG40MzY4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyByZWMtXFx1MDAzZWNudDsgaSsrKSB7XFxuNDM2OTpcXHRcXHRcXHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFxcdTAwMjZyZWMtXFx1MDAzZWZpZWxkc1tpXSk7XFxuNDM3MDpcXHRcXHRcXHRpZiAocmV0ID09IC1FTk9FTlQpXFxuNDM3MTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzcyOlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNzM6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40Mzc0OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcXG40Mzc1OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNzY6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40Mzc3OlxcdFxcdFxcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XFxuNDM3ODpcXHRcXHR9XFxuNDM3OTpcXHRcXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcXG40MzgwOlxcdGRvbmU6XFxuNDM4MTpcXHRcXHRyZXR1cm4gZGVwdGhbaWR4XSBcXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xcbjQzODI6XFx0fVxcbjQzODM6XFx0XFxuNDM4NDpcXHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbjQzODU6XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbjQzODY6XFx0e1xcbjQzODc6XFx0XFx0dTggKmRlcHRoO1xcbjQzODg6XFx0XFx0aW50IGksIHJldCA9IDA7XFxuNDM4OTpcXHRcXG40MzkwOlxcdFxcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVxcdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG40MzkxOlxcdFxcdGlmICghZGVwdGgpXFxuNDM5MjpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG40MzkzOlxcdFxcbjQzOTQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRhYi1cXHUwMDNlY250OyBpKyspIHtcXG40Mzk1OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxcbjQzOTY6XFx0XFx0XFx0XFx0XFx0XFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XFxuNDM5NzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40Mzk4OlxcdFxcdFxcdFxcdGJyZWFrO1xcbjQzOTk6XFx0XFx0XFx0cmV0ID0gMDtcXG40NDAwOlxcdFxcdH1cXG40NDAxOlxcdFxcdGt2ZnJlZShkZXB0aCk7XFxuNDQwMjpcXHRcXHRyZXR1cm4gcmV0O1xcbjQ0MDM6XFx0fVxcbjQ0MDQ6XFx0XFxuNDQwNTpcXHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcXG40NDA2OlxcdFxcdFxcdFxcdCAgICAgIHUzMiB0eXBlX2lkLCB2b2lkICpkYXRhLCB1OCBiaXRzX29mZnNldCxcXG40NDA3OlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBidGZfc2hvdyAqc2hvdylcXG40NDA4OlxcdHtcXG40NDA5OlxcdFxcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjEwLjA3Nzc2NjEzOVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU5MjgzMDY3MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQW5hbHl6aW5nIHRoZSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgQ29udGV4dCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgYXJvdW5kIHRoYXQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGNhbGwuIExldCBtZSBxdWlja2x5IGV4YW1pbmUgdGhlIGNvZGUgZnJvbSBsaW5lIDYwODAgdG8gNjExNS4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgaW1tZWRpYXRlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEknbSBsb29raW5nIGZvciB0aGUgYXJndW1lbnRzIGJlaW5nIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24sIHRoZSB2YXJpYWJsZXMgYmVpbmcgdXNlZCwgYW5kIGFueSBjb25kaXRpb25hbCBsb2dpYyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSBpdHMgYmVoYXZpb3IuIEhvcGVmdWxseSB0aGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgb3duZXJzaGlwIGRlcHRoIGNoZWNrIGlzIHRyaWdnZXJlZCBhbmQgd2hhdCBpdCdzIHRyeWluZyB0byBhY2NvbXBsaXNoIHdpdGhpbiB0aGF0IHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGNvZGUuIFRoaXMgaXMgbGlrZWx5IHJlbGF0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIHBhc3NlZCBpbiBmcm9tIHNvbWV3aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzNDYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjE2LjAwNjA3NDkyNloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODcwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjYwODA6XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuNjA4MTpcXHRcXG42MDgyOlxcdFxcdHN0cnVjdF9tZXRhX3RhYiA9IGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoXFx1MDAyNmVudi1cXHUwMDNlbG9nLCBidGYpO1xcbjYwODM6XFx0XFx0aWYgKElTX0VSUihzdHJ1Y3RfbWV0YV90YWIpKSB7XFxuNjA4NDpcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKHN0cnVjdF9tZXRhX3RhYik7XFxuNjA4NTpcXHRcXHRcXHRnb3RvIGVycm91dDtcXG42MDg2OlxcdFxcdH1cXG42MDg3OlxcdFxcdGJ0Zi1cXHUwMDNlc3RydWN0X21ldGFfdGFiID0gc3RydWN0X21ldGFfdGFiO1xcbjYwODg6XFx0XFxuNjA4OTpcXHRcXHRpZiAoc3RydWN0X21ldGFfdGFiKSB7XFxuNjA5MDpcXHRcXHRcXHRpbnQgaTtcXG42MDkxOlxcdFxcbjYwOTI6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNlY250OyBpKyspIHtcXG42MDkzOlxcdFxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVxcdTAwM2V0eXBlc1tpXS5yZWNvcmQpO1xcbjYwOTQ6XFx0XFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuNjA5NTpcXHRcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbjYwOTY6XFx0XFx0XFx0fVxcbjYwOTc6XFx0XFxuNjA5ODpcXHRcXHRcXHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcXG42MDk5OlxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbjYxMDA6XFx0XFx0XFx0XFx0Z290byBlcnJvdXRfbWV0YTtcXG42MTAxOlxcdFxcdH1cXG42MTAyOlxcdFxcbjYxMDM6XFx0XFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcXHUwMDI2ZW52LVxcdTAwM2Vsb2cpO1xcbjYxMDQ6XFx0XFx0aWYgKGVycilcXG42MTA1OlxcdFxcdFxcdGdvdG8gZXJyb3V0X2ZyZWU7XFxuNjEwNjpcXHRcXG42MTA3OlxcdFxcdGJ0Zl92ZXJpZmllcl9lbnZfZnJlZShlbnYpO1xcbjYxMDg6XFx0XFx0cmVmY291bnRfc2V0KFxcdTAwMjZidGYtXFx1MDAzZXJlZmNudCwgMSk7XFxuNjEwOTpcXHRcXHRyZXR1cm4gYnRmO1xcbjYxMTA6XFx0XFxuNjExMTpcXHRlcnJvdXRfbWV0YTpcXG42MTEyOlxcdFxcdGJ0Zl9mcmVlX3N0cnVjdF9tZXRhX3RhYihidGYpO1xcbjYxMTM6XFx0ZXJyb3V0OlxcbjYxMTQ6XFx0XFx0Lyogb3ZlcndyaXRlIGVyciB3aXRoIC1FTk9TUEMgb3IgLUVGQVVMVCAqL1xcbjYxMTU6XFx0XFx0cmV0ID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcXHUwMDI2ZW52LVxcdTAwM2Vsb2cpO1xcbjYxMTY6XFx0XFx0aWYgKHJldClcXG42MTE3OlxcdFxcdFxcdGVyciA9IHJldDtcXG42MTE4OlxcdGVycm91dF9mcmVlOlxcbjYxMTk6XFx0XFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjE2LjAwNjU2NjA1NloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEwNDYxNjg0MzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBCUEYvQlRGIE93bmVyc2hpcCBEZXB0aCBDaGVjayoqXG5cbk9rYXksIHRoaXMgaXMgZGVmaW5pdGVseSBwcm9taXNpbmcuIFRoZSBCUEYvQlRGIHN1YnN5c3RlbSBpcyBhIGNyaXRpY2FsIHBpZWNlLCBhbmQgdGhpcyBjb2RlIHBhdGggaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggdGhlIGBCUEZfQlRGX0xPQURgIHN5c2NhbGwuIEl0J3MgbW9kaWZ5aW5nIHRoZSBCVEYgb3duZXJzaGlwIGdyYXBoIHZhbGlkYXRpb24gbG9naWMsIHNwZWNpZmljYWxseSByZXBsYWNpbmcgYW4gYWQtaG9jIGN5Y2xlIGNoZWNrIHdpdGggYSBkZXB0aC1jaGVja2luZyByZWN1cnNpdmUgYWxnb3JpdGhtIChgYnRmX293bmVyc2hpcF9kZXB0aGApLiBUaGF0J3MgYSByZWQgZmxhZyDigJMgYSByZWN1cnNpdmUgYWxnb3JpdGhtIG9wZXJhdGluZyBvbiB1c2VyLWNvbnRyb2xsZWQgaW5wdXQuIFRoaXMgc2NyZWFtcyBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzOiBidWdzIGluIHRoZSByZWN1cnNpdmUgbG9naWMgaXRzZWxmLCBwb3NzaWJsZSBpbnRlZ2VyIG92ZXJmbG93cywgbG9vcCBkZXRlY3Rpb24gZmFpbHVyZXMsIG1lbW9yeSBsZWFrcywgb3V0LW9mLWJvdW5kcyByZWFkcy93cml0ZXMsIG9yIGV2ZW4gc3RhY2sgb3ZlcmZsb3dzLiBgV29ydGhGdXp6aW5nID0gdHJ1ZWAuIE5vIHF1ZXN0aW9uLlxuXG5Ob3csIGxldCdzIG5haWwgZG93biB0aGUgY3JpdGljYWwgc3ltYm9scy4gSSBuZWVkIHRvIGtub3cgd2hpY2ggZnVuY3Rpb25zIGFyZSBlaXRoZXIgbW9kaWZpZWQgb3IgbmV3bHkgaW50cm9kdWNlZC4gTGV0J3Mgc2VlLi4uXG5cblRoZSBrZXkgc3VzcGVjdHMgYXJlOiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lZF90eXBlX2lkeGAsIGFuZCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBgYnRmX3BhcnNlYCBpcyB3aGVyZSB0aGlzIG5ldyBjb2RlIGlzIGNhbGxlZCwgYW5kIHBlcmhhcHMgYGJwZl9idGZfbG9hZGAgYXMgd2VsbCwgYnV0IHRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIHRoZSBvbmVzIGRvaW5nIHRoZSBjb3JlIHdvcmsuXG5cbldhaXQgYSBzZWNvbmQuLi4gYXJlIGBidGZfb3duZXJzaGlwX2RlcHRoYCBhbmQgYGJ0Zl9vd25lZF90eXBlX2lkeGAgc3RhdGljPyBZZXMsIHRoZXkgYXJlLiBUaGF0IGNvdWxkIGNvbXBsaWNhdGUgdGhpbmdzLiBUaGUgaW5zdHJ1Y3Rpb25zIHJlZ2FyZGluZyBzdGF0aWMgZnVuY3Rpb25zIGNvbWUgdG8gbWluZDogXCJDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlwiXG5cbkhvd2V2ZXIsIHRoZXkgYXJlIGluIGEgLmMgZmlsZSwgYnV0IHRoZXkgYXJlIG5vdCBpbmxpbmVkIGluIGEgaGVhZGVyLiBMZXQncyB0aGluay4uLiBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYW5ub3QgYmUgaW5saW5lZCwgdGhhdCdzIGNlcnRhaW4hIEJ1dCBpcyBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgaW5saW5lZD8gSXQgaXMgY2FsbGVkIG9ubHkgb25jZSBmcm9tIGBidGZfcGFyc2VgLCBzbyBpdCBtaWdodCBiZSBpbmxpbmVkIG9yIG5vdC5cblxuQnV0IGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgbm9uLXN0YXRpYyEgT2theSwgZ29vZC4gTGV0J3MganVzdCBjb25maXJtIHRoYXQgaXQncyBlaXRoZXIgZXhwb3J0ZWQgb3IgZGVjbGFyZWQgaW4gYSBoZWFkZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMTg4LCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTkwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6MjYuNDY4MjU1NjQ3WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzM4NjEyMzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvYnRmLmg9MjM0PXN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM1LVxcdFxcdFxcdFxcdCAgICB1MzIgZmllbGRfbWFzaywgdTMyIHZhbHVlX3NpemUpO1xcbmluY2x1ZGUvbGludXgvYnRmLmg6MjM2OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpO1xcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM3LWJvb2wgYnRmX3R5cGVfaXNfdm9pZChjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz00MTUwPXN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MjgyLVxcbmtlcm5lbC9icGYvYnRmLmM6NDI4MzppbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbmtlcm5lbC9icGYvYnRmLmMtNDI4NC17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTYwMTQ9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwOTItXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNlY250OyBpKyspIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTM6XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxua2VybmVsL2JwZi9idGYuYy02MDk0LVxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xMzYzLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEzNjQ6XFx0cmV0ID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBtYXAtXFx1MDAzZXJlY29yZCk7XFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2NS1cXHRpZiAocmV0IFxcdTAwM2MgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6MjkuMjA2ODc3NTY3WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyNDIwMTQwMjA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gQlRGIFN5bWJvbCBSZXNvbHV0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBCVEYgc3R1ZmYuIEZpcnN0IHRoaW5ncyBmaXJzdCwgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYC4uLiBwcmV0dHkgc3VyZSB0aGF0J3MgYSBnbG9iYWwgc3ltYm9sLCBub3Qgc3RhdGljLiBOZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIHdoZW4gSSBzdGFydCB0cmFjaW5nIHRoaW5ncy4gTm93LCBJIHJlY2FsbCB0aG9zZSB0d28gZnVuY3Rpb25zLCBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgdGhhdCB3ZXJlIGFkZGVkIGluIGBrZXJuZWwvYnBmL2J0Zi5jYC4gVGhleSBzZWVtIHJlbGV2YW50IHRvIHdoYXRldmVyIEknbSB0cm91Ymxlc2hvb3RpbmcuXG5cblRoZSByZWFsIHF1ZXN0aW9uIEkgbmVlZCB0byBhbnN3ZXIsIHRob3VnaCwgaXMgd2hhdCBjYWxscyBgYnRmX3BhcnNlYD8gVW5kZXJzdGFuZGluZyBpdHMgY2FsbCBjaGFpbiBpcyBnb2luZyB0byBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgbGFyZ2VyIHBpY3R1cmUgaGVyZS4gQWx0ZXJuYXRpdmVseSwgd2hhdCdzIGNhbGxpbmcgYGJwZl9idGZfbG9hZGAgd291bGQgYWxzbyBnaXZlIG1lIGNsdWVzLiBHb3R0YSBnbyBjaGVjayB0aGUgY2FsbCBncmFwaHMgZm9yIHRob3NlIHR3byBub3cuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGVudHJ5IHBvaW50IGFuZCB0aGUgZmxvdyB0byBmb2xsb3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0ODQ2LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDEuNjI3MDIwMDQzWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5ODk4MTgwMTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX3BhcnNlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYnRmLmM9Mzk3Nj1zdGF0aWMgaW50IGJ0Zl9maW5kX2ZpZWxkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy0zOTg5LS8qIENhbGxlcnMgaGF2ZSB0byBlbnN1cmUgdGhlIGxpZmUgY3ljbGUgb2YgYnRmIGlmIGl0IGlzIHByb2dyYW0gQlRGICovXFxua2VybmVsL2JwZi9idGYuYzozOTkwOnN0YXRpYyBpbnQgYnRmX3BhcnNlX2twdHIoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCxcXG5rZXJuZWwvYnBmL2J0Zi5jLTM5OTEtXFx0XFx0XFx0ICBzdHJ1Y3QgYnRmX2ZpZWxkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQwMDgtXFx0aWYgKGlkID09IC1FTk9FTlQpIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjQwMDk6XFx0XFx0LyogYnRmX3BhcnNlX2twdHIgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHcvIGJ0ZiA9IHByb2dyYW0gQlRGICovXFxua2VybmVsL2JwZi9idGYuYy00MDEwLVxcdFxcdFdBUk5fT05fT05DRShidGZfaXNfa2VybmVsKGJ0ZikpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MDc5LVxcbmtlcm5lbC9icGYvYnRmLmM6NDA4MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9ncmFwaF9yb290KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG5rZXJuZWwvYnBmL2J0Zi5jLTQwODEtXFx0XFx0XFx0XFx0c3RydWN0IGJ0Zl9maWVsZCAqZmllbGQsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQxMjMtXFxua2VybmVsL2JwZi9idGYuYzo0MTI0OnN0YXRpYyBpbnQgYnRmX3BhcnNlX2xpc3RfaGVhZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLFxcbmtlcm5lbC9icGYvYnRmLmMtNDEyNS1cXHRcXHRcXHQgICAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxcbmtlcm5lbC9icGYvYnRmLmMtNDEyNi17XFxua2VybmVsL2JwZi9idGYuYzo0MTI3OlxcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcXFwiYnBmX2xpc3Rfbm9kZVxcXCIsXFxua2VybmVsL2JwZi9idGYuYy00MTI4LVxcdFxcdFxcdFxcdFxcdCAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2xpc3Rfbm9kZSkpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MTMwLVxcbmtlcm5lbC9icGYvYnRmLmM6NDEzMTpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9yYl9yb290KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQsXFxua2VybmVsL2JwZi9idGYuYy00MTMyLVxcdFxcdFxcdCAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxcbmtlcm5lbC9icGYvYnRmLmMtNDEzMy17XFxua2VybmVsL2JwZi9idGYuYzo0MTM0OlxcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcXFwiYnBmX3JiX25vZGVcXFwiLFxcbmtlcm5lbC9icGYvYnRmLmMtNDEzNS1cXHRcXHRcXHRcXHRcXHQgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9yYl9ub2RlKSk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTQxMzg9c3RhdGljIGludCBidGZfZmllbGRfY21wKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYiwgY29uc3Qgdm9pZCAqcHJpdilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNDE0OS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjQxNTA6c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxua2VybmVsL2JwZi9idGYuYy00MTUxLVxcdFxcdFxcdFxcdCAgICB1MzIgZmllbGRfbWFzaywgdTMyIHZhbHVlX3NpemUpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQyMjktXFx0XFx0Y2FzZSBCUEZfVVBUUjpcXG5rZXJuZWwvYnBmL2J0Zi5jOjQyMzA6XFx0XFx0XFx0cmV0ID0gYnRmX3BhcnNlX2twdHIoYnRmLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0sIFxcdTAwMjZpbmZvX2FycltpXSk7XFxua2VybmVsL2JwZi9idGYuYy00MjMxLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MjM0LVxcdFxcdGNhc2UgQlBGX0xJU1RfSEVBRDpcXG5rZXJuZWwvYnBmL2J0Zi5jOjQyMzU6XFx0XFx0XFx0cmV0ID0gYnRmX3BhcnNlX2xpc3RfaGVhZChidGYsIFxcdTAwMjZyZWMtXFx1MDAzZWZpZWxkc1tpXSwgXFx1MDAyNmluZm9fYXJyW2ldKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTQyMzYtXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQyMzktXFx0XFx0Y2FzZSBCUEZfUkJfUk9PVDpcXG5rZXJuZWwvYnBmL2J0Zi5jOjQyNDA6XFx0XFx0XFx0cmV0ID0gYnRmX3BhcnNlX3JiX3Jvb3QoYnRmLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0sIFxcdTAwMjZpbmZvX2FycltpXSk7XFxua2VybmVsL2JwZi9idGYuYy00MjQxLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz01NTc0PXN0YXRpYyBpbnQgYnRmX2NoZWNrX2FsbF90eXBlcyhzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52KVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy01NjA3LVxcbmtlcm5lbC9icGYvYnRmLmM6NTYwODpzdGF0aWMgaW50IGJ0Zl9wYXJzZV90eXBlX3NlYyhzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52KVxcbmtlcm5lbC9icGYvYnRmLmMtNTYwOS17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU2MzAtXFxua2VybmVsL2JwZi9idGYuYzo1NjMxOnN0YXRpYyBpbnQgYnRmX3BhcnNlX3N0cl9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcXG5rZXJuZWwvYnBmL2J0Zi5jLTU2MzIte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy01NjYyLVxcbmtlcm5lbC9icGYvYnRmLmM6NTY2MzpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9sYXlvdXRfc2VjKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYpXFxua2VybmVsL2JwZi9idGYuYy01NjY0LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTcxMz1zdGF0aWMgaW50IGJ0Zl9jaGVja19zZWNfaW5mbyhzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy01NzY5LVxcbmtlcm5lbC9icGYvYnRmLmM6NTc3MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9oZHIoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcXG5rZXJuZWwvYnBmL2J0Zi5jLTU3NzEte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz01ODQzPXN0YXRpYyBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqXFxua2VybmVsL2JwZi9idGYuYzo1ODQ0OmJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoc3RydWN0IGJwZl92ZXJpZmllcl9sb2cgKmxvZywgc3RydWN0IGJ0ZiAqYnRmKVxcbmtlcm5lbC9icGYvYnRmLmMtNTg0NS17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NDQtXFx0XFx0dHlwZS1cXHUwMDNlYnRmX2lkID0gaTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NDU6XFx0XFx0cmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHQsIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9MSVNUX0hFQUQgfCBCUEZfTElTVF9OT0RFIHxcXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NDYtXFx0XFx0XFx0XFx0XFx0XFx0ICBCUEZfUkJfUk9PVCB8IEJQRl9SQl9OT0RFIHwgQlBGX1JFRkNPVU5UIHxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTk3Nj1zdGF0aWMgaW50IGJ0Zl9jaGVja19tb2RpZmllcl9jaGFpbl9sZW5ndGgoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjAxMy1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwMTQ6c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxua2VybmVsL2JwZi9idGYuYy02MDE1LVxcdFxcdFxcdCAgICAgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNTktXFxua2VybmVsL2JwZi9idGYuYzo2MDYwOlxcdGVyciA9IGJ0Zl9wYXJzZV9oZHIoZW52KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjEtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA2NS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNjY6XFx0ZXJyID0gYnRmX3BhcnNlX3N0cl9zZWMoZW52KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjctXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA2OS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzA6XFx0ZXJyID0gYnRmX3BhcnNlX2xheW91dF9zZWMoZW52KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzEtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA3My1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzQ6XFx0ZXJyID0gYnRmX3BhcnNlX3R5cGVfc2VjKGVudik7XFxua2VybmVsL2JwZi9idGYuYy02MDc1LVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwODEtXFxua2VybmVsL2JwZi9idGYuYzo2MDgyOlxcdHN0cnVjdF9tZXRhX3RhYiA9IGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoXFx1MDAyNmVudi1cXHUwMDNlbG9nLCBidGYpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjA4My1cXHRpZiAoSVNfRVJSKHN0cnVjdF9tZXRhX3RhYikpIHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjQ1Mj1CVEZfSURfTElTVF9TSU5HTEUoYnBmX2N0eF9jb252ZXJ0X2J0Zl9pZCwgc3RydWN0LCBicGZfY3R4X2NvbnZlcnQpXFxua2VybmVsL2JwZi9idGYuYy02NDUzLVxcbmtlcm5lbC9icGYvYnRmLmM6NjQ1NDpzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NTUtXFx0XFx0XFx0XFx0ICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NDc1LVxcbmtlcm5lbC9icGYvYnRmLmM6NjQ3NjpcXHRlcnIgPSBidGZfcGFyc2VfaGRyKGVudik7XFxua2VybmVsL2JwZi9idGYuYy02NDc3LVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY0ODEtXFxua2VybmVsL2JwZi9idGYuYzo2NDgyOlxcdGVyciA9IGJ0Zl9wYXJzZV9zdHJfc2VjKGVudik7XFxua2VybmVsL2JwZi9idGYuYy02NDgzLVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY1MDYtXFxua2VybmVsL2JwZi9idGYuYzo2NTA3OnN0cnVjdCBidGYgKmJ0Zl9wYXJzZV92bWxpbnV4KHZvaWQpXFxua2VybmVsL2JwZi9idGYuYy02NTA4LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjUxOS1cXHRsb2ctXFx1MDAzZWxldmVsID0gQlBGX0xPR19LRVJORUw7XFxua2VybmVsL2JwZi9idGYuYzo2NTIwOlxcdGJ0ZiA9IGJ0Zl9wYXJzZV9iYXNlKGVudiwgXFxcInZtbGludXhcXFwiLCBfX3N0YXJ0X0JURiwgX19zdG9wX0JURiAtIF9fc3RhcnRfQlRGKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTY1MjEtXFx0aWYgKElTX0VSUihidGYpKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NTIzLVxcbmtlcm5lbC9icGYvYnRmLmM6NjUyNDpcXHQvKiBidGZfcGFyc2Vfdm1saW51eCgpIHJ1bnMgdW5kZXIgYnRmX3ZtbGludXhfbG9jayAqL1xcbmtlcm5lbC9icGYvYnRmLmMtNjUyNS1cXHRicGZfY3R4X2NvbnZlcnQudCA9IGJ0Zl90eXBlX2J5X2lkKGJ0ZiwgYnBmX2N0eF9jb252ZXJ0X2J0Zl9pZFswXSk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTY1NDA9X191MzIgYnRmX3JlbG9jYXRlX2lkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgX191MzIgaWQpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NDgtXFxua2VybmVsL2JwZi9idGYuYzo2NTQ5OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBjb25zdCB2b2lkICpkYXRhLFxcbmtlcm5lbC9icGYvYnRmLmMtNjU1MC1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwgdm9pZCAqYmFzZV9kYXRhLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NTcxLVxcdGlmIChiYXNlX2RhdGEpIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjY1NzI6XFx0XFx0YmFzZV9idGYgPSBidGZfcGFyc2VfYmFzZShlbnYsIFxcXCIuQlRGLmJhc2VcXFwiLCBiYXNlX2RhdGEsIGJhc2VfZGF0YV9zaXplKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NzMtXFx0XFx0aWYgKElTX0VSUihiYXNlX2J0ZikpIHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjYwMS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY2MDI6XFx0ZXJyID0gYnRmX3BhcnNlX2hkcihlbnYpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjYwMy1cXHRpZiAoZXJyKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NjA3LVxcbmtlcm5lbC9icGYvYnRmLmM6NjYwODpcXHRlcnIgPSBidGZfcGFyc2Vfc3RyX3NlYyhlbnYpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjYwOS1cXHRpZiAoZXJyKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NDg2PWludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0OTAtXFxua2VybmVsL2JwZi9idGYuYzo4NDkxOlxcdGJ0ZiA9IGJ0Zl9wYXJzZShhdHRyLCB1YXR0ciwgYXR0cl9sb2cpO1xcbmtlcm5lbC9icGYvYnRmLmMtODQ5Mi1cXHRpZiAoSVNfRVJSKGJ0ZikpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg2NDA9c3RhdGljIGludCBidGZfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIG9wLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NjU5LVxcdFxcdH1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg2NjA6XFx0XFx0YnRmID0gYnRmX3BhcnNlX21vZHVsZShtb2QtXFx1MDAzZW5hbWUsIG1vZC1cXHUwMDNlYnRmX2RhdGEsIG1vZC1cXHUwMDNlYnRmX2RhdGFfc2l6ZSxcXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NjEtXFx0XFx0XFx0XFx0ICAgICAgIG1vZC1cXHUwMDNlYnRmX2Jhc2VfZGF0YSwgbW9kLVxcdTAwM2VidGZfYmFzZV9kYXRhX3NpemUpO1xcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmM9NzU5PWJvb2wgYnRmX3JlY29yZF9lcXVhbChjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjX2EsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYilcXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTc3MC1cXHRzaXplID0gc3RydWN0X3NpemUocmVjX2EsIGZpZWxkcywgcmVjX2EtXFx1MDAzZWNudCk7XFxua2VybmVsL2JwZi9zeXNjYWxsLmM6NzcxOlxcdC8qIGJ0Zl9wYXJzZV9maWVsZHMgdXNlcyBremFsbG9jIHRvIGFsbG9jYXRlIGEgYnRmX3JlY29yZCwgc28gdW51c2VkXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtNzcyLVxcdCAqIG1lbWJlcnMgYXJlIHplcm9lZCBvdXQuIFNvIG1lbWNtcCBpcyBzYWZlIHRvIGRvIHdpdGhvdXQgd29ycnlpbmdcXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jPTEyNTU9c3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTI3Ni1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzoxMjc3OlxcdG1hcC1cXHUwMDNlcmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHZhbHVlX3R5cGUsXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTI3OC1cXHRcXHRcXHRcXHQgICAgICAgQlBGX1NQSU5fTE9DSyB8IEJQRl9SRVNfU1BJTl9MT0NLIHwgQlBGX1RJTUVSIHwgQlBGX0tQVFIgfCBCUEZfTElTVF9IRUFEIHxcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yMDk3OT1zdHJ1Y3QgYnRmICpicGZfZ2V0X2J0Zl92bWxpbnV4KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODctXFx0XFx0aWYgKCFidGYpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjA5ODg6XFx0XFx0XFx0YnRmID0gYnRmX3BhcnNlX3ZtbGludXgoKTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODktXFx0XFx0XFx0LypcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDIuNjE2ODQ0MzU0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQxODg2NDEwNDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgTGluZSBvZiBJbnF1aXJ5OiBCVEYgRmlsZSBEZXNjcmlwdG9yIENyZWF0aW9uKipcblxuT2theSwgc28gYGJ0Zl9uZXdfZmRgIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHVsdGltYXRlbHkgZ2V0cyBjYWxsZWQgdG8gY3JlYXRlIGEgQlRGIGZpbGUgZGVzY3JpcHRvci4gVGhlIGltbWVkaWF0ZSBmdW5jdGlvbiB0byBjYWxsIGl0LCBpdCBzZWVtcywgaXMgYGJ0Zl9wYXJzZWAsIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb24uIEludGVyZXN0aW5nLiBOb3csIHdoZXJlIGlzIGBidGZfbmV3X2ZkYCBiZWluZyBpbnZva2VkPyBUaGUgdGV4dCBtZW50aW9ucyBga2VybmVsL2JwZi9zeXNjYWxsLmNgLCBhbmQgc3BlY2lmaWNhbGx5IHRoZSBoYW5kbGluZyBvZiBgQlBGX0JURl9MT0FEYC4gVGhhdCBtYWtlcyBwZXJmZWN0IHNlbnNlOyBsb2FkaW5nIEJURiBkYXRhIGlzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgaXQuXG5cbkhvd2V2ZXIsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsYXJnZXIgY29udGV4dC4gVG8gc29saWRpZnkgdGhpcyB1bmRlcnN0YW5kaW5nLCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIGNhbGxlcnMgb2YgYGJ0Zl9uZXdfZmRgLiBUcmFjaW5nIHRoZSBjYWxsIGdyYXBoIHdpbGwgaGVscCBtZSBlbnN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnl0aGluZyBjcnVjaWFsIGFuZCB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBvdmVyYWxsIEJURiBsb2FkaW5nIHByb2Nlc3MuIEl0IGlzIGltcG9ydGFudCB0byBrbm93IHdoaWNoIGNvZGUgcGF0aHMgYXJlIHJlbGF0ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4OTcxLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDYuODA1NDg3OTUyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTk1NzQ0NjM3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9uZXdfZmRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9idGYuaD0xNDk9c3RydWN0IGJwZl9sb2dfYXR0cjtcXG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjE1MDppbnQgYnRmX25ld19mZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKTtcXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTE1MS1zdHJ1Y3QgYnRmICpidGZfZ2V0X2J5X2ZkKGludCBmZCk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg0NzQ9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODQ4MC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg0ODE6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxcbmtlcm5lbC9icGYvYnRmLmMtODQ4Mi17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0ODUtXFxua2VybmVsL2JwZi9idGYuYzo4NDg2OmludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxua2VybmVsL2JwZi9idGYuYy04NDg3LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODUwNi1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg1MDc6XFx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XFxua2VybmVsL2JwZi9idGYuYy04NTA4LVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NTg2PWludCBidGZfZ2V0X2ZkX2J5X2lkKHUzMiBpZClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODU5OS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg2MDA6XFx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg2MDEtXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODgzOD1CUEZfQ0FMTF80KGJwZl9idGZfZmluZF9ieV9uYW1lX2tpbmQsIGNoYXIgKiwgbmFtZSwgaW50LCBuYW1lX3N6LCB1MzIsIGtpbmQsIGludCwgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTEtXFx0aWYgKHJldCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgYnRmX2lzX21vZHVsZShidGYpKSB7XFxua2VybmVsL2JwZi9idGYuYzo4ODUyOlxcdFxcdGJ0Zl9vYmpfZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTMtXFx0XFx0aWYgKGJ0Zl9vYmpfZmQgXFx1MDAzYyAwKSB7XFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYz01NTY0PXN0YXRpYyBpbnQgYnBmX2J0Zl9sb2FkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkwLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjU1OTE6XFx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkyLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDkuMDAxMjM4MTM5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM3MTI1MzMxNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipNeSBBbmFseXNpcyBvZiBCVEYgTG9hZGluZyBhbmQgQXNzb2NpYXRlZCBDaGVja3MqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgbG9hZGluZyBwcm9jZXNzLiBNeSBtZW50YWwgbW9kZWwgaXMgdHJhY2luZyB0aGUgZmxvdzogYGJwZl9idGZfbG9hZGAga2lja3MgdGhpbmdzIG9mZiwgd2hpY2ggdGhlbiBmZWVkcyBpbnRvIGBidGZfbmV3X2ZkYC4gRnJvbSB0aGVyZSwgaXQgZGl2ZXMgaW50byB0aGUgcGFyc2luZyBzdGFnZSB3aXRoIGBidGZfcGFyc2VgLCB3aGljaCBzZWVtcyB0byBiZSB0aGUgd29ya2hvcnNlLlxuXG5XaXRoaW4gYGJ0Zl9wYXJzZWAsIEkgc2VlIHR3byBjcnVjaWFsIHZhbGlkYXRpb24gZnVuY3Rpb25zIGJlaW5nIGNhbGxlZC4gT25lIGlzIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgd2hpY2ggdW5kb3VidGVkbHkgZGVhbHMgd2l0aCB0aGUgY29tcGxleCByZWxhdGlvbnNoaXBzIGFuZCBwb3RlbnRpYWwgbmVzdGVkIG93bmVyc2hpcCBpbXBsaWVkIGJ5IEJURidzIHR5cGUgaW5mb3JtYXRpb24uIEl0IGxvb2tzIGxpa2UgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIGFuZCBgYnRmX293bmVkX3R5cGVfaWR4YCBhcmUgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIHdpdGhpbiB0aGlzIG93bmVyc2hpcCBjaGVjay5cblxuQ3J1Y2lhbGx5LCBpdCBpcyBhbHNvIGNhbGxpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCB3aXRoaW4gYGJ0Zl9wYXJzZWAsIG1lYW5pbmcgdGhhdCBhcyB0eXBlcyBhcmUgcGFyc2VkIGFuZCBpbnNwZWN0ZWQsIGFueSBpc3N1ZXMgd2l0aCBzdHJ1Y3Qgb3IgdW5pb24gZmllbGRzIHdpbGwgYWxzbyBiZSBkZWFsdCB3aXRoLiBBbmQgb2YgY291cnNlLCB0aGVyZSdzIGBtYXBfY2hlY2tfYnRmYCB3aGljaCB3aWxsIGhhbmRsZSBhbnkgQlRGIGlzc3VlcyBmb3IgbWFwcy5cblxuTm93LCBJJ20gdGhpbmtpbmcgYWJvdXQgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBjb25maWd1cmF0aW9uLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgc2V0dGluZ3MgZm9yIGBrZXJuZWwvYnBmL2J0Zi5jYCB0byB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIEJURiBzdXBwb3J0IGlzIGVuYWJsZWQuIEFuZCB0aGUgYE1ha2VmaWxlYCBpbiBga2VybmVsL2JwZi9gIHdpbGwgdGVsbCBtZSBob3cgdGhlc2UgbW9kdWxlcyBhcmUgYnVpbHQgYW5kIGxpbmtlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgYXJlIGFueSBzcGVjaWZpYyBvcHRpb25zIG9yIG1vZHVsZXMgdGhhdCB0aGlzIEJURiBoYW5kbGluZyBkZXBlbmRzIG9uLiBUaGlzIGlzIGEgY29tbW9uIHByYWN0aWNlIHdoZW4gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBvZiBhbnkga2VybmVsIGZlYXR1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMDE4LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjUyLjcxMzc3MzcyM1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAxNzY3Nzc4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0ZlxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTEzPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2xvY2FsX3N0b3JhZ2UubyBicGZfdGFza19zdG9yYWdlLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE0Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gZml4dXBzLm8gY2ZnLm8gc3RhdGVzLm8gYmFja3RyYWNrLm8gY2hlY2tfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE1LW9iai0ke0NPTkZJR19CUEZfTFNNfVxcdCAgKz0gYnBmX2lub2RlX3N0b3JhZ2Uub1xcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT0xNz1vYmotJChDT05GSUdfQlBGX0pJVCkgKz0gdHJhbXBvbGluZS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZToxODpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZS0xOS1pZmVxICgkKENPTkZJR19NTVUpJChDT05GSUdfNjRCSVQpLHl5KVxcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcXG5rZXJuZWwvYnBmL01ha2VmaWxlOjQ0Om9iai0kKENPTkZJR19ERUJVR19JTkZPX0JURikgKz0gc3lzZnNfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTQ1LWVuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjUzLjQxNTU0NjE2WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY4MTUxMTQxNTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBCUEYgU3lzY2FsbCBDb21waWxhdGlvbioqXG5cbk9rYXksIHNvIEkgc2VlIHRoaXMgbGluZTogYG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnRmLm9gLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzIHRvIGltbWVkaWF0ZWx5IGRpc3NlY3Qgd2hhdCdzIGdvaW5nIG9uLiBUaGlzIHRlbGxzIHRoZSBidWlsZCBzeXN0ZW0gdGhhdCBpZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZCwgdGhlbiBgYnRmLm9gIHNob3VsZCBiZSBjb21waWxlZCBhbmQgbGlua2VkLiBUaGF0J3MgcHJldHR5IHN0YW5kYXJkLCBidXQgdGhlIGtleSBpcyB0aGF0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGBDT05GSUdfQlBGX1NZU0NBTExgLlxuXG5TbywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcy4gSSBuZWVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgYEJQRl9TWVNDQUxMYC4gSSdsbCBiZSBsb29raW5nIGZvciB3aGVyZSB0aGlzIG9wdGlvbiBpcyBkZWZpbmVkLCBpdHMgZGVmYXVsdCB2YWx1ZSAoaWYgYW55KSwgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgd2hhdCBpdCAqbWVhbnMqIGluIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgQlBGIGFuZCB0aGUga2VybmVsLiBJcyB0aGlzIHJlbGF0ZWQgdG8gdGhlIEJQRiBzeXN0ZW0gY2FsbCBpdHNlbGY/IERvZXMgaXQgZW5hYmxlIGV4dGVuc2lvbnMsIG9yIHBlcmhhcHMgc3BlY2lmaWMgZmVhdHVyZXMgbGlrZSBCVEYgZ2VuZXJhdGlvbiBvciB1c2FnZSBvZiBCUEYgcHJvZ3JhbXMgd2l0aCBzeXNjYWxscz8gVGhhdCdzIHdoYXQgSSBoYXZlIHRvIGZpZ3VyZSBvdXQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoaXMgYnVpbGQgcnVsZS4gVW5kZXJzdGFuZGluZyB0aGUgY29udGV4dCBvZiB0aGF0IEtjb25maWcgb3B0aW9uIHdpbGwgdGVsbCBtZSB0aGUgc2lnbmlmaWNhbmNlIG9mIGBidGYub2AncyBjb21waWxhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA4MjIsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMDowMC4yMzA2NjQ5NTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDk1NjkwODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJQRl9TWVNDQUxMXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFxcXCJCUEYgc3Vic3lzdGVtXFxcIlxcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cXG5rZXJuZWwvYnBmL0tjb25maWc6MzE6Y29uZmlnIEJQRl9TWVNDQUxMXFxua2VybmVsL2JwZi9LY29uZmlnLTMyLVxcdGJvb2wgXFxcIkVuYWJsZSBicGYoKSBzeXN0ZW0gY2FsbFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6MDIuNTQwMjQzNDA2WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEzNTU3MDI5Nzk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkV4YW1pbmluZyBCUEYgS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzKipcblxuT2theSwgSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGlzIEJQRiBjb25maWd1cmF0aW9uLiBJIGtub3cgYGtlcm5lbC9icGYvS2NvbmZpZ2AgaXMgdXN1YWxseSB0aGUgcGxhY2UgZm9yIHRoZXNlIHNvcnRzIG9mIGRlY2xhcmF0aW9ucywgc28gdGhhdCdzIHdoZXJlIEkgc2hvdWxkIHN0YXJ0LiBJJ20gdGhpbmtpbmcgYXJvdW5kIGxpbmUgMzEgaXMgbGlrZWx5IGEgZ29vZCBwbGFjZSB0byBsb29rIOKAkyB0aGF0J3Mgb2Z0ZW4gd2hlcmUgdGhlIGNvcmUgb3IgZGVmYXVsdCBvcHRpb25zIHJlc2lkZS4gTGV0J3MgZGlnIGluIHRoZXJlIGFuZCBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSBleHBlY3QgdG8gc2VlIHRoZSB0eXBpY2FsIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIGxpbmtpbmcgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIG90aGVyIGtlcm5lbCBmZWF0dXJlcy4gTXkgZ29hbCBpcyB0byBtYXAgb3V0IHdoaWNoIHByZXJlcXVpc2l0ZXMgYXJlIHJlcXVpcmVkIGZvciBpdCB0byBiZSBlbmFibGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTIzMSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMwOjE2LjA5NzI3NTk5MVoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MjkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMjksXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMjk6XFx0bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG4gIDMwOlxcdFxcbiAgMzE6XFx0Y29uZmlnIEJQRl9TWVNDQUxMXFxuICAzMjpcXHRcXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuICAzMzpcXHRcXHRzZWxlY3QgQlBGXFxuICAzNDpcXHRcXHRzZWxlY3QgSVJRX1dPUktcXG4gIDM1OlxcdFxcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxcbiAgMzY6XFx0XFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxcbiAgMzc6XFx0XFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcXG4gIDM4OlxcdFxcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXFxuICAzOTpcXHRcXHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcXG4gIDQwOlxcdFxcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXFxuICA0MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDQyOlxcdFxcdGhlbHBcXG4gIDQzOlxcdFxcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xcbiAgNDQ6XFx0XFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0Y29uZmlnIEJQRl9KSVRcXG4gIDQ3OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXFxcIlxcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBCUEZcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXFxuICA1MDpcXHRcXHRzZWxlY3QgRVhFQ01FTVxcbiAgNTE6XFx0XFx0aGVscFxcbiAgNTI6XFx0XFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXFxuICA1MzpcXHRcXHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxcbiAgNTQ6XFx0XFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXFxuICA1NTpcXHRcXHQgIHByb2dyYW1zLlxcbiAgNTY6XFx0XFxuICA1NzpcXHRcXHQgIE5vdGUsIGFuIGFkbWluIHNob3VsZCBlbmFibGUgdGhpcyBmZWF0dXJlIGNoYW5naW5nOlxcbiAgNTg6XFx0XFx0ICAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9lbmFibGVcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6MTYuMDk3MzcwNzgxWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE0MzAxMTY1NTAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkJQRiBcdTAwMjYgQlRGIERlcGVuZGVuY3kgRGVlcCBEaXZlKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGUga2VybmVsIGJ1aWxkIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmljYWxseSBhcm91bmQgQlBGIGFuZCBCVEYuIE15IGluaXRpYWwgdW5kZXJzdGFuZGluZyB3YXMgdGhhdCBgQlBGX1NZU0NBTExgIHdhcyBmYWlybHkgaXNvbGF0ZWQsIG1heWJlIGp1c3QgZGVwZW5kZW50IG9uIHRoZSBhcmNoaXRlY3R1cmUgb3IgYSBwYXJlbnQgbWVudS4gSXQgKnNlbGVjdHMqIHRoaW5ncyBsaWtlIEJQRiBjb3JlIGZlYXR1cmVzLCBgSVJRX1dPUktgLCBhbmQgc3VjaC4gQnV0IEknbSBzdGFydGluZyB0byB3b25kZXIgYWJvdXQgdGhlIEJURiBjb21waWxhdGlvbiBwYXRoLCBhbmQgd2hldGhlciBpdCdzIHVuY29uZGl0aW9uYWxseSBidWlsdCB3aGVuIGBCUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZC5cblxuUmlnaHQsIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBrZXJuZWwvYnBmL01ha2VmaWxlYC4gQWgsIHRoZXJlIGl0IGlzIG9uIGxpbmUgMTg6IGBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vYC4gU28sICp5ZXMqLCBlbmFibGluZyBgQlBGX1NZU0NBTExgICpkb2VzKiBjb21waWxlIGBidGYub2AuIE5vIHN1cnByaXNlcyB0aGVyZSwgcmVhbGx5LCBidXQgZ29vZCB0byBoYXZlIGNvbmZpcm1lZCBpdCBkZWZpbml0aXZlbHkuXG5cbk5vdywgYSBtb3JlIG51YW5jZWQgcXVlc3Rpb246IERvZXMgQlRGICpyZXF1aXJlKiBgREVCVUdfSU5GT19CVEZgPyBJcyB0aGF0IGEgaGFyZCBkZXBlbmRlbmN5LCBvciBpcyBpdCBhIGNvbmRpdGlvbmFsIGJ1aWxkLXRpbWUgcmVxdWlyZW1lbnQ/IERvZXMgYGJ0Zl9wYXJzZWAgb3IgYW55IG9mIHRoZSBCUEYgQlRGIGxvYWRpbmcgbWVjaGFuaXNtcyBoYXZlIGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdGhhdCBpcyBkZXBlbmRlbnQgb24gYERFQlVHX0lORk9fQlRGYD9cblxuSSdsbCBxdWVyeSBgZ3JlcHBlcmAgYW5kIHNlZSBob3cgYERFQlVHX0lORk9fQlRGYCBpcyB1c2VkIHdpdGhpbiBga2VybmVsL2JwZi9idGYuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGZpbmFsIGFuc3dlci4gR290dGEgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgb3B0aW1pemVkIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTg0NCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMwOjMwLjM5ODUzOTI5NVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTg3MTkwNTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiREVCVUdfSU5GT19CVEZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcXG5rZXJuZWwvYnBmL01ha2VmaWxlOjQ0Om9iai0kKENPTkZJR19ERUJVR19JTkZPX0JURikgKz0gc3lzZnNfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTQ1LWVuZGlmXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTY0NTQ9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV9iYXNlKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NTktXFxua2VybmVsL2JwZi9idGYuYzo2NDYwOlxcdGlmICghSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKVxcbmtlcm5lbC9icGYvYnRmLmMtNjQ2MS1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjU0MD1fX3UzMiBidGZfcmVsb2NhdGVfaWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBfX3UzMiBpZClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjU0Ni1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY1NDc6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy02NTQ4LVxcbmtlcm5lbC9icGYvYnRmLmM9NjU0OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX21vZHVsZShjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgY29uc3Qgdm9pZCAqZGF0YSxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjY0NC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY2NDU6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXFxua2VybmVsL2JwZi9idGYuYy02NjQ2LVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NjIyPWVudW0ge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NjI1LVxcbmtlcm5lbC9icGYvYnRmLmM6ODYyNjojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg2Mjctc3RydWN0IGJ0Zl9tb2R1bGUge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NzY0PWZzX2luaXRjYWxsKGJ0Zl9tb2R1bGVfaW5pdCk7XFxua2VybmVsL2JwZi9idGYuYzo4NzY1OiNlbmRpZiAvKiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUyAqL1xcbmtlcm5lbC9icGYvYnRmLmMtODc2Ni1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg3Njc9c3RydWN0IG1vZHVsZSAqYnRmX3RyeV9nZXRfbW9kdWxlKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODc2OS1cXHRzdHJ1Y3QgbW9kdWxlICpyZXMgPSBOVUxMO1xcbmtlcm5lbC9icGYvYnRmLmM6ODc3MDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3NzEtXFx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg3OTc9c3RydWN0IGJ0ZiAqYnRmX2dldF9tb2R1bGVfYnRmKGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZHVsZSlcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3OTgte1xcbmtlcm5lbC9icGYvYnRmLmM6ODc5OTojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg4MDAtXFx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg4MTAtXFxua2VybmVsL2JwZi9idGYuYzo4ODExOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODgxMi1cXHRtdXRleF9sb2NrKFxcdTAwMjZidGZfbW9kdWxlX211dGV4KTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODgyNz1zdGF0aWMgaW50IGNoZWNrX2J0Zl9rY29uZmlncyhjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGNvbnN0IGNoYXIgKmZlYXR1cmUpXFxua2VybmVsL2JwZi9idGYuYy04ODI4LXtcXG5rZXJuZWwvYnBmL2J0Zi5jOjg4Mjk6XFx0aWYgKCFtb2R1bGUgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKSB7XFxua2VybmVsL2JwZi9idGYuYy04ODMwLVxcdFxcdHByX2VycihcXFwibWlzc2luZyB2bWxpbnV4IEJURiwgY2Fubm90IHJlZ2lzdGVyICVzXFxcXG5cXFwiLCBmZWF0dXJlKTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODgzMi1cXHR9XFxua2VybmVsL2JwZi9idGYuYzo4ODMzOlxcdGlmIChtb2R1bGUgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUykpXFxua2VybmVsL2JwZi9idGYuYy04ODM0LVxcdFxcdHByX3dhcm4oXFxcIm1pc3NpbmcgbW9kdWxlIEJURiwgY2Fubm90IHJlZ2lzdGVyICVzXFxcXG5cXFwiLCBmZWF0dXJlKTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODk3NT1zdGF0aWMgaW50IGJ0Zl9jaGVja19rZnVuY19uYW1lKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqZnVuY19uYW1lLCB1MzIga2luZClcXG5rZXJuZWwvYnBmL2J0Zi5jLTg5NzYte1xcbmtlcm5lbC9icGYvYnRmLmM6ODk3NzojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg5NzgtXFx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg5OTEtXFxua2VybmVsL2JwZi9idGYuYzo4OTkyOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODk5My1cXHRndWFyZChtdXRleCkoXFx1MDAyNmJ0Zl9tb2R1bGVfbXV0ZXgpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz05NjQwPXN0YXRpYyBzdHJ1Y3QgYnBmX2NhbmRfY2FjaGUgKnBvcHVsYXRlX2NhbmRfY2FjaGUoc3RydWN0IGJwZl9jYW5kX2NhY2hlICpjYW5kcyxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtOTY2Ny1cXG5rZXJuZWwvYnBmL2J0Zi5jOjk2Njg6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy05NjY5LXN0YXRpYyB2b2lkIF9fcHVyZ2VfY2FuZF9jYWNoZShzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqKmNhY2hlLFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTI4NDk9aW50IGJwZl9hZGRfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgZnVuY19pZCwgdTE2IG9mZnNldClcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yODY1LVxcdFxcdGlmICghYnRmX3ZtbGludXgpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6Mjg2NjpcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImNhbGxpbmcga2VybmVsIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXFxcblxcXCIpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yODY3LVxcdFxcdFxcdHJldHVybiAtRU5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9NjIzMD1zdGF0aWMgaW50IGNoZWNrX3B0cl90b19tYXBfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtNjI0NC1cXHRpZiAoIWJ0Zl92bWxpbnV4KSB7XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjYyNDU6XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJtYXBfcHRyIGFjY2VzcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgQ09ORklHX0RFQlVHX0lORk9fQlRGXFxcXG5cXFwiKTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtNjI0Ni1cXHRcXHRyZXR1cm4gLUVOT1RTVVBQO1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTE5MDY4PXN0YXRpYyBpbnQgY2hlY2tfcHNldWRvX2J0Zl9pZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5MDg0LVxcdFxcdGlmICghYnRmX3ZtbGludXgpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTkwODU6XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJrZXJuZWwgaXMgbWlzc2luZyBCVEYsIG1ha2Ugc3VyZSBDT05GSUdfREVCVUdfSU5GT19CVEY9eSBpcyBzcGVjaWZpZWQgaW4gS2NvbmZpZy5cXFxcblxcXCIpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTA4Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yMDk3OT1zdHJ1Y3QgYnRmICpicGZfZ2V0X2J0Zl92bWxpbnV4KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODMtXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjIwOTg0OlxcdGlmICghYnRmIFxcdTAwMjZcXHUwMDI2IElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4NS1cXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZidGZfdm1saW51eF9sb2NrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6MzAuNDk3MjY1NzM5WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjcwNzAyNjM5OTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQlRGIFBhcnNpbmcgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgQlRGIHBhcnNpbmcgcm91dGluZSwgc3BlY2lmaWNhbGx5IGBidGZfcGFyc2UoKWAuIEkga25vdyB3ZSAqZG9uJ3QqIG5lZWQgYERFQlVHX0lORk9fQlRGYCBmb3IgaXQsIHdoaWNoIGlzIGdvb2QuIEJ1dCBJIG5lZWQgdG8gbmFpbCBkb3duIHdoZXRoZXIgaXQgcmVsaWVzIG9uIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2Agb3IgbWF5YmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8ga3B0ciwgbGlzdF9oZWFkLCBvciByYl9yb290LiBJIHRoaW5rIEkgd2lsbCBzdGFydCBieSBmb2N1c2luZyBvbiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBUaGVuLCBJJ2xsIG5lZWQgdG8gbG9vayBjbG9zZWx5IGF0IGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAgYW5kIGBidGZfcGFyc2Vfc3RydWN0X21ldGFzYCB0byB1bmRlcnN0YW5kIGhvdyB0aGV5IGFyZSBpbnZvbHZlZC4gVGhlIG5leHQgb2J2aW91cyBzdGVwIGlzIHRvIGZpZ3VyZSBvdXQgd2hlcmUgYGJ0Zl9maW5kX3N0cnVjdF9tZXRhYCBsaXZlcyBhbmQgaG93IGl0J3MgYWN0dWFsbHkgKnVzZWQqLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgcHJldHR5IGNsZWFyIHBpY3R1cmUgb2YgdGhlIGRlcGVuZGVuY2llcyBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDM2OCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMDozNy41Njc1MzQ4MTVaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYzNzI3NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9maW5kX3N0cnVjdF9tZXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYnRmLmM9NDI4Mz1pbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MzE2LVxcdFxcdGJ0Zl9pZCA9IHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbmtlcm5lbC9icGYvYnRmLmM6NDMxNzpcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbmtlcm5lbC9icGYvYnRmLmMtNDMxOC1cXHRcXHRpZiAoIW1ldGEpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTQzMjU9c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MzQwLVxcbmtlcm5lbC9icGYvYnRmLmM6NDM0MTpcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbmtlcm5lbC9icGYvYnRmLmMtNDM0Mi1cXHRpZiAoIW1ldGEpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTU4NDQ9YnRmX3BhcnNlX3N0cnVjdF9tZXRhcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLCBzdHJ1Y3QgYnRmICpidGYpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjQtXFxua2VybmVsL2JwZi9idGYuYzo1OTY1OnN0cnVjdCBidGZfc3RydWN0X21ldGEgKmJ0Zl9maW5kX3N0cnVjdF9tZXRhKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZClcXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjYte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz03NDQ4PWludCBidGZfc3RydWN0X2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy03NDY0LVxcbmtlcm5lbC9icGYvYnRmLmM6NzQ2NTpcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBpZCk7XFxua2VybmVsL2JwZi9idGYuYy03NDY2LVxcdFxcdGlmICghbWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jPTgxND12b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtODUwLVxcdFxcdFxcdGlmICghYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKSB7XFxua2VybmVsL2JwZi9zeXNjYWxsLmM6ODUxOlxcdFxcdFxcdFxcdHBvaW50ZWVfc3RydWN0X21ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShmaWVsZC1cXHUwMDNla3B0ci5idGYsXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtODUyLVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGZpZWxkLVxcdTAwM2VrcHRyLmJ0Zl9pZCk7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9Mzc2PXN0YXRpYyBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVnX2J0Zl9yZWNvcmQoY29uc3Qgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0zODMtXFx0fSBlbHNlIGlmICh0eXBlX2lzX3B0cl9hbGxvY19vYmoocmVnLVxcdTAwM2V0eXBlKSkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzozODQ6XFx0XFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKHJlZy1cXHUwMDNlYnRmLCByZWctXFx1MDAzZWJ0Zl9pZCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTM4NS1cXHRcXHRpZiAobWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz00Njc2PXN0YXRpYyBzdHJ1Y3QgYnRmX3JlY29yZCAqa3B0cl9wb2ludGVlX2J0Zl9yZWNvcmQoc3RydWN0IGJ0Zl9maWVsZCAqa3B0cl9maWVsZClcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy00NjgyLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzo0NjgzOlxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShrcHRyX2ZpZWxkLVxcdTAwM2VrcHRyLmJ0ZixcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtNDY4NC1cXHRcXHRcXHRcXHQgICAga3B0cl9maWVsZC1cXHUwMDNla3B0ci5idGZfaWQpO1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTEzODcyPXN0YXRpYyBpbnQgY2hlY2tfc3BlY2lhbF9rZnVuYyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTM5MzgtXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTM5OlxcdFxcdHN0cnVjdF9tZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEocmV0X2J0ZiwgcmV0X2J0Zl9pZCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTQwLVxcdFxcdGlmIChpc19icGZfcGVyY3B1X29ial9uZXdfa2Z1bmMobWV0YS1cXHUwMDNlZnVuY19pZCkpIHtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xMzk2Ny1cXHRcXHRpbnNuX2F1eC1cXHUwMDNla3B0cl9zdHJ1Y3RfbWV0YSA9XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTY4OlxcdFxcdFxcdGJ0Zl9maW5kX3N0cnVjdF9tZXRhKG1ldGEtXFx1MDAzZWFyZ19idGYsXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTY5LVxcdFxcdFxcdFxcdFxcdCAgICAgbWV0YS1cXHUwMDNlYXJnX2J0Zl9pZCk7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTQwNDM9c3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDE0OS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTQxNTA6XFx0XFx0c3RydWN0X21ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShtZXRhLmFyZ19idGYsIG1ldGEuYXJnX2J0Zl9pZCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE0MTUxLVxcdFxcdGlmIChzdHJ1Y3RfbWV0YSBcXHUwMDI2XFx1MDAyNiBidGZfcmVjb3JkX2hhc19ubWlfdW5zYWZlX2ZpZWxkcyhzdHJ1Y3RfbWV0YS1cXHUwMDNlcmVjb3JkKSkge1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE0MjYzLVxcdFxcdGluc25fYXV4LVxcdTAwM2VpbnNlcnRfb2ZmID0gcmVnc1tCUEZfUkVHXzJdLnZhcl9vZmYudmFsdWU7XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE0MjY0OlxcdFxcdGluc25fYXV4LVxcdTAwM2VrcHRyX3N0cnVjdF9tZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEobWV0YS5hcmdfYnRmLCBtZXRhLmFyZ19idGZfaWQpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDI2NS1cXHRcXHRyZWZfY29udmVydF9vd25pbmdfbm9uX293bmluZyhlbnYsIGlkKTtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDQ3MS1cXHRcXHRcXHRcXHRpbnNuX2F1eC1cXHUwMDNla3B0cl9zdHJ1Y3RfbWV0YSA9XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE0NDcyOlxcdFxcdFxcdFxcdFxcdGJ0Zl9maW5kX3N0cnVjdF9tZXRhKG1ldGEuYXJnX2J0ZixcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTQ0NzMtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBtZXRhLmFyZ19idGZfaWQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMDozNy42MzEyNzA1OTVaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTM0NDM0MzMzMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIEJURiBTdHJ1Y3R1cmUgTWV0YWRhdGEgUGFyc2luZyoqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gYGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXNgLiBNeSBpbml0aWFsIGh1bmNoIGlzIHRoYXQgaXQncyBnb2luZyB0byBiZSB0aGUgY2VudHJhbCBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgYWN0dWFsbHkgZXh0cmFjdGluZyB0aGUgc3RydWN0dXJlIG1ldGFkYXRhIGZyb20gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBkYXRhIGluIGBrZXJuZWwvYnBmL2J0Zi5jYC4gR2l2ZW4gdGhhdCBCVEYgaXMgdGhlIGZvdW5kYXRpb24gZm9yIGVuaGFuY2VkIGRlYnVnZ2luZyBhbmQgaW50cm9zcGVjdGlvbiBvZiBCUEYgcHJvZ3JhbXMsIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBzdHJ1Y3R1cmUgbWV0YWRhdGEgaXMgaGFuZGxlZCBpcyBjcnVjaWFsLiBJIHN1c3BlY3QgdGhpcyBmdW5jdGlvbiBtaWdodCBpbnZvbHZlIHNvbWUgY2xldmVyIHBvaW50ZXIgYXJpdGhtZXRpYywgYml0ZmllbGQgaW50ZXJwcmV0YXRpb24sIGFuZCBwb3RlbnRpYWwgdXNlIG9mIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlY3Vyc2l2ZSBwYXJzaW5nIG9mIG5lc3RlZCBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMuIEknbSBleHBlY3Rpbmcgc29tZSBlcnJvciBoYW5kbGluZyBhcm91bmQgbWFsZm9ybWVkIEJURiBkYXRhLCBhbmQgcHJvYmFibHkgc29tZSBjaGVja3MgZm9yIGFsaWdubWVudCBjb25zdHJhaW50cywgZXNwZWNpYWxseSBjb25zaWRlcmluZyBob3cgQlBGIHdvcmtzLiBJdCdsbCBiZSBpbnRlcmVzdGluZyB0byBzZWUgaG93IGl0IHJlY29uY2lsZXMgdGhlIEJURiBpbmZvcm1hdGlvbiB3aXRoIHRoZSBjdXJyZW50IGtlcm5lbCdzIGRhdGEgbGF5b3V0LiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGhhbmRsZXMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgYW5kIGFueSBwb3RlbnRpYWwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGluIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gTGV0J3Mgc2VlIGlmIG15IHByZWxpbWluYXJ5IGFzc3VtcHRpb25zIGFyZSBvbiB0aGUgbW9uZXkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MjM5LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6NTEuMDc0NzA4NzA4WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MTcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU4NDQsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU4NDQ6XFx0YnRmX3BhcnNlX3N0cnVjdF9tZXRhcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLCBzdHJ1Y3QgYnRmICpidGYpXFxuNTg0NTpcXHR7XFxuNTg0NjpcXHRcXHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiID0gTlVMTDtcXG41ODQ3OlxcdFxcdHN0cnVjdCBidGZfaWRfc2V0ICphb2Y7XFxuNTg0ODpcXHRcXHRpbnQgaSwgbiwgaWQsIHJldDtcXG41ODQ5OlxcdFxcbjU4NTA6XFx0XFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBidGZfaWRfc2V0LCBjbnQpICE9IDApO1xcbjU4NTE6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnRmX2lkX3NldCkgIT0gc2l6ZW9mKHUzMikpO1xcbjU4NTI6XFx0XFxuNTg1MzpcXHRcXHRhb2YgPSBrbWFsbG9jX29iaigqYW9mLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG41ODU0OlxcdFxcdGlmICghYW9mKVxcbjU4NTU6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuNTg1NjpcXHRcXHRhb2YtXFx1MDAzZWNudCA9IDA7XFxuNTg1NzpcXHRcXG41ODU4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGFsbG9jX29ial9maWVsZHMpOyBpKyspIHtcXG41ODU5OlxcdFxcdFxcdC8qIFRyeSB0byBmaW5kIHdoZXRoZXIgdGhpcyBzcGVjaWFsIHR5cGUgZXhpc3RzIGluIHVzZXIgQlRGLCBhbmRcXG41ODYwOlxcdFxcdFxcdCAqIGlmIHNvIHJlbWVtYmVyIGl0cyBJRCBzbyB3ZSBjYW4gZWFzaWx5IGZpbmQgaXQgYW1vbmcgbWVtYmVyc1xcbjU4NjE6XFx0XFx0XFx0ICogb2Ygc3RydWN0cyB0aGF0IHdlIGl0ZXJhdGUgaW4gdGhlIG5leHQgbG9vcC5cXG41ODYyOlxcdFxcdFxcdCAqL1xcbjU4NjM6XFx0XFx0XFx0c3RydWN0IGJ0Zl9pZF9zZXQgKm5ld19hb2Y7XFxuNTg2NDpcXHRcXG41ODY1OlxcdFxcdFxcdGlkID0gYnRmX2ZpbmRfYnlfbmFtZV9raW5kKGJ0ZiwgYWxsb2Nfb2JqX2ZpZWxkc1tpXSwgQlRGX0tJTkRfU1RSVUNUKTtcXG41ODY2OlxcdFxcdFxcdGlmIChpZCBcXHUwMDNjIDApXFxuNTg2NzpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG41ODY4OlxcdFxcbjU4Njk6XFx0XFx0XFx0bmV3X2FvZiA9IGtyZWFsbG9jKGFvZiwgc3RydWN0X3NpemUobmV3X2FvZiwgaWRzLCBhb2YtXFx1MDAzZWNudCArIDEpLFxcbjU4NzA6XFx0XFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XFxuNTg3MTpcXHRcXHRcXHRpZiAoIW5ld19hb2YpIHtcXG41ODcyOlxcdFxcdFxcdFxcdHJldCA9IC1FTk9NRU07XFxuNTg3MzpcXHRcXHRcXHRcXHRnb3RvIGZyZWVfYW9mO1xcbjU4NzQ6XFx0XFx0XFx0fVxcbjU4NzU6XFx0XFx0XFx0YW9mID0gbmV3X2FvZjtcXG41ODc2OlxcdFxcdFxcdGFvZi1cXHUwMDNlaWRzW2FvZi1cXHUwMDNlY250KytdID0gaWQ7XFxuNTg3NzpcXHRcXHR9XFxuNTg3ODpcXHRcXG41ODc5OlxcdFxcdG4gPSBidGZfbnJfdHlwZXMoYnRmKTtcXG41ODgwOlxcdFxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG41ODgxOlxcdFxcdFxcdC8qIFRyeSB0byBmaW5kIGlmIHRoZXJlIGFyZSBrcHRycyBpbiB1c2VyIEJURiBhbmQgcmVtZW1iZXIgdGhlaXIgSUQgKi9cXG41ODgyOlxcdFxcdFxcdHN0cnVjdCBidGZfaWRfc2V0ICpuZXdfYW9mO1xcbjU4ODM6XFx0XFx0XFx0c3RydWN0IGJ0Zl9maWVsZF9pbmZvIHRtcDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6NTEuMDc1MTg1MDM4WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY5OTUzNTAwNDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEJURiBMb2FkaW5nIGFuZCBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIGhvdyBgYWxsb2Nfb2JqX2ZpZWxkc2Agd29ya3MgYW5kIGhvdyBCVEYgbG9hZGluZyBwbGF5cyBhIHJvbGUuIEl0IGxvb2tzIGxpa2Ugd2hlbiBhIEJURiBibG9iIGlzIGxvYWRlZCB1c2luZyBgYnBmKEJQRl9CVEZfTE9BRCwgLi4uKWAsIHRoZSBrZXJuZWwgY2FsbHMgYGJ0Zl9wYXJzZSgpYC4gV2l0aGluIGBidGZfcGFyc2UoKWAsIGBidGZfcGFyc2Vfc3RydWN0X21ldGFzKClgIHJ1bnMgb24gdGhlIHVzZXItcHJvdmlkZWQgQlRGIGRhdGEuIFRoYXQncyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBJZiBzdHJ1Y3QgbWV0YWRhdGEgaXMgZm91bmQsIHRoZSBjb2RlIGl0ZXJhdGVzIHRocm91Z2ggaXQsIGNhbGxpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKClgIGFuZCB0aGVuIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLlxuXG5JIHNlZSB0aGF0IHRoZSBgbG9jYWxfa3B0cl9vd25lcnNoaXAuY2Agc2VsZnRlc3QgZGVtb25zdHJhdGVzIHRoaXMgZXhhY3QgZmxvdy4gSXQgY3JlYXRlcyBhbiBlbXB0eSBCVEYsIGFkZHMgZGlmZmVyZW50IHR5cGVzIChpbnQsIGJwZl9zcGluX2xvY2ssIGJwZl9saXN0X2hlYWQsIGV0Yy4pLCBhbmQgbG9hZHMgaXQgd2l0aCBgYnRmX19sb2FkX2ludG9fa2VybmVsKClgLCB3aGljaCB0cmlnZ2VycyB0aGF0IGBicGYoQlBGX0JURl9MT0FELCAuLi4pYCBjYWxsLCB1bHRpbWF0ZWx5IGhpdHRpbmcgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAuXG5cbk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5LiBDbGVhcmx5LCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBlc3NlbnRpYWwuIEJ1dCBkb2VzIGBCUEZfU1lTQ0FMTGAgaGF2ZSBhbnkgZGVwZW5kZW5jaWVzPyBMZXQgbWUgY2hlY2sgdGhlIGBrZXJuZWwvYnBmL0tjb25maWdgLiBBaCwgYEJQRl9TWVNDQUxMYCBzZWxlY3RzIGBCUEZgLiBObyBkaXJlY3QgYGRlcGVuZHMgb25gIHRob3VnaC5cblxuV2hhdCBhYm91dCBgREVCVUdfSU5GT19CVEZgPyBJcyB0aGF0IG5lY2Vzc2FyeSBmb3IgYEJQRl9CVEZfTE9BRGA/IExldCBtZSBsb29rIGF0IGBicGZfYnRmX2xvYWRgIGluIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AuIEl0IGdvZXMgdG8gYGJ0Zl9uZXdfZmQoKWAgdGhlbiB0byBgYnRmX3BhcnNlKClgLiBUaGUgYGJ0Zl9wYXJzZWAgZnVuY3Rpb24gZG9lc24ndCBzZWVtIHRvIGNoZWNrIGZvciBgQ09ORklHX0RFQlVHX0lORk9fQlRGYC4gIEludGVyZXN0aW5nLiBBbHRob3VnaCBjb21tb25seSBlbmFibGVkIGZvciBCUEYgZnV6emluZywgaXQgc2VlbXMgc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgY3JpdGljYWwgY29uZmlnLCBhcyBpdCBidWlsZHMgYGJ0Zi5jYC5cblxuSSdsbCBkb3VibGUtY2hlY2sgdG8gZW5zdXJlIHRoZXJlIGFyZW4ndCBhbnkgb3RoZXIgY29uZmlncyBuZWVkZWQuIElzIGBCUEZfU1lTQ0FMTGAgcGFydCBvZiBhIFwiQlBGIHN1YnN5c3RlbVwiIG1lbnUsIGFzIHRoYXQgaXMgc29tZXRpbWVzIGEgZmFjdG9yPyBJJ2xsIGNoZWNrIGBrZXJuZWwvYnBmL0tjb25maWdgLCBzdGFydGluZyBhdCB0aGUgdG9wLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzI1MCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMwOjU4LjA3MDUzODg3N1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTg5MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRcXG4gICAzOlxcdCMgQlBGIGludGVycHJldGVyIHRoYXQsIGZvciBleGFtcGxlLCBjbGFzc2ljIHNvY2tldCBmaWx0ZXJzIGRlcGVuZCBvbi5cXG4gICA0OlxcdGNvbmZpZyBCUEZcXG4gICA1OlxcdFxcdGJvb2xcXG4gICA2OlxcdFxcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxcbiAgIDc6XFx0XFxuICAgODpcXHQjIFVzZWQgYnkgYXJjaHMgdG8gdGVsbCB0aGF0IHRoZXkgc3VwcG9ydCBCUEYgSklUIGNvbXBpbGVyIHBsdXMgd2hpY2hcXG4gICA5OlxcdCMgZmxhdm91ci4gT25seSBvbmUgb2YgdGhlIHR3byBjYW4gYmUgc2VsZWN0ZWQgZm9yIGEgc3BlY2lmaWMgYXJjaCBzaW5jZVxcbiAgMTA6XFx0IyBlQlBGIEpJVCBzdXBlcnNlZGVzIHRoZSBjQlBGIEpJVC5cXG4gIDExOlxcdFxcbiAgMTI6XFx0IyBDbGFzc2ljIEJQRiBKSVQgKGNCUEYpXFxuICAxMzpcXHRjb25maWcgSEFWRV9DQlBGX0pJVFxcbiAgMTQ6XFx0XFx0Ym9vbFxcbiAgMTU6XFx0XFxuICAxNjpcXHQjIEV4dGVuZGVkIEJQRiBKSVQgKGVCUEYpXFxuICAxNzpcXHRjb25maWcgSEFWRV9FQlBGX0pJVFxcbiAgMTg6XFx0XFx0Ym9vbFxcbiAgMTk6XFx0XFxuICAyMDpcXHQjIEtBU0FOIHN1cHBvcnQgZm9yIEpJVCBjb21waWxlclxcbiAgMjE6XFx0Y29uZmlnIEhBVkVfRUJQRl9KSVRfS0FTQU5cXG4gIDIyOlxcdFxcdGJvb2xcXG4gIDIzOlxcdFxcbiAgMjQ6XFx0IyBVc2VkIGJ5IGFyY2hzIHRvIHRlbGwgdGhhdCB0aGV5IHdhbnQgdGhlIEJQRiBKSVQgY29tcGlsZXIgZW5hYmxlZCBieVxcbiAgMjU6XFx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cXG4gIDI2OlxcdGNvbmZpZyBBUkNIX1dBTlRfREVGQVVMVF9CUEZfSklUXFxuICAyNzpcXHRcXHRib29sXFxuICAyODpcXHRcXG4gIDI5OlxcdG1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxuICAzMDpcXHRcXG4gIDMxOlxcdGNvbmZpZyBCUEZfU1lTQ0FMTFxcbiAgMzI6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcbiAgMzM6XFx0XFx0c2VsZWN0IEJQRlxcbiAgMzQ6XFx0XFx0c2VsZWN0IElSUV9XT1JLXFxuICAzNTpcXHRcXHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6NTguMDcwNjYxMzM3WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjg1MzExNTcyMzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhpcyBCUEYgUGF0Y2ggZm9yIEZ1enppbmcqKlxuXG5BbHJpZ2h0LCBzbyBJJ3ZlIGdvdCBhIGdvb2QgaGFuZGxlIG9uIHRoaXMgcGF0Y2guIGBCUEZfU1lTQ0FMTGAgaXMgdGhlIGtleSBjb25maWd1cmF0aW9uIGhlcmUsIHRoYXQncyB0aGUgZGlyZWN0IGNvbmZpZy4gTm93LCBsZXQncyBuYWlsIGRvd24gdGhlc2UgRm9jdXNTeW1ib2xzLiBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIG5vbi11YmlxdWl0b3VzIGZ1bmN0aW9ucyB0aGF0IGFyZSAqYWx0ZXJlZCogb3IgKmFkZGVkKiBpbiB0aGlzIHBhdGNoLCBhcyBwZXIgdGhlIGd1aWRlbGluZXMuIEkgbmVlZCB0byBhdm9pZCBsaXN0aW5nIGNvbW1vbiBmdW5jdGlvbnMgdGhhdCB3b3VsZCBqdXN0IGRpbHV0ZSB0aGUgZnV6emluZyBlZmZvcnQuXG5cbk9rYXksIGxldCdzIHNlZS4uLiBsb29raW5nIGF0IHRoZSBjb2RlIGNoYW5nZXM6XG5cbiogICBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGA6IEFkZGVkLCBzdGF0aWMgaW4gYGJ0Zi5jYC4gWWVwLCB0aGF0J3Mgc3BlY2lmaWMuXG4qICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgOiBBZGRlZCwgcmVjdXJzaXZlIHN0YXRpYyBpbiBgYnRmLmNgLiBTb3VuZHMgc3BlY2lmaWMgdG8gdGhpcyBuZXcgbG9naWMuXG4qICAgYGJ0Zl9vd25lZF90eXBlX2lkeGA6IEFkZGVkLCBzdGF0aWMgaW4gYGJ0Zi5jYC4gQW5vdGhlciBuZXcgZnVuY3Rpb24gcmVsYXRlZCB0byB0aGUgb3duZXJzaGlwIHRyYWNraW5nLlxuKiAgIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2A6IE1vZGlmaWVkLCBub24tc3RhdGljIGluIGBidGYuY2AuIENydWNpYWwsIHRoZSBjeWNsZSBjaGVjayBsb2dpYyB3YXMgc2ltcGxpZmllZCBpbiB0aGlzLlxuKiAgIGBidGZfcGFyc2VgOiBNb2RpZmllZCwgY2FsbGVyIGluIGBidGYuY2AuIEFkZGVkIGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBEZWZpbml0ZWx5IHJlbGV2YW50LCBzaW5jZSBpdCdzIHRoZSBjYWxsZXIuXG4qICAgYGJ0Zl9uZXdfZmRgIG9yIGBicGZfYnRmX2xvYWRgOiBUaGUgZW50cnkgcG9pbnQgZm9yIGxvYWRpbmcgQlRGLiBOb3csIHRoYXQncyBhIGtleSBlbnRyeSBwb2ludC4gTGV0J3MgdXNlIGBicGZfYnRmX2xvYWRgLlxuXG5TbywgaXQncyBjbGVhciBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIHdhcyBpbmRlZWQgbW9kaWZpZWQuIEdvb2QuIEFuZCB0aG9zZSB0aHJlZSBhZGRlZCBmdW5jdGlvbnMgKGBidGZfb3duZWRfdHlwZV9pZHhgLCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCkgYXJlIGFsbCBuZXcsIHNvLCB0aGV5IGFyZSBub3QgdWJpcXVpdG91cy4gYGJ0Zl9wYXJzZWAgaXMgYWxzbyBhZGRlZCBhbmQgcmVsZXZhbnQgYmVjYXVzZSBpdCBjYWxscyBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAuXG5cbk5vdywgYWNjb3JkaW5nIHRvIHRoZSBpbnN0cnVjdGlvbnMsIEkgbmVlZCB0byBmb2N1cyBvbiBmdW5jdGlvbnMgaW1wbGVtZW50aW5nIHRoZSBuZXcgbG9naWMgb3IgZW50cnlwb2ludHMuIFRoZXNlIGZ1bmN0aW9ucyBhbGwgZml0IHRoYXQgYmlsbCBwZXJmZWN0bHk6XG4tIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYFxuLSBgYnRmX293bmVyc2hpcF9kZXB0aGBcbi0gYGJ0Zl9vd25lZF90eXBlX2lkeGBcbi0gYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYFxuLSBgYnBmX2J0Zl9sb2FkYFxuXG5MZXQncyBtYWtlIHN1cmUgdGhlc2UgYXJlIHZhbGlkIGZ1bmN0aW9uIHN5bWJvbHM6IFllcywgYWxsIG9mIHRoZW0gYXJlIHJlYWwgZnVuY3Rpb24gc3ltYm9scyBpbiBgYnRmLmNgIGFuZCBgc3lzY2FsbC5jYC5cblxuT2theSwgbGV0J3MgZG8gYSBmaW5hbCBjaGVjazogSXMgdGhpcyBwYXRjaCBgV29ydGhGdXp6aW5nYD8gQWJzb2x1dGVseS4gSXQncyBtb2RpZnlpbmcgYGtlcm5lbC9icGYvYnRmLmNgLCBpbXBsZW1lbnRpbmcgYSBuZXcgb3duZXJzaGlwIGdyYXBoIGRlcHRoLWNoZWNraW5nIGFsZ29yaXRobSB0byBwcmV2ZW50IGN5Y2xlcyB3aGVuIHBhcnNpbmcgQlRGIG9iamVjdHMgbG9hZGVkIHZpYSBgYnBmKEJQRl9CVEZfTE9BRCwgLi4uKWAuIFVzZXItc3VwcGxpZWQgQlRGIGlucHV0LCByZWFjaGFibGUga2VybmVsIGNvZGUsIG5vIHNwZWNpYWwgaGFyZHdhcmUuIFRoaXMgaXMgcHJpbWUgZnV6emluZyB0ZXJyaXRvcnkuXG5cbkFuZCBmaW5hbGx5LCBgRW5hYmxlQ29uZmlnc2A6IGBCUEZfU1lTQ0FMTGAuIFNpbmNlIGBCUEZfU1lTQ0FMTGAgc2VsZWN0cyBgQlBGYCwgaXQncyBnb29kIHByYWN0aWNlIHRvIGVuYWJsZSBib3RoLCBhbHRob3VnaCBpdCdzIHJlZHVuZGFudC5cblxuU28sIGJlZm9yZSBJIGNhbGwgYHNldC1yZXN1bHRzYCwgbGV0J3MgdmVyaWZ5OlxuXG4qICAgYFdvcnRoRnV6emluZ2A6IFRydWVcbiogICBgRW5hYmxlQ29uZmlnc2A6IGBbXCJCUEZfU1lTQ0FMTFwiXWBcbiogICBgRm9jdXNTeW1ib2xzYDogYFtcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIiwgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsIFwiYnRmX293bmVkX3R5cGVfaWR4XCIsIFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIiwgXCJicGZfYnRmX2xvYWRcIl1gXG4qICAgUmVhc29uaW5nOiBDb25jaXNlIGFuZCBjb21wbGV0ZS5cblxuUmVhZHkgdG8gcm9sbC4gTGV0J3MgaW52b2tlIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDQyLCJPdXRwdXRUb2tlbnMiOjIwNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg5MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMxOjA2LjYwMTgyMTY0OFoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDIyODQ2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJicGZfYnRmX2xvYWRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJicGZfYnRmX2xvYWRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMxOjA2LjcyMjA1Nzc4OVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc2ODk2NzE1MTE0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMxOjA2LjcyMjYxMjM5OVoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE3Njg5NjY1OTEwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cXG5cXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXFxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxcbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxcblxcblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGY1ODQ1MjVmOTk2MDBmNmY3YWQ3YmRiODliZWFlY2M1ZmI0OGRmODFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNjoyODozMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuKysrIGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTQyODQsMTMgKzQyODQsMTAgQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbiB7XG4gXHRpbnQgaTtcbiBcbi1cdC8qIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyB0aGF0IHNpZ25pZnkgb3duZXJzaGlwIG9mIHNvbWUgb3RoZXIgdHlwZTpcbi1cdCAqICBrcHRyX3JlZiwgYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QuXG4tXHQgKiBrcHRyX3JlZiBvbmx5IHN1cHBvcnRzIHN0b3Jpbmcga2VybmVsIHR5cGVzLCB3aGljaCBjYW4ndCBzdG9yZVxuLVx0ICogcmVmZXJlbmNlcyB0byBwcm9ncmFtIGFsbG9jYXRlZCBsb2NhbCB0eXBlcy5cbi1cdCAqXG4tXHQgKiBIZW5jZSB3ZSBvbmx5IG5lZWQgdG8gZW5zdXJlIHRoYXQgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0gb3duZXJzaGlwXG4tXHQgKiBkb2VzIG5vdCBmb3JtIGN5Y2xlcy5cbitcdC8qXG4rXHQgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWVcbitcdCAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXNcbitcdCAqIGJlZW4gZml4ZWQgdXAuXG4gXHQgKi9cbiBcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXG4gXHRcdHJldHVybiAwO1xuQEAgLTQzMjEsNTEgKzQzMTgsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbiBcdFx0aWYgKCFtZXRhKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRyZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cdTAwM2VyZWNvcmQ7XG4rXHR9XG4rXHRyZXR1cm4gMDtcbit9XG4gXG4tXHRcdC8qIFdlIG5lZWQgdG8gc2V0IHZhbHVlX3JlYyBmb3IgYWxsIHJvb3QgdHlwZXMsIGJ1dCBubyBuZWVkXG4tXHRcdCAqIHRvIGNoZWNrIG93bmVyc2hpcCBjeWNsZSBmb3IgYSB0eXBlIHVubGVzcyBpdCdzIGFsc28gYVxuLVx0XHQgKiBub2RlIHR5cGUuXG4tXHRcdCAqL1xuLVx0XHRpZiAoIShyZWMtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgQlBGX0dSQVBIX05PREUpKVxuK3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbitcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcbit7XG4rXHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuK1x0dTMyIGJ0Zl9pZDtcbitcbitcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuK1x0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcbitcdH0gZWxzZSBpZiAoZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHtcbitcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VrcHRyLmJ0Zl9pZDtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1x0fVxuK1xuK1x0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcbitcdGlmICghbWV0YSlcbitcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG4rXHRyZXR1cm4gbWV0YSAtIHRhYi1cdTAwM2V0eXBlcztcbit9XG4rXG4rLypcbisgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmRcbisgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuKyAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XG4rICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcbisgKiBub24tcmVjdXJzaW5nIGRyb3AuXG4rICovXG4rI2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XG4rXG4rc3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxuK1x0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xuK1x0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbitcbitcdGlmICghZGVwdGhfbGVmdClcbitcdFx0cmV0dXJuIC1FTE9PUDtcbitcdGlmIChkZXB0aFtpZHhdKVxuK1x0XHRnb3RvIGRvbmU7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyByZWMtXHUwMDNlY250OyBpKyspIHtcbitcdFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcdTAwMjZyZWMtXHUwMDNlZmllbGRzW2ldKTtcbitcdFx0aWYgKHJldCA9PSAtRU5PRU5UKVxuIFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRtYXhfZGVwdGggPSBtYXgobWF4X2RlcHRoLCByZXQpO1xuK1x0fVxuK1x0ZGVwdGhbaWR4XSA9IG1heF9kZXB0aCArIDE7XG4rZG9uZTpcbitcdHJldHVybiBkZXB0aFtpZHhdIFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcbit9XG4gXG4tXHRcdC8qIFdlIG5lZWQgdG8gZW5zdXJlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFtb25nIGFsbCB0eXBlcy4gVGhlXG4tXHRcdCAqIHByb3BlciB3YXkgdG8gZG8gaXQgd291bGQgYmUgdG8gdG9wb2xvZ2ljYWxseSBzb3J0IGFsbCBCVEZcbi1cdFx0ICogSURzIGJhc2VkIG9uIHRoZSBvd25lcnNoaXAgZWRnZXMsIHNpbmNlIHRoZXJlIGNhbiBiZSBtdWx0aXBsZVxuLVx0XHQgKiBicGZfe2xpc3RfaGVhZCxyYl9ub2RlfSBpbiBhIHR5cGUuIEluc3RlYWQsIHdlIHVzZSB0aGVcbi1cdFx0ICogZm9sbG93aW5nIHJlc2FvbmluZzpcbi1cdFx0ICpcbi1cdFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgYmUgb3duZWQgYnkgYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0XG4tXHRcdCAqICAgaGFzIGEgYnBmX3tsaXN0LHJifV9ub2RlLiBMZXQncyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxuLVx0XHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQncyBjYWxsIHRoZXNlIHJvb3QgdHlwZXMuXG4tXHRcdCAqXG4tXHRcdCAqIFdlIGVuc3VyZSB0aGF0IGlmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgaXRzXG4tXHRcdCAqIGVsZW1lbnQgdHlwZXMgY2Fubm90IGJlIHJvb3QgdHlwZXMuXG4tXHRcdCAqXG4tXHRcdCAqIFRvIGVuc3VyZSBhY3ljbGljaXR5OlxuLVx0XHQgKlxuLVx0XHQgKiBXaGVuIEEgaXMgYW4gcm9vdCB0eXBlIGJ1dCBub3QgYSBub2RlLCBpdHMgb3duZXJzaGlwXG4tXHRcdCAqIGNoYWluIGNhbiBiZTpcbi1cdFx0ICpcdEEgLVx1MDAzZSBCIC1cdTAwM2UgQ1xuLVx0XHQgKiBXaGVyZTpcbi1cdFx0ICogLSBBIGlzIGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9yYl9yb290LlxuLVx0XHQgKiAtIEIgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGUuZy4gaGFzIGJwZl9yYl9ub2RlIGFuZFxuLVx0XHQgKiAgIGJwZl9saXN0X2hlYWQuXG4tXHRcdCAqIC0gQyBpcyBvbmx5IGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9saXN0X25vZGVcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBzb21lIG90aGVyIHR5cGUgYWxyZWFkeVxuLVx0XHQgKiBvd25zIGl0IGluIHRoZSBCVEYgZG9tYWluLCBoZW5jZSBpdCBjYW4gbm90IG93blxuLVx0XHQgKiBhbm90aGVyIHJvb3QgdHlwZSB0aHJvdWdoIGFueSBvZiB0aGUgb3duZXJzaGlwIGVkZ2VzLlxuLVx0XHQgKlx0QSAtXHUwMDNlIEJcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBib3RoIGFuIHJvb3QgYW5kIG5vZGUuXG4tXHRcdCAqIC0gQiBpcyBvbmx5IGFuIG5vZGUuXG4tXHRcdCAqL1xuLVx0XHRpZiAobWV0YS1cdTAwM2VyZWNvcmQtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpXG4tXHRcdFx0cmV0dXJuIC1FTE9PUDtcbitzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuK3tcbitcdHU4ICpkZXB0aDtcbitcdGludCBpLCByZXQgPSAwO1xuK1xuK1x0ZGVwdGggPSBrdmNhbGxvYyh0YWItXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XG4rXHRpZiAoIWRlcHRoKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkrKykge1xuK1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbitcdFx0XHRcdFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHJldCA9IDA7XG4gXHR9XG4tXHRyZXR1cm4gMDtcbitcdGt2ZnJlZShkZXB0aCk7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbkBAIC02MDYwLDYgKzYwOTQsMTAgQEAgc3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbiBcdFx0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG4gXHRcdH1cbitcbitcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG4rXHRcdGlmIChlcnIgXHUwMDNjIDApXG4rXHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbiBcdH1cbiBcbiBcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXHUwMDI2ZW52LVx1MDAzZWxvZyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbmluZGV4IGMzZDEzM2M2YTAwZDQuLjUyZmFiYmVlM2RkNWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXG5AQCAtNzE0LDcgKzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcImNoZWNrIGJ0ZlwiKTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuQEAgLTc3Myw3ICs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCJjaGVjayBidGZcIik7XG4gXHRcdGJ0Zl9fZnJlZShidGYpO1xuIFx0XHRicmVhaztcbiBcdH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmE0ODdhYTY4ZjJlZWZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmNcbkBAIC0wLDAgKzEsMjk2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbitcbisjZGVmaW5lIFNQSU5fTE9DSyAyXG4rI2RlZmluZSBMSVNUX0hFQUQgM1xuKyNkZWZpbmUgTElTVF9OT0RFIDRcbisvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi9cbisjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOFxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZDtcbitcbitcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImJ0Zl9fbmV3X2VtcHR5XCIpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlkID0gYnRmX19hZGRfaW50KGJ0ZiwgXCJpbnRcIiwgNCwgQlRGX0lOVF9TSUdORUQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEsIFwiYnRmX19hZGRfaW50XCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX3NwaW5fbG9ja1wiLCA0KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCBTUElOX0xPQ0ssIFwiYnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2tcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfbGlzdF9oZWFkXCIsIDE2KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX0hFQUQsIFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfbGlzdF9ub2RlXCIsIDI0KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsIFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X25vZGVcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdHJldHVybiBidGY7XG4rXG4rZXJyX291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYWRkX2xvY2FsX2twdHIoc3RydWN0IGJ0ZiAqYnRmLCBpbnQgcG9pbnRlZV9pZCwgY29uc3QgY2hhciAqdGFnKVxuK3tcbitcdGludCBpZDtcbitcbitcdGlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpO1xuK1x0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfdHlwZV90YWdcIikpXG4rXHRcdHJldHVybiBpZDtcbitcdGlkID0gYnRmX19hZGRfcHRyKGJ0ZiwgaWQpO1xuK1x0QVNTRVJUX0dUKGlkLCAwLCBcImJ0Zl9fYWRkX3B0clwiKTtcbitcdHJldHVybiBpZDtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2Vycilcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgdGFnKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcInNlbGZfY3ljbGVcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXCJidGZfX2FkZF9zdHJ1Y3Qgc2VsZl9jeWNsZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibmV4dFwiLCA2LCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgMTAsIFwia3B0clwiKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksIFwia3B0clwiKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImN5Y2xlX2FcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgOSwgXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwiYlwiLCA2LCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBjeWNsZV9hOjpiXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJjeWNsZV9iXCIsIDgpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEwLCBcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJhXCIsIDgsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnI7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIFwia3B0clwiKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcIm1peGVkX293bmVyXCIsIDIwKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9vd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwicm9vdFwiLCBMSVNUX0hFQUQsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJsb2NrXCIsIFNQSU5fTE9DSywgMTI4LCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXCJjb250YWluczptaXhlZF9ub2RlOm5vZGVcIiwgNywgMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXCJidGZfX2FkZF9kZWNsX3RhZyBtaXhlZF9vd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwibWl4ZWRfbm9kZVwiLCAzMik7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgOSwgXCJidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibm9kZVwiLCBMSVNUX05PREUsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm93bmVyXCIsIDYsIDE5MiwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6b3duZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2FjeWNsaWNfZGVwdGgoaW50IGRlcHRoLCBib29sIGNoaWxkX2ZpcnN0LCBib29sIHNoYXJlZF9zdWZmaXgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XG4rXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnIsIGksIG4sIHBvaW50ZWVfaWQ7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0aWYgKGkgPT0gZGVwdGggLSAxKVxuK1x0XHRcdHBvaW50ZWVfaWQgPSBmaXJzdF9zdHJ1Y3RfaWQgKyBkZXB0aDtcbitcdFx0ZWxzZVxuK1x0XHRcdHBvaW50ZWVfaWQgPSBmaXJzdF9zdHJ1Y3RfaWQgKyAoY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDIgLSBpIDogaSArIDEpO1xuK1x0XHRwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIHBvaW50ZWVfaWQsIFwia3B0clwiKTtcbitcdFx0aWYgKHB0cl9pZFtpXSBcdTAwM2M9IDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRmb3IgKG4gPSAwOyBuIFx1MDAzYyBkZXB0aDsgbisrKSB7XG4rXHRcdGNoYXIgbmFtZVszMl07XG4rXHRcdGludCBvZmZzZXQgPSAwO1xuK1xuK1x0XHRpID0gY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDEgLSBuIDogbjtcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcIm93bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggXHUwMDI2XHUwMDI2ICFpID8gMTYgOiA4KTtcbitcdFx0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIG4sIFwiYnRmX19hZGRfc3RydWN0IG93bmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRpZiAoc2hhcmVkX3N1ZmZpeCBcdTAwMjZcdTAwMjYgIWkpIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIFZpc2l0IHRoZSBzaGFyZWQgc3VmZml4IHRocm91Z2ggdGhlIHNob3J0ZXIgcGF0aCBiZWZvcmVcbitcdFx0XHQgKiByZWFjaGluZyBpdCBhZ2FpbiB3aXRoIGxlc3MgcmVtYWluaW5nIGRlcHRoLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJzdWZmaXhcIiwgcHRyX2lkWzFdLCAwLCAwKTtcbitcdFx0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgb3duZXI6OnN1ZmZpeFwiKSlcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdG9mZnNldCA9IDY0O1xuK1x0XHR9XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIHB0cl9pZFtpXSwgb2Zmc2V0LCAwKTtcbitcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0XCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcInBsYWluX2xlYWZcIiwgNCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgZGVwdGgsIFwiYnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2dyYXBoX2RlcHRoKGJvb2wgcmJ0cmVlLCBpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHJvb3RfdHlwZSA9IExJU1RfSEVBRCwgbm9kZV90eXBlID0gTElTVF9OT0RFLCBub2RlX3NpemUgPSAyNDtcbitcdGludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHJidHJlZSkge1xuK1x0XHRyb290X3R5cGUgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9yYl9yb290XCIsIDE2KTtcbitcdFx0aWYgKCFBU1NFUlRfR1Qocm9vdF90eXBlLCAwLCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfcmJfcm9vdFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0bm9kZV90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfcmJfbm9kZVwiLCAzMik7XG4rXHRcdGlmICghQVNTRVJUX0dUKG5vZGVfdHlwZSwgMCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX25vZGVcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdG5vZGVfc2l6ZSA9IDMyO1xuK1x0fVxuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZGVwdGg7IGkrKykge1xuK1x0XHRjaGFyIG5hbWVbMzJdLCB0YWdbNjRdO1xuK1xuK1x0XHRsb2NrX29mZiA9IGkgPyBub2RlX3NpemUgOiAwO1xuK1x0XHRyb290X29mZiA9IGxvY2tfb2ZmICsgODtcbitcdFx0c2l6ZSA9IGkgPT0gZGVwdGggLSAxID8gbm9kZV9zaXplIDogcm9vdF9vZmYgKyAxNjtcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcImdyYXBoX293bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpO1xuK1x0XHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF9zdHJ1Y3QgZ3JhcGhfb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlmIChpKSB7XG4rXHRcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm5vZGVcIiwgbm9kZV90eXBlLCAwLCAwKTtcbitcdFx0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6Om5vZGVcIikpXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRpZiAoaSA9PSBkZXB0aCAtIDEpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJsb2NrXCIsIFNQSU5fTE9DSywgbG9ja19vZmYgKiA4LCAwKTtcbitcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpsb2NrXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwicm9vdFwiLCByb290X3R5cGUsIHJvb3Rfb2ZmICogOCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0c25wcmludGYodGFnLCBzaXplb2YodGFnKSwgXCJjb250YWluczpncmFwaF9vd25lcl8lZDpub2RlXCIsIGkgKyAxKTtcbitcdFx0ZXJyID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCB0YWcsIGlkLCBpID8gMiA6IDEpO1xuK1x0XHRpZiAoIUFTU0VSVF9HVChlcnIsIDAsIFwiYnRmX19hZGRfZGVjbF90YWcgZ3JhcGhfb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKVxuK3tcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2VsZl9jeWNsZVwiKSlcbitcdFx0dGVzdF9zZWxmX2N5Y2xlKFwia3B0clwiLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ1bnRydXN0ZWRfc2VsZl9jeWNsZVwiKSlcbitcdFx0dGVzdF9zZWxmX2N5Y2xlKFwia3B0cl91bnRydXN0ZWRcIiwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBlcmNwdV9zZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJwZXJjcHVfa3B0clwiLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJBQkFfY3ljbGVcIikpXG4rXHRcdHRlc3RfYWJhX2N5Y2xlKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1peGVkX2dyYXBoX3Jvb3RfY3ljbGVcIikpXG4rXHRcdHRlc3RfbWl4ZWRfY3ljbGUoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWF4X2FjeWNsaWNcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgZmFsc2UsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIGZhbHNlLCBmYWxzZSwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWF4X2FjeWNsaWNfY2hpbGRfZmlyc3RcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCB0cnVlLCBmYWxzZSwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRvb19kZWVwX2FjeWNsaWNfY2hpbGRfZmlyc3RcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgdHJ1ZSwgZmFsc2UsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1heF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgdHJ1ZSwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRvb19kZWVwX2FjeWNsaWNfc2hhcmVkX3N1ZmZpeFwiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggKyAxLCBmYWxzZSwgdHJ1ZSwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibGlzdF90aHJlZV90eXBlc1wiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgMywgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfZm91cl90eXBlc1wiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfbWF4X2RlcHRoXCIpKVxuK1x0XHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibGlzdF90b29fZGVlcFwiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV90aHJlZV90eXBlc1wiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCAzLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmJ0cmVlX2ZvdXJfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgNCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV9tYXhfZGVwdGhcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV90b29fZGVlcFwiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCBNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgLUVMT09QKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMTowNi43MjI2MTM4MjlaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTA1NDA4NDQwMjg0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFdmFsdWF0aW5nIHRoZSBLTVNBTiBGdXp6aW5nIEp1c3RpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gdGFraW5nIGEgbG9vayBhdCB0aGlzIHBhdGNoIHNlcmllcyB0byBzZWUgaWYgaXQgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCdzIHByb2JhYmx5IHdvcnRoIGl0LCBnaXZlbiB0aGUgY2hhbmdlcy5cblxuSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgc3BlY2lmaWNzLCBzbyBsZXQncyBzdGFydCB3aXRoIHRoZSBkaWZmIGl0c2VsZi4gSXQgbG9va3MgbGlrZSB3ZSdyZSBhZGRyZXNzaW5nIGEgY3ljbGUgY2hlY2sgaXNzdWUgaW4gYGtlcm5lbC9icGYvYnRmLmNgLiBTcGVjaWZpY2FsbHksIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgYmVpbmcgdXBkYXRlZC4gVGhlIG9yaWdpbmFsIHNpbXBsZSBgQlBGX0dSQVBIX1JPT1RgIGN5Y2xlIGNoZWNrIGlzIGdvbmUsIHJlcGxhY2VkIHdpdGggYSBtb3JlIGNvbXByZWhlbnNpdmUgb3duZXJzaGlwIGRlcHRoIGFuZCBjeWNsZSBjaGVjayB0aGF0IGNvbnNpZGVycyBhbGwgb3duZXJzaGlwIHR5cGVzOiBgQlBGX0dSQVBIX1JPT1RgLCBgQlBGX0tQVFJfUkVGYCwgYW5kIGBCUEZfS1BUUl9QRVJDUFVgLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQsIHJlcGxhY2luZyBhIHBvdGVudGlhbGx5IGluY29tcGxldGUgY2hlY2sgd2l0aCBzb21ldGhpbmcgbW9yZSByb2J1c3QuXG5cbkkgc2VlIG5ldyBoZWxwZXIgZnVuY3Rpb25zIGJlaW5nIGFkZGVkOiBgYnRmX293bmVkX3R5cGVfaWR4KClgLCB3aGljaCBhcHBlYXJzIHRvIGRldGVybWluZSB0aGUgaW5kZXggb2YgYSBwb2ludGVlIHN0cnVjdCBiYXNlZCBvbiB0aGUgb3duZXJzaGlwIHR5cGUsIGFuZCBgYnRmX293bmVyc2hpcF9kZXB0aCgpYCwgd2hpY2ggcGVyZm9ybXMgYSBkZXB0aC1maXJzdCBzZWFyY2ggKERGUykgd2l0aCBtZW1vaXphdGlvbiB0byBjYWxjdWxhdGUgb3duZXJzaGlwIGRlcHRoLiBJdCBsb29rcyBsaWtlIGl0IHVzZXMgYSBgZGVwdGhgIGFycmF5IGFsbG9jYXRlZCBieSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCB0byB0cmFjayB0aGUgZGVwdGguIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgIGl0c2VsZiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBzdHJ1Y3QgbWV0YXMsIGNhbGxzIGBidGZfb3duZXJzaGlwX2RlcHRoKClgLCBhbmQgbWFuYWdlcyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGRlcHRoIHRyYWNraW5nIGFycmF5LlxuXG5UaGUga2V5IGludGVncmF0aW9uIHBvaW50IHNlZW1zIHRvIGJlIGluIGBidGZfcGFyc2UoKWAsIHdoZXJlIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgIGlzIG5vdyBjYWxsZWQuIFRoaXMgc3VnZ2VzdHMgdGhlIG93bmVyc2hpcCBkZXB0aCBjaGVjayBpcyBiZWluZyBwZXJmb3JtZWQgZHVyaW5nIEJURiBwYXJzaW5nLCB3aGljaCBpcyBhIGNyaXRpY2FsIHN0ZXAuXG5cbkZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB0aGlzIGlzIGludGVyZXN0aW5nLiBJJ2xsIG5lZWQgdG8gZXhhbWluZSB0aGUgY29kZSBzdXJyb3VuZGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYCBtb3JlIGNsb3NlbHkgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhbmQgcG90ZW50aWFsIGFyZWFzIHdoZXJlIEtNU0FOIG1pZ2h0IGJlIHVzZWZ1bC4gVGhlIG5ldyBmdW5jdGlvbnMgYW5kIHRoZSBhZGRlZCBjaGVja3MgY291bGQgcmV2ZWFsIHN1YnRsZSBtZW1vcnkgc2FmZXR5IGlzc3VlcyB0aGF0IGZ1enppbmcgY2FuIHVuY292ZXIuIFRoZSBmYWN0IHRoYXQgdGhlIHBhdGNoIGluY2x1ZGVzIHNlbGZ0ZXN0cyBpcyBhIGdvb2Qgc2lnbiwgYnV0IHRoZSBuYXR1cmUgb2YgdGhlc2UgY2hlY2tzIG1ha2VzIG1lIGJlbGlldmUgdGhhdCBLTVNBTiBtaWdodCBiZSBwYXJ0aWN1bGFybHkgdmFsdWFibGUgaGVyZSwgcG90ZW50aWFsbHkgZmluZGluZyBjb21wbGV4IGN5Y2xlIHByb2JsZW1zIHRoYXQgZXZlbiB3ZWxsLWNyYWZ0ZWQgdGVzdHMgbWlnaHQgbWlzcy4gSXQgaXMgZ29pbmcgdG8gYmUgZ29vZCB0byB0cnkgYW5kIGNyZWF0ZSBmdXp6ZXIgc2VlZHMgdGhhdCB0YXJnZXQgdGhlc2UgbmV3IGZ1bmN0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODU2MCwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1NiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQwLjgwNzAyMDA4NFoiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI5MjIzNjMwMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYnRmLmM9NDE1MD1zdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNDI4Mi1cXG5rZXJuZWwvYnBmL2J0Zi5jOjQyODM6aW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG5rZXJuZWwvYnBmL2J0Zi5jLTQyODQte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz02MDE0PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02MDkyLVxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZWNudDsgaSsrKSB7XFxua2VybmVsL2JwZi9idGYuYzo2MDkzOlxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVxcdTAwM2V0eXBlc1tpXS5yZWNvcmQpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjA5NC1cXHRcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDg6NDIuMDk5MjY3MDQ3WiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI1MTI3NzMxODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgY29kZSBzbmlwcGV0cywgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0IHRocm91Z2g6XG5cbioqQW5hbHl6aW5nIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgYW5kIGBidGZfcGFyc2VgKipcblxuT2theSwgc28gSSBuZWVkIHRvIGRpdmUgaW50byBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBzZWN0aW9ucyBhcm91bmQgbGluZXMgNDI4MC00MzUwIGFuZCA2MDgwLTYxMTAuIEZyb20gcGFzdCBleHBlcmllbmNlLCBJJ20gZ3Vlc3NpbmcgdGhlc2Ugc2VjdGlvbnMgYXJlIGNyaXRpY2FsIGZvciBoYW5kbGluZyBmaWVsZCB2YWxpZGF0aW9uIGFuZCBwYXJzaW5nIHdpdGhpbiB0aGUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIG1ldGFkYXRhLiBHaXZlbiB0aGUgbGluZSBudW1iZXJzLCBJJ2QgYmV0IHRoZXkncmUgbGlrZWx5IHJlbGF0ZWQgdG8gZXJyb3IgaGFuZGxpbmcsIHR5cGUgc2l6ZSBjb25zaXN0ZW5jeSwgb3IgcGVyaGFwcyBldmVuIHBvaW50ZXIgZGVyZWZlcmVuY2luZyB3aXRoaW4gdGhlIEJURiBkYXRhIHN0cnVjdHVyZS4gVGhpcyBpcyBwcmV0dHkgc3RhbmRhcmQgZm9yIEJURiBwcm9jZXNzaW5nIOKAkyBlbnN1cmluZyBkYXRhIGludGVncml0eSBpcyBwYXJhbW91bnQuIEknbGwgbmVlZCB0byBsb29rIGF0IGhvdyB0aGVzZSBmdW5jdGlvbnMgaGFuZGxlIHBvdGVudGlhbCBpbmNvbnNpc3RlbmNpZXMgb3IgdmlvbGF0aW9ucyBvZiB0aGUgQlRGIHNwZWNpZmljYXRpb24gdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBsb2dpYyBhbmQgcG90ZW50aWFsIGFyZWFzIGZvciBpbXByb3ZlbWVudCBvciBkZWJ1Z2dpbmcuIEknbGwgYWxzbyBiZSB3YXRjaGluZyBmb3IgYW55IG51YW5jZXMgb3IgY2xldmVyIHRyaWNrcyB0aGUgZGV2ZWxvcGVycyBoYXZlIHVzZWQgdG8gb3B0aW1pemUgbWVtb3J5IHVzYWdlIG9yIHBlcmZvcm1hbmNlIHdpdGhpbiB0aGVzZSByb3V0aW5lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTk2MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQ0LjYxMjA0MzgxN1oiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MzM5MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MjgwLFxuICBcIkxpbmVDb3VudFwiOiA3MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI0MjgwOlxcdFxcdHJldHVybiBFUlJfUFRSKHJldCk7XFxuNDI4MTpcXHR9XFxuNDI4MjpcXHRcXG40MjgzOlxcdGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuNDI4NDpcXHR7XFxuNDI4NTpcXHRcXHRpbnQgaTtcXG40Mjg2OlxcdFxcbjQyODc6XFx0XFx0LypcXG40Mjg4OlxcdFxcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxcbjQyODk6XFx0XFx0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xcbjQyOTA6XFx0XFx0ICogYmVlbiBmaXhlZCB1cC5cXG40MjkxOlxcdFxcdCAqL1xcbjQyOTI6XFx0XFx0aWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtXFx1MDAzZWZpZWxkX21hc2sgXFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxcbjQyOTM6XFx0XFx0XFx0cmV0dXJuIDA7XFxuNDI5NDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcmVjLVxcdTAwM2VjbnQ7IGkrKykge1xcbjQyOTU6XFx0XFx0XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcXG40Mjk2OlxcdFxcdFxcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcXG40Mjk3OlxcdFxcdFxcdHUzMiBidGZfaWQ7XFxuNDI5ODpcXHRcXG40Mjk5OlxcdFxcdFxcdGlmIChyZWMtXFx1MDAzZWZpZWxkc1tpXS50eXBlID09IEJQRl9VUFRSKSB7XFxuNDMwMDpcXHRcXHRcXHRcXHQvKiBUaGUgdXB0ciBvbmx5IHN1cHBvcnRzIHBpbm5pbmcgb25lIHBhZ2UgYW5kIGNhbm5vdFxcbjQzMDE6XFx0XFx0XFx0XFx0ICogcG9pbnQgdG8gYSBrZXJuZWwgc3RydWN0XFxuNDMwMjpcXHRcXHRcXHRcXHQgKi9cXG40MzAzOlxcdFxcdFxcdFxcdGlmIChidGZfaXNfa2VybmVsKHJlYy1cXHUwMDNlZmllbGRzW2ldLmtwdHIuYnRmKSlcXG40MzA0OlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjQzMDU6XFx0XFx0XFx0XFx0dCA9IGJ0Zl90eXBlX2J5X2lkKHJlYy1cXHUwMDNlZmllbGRzW2ldLmtwdHIuYnRmLFxcbjQzMDY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgcmVjLVxcdTAwM2VmaWVsZHNbaV0ua3B0ci5idGZfaWQpO1xcbjQzMDc6XFx0XFx0XFx0XFx0aWYgKCF0LVxcdTAwM2VzaXplKVxcbjQzMDg6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuNDMwOTpcXHRcXHRcXHRcXHRpZiAodC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFBBR0VfU0laRSlcXG40MzEwOlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRTJCSUc7XFxuNDMxMTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzEyOlxcdFxcdFxcdH1cXG40MzEzOlxcdFxcbjQzMTQ6XFx0XFx0XFx0aWYgKCEocmVjLVxcdTAwM2VmaWVsZHNbaV0udHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKSlcXG40MzE1OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzMTY6XFx0XFx0XFx0YnRmX2lkID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuNDMxNzpcXHRcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbjQzMTg6XFx0XFx0XFx0aWYgKCFtZXRhKVxcbjQzMTk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuNDMyMDpcXHRcXHRcXHRyZWMtXFx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXFx1MDAzZXJlY29yZDtcXG40MzIxOlxcdFxcdH1cXG40MzIyOlxcdFxcdHJldHVybiAwO1xcbjQzMjM6XFx0fVxcbjQzMjQ6XFx0XFxuNDMyNTpcXHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuNDMyNjpcXHRcXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcXG40MzI3OlxcdHtcXG40MzI4OlxcdFxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuNDMyOTpcXHRcXHR1MzIgYnRmX2lkO1xcbjQzMzA6XFx0XFxuNDMzMTpcXHRcXHRpZiAoZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xcbjQzMzI6XFx0XFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbjQzMzM6XFx0XFx0fSBlbHNlIGlmIChmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XFxuNDMzNDpcXHRcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKVxcbjQzMzU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMzNjpcXHRcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNla3B0ci5idGZfaWQ7XFxuNDMzNzpcXHRcXHR9IGVsc2Uge1xcbjQzMzg6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMzOTpcXHRcXHR9XFxuNDM0MDpcXHRcXG40MzQxOlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxuNDM0MjpcXHRcXHRpZiAoIW1ldGEpXFxuNDM0MzpcXHRcXHRcXHRyZXR1cm4gZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xcbjQzNDQ6XFx0XFx0cmV0dXJuIG1ldGEgLSB0YWItXFx1MDAzZXR5cGVzO1xcbjQzNDU6XFx0fVxcbjQzNDY6XFx0XFxuNDM0NzpcXHQvKlxcbjQzNDg6XFx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXFxuNDM0OTpcXHQgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo0NC42MTI1ODAwOTdaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjkzNDAzNTYwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgcmVxdWVzdCwgZm9ybWF0dGVkIGFzIHJlcXVlc3RlZDpcblxuKipEaWdnaW5nIERlZXBlciBpbnRvIHRoZSBEYXRhKipcblxuQWxyaWdodCwgSSBuZWVkIHRvIGZvY3VzIG15IGF0dGVudGlvbi4gSXQgbG9va3MgbGlrZSBJJ20gYmVpbmcgYXNrZWQgdG8gZGVsdmUgZnVydGhlciBpbnRvIHRoaXMgZGF0YSBzZXQuIFNwZWNpZmljYWxseSwgSSBzaG91bGQgdGFrZSBhIGxvb2sgYXQgdGhlIGNvbnRlbnQgZnJvbSBsaW5lcyA0MzUwIHRvIDQ0MDAsIGFuZCB0aGVuIGFnYWluIGZyb20gbGluZXMgNjA4MCB0byA2MTEwLiBUaGlzIHNpZ25hbHMgdGhhdCB0aGVyZSdzIGxpa2VseSBzb21lIGNydWNpYWwgaW5mb3JtYXRpb24gb3IgYSBjcml0aWNhbCBwb2ludCBiZWluZyBtYWRlIHdpdGhpbiB0aG9zZSBzcGVjaWZpYyByYW5nZXMuIEknbGwgbmVlZCB0byBhbmFseXplIHRoZW0gY2FyZWZ1bGx5LCBsb29raW5nIGZvciBwYXR0ZXJucywgaW5jb25zaXN0ZW5jaWVzLCBvciBhbnl0aGluZyB0aGF0IHN0YW5kcyBvdXQgaW4gcmVsYXRpb24gdG8gdGhlIGJyb2FkZXIgc2NvcGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIHRob3NlIHNwZWNpZmljIGxpbmVzIGFyZSBpbXBvcnRhbnQgdG8gdGhlIGNvbnRleHQuIEl0J3MgdGltZSB0byBwdXQgb24gbXkgY3JpdGljYWwgdGhpbmtpbmcgaGF0IGFuZCBzZWUgd2hhdCBpbnNpZ2h0cyBJIGNhbiBnbGVhbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MjMsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQ3LjU0NjYxODM5MloiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjMwODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MzUwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI0MzUwOlxcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XFxuNDM1MTpcXHQgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxcbjQzNTI6XFx0ICogbm9uLXJlY3Vyc2luZyBkcm9wLlxcbjQzNTM6XFx0ICovXFxuNDM1NDpcXHQjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcXG40MzU1OlxcdFxcbjQzNTY6XFx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG40MzU3OlxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXFxuNDM1ODpcXHRcXHRcXHRcXHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXFxuNDM1OTpcXHR7XFxuNDM2MDpcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVxcdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcXG40MzYxOlxcdFxcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XFxuNDM2MjpcXHRcXG40MzYzOlxcdFxcdGlmICghZGVwdGhfbGVmdClcXG40MzY0OlxcdFxcdFxcdHJldHVybiAtRUxPT1A7XFxuNDM2NTpcXHRcXHRpZiAoZGVwdGhbaWR4XSlcXG40MzY2OlxcdFxcdFxcdGdvdG8gZG9uZTtcXG40MzY3OlxcdFxcbjQzNjg6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG40MzY5OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXFx1MDAyNnJlYy1cXHUwMDNlZmllbGRzW2ldKTtcXG40MzcwOlxcdFxcdFxcdGlmIChyZXQgPT0gLUVOT0VOVClcXG40MzcxOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzNzI6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNDM3MzpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbjQzNzQ6XFx0XFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xcbjQzNzU6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNDM3NjpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbjQzNzc6XFx0XFx0XFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcXG40Mzc4OlxcdFxcdH1cXG40Mzc5OlxcdFxcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggKyAxO1xcbjQzODA6XFx0ZG9uZTpcXG40MzgxOlxcdFxcdHJldHVybiBkZXB0aFtpZHhdIFxcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XFxuNDM4MjpcXHR9XFxuNDM4MzpcXHRcXG40Mzg0OlxcdHN0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuNDM4NTpcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXFxuNDM4NjpcXHR7XFxuNDM4NzpcXHRcXHR1OCAqZGVwdGg7XFxuNDM4ODpcXHRcXHRpbnQgaSwgcmV0ID0gMDtcXG40Mzg5OlxcdFxcbjQzOTA6XFx0XFx0ZGVwdGggPSBrdmNhbGxvYyh0YWItXFx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xcbjQzOTE6XFx0XFx0aWYgKCFkZXB0aClcXG40MzkyOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjQzOTM6XFx0XFxuNDM5NDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbjQzOTU6XFx0XFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksXFxuNDM5NjpcXHRcXHRcXHRcXHRcXHRcXHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcXG40Mzk3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzOTg6XFx0XFx0XFx0XFx0YnJlYWs7XFxuNDM5OTpcXHRcXHRcXHRyZXQgPSAwO1xcbjQ0MDA6XFx0XFx0fVxcbjQ0MDE6XFx0XFx0a3ZmcmVlKGRlcHRoKTtcXG40NDAyOlxcdFxcdHJldHVybiByZXQ7XFxuNDQwMzpcXHR9XFxuNDQwNDpcXHRcXG40NDA1OlxcdHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbjQ0MDY6XFx0XFx0XFx0XFx0ICAgICAgdTMyIHR5cGVfaWQsIHZvaWQgKmRhdGEsIHU4IGJpdHNfb2Zmc2V0LFxcbjQ0MDc6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGJ0Zl9zaG93ICpzaG93KVxcbjQ0MDg6XFx0e1xcbjQ0MDk6XFx0XFx0Y29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDg6NDcuNTQ3MTQ0MzYyWiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI0MjUyNTE0MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgcGVyc3BlY3RpdmUgb24gdGhhdCBzZWdtZW50OlxuXG4qKkFuYWx5emluZyBgYnRmX3BhcnNlYCAoTGluZXMgNjA4NS02MTE1KSoqXG5cblJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIGBidGZfcGFyc2VgIGJldHdlZW4gdGhvc2UgbGluZSBudW1iZXJzLCA2MDg1IGFuZCA2MTE1LiBUaGF0IGFyZWEgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBjb250ZXh0IG9mIHdoYXQncyBoYXBwZW5pbmcganVzdCBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgc2VjdGlvbi4gSSdtIGFzc3VtaW5nIHdlJ3JlIGRlYWxpbmcgd2l0aCBwYXJzaW5nIEJURiBkYXRhLiBTbywgd2hhdCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYXJlIGJlaW5nIGhhbmRsZWQgYXJvdW5kIHRob3NlIGxpbmVzPyBBcmUgd2UgbG9va2luZyBhdCB0aGUgY29yZSBwYXJzaW5nIGxvZ2ljLCBlcnJvciBoYW5kbGluZywgb3IgcGVyaGFwcyB0eXBlIGRlZmluaXRpb24gcmVzb2x1dGlvbj8gVGhlIGZ1bmN0aW9uJ3Mgc3RydWN0dXJlIGl0c2VsZiB3aWxsIHRlbGwgYSBsb3QuIEknbGwgbmVlZCB0byBjb25maXJtIHdoYXQgdGhlIGlucHV0IHBhcmFtZXRlcnMgYXJlIGFuZCBob3cgdGhleSdyZSBiZWluZyB1c2VkIHdpdGhpbiB0aGlzIHNuaXBwZXQuIEFueSBwb3RlbnRpYWwgZm9yIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgaW5jb3JyZWN0IHR5cGUgY2FzdGluZyBsZWFwcyBvdXQgaW1tZWRpYXRlbHkuIEFyZSB0aGVyZSBhbnkgaW5kaXJlY3QganVtcHMgb3IgcG9pbnRlciBtYW5pcHVsYXRpb24gb2NjdXJyaW5nIGhlcmU/IFRob3NlIGFyZSBhbHdheXMgd29ydGggYSBjbG9zZXIgaW5zcGVjdGlvbi4gSSdsbCBuZWVkIHRvIHBpbnBvaW50IGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIHRvIGVuc3VyZSB0aGlzIGNyaXRpY2FsIGZ1bmN0aW9uIGlzIHJvYnVzdCBhbmQgc2FmZSBmcm9tIG1pc3VzZS4gVGhlbiwgSSBuZWVkIHRvIGNvbnNpZGVyIGFueSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMg4oCTIGNvdWxkIHRoaXMgYmUgYSBib3R0bGVuZWNrIGluIHRoZSBvdmVyYWxsIHByb2Nlc3M/IEFueSBvcHRpbWl6YXRpb25zIEkgY2FuIG1ha2U/IFJpZ2h0LCB0aW1lIHRvIGRpdmUgaW4gYW5kIGdldCBteSBoYW5kcyBkaXJ0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI1OTgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQ5Ljk3MjM5ODY3N1oiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjE5ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MDg1LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI2MDg1OlxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjYwODY6XFx0XFx0fVxcbjYwODc6XFx0XFx0YnRmLVxcdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XFxuNjA4ODpcXHRcXG42MDg5OlxcdFxcdGlmIChzdHJ1Y3RfbWV0YV90YWIpIHtcXG42MDkwOlxcdFxcdFxcdGludCBpO1xcbjYwOTE6XFx0XFxuNjA5MjpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbjYwOTM6XFx0XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxuNjA5NDpcXHRcXHRcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG42MDk1OlxcdFxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuNjA5NjpcXHRcXHRcXHR9XFxuNjA5NzpcXHRcXG42MDk4OlxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xcbjYwOTk6XFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuNjEwMDpcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbjYxMDE6XFx0XFx0fVxcbjYxMDI6XFx0XFxuNjEwMzpcXHRcXHRlcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjEwNDpcXHRcXHRpZiAoZXJyKVxcbjYxMDU6XFx0XFx0XFx0Z290byBlcnJvdXRfZnJlZTtcXG42MTA2OlxcdFxcbjYxMDc6XFx0XFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XFxuNjEwODpcXHRcXHRyZWZjb3VudF9zZXQoXFx1MDAyNmJ0Zi1cXHUwMDNlcmVmY250LCAxKTtcXG42MTA5OlxcdFxcdHJldHVybiBidGY7XFxuNjExMDpcXHRcXG42MTExOlxcdGVycm91dF9tZXRhOlxcbjYxMTI6XFx0XFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XFxuNjExMzpcXHRlcnJvdXQ6XFxuNjExNDpcXHRcXHQvKiBvdmVyd3JpdGUgZXJyIHdpdGggLUVOT1NQQyBvciAtRUZBVUxUICovXFxuNjExNTpcXHRcXHRyZXQgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjExNjpcXHRcXHRpZiAocmV0KVxcbjYxMTc6XFx0XFx0XFx0ZXJyID0gcmV0O1xcbjYxMTg6XFx0ZXJyb3V0X2ZyZWU6XFxuNjExOTpcXHRcXHRidGZfdmVyaWZpZXJfZW52X2ZyZWUoZW52KTtcXG42MTIwOlxcdFxcdGlmIChidGYpXFxuNjEyMTpcXHRcXHRcXHRidGZfZnJlZShidGYpO1xcbjYxMjI6XFx0XFx0cmV0dXJuIEVSUl9QVFIoZXJyKTtcXG42MTIzOlxcdH1cXG42MTI0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo0OS45NzI5MjQyMDZaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Njc5MDY2Mjg1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEJURiBTdHJ1Y3QgT3duZXJzaGlwIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoIGFuZCBpdHMgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gSXQgbG9va3MgbGlrZSB3ZSdyZSBjaGFuZ2luZyBob3cgd2UgdmFsaWRhdGUgdGhlIG93bmVyc2hpcCBsb2dpYyB3aXRoaW4gdGhlIEJURiBzdHJ1Y3R1cmUuIFByZXZpb3VzbHksIHRoZSBzeXN0ZW0gd2FzIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGEgbm9kZSB3YXMgYWxzbyBhIHJvb3QgaW4gdGhlIGdyYXBoIHN0cnVjdHVyZSwgd2Ugd2VyZW4ndCBpbnRyb2R1Y2luZyBjeWNsZXMsIGVzcGVjaWFsbHkgd2l0aGluIGBicGZfbGlzdF9oZWFkYCBhbmQgYGJwZl9yYl9yb290YC4gVGhlIG9sZCBtZXRob2Qgd2FzIHRvIGNoZWNrIGBtZXRhLVx1MDAzZXJlY29yZC1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfUk9PVGAuIFRoZSBuZXcgYXBwcm9hY2ggYnJpbmdzIGluIGEgcmVjdXJzaW9uIGRlcHRoIGNoZWNrIGZvciBvd25lcnNoaXAuXG5cbkVzc2VudGlhbGx5LCB0aGV5J3JlIGludHJvZHVjaW5nIGEgbGltaXQsIGBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSGAgKHNldCB0byA4LCB3aGljaCBzZWVtcyByZWFzb25hYmxlKSwgdG8gcHJldmVudCBpc3N1ZXMgbGlrZSBrZXJuZWwgc3RhY2sgb3ZlcmZsb3cgb3IgZXhjZXNzaXZlbHkgbG9uZyByZWN1cnNpb24gZHVyaW5nIHRoZSBgYnBmX29ial9mcmVlX2ZpZWxkcygpYCBvciBgX19icGZfb2JqX2Ryb3BfaW1wbCgpYCBwcm9jZXNzZXMuIFRoZSBwYXRjaCBub3cgYWxzbyBjaGVja3MgZm9yIG93bmVyc2hpcCBjeWNsZXMgaW52b2x2aW5nIGBCUEZfR1JBUEhfUk9PVGAsIGBCUEZfS1BUUl9SRUZgLCBhbmQgYEJQRl9LUFRSX1BFUkNQVWAuIFRoaXMgc2VlbXMgbGlrZSBhIGdvb2QgcHJvYWN0aXZlIG1lYXN1cmUuXG5cbk5vdywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCwgdmFyaWFibGVzLCBwb2ludGVycywgYW5kIHVzZXItc3BhY2UgY29waWVzIGludm9sdmVkLlxuXG5GaXJzdCwgd2UgaGF2ZSB0aGlzIGFsbG9jYXRpb246IGBkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtgLiBga3ZjYWxsb2NgIGlzIGFsbG9jYXRpbmcgemVyb2VkIG1lbW9yeS4gV2UncmUgYWxsb2NhdGluZyBgdGFiLVx1MDAzZWNudGAgZWxlbWVudHMsIGVhY2ggYHNpemVvZih1OClgIGluIHNpemUuIFllcywgYGt2Y2FsbG9jYCBndWFyYW50ZWVzIHRoYXQgYGRlcHRoYCBpcyBmdWxseSB6ZXJvLWluaXRpYWxpemVkLiBJbXBvcnRhbnRseSwgaXQncyBmcmVlZCBsYXRlciB3aXRoIGBrdmZyZWUoZGVwdGgpYC4gQWx3YXlzIGdvb2QgdG8gc2VlIHRoYXQgcGFpcmVkIHVwLlxuXG5XZSBoYXZlIHRvIGNvbnNpZGVyIGFycmF5IGJvdW5kcyBmb3IgdGhpcyBhbGxvY2F0aW9uLCBlc3BlY2lhbGx5IGFzIGBkZXB0aGAgaXMgaW5kZXhlZCBhcyBgZGVwdGhbaWR4XWAuXG5gaWR4YCBvcmlnaW5hdGVzIGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCB3aGVyZSB3ZSBoYXZlIHRoZSBsb29wOiBgZm9yIChpID0gMDsgaSBcdTAwM2MgdGFiLVx1MDAzZWNudDsgaSsrKSB7IC4uLiBidGZfb3duZXJzaGlwX2RlcHRoKC4uLiwgaSwgLi4uKTsgfWAuXG5JbnNpZGUgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgOiBgcmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcdTAwMjZyZWMtXHUwMDNlZmllbGRzW2ldKTtgIHRoZW4gd2UgY2FsbDogYHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtgLiBBbmQgdGhlbiB3aXRoaW4gYGJ0Zl9vd25lZF90eXBlX2lkeGAgd2UgaGF2ZSB0aGlzOlxuYGBgY1xuXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuXHRpZiAoIW1ldGEpXG5cdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG5cdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuYGBgXG5JdCBsb29rcyBsaWtlIGBtZXRhYCBjb21lcyBmcm9tIGBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZClgLiBXZSdsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayBob3cgdGhpcyB3b3Jrcy5cbmBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIEknbGwgaGF2ZSB0byBpbnZlc3RpZ2F0ZSB0aGF0IGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBvZmZzZXRzIGFuZCBpbmRleGluZyBhcmUgc2FmZSBhbmQgZG9uJ3QgaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM1MTAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NDQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo1Ni43NjM1ODk0MTZaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ5Njg0OTQyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9maW5kX3N0cnVjdF9tZXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvYnRmLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9idGYuYz00MjgzPWludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQzMTYtXFx0XFx0YnRmX2lkID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxua2VybmVsL2JwZi9idGYuYzo0MzE3OlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxua2VybmVsL2JwZi9idGYuYy00MzE4LVxcdFxcdGlmICghbWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NDMyNT1zdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNDAtXFxua2VybmVsL2JwZi9idGYuYzo0MzQxOlxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxua2VybmVsL2JwZi9idGYuYy00MzQyLVxcdGlmICghbWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTg0ND1idGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0ZilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNTk2NC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NjU6c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxcbmtlcm5lbC9icGYvYnRmLmMtNTk2Ni17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTc0NDg9aW50IGJ0Zl9zdHJ1Y3RfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjQtXFxua2VybmVsL2JwZi9idGYuYzo3NDY1OlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGlkKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjYtXFx0XFx0aWYgKCFtZXRhKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo1Ni44MTMyODU1NzhaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NDk1NzYyNzQ5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgdGhvdWdoIEkgd2VyZSBjb25zaWRlcmluZyB0aGUgYGJ0Zl9maW5kX3N0cnVjdF9tZXRhYCBpbXBsZW1lbnRhdGlvbiwga2VlcGluZyBpbiBtaW5kIEknbSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZC5cblxuKipEZWVwIERpdmUgaW50byBgYnRmX2ZpbmRfc3RydWN0X21ldGFgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiBgYnRmX2ZpbmRfc3RydWN0X21ldGFgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGlzIGZ1bmN0aW9uIHdvcmtzLiBJdCdzIGNydWNpYWwgZm9yIGVmZmljaWVudGx5IG5hdmlnYXRpbmcgYW5kIGludGVycHJldGluZyBCVEYgaW5mb3JtYXRpb24sIGFuZCBJIHdhbnQgdG8gYmUgY2VydGFpbiBhYm91dCB0aGUgZWRnZSBjYXNlcyBhbmQgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBJJ20gYXNzdW1pbmcsIG9mIGNvdXJzZSwgdGhhdCB3ZSdyZSB0YWxraW5nIGFib3V0IGEgd2VsbC1mb3JtZWQgQlRGIGRhdGEgc3RydWN0dXJlIOKAkyBidXQgaXQncyBhbHdheXMgZ29vZCB0byBjb25zaWRlciBlcnJvciBoYW5kbGluZyBpbXBsaWNpdGx5LlxuXG5NeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIHZhcmlvdXMgYXNwZWN0cy4gV2hhdCBhcmUgdGhlIGtleSBzZWFyY2ggcGFyYW1ldGVycz8gSXMgaXQgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCwgdGhlIHNpemUsIHRoZSBtZW1iZXIgbGF5b3V0LCBvciBzb21lIGNvbWJpbmF0aW9uIHRoZXJlb2Y/IEkgbmVlZCB0byBsb29rIGZvciBhbnkgb3B0aW1pemF0aW9ucyBlbXBsb3llZCBoZXJlLiBBcmUgdGhlcmUgYW55IGNhY2hpbmcgbWVjaGFuaXNtcyB0byBzcGVlZCB1cCByZXBlYXRlZCBsb29rdXBzPyBJcyBpdCB1c2luZyBhIGhhc2ggdGFibGUsIGxpbmVhciBzZWFyY2gsIG9yIHNvbWUgb3RoZXIgbWV0aG9kIGZvciBmaW5kaW5nIHRoZSBjb3JyZWN0IHN0cnVjdCBkZWZpbml0aW9uPyBJIHdhbnQgdG8gc2VlIGlmIHRoZSBjaG9zZW4gYWxnb3JpdGhtIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgZXhwZWN0ZWQgc2l6ZSBhbmQgY29tcGxleGl0eSBvZiB0aGUgQlRGIGRhdGEuXG5cbkknbGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucy4gRG9lcyBpdCB0cmF2ZXJzZSB0aGUgQlRGIHNlY3Rpb24gbGluZWFybHksIG9yIGRvZXMgaXQganVtcCBhcm91bmQ/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIGNhY2hlIG1pc3NlcyB0aGF0IGNvdWxkIGltcGFjdCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSB3aXRoIGxhcmdlIEJURiBibG9icz8gQW5kIGhvdyBkb2VzIGl0IGhhbmRsZSBuZXN0ZWQgc3RydWN0cyBhbmQgYW5vbnltb3VzIHVuaW9ucz8gVGhhdCdzIGFsd2F5cyBhIHRyaWNreSBhcmVhLCBhbmQgSSBleHBlY3QgdGhlcmUgaXMgYSB3ZWxsIHRob3VnaHQtb3V0IHRyYXZlcnNhbCBzdHJhdGVneSB0aGVyZS5cblxuSSdsbCBhbHNvIGtlZXAgaW4gbWluZCB0aGUgcG90ZW50aWFsIGZvciBjb3JuZXIgY2FzZXMuIFdoYXQgaGFwcGVucyBpZiB0aGUgc3RydWN0IGlzbid0IGZvdW5kPyBEb2VzIGl0IHJldHVybiBhbiBlcnJvciBjb2RlLCBgTlVMTGAsIG9yIHNvbWV0aGluZyBlbHNlPyBEb2VzIGl0IGhhdmUgYW55IGltcGxpY2F0aW9ucyBmb3Igd2hhdCBoYXBwZW5zIGluIHRoZSBjYWxsZXI/IEknbSBjdXJpb3VzIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBCVEYgdHlwZSBJRHMsIGFuZCBob3cgaXQgaGFuZGxlcyBkdXBsaWNhdGUgc3RydWN0IGRlZmluaXRpb25zLCBpZiBhdCBhbGwuXG5cbkZpbmFsbHksIEknbGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IGZ1dHVyZSBzY2FsYWJpbGl0eS4gSXMgdGhlIGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIHRvIGhhbmRsZSB2ZXJ5IGxhcmdlIEJURiBkYXRhYmFzZXM/IERvZXMgaXQgYWxsb3cgZm9yIGluY3JlbWVudGFsIHVwZGF0ZXMgb3IgcGFydGlhbCBCVEYgbG9hZGluZz8gVGhlc2UgYXJlIGNydWNpYWwgYXNwZWN0cyB0byBjb25zaWRlciBmb3IgbG9uZy10ZXJtIG1haW50YWluYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UuIFRoZSBtb3JlIEkgdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uLCB0aGUgbW9yZSBjb25maWRlbmNlIEknbGwgaGF2ZSBpbiB0aGUgc3RhYmlsaXR5IG9mIHRoZSBvdmVyYWxsIGZyYW1ld29yay4gTGV0J3Mgc2VlIGhvdyBpdCdzIGRvbmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MjczLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDk6MDEuNzcwOTE1MzkyWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMyOTE2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU5NjAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU5NjA6XFx0ZnJlZV9hb2Y6XFxuNTk2MTpcXHRcXHRrZnJlZShhb2YpO1xcbjU5NjI6XFx0XFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcXG41OTYzOlxcdH1cXG41OTY0OlxcdFxcbjU5NjU6XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxcbjU5NjY6XFx0e1xcbjU5Njc6XFx0XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYjtcXG41OTY4OlxcdFxcbjU5Njk6XFx0XFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBidGZfc3RydWN0X21ldGEsIGJ0Zl9pZCkgIT0gMCk7XFxuNTk3MDpcXHRcXHR0YWIgPSBidGYtXFx1MDAzZXN0cnVjdF9tZXRhX3RhYjtcXG41OTcxOlxcdFxcdGlmICghdGFiKVxcbjU5NzI6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuNTk3MzpcXHRcXHRyZXR1cm4gYnNlYXJjaChcXHUwMDI2YnRmX2lkLCB0YWItXFx1MDAzZXR5cGVzLCB0YWItXFx1MDAzZWNudCwgc2l6ZW9mKHRhYi1cXHUwMDNldHlwZXNbMF0pLCBidGZfaWRfY21wX2Z1bmMpO1xcbjU5NzQ6XFx0fVxcbjU5NzU6XFx0XFxuNTk3NjpcXHRzdGF0aWMgaW50IGJ0Zl9jaGVja19tb2RpZmllcl9jaGFpbl9sZW5ndGgoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudixcXG41OTc3OlxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBidGYgKmJ0ZiwgaW50IHN0YXJ0X2lkKVxcbjU5Nzg6XFx0e1xcbjU5Nzk6XFx0XFx0aW50IGksIG4sIGdvb2RfaWQgPSBzdGFydF9pZCAtIDE7XFxuNTk4MDpcXHRcXG41OTgxOlxcdFxcdG4gPSBidGZfbnJfdHlwZXMoYnRmKTtcXG41OTgyOlxcdFxcdGZvciAoaSA9IHN0YXJ0X2lkOyBpIFxcdTAwM2MgbjsgaSsrKSB7XFxuNTk4MzpcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQ7XFxuNTk4NDpcXHRcXHRcXHRpbnQgY2hhaW5fbGltaXQgPSAzMjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDk6MDEuNzcxMjQ3MDcyWiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY5MzkxNzkzMTYxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBCVEYgT3duZXJzaGlwIERlcHRoIENoZWNrIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGhlcmUgaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgZXhwb3NlcyBhbnkgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBiZSByZWFkLCB3aGljaCBjb3VsZCBsZWFkIHRvIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gSSdtIGdvaW5nIHRvIGZvbGxvdyB0aGUgZXN0YWJsaXNoZWQgY3JpdGVyaWEgZm9yIEtNU0FOIGFuYWx5c2lzLlxuXG5GaXJzdCwgSSBleGFtaW5lIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGJpbmFyeSBzZWFyY2ggd2l0aGluIHRoZSBgYnRmLVx1MDAzZXN0cnVjdF9tZXRhX3RhYi1cdTAwM2V0eXBlc2AgYXJyYXkuIElmIHRoZSBzZWFyY2ggaXMgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZvdW5kIG1ldGFkYXRhLCBgbWV0YWAuIFRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCBpcyB0aGVuIGNhbGN1bGF0ZWQgYXMgYG1ldGEgLSB0YWItXHUwMDNldHlwZXNgLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSwgc3BlY2lmaWNhbGx5IGAwYCB0byBgdGFiLVx1MDAzZWNudCAtIDFgLiBJZiB0aGUgc2VhcmNoIGZhaWxzLCBpdCByZXR1cm5zIGBOVUxMYC5cblxuTm93LCBsb29raW5nIGF0IGBidGZfb3duZWRfdHlwZV9pZHhgLiBJdCBjYWxscyBgYnRmX2ZpbmRfc3RydWN0X21ldGFgLCBhbmQgaWYgYSB2YWxpZCBgbWV0YWAgaXMgZm91bmQsIHRoZSBpbmRleCBjYWxjdWxhdGlvbiBgbWV0YSAtIHRhYi1cdTAwM2V0eXBlc2AgZ2l2ZXMgdXMgdGhlIGluZGV4LCBhbmQgYSBjaGVjayBpcyBwZXJmb3JtZWQgdG8gdmVyaWZ5IHRoZSByb290LiBJZiBgYnRmX2ZpbmRfc3RydWN0X21ldGFgIHJldHVybnMgYE5VTExgLCB0aGVuIHdlIGNoZWNrIHRoZSByb290IGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZSwgd2hpY2ggZG9lcyBub3QgaW50cm9kdWNlIGEgcmlzay4gVGhlcmVmb3JlLCBpdCBpcyBpbXBvcnRhbnQgdG8gcG9pbnQgb3V0IHRoYXQgYHRhYmAgaXMgYW4gYXJndW1lbnQsIHdoaWNoIGluIG91ciBjb250ZXh0IGlzIGBzdHJ1Y3RfbWV0YV90YWJgLiBUaGVyZWZvcmUsIHRoZSByZXR1cm5lZCBpbmRleCBpcyB3aXRoaW4gYm91bmRzIChpLmUuLCBgMGAgdG8gYHRhYi1cdTAwM2VjbnQgLSAxYCkuXG5cbk15IGFuYWx5c2lzIGlzIGd1aWRlZCBieSB0aGVzZSBwb3RlbnRpYWwgcmlza3M6XG5cbjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZToqKiBBcmUgYW55IGtlcm5lbCBzdHJ1Y3R1cmVzIGJlaW5nIHBhc3NlZCBiYWNrIHRvIHVzZXIgc3BhY2U/IE5vLCBub3QgaW4gdGhpcyBwYXRjaC4gVGhlIGZ1bmN0aW9ucyBgYnRmX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCBhcmUgaW50ZXJuYWwgdmVyaWZpY2F0aW9uIGZ1bmN0aW9ucyBhbmQgb25seSByZXR1cm4gYW4gZXJyb3IgY29kZSBvciBCVEYgZmQuIFRoaXMgZWxpbWluYXRlcyB0aGUgcG9zc2liaWxpdHkgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkLlxuXG4yLiAgKipDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzOioqIEkgY2FyZWZ1bGx5IGV4YW1pbmVkIHRoZSBsb2NhbCB2YXJpYWJsZXMuIEluIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYWxsIHZhcmlhYmxlcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIGluY2x1ZGluZyBgbWF4X2RlcHRoYCwgYGlgLCBhbmQgYHJldGAuIENyaXRpY2FsbHksIHRoZSBgZGVwdGhgIGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIGBrdmNhbGxvY2AsIHdoaWNoIGVuc3VyZXMgYWxsIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvLiBJbiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIHRoZSBgcmV0YCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCB0byBgMGAuIGBidGZfaWRgIGlzIGFzc2lnbmVkIGluIGJvdGggYnJhbmNoZXMgb2YgdGhlIGBidGZfb3duZWRfdHlwZV9pZHhgIGZ1bmN0aW9uIHdoZXJlIGNvbnRyb2wgZG9lcyBub3QgcmV0dXJuLlxuXG4zLiAgKipBbGxvY2F0aW9uL0luaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzOioqIFRoZSBgZGVwdGhgIGFycmF5LCB3aGljaCBpcyBjcml0aWNhbCB0byB0aGlzIGNoZWNrLCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jYC4gVGhpcyBndWFyYW50ZWVzIHRoYXQgYWxsIGl0cyBlbGVtZW50cyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4gSSBkaWQgdmVyaWZ5IHRoYXQgYGRlcHRoYCBpcyBwcm9wZXJseSBmcmVlZCB2aWEgYGt2ZnJlZWAgd2l0aGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYC5cblxuNC4gICoqQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgYWxsb3dpbmcgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgYnVmZmVyIGJ5dGVzOioqIFRoZSBmb2N1cyBvZiB0aGlzIHBhdGNoIGlzIGltcHJvdmluZyBCVEYgb3duZXJzaGlwIHZhbGlkYXRpb24sIHNwZWNpZmljYWxseSBwcmV2ZW50aW5nIGN5Y2xpY2FsIG9yIGV4Y2Vzc2l2ZWx5IGRlZXAgb3duZXJzaGlwIHN0cnVjdHVyZXMuIFRoZSBjb2RlIGRvZXMgbm90IG1vZGlmeSBhbnkgYnVmZmVyIHJlYWRzIG9yIGNvcGllcy4gVGhlIGluZGV4IGBpZHhgIHBhc3NlZCB0byBgZGVwdGhbaWR4XWAgaXMgY2FsY3VsYXRlZCB2aWEgYG1ldGEgLSB0YWItXHUwMDNldHlwZXNgIGZyb20gYSBzdWNjZXNzZnVsIGJpbmFyeSBzZWFyY2guIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBlbGVtZW50IGlzIHZhbGlkIGFuZCBpbml0aWFsaXplZCwgYW5kIHRoZXJlZm9yZSBpdCBpcyBhbHdheXMgd2l0aGluIHRoZSB2YWxpZCBib3VuZHMuXG5cbkkgcmUtY2hlY2tlZCB0aGUgZXN0YWJsaXNoZWQgS01TQU4gcnVsZXM6IFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgcmVjdXJzaW9uIGRlcHRoIGNoZWNrIGZvciBCVEYgc3RydWN0IG93bmVyc2hpcCwgdXRpbGl6ZXMgemVyb2VkIG1lbW9yeSBmcm9tIGBrdmNhbGxvY2AsIGFuZCB3b3JrcyBzb2xlbHkgb24gaW5pdGlhbGl6ZWQgdmVyaWZpZXIgbWV0YWRhdGEuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbGwgcG90ZW50aWFsIHJpc2tzIChlLmcuLCBvdXQtb2YtYm91bmRzIGFycmF5IGFjY2VzcyBpbiBgZGVwdGhbaWR4XWAsIGluZmluaXRlIHJlY3Vyc2lvbiwgb3IgbWVtb3J5IGxlYWtzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLiBUaGlzIHBhdGNoIGNsZWFybHkgYWxpZ25zIHdpdGggdGhlIGNyaXRlcmlhIGZvciBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYC4gVGhlcmVmb3JlLCBJIGFtIHJlYWR5IHRvIGZvcm11bGF0ZSB0aGUgZmluYWwgcmVzdWx0IGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MjYwLCJPdXRwdXRUb2tlbnMiOjI4NCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3NjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNzowMDozNS42ODkxODIzMDRaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTE5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cXG5cXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXFxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxcbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxcblxcblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cXG5cXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXFxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxcbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxcblxcblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-14 16:26:49 +0000 UTC FinishedAt: 2026-09-14 17:00:36 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "a41c69c6ea14596cfd95978483166d4eff52435e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "a41c69c6ea14596cfd95978483166d4eff52435e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "4bc44d71-b488-4779-9276-5bae55679d77" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "btf_check_ownership_depth", "btf_ownership_depth", "btf_owned_type_idx", "btf_check_and_fixup_fields", "bpf_btf_load" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "a41c69c6ea14596cfd95978483166d4eff52435e", "base_tree": "bpf-next" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MzJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2J0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZWRfdHlwZV9pZHgmIzM0OywKICAgICYjMzQ7YnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMmIzM0OywKICAgICYjMzQ7YnBmX2J0Zl9sb2FkJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBkZXB0aCBhbmQgZGV0ZWN0IGN5Y2xlcyBhY3Jvc3MgZ3JhcGggcm9vdHMgKGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290KSBhbmQgbG9jYWwga3B0cnMgKEJQRl9LUFRSX1JFRiwgQlBGX0tQVFJfUEVSQ1BVKSwgcHJldmVudGluZyBkZWVwIGtlcm5lbCByZWN1cnNpb24gZHVyaW5nIG9iamVjdCBjbGVhbnVwLlxuXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXG4yLiBMb2NhbCB2YXJpYWJsZXMgYW5kIGZpZWxkczogQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0IGZpZWxkcyBpbnNwZWN0ZWQgb3IgcG9wdWxhdGVkIChgcmV0YCwgYG1heF9kZXB0aGAsIGBidGZfaWRgLCBgZGVwdGhbaWR4XWApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBVc2VyLXNwYWNlIGNvcGllczogTm8gZGF0YSBvciBzdHJ1Y3R1cmUgaXMgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZTsgdGhlIHZhbGlkYXRpb24gcmV0dXJucyBzdGFuZGFyZCBlcnJvciBjb2Rlcy5cbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBleHRlbmRzIEJURiBvd25lcnNoaXAgYW5kIGN5Y2xlIHZhbGlkYXRpb24gYnkgaW50cm9kdWNpbmcgZGVwdGgtYm91bmRlZCBncmFwaCB0cmF2ZXJzYWwgKGJ0Zl9vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgpIHRvIHZhbGlkYXRlIG93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGluIHVzZXItbG9hZGVkIEJURiB0eXBlcyAoc3VjaCBhcyBncmFwaCByb290cyBhbmQga3B0cnMpLiBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBpcyBkaXJlY3RseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBicGYoKSBzeXNjYWxsIChCUEZfQlRGX0xPQUQpLiBGdXp6aW5nIGNhbiB2ZXJpZnkgcmVjdXJzaW9uIGJvdW5kcywgY3ljbGUgZGV0ZWN0aW9uIGNvcnJlY3RuZXNzLCBhbmQgZWRnZSBjYXNlcyBpbiBwYXJzaW5nIGFyYml0cmFyeSB1c2VyLXN1cHBsaWVkIEJURiBkYXRhLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZjU4NDUyNWY5OTYwMGY2ZjdhZDdiZGI4OWJlYWVjYzVmYjQ4ZGY4MVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDE2OjI4OjMyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTQyODQsMTMgJiM0Mzs0Mjg0LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4ge1xuIFx0aW50IGk7XG4gXG4tXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XG4tXHQgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LlxuLVx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJiMzOTt0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG4mIzQzO1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuJiM0MztcdCAqIGJlZW4gZml4ZWQgdXAuXG4gXHQgKi9cbiBcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXG4gXHRcdHJldHVybiAwO1xuQEAgLTQzMjEsNTEgJiM0Mzs0MzE4LDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGlmICghbWV0YSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxuLVx0XHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbiYjNDM7XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuJiM0MztcdHUzMiBidGZfaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuJiM0MztcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG4mIzQzO1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuJiM0MztcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG4mIzQzO1x0aWYgKCFtZXRhKVxuJiM0MztcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG4mIzQzO1x0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuJiM0MzsgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuJiM0MzsgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuJiM0MzsgKiBub24tcmVjdXJzaW5nIGRyb3AuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4mIzQzO1x0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4mIzQzO1x0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFkZXB0aF9sZWZ0KVxuJiM0MztcdFx0cmV0dXJuIC1FTE9PUDtcbiYjNDM7XHRpZiAoZGVwdGhbaWR4XSlcbiYjNDM7XHRcdGdvdG8gZG9uZTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG4mIzQzO1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4mIzQzO1x0fVxuJiM0MztcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbiYjNDM7ZG9uZTpcbiYjNDM7XHRyZXR1cm4gZGVwdGhbaWR4XSBcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XG4mIzQzO31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxuLVx0XHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0c1xuLVx0XHQgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eTpcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcFxuLVx0XHQgKiBjaGFpbiBjYW4gYmU6XG4tXHRcdCAqXHRBIC1cdTAwM2UgQiAtXHUwMDNlIENcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC5cbi1cdFx0ICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmRcbi1cdFx0ICogICBicGZfbGlzdF9oZWFkLlxuLVx0XHQgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlXG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHlcbi1cdFx0ICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd25cbi1cdFx0ICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy5cbi1cdFx0ICpcdEEgLVx1MDAzZSBCXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxuLVx0XHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKG1ldGEtXHUwMDNlcmVjb3JkLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxuLVx0XHRcdHJldHVybiAtRUxPT1A7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuJiM0Mzt7XG4mIzQzO1x0dTggKmRlcHRoO1xuJiM0MztcdGludCBpLCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbiYjNDM7XHRpZiAoIWRlcHRoKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbiYjNDM7XHRcdFx0XHRcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRyZXQgPSAwO1xuIFx0fVxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0a3ZmcmVlKGRlcHRoKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbkBAIC02MDYwLDYgJiM0Mzs2MDk0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG4mIzQzO1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyAmIzQzOzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgJiM0Mzs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYTQ4N2FhNjhmMmVlZlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCAmIzQzOzEsMjk2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU1BJTl9MT0NLIDJcbiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgM1xuJiM0MzsjZGVmaW5lIExJU1RfTk9ERSA0XG4mIzQzOy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOFxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkO1xuJiM0MztcbiYjNDM7XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2J0Zl9fbmV3X2VtcHR5XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdGlkID0gYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7aW50XCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEsIFwmIzM0O2J0Zl9fYWRkX2ludFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfc3Bpbl9sb2NrXCYjMzQ7LCA0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfbGlzdF9oZWFkXCYjMzQ7LCAxNik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7YnBmX2xpc3Rfbm9kZVwmIzM0OywgMjQpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyX291dDtcbiYjNDM7XHRyZXR1cm4gYnRmO1xuJiM0MztcbiYjNDM7ZXJyX291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaWQ7XG4mIzQzO1xuJiM0MztcdGlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF90eXBlX3RhZ1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gaWQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4mIzQzO1x0QVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF9wdHJcJiMzNDspO1xuJiM0MztcdHJldHVybiBpZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XG4mIzQzO1x0aWYgKGlkIFx1MDAzYz0gMClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7c2VsZl9jeWNsZVwmIzM0OywgOCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bmV4dFwmIzM0OywgNiwgMCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksIFwmIzM0O2twdHJcJiMzNDspO1xuJiM0MztcdGlmIChpZCBcdTAwM2M9IDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2FcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwmIzM0O2JcJiMzNDssIDYsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2JcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDthXCYjMzQ7LCA4LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkLCBlcnI7XG4mIzQzO1xuJiM0MztcdGJ0ZiA9IGluaXRfYnRmKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7aW5pdF9idGZcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9vd25lclwmIzM0OywgMjApO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtyb290XCYjMzQ7LCBMSVNUX0hFQUQsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtsb2NrXCYjMzQ7LCBTUElOX0xPQ0ssIDEyOCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXCYjMzQ7Y29udGFpbnM6bWl4ZWRfbm9kZTpub2RlXCYjMzQ7LCA3LCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXCYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9ub2RlXCYjMzQ7LCAzMik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bm9kZVwmIzM0OywgTElTVF9OT0RFLCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtvd25lclwmIzM0OywgNiwgMTkyLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgYm9vbCBjaGlsZF9maXJzdCwgYm9vbCBzaGFyZWRfc3VmZml4LCBpbnQgZXhwZWN0ZWRfZXJyKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICYjNDM7IDFdO1xuJiM0MztcdGludCBmaXJzdF9zdHJ1Y3RfaWQ7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmO1xuJiM0MztcdGludCBpZCwgZXJyLCBpLCBuLCBwb2ludGVlX2lkO1xuJiM0MztcbiYjNDM7XHRidGYgPSBpbml0X2J0ZigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2luaXRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRmaXJzdF9zdHJ1Y3RfaWQgPSA1ICYjNDM7IDIgKiBkZXB0aDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChpID09IGRlcHRoIC0gMSlcbiYjNDM7XHRcdFx0cG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aDtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0cG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCAmIzQzOyAoY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDIgLSBpIDogaSAmIzQzOyAxKTtcbiYjNDM7XHRcdHB0cl9pZFtpXSA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgcG9pbnRlZV9pZCwgXCYjMzQ7a3B0clwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAocHRyX2lkW2ldIFx1MDAzYz0gMClcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAobiA9IDA7IG4gXHUwMDNjIGRlcHRoOyBuJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y2hhciBuYW1lWzMyXTtcbiYjNDM7XHRcdGludCBvZmZzZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdGkgPSBjaGlsZF9maXJzdCA/IGRlcHRoIC0gMSAtIG4gOiBuO1xuJiM0MztcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtvd25lcl8lZFwmIzM0OywgaSk7XG4mIzQzO1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggXHUwMDI2XHUwMDI2ICFpID8gMTYgOiA4KTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgbiwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IG93bmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpZiAoc2hhcmVkX3N1ZmZpeCBcdTAwMjZcdTAwMjYgIWkpIHtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogVmlzaXQgdGhlIHNoYXJlZCBzdWZmaXggdGhyb3VnaCB0aGUgc2hvcnRlciBwYXRoIGJlZm9yZVxuJiM0MztcdFx0XHQgKiByZWFjaGluZyBpdCBhZ2FpbiB3aXRoIGxlc3MgcmVtYWluaW5nIGRlcHRoLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtzdWZmaXhcJiMzNDssIHB0cl9pZFsxXSwgMCwgMCk7XG4mIzQzO1x0XHRcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgb3duZXI6OnN1ZmZpeFwmIzM0OykpXG4mIzQzO1x0XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRcdG9mZnNldCA9IDY0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtuZXh0XCYjMzQ7LCBwdHJfaWRbaV0sIG9mZnNldCwgMCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7cGxhaW5fbGVhZlwmIzM0OywgNCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dyYXBoX2RlcHRoKGJvb2wgcmJ0cmVlLCBpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcm9vdF90eXBlID0gTElTVF9IRUFELCBub2RlX3R5cGUgPSBMSVNUX05PREUsIG5vZGVfc2l6ZSA9IDI0O1xuJiM0MztcdGludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmO1xuJiM0MztcbiYjNDM7XHRidGYgPSBpbml0X2J0ZigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2luaXRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAocmJ0cmVlKSB7XG4mIzQzO1x0XHRyb290X3R5cGUgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfcmJfcm9vdFwmIzM0OywgMTYpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR1Qocm9vdF90eXBlLCAwLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX3Jvb3RcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2JwZl9yYl9ub2RlXCYjMzQ7LCAzMik7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9HVChub2RlX3R5cGUsIDAsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfcmJfbm9kZVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0bm9kZV9zaXplID0gMzI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNoYXIgbmFtZVszMl0sIHRhZ1s2NF07XG4mIzQzO1xuJiM0MztcdFx0bG9ja19vZmYgPSBpID8gbm9kZV9zaXplIDogMDtcbiYjNDM7XHRcdHJvb3Rfb2ZmID0gbG9ja19vZmYgJiM0MzsgODtcbiYjNDM7XHRcdHNpemUgPSBpID09IGRlcHRoIC0gMSA/IG5vZGVfc2l6ZSA6IHJvb3Rfb2ZmICYjNDM7IDE2O1xuJiM0MztcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtncmFwaF9vd25lcl8lZFwmIzM0OywgaSk7XG4mIzQzO1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBncmFwaF9vd25lclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0aWYgKGkpIHtcbiYjNDM7XHRcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtub2RlXCYjMzQ7LCBub2RlX3R5cGUsIDAsIDApO1xuJiM0MztcdFx0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChpID09IGRlcHRoIC0gMSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwmIzM0O2xvY2tcJiMzNDssIFNQSU5fTE9DSywgbG9ja19vZmYgKiA4LCAwKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OmxvY2tcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7cm9vdFwmIzM0Oywgcm9vdF90eXBlLCByb290X29mZiAqIDgsIDApO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c25wcmludGYodGFnLCBzaXplb2YodGFnKSwgXCYjMzQ7Y29udGFpbnM6Z3JhcGhfb3duZXJfJWQ6bm9kZVwmIzM0OywgaSAmIzQzOyAxKTtcbiYjNDM7XHRcdGVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0dUKGVyciwgMCwgXCYjMzQ7YnRmX19hZGRfZGVjbF90YWcgZ3JhcGhfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfbG9jYWxfa3B0cl9vd25lcnNoaXAodm9pZClcbiYjNDM7e1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NlbGZfY3ljbGVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9zZWxmX2N5Y2xlKFwmIzM0O2twdHJcJiMzNDssIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dW50cnVzdGVkX3NlbGZfY3ljbGVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9zZWxmX2N5Y2xlKFwmIzM0O2twdHJfdW50cnVzdGVkXCYjMzQ7LCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwZXJjcHVfc2VsZl9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCYjMzQ7cGVyY3B1X2twdHJcJiMzNDssIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7QUJBX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfYWJhX2N5Y2xlKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X21peGVkX2N5Y2xlKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWF4X2FjeWNsaWNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIGZhbHNlLCBmYWxzZSwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dG9vX2RlZXBfYWN5Y2xpY1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCBmYWxzZSwgZmFsc2UsIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWF4X2FjeWNsaWNfY2hpbGRfZmlyc3RcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIHRydWUsIGZhbHNlLCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICYjNDM7IDEsIHRydWUsIGZhbHNlLCAtRUxPT1ApO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21heF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIGZhbHNlLCB0cnVlLCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgZmFsc2UsIHRydWUsIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bGlzdF90aHJlZV90eXBlc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCAzLCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtsaXN0X2ZvdXJfdHlwZXNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bGlzdF9tYXhfZGVwdGhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bGlzdF90b29fZGVlcFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRIICYjNDM7IDEsIC1FTE9PUCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmJ0cmVlX3RocmVlX3R5cGVzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgMywgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmJ0cmVlX2ZvdXJfdHlwZXNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCA0LCAwKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyYnRyZWVfbWF4X2RlcHRoXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmJ0cmVlX3Rvb19kZWVwXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2JwZl9idGZfbG9hZCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmNTg0NTI1Zjk5NjAwZjZmN2FkN2JkYjg5YmVhZWNjNWZiNDhkZjgxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgMTQgMTY6Mjg6MzIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuYwppbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2J0Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvYnRmLmMKQEAgLTQyODQsMTMgJiM0Mzs0Mjg0LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiB7CiAJaW50IGk7CiAKLQkvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6Ci0JICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC4KLQkgKiBrcHRyX3JlZiBvbmx5IHN1cHBvcnRzIHN0b3Jpbmcga2VybmVsIHR5cGVzLCB3aGljaCBjYW4mIzM5O3Qgc3RvcmUKLQkgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLgotCSAqCi0JICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcAotCSAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLgomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWUKJiM0MzsJICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhcwomIzQzOwkgKiBiZWVuIGZpeGVkIHVwLgogCSAqLwogCWlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLSZndDtmaWVsZF9tYXNrICZhbXA7IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpCiAJCXJldHVybiAwOwpAQCAtNDMyMSw1MSAmIzQzOzQzMTgsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIAkJaWYgKCFtZXRhKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJlYy0mZ3Q7ZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS0mZ3Q7cmVjb3JkOwomIzQzOwl9CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCQkvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZAotCQkgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhCi0JCSAqIG5vZGUgdHlwZS4KLQkJICovCi0JCWlmICghKHJlYy0mZ3Q7ZmllbGRfbWFzayAmYW1wOyBCUEZfR1JBUEhfTk9ERSkpCiYjNDM7c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLAomIzQzOwkJCSAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTsKJiM0MzsJdTMyIGJ0Zl9pZDsKJiM0MzsKJiM0MzsJaWYgKGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UKSB7CiYjNDM7CQlidGZfaWQgPSBmaWVsZC0mZ3Q7Z3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7CiYjNDM7CX0gZWxzZSBpZiAoZmllbGQtJmd0O3R5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLSZndDt0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkgewomIzQzOwkJaWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtJmd0O2twdHIuYnRmKSkKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCWJ0Zl9pZCA9IGZpZWxkLSZndDtrcHRyLmJ0Zl9pZDsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7CiYjNDM7CWlmICghbWV0YSkKJiM0MzsJCXJldHVybiBmaWVsZC0mZ3Q7dHlwZSAmYW1wOyBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UOwomIzQzOwlyZXR1cm4gbWV0YSAtIHRhYi0mZ3Q7dHlwZXM7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kCiYjNDM7ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3QKJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dAomIzQzOyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhCiYjNDM7ICogbm9uLXJlY3Vyc2luZyBkcm9wLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCwKJiM0MzsJCQkgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLSZndDt0eXBlc1tpZHhdLnJlY29yZDsKJiM0MzsJaW50IGksIHJldCwgbWF4X2RlcHRoID0gMDsKJiM0MzsKJiM0MzsJaWYgKCFkZXB0aF9sZWZ0KQomIzQzOwkJcmV0dXJuIC1FTE9PUDsKJiM0MzsJaWYgKGRlcHRoW2lkeF0pCiYjNDM7CQlnb3RvIGRvbmU7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyByZWMtJmd0O2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgJmFtcDtyZWMtJmd0O2ZpZWxkc1tpXSk7CiYjNDM7CQlpZiAocmV0ID09IC1FTk9FTlQpCiAJCQljb250aW51ZTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJbWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTsKJiM0MzsJfQomIzQzOwlkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7CiYjNDM7ZG9uZToKJiM0MzsJcmV0dXJuIGRlcHRoW2lkeF0gJmd0OyBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTsKJiM0Mzt9CiAKLQkJLyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGUKLQkJICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURgotCQkgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlCi0JCSAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZQotCQkgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOgotCQkgKgotCQkgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQKLQkJICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuCi0JCSAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYQotCQkgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0cwotCQkgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eToKLQkJICoKLQkJICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcAotCQkgKiBjaGFpbiBjYW4gYmU6Ci0JCSAqCUEgLSZndDsgQiAtJmd0OyBDCi0JCSAqIFdoZXJlOgotCQkgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuCi0JCSAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kCi0JCSAqICAgYnBmX2xpc3RfaGVhZC4KLQkJICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZQotCQkgKgotCQkgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5Ci0JCSAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duCi0JCSAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuCi0JCSAqCUEgLSZndDsgQgotCQkgKiBXaGVyZToKLQkJICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS4KLQkJICogLSBCIGlzIG9ubHkgYW4gbm9kZS4KLQkJICovCi0JCWlmIChtZXRhLSZndDtyZWNvcmQtJmd0O2ZpZWxkX21hc2sgJmFtcDsgQlBGX0dSQVBIX1JPT1QpCi0JCQlyZXR1cm4gLUVMT09QOwomIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJCSAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYikKJiM0Mzt7CiYjNDM7CXU4ICpkZXB0aDsKJiM0MzsJaW50IGksIHJldCA9IDA7CiYjNDM7CiYjNDM7CWRlcHRoID0ga3ZjYWxsb2ModGFiLSZndDtjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKJiM0MzsJaWYgKCFkZXB0aCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGFiLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSwKJiM0MzsJCQkJCSAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlyZXQgPSAwOwogCX0KLQlyZXR1cm4gMDsKJiM0MzsJa3ZmcmVlKGRlcHRoKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCkBAIC02MDYwLDYgJiM0Mzs2MDk0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLAogCQkJaWYgKGVyciAmbHQ7IDApCiAJCQkJZ290byBlcnJvdXRfbWV0YTsKIAkJfQomIzQzOwomIzQzOwkJZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7CiYjNDM7CQlpZiAoZXJyICZsdDsgMCkKJiM0MzsJCQlnb3RvIGVycm91dF9tZXRhOwogCX0KIAogCWVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgJmFtcDtlbnYtJmd0O2xvZyk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwppbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKQEAgLTcxNCw3ICYjNDM7NzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZCkKIAkJCWJyZWFrOwogCiAJCWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwotCQlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGVyciwgMCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiAJCWJ0Zl9fZnJlZShidGYpOwogCQlicmVhazsKIAl9CkBAIC03NzMsNyAmIzQzOzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpCiAJCQlicmVhazsKIAogCQllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKLQkJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShlcnIsIDAsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwogCQlidGZfX2ZyZWUoYnRmKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYTQ4N2FhNjhmMmVlZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKQEAgLTAsMCAmIzQzOzEsMjk2IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFNQSU5fTE9DSyAyCiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgMwomIzQzOyNkZWZpbmUgTElTVF9OT0RFIDQKJiM0MzsvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi8KJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX19uZXdfZW1wdHkmIzM0OykpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWQgPSBidGZfX2FkZF9pbnQoYnRmLCAmIzM0O2ludCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCAxLCAmIzM0O2J0Zl9fYWRkX2ludCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9zcGluX2xvY2smIzM0OywgNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBTUElOX0xPQ0ssICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2smIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfbGlzdF9oZWFkJiMzNDssIDE2KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9saXN0X25vZGUmIzM0OywgMjQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlyZXR1cm4gYnRmOwomIzQzOwomIzQzO2Vycl9vdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpCiYjNDM7ewomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF90eXBlX3RhZyYjMzQ7KSkKJiM0MzsJCXJldHVybiBpZDsKJiM0MzsJaWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7CiYjNDM7CUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF9wdHImIzM0Oyk7CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7c2VsZl9jeWNsZSYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDcsICYjMzQ7YnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25leHQmIzM0OywgNiwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgMTAsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2N5Y2xlX2EmIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA5LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtiJiMzNDssIDYsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7Y3ljbGVfYiYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDEwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDthJiMzNDssIDgsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7bWl4ZWRfb3duZXImIzM0OywgMjApOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgNywgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O3Jvb3QmIzM0OywgTElTVF9IRUFELCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtsb2NrJiMzNDssIFNQSU5fTE9DSywgMTI4LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCAmIzM0O2NvbnRhaW5zOm1peGVkX25vZGU6bm9kZSYjMzQ7LCA3LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDgsICYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O21peGVkX25vZGUmIzM0OywgMzIpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bm9kZSYjMzQ7LCBMSVNUX05PREUsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7b3duZXImIzM0OywgNiwgMTkyLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGJvb2wgY2hpbGRfZmlyc3QsIGJvb2wgc2hhcmVkX3N1ZmZpeCwgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CWludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxXTsKJiM0MzsJaW50IGZpcnN0X3N0cnVjdF9pZDsKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVyciwgaSwgbiwgcG9pbnRlZV9pZDsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJZmlyc3Rfc3RydWN0X2lkID0gNSAmIzQzOyAyICogZGVwdGg7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChpID09IGRlcHRoIC0gMSkKJiM0MzsJCQlwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoOwomIzQzOwkJZWxzZQomIzQzOwkJCXBvaW50ZWVfaWQgPSBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgKGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAyIC0gaSA6IGkgJiM0MzsgMSk7CiYjNDM7CQlwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIHBvaW50ZWVfaWQsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJCWlmIChwdHJfaWRbaV0gJmx0Oz0gMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKG4gPSAwOyBuICZsdDsgZGVwdGg7IG4mIzQzOyYjNDM7KSB7CiYjNDM7CQljaGFyIG5hbWVbMzJdOwomIzQzOwkJaW50IG9mZnNldCA9IDA7CiYjNDM7CiYjNDM7CQlpID0gY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDEgLSBuIDogbjsKJiM0MzsJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgJiMzNDtvd25lcl8lZCYjMzQ7LCBpKTsKJiM0MzsJCWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgbmFtZSwgc2hhcmVkX3N1ZmZpeCAmYW1wOyZhbXA7ICFpID8gMTYgOiA4KTsKJiM0MzsJCWlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgbiwgJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgb3duZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZiAoc2hhcmVkX3N1ZmZpeCAmYW1wOyZhbXA7ICFpKSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBWaXNpdCB0aGUgc2hhcmVkIHN1ZmZpeCB0aHJvdWdoIHRoZSBzaG9ydGVyIHBhdGggYmVmb3JlCiYjNDM7CQkJICogcmVhY2hpbmcgaXQgYWdhaW4gd2l0aCBsZXNzIHJlbWFpbmluZyBkZXB0aC4KJiM0MzsJCQkgKi8KJiM0MzsJCQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7c3VmZml4JiMzNDssIHB0cl9pZFsxXSwgMCwgMCk7CiYjNDM7CQkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpzdWZmaXgmIzM0OykpCiYjNDM7CQkJCWdvdG8gb3V0OwomIzQzOwkJCW9mZnNldCA9IDY0OwomIzQzOwkJfQomIzQzOwkJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25leHQmIzM0OywgcHRyX2lkW2ldLCBvZmZzZXQsIDApOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0JiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtwbGFpbl9sZWFmJiMzNDssIDQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ3JhcGhfZGVwdGgoYm9vbCByYnRyZWUsIGludCBkZXB0aCwgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CWludCByb290X3R5cGUgPSBMSVNUX0hFQUQsIG5vZGVfdHlwZSA9IExJU1RfTk9ERSwgbm9kZV9zaXplID0gMjQ7CiYjNDM7CWludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKHJidHJlZSkgewomIzQzOwkJcm9vdF90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfcmJfcm9vdCYjMzQ7LCAxNik7CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChyb290X3R5cGUsIDAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9yYl9yb290JiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbm9kZV90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfcmJfbm9kZSYjMzQ7LCAzMik7CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChub2RlX3R5cGUsIDAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9yYl9ub2RlJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbm9kZV9zaXplID0gMzI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGRlcHRoOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY2hhciBuYW1lWzMyXSwgdGFnWzY0XTsKJiM0MzsKJiM0MzsJCWxvY2tfb2ZmID0gaSA/IG5vZGVfc2l6ZSA6IDA7CiYjNDM7CQlyb290X29mZiA9IGxvY2tfb2ZmICYjNDM7IDg7CiYjNDM7CQlzaXplID0gaSA9PSBkZXB0aCAtIDEgPyBub2RlX3NpemUgOiByb290X29mZiAmIzQzOyAxNjsKJiM0MzsJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgJiMzNDtncmFwaF9vd25lcl8lZCYjMzQ7LCBpKTsKJiM0MzsJCWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgbmFtZSwgc2l6ZSk7CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgZ3JhcGhfb3duZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZiAoaSkgewomIzQzOwkJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtub2RlJiMzNDssIG5vZGVfdHlwZSwgMCwgMCk7CiYjNDM7CQkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlJiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmIChpID09IGRlcHRoIC0gMSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtsb2NrJiMzNDssIFNQSU5fTE9DSywgbG9ja19vZmYgKiA4LCAwKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6bG9jayYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtyb290JiMzNDssIHJvb3RfdHlwZSwgcm9vdF9vZmYgKiA4LCAwKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXNucHJpbnRmKHRhZywgc2l6ZW9mKHRhZyksICYjMzQ7Y29udGFpbnM6Z3JhcGhfb3duZXJfJWQ6bm9kZSYjMzQ7LCBpICYjNDM7IDEpOwomIzQzOwkJZXJyID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCB0YWcsIGlkLCBpID8gMiA6IDEpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1QoZXJyLCAwLCAmIzM0O2J0Zl9fYWRkX2RlY2xfdGFnIGdyYXBoX293bmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VudHJ1c3RlZF9zZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0cl91bnRydXN0ZWQmIzM0OywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGVyY3B1X3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtwZXJjcHVfa3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O0FCQV9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfYWJhX2N5Y2xlKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfbWl4ZWRfY3ljbGUoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYXhfYWN5Y2xpYyYjMzQ7KSkKJiM0MzsJCXRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgZmFsc2UsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Rvb19kZWVwX2FjeWNsaWMmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCBmYWxzZSwgZmFsc2UsIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWF4X2FjeWNsaWNfY2hpbGRfZmlyc3QmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgdHJ1ZSwgZmFsc2UsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Rvb19kZWVwX2FjeWNsaWNfY2hpbGRfZmlyc3QmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCB0cnVlLCBmYWxzZSwgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYXhfYWN5Y2xpY19zaGFyZWRfc3VmZml4JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIGZhbHNlLCB0cnVlLCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXgmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCBmYWxzZSwgdHJ1ZSwgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtsaXN0X3RocmVlX3R5cGVzJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgMywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF9mb3VyX3R5cGVzJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF9tYXhfZGVwdGgmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtsaXN0X3Rvb19kZWVwJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV90aHJlZV90eXBlcyYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgMywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmJ0cmVlX2ZvdXJfdHlwZXMmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIDQsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV9tYXhfZGVwdGgmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIE1BWF9PV05FUlNISVBfREVQVEgsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV90b29fZGVlcCYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTM0OAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDMzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQlBGIEJURiBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggYW5kIHJldmlldyByZXF1ZXN0LiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCB0YXJnZXRzIG1vZGlmaWNhdGlvbnMgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCBhbmQgYWxzbyB0b3VjaGVzIHRoZSBzZWxmdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBUaGF0JiMzOTtzIGEgcmVhc29uYWJsZSBzY29wZTsgQlRGIGNoYW5nZXMgb2Z0ZW4gbmVjZXNzaXRhdGUgdGVzdCBhZGp1c3RtZW50cy4KCk5vdywgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGRpZmYuIFNwZWNpZmljYWxseSwgSSBzZWUgY2hhbmdlcyB3aXRoaW4gYGtlcm5lbC9icGYvYnRmLmNgIGltcGFjdGluZyB0aGUgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBmdW5jdGlvbi4gTm90YWJseSwgdGhleSYjMzk7dmUgcmVtb3ZlZCBzb21lIG9sZCBjeWNsZS1jaGVja2luZyBsb2dpYyBhbmQgaW50cm9kdWNlZCBuZXcgZnVuY3Rpb25zOiBgYnRmX293bmVkX3R5cGVfaWR4YCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBhbmQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBDcnVjaWFsbHksIEkgc2VlIHRoYXQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGlzIG5vdyBjYWxsZWQgd2l0aGluIGBidGZfcGFyc2VgOgoKYGBgYwoJCWVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpOwoJCWlmIChlcnIgJmx0OyAwKQoJCQlnb3RvIGVycm91dF9tZXRhOwpgYGAKClRoaXMgaXMgc2lnbmlmaWNhbnQuIGBidGZfcGFyc2VgIGlzIHBhcnQgb2YgdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSwgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCwgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIEJURiBsb2FkaW5nIGFuZCB2YWxpZGF0aW9uLiBSZW1lbWJlciwgYGJ0Zl9wYXJzZWAgaXMgaW52b2tlZCB3aGVuIGxvYWRpbmcgQlRGIGRhdGEgdmlhIHRoZSBgYnBmYCBzeXNjYWxsJiMzOTtzIGBCUEZfQlRGX0xPQURgIG9wZXJhdGlvbi4gVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBUaGlzIGZ1bmN0aW9uIGlzICpkaXJlY3RseSogaW52b2x2ZWQgaW4gcHJvY2Vzc2luZyB1bnRydXN0ZWQgdXNlciBpbnB1dCB0aGF0IGNvbWVzIGZyb20gdXNlcnNwYWNlIHdoZW4gY2FsbGluZyBgc3lzX2JwZihCUEZfQlRGX0xPQUQsIC4uLilgISBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBhIGNyaXRpY2FsIHZhbGlkYXRpb24gcG9pbnQuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gcXVpY2tseSBldmFsdWF0ZSByZWFjaGFiaWxpdHkuIE5vIHN1cnByaXNlcyBoZXJlLCBJIGV4cGVjdCB0aGF0IHRoaXMgYEJQRl9CVEZfTE9BRGAgc3lzY2FsbCBpcyByZWFkaWx5IHJlYWNoYWJsZSBpbiBzdGFuZGFyZCBRRU1VL3N5emthbGxlciBzZXR1cHMuICBTeXprYWxsZXIgaXMga25vd24gdG8gYWdncmVzc2l2ZWx5IGZ1enogdGhpcyBzeXNjYWxsLCB3aGljaCBtYWtlcyB0aGlzIGNoYW5nZSBwb3RlbnRpYWxseSBoaWdoLWltcGFjdC4KCkkmIzM5O2xsIG5vdyBuZWVkIHRvIHJlYWQgYXJvdW5kIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSByZWxhdGVkIGNoYW5nZXMgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCB0byBnZXQgYSBiZXR0ZXIgc2Vuc2Ugb2YgdGhlIGNvbnRleHQgYW5kIGltcGFjdCB1c2luZyBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmM9NDM1Nj1zdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDM4My1cbmtlcm5lbC9icGYvYnRmLmM6NDM4NDpzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxua2VybmVsL2JwZi9idGYuYy00Mzg1LVx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjAxND1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwOTctXG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTg6XHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xua2VybmVsL2JwZi9idGYuYy02MDk5LVx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNDUxCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IG1lbnRhbCB3YWxrdGhyb3VnaCwgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGUgY29kZToKCioqRGl2aW5nIGludG8gQlRGIEludGVybmFscyoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBmb2N1c2luZyBvbiBga2VybmVsL2JwZi9idGYuY2AsIHNwZWNpZmljYWxseSBhcm91bmQgdGhlIDQzMTAgdG8gNDQwNSBsaW5lIHJhbmdlLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGluIHRoaXMgc2VjdGlvbi4gSSBiZXQgaXQmIzM5O3MgcmVsYXRlZCB0byBzb21lIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBtZXRhZGF0YSBoYW5kbGluZywgbGlrZWx5IGRlYWxpbmcgd2l0aCBob3cgdHlwZXMgYXJlIHJlcHJlc2VudGVkIG9yIG1hbmlwdWxhdGVkLiBHaXZlbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBCVEYgY29kZSwgaXQmIzM5O3MgcHJvYmFibHkgcmVsYXRlZCB0byBlaXRoZXIgcGFyc2luZywgZ2VuZXJhdGluZywgb3IgY29uc3VtaW5nIEJURiBpbmZvcm1hdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCBmdW5jdGlvbihzKSBvciBsb2dpYyBiZWluZyBpbXBsZW1lbnRlZCBpbiB0aGF0IHNlY3Rpb24uIEFyZSB3ZSB2YWxpZGF0aW5nIHNvbWV0aGluZz8gRGVjb2RpbmcgdHlwZSBpbmZvcm1hdGlvbj8gQnVpbGRpbmcgQlRGIHN0cnVjdHVyZXM/IE9yIHBlcmhhcHMsIG1vZGlmeWluZyBCVEYgZGF0YSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzIGxpa2Uga2VybmVsIHVwZ3JhZGVzPyBJJiMzOTtsbCBzdGFydCBieSByZWFkaW5nIHRoZSBzdXJyb3VuZGluZyBjb21tZW50cyBjbG9zZWx5IGZvciBjb250ZXh0LCB0aGVuIGRpZyBpbnRvIHRoZSBjb2RlIGl0c2VsZiwgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB2YXJpYWJsZSBuYW1lcyBhbmQgZnVuY3Rpb24gY2FsbHMuIEtub3dpbmcgbWUsIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgYSBmZXcgY2FsbHMgZG93biB0byBiZSBjZXJ0YWluIG9mIGl0cyB0cnVlIGZ1bmN0aW9uIGFuZCBwdXJwb3NlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgc2VjcmV0cyB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgaG9sZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDMxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NDMxMDpcdFx0XHRcdFx0cmV0dXJuIC1FMkJJRztcbjQzMTE6XHRcdFx0XHRjb250aW51ZTtcbjQzMTI6XHRcdFx0fVxuNDMxMzpcdFxuNDMxNDpcdFx0XHRpZiAoIShyZWMtXHUwMDNlZmllbGRzW2ldLnR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSlcbjQzMTU6XHRcdFx0XHRjb250aW51ZTtcbjQzMTY6XHRcdFx0YnRmX2lkID0gcmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcbjQzMTc6XHRcdFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcbjQzMTg6XHRcdFx0aWYgKCFtZXRhKVxuNDMxOTpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuNDMyMDpcdFx0XHRyZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cdTAwM2VyZWNvcmQ7XG40MzIxOlx0XHR9XG40MzIyOlx0XHRyZXR1cm4gMDtcbjQzMjM6XHR9XG40MzI0Olx0XG40MzI1Olx0c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxuNDMyNjpcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxuNDMyNzpcdHtcbjQzMjg6XHRcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG40MzI5Olx0XHR1MzIgYnRmX2lkO1xuNDMzMDpcdFxuNDMzMTpcdFx0aWYgKGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XG40MzMyOlx0XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuNDMzMzpcdFx0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuNDMzNDpcdFx0XHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cdTAwM2VrcHRyLmJ0ZikpXG40MzM1Olx0XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG40MzM2Olx0XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuNDMzNzpcdFx0fSBlbHNlIHtcbjQzMzg6XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG40MzM5Olx0XHR9XG40MzQwOlx0XG40MzQxOlx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuNDM0MjpcdFx0aWYgKCFtZXRhKVxuNDM0MzpcdFx0XHRyZXR1cm4gZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcbjQzNDQ6XHRcdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuNDM0NTpcdH1cbjQzNDY6XHRcbjQzNDc6XHQvKlxuNDM0ODpcdCAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuNDM0OTpcdCAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XG40MzUwOlx0ICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcbjQzNTE6XHQgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuNDM1MjpcdCAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cbjQzNTM6XHQgKi9cbjQzNTQ6XHQjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbjQzNTU6XHRcbjQzNTY6XHRzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuNDM1NzpcdFx0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG40MzU4Olx0XHRcdFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxuNDM1OTpcdHtcbjQzNjA6XHRcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG40MzYxOlx0XHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xuNDM2MjpcdFxuNDM2MzpcdFx0aWYgKCFkZXB0aF9sZWZ0KVxuNDM2NDpcdFx0XHRyZXR1cm4gLUVMT09QO1xuNDM2NTpcdFx0aWYgKGRlcHRoW2lkeF0pXG40MzY2Olx0XHRcdGdvdG8gZG9uZTtcbjQzNjc6XHRcbjQzNjg6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40MzY5Olx0XHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG40MzcwOlx0XHRcdGlmIChyZXQgPT0gLUVOT0VOVClcbjQzNzE6XHRcdFx0XHRjb250aW51ZTtcbjQzNzI6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzNzM6XHRcdFx0XHRyZXR1cm4gcmV0O1xuNDM3NDpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XG40Mzc1Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40Mzc2Olx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNzc6XHRcdFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcbjQzNzg6XHRcdH1cbjQzNzk6XHRcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbjQzODA6XHRkb25lOlxuNDM4MTpcdFx0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuNDM4MjpcdH1cbjQzODM6XHRcbjQzODQ6XHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuNDM4NTpcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuNDM4NjpcdHtcbjQzODc6XHRcdHU4ICpkZXB0aDtcbjQzODg6XHRcdGludCBpLCByZXQgPSAwO1xuNDM4OTpcdFxuNDM5MDpcdFx0ZGVwdGggPSBrdmNhbGxvYyh0YWItXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XG40MzkxOlx0XHRpZiAoIWRlcHRoKVxuNDM5MjpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjQzOTM6XHRcbjQzOTQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40Mzk1Olx0XHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuNDM5NjpcdFx0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbjQzOTc6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzOTg6XHRcdFx0XHRicmVhaztcbjQzOTk6XHRcdFx0cmV0ID0gMDtcbjQ0MDA6XHRcdH1cbjQ0MDE6XHRcdGt2ZnJlZShkZXB0aCk7XG40NDAyOlx0XHRyZXR1cm4gcmV0O1xuNDQwMzpcdH1cbjQ0MDQ6XHRcbjQ0MDU6XHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbjQ0MDY6XHRcdFx0XHQgICAgICB1MzIgdHlwZV9pZCwgdm9pZCAqZGF0YSwgdTggYml0c19vZmZzZXQsXG40NDA3Olx0XHRcdFx0ICAgICAgc3RydWN0IGJ0Zl9zaG93ICpzaG93KVxuNDQwODpcdHtcbjQ0MDk6XHRcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIzNDYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyB0aGUgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIENvbnRleHQqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgYXJvdW5kIHRoYXQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGNhbGwuIExldCBtZSBxdWlja2x5IGV4YW1pbmUgdGhlIGNvZGUgZnJvbSBsaW5lIDYwODAgdG8gNjExNS4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgaW1tZWRpYXRlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGFyZ3VtZW50cyBiZWluZyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLCB0aGUgdmFyaWFibGVzIGJlaW5nIHVzZWQsIGFuZCBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBtaWdodCBpbmZsdWVuY2UgaXRzIGJlaGF2aW9yLiBIb3BlZnVsbHkgdGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIG93bmVyc2hpcCBkZXB0aCBjaGVjayBpcyB0cmlnZ2VyZWQgYW5kIHdoYXQgaXQmIzM5O3MgdHJ5aW5nIHRvIGFjY29tcGxpc2ggd2l0aGluIHRoYXQgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgY29kZS4gVGhpcyBpcyBsaWtlbHkgcmVsYXRlZCB0byBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgcGFzc2VkIGluIGZyb20gc29tZXdoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjA4MDpcdFx0XHRnb3RvIGVycm91dDtcbjYwODE6XHRcbjYwODI6XHRcdHN0cnVjdF9tZXRhX3RhYiA9IGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoXHUwMDI2ZW52LVx1MDAzZWxvZywgYnRmKTtcbjYwODM6XHRcdGlmIChJU19FUlIoc3RydWN0X21ldGFfdGFiKSkge1xuNjA4NDpcdFx0XHRlcnIgPSBQVFJfRVJSKHN0cnVjdF9tZXRhX3RhYik7XG42MDg1Olx0XHRcdGdvdG8gZXJyb3V0O1xuNjA4NjpcdFx0fVxuNjA4NzpcdFx0YnRmLVx1MDAzZXN0cnVjdF9tZXRhX3RhYiA9IHN0cnVjdF9tZXRhX3RhYjtcbjYwODg6XHRcbjYwODk6XHRcdGlmIChzdHJ1Y3RfbWV0YV90YWIpIHtcbjYwOTA6XHRcdFx0aW50IGk7XG42MDkxOlx0XG42MDkyOlx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG42MDkzOlx0XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbjYwOTQ6XHRcdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuNjA5NTpcdFx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbjYwOTY6XHRcdFx0fVxuNjA5NzpcdFxuNjA5ODpcdFx0XHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcbjYwOTk6XHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbjYxMDA6XHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuNjEwMTpcdFx0fVxuNjEwMjpcdFxuNjEwMzpcdFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbjYxMDQ6XHRcdGlmIChlcnIpXG42MTA1Olx0XHRcdGdvdG8gZXJyb3V0X2ZyZWU7XG42MTA2Olx0XG42MTA3Olx0XHRidGZfdmVyaWZpZXJfZW52X2ZyZWUoZW52KTtcbjYxMDg6XHRcdHJlZmNvdW50X3NldChcdTAwMjZidGYtXHUwMDNlcmVmY250LCAxKTtcbjYxMDk6XHRcdHJldHVybiBidGY7XG42MTEwOlx0XG42MTExOlx0ZXJyb3V0X21ldGE6XG42MTEyOlx0XHRidGZfZnJlZV9zdHJ1Y3RfbWV0YV90YWIoYnRmKTtcbjYxMTM6XHRlcnJvdXQ6XG42MTE0Olx0XHQvKiBvdmVyd3JpdGUgZXJyIHdpdGggLUVOT1NQQyBvciAtRUZBVUxUICovXG42MTE1Olx0XHRyZXQgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFx1MDAyNmVudi1cdTAwM2Vsb2cpO1xuNjExNjpcdFx0aWYgKHJldClcbjYxMTc6XHRcdFx0ZXJyID0gcmV0O1xuNjExODpcdGVycm91dF9mcmVlOlxuNjExOTpcdFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMxODgKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiA1OTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb246IEJQRi9CVEYgT3duZXJzaGlwIERlcHRoIENoZWNrKioKCk9rYXksIHRoaXMgaXMgZGVmaW5pdGVseSBwcm9taXNpbmcuIFRoZSBCUEYvQlRGIHN1YnN5c3RlbSBpcyBhIGNyaXRpY2FsIHBpZWNlLCBhbmQgdGhpcyBjb2RlIHBhdGggaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggdGhlIGBCUEZfQlRGX0xPQURgIHN5c2NhbGwuIEl0JiMzOTtzIG1vZGlmeWluZyB0aGUgQlRGIG93bmVyc2hpcCBncmFwaCB2YWxpZGF0aW9uIGxvZ2ljLCBzcGVjaWZpY2FsbHkgcmVwbGFjaW5nIGFuIGFkLWhvYyBjeWNsZSBjaGVjayB3aXRoIGEgZGVwdGgtY2hlY2tpbmcgcmVjdXJzaXZlIGFsZ29yaXRobSAoYGJ0Zl9vd25lcnNoaXBfZGVwdGhgKS4gVGhhdCYjMzk7cyBhIHJlZCBmbGFnIOKAkyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gb3BlcmF0aW5nIG9uIHVzZXItY29udHJvbGxlZCBpbnB1dC4gVGhpcyBzY3JlYW1zIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXM6IGJ1Z3MgaW4gdGhlIHJlY3Vyc2l2ZSBsb2dpYyBpdHNlbGYsIHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3dzLCBsb29wIGRldGVjdGlvbiBmYWlsdXJlcywgbWVtb3J5IGxlYWtzLCBvdXQtb2YtYm91bmRzIHJlYWRzL3dyaXRlcywgb3IgZXZlbiBzdGFjayBvdmVyZmxvd3MuIGBXb3J0aEZ1enppbmcgPSB0cnVlYC4gTm8gcXVlc3Rpb24uCgpOb3csIGxldCYjMzk7cyBuYWlsIGRvd24gdGhlIGNyaXRpY2FsIHN5bWJvbHMuIEkgbmVlZCB0byBrbm93IHdoaWNoIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIG1vZGlmaWVkIG9yIG5ld2x5IGludHJvZHVjZWQuIExldCYjMzk7cyBzZWUuLi4KClRoZSBrZXkgc3VzcGVjdHMgYXJlOiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lZF90eXBlX2lkeGAsIGFuZCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBgYnRmX3BhcnNlYCBpcyB3aGVyZSB0aGlzIG5ldyBjb2RlIGlzIGNhbGxlZCwgYW5kIHBlcmhhcHMgYGJwZl9idGZfbG9hZGAgYXMgd2VsbCwgYnV0IHRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIHRoZSBvbmVzIGRvaW5nIHRoZSBjb3JlIHdvcmsuCgpXYWl0IGEgc2Vjb25kLi4uIGFyZSBgYnRmX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfb3duZWRfdHlwZV9pZHhgIHN0YXRpYz8gWWVzLCB0aGV5IGFyZS4gVGhhdCBjb3VsZCBjb21wbGljYXRlIHRoaW5ncy4gVGhlIGluc3RydWN0aW9ucyByZWdhcmRpbmcgc3RhdGljIGZ1bmN0aW9ucyBjb21lIHRvIG1pbmQ6ICYjMzQ7Q29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjayBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4mIzM0OwoKSG93ZXZlciwgdGhleSBhcmUgaW4gYSAuYyBmaWxlLCBidXQgdGhleSBhcmUgbm90IGlubGluZWQgaW4gYSBoZWFkZXIuIExldCYjMzk7cyB0aGluay4uLiBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYW5ub3QgYmUgaW5saW5lZCwgdGhhdCYjMzk7cyBjZXJ0YWluISBCdXQgaXMgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGlubGluZWQ/IEl0IGlzIGNhbGxlZCBvbmx5IG9uY2UgZnJvbSBgYnRmX3BhcnNlYCwgc28gaXQgbWlnaHQgYmUgaW5saW5lZCBvciBub3QuCgpCdXQgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBpcyBub24tc3RhdGljISBPa2F5LCBnb29kLiBMZXQmIzM5O3MganVzdCBjb25maXJtIHRoYXQgaXQmIzM5O3MgZWl0aGVyIGV4cG9ydGVkIG9yIGRlY2xhcmVkIGluIGEgaGVhZGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2J0Zi5oPTIzND1zdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM1LVx0XHRcdFx0ICAgIHUzMiBmaWVsZF9tYXNrLCB1MzIgdmFsdWVfc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjIzNjppbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKTtcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM3LWJvb2wgYnRmX3R5cGVfaXNfdm9pZChjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NDE1MD1zdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQyODItXG5rZXJuZWwvYnBmL2J0Zi5jOjQyODM6aW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbmtlcm5lbC9icGYvYnRmLmMtNDI4NC17XG4tLVxua2VybmVsL2JwZi9idGYuYz02MDE0PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjA5Mi1cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbmtlcm5lbC9icGYvYnRmLmM6NjA5MzpcdFx0XHRlcnIgPSBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhidGYsIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2V0eXBlc1tpXS5yZWNvcmQpO1xua2VybmVsL2JwZi9idGYuYy02MDk0LVx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2My1cbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEzNjQ6XHRyZXQgPSBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhidGYsIG1hcC1cdTAwM2VyZWNvcmQpO1xua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2NS1cdGlmIChyZXQgXHUwMDNjIDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODQ2CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogOTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIEJURiBTeW1ib2wgUmVzb2x1dGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBCVEYgc3R1ZmYuIEZpcnN0IHRoaW5ncyBmaXJzdCwgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYC4uLiBwcmV0dHkgc3VyZSB0aGF0JiMzOTtzIGEgZ2xvYmFsIHN5bWJvbCwgbm90IHN0YXRpYy4gTmVlZCB0byBrZWVwIHRoYXQgaW4gbWluZCB3aGVuIEkgc3RhcnQgdHJhY2luZyB0aGluZ3MuIE5vdywgSSByZWNhbGwgdGhvc2UgdHdvIGZ1bmN0aW9ucywgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGFuZCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIHRoYXQgd2VyZSBhZGRlZCBpbiBga2VybmVsL2JwZi9idGYuY2AuIFRoZXkgc2VlbSByZWxldmFudCB0byB3aGF0ZXZlciBJJiMzOTttIHRyb3VibGVzaG9vdGluZy4KClRoZSByZWFsIHF1ZXN0aW9uIEkgbmVlZCB0byBhbnN3ZXIsIHRob3VnaCwgaXMgd2hhdCBjYWxscyBgYnRmX3BhcnNlYD8gVW5kZXJzdGFuZGluZyBpdHMgY2FsbCBjaGFpbiBpcyBnb2luZyB0byBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgbGFyZ2VyIHBpY3R1cmUgaGVyZS4gQWx0ZXJuYXRpdmVseSwgd2hhdCYjMzk7cyBjYWxsaW5nIGBicGZfYnRmX2xvYWRgIHdvdWxkIGFsc28gZ2l2ZSBtZSBjbHVlcy4gR290dGEgZ28gY2hlY2sgdGhlIGNhbGwgZ3JhcGhzIGZvciB0aG9zZSB0d28gbm93LiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBlbnRyeSBwb2ludCBhbmQgdGhlIGZsb3cgdG8gZm9sbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfcGFyc2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTM5NzY9c3RhdGljIGludCBidGZfZmluZF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTM5ODktLyogQ2FsbGVycyBoYXZlIHRvIGVuc3VyZSB0aGUgbGlmZSBjeWNsZSBvZiBidGYgaWYgaXQgaXMgcHJvZ3JhbSBCVEYgKi9cbmtlcm5lbC9icGYvYnRmLmM6Mzk5MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9rcHRyKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQsXG5rZXJuZWwvYnBmL2J0Zi5jLTM5OTEtXHRcdFx0ICBzdHJ1Y3QgYnRmX2ZpZWxkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL2JwZi9idGYuYy00MDA4LVx0aWYgKGlkID09IC1FTk9FTlQpIHtcbmtlcm5lbC9icGYvYnRmLmM6NDAwOTpcdFx0LyogYnRmX3BhcnNlX2twdHIgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHcvIGJ0ZiA9IHByb2dyYW0gQlRGICovXG5rZXJuZWwvYnBmL2J0Zi5jLTQwMTAtXHRcdFdBUk5fT05fT05DRShidGZfaXNfa2VybmVsKGJ0ZikpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDA3OS1cbmtlcm5lbC9icGYvYnRmLmM6NDA4MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9ncmFwaF9yb290KGNvbnN0IHN0cnVjdCBidGYgKmJ0Zixcbmtlcm5lbC9icGYvYnRmLmMtNDA4MS1cdFx0XHRcdHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDEyMy1cbmtlcm5lbC9icGYvYnRmLmM6NDEyNDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9saXN0X2hlYWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCxcbmtlcm5lbC9icGYvYnRmLmMtNDEyNS1cdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxua2VybmVsL2JwZi9idGYuYy00MTI2LXtcbmtlcm5lbC9icGYvYnRmLmM6NDEyNzpcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcJiMzNDticGZfbGlzdF9ub2RlXCYjMzQ7LFxua2VybmVsL2JwZi9idGYuYy00MTI4LVx0XHRcdFx0XHQgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9saXN0X25vZGUpKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQxMzAtXG5rZXJuZWwvYnBmL2J0Zi5jOjQxMzE6c3RhdGljIGludCBidGZfcGFyc2VfcmJfcm9vdChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLFxua2VybmVsL2JwZi9idGYuYy00MTMyLVx0XHRcdCAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxua2VybmVsL2JwZi9idGYuYy00MTMzLXtcbmtlcm5lbC9icGYvYnRmLmM6NDEzNDpcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcJiMzNDticGZfcmJfbm9kZVwmIzM0Oyxcbmtlcm5lbC9icGYvYnRmLmMtNDEzNS1cdFx0XHRcdFx0ICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfcmJfbm9kZSkpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NDEzOD1zdGF0aWMgaW50IGJ0Zl9maWVsZF9jbXAoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iLCBjb25zdCB2b2lkICpwcml2KVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDE0OS1cbmtlcm5lbC9icGYvYnRmLmM6NDE1MDpzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbmtlcm5lbC9icGYvYnRmLmMtNDE1MS1cdFx0XHRcdCAgICB1MzIgZmllbGRfbWFzaywgdTMyIHZhbHVlX3NpemUpXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjI5LVx0XHRjYXNlIEJQRl9VUFRSOlxua2VybmVsL2JwZi9idGYuYzo0MjMwOlx0XHRcdHJldCA9IGJ0Zl9wYXJzZV9rcHRyKGJ0ZiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSwgXHUwMDI2aW5mb19hcnJbaV0pO1xua2VybmVsL2JwZi9idGYuYy00MjMxLVx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjM0LVx0XHRjYXNlIEJQRl9MSVNUX0hFQUQ6XG5rZXJuZWwvYnBmL2J0Zi5jOjQyMzU6XHRcdFx0cmV0ID0gYnRmX3BhcnNlX2xpc3RfaGVhZChidGYsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0sIFx1MDAyNmluZm9fYXJyW2ldKTtcbmtlcm5lbC9icGYvYnRmLmMtNDIzNi1cdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDIzOS1cdFx0Y2FzZSBCUEZfUkJfUk9PVDpcbmtlcm5lbC9icGYvYnRmLmM6NDI0MDpcdFx0XHRyZXQgPSBidGZfcGFyc2VfcmJfcm9vdChidGYsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0sIFx1MDAyNmluZm9fYXJyW2ldKTtcbmtlcm5lbC9icGYvYnRmLmMtNDI0MS1cdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTU3ND1zdGF0aWMgaW50IGJ0Zl9jaGVja19hbGxfdHlwZXMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU2MDctXG5rZXJuZWwvYnBmL2J0Zi5jOjU2MDg6c3RhdGljIGludCBidGZfcGFyc2VfdHlwZV9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbmtlcm5lbC9icGYvYnRmLmMtNTYwOS17XG4tLVxua2VybmVsL2JwZi9idGYuYy01NjMwLVxua2VybmVsL2JwZi9idGYuYzo1NjMxOnN0YXRpYyBpbnQgYnRmX3BhcnNlX3N0cl9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbmtlcm5lbC9icGYvYnRmLmMtNTYzMi17XG4tLVxua2VybmVsL2JwZi9idGYuYy01NjYyLVxua2VybmVsL2JwZi9idGYuYzo1NjYzOnN0YXRpYyBpbnQgYnRmX3BhcnNlX2xheW91dF9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcbmtlcm5lbC9icGYvYnRmLmMtNTY2NC17XG4tLVxua2VybmVsL2JwZi9idGYuYz01NzEzPXN0YXRpYyBpbnQgYnRmX2NoZWNrX3NlY19pbmZvKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi9idGYuYy01NzY5LVxua2VybmVsL2JwZi9idGYuYzo1NzcwOnN0YXRpYyBpbnQgYnRmX3BhcnNlX2hkcihzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52KVxua2VybmVsL2JwZi9idGYuYy01NzcxLXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTU4NDM9c3RhdGljIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICpcbmtlcm5lbC9icGYvYnRmLmM6NTg0NDpidGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0Zilcbmtlcm5lbC9icGYvYnRmLmMtNTg0NS17XG4tLVxua2VybmVsL2JwZi9idGYuYy01OTQ0LVx0XHR0eXBlLVx1MDAzZWJ0Zl9pZCA9IGk7XG5rZXJuZWwvYnBmL2J0Zi5jOjU5NDU6XHRcdHJlY29yZCA9IGJ0Zl9wYXJzZV9maWVsZHMoYnRmLCB0LCBCUEZfU1BJTl9MT0NLIHwgQlBGX1JFU19TUElOX0xPQ0sgfCBCUEZfTElTVF9IRUFEIHwgQlBGX0xJU1RfTk9ERSB8XG5rZXJuZWwvYnBmL2J0Zi5jLTU5NDYtXHRcdFx0XHRcdFx0ICBCUEZfUkJfUk9PVCB8IEJQRl9SQl9OT0RFIHwgQlBGX1JFRkNPVU5UIHxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTU5NzY9c3RhdGljIGludCBidGZfY2hlY2tfbW9kaWZpZXJfY2hhaW5fbGVuZ3RoKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi9idGYuYy02MDEzLVxua2VybmVsL2JwZi9idGYuYzo2MDE0OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxua2VybmVsL2JwZi9idGYuYy02MDE1LVx0XHRcdCAgICAgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXG4tLVxua2VybmVsL2JwZi9idGYuYy02MDU5LVxua2VybmVsL2JwZi9idGYuYzo2MDYwOlx0ZXJyID0gYnRmX3BhcnNlX2hkcihlbnYpO1xua2VybmVsL2JwZi9idGYuYy02MDYxLVx0aWYgKGVycilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjUtXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNjY6XHRlcnIgPSBidGZfcGFyc2Vfc3RyX3NlYyhlbnYpO1xua2VybmVsL2JwZi9idGYuYy02MDY3LVx0aWYgKGVycilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjktXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzA6XHRlcnIgPSBidGZfcGFyc2VfbGF5b3V0X3NlYyhlbnYpO1xua2VybmVsL2JwZi9idGYuYy02MDcxLVx0aWYgKGVycilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzMtXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzQ6XHRlcnIgPSBidGZfcGFyc2VfdHlwZV9zZWMoZW52KTtcbmtlcm5lbC9icGYvYnRmLmMtNjA3NS1cdGlmIChlcnIpXG4tLVxua2VybmVsL2JwZi9idGYuYy02MDgxLVxua2VybmVsL2JwZi9idGYuYzo2MDgyOlx0c3RydWN0X21ldGFfdGFiID0gYnRmX3BhcnNlX3N0cnVjdF9tZXRhcyhcdTAwMjZlbnYtXHUwMDNlbG9nLCBidGYpO1xua2VybmVsL2JwZi9idGYuYy02MDgzLVx0aWYgKElTX0VSUihzdHJ1Y3RfbWV0YV90YWIpKSB7XG4tLVxua2VybmVsL2JwZi9idGYuYz02NDUyPUJURl9JRF9MSVNUX1NJTkdMRShicGZfY3R4X2NvbnZlcnRfYnRmX2lkLCBzdHJ1Y3QsIGJwZl9jdHhfY29udmVydClcbmtlcm5lbC9icGYvYnRmLmMtNjQ1My1cbmtlcm5lbC9icGYvYnRmLmM6NjQ1NDpzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcbmtlcm5lbC9icGYvYnRmLmMtNjQ1NS1cdFx0XHRcdCAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSlcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NzUtXG5rZXJuZWwvYnBmL2J0Zi5jOjY0NzY6XHRlcnIgPSBidGZfcGFyc2VfaGRyKGVudik7XG5rZXJuZWwvYnBmL2J0Zi5jLTY0NzctXHRpZiAoZXJyKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjQ4MS1cbmtlcm5lbC9icGYvYnRmLmM6NjQ4MjpcdGVyciA9IGJ0Zl9wYXJzZV9zdHJfc2VjKGVudik7XG5rZXJuZWwvYnBmL2J0Zi5jLTY0ODMtXHRpZiAoZXJyKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjUwNi1cbmtlcm5lbC9icGYvYnRmLmM6NjUwNzpzdHJ1Y3QgYnRmICpidGZfcGFyc2Vfdm1saW51eCh2b2lkKVxua2VybmVsL2JwZi9idGYuYy02NTA4LXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1MTktXHRsb2ctXHUwMDNlbGV2ZWwgPSBCUEZfTE9HX0tFUk5FTDtcbmtlcm5lbC9icGYvYnRmLmM6NjUyMDpcdGJ0ZiA9IGJ0Zl9wYXJzZV9iYXNlKGVudiwgXCYjMzQ7dm1saW51eFwmIzM0OywgX19zdGFydF9CVEYsIF9fc3RvcF9CVEYgLSBfX3N0YXJ0X0JURik7XG5rZXJuZWwvYnBmL2J0Zi5jLTY1MjEtXHRpZiAoSVNfRVJSKGJ0ZikpXG4tLVxua2VybmVsL2JwZi9idGYuYy02NTIzLVxua2VybmVsL2JwZi9idGYuYzo2NTI0Olx0LyogYnRmX3BhcnNlX3ZtbGludXgoKSBydW5zIHVuZGVyIGJ0Zl92bWxpbnV4X2xvY2sgKi9cbmtlcm5lbC9icGYvYnRmLmMtNjUyNS1cdGJwZl9jdHhfY29udmVydC50ID0gYnRmX3R5cGVfYnlfaWQoYnRmLCBicGZfY3R4X2NvbnZlcnRfYnRmX2lkWzBdKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY1NDA9X191MzIgYnRmX3JlbG9jYXRlX2lkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgX191MzIgaWQpXG4tLVxua2VybmVsL2JwZi9idGYuYy02NTQ4LVxua2VybmVsL2JwZi9idGYuYzo2NTQ5OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBjb25zdCB2b2lkICpkYXRhLFxua2VybmVsL2JwZi9idGYuYy02NTUwLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBkYXRhX3NpemUsIHZvaWQgKmJhc2VfZGF0YSxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NzEtXHRpZiAoYmFzZV9kYXRhKSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjY1NzI6XHRcdGJhc2VfYnRmID0gYnRmX3BhcnNlX2Jhc2UoZW52LCBcJiMzNDsuQlRGLmJhc2VcJiMzNDssIGJhc2VfZGF0YSwgYmFzZV9kYXRhX3NpemUpO1xua2VybmVsL2JwZi9idGYuYy02NTczLVx0XHRpZiAoSVNfRVJSKGJhc2VfYnRmKSkge1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjYwMS1cbmtlcm5lbC9icGYvYnRmLmM6NjYwMjpcdGVyciA9IGJ0Zl9wYXJzZV9oZHIoZW52KTtcbmtlcm5lbC9icGYvYnRmLmMtNjYwMy1cdGlmIChlcnIpXG4tLVxua2VybmVsL2JwZi9idGYuYy02NjA3LVxua2VybmVsL2JwZi9idGYuYzo2NjA4Olx0ZXJyID0gYnRmX3BhcnNlX3N0cl9zZWMoZW52KTtcbmtlcm5lbC9icGYvYnRmLmMtNjYwOS1cdGlmIChlcnIpXG4tLVxua2VybmVsL2JwZi9idGYuYz04NDg2PWludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NDkwLVxua2VybmVsL2JwZi9idGYuYzo4NDkxOlx0YnRmID0gYnRmX3BhcnNlKGF0dHIsIHVhdHRyLCBhdHRyX2xvZyk7XG5rZXJuZWwvYnBmL2J0Zi5jLTg0OTItXHRpZiAoSVNfRVJSKGJ0ZikpXG4tLVxua2VybmVsL2JwZi9idGYuYz04NjQwPXN0YXRpYyBpbnQgYnRmX21vZHVsZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBvcCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NTktXHRcdH1cbmtlcm5lbC9icGYvYnRmLmM6ODY2MDpcdFx0YnRmID0gYnRmX3BhcnNlX21vZHVsZShtb2QtXHUwMDNlbmFtZSwgbW9kLVx1MDAzZWJ0Zl9kYXRhLCBtb2QtXHUwMDNlYnRmX2RhdGFfc2l6ZSxcbmtlcm5lbC9icGYvYnRmLmMtODY2MS1cdFx0XHRcdCAgICAgICBtb2QtXHUwMDNlYnRmX2Jhc2VfZGF0YSwgbW9kLVx1MDAzZWJ0Zl9iYXNlX2RhdGFfc2l6ZSk7XG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9NzU5PWJvb2wgYnRmX3JlY29yZF9lcXVhbChjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjX2EsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYilcbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy03NzAtXHRzaXplID0gc3RydWN0X3NpemUocmVjX2EsIGZpZWxkcywgcmVjX2EtXHUwMDNlY250KTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjc3MTpcdC8qIGJ0Zl9wYXJzZV9maWVsZHMgdXNlcyBremFsbG9jIHRvIGFsbG9jYXRlIGEgYnRmX3JlY29yZCwgc28gdW51c2VkXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy03NzItXHQgKiBtZW1iZXJzIGFyZSB6ZXJvZWQgb3V0LiBTbyBtZW1jbXAgaXMgc2FmZSB0byBkbyB3aXRob3V0IHdvcnJ5aW5nXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTI3Ni1cbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEyNzc6XHRtYXAtXHUwMDNlcmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHZhbHVlX3R5cGUsXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xMjc4LVx0XHRcdFx0ICAgICAgIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9USU1FUiB8IEJQRl9LUFRSIHwgQlBGX0xJU1RfSEVBRCB8XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTIwOTc5PXN0cnVjdCBidGYgKmJwZl9nZXRfYnRmX3ZtbGludXgodm9pZClcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODctXHRcdGlmICghYnRmKSB7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjA5ODg6XHRcdFx0YnRmID0gYnRmX3BhcnNlX3ZtbGludXgoKTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4OS1cdFx0XHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODk3MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IExpbmUgb2YgSW5xdWlyeTogQlRGIEZpbGUgRGVzY3JpcHRvciBDcmVhdGlvbioqCgpPa2F5LCBzbyBgYnRmX25ld19mZGAgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgdWx0aW1hdGVseSBnZXRzIGNhbGxlZCB0byBjcmVhdGUgYSBCVEYgZmlsZSBkZXNjcmlwdG9yLiBUaGUgaW1tZWRpYXRlIGZ1bmN0aW9uIHRvIGNhbGwgaXQsIGl0IHNlZW1zLCBpcyBgYnRmX3BhcnNlYCwgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvbi4gSW50ZXJlc3RpbmcuIE5vdywgd2hlcmUgaXMgYGJ0Zl9uZXdfZmRgIGJlaW5nIGludm9rZWQ/IFRoZSB0ZXh0IG1lbnRpb25zIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AsIGFuZCBzcGVjaWZpY2FsbHkgdGhlIGhhbmRsaW5nIG9mIGBCUEZfQlRGX0xPQURgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGxvYWRpbmcgQlRGIGRhdGEgaXMgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBpdC4KCkhvd2V2ZXIsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsYXJnZXIgY29udGV4dC4gVG8gc29saWRpZnkgdGhpcyB1bmRlcnN0YW5kaW5nLCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIGNhbGxlcnMgb2YgYGJ0Zl9uZXdfZmRgLiBUcmFjaW5nIHRoZSBjYWxsIGdyYXBoIHdpbGwgaGVscCBtZSBlbnN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55dGhpbmcgY3J1Y2lhbCBhbmQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgb3ZlcmFsbCBCVEYgbG9hZGluZyBwcm9jZXNzLiBJdCBpcyBpbXBvcnRhbnQgdG8ga25vdyB3aGljaCBjb2RlIHBhdGhzIGFyZSByZWxhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfbmV3X2ZkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvYnRmLmg9MTQ5PXN0cnVjdCBicGZfbG9nX2F0dHI7XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjE1MDppbnQgYnRmX25ld19mZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKTtcbmluY2x1ZGUvbGludXgvYnRmLmgtMTUxLXN0cnVjdCBidGYgKmJ0Zl9nZXRfYnlfZmQoaW50IGZkKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg0NzQ9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0ODAtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0ODE6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxua2VybmVsL2JwZi9idGYuYy04NDgyLXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0ODUtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0ODY6aW50IGJ0Zl9uZXdfZmQoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbmtlcm5lbC9icGYvYnRmLmMtODQ4Ny17XG4tLVxua2VybmVsL2JwZi9idGYuYy04NTA2LVxua2VybmVsL2JwZi9idGYuYzo4NTA3Olx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg1MDgtXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODU4Nj1pbnQgYnRmX2dldF9mZF9ieV9pZCh1MzIgaWQpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NTk5LVxua2VybmVsL2JwZi9idGYuYzo4NjAwOlx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcbmtlcm5lbC9icGYvYnRmLmMtODYwMS1cdGlmIChmZCBcdTAwM2MgMClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg4Mzg9QlBGX0NBTExfNChicGZfYnRmX2ZpbmRfYnlfbmFtZV9raW5kLCBjaGFyICosIG5hbWUsIGludCwgbmFtZV9zeiwgdTMyLCBraW5kLCBpbnQsIGZsYWdzKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtODg1MS1cdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IGJ0Zl9pc19tb2R1bGUoYnRmKSkge1xua2VybmVsL2JwZi9idGYuYzo4ODUyOlx0XHRidGZfb2JqX2ZkID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTMtXHRcdGlmIChidGZfb2JqX2ZkIFx1MDAzYyAwKSB7XG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9NTU2ND1zdGF0aWMgaW50IGJwZl9idGZfbG9hZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTAtXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzo1NTkxOlx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTItfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDAxOAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDEyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqTXkgQW5hbHlzaXMgb2YgQlRGIExvYWRpbmcgYW5kIEFzc29jaWF0ZWQgQ2hlY2tzKioKCkFscmlnaHQsIHNvIHRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBsb2FkaW5nIHByb2Nlc3MuIE15IG1lbnRhbCBtb2RlbCBpcyB0cmFjaW5nIHRoZSBmbG93OiBgYnBmX2J0Zl9sb2FkYCBraWNrcyB0aGluZ3Mgb2ZmLCB3aGljaCB0aGVuIGZlZWRzIGludG8gYGJ0Zl9uZXdfZmRgLiBGcm9tIHRoZXJlLCBpdCBkaXZlcyBpbnRvIHRoZSBwYXJzaW5nIHN0YWdlIHdpdGggYGJ0Zl9wYXJzZWAsIHdoaWNoIHNlZW1zIHRvIGJlIHRoZSB3b3JraG9yc2UuCgpXaXRoaW4gYGJ0Zl9wYXJzZWAsIEkgc2VlIHR3byBjcnVjaWFsIHZhbGlkYXRpb24gZnVuY3Rpb25zIGJlaW5nIGNhbGxlZC4gT25lIGlzIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgd2hpY2ggdW5kb3VidGVkbHkgZGVhbHMgd2l0aCB0aGUgY29tcGxleCByZWxhdGlvbnNoaXBzIGFuZCBwb3RlbnRpYWwgbmVzdGVkIG93bmVyc2hpcCBpbXBsaWVkIGJ5IEJURiYjMzk7cyB0eXBlIGluZm9ybWF0aW9uLiBJdCBsb29rcyBsaWtlIGBidGZfb3duZXJzaGlwX2RlcHRoYCBhbmQgYGJ0Zl9vd25lZF90eXBlX2lkeGAgYXJlIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB3aXRoaW4gdGhpcyBvd25lcnNoaXAgY2hlY2suCgpDcnVjaWFsbHksIGl0IGlzIGFsc28gY2FsbGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIHdpdGhpbiBgYnRmX3BhcnNlYCwgbWVhbmluZyB0aGF0IGFzIHR5cGVzIGFyZSBwYXJzZWQgYW5kIGluc3BlY3RlZCwgYW55IGlzc3VlcyB3aXRoIHN0cnVjdCBvciB1bmlvbiBmaWVsZHMgd2lsbCBhbHNvIGJlIGRlYWx0IHdpdGguIEFuZCBvZiBjb3Vyc2UsIHRoZXJlJiMzOTtzIGBtYXBfY2hlY2tfYnRmYCB3aGljaCB3aWxsIGhhbmRsZSBhbnkgQlRGIGlzc3VlcyBmb3IgbWFwcy4KCk5vdywgSSYjMzk7bSB0aGlua2luZyBhYm91dCBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIGNvbmZpZ3VyYXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgc2V0dGluZ3MgZm9yIGBrZXJuZWwvYnBmL2J0Zi5jYCB0byB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIEJURiBzdXBwb3J0IGlzIGVuYWJsZWQuIEFuZCB0aGUgYE1ha2VmaWxlYCBpbiBga2VybmVsL2JwZi9gIHdpbGwgdGVsbCBtZSBob3cgdGhlc2UgbW9kdWxlcyBhcmUgYnVpbHQgYW5kIGxpbmtlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgYXJlIGFueSBzcGVjaWZpYyBvcHRpb25zIG9yIG1vZHVsZXMgdGhhdCB0aGlzIEJURiBoYW5kbGluZyBkZXBlbmRzIG9uLiBUaGlzIGlzIGEgY29tbW9uIHByYWN0aWNlIHdoZW4gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBvZiBhbnkga2VybmVsIGZlYXR1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0ZlxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL01ha2VmaWxlPTEzPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9sb2NhbF9zdG9yYWdlLm8gYnBmX3Rhc2tfc3RvcmFnZS5vXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE0Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGZpeHVwcy5vIGNmZy5vIHN0YXRlcy5vIGJhY2t0cmFjay5vIGNoZWNrX2J0Zi5vXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE1LW9iai0ke0NPTkZJR19CUEZfTFNNfVx0ICAmIzQzOz0gYnBmX2lub2RlX3N0b3JhZ2Uub1xuLS1cbmtlcm5lbC9icGYvTWFrZWZpbGU9MTc9b2JqLSQoQ09ORklHX0JQRl9KSVQpICYjNDM7PSB0cmFtcG9saW5lLm9cbmtlcm5lbC9icGYvTWFrZWZpbGU6MTg6b2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnRmLm8gbWVtYWxsb2MubyBycXNwaW5sb2NrLm8gc3RyZWFtLm9cbmtlcm5lbC9icGYvTWFrZWZpbGUtMTktaWZlcSAoJChDT05GSUdfTU1VKSQoQ09ORklHXzY0QklUKSx5eSlcbi0tXG5rZXJuZWwvYnBmL01ha2VmaWxlPTQzPWlmZXEgKCQoQ09ORklHX1NZU0ZTKSx5KVxua2VybmVsL2JwZi9NYWtlZmlsZTo0NDpvYmotJChDT05GSUdfREVCVUdfSU5GT19CVEYpICYjNDM7PSBzeXNmc19idGYub1xua2VybmVsL2JwZi9NYWtlZmlsZS00NS1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDgyMgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4YW1pbmluZyB0aGUgQlBGIFN5c2NhbGwgQ29tcGlsYXRpb24qKgoKT2theSwgc28gSSBzZWUgdGhpcyBsaW5lOiBgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnRmLm9gLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzIHRvIGltbWVkaWF0ZWx5IGRpc3NlY3Qgd2hhdCYjMzk7cyBnb2luZyBvbi4gVGhpcyB0ZWxscyB0aGUgYnVpbGQgc3lzdGVtIHRoYXQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIGVuYWJsZWQsIHRoZW4gYGJ0Zi5vYCBzaG91bGQgYmUgY29tcGlsZWQgYW5kIGxpbmtlZC4gVGhhdCYjMzk7cyBwcmV0dHkgc3RhbmRhcmQsIGJ1dCB0aGUga2V5IGlzIHRoYXQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgYENPTkZJR19CUEZfU1lTQ0FMTGAuCgpTbywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcy4gSSBuZWVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgYEJQRl9TWVNDQUxMYC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3Igd2hlcmUgdGhpcyBvcHRpb24gaXMgZGVmaW5lZCwgaXRzIGRlZmF1bHQgdmFsdWUgKGlmIGFueSksIHdoYXQgZGVwZW5kZW5jaWVzIGl0IGhhcywgYW5kIG1vc3QgaW1wb3J0YW50bHksIHdoYXQgaXQgKm1lYW5zKiBpbiB0aGUgYnJvYWRlciBjb250ZXh0IG9mIEJQRiBhbmQgdGhlIGtlcm5lbC4gSXMgdGhpcyByZWxhdGVkIHRvIHRoZSBCUEYgc3lzdGVtIGNhbGwgaXRzZWxmPyBEb2VzIGl0IGVuYWJsZSBleHRlbnNpb25zLCBvciBwZXJoYXBzIHNwZWNpZmljIGZlYXR1cmVzIGxpa2UgQlRGIGdlbmVyYXRpb24gb3IgdXNhZ2Ugb2YgQlBGIHByb2dyYW1zIHdpdGggc3lzY2FsbHM/IFRoYXQmIzM5O3Mgd2hhdCBJIGhhdmUgdG8gZmlndXJlIG91dCB0byB1bmRlcnN0YW5kIHRoZSBpbXBhY3Qgb2YgdGhpcyBidWlsZCBydWxlLiBVbmRlcnN0YW5kaW5nIHRoZSBjb250ZXh0IG9mIHRoYXQgS2NvbmZpZyBvcHRpb24gd2lsbCB0ZWxsIG1lIHRoZSBzaWduaWZpY2FuY2Ugb2YgYGJ0Zi5vYCYjMzk7cyBjb21waWxhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMjMxCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipFeGFtaW5pbmcgQlBGIEtlcm5lbCBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqCgpPa2F5LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgQlBGIGNvbmZpZ3VyYXRpb24uIEkga25vdyBga2VybmVsL2JwZi9LY29uZmlnYCBpcyB1c3VhbGx5IHRoZSBwbGFjZSBmb3IgdGhlc2Ugc29ydHMgb2YgZGVjbGFyYXRpb25zLCBzbyB0aGF0JiMzOTtzIHdoZXJlIEkgc2hvdWxkIHN0YXJ0LiBJJiMzOTttIHRoaW5raW5nIGFyb3VuZCBsaW5lIDMxIGlzIGxpa2VseSBhIGdvb2QgcGxhY2UgdG8gbG9vayDigJMgdGhhdCYjMzk7cyBvZnRlbiB3aGVyZSB0aGUgY29yZSBvciBkZWZhdWx0IG9wdGlvbnMgcmVzaWRlLiBMZXQmIzM5O3MgZGlnIGluIHRoZXJlIGFuZCBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSBleHBlY3QgdG8gc2VlIHRoZSB0eXBpY2FsIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIGxpbmtpbmcgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIG90aGVyIGtlcm5lbCBmZWF0dXJlcy4gTXkgZ29hbCBpcyB0byBtYXAgb3V0IHdoaWNoIHByZXJlcXVpc2l0ZXMgYXJlIHJlcXVpcmVkIGZvciBpdCB0byBiZSBlbmFibGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMjk6XHRtZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbiAgMzA6XHRcbiAgMzE6XHRjb25maWcgQlBGX1NZU0NBTExcbiAgMzI6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4gIDMzOlx0XHRzZWxlY3QgQlBGXG4gIDM0Olx0XHRzZWxlY3QgSVJRX1dPUktcbiAgMzU6XHRcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxuICAzNjpcdFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxuICAzNzpcdFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcbiAgMzg6XHRcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXG4gIDM5Olx0XHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcbiAgNDA6XHRcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXG4gIDQxOlx0XHRkZWZhdWx0IG5cbiAgNDI6XHRcdGhlbHBcbiAgNDM6XHRcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xuICA0NDpcdFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cbiAgNDU6XHRcbiAgNDY6XHRjb25maWcgQlBGX0pJVFxuICA0NzpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIEp1c3QgSW4gVGltZSBjb21waWxlclwmIzM0O1xuICA0ODpcdFx0ZGVwZW5kcyBvbiBCUEZcbiAgNDk6XHRcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXG4gIDUwOlx0XHRzZWxlY3QgRVhFQ01FTVxuICA1MTpcdFx0aGVscFxuICA1MjpcdFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXG4gIDUzOlx0XHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxuICA1NDpcdFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXG4gIDU1Olx0XHQgIHByb2dyYW1zLlxuICA1NjpcdFxuICA1NzpcdFx0ICBOb3RlLCBhbiBhZG1pbiBzaG91bGQgZW5hYmxlIHRoaXMgZmVhdHVyZSBjaGFuZ2luZzpcbiAgNTg6XHRcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfZW5hYmxlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxODQ0CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjA3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkJQRiAmYW1wOyBCVEYgRGVwZW5kZW5jeSBEZWVwIERpdmUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhlIGtlcm5lbCBidWlsZCBjb25maWd1cmF0aW9uLCBzcGVjaWZpY2FsbHkgYXJvdW5kIEJQRiBhbmQgQlRGLiBNeSBpbml0aWFsIHVuZGVyc3RhbmRpbmcgd2FzIHRoYXQgYEJQRl9TWVNDQUxMYCB3YXMgZmFpcmx5IGlzb2xhdGVkLCBtYXliZSBqdXN0IGRlcGVuZGVudCBvbiB0aGUgYXJjaGl0ZWN0dXJlIG9yIGEgcGFyZW50IG1lbnUuIEl0ICpzZWxlY3RzKiB0aGluZ3MgbGlrZSBCUEYgY29yZSBmZWF0dXJlcywgYElSUV9XT1JLYCwgYW5kIHN1Y2guIEJ1dCBJJiMzOTttIHN0YXJ0aW5nIHRvIHdvbmRlciBhYm91dCB0aGUgQlRGIGNvbXBpbGF0aW9uIHBhdGgsIGFuZCB3aGV0aGVyIGl0JiMzOTtzIHVuY29uZGl0aW9uYWxseSBidWlsdCB3aGVuIGBCUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZC4KClJpZ2h0LCBsZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBga2VybmVsL2JwZi9NYWtlZmlsZWAuIEFoLCB0aGVyZSBpdCBpcyBvbiBsaW5lIDE4OiBgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnRmLm8gbWVtYWxsb2MubyBycXNwaW5sb2NrLm8gc3RyZWFtLm9gLiBTbywgKnllcyosIGVuYWJsaW5nIGBCUEZfU1lTQ0FMTGAgKmRvZXMqIGNvbXBpbGUgYGJ0Zi5vYC4gTm8gc3VycHJpc2VzIHRoZXJlLCByZWFsbHksIGJ1dCBnb29kIHRvIGhhdmUgY29uZmlybWVkIGl0IGRlZmluaXRpdmVseS4KCk5vdywgYSBtb3JlIG51YW5jZWQgcXVlc3Rpb246IERvZXMgQlRGICpyZXF1aXJlKiBgREVCVUdfSU5GT19CVEZgPyBJcyB0aGF0IGEgaGFyZCBkZXBlbmRlbmN5LCBvciBpcyBpdCBhIGNvbmRpdGlvbmFsIGJ1aWxkLXRpbWUgcmVxdWlyZW1lbnQ/IERvZXMgYGJ0Zl9wYXJzZWAgb3IgYW55IG9mIHRoZSBCUEYgQlRGIGxvYWRpbmcgbWVjaGFuaXNtcyBoYXZlIGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdGhhdCBpcyBkZXBlbmRlbnQgb24gYERFQlVHX0lORk9fQlRGYD8KCkkmIzM5O2xsIHF1ZXJ5IGBncmVwcGVyYCBhbmQgc2VlIGhvdyBgREVCVUdfSU5GT19CVEZgIGlzIHVzZWQgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgZmluYWwgYW5zd2VyLiBHb3R0YSBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBvcHRpbWl6ZWQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcbmtlcm5lbC9icGYvTWFrZWZpbGU6NDQ6b2JqLSQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSAmIzQzOz0gc3lzZnNfYnRmLm9cbmtlcm5lbC9icGYvTWFrZWZpbGUtNDUtZW5kaWZcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY0NTQ9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV9iYXNlKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUsXG4tLVxua2VybmVsL2JwZi9idGYuYy02NDU5LVxua2VybmVsL2JwZi9idGYuYzo2NDYwOlx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NjEtXHRcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjU0MD1fX3UzMiBidGZfcmVsb2NhdGVfaWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBfX3UzMiBpZClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NDYtXG5rZXJuZWwvYnBmL2J0Zi5jOjY1NDc6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NDgtXG5rZXJuZWwvYnBmL2J0Zi5jPTY1NDk9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIGNvbnN0IHZvaWQgKmRhdGEsXG4tLVxua2VybmVsL2JwZi9idGYuYy02NjQ0LVxua2VybmVsL2JwZi9idGYuYzo2NjQ1OiNlbmRpZiAvKiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUyAqL1xua2VybmVsL2JwZi9idGYuYy02NjQ2LVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODYyMj1lbnVtIHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg2MjUtXG5rZXJuZWwvYnBmL2J0Zi5jOjg2MjY6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTg2Mjctc3RydWN0IGJ0Zl9tb2R1bGUge1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODc2ND1mc19pbml0Y2FsbChidGZfbW9kdWxlX2luaXQpO1xua2VybmVsL2JwZi9idGYuYzo4NzY1OiNlbmRpZiAvKiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUyAqL1xua2VybmVsL2JwZi9idGYuYy04NzY2LVxua2VybmVsL2JwZi9idGYuYz04NzY3PXN0cnVjdCBtb2R1bGUgKmJ0Zl90cnlfZ2V0X21vZHVsZShjb25zdCBzdHJ1Y3QgYnRmICpidGYpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NzY5LVx0c3RydWN0IG1vZHVsZSAqcmVzID0gTlVMTDtcbmtlcm5lbC9icGYvYnRmLmM6ODc3MDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODc3MS1cdHN0cnVjdCBidGZfbW9kdWxlICpidGZfbW9kLCAqdG1wO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODc5Nz1zdHJ1Y3QgYnRmICpidGZfZ2V0X21vZHVsZV9idGYoY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kdWxlKVxua2VybmVsL2JwZi9idGYuYy04Nzk4LXtcbmtlcm5lbC9icGYvYnRmLmM6ODc5OTojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODgwMC1cdHN0cnVjdCBidGZfbW9kdWxlICpidGZfbW9kLCAqdG1wO1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtODgxMC1cbmtlcm5lbC9icGYvYnRmLmM6ODgxMTojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODgxMi1cdG11dGV4X2xvY2soXHUwMDI2YnRmX21vZHVsZV9tdXRleCk7XG4tLVxua2VybmVsL2JwZi9idGYuYz04ODI3PXN0YXRpYyBpbnQgY2hlY2tfYnRmX2tjb25maWdzKGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgY29uc3QgY2hhciAqZmVhdHVyZSlcbmtlcm5lbC9icGYvYnRmLmMtODgyOC17XG5rZXJuZWwvYnBmL2J0Zi5jOjg4Mjk6XHRpZiAoIW1vZHVsZSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKSB7XG5rZXJuZWwvYnBmL2J0Zi5jLTg4MzAtXHRcdHByX2VycihcJiMzNDttaXNzaW5nIHZtbGludXggQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXG5cJiMzNDssIGZlYXR1cmUpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtODgzMi1cdH1cbmtlcm5lbC9icGYvYnRmLmM6ODgzMzpcdGlmIChtb2R1bGUgXHUwMDI2XHUwMDI2IElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVMpKVxua2VybmVsL2JwZi9idGYuYy04ODM0LVx0XHRwcl93YXJuKFwmIzM0O21pc3NpbmcgbW9kdWxlIEJURiwgY2Fubm90IHJlZ2lzdGVyICVzXFxuXCYjMzQ7LCBmZWF0dXJlKTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg5NzU9c3RhdGljIGludCBidGZfY2hlY2tfa2Z1bmNfbmFtZShzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgdTMyIGtpbmQpXG5rZXJuZWwvYnBmL2J0Zi5jLTg5NzYte1xua2VybmVsL2JwZi9idGYuYzo4OTc3OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04OTc4LVx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XG4tLVxua2VybmVsL2JwZi9idGYuYy04OTkxLVxua2VybmVsL2JwZi9idGYuYzo4OTkyOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04OTkzLVx0Z3VhcmQobXV0ZXgpKFx1MDAyNmJ0Zl9tb2R1bGVfbXV0ZXgpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9OTY0MD1zdGF0aWMgc3RydWN0IGJwZl9jYW5kX2NhY2hlICpwb3B1bGF0ZV9jYW5kX2NhY2hlKHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqY2FuZHMsXG4tLVxua2VybmVsL2JwZi9idGYuYy05NjY3LVxua2VybmVsL2JwZi9idGYuYzo5NjY4OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy05NjY5LXN0YXRpYyB2b2lkIF9fcHVyZ2VfY2FuZF9jYWNoZShzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqKmNhY2hlLFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yODQ5PWludCBicGZfYWRkX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGZ1bmNfaWQsIHUxNiBvZmZzZXQpXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NjUtXHRcdGlmICghYnRmX3ZtbGludXgpIHtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyODY2Olx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtjYWxsaW5nIGtlcm5lbCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgQ09ORklHX0RFQlVHX0lORk9fQlRGXFxuXCYjMzQ7KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yODY3LVx0XHRcdHJldHVybiAtRU5PVFNVUFA7XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTYyMzA9c3RhdGljIGludCBjaGVja19wdHJfdG9fbWFwX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjQ0LVx0aWYgKCFidGZfdm1saW51eCkge1xua2VybmVsL2JwZi92ZXJpZmllci5jOjYyNDU6XHRcdHZlcmJvc2UoZW52LCBcJiMzNDttYXBfcHRyIGFjY2VzcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgQ09ORklHX0RFQlVHX0lORk9fQlRGXFxuXCYjMzQ7KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjQ2LVx0XHRyZXR1cm4gLUVOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTA2OD1zdGF0aWMgaW50IGNoZWNrX3BzZXVkb19idGZfaWQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTkwODQtXHRcdGlmICghYnRmX3ZtbGludXgpIHtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTA4NTpcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7a2VybmVsIGlzIG1pc3NpbmcgQlRGLCBtYWtlIHN1cmUgQ09ORklHX0RFQlVHX0lORk9fQlRGPXkgaXMgc3BlY2lmaWVkIGluIEtjb25maWcuXFxuXCYjMzQ7KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTA4Ni1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjA5Nzk9c3RydWN0IGJ0ZiAqYnBmX2dldF9idGZfdm1saW51eCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4My1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyMDk4NDpcdGlmICghYnRmIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpIHtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4NS1cdFx0bXV0ZXhfbG9jayhcdTAwMjZidGZfdm1saW51eF9sb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQzNjgKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQlRGIFBhcnNpbmcgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhpcyBCVEYgcGFyc2luZyByb3V0aW5lLCBzcGVjaWZpY2FsbHkgYGJ0Zl9wYXJzZSgpYC4gSSBrbm93IHdlICpkb24mIzM5O3QqIG5lZWQgYERFQlVHX0lORk9fQlRGYCBmb3IgaXQsIHdoaWNoIGlzIGdvb2QuIEJ1dCBJIG5lZWQgdG8gbmFpbCBkb3duIHdoZXRoZXIgaXQgcmVsaWVzIG9uIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2Agb3IgbWF5YmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8ga3B0ciwgbGlzdF9oZWFkLCBvciByYl9yb290LiBJIHRoaW5rIEkgd2lsbCBzdGFydCBieSBmb2N1c2luZyBvbiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBUaGVuLCBJJiMzOTtsbCBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCBgYnRmX2ZpbmRfc3RydWN0X21ldGFgIGFuZCBgYnRmX3BhcnNlX3N0cnVjdF9tZXRhc2AgdG8gdW5kZXJzdGFuZCBob3cgdGhleSBhcmUgaW52b2x2ZWQuIFRoZSBuZXh0IG9idmlvdXMgc3RlcCBpcyB0byBmaWd1cmUgb3V0IHdoZXJlIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAgbGl2ZXMgYW5kIGhvdyBpdCYjMzk7cyBhY3R1YWxseSAqdXNlZCouIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBwcmV0dHkgY2xlYXIgcGljdHVyZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9maW5kX3N0cnVjdF9tZXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYz00MjgzPWludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4tLVxua2VybmVsL2JwZi9idGYuYy00MzE2LVx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xua2VybmVsL2JwZi9idGYuYzo0MzE3Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzE4LVx0XHRpZiAoIW1ldGEpXG4tLVxua2VybmVsL2JwZi9idGYuYz00MzI1PXN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNDAtXG5rZXJuZWwvYnBmL2J0Zi5jOjQzNDE6XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzQyLVx0aWYgKCFtZXRhKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTg0ND1idGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0Zilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjQtXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NjU6c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxua2VybmVsL2JwZi9idGYuYy01OTY2LXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTc0NDg9aW50IGJ0Zl9zdHJ1Y3RfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csXG4tLVxua2VybmVsL2JwZi9idGYuYy03NDY0LVxua2VybmVsL2JwZi9idGYuYzo3NDY1Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBpZCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjYtXHRcdGlmICghbWV0YSlcbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYz04MTQ9dm9pZCBicGZfb2JqX2ZyZWVfZmllbGRzKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iailcbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy04NTAtXHRcdFx0aWYgKCFidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSkge1xua2VybmVsL2JwZi9zeXNjYWxsLmM6ODUxOlx0XHRcdFx0cG9pbnRlZV9zdHJ1Y3RfbWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGZpZWxkLVx1MDAzZWtwdHIuYnRmLFxua2VybmVsL2JwZi9zeXNjYWxsLmMtODUyLVx0XHRcdFx0XHRcdFx0XHRcdCAgIGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkKTtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9Mzc2PXN0YXRpYyBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVnX2J0Zl9yZWNvcmQoY29uc3Qgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMzgzLVx0fSBlbHNlIGlmICh0eXBlX2lzX3B0cl9hbGxvY19vYmoocmVnLVx1MDAzZXR5cGUpKSB7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6Mzg0Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEocmVnLVx1MDAzZWJ0ZiwgcmVnLVx1MDAzZWJ0Zl9pZCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMzg1LVx0XHRpZiAobWV0YSlcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9NDY3Nj1zdGF0aWMgc3RydWN0IGJ0Zl9yZWNvcmQgKmtwdHJfcG9pbnRlZV9idGZfcmVjb3JkKHN0cnVjdCBidGZfZmllbGQgKmtwdHJfZmllbGQpXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTQ2ODItXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6NDY4MzpcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShrcHRyX2ZpZWxkLVx1MDAzZWtwdHIuYnRmLFxua2VybmVsL2JwZi92ZXJpZmllci5jLTQ2ODQtXHRcdFx0XHQgICAga3B0cl9maWVsZC1cdTAwM2VrcHRyLmJ0Zl9pZCk7XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTEzODcyPXN0YXRpYyBpbnQgY2hlY2tfc3BlY2lhbF9rZnVuYyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTM4LVxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTM5Olx0XHRzdHJ1Y3RfbWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKHJldF9idGYsIHJldF9idGZfaWQpO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTQwLVx0XHRpZiAoaXNfYnBmX3BlcmNwdV9vYmpfbmV3X2tmdW5jKG1ldGEtXHUwMDNlZnVuY19pZCkpIHtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTM5NjctXHRcdGluc25fYXV4LVx1MDAzZWtwdHJfc3RydWN0X21ldGEgPVxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTY4Olx0XHRcdGJ0Zl9maW5kX3N0cnVjdF9tZXRhKG1ldGEtXHUwMDNlYXJnX2J0Zixcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xMzk2OS1cdFx0XHRcdFx0ICAgICBtZXRhLVx1MDAzZWFyZ19idGZfaWQpO1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xNDA0Mz1zdGF0aWMgaW50IGNoZWNrX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDE0OS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNDE1MDpcdFx0c3RydWN0X21ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShtZXRhLmFyZ19idGYsIG1ldGEuYXJnX2J0Zl9pZCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTQxNTEtXHRcdGlmIChzdHJ1Y3RfbWV0YSBcdTAwMjZcdTAwMjYgYnRmX3JlY29yZF9oYXNfbm1pX3Vuc2FmZV9maWVsZHMoc3RydWN0X21ldGEtXHUwMDNlcmVjb3JkKSkge1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDI2My1cdFx0aW5zbl9hdXgtXHUwMDNlaW5zZXJ0X29mZiA9IHJlZ3NbQlBGX1JFR18yXS52YXJfb2ZmLnZhbHVlO1xua2VybmVsL2JwZi92ZXJpZmllci5jOjE0MjY0Olx0XHRpbnNuX2F1eC1cdTAwM2VrcHRyX3N0cnVjdF9tZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEobWV0YS5hcmdfYnRmLCBtZXRhLmFyZ19idGZfaWQpO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTE0MjY1LVx0XHRyZWZfY29udmVydF9vd25pbmdfbm9uX293bmluZyhlbnYsIGlkKTtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTQ0NzEtXHRcdFx0XHRpbnNuX2F1eC1cdTAwM2VrcHRyX3N0cnVjdF9tZXRhID1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNDQ3MjpcdFx0XHRcdFx0YnRmX2ZpbmRfc3RydWN0X21ldGEobWV0YS5hcmdfYnRmLFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE0NDczLVx0XHRcdFx0XHRcdFx0ICAgICBtZXRhLmFyZ19idGZfaWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjIzOQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIEJURiBTdHJ1Y3R1cmUgTWV0YWRhdGEgUGFyc2luZyoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIGBidGZfcGFyc2Vfc3RydWN0X21ldGFzYC4gTXkgaW5pdGlhbCBodW5jaCBpcyB0aGF0IGl0JiMzOTtzIGdvaW5nIHRvIGJlIHRoZSBjZW50cmFsIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBhY3R1YWxseSBleHRyYWN0aW5nIHRoZSBzdHJ1Y3R1cmUgbWV0YWRhdGEgZnJvbSB0aGUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIGRhdGEgaW4gYGtlcm5lbC9icGYvYnRmLmNgLiBHaXZlbiB0aGF0IEJURiBpcyB0aGUgZm91bmRhdGlvbiBmb3IgZW5oYW5jZWQgZGVidWdnaW5nIGFuZCBpbnRyb3NwZWN0aW9uIG9mIEJQRiBwcm9ncmFtcywgYSBkZWVwZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIHN0cnVjdHVyZSBtZXRhZGF0YSBpcyBoYW5kbGVkIGlzIGNydWNpYWwuIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGludm9sdmUgc29tZSBjbGV2ZXIgcG9pbnRlciBhcml0aG1ldGljLCBiaXRmaWVsZCBpbnRlcnByZXRhdGlvbiwgYW5kIHBvdGVudGlhbCB1c2Ugb2YgaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVjdXJzaXZlIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHVyZXMgYW5kIHVuaW9ucy4gSSYjMzk7bSBleHBlY3Rpbmcgc29tZSBlcnJvciBoYW5kbGluZyBhcm91bmQgbWFsZm9ybWVkIEJURiBkYXRhLCBhbmQgcHJvYmFibHkgc29tZSBjaGVja3MgZm9yIGFsaWdubWVudCBjb25zdHJhaW50cywgZXNwZWNpYWxseSBjb25zaWRlcmluZyBob3cgQlBGIHdvcmtzLiBJdCYjMzk7bGwgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGhvdyBpdCByZWNvbmNpbGVzIHRoZSBCVEYgaW5mb3JtYXRpb24gd2l0aCB0aGUgY3VycmVudCBrZXJuZWwmIzM5O3MgZGF0YSBsYXlvdXQuIEkmIzM5O20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGhhbmRsZXMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgYW5kIGFueSBwb3RlbnRpYWwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGluIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gTGV0JiMzOTtzIHNlZSBpZiBteSBwcmVsaW1pbmFyeSBhc3N1bXB0aW9ucyBhcmUgb24gdGhlIG1vbmV5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1ODQ0LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzU4NDQ6XHRidGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0ZilcbjU4NDU6XHR7XG41ODQ2Olx0XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiID0gTlVMTDtcbjU4NDc6XHRcdHN0cnVjdCBidGZfaWRfc2V0ICphb2Y7XG41ODQ4Olx0XHRpbnQgaSwgbiwgaWQsIHJldDtcbjU4NDk6XHRcbjU4NTA6XHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnRmX2lkX3NldCwgY250KSAhPSAwKTtcbjU4NTE6XHRcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJ0Zl9pZF9zZXQpICE9IHNpemVvZih1MzIpKTtcbjU4NTI6XHRcbjU4NTM6XHRcdGFvZiA9IGttYWxsb2Nfb2JqKCphb2YsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuNTg1NDpcdFx0aWYgKCFhb2YpXG41ODU1Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuNTg1NjpcdFx0YW9mLVx1MDAzZWNudCA9IDA7XG41ODU3Olx0XG41ODU4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGFsbG9jX29ial9maWVsZHMpOyBpJiM0MzsmIzQzOykge1xuNTg1OTpcdFx0XHQvKiBUcnkgdG8gZmluZCB3aGV0aGVyIHRoaXMgc3BlY2lhbCB0eXBlIGV4aXN0cyBpbiB1c2VyIEJURiwgYW5kXG41ODYwOlx0XHRcdCAqIGlmIHNvIHJlbWVtYmVyIGl0cyBJRCBzbyB3ZSBjYW4gZWFzaWx5IGZpbmQgaXQgYW1vbmcgbWVtYmVyc1xuNTg2MTpcdFx0XHQgKiBvZiBzdHJ1Y3RzIHRoYXQgd2UgaXRlcmF0ZSBpbiB0aGUgbmV4dCBsb29wLlxuNTg2MjpcdFx0XHQgKi9cbjU4NjM6XHRcdFx0c3RydWN0IGJ0Zl9pZF9zZXQgKm5ld19hb2Y7XG41ODY0Olx0XG41ODY1Olx0XHRcdGlkID0gYnRmX2ZpbmRfYnlfbmFtZV9raW5kKGJ0ZiwgYWxsb2Nfb2JqX2ZpZWxkc1tpXSwgQlRGX0tJTkRfU1RSVUNUKTtcbjU4NjY6XHRcdFx0aWYgKGlkIFx1MDAzYyAwKVxuNTg2NzpcdFx0XHRcdGNvbnRpbnVlO1xuNTg2ODpcdFxuNTg2OTpcdFx0XHRuZXdfYW9mID0ga3JlYWxsb2MoYW9mLCBzdHJ1Y3Rfc2l6ZShuZXdfYW9mLCBpZHMsIGFvZi1cdTAwM2VjbnQgJiM0MzsgMSksXG41ODcwOlx0XHRcdFx0XHQgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbjU4NzE6XHRcdFx0aWYgKCFuZXdfYW9mKSB7XG41ODcyOlx0XHRcdFx0cmV0ID0gLUVOT01FTTtcbjU4NzM6XHRcdFx0XHRnb3RvIGZyZWVfYW9mO1xuNTg3NDpcdFx0XHR9XG41ODc1Olx0XHRcdGFvZiA9IG5ld19hb2Y7XG41ODc2Olx0XHRcdGFvZi1cdTAwM2VpZHNbYW9mLVx1MDAzZWNudCYjNDM7JiM0MztdID0gaWQ7XG41ODc3Olx0XHR9XG41ODc4Olx0XG41ODc5Olx0XHRuID0gYnRmX25yX3R5cGVzKGJ0Zik7XG41ODgwOlx0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOykge1xuNTg4MTpcdFx0XHQvKiBUcnkgdG8gZmluZCBpZiB0aGVyZSBhcmUga3B0cnMgaW4gdXNlciBCVEYgYW5kIHJlbWVtYmVyIHRoZWlyIElEICovXG41ODgyOlx0XHRcdHN0cnVjdCBidGZfaWRfc2V0ICpuZXdfYW9mO1xuNTg4MzpcdFx0XHRzdHJ1Y3QgYnRmX2ZpZWxkX2luZm8gdG1wO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzI1MAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDc4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgQlRGIExvYWRpbmcgYW5kIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byBob3cgYGFsbG9jX29ial9maWVsZHNgIHdvcmtzIGFuZCBob3cgQlRGIGxvYWRpbmcgcGxheXMgYSByb2xlLiBJdCBsb29rcyBsaWtlIHdoZW4gYSBCVEYgYmxvYiBpcyBsb2FkZWQgdXNpbmcgYGJwZihCUEZfQlRGX0xPQUQsIC4uLilgLCB0aGUga2VybmVsIGNhbGxzIGBidGZfcGFyc2UoKWAuIFdpdGhpbiBgYnRmX3BhcnNlKClgLCBgYnRmX3BhcnNlX3N0cnVjdF9tZXRhcygpYCBydW5zIG9uIHRoZSB1c2VyLXByb3ZpZGVkIEJURiBkYXRhLiBUaGF0JiMzOTtzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIElmIHN0cnVjdCBtZXRhZGF0YSBpcyBmb3VuZCwgdGhlIGNvZGUgaXRlcmF0ZXMgdGhyb3VnaCBpdCwgY2FsbGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoKWAgYW5kIHRoZW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAuCgpJIHNlZSB0aGF0IHRoZSBgbG9jYWxfa3B0cl9vd25lcnNoaXAuY2Agc2VsZnRlc3QgZGVtb25zdHJhdGVzIHRoaXMgZXhhY3QgZmxvdy4gSXQgY3JlYXRlcyBhbiBlbXB0eSBCVEYsIGFkZHMgZGlmZmVyZW50IHR5cGVzIChpbnQsIGJwZl9zcGluX2xvY2ssIGJwZl9saXN0X2hlYWQsIGV0Yy4pLCBhbmQgbG9hZHMgaXQgd2l0aCBgYnRmX19sb2FkX2ludG9fa2VybmVsKClgLCB3aGljaCB0cmlnZ2VycyB0aGF0IGBicGYoQlBGX0JURl9MT0FELCAuLi4pYCBjYWxsLCB1bHRpbWF0ZWx5IGhpdHRpbmcgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAuCgpOb3csIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS4gQ2xlYXJseSwgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgZXNzZW50aWFsLiBCdXQgZG9lcyBgQlBGX1NZU0NBTExgIGhhdmUgYW55IGRlcGVuZGVuY2llcz8gTGV0IG1lIGNoZWNrIHRoZSBga2VybmVsL2JwZi9LY29uZmlnYC4gQWgsIGBCUEZfU1lTQ0FMTGAgc2VsZWN0cyBgQlBGYC4gTm8gZGlyZWN0IGBkZXBlbmRzIG9uYCB0aG91Z2guCgpXaGF0IGFib3V0IGBERUJVR19JTkZPX0JURmA/IElzIHRoYXQgbmVjZXNzYXJ5IGZvciBgQlBGX0JURl9MT0FEYD8gTGV0IG1lIGxvb2sgYXQgYGJwZl9idGZfbG9hZGAgaW4gYGtlcm5lbC9icGYvc3lzY2FsbC5jYC4gSXQgZ29lcyB0byBgYnRmX25ld19mZCgpYCB0aGVuIHRvIGBidGZfcGFyc2UoKWAuIFRoZSBgYnRmX3BhcnNlYCBmdW5jdGlvbiBkb2VzbiYjMzk7dCBzZWVtIHRvIGNoZWNrIGZvciBgQ09ORklHX0RFQlVHX0lORk9fQlRGYC4gIEludGVyZXN0aW5nLiBBbHRob3VnaCBjb21tb25seSBlbmFibGVkIGZvciBCUEYgZnV6emluZywgaXQgc2VlbXMgc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgY3JpdGljYWwgY29uZmlnLCBhcyBpdCBidWlsZHMgYGJ0Zi5jYC4KCkkmIzM5O2xsIGRvdWJsZS1jaGVjayB0byBlbnN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgY29uZmlncyBuZWVkZWQuIElzIGBCUEZfU1lTQ0FMTGAgcGFydCBvZiBhICYjMzQ7QlBGIHN1YnN5c3RlbSYjMzQ7IG1lbnUsIGFzIHRoYXQgaXMgc29tZXRpbWVzIGEgZmFjdG9yPyBJJiMzOTtsbCBjaGVjayBga2VybmVsL2JwZi9LY29uZmlnYCwgc3RhcnRpbmcgYXQgdGhlIHRvcC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRcbiAgIDM6XHQjIEJQRiBpbnRlcnByZXRlciB0aGF0LCBmb3IgZXhhbXBsZSwgY2xhc3NpYyBzb2NrZXQgZmlsdGVycyBkZXBlbmQgb24uXG4gICA0Olx0Y29uZmlnIEJQRlxuICAgNTpcdFx0Ym9vbFxuICAgNjpcdFx0c2VsZWN0IENSWVBUT19MSUJfU0hBMjU2XG4gICA3Olx0XG4gICA4Olx0IyBVc2VkIGJ5IGFyY2hzIHRvIHRlbGwgdGhhdCB0aGV5IHN1cHBvcnQgQlBGIEpJVCBjb21waWxlciBwbHVzIHdoaWNoXG4gICA5Olx0IyBmbGF2b3VyLiBPbmx5IG9uZSBvZiB0aGUgdHdvIGNhbiBiZSBzZWxlY3RlZCBmb3IgYSBzcGVjaWZpYyBhcmNoIHNpbmNlXG4gIDEwOlx0IyBlQlBGIEpJVCBzdXBlcnNlZGVzIHRoZSBjQlBGIEpJVC5cbiAgMTE6XHRcbiAgMTI6XHQjIENsYXNzaWMgQlBGIEpJVCAoY0JQRilcbiAgMTM6XHRjb25maWcgSEFWRV9DQlBGX0pJVFxuICAxNDpcdFx0Ym9vbFxuICAxNTpcdFxuICAxNjpcdCMgRXh0ZW5kZWQgQlBGIEpJVCAoZUJQRilcbiAgMTc6XHRjb25maWcgSEFWRV9FQlBGX0pJVFxuICAxODpcdFx0Ym9vbFxuICAxOTpcdFxuICAyMDpcdCMgS0FTQU4gc3VwcG9ydCBmb3IgSklUIGNvbXBpbGVyXG4gIDIxOlx0Y29uZmlnIEhBVkVfRUJQRl9KSVRfS0FTQU5cbiAgMjI6XHRcdGJvb2xcbiAgMjM6XHRcbiAgMjQ6XHQjIFVzZWQgYnkgYXJjaHMgdG8gdGVsbCB0aGF0IHRoZXkgd2FudCB0aGUgQlBGIEpJVCBjb21waWxlciBlbmFibGVkIGJ5XG4gIDI1Olx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cbiAgMjY6XHRjb25maWcgQVJDSF9XQU5UX0RFRkFVTFRfQlBGX0pJVFxuICAyNzpcdFx0Ym9vbFxuICAyODpcdFxuICAyOTpcdG1lbnUgXCYjMzQ7QlBGIHN1YnN5c3RlbVwmIzM0O1xuICAzMDpcdFxuICAzMTpcdGNvbmZpZyBCUEZfU1lTQ0FMTFxuICAzMjpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcJiMzNDtcbiAgMzM6XHRcdHNlbGVjdCBCUEZcbiAgMzQ6XHRcdHNlbGVjdCBJUlFfV09SS1xuICAzNTpcdFx0c2VsZWN0IE5FRURfVEFTS1NfUkNVXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5MDQyCgkJCQkJCQlvdXRwdXQ6IDIwNwoJCQkJCQkJdGhvdWdodHM6IDg5MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGlzIEJQRiBQYXRjaCBmb3IgRnV6emluZyoqCgpBbHJpZ2h0LCBzbyBJJiMzOTt2ZSBnb3QgYSBnb29kIGhhbmRsZSBvbiB0aGlzIHBhdGNoLiBgQlBGX1NZU0NBTExgIGlzIHRoZSBrZXkgY29uZmlndXJhdGlvbiBoZXJlLCB0aGF0JiMzOTtzIHRoZSBkaXJlY3QgY29uZmlnLiBOb3csIGxldCYjMzk7cyBuYWlsIGRvd24gdGhlc2UgRm9jdXNTeW1ib2xzLiBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIG5vbi11YmlxdWl0b3VzIGZ1bmN0aW9ucyB0aGF0IGFyZSAqYWx0ZXJlZCogb3IgKmFkZGVkKiBpbiB0aGlzIHBhdGNoLCBhcyBwZXIgdGhlIGd1aWRlbGluZXMuIEkgbmVlZCB0byBhdm9pZCBsaXN0aW5nIGNvbW1vbiBmdW5jdGlvbnMgdGhhdCB3b3VsZCBqdXN0IGRpbHV0ZSB0aGUgZnV6emluZyBlZmZvcnQuCgpPa2F5LCBsZXQmIzM5O3Mgc2VlLi4uIGxvb2tpbmcgYXQgdGhlIGNvZGUgY2hhbmdlczoKCiogICBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGA6IEFkZGVkLCBzdGF0aWMgaW4gYGJ0Zi5jYC4gWWVwLCB0aGF0JiMzOTtzIHNwZWNpZmljLgoqICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgOiBBZGRlZCwgcmVjdXJzaXZlIHN0YXRpYyBpbiBgYnRmLmNgLiBTb3VuZHMgc3BlY2lmaWMgdG8gdGhpcyBuZXcgbG9naWMuCiogICBgYnRmX293bmVkX3R5cGVfaWR4YDogQWRkZWQsIHN0YXRpYyBpbiBgYnRmLmNgLiBBbm90aGVyIG5ldyBmdW5jdGlvbiByZWxhdGVkIHRvIHRoZSBvd25lcnNoaXAgdHJhY2tpbmcuCiogICBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgOiBNb2RpZmllZCwgbm9uLXN0YXRpYyBpbiBgYnRmLmNgLiBDcnVjaWFsLCB0aGUgY3ljbGUgY2hlY2sgbG9naWMgd2FzIHNpbXBsaWZpZWQgaW4gdGhpcy4KKiAgIGBidGZfcGFyc2VgOiBNb2RpZmllZCwgY2FsbGVyIGluIGBidGYuY2AuIEFkZGVkIGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBEZWZpbml0ZWx5IHJlbGV2YW50LCBzaW5jZSBpdCYjMzk7cyB0aGUgY2FsbGVyLgoqICAgYGJ0Zl9uZXdfZmRgIG9yIGBicGZfYnRmX2xvYWRgOiBUaGUgZW50cnkgcG9pbnQgZm9yIGxvYWRpbmcgQlRGLiBOb3csIHRoYXQmIzM5O3MgYSBrZXkgZW50cnkgcG9pbnQuIExldCYjMzk7cyB1c2UgYGJwZl9idGZfbG9hZGAuCgpTbywgaXQmIzM5O3MgY2xlYXIgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCB3YXMgaW5kZWVkIG1vZGlmaWVkLiBHb29kLiBBbmQgdGhvc2UgdGhyZWUgYWRkZWQgZnVuY3Rpb25zIChgYnRmX293bmVkX3R5cGVfaWR4YCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGApIGFyZSBhbGwgbmV3LCBzbywgdGhleSBhcmUgbm90IHViaXF1aXRvdXMuIGBidGZfcGFyc2VgIGlzIGFsc28gYWRkZWQgYW5kIHJlbGV2YW50IGJlY2F1c2UgaXQgY2FsbHMgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLgoKTm93LCBhY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9ucywgSSBuZWVkIHRvIGZvY3VzIG9uIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgdGhlIG5ldyBsb2dpYyBvciBlbnRyeXBvaW50cy4gVGhlc2UgZnVuY3Rpb25zIGFsbCBmaXQgdGhhdCBiaWxsIHBlcmZlY3RseToKLSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAKLSBgYnRmX293bmVyc2hpcF9kZXB0aGAKLSBgYnRmX293bmVkX3R5cGVfaWR4YAotIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AKLSBgYnBmX2J0Zl9sb2FkYAoKTGV0JiMzOTtzIG1ha2Ugc3VyZSB0aGVzZSBhcmUgdmFsaWQgZnVuY3Rpb24gc3ltYm9sczogWWVzLCBhbGwgb2YgdGhlbSBhcmUgcmVhbCBmdW5jdGlvbiBzeW1ib2xzIGluIGBidGYuY2AgYW5kIGBzeXNjYWxsLmNgLgoKT2theSwgbGV0JiMzOTtzIGRvIGEgZmluYWwgY2hlY2s6IElzIHRoaXMgcGF0Y2ggYFdvcnRoRnV6emluZ2A/IEFic29sdXRlbHkuIEl0JiMzOTtzIG1vZGlmeWluZyBga2VybmVsL2JwZi9idGYuY2AsIGltcGxlbWVudGluZyBhIG5ldyBvd25lcnNoaXAgZ3JhcGggZGVwdGgtY2hlY2tpbmcgYWxnb3JpdGhtIHRvIHByZXZlbnQgY3ljbGVzIHdoZW4gcGFyc2luZyBCVEYgb2JqZWN0cyBsb2FkZWQgdmlhIGBicGYoQlBGX0JURl9MT0FELCAuLi4pYC4gVXNlci1zdXBwbGllZCBCVEYgaW5wdXQsIHJlYWNoYWJsZSBrZXJuZWwgY29kZSwgbm8gc3BlY2lhbCBoYXJkd2FyZS4gVGhpcyBpcyBwcmltZSBmdXp6aW5nIHRlcnJpdG9yeS4KCkFuZCBmaW5hbGx5LCBgRW5hYmxlQ29uZmlnc2A6IGBCUEZfU1lTQ0FMTGAuIFNpbmNlIGBCUEZfU1lTQ0FMTGAgc2VsZWN0cyBgQlBGYCwgaXQmIzM5O3MgZ29vZCBwcmFjdGljZSB0byBlbmFibGUgYm90aCwgYWx0aG91Z2ggaXQmIzM5O3MgcmVkdW5kYW50LgoKU28sIGJlZm9yZSBJIGNhbGwgYHNldC1yZXN1bHRzYCwgbGV0JiMzOTtzIHZlcmlmeToKCiogICBgV29ydGhGdXp6aW5nYDogVHJ1ZQoqICAgYEVuYWJsZUNvbmZpZ3NgOiBgWyYjMzQ7QlBGX1NZU0NBTEwmIzM0O11gCiogICBgRm9jdXNTeW1ib2xzYDogYFsmIzM0O2J0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgmIzM0OywgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssICYjMzQ7YnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMmIzM0OywgJiMzNDticGZfYnRmX2xvYWQmIzM0O11gCiogICBSZWFzb25pbmc6IENvbmNpc2UgYW5kIGNvbXBsZXRlLgoKUmVhZHkgdG8gcm9sbC4gTGV0JiMzOTtzIGludm9rZSBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2JwZl9idGZfbG9hZCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lZF90eXBlX2lkeCYjMzQ7LAogICAgJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7LAogICAgJiMzNDticGZfYnRmX2xvYWQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBleHRlbmRzIEJURiBvd25lcnNoaXAgYW5kIGN5Y2xlIHZhbGlkYXRpb24gYnkgaW50cm9kdWNpbmcgZGVwdGgtYm91bmRlZCBncmFwaCB0cmF2ZXJzYWwgKGJ0Zl9vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgpIHRvIHZhbGlkYXRlIG93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGluIHVzZXItbG9hZGVkIEJURiB0eXBlcyAoc3VjaCBhcyBncmFwaCByb290cyBhbmQga3B0cnMpLiBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBpcyBkaXJlY3RseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBicGYoKSBzeXNjYWxsIChCUEZfQlRGX0xPQUQpLiBGdXp6aW5nIGNhbiB2ZXJpZnkgcmVjdXJzaW9uIGJvdW5kcywgY3ljbGUgZGV0ZWN0aW9uIGNvcnJlY3RuZXNzLCBhbmQgZWRnZSBjYXNlcyBpbiBwYXJzaW5nIGFyYml0cmFyeSB1c2VyLXN1cHBsaWVkIEJURiBkYXRhLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4yOW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4yOW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGRlcHRoIGFuZCBkZXRlY3QgY3ljbGVzIGFjcm9zcyBncmFwaCByb290cyAoYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QpIGFuZCBsb2NhbCBrcHRycyAoQlBGX0tQVFJfUkVGLCBCUEZfS1BUUl9QRVJDUFUpLCBwcmV2ZW50aW5nIGRlZXAga2VybmVsIHJlY3Vyc2lvbiBkdXJpbmcgb2JqZWN0IGNsZWFudXAuXG5cbjEuIE1lbW9yeSBhbGxvY2F0aW9uOiBUaGUgb25seSBkeW5hbWljIGFsbG9jYXRpb24gaW50cm9kdWNlZCBpcyB0aGUgdGVtcG9yYXJ5IGBkZXB0aGAgYXJyYXkgaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAsIHdoaWNoIGlzIGFsbG9jYXRlZCB1c2luZyBga3ZjYWxsb2MoKWAgKGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQpIGFuZCBmcmVlZCB3aXRoIGBrdmZyZWUoKWAgYmVmb3JlIHJldHVybmluZy5cbjIuIExvY2FsIHZhcmlhYmxlcyBhbmQgZmllbGRzOiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBzdHJ1Y3QgZmllbGRzIGluc3BlY3RlZCBvciBwb3B1bGF0ZWQgKGByZXRgLCBgbWF4X2RlcHRoYCwgYGJ0Zl9pZGAsIGBkZXB0aFtpZHhdYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxuNC4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoc3VjaCBhcyBpbmRleGluZyBpc3N1ZXMsIHBvaW50ZXIgYXJpdGhtZXRpYywgb3IgcmVjdXJzaW9uIGxpbWl0cykgd291bGQgYmUgY292ZXJlZCBieSBLQVNBTiBvciBzdGFuZGFyZCBrZXJuZWwgY2hlY2tzLCBub3QgS01TQU4uXG5cblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZjU4NDUyNWY5OTYwMGY2ZjdhZDdiZGI4OWJlYWVjYzVmYjQ4ZGY4MQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDE2OjI4OjMyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmMKaW5kZXggN2RhZjRjMjg2YzliMi4uOTIyMTdhMTRiOWQzZCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9idGYuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2J0Zi5jCkBAIC00Mjg0LDEzICYjNDM7NDI4NCwxMCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKQogewogCWludCBpOwogCi0JLyogVGhlcmUgYXJlIHRocmVlIHR5cGVzIHRoYXQgc2lnbmlmeSBvd25lcnNoaXAgb2Ygc29tZSBvdGhlciB0eXBlOgotCSAqICBrcHRyX3JlZiwgYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QuCi0JICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJiMzOTt0IHN0b3JlCi0JICogcmVmZXJlbmNlcyB0byBwcm9ncmFtIGFsbG9jYXRlZCBsb2NhbCB0eXBlcy4KLQkgKgotCSAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXAKLQkgKiBkb2VzIG5vdCBmb3JtIGN5Y2xlcy4KJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lCiYjNDM7CSAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXMKJiM0MzsJICogYmVlbiBmaXhlZCB1cC4KIAkgKi8KIAlpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy0mZ3Q7ZmllbGRfbWFzayAmYW1wOyAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKQogCQlyZXR1cm4gMDsKQEAgLTQzMjEsNTEgJiM0Mzs0MzE4LDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiAJCWlmICghbWV0YSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZWMtJmd0O2ZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtJmd0O3JlY29yZDsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkJLyogV2UgbmVlZCB0byBzZXQgdmFsdWVfcmVjIGZvciBhbGwgcm9vdCB0eXBlcywgYnV0IG5vIG5lZWQKLQkJICogdG8gY2hlY2sgb3duZXJzaGlwIGN5Y2xlIGZvciBhIHR5cGUgdW5sZXNzIGl0JiMzOTtzIGFsc28gYQotCQkgKiBub2RlIHR5cGUuCi0JCSAqLwotCQlpZiAoIShyZWMtJmd0O2ZpZWxkX21hc2sgJmFtcDsgQlBGX0dSQVBIX05PREUpKQomIzQzO3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwKJiM0MzsJCQkgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7CiYjNDM7CXUzMiBidGZfaWQ7CiYjNDM7CiYjNDM7CWlmIChmaWVsZC0mZ3Q7dHlwZSAmYW1wOyBCUEZfR1JBUEhfUk9PVCkgewomIzQzOwkJYnRmX2lkID0gZmllbGQtJmd0O2dyYXBoX3Jvb3QudmFsdWVfYnRmX2lkOwomIzQzOwl9IGVsc2UgaWYgKGZpZWxkLSZndDt0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC0mZ3Q7dHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHsKJiM0MzsJCWlmIChidGZfaXNfa2VybmVsKGZpZWxkLSZndDtrcHRyLmJ0ZikpCiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQlidGZfaWQgPSBmaWVsZC0mZ3Q7a3B0ci5idGZfaWQ7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQomIzQzOwomIzQzOwltZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpOwomIzQzOwlpZiAoIW1ldGEpCiYjNDM7CQlyZXR1cm4gZmllbGQtJmd0O3R5cGUgJmFtcDsgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDsKJiM0MzsJcmV0dXJuIG1ldGEgLSB0YWItJmd0O3R5cGVzOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZAomIzQzOyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0CiYjNDM7ICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXQKJiM0MzsgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYQomIzQzOyAqIG5vbi1yZWN1cnNpbmcgZHJvcC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDgKJiM0MzsKJiM0MztzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsCiYjNDM7CQkJICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi0mZ3Q7dHlwZXNbaWR4XS5yZWNvcmQ7CiYjNDM7CWludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7CiYjNDM7CiYjNDM7CWlmICghZGVwdGhfbGVmdCkKJiM0MzsJCXJldHVybiAtRUxPT1A7CiYjNDM7CWlmIChkZXB0aFtpZHhdKQomIzQzOwkJZ290byBkb25lOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgcmVjLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsICZhbXA7cmVjLSZndDtmaWVsZHNbaV0pOwomIzQzOwkJaWYgKHJldCA9PSAtRU5PRU5UKQogCQkJY29udGludWU7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJcmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCW1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7CiYjNDM7CX0KJiM0MzsJZGVwdGhbaWR4XSA9IG1heF9kZXB0aCAmIzQzOyAxOwomIzQzO2RvbmU6CiYjNDM7CXJldHVybiBkZXB0aFtpZHhdICZndDsgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07CiYjNDM7fQogCi0JCS8qIFdlIG5lZWQgdG8gZW5zdXJlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFtb25nIGFsbCB0eXBlcy4gVGhlCi0JCSAqIHByb3BlciB3YXkgdG8gZG8gaXQgd291bGQgYmUgdG8gdG9wb2xvZ2ljYWxseSBzb3J0IGFsbCBCVEYKLQkJICogSURzIGJhc2VkIG9uIHRoZSBvd25lcnNoaXAgZWRnZXMsIHNpbmNlIHRoZXJlIGNhbiBiZSBtdWx0aXBsZQotCQkgKiBicGZfe2xpc3RfaGVhZCxyYl9ub2RlfSBpbiBhIHR5cGUuIEluc3RlYWQsIHdlIHVzZSB0aGUKLQkJICogZm9sbG93aW5nIHJlc2FvbmluZzoKLQkJICoKLQkJICogLSBBIHR5cGUgY2FuIG9ubHkgYmUgb3duZWQgYnkgYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0Ci0JCSAqICAgaGFzIGEgYnBmX3tsaXN0LHJifV9ub2RlLiBMZXQmIzM5O3MgY2FsbCB0aGVzZSBub2RlIHR5cGVzLgotCQkgKiAtIEEgdHlwZSBjYW4gb25seSBfb3duXyBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQgaGFzIGEKLQkJICogICBicGZfe2xpc3RfaGVhZCxyYl9yb290fS4gTGV0JiMzOTtzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy4KLQkJICoKLQkJICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHMKLQkJICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy4KLQkJICoKLQkJICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6Ci0JCSAqCi0JCSAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXAKLQkJICogY2hhaW4gY2FuIGJlOgotCQkgKglBIC0mZ3Q7IEIgLSZndDsgQwotCQkgKiBXaGVyZToKLQkJICogLSBBIGlzIGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9yYl9yb290LgotCQkgKiAtIEIgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGUuZy4gaGFzIGJwZl9yYl9ub2RlIGFuZAotCQkgKiAgIGJwZl9saXN0X2hlYWQuCi0JCSAqIC0gQyBpcyBvbmx5IGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9saXN0X25vZGUKLQkJICoKLQkJICogV2hlbiBBIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBzb21lIG90aGVyIHR5cGUgYWxyZWFkeQotCQkgKiBvd25zIGl0IGluIHRoZSBCVEYgZG9tYWluLCBoZW5jZSBpdCBjYW4gbm90IG93bgotCQkgKiBhbm90aGVyIHJvb3QgdHlwZSB0aHJvdWdoIGFueSBvZiB0aGUgb3duZXJzaGlwIGVkZ2VzLgotCQkgKglBIC0mZ3Q7IEIKLQkJICogV2hlcmU6Ci0JCSAqIC0gQSBpcyBib3RoIGFuIHJvb3QgYW5kIG5vZGUuCi0JCSAqIC0gQiBpcyBvbmx5IGFuIG5vZGUuCi0JCSAqLwotCQlpZiAobWV0YS0mZ3Q7cmVjb3JkLSZndDtmaWVsZF9tYXNrICZhbXA7IEJQRl9HUkFQSF9ST09UKQotCQkJcmV0dXJuIC1FTE9PUDsKJiM0MztzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCQkgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpCiYjNDM7ewomIzQzOwl1OCAqZGVwdGg7CiYjNDM7CWludCBpLCByZXQgPSAwOwomIzQzOwomIzQzOwlkZXB0aCA9IGt2Y2FsbG9jKHRhYi0mZ3Q7Y250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7CiYjNDM7CWlmICghZGVwdGgpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHRhYi0mZ3Q7Y250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJcmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksCiYjNDM7CQkJCQkgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmV0ID0gMDsKIAl9Ci0JcmV0dXJuIDA7CiYjNDM7CWt2ZnJlZShkZXB0aCk7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LApAQCAtNjA2MCw2ICYjNDM7NjA5NCwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwKIAkJCWlmIChlcnIgJmx0OyAwKQogCQkJCWdvdG8gZXJyb3V0X21ldGE7CiAJCX0KJiM0MzsKJiM0MzsJCWVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpOwomIzQzOwkJaWYgKGVyciAmbHQ7IDApCiYjNDM7CQkJZ290byBlcnJvdXRfbWV0YTsKIAl9CiAKIAllcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csICZhbXA7ZW52LSZndDtsb2cpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCkBAIC03MTQsNyAmIzQzOzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpCiAJCQlicmVhazsKIAogCQllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKLQkJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShlcnIsIDAsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwogCQlidGZfX2ZyZWUoYnRmKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzczLDcgJiM0Mzs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKQogCQkJYnJlYWs7CiAKIAkJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7Ci0JCUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoZXJyLCAwLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKIAkJYnRmX19mcmVlKGJ0Zik7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmE0ODdhYTY4ZjJlZWYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jCkBAIC0wLDAgJiM0MzsxLDI5NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDticGYvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTUElOX0xPQ0sgMgomIzQzOyNkZWZpbmUgTElTVF9IRUFEIDMKJiM0MzsjZGVmaW5lIExJU1RfTk9ERSA0CiYjNDM7LyogS2VlcCBpbiBzeW5jIHdpdGggQlRGX01BWF9PV05FUlNISVBfREVQVEguICovCiYjNDM7I2RlZmluZSBNQVhfT1dORVJTSElQX0RFUFRIIDgKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJ0ZiAqaW5pdF9idGYodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkOwomIzQzOwomIzQzOwlidGYgPSBidGZfX25ld19lbXB0eSgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2J0Zl9fbmV3X2VtcHR5JiMzNDspKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CWlkID0gYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDtpbnQmIzM0OywgNCwgQlRGX0lOVF9TSUdORUQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgMSwgJiMzNDtidGZfX2FkZF9pbnQmIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfc3Bpbl9sb2NrJiMzNDssIDQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfc3Bpbl9sb2NrJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX2xpc3RfaGVhZCYjMzQ7LCAxNik7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBMSVNUX0hFQUQsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWQmIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfbGlzdF9ub2RlJiMzNDssIDI0KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3Rfbm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJcmV0dXJuIGJ0ZjsKJiM0MzsKJiM0MztlcnJfb3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYWRkX2xvY2FsX2twdHIoc3RydWN0IGJ0ZiAqYnRmLCBpbnQgcG9pbnRlZV9pZCwgY29uc3QgY2hhciAqdGFnKQomIzQzO3sKJiM0MzsJaW50IGlkOwomIzQzOwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3R5cGVfdGFnKGJ0ZiwgdGFnLCBwb2ludGVlX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoaWQsIDAsICYjMzQ7YnRmX19hZGRfdHlwZV90YWcmIzM0OykpCiYjNDM7CQlyZXR1cm4gaWQ7CiYjNDM7CWlkID0gYnRmX19hZGRfcHRyKGJ0ZiwgaWQpOwomIzQzOwlBU1NFUlRfR1QoaWQsIDAsICYjMzQ7YnRmX19hZGRfcHRyJiMzNDspOwomIzQzOwlyZXR1cm4gaWQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3Rfc2VsZl9jeWNsZShjb25zdCBjaGFyICp0YWcsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgdGFnKTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O3NlbGZfY3ljbGUmIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA3LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtuZXh0JiMzNDssIDYsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgc2VsZl9jeWNsZTo6bmV4dCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2FiYV9jeWNsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVycjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA5LCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtjeWNsZV9hJiMzNDssIDgpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7YiYjMzQ7LCA2LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2E6OmImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2N5Y2xlX2ImIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCAxMCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7YSYjMzQ7LCA4LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmEmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9taXhlZF9jeWNsZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVycjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O21peGVkX293bmVyJiMzNDssIDIwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDcsICYjMzQ7YnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtyb290JiMzNDssIExJU1RfSEVBRCwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6cm9vdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bG9jayYjMzQ7LCBTUElOX0xPQ0ssIDEyOCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9jayYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgJiMzNDtjb250YWluczptaXhlZF9ub2RlOm5vZGUmIzM0OywgNywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA4LCAmIzM0O2J0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDttaXhlZF9ub2RlJiMzNDssIDMyKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDksICYjMzQ7YnRmX19hZGRfc3RydWN0IG1peGVkX25vZGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25vZGUmIzM0OywgTElTVF9OT0RFLCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O293bmVyJiMzNDssIDYsIDE5MiwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2FjeWNsaWNfZGVwdGgoaW50IGRlcHRoLCBib29sIGNoaWxkX2ZpcnN0LCBib29sIHNoYXJlZF9zdWZmaXgsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlpbnQgcHRyX2lkW01BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMV07CiYjNDM7CWludCBmaXJzdF9zdHJ1Y3RfaWQ7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnIsIGksIG4sIHBvaW50ZWVfaWQ7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWZpcnN0X3N0cnVjdF9pZCA9IDUgJiM0MzsgMiAqIGRlcHRoOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgZGVwdGg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoaSA9PSBkZXB0aCAtIDEpCiYjNDM7CQkJcG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aDsKJiM0MzsJCWVsc2UKJiM0MzsJCQlwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICYjNDM7IChjaGlsZF9maXJzdCA/IGRlcHRoIC0gMiAtIGkgOiBpICYjNDM7IDEpOwomIzQzOwkJcHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBwb2ludGVlX2lkLCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CQlpZiAocHRyX2lkW2ldICZsdDs9IDApCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZm9yIChuID0gMDsgbiAmbHQ7IGRlcHRoOyBuJiM0MzsmIzQzOykgewomIzQzOwkJY2hhciBuYW1lWzMyXTsKJiM0MzsJCWludCBvZmZzZXQgPSAwOwomIzQzOwomIzQzOwkJaSA9IGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAxIC0gbiA6IG47CiYjNDM7CQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7b3duZXJfJWQmIzM0OywgaSk7CiYjNDM7CQlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggJmFtcDsmYW1wOyAhaSA/IDE2IDogOCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IG4sICYjMzQ7YnRmX19hZGRfc3RydWN0IG93bmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKHNoYXJlZF9zdWZmaXggJmFtcDsmYW1wOyAhaSkgewomIzQzOwkJCS8qCiYjNDM7CQkJICogVmlzaXQgdGhlIHNoYXJlZCBzdWZmaXggdGhyb3VnaCB0aGUgc2hvcnRlciBwYXRoIGJlZm9yZQomIzQzOwkJCSAqIHJlYWNoaW5nIGl0IGFnYWluIHdpdGggbGVzcyByZW1haW5pbmcgZGVwdGguCiYjNDM7CQkJICovCiYjNDM7CQkJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O3N1ZmZpeCYjMzQ7LCBwdHJfaWRbMV0sIDAsIDApOwomIzQzOwkJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBvd25lcjo6c3VmZml4JiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQlvZmZzZXQgPSA2NDsKJiM0MzsJCX0KJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtuZXh0JiMzNDssIHB0cl9pZFtpXSwgb2Zmc2V0LCAwKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7cGxhaW5fbGVhZiYjMzQ7LCA0KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBkZXB0aCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgcGxhaW5fbGVhZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dyYXBoX2RlcHRoKGJvb2wgcmJ0cmVlLCBpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlpbnQgcm9vdF90eXBlID0gTElTVF9IRUFELCBub2RlX3R5cGUgPSBMSVNUX05PREUsIG5vZGVfc2l6ZSA9IDI0OwomIzQzOwlpbnQgaWQsIGVyciwgaSwgbG9ja19vZmYsIHJvb3Rfb2ZmLCBzaXplOwomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChyYnRyZWUpIHsKJiM0MzsJCXJvb3RfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX3JiX3Jvb3QmIzM0OywgMTYpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1Qocm9vdF90eXBlLCAwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfcmJfcm9vdCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCW5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX3JiX25vZGUmIzM0OywgMzIpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1Qobm9kZV90eXBlLCAwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfcmJfbm9kZSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCW5vZGVfc2l6ZSA9IDMyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNoYXIgbmFtZVszMl0sIHRhZ1s2NF07CiYjNDM7CiYjNDM7CQlsb2NrX29mZiA9IGkgPyBub2RlX3NpemUgOiAwOwomIzQzOwkJcm9vdF9vZmYgPSBsb2NrX29mZiAmIzQzOyA4OwomIzQzOwkJc2l6ZSA9IGkgPT0gZGVwdGggLSAxID8gbm9kZV9zaXplIDogcm9vdF9vZmYgJiM0MzsgMTY7CiYjNDM7CQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7Z3JhcGhfb3duZXJfJWQmIzM0OywgaSk7CiYjNDM7CQlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpOwomIzQzOwkJaWYgKCFBU1NFUlRfR1QoaWQsIDAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGdyYXBoX293bmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaWYgKGkpIHsKJiM0MzsJCQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bm9kZSYjMzQ7LCBub2RlX3R5cGUsIDAsIDApOwomIzQzOwkJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6bm9kZSYjMzQ7KSkKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CQlpZiAoaSA9PSBkZXB0aCAtIDEpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bG9jayYjMzQ7LCBTUElOX0xPQ0ssIGxvY2tfb2ZmICogOCwgMCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OmxvY2smIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7cm9vdCYjMzQ7LCByb290X3R5cGUsIHJvb3Rfb2ZmICogOCwgMCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OnJvb3QmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlzbnByaW50Zih0YWcsIHNpemVvZih0YWcpLCAmIzM0O2NvbnRhaW5zOmdyYXBoX293bmVyXyVkOm5vZGUmIzM0OywgaSAmIzQzOyAxKTsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTsKJiM0MzsJCWlmICghQVNTRVJUX0dUKGVyciwgMCwgJiMzNDtidGZfX2FkZF9kZWNsX3RhZyBncmFwaF9vd25lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbG9jYWxfa3B0cl9vd25lcnNoaXAodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2VsZl9jeWNsZSgmIzM0O2twdHImIzM0OywgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt1bnRydXN0ZWRfc2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2VsZl9jeWNsZSgmIzM0O2twdHJfdW50cnVzdGVkJiMzNDssIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3BlcmNwdV9zZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7cGVyY3B1X2twdHImIzM0OywgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtBQkFfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X2FiYV9jeWNsZSgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21peGVkX2dyYXBoX3Jvb3RfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X21peGVkX2N5Y2xlKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWF4X2FjeWNsaWMmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgZmFsc2UsIGZhbHNlLCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljJiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgZmFsc2UsIGZhbHNlLCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21heF9hY3ljbGljX2NoaWxkX2ZpcnN0JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIHRydWUsIGZhbHNlLCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgdHJ1ZSwgZmFsc2UsIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWF4X2FjeWNsaWNfc2hhcmVkX3N1ZmZpeCYjMzQ7KSkKJiM0MzsJCXRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgdHJ1ZSwgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dG9vX2RlZXBfYWN5Y2xpY19zaGFyZWRfc3VmZml4JiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgZmFsc2UsIHRydWUsIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF90aHJlZV90eXBlcyYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDMsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xpc3RfZm91cl90eXBlcyYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDQsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xpc3RfbWF4X2RlcHRoJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bGlzdF90b29fZGVlcCYjMzQ7KSkKJiM0MzsJCXRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgLUVMT09QKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyYnRyZWVfdGhyZWVfdHlwZXMmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIDMsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JidHJlZV9mb3VyX3R5cGVzJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aCh0cnVlLCA0LCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyYnRyZWVfbWF4X2RlcHRoJiMzNDspKQomIzQzOwkJdGVzdF9ncmFwaF9kZXB0aCh0cnVlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyYnRyZWVfdG9vX2RlZXAmIzM0OykpCiYjNDM7CQl0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgLUVMT09QKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTdtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODU2MAoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDU1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFdmFsdWF0aW5nIHRoZSBLTVNBTiBGdXp6aW5nIEp1c3RpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSB0YWtpbmcgYSBsb29rIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIHRvIHNlZSBpZiBpdCB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0JiMzOTtzIHByb2JhYmx5IHdvcnRoIGl0LCBnaXZlbiB0aGUgY2hhbmdlcy4KCkkgbmVlZCB0byBkaXZlIGludG8gdGhlIHNwZWNpZmljcywgc28gbGV0JiMzOTtzIHN0YXJ0IHdpdGggdGhlIGRpZmYgaXRzZWxmLiBJdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBhZGRyZXNzaW5nIGEgY3ljbGUgY2hlY2sgaXNzdWUgaW4gYGtlcm5lbC9icGYvYnRmLmNgLiBTcGVjaWZpY2FsbHksIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgYmVpbmcgdXBkYXRlZC4gVGhlIG9yaWdpbmFsIHNpbXBsZSBgQlBGX0dSQVBIX1JPT1RgIGN5Y2xlIGNoZWNrIGlzIGdvbmUsIHJlcGxhY2VkIHdpdGggYSBtb3JlIGNvbXByZWhlbnNpdmUgb3duZXJzaGlwIGRlcHRoIGFuZCBjeWNsZSBjaGVjayB0aGF0IGNvbnNpZGVycyBhbGwgb3duZXJzaGlwIHR5cGVzOiBgQlBGX0dSQVBIX1JPT1RgLCBgQlBGX0tQVFJfUkVGYCwgYW5kIGBCUEZfS1BUUl9QRVJDUFVgLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQsIHJlcGxhY2luZyBhIHBvdGVudGlhbGx5IGluY29tcGxldGUgY2hlY2sgd2l0aCBzb21ldGhpbmcgbW9yZSByb2J1c3QuCgpJIHNlZSBuZXcgaGVscGVyIGZ1bmN0aW9ucyBiZWluZyBhZGRlZDogYGJ0Zl9vd25lZF90eXBlX2lkeCgpYCwgd2hpY2ggYXBwZWFycyB0byBkZXRlcm1pbmUgdGhlIGluZGV4IG9mIGEgcG9pbnRlZSBzdHJ1Y3QgYmFzZWQgb24gdGhlIG93bmVyc2hpcCB0eXBlLCBhbmQgYGJ0Zl9vd25lcnNoaXBfZGVwdGgoKWAsIHdoaWNoIHBlcmZvcm1zIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIChERlMpIHdpdGggbWVtb2l6YXRpb24gdG8gY2FsY3VsYXRlIG93bmVyc2hpcCBkZXB0aC4gSXQgbG9va3MgbGlrZSBpdCB1c2VzIGEgYGRlcHRoYCBhcnJheSBhbGxvY2F0ZWQgYnkgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgdG8gdHJhY2sgdGhlIGRlcHRoLiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCBpdHNlbGYgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgc3RydWN0IG1ldGFzLCBjYWxscyBgYnRmX293bmVyc2hpcF9kZXB0aCgpYCwgYW5kIG1hbmFnZXMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBkZXB0aCB0cmFja2luZyBhcnJheS4KClRoZSBrZXkgaW50ZWdyYXRpb24gcG9pbnQgc2VlbXMgdG8gYmUgaW4gYGJ0Zl9wYXJzZSgpYCwgd2hlcmUgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgbm93IGNhbGxlZC4gVGhpcyBzdWdnZXN0cyB0aGUgb3duZXJzaGlwIGRlcHRoIGNoZWNrIGlzIGJlaW5nIHBlcmZvcm1lZCBkdXJpbmcgQlRGIHBhcnNpbmcsIHdoaWNoIGlzIGEgY3JpdGljYWwgc3RlcC4KCkZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB0aGlzIGlzIGludGVyZXN0aW5nLiBJJiMzOTtsbCBuZWVkIHRvIGV4YW1pbmUgdGhlIGNvZGUgc3Vycm91bmRpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBhbmQgYGJ0Zl9wYXJzZWAgbW9yZSBjbG9zZWx5IHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgYW5kIHBvdGVudGlhbCBhcmVhcyB3aGVyZSBLTVNBTiBtaWdodCBiZSB1c2VmdWwuIFRoZSBuZXcgZnVuY3Rpb25zIGFuZCB0aGUgYWRkZWQgY2hlY2tzIGNvdWxkIHJldmVhbCBzdWJ0bGUgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgdGhhdCBmdXp6aW5nIGNhbiB1bmNvdmVyLiBUaGUgZmFjdCB0aGF0IHRoZSBwYXRjaCBpbmNsdWRlcyBzZWxmdGVzdHMgaXMgYSBnb29kIHNpZ24sIGJ1dCB0aGUgbmF0dXJlIG9mIHRoZXNlIGNoZWNrcyBtYWtlcyBtZSBiZWxpZXZlIHRoYXQgS01TQU4gbWlnaHQgYmUgcGFydGljdWxhcmx5IHZhbHVhYmxlIGhlcmUsIHBvdGVudGlhbGx5IGZpbmRpbmcgY29tcGxleCBjeWNsZSBwcm9ibGVtcyB0aGF0IGV2ZW4gd2VsbC1jcmFmdGVkIHRlc3RzIG1pZ2h0IG1pc3MuIEl0IGlzIGdvaW5nIHRvIGJlIGdvb2QgdG8gdHJ5IGFuZCBjcmVhdGUgZnV6emVyIHNlZWRzIHRoYXQgdGFyZ2V0IHRoZXNlIG5ldyBmdW5jdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTQxNTA9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjgyLVxua2VybmVsL2JwZi9idGYuYzo0MjgzOmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG5rZXJuZWwvYnBmL2J0Zi5jLTQyODQte1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjAxND1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwOTItXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTM6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbmtlcm5lbC9icGYvYnRmLmMtNjA5NC1cdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTYwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIGNvZGUgc25pcHBldHMsIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdCB0aHJvdWdoOgoKKipBbmFseXppbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBhbmQgYGJ0Zl9wYXJzZWAqKgoKT2theSwgc28gSSBuZWVkIHRvIGRpdmUgaW50byBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBzZWN0aW9ucyBhcm91bmQgbGluZXMgNDI4MC00MzUwIGFuZCA2MDgwLTYxMTAuIEZyb20gcGFzdCBleHBlcmllbmNlLCBJJiMzOTttIGd1ZXNzaW5nIHRoZXNlIHNlY3Rpb25zIGFyZSBjcml0aWNhbCBmb3IgaGFuZGxpbmcgZmllbGQgdmFsaWRhdGlvbiBhbmQgcGFyc2luZyB3aXRoaW4gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBtZXRhZGF0YS4gR2l2ZW4gdGhlIGxpbmUgbnVtYmVycywgSSYjMzk7ZCBiZXQgdGhleSYjMzk7cmUgbGlrZWx5IHJlbGF0ZWQgdG8gZXJyb3IgaGFuZGxpbmcsIHR5cGUgc2l6ZSBjb25zaXN0ZW5jeSwgb3IgcGVyaGFwcyBldmVuIHBvaW50ZXIgZGVyZWZlcmVuY2luZyB3aXRoaW4gdGhlIEJURiBkYXRhIHN0cnVjdHVyZS4gVGhpcyBpcyBwcmV0dHkgc3RhbmRhcmQgZm9yIEJURiBwcm9jZXNzaW5nIOKAkyBlbnN1cmluZyBkYXRhIGludGVncml0eSBpcyBwYXJhbW91bnQuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCBob3cgdGhlc2UgZnVuY3Rpb25zIGhhbmRsZSBwb3RlbnRpYWwgaW5jb25zaXN0ZW5jaWVzIG9yIHZpb2xhdGlvbnMgb2YgdGhlIEJURiBzcGVjaWZpY2F0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIHVuZGVybHlpbmcgbG9naWMgYW5kIHBvdGVudGlhbCBhcmVhcyBmb3IgaW1wcm92ZW1lbnQgb3IgZGVidWdnaW5nLiBJJiMzOTtsbCBhbHNvIGJlIHdhdGNoaW5nIGZvciBhbnkgbnVhbmNlcyBvciBjbGV2ZXIgdHJpY2tzIHRoZSBkZXZlbG9wZXJzIGhhdmUgdXNlZCB0byBvcHRpbWl6ZSBtZW1vcnkgdXNhZ2Ugb3IgcGVyZm9ybWFuY2Ugd2l0aGluIHRoZXNlIHJvdXRpbmVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MjgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzQyODA6XHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG40MjgxOlx0fVxuNDI4MjpcdFxuNDI4MzpcdGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG40Mjg0Olx0e1xuNDI4NTpcdFx0aW50IGk7XG40Mjg2Olx0XG40Mjg3Olx0XHQvKlxuNDI4ODpcdFx0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG40Mjg5Olx0XHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXG40MjkwOlx0XHQgKiBiZWVuIGZpeGVkIHVwLlxuNDI5MTpcdFx0ICovXG40MjkyOlx0XHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxuNDI5MzpcdFx0XHRyZXR1cm4gMDtcbjQyOTQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40Mjk1Olx0XHRcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG40Mjk2Olx0XHRcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcbjQyOTc6XHRcdFx0dTMyIGJ0Zl9pZDtcbjQyOTg6XHRcbjQyOTk6XHRcdFx0aWYgKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSA9PSBCUEZfVVBUUikge1xuNDMwMDpcdFx0XHRcdC8qIFRoZSB1cHRyIG9ubHkgc3VwcG9ydHMgcGlubmluZyBvbmUgcGFnZSBhbmQgY2Fubm90XG40MzAxOlx0XHRcdFx0ICogcG9pbnQgdG8gYSBrZXJuZWwgc3RydWN0XG40MzAyOlx0XHRcdFx0ICovXG40MzAzOlx0XHRcdFx0aWYgKGJ0Zl9pc19rZXJuZWwocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZikpXG40MzA0Olx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQzMDU6XHRcdFx0XHR0ID0gYnRmX3R5cGVfYnlfaWQocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZixcbjQzMDY6XHRcdFx0XHRcdFx0ICAgcmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0Zl9pZCk7XG40MzA3Olx0XHRcdFx0aWYgKCF0LVx1MDAzZXNpemUpXG40MzA4Olx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQzMDk6XHRcdFx0XHRpZiAodC1cdTAwM2VzaXplIFx1MDAzZSBQQUdFX1NJWkUpXG40MzEwOlx0XHRcdFx0XHRyZXR1cm4gLUUyQklHO1xuNDMxMTpcdFx0XHRcdGNvbnRpbnVlO1xuNDMxMjpcdFx0XHR9XG40MzEzOlx0XG40MzE0Olx0XHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpKVxuNDMxNTpcdFx0XHRcdGNvbnRpbnVlO1xuNDMxNjpcdFx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuNDMxNzpcdFx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuNDMxODpcdFx0XHRpZiAoIW1ldGEpXG40MzE5Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG40MzIwOlx0XHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbjQzMjE6XHRcdH1cbjQzMjI6XHRcdHJldHVybiAwO1xuNDMyMzpcdH1cbjQzMjQ6XHRcbjQzMjU6XHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXG40MzI2Olx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG40MzI3Olx0e1xuNDMyODpcdFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcbjQzMjk6XHRcdHUzMiBidGZfaWQ7XG40MzMwOlx0XG40MzMxOlx0XHRpZiAoZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcbjQzMzI6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG40MzMzOlx0XHR9IGVsc2UgaWYgKGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XG40MzM0Olx0XHRcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSlcbjQzMzU6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMzY6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNla3B0ci5idGZfaWQ7XG40MzM3Olx0XHR9IGVsc2Uge1xuNDMzODpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMzk6XHRcdH1cbjQzNDA6XHRcbjQzNDE6XHRcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG40MzQyOlx0XHRpZiAoIW1ldGEpXG40MzQzOlx0XHRcdHJldHVybiBmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xuNDM0NDpcdFx0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG40MzQ1Olx0fVxuNDM0NjpcdFxuNDM0NzpcdC8qXG40MzQ4Olx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXG40MzQ5Olx0ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MjMKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHJlcXVlc3QsIGZvcm1hdHRlZCBhcyByZXF1ZXN0ZWQ6CgoqKkRpZ2dpbmcgRGVlcGVyIGludG8gdGhlIERhdGEqKgoKQWxyaWdodCwgSSBuZWVkIHRvIGZvY3VzIG15IGF0dGVudGlvbi4gSXQgbG9va3MgbGlrZSBJJiMzOTttIGJlaW5nIGFza2VkIHRvIGRlbHZlIGZ1cnRoZXIgaW50byB0aGlzIGRhdGEgc2V0LiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIHRha2UgYSBsb29rIGF0IHRoZSBjb250ZW50IGZyb20gbGluZXMgNDM1MCB0byA0NDAwLCBhbmQgdGhlbiBhZ2FpbiBmcm9tIGxpbmVzIDYwODAgdG8gNjExMC4gVGhpcyBzaWduYWxzIHRoYXQgdGhlcmUmIzM5O3MgbGlrZWx5IHNvbWUgY3J1Y2lhbCBpbmZvcm1hdGlvbiBvciBhIGNyaXRpY2FsIHBvaW50IGJlaW5nIG1hZGUgd2l0aGluIHRob3NlIHNwZWNpZmljIHJhbmdlcy4gSSYjMzk7bGwgbmVlZCB0byBhbmFseXplIHRoZW0gY2FyZWZ1bGx5LCBsb29raW5nIGZvciBwYXR0ZXJucywgaW5jb25zaXN0ZW5jaWVzLCBvciBhbnl0aGluZyB0aGF0IHN0YW5kcyBvdXQgaW4gcmVsYXRpb24gdG8gdGhlIGJyb2FkZXIgc2NvcGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIHRob3NlIHNwZWNpZmljIGxpbmVzIGFyZSBpbXBvcnRhbnQgdG8gdGhlIGNvbnRleHQuIEl0JiMzOTtzIHRpbWUgdG8gcHV0IG9uIG15IGNyaXRpY2FsIHRoaW5raW5nIGhhdCBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSBjYW4gZ2xlYW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQzNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NDM1MDpcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XG40MzUxOlx0ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcbjQzNTI6XHQgKiBub24tcmVjdXJzaW5nIGRyb3AuXG40MzUzOlx0ICovXG40MzU0Olx0I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XG40MzU1Olx0XG40MzU2Olx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzNTc6XHRcdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxuNDM1ODpcdFx0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbjQzNTk6XHR7XG40MzYwOlx0XHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xuNDM2MTpcdFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbjQzNjI6XHRcbjQzNjM6XHRcdGlmICghZGVwdGhfbGVmdClcbjQzNjQ6XHRcdFx0cmV0dXJuIC1FTE9PUDtcbjQzNjU6XHRcdGlmIChkZXB0aFtpZHhdKVxuNDM2NjpcdFx0XHRnb3RvIGRvbmU7XG40MzY3Olx0XG40MzY4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyByZWMtXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM2OTpcdFx0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuNDM3MDpcdFx0XHRpZiAocmV0ID09IC1FTk9FTlQpXG40MzcxOlx0XHRcdFx0Y29udGludWU7XG40MzcyOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzczOlx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNzQ6XHRcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuNDM3NTpcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuNDM3NjpcdFx0XHRcdHJldHVybiByZXQ7XG40Mzc3Olx0XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG40Mzc4Olx0XHR9XG40Mzc5Olx0XHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7XG40MzgwOlx0ZG9uZTpcbjQzODE6XHRcdHJldHVybiBkZXB0aFtpZHhdIFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcbjQzODI6XHR9XG40MzgzOlx0XG40Mzg0Olx0c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzODU6XHRcdFx0XHRcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcbjQzODY6XHR7XG40Mzg3Olx0XHR1OCAqZGVwdGg7XG40Mzg4Olx0XHRpbnQgaSwgcmV0ID0gMDtcbjQzODk6XHRcbjQzOTA6XHRcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuNDM5MTpcdFx0aWYgKCFkZXB0aClcbjQzOTI6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG40MzkzOlx0XG40Mzk0Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM5NTpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbjQzOTY6XHRcdFx0XHRcdFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XG40Mzk3Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40Mzk4Olx0XHRcdFx0YnJlYWs7XG40Mzk5Olx0XHRcdHJldCA9IDA7XG40NDAwOlx0XHR9XG40NDAxOlx0XHRrdmZyZWUoZGVwdGgpO1xuNDQwMjpcdFx0cmV0dXJuIHJldDtcbjQ0MDM6XHR9XG40NDA0Olx0XG40NDA1Olx0c3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG40NDA2Olx0XHRcdFx0ICAgICAgdTMyIHR5cGVfaWQsIHZvaWQgKmRhdGEsIHU4IGJpdHNfb2Zmc2V0LFxuNDQwNzpcdFx0XHRcdCAgICAgIHN0cnVjdCBidGZfc2hvdyAqc2hvdylcbjQ0MDg6XHR7XG40NDA5Olx0XHRjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjU5OAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgcGVyc3BlY3RpdmUgb24gdGhhdCBzZWdtZW50OgoKKipBbmFseXppbmcgYGJ0Zl9wYXJzZWAgKExpbmVzIDYwODUtNjExNSkqKgoKUmlnaHQsIGxldCYjMzk7cyB6ZXJvIGluIG9uIGBidGZfcGFyc2VgIGJldHdlZW4gdGhvc2UgbGluZSBudW1iZXJzLCA2MDg1IGFuZCA2MTE1LiBUaGF0IGFyZWEgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBjb250ZXh0IG9mIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGp1c3QgYmVmb3JlIGFuZCBhZnRlciB0aGlzIHNlY3Rpb24uIEkmIzM5O20gYXNzdW1pbmcgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBwYXJzaW5nIEJURiBkYXRhLiBTbywgd2hhdCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYXJlIGJlaW5nIGhhbmRsZWQgYXJvdW5kIHRob3NlIGxpbmVzPyBBcmUgd2UgbG9va2luZyBhdCB0aGUgY29yZSBwYXJzaW5nIGxvZ2ljLCBlcnJvciBoYW5kbGluZywgb3IgcGVyaGFwcyB0eXBlIGRlZmluaXRpb24gcmVzb2x1dGlvbj8gVGhlIGZ1bmN0aW9uJiMzOTtzIHN0cnVjdHVyZSBpdHNlbGYgd2lsbCB0ZWxsIGEgbG90LiBJJiMzOTtsbCBuZWVkIHRvIGNvbmZpcm0gd2hhdCB0aGUgaW5wdXQgcGFyYW1ldGVycyBhcmUgYW5kIGhvdyB0aGV5JiMzOTtyZSBiZWluZyB1c2VkIHdpdGhpbiB0aGlzIHNuaXBwZXQuIEFueSBwb3RlbnRpYWwgZm9yIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgaW5jb3JyZWN0IHR5cGUgY2FzdGluZyBsZWFwcyBvdXQgaW1tZWRpYXRlbHkuIEFyZSB0aGVyZSBhbnkgaW5kaXJlY3QganVtcHMgb3IgcG9pbnRlciBtYW5pcHVsYXRpb24gb2NjdXJyaW5nIGhlcmU/IFRob3NlIGFyZSBhbHdheXMgd29ydGggYSBjbG9zZXIgaW5zcGVjdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBwaW5wb2ludCBhbnkgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyB0byBlbnN1cmUgdGhpcyBjcml0aWNhbCBmdW5jdGlvbiBpcyByb2J1c3QgYW5kIHNhZmUgZnJvbSBtaXN1c2UuIFRoZW4sIEkgbmVlZCB0byBjb25zaWRlciBhbnkgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIOKAkyBjb3VsZCB0aGlzIGJlIGEgYm90dGxlbmVjayBpbiB0aGUgb3ZlcmFsbCBwcm9jZXNzPyBBbnkgb3B0aW1pemF0aW9ucyBJIGNhbiBtYWtlPyBSaWdodCwgdGltZSB0byBkaXZlIGluIGFuZCBnZXQgbXkgaGFuZHMgZGlydHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjA4NTpcdFx0XHRnb3RvIGVycm91dDtcbjYwODY6XHRcdH1cbjYwODc6XHRcdGJ0Zi1cdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XG42MDg4Olx0XG42MDg5Olx0XHRpZiAoc3RydWN0X21ldGFfdGFiKSB7XG42MDkwOlx0XHRcdGludCBpO1xuNjA5MTpcdFxuNjA5MjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzdHJ1Y3RfbWV0YV90YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNjA5MzpcdFx0XHRcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XG42MDk0Olx0XHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbjYwOTU6XHRcdFx0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG42MDk2Olx0XHRcdH1cbjYwOTc6XHRcbjYwOTg6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG42MDk5Olx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG42MTAwOlx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbjYxMDE6XHRcdH1cbjYxMDI6XHRcbjYxMDM6XHRcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXHUwMDI2ZW52LVx1MDAzZWxvZyk7XG42MTA0Olx0XHRpZiAoZXJyKVxuNjEwNTpcdFx0XHRnb3RvIGVycm91dF9mcmVlO1xuNjEwNjpcdFxuNjEwNzpcdFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XG42MTA4Olx0XHRyZWZjb3VudF9zZXQoXHUwMDI2YnRmLVx1MDAzZXJlZmNudCwgMSk7XG42MTA5Olx0XHRyZXR1cm4gYnRmO1xuNjExMDpcdFxuNjExMTpcdGVycm91dF9tZXRhOlxuNjExMjpcdFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XG42MTEzOlx0ZXJyb3V0OlxuNjExNDpcdFx0Lyogb3ZlcndyaXRlIGVyciB3aXRoIC1FTk9TUEMgb3IgLUVGQVVMVCAqL1xuNjExNTpcdFx0cmV0ID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbjYxMTY6XHRcdGlmIChyZXQpXG42MTE3Olx0XHRcdGVyciA9IHJldDtcbjYxMTg6XHRlcnJvdXRfZnJlZTpcbjYxMTk6XHRcdGJ0Zl92ZXJpZmllcl9lbnZfZnJlZShlbnYpO1xuNjEyMDpcdFx0aWYgKGJ0ZilcbjYxMjE6XHRcdFx0YnRmX2ZyZWUoYnRmKTtcbjYxMjI6XHRcdHJldHVybiBFUlJfUFRSKGVycik7XG42MTIzOlx0fVxuNjEyNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzUxMAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDU0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEJURiBTdHJ1Y3QgT3duZXJzaGlwIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIGl0cyBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBJdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBjaGFuZ2luZyBob3cgd2UgdmFsaWRhdGUgdGhlIG93bmVyc2hpcCBsb2dpYyB3aXRoaW4gdGhlIEJURiBzdHJ1Y3R1cmUuIFByZXZpb3VzbHksIHRoZSBzeXN0ZW0gd2FzIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGEgbm9kZSB3YXMgYWxzbyBhIHJvb3QgaW4gdGhlIGdyYXBoIHN0cnVjdHVyZSwgd2Ugd2VyZW4mIzM5O3QgaW50cm9kdWNpbmcgY3ljbGVzLCBlc3BlY2lhbGx5IHdpdGhpbiBgYnBmX2xpc3RfaGVhZGAgYW5kIGBicGZfcmJfcm9vdGAuIFRoZSBvbGQgbWV0aG9kIHdhcyB0byBjaGVjayBgbWV0YS0mZ3Q7cmVjb3JkLSZndDtmaWVsZF9tYXNrICZhbXA7IEJQRl9HUkFQSF9ST09UYC4gVGhlIG5ldyBhcHByb2FjaCBicmluZ3MgaW4gYSByZWN1cnNpb24gZGVwdGggY2hlY2sgZm9yIG93bmVyc2hpcC4KCkVzc2VudGlhbGx5LCB0aGV5JiMzOTtyZSBpbnRyb2R1Y2luZyBhIGxpbWl0LCBgQlRGX01BWF9PV05FUlNISVBfREVQVEhgIChzZXQgdG8gOCwgd2hpY2ggc2VlbXMgcmVhc29uYWJsZSksIHRvIHByZXZlbnQgaXNzdWVzIGxpa2Uga2VybmVsIHN0YWNrIG92ZXJmbG93IG9yIGV4Y2Vzc2l2ZWx5IGxvbmcgcmVjdXJzaW9uIGR1cmluZyB0aGUgYGJwZl9vYmpfZnJlZV9maWVsZHMoKWAgb3IgYF9fYnBmX29ial9kcm9wX2ltcGwoKWAgcHJvY2Vzc2VzLiBUaGUgcGF0Y2ggbm93IGFsc28gY2hlY2tzIGZvciBvd25lcnNoaXAgY3ljbGVzIGludm9sdmluZyBgQlBGX0dSQVBIX1JPT1RgLCBgQlBGX0tQVFJfUkVGYCwgYW5kIGBCUEZfS1BUUl9QRVJDUFVgLiBUaGlzIHNlZW1zIGxpa2UgYSBnb29kIHByb2FjdGl2ZSBtZWFzdXJlLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCwgdmFyaWFibGVzLCBwb2ludGVycywgYW5kIHVzZXItc3BhY2UgY29waWVzIGludm9sdmVkLgoKRmlyc3QsIHdlIGhhdmUgdGhpcyBhbGxvY2F0aW9uOiBgZGVwdGggPSBrdmNhbGxvYyh0YWItJmd0O2NudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO2AuIGBrdmNhbGxvY2AgaXMgYWxsb2NhdGluZyB6ZXJvZWQgbWVtb3J5LiBXZSYjMzk7cmUgYWxsb2NhdGluZyBgdGFiLSZndDtjbnRgIGVsZW1lbnRzLCBlYWNoIGBzaXplb2YodTgpYCBpbiBzaXplLiBZZXMsIGBrdmNhbGxvY2AgZ3VhcmFudGVlcyB0aGF0IGBkZXB0aGAgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC4gSW1wb3J0YW50bHksIGl0JiMzOTtzIGZyZWVkIGxhdGVyIHdpdGggYGt2ZnJlZShkZXB0aClgLiBBbHdheXMgZ29vZCB0byBzZWUgdGhhdCBwYWlyZWQgdXAuCgpXZSBoYXZlIHRvIGNvbnNpZGVyIGFycmF5IGJvdW5kcyBmb3IgdGhpcyBhbGxvY2F0aW9uLCBlc3BlY2lhbGx5IGFzIGBkZXB0aGAgaXMgaW5kZXhlZCBhcyBgZGVwdGhbaWR4XWAuCmBpZHhgIG9yaWdpbmF0ZXMgaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIHdoZXJlIHdlIGhhdmUgdGhlIGxvb3A6IGBmb3IgKGkgPSAwOyBpICZsdDsgdGFiLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7IC4uLiBidGZfb3duZXJzaGlwX2RlcHRoKC4uLiwgaSwgLi4uKTsgfWAuCkluc2lkZSBgYnRmX293bmVyc2hpcF9kZXB0aGA6IGByZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsICZhbXA7cmVjLSZndDtmaWVsZHNbaV0pO2AgdGhlbiB3ZSBjYWxsOiBgcmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO2AuIEFuZCB0aGVuIHdpdGhpbiBgYnRmX293bmVkX3R5cGVfaWR4YCB3ZSBoYXZlIHRoaXM6CmBgYGMKCW1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7CglpZiAoIW1ldGEpCgkJcmV0dXJuIGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7CglyZXR1cm4gbWV0YSAtIHRhYi0mZ3Q7dHlwZXM7CmBgYApJdCBsb29rcyBsaWtlIGBtZXRhYCBjb21lcyBmcm9tIGBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZClgLiBXZSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgaG93IHRoaXMgd29ya3MuCmBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIEkmIzM5O2xsIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhhdCBmdW5jdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgb2Zmc2V0cyBhbmQgaW5kZXhpbmcgYXJlIHNhZmUgYW5kIGRvbiYjMzk7dCBpbnRyb2R1Y2UgdnVsbmVyYWJpbGl0aWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZfZmluZF9zdHJ1Y3RfbWV0YSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYz00MjgzPWludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4tLVxua2VybmVsL2JwZi9idGYuYy00MzE2LVx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xua2VybmVsL2JwZi9idGYuYzo0MzE3Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzE4LVx0XHRpZiAoIW1ldGEpXG4tLVxua2VybmVsL2JwZi9idGYuYz00MzI1PXN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNDAtXG5rZXJuZWwvYnBmL2J0Zi5jOjQzNDE6XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xua2VybmVsL2JwZi9idGYuYy00MzQyLVx0aWYgKCFtZXRhKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTg0ND1idGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0Zilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjQtXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NjU6c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxua2VybmVsL2JwZi9idGYuYy01OTY2LXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTc0NDg9aW50IGJ0Zl9zdHJ1Y3RfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csXG4tLVxua2VybmVsL2JwZi9idGYuYy03NDY0LVxua2VybmVsL2JwZi9idGYuYzo3NDY1Olx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBpZCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjYtXHRcdGlmICghbWV0YSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTY6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUyNzMKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHRob3VnaCBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAgaW1wbGVtZW50YXRpb24sIGtlZXBpbmcgaW4gbWluZCBJJiMzOTttIGFuIGV4cGVydCBpbiB0aGlzIGZpZWxkLgoKKipEZWVwIERpdmUgaW50byBgYnRmX2ZpbmRfc3RydWN0X21ldGFgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoaXMgZnVuY3Rpb24gd29ya3MuIEl0JiMzOTtzIGNydWNpYWwgZm9yIGVmZmljaWVudGx5IG5hdmlnYXRpbmcgYW5kIGludGVycHJldGluZyBCVEYgaW5mb3JtYXRpb24sIGFuZCBJIHdhbnQgdG8gYmUgY2VydGFpbiBhYm91dCB0aGUgZWRnZSBjYXNlcyBhbmQgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBJJiMzOTttIGFzc3VtaW5nLCBvZiBjb3Vyc2UsIHRoYXQgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYSB3ZWxsLWZvcm1lZCBCVEYgZGF0YSBzdHJ1Y3R1cmUg4oCTIGJ1dCBpdCYjMzk7cyBhbHdheXMgZ29vZCB0byBjb25zaWRlciBlcnJvciBoYW5kbGluZyBpbXBsaWNpdGx5LgoKTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgcnVubmluZyB0aHJvdWdoIHRoZSB2YXJpb3VzIGFzcGVjdHMuIFdoYXQgYXJlIHRoZSBrZXkgc2VhcmNoIHBhcmFtZXRlcnM/IElzIGl0IGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QsIHRoZSBzaXplLCB0aGUgbWVtYmVyIGxheW91dCwgb3Igc29tZSBjb21iaW5hdGlvbiB0aGVyZW9mPyBJIG5lZWQgdG8gbG9vayBmb3IgYW55IG9wdGltaXphdGlvbnMgZW1wbG95ZWQgaGVyZS4gQXJlIHRoZXJlIGFueSBjYWNoaW5nIG1lY2hhbmlzbXMgdG8gc3BlZWQgdXAgcmVwZWF0ZWQgbG9va3Vwcz8gSXMgaXQgdXNpbmcgYSBoYXNoIHRhYmxlLCBsaW5lYXIgc2VhcmNoLCBvciBzb21lIG90aGVyIG1ldGhvZCBmb3IgZmluZGluZyB0aGUgY29ycmVjdCBzdHJ1Y3QgZGVmaW5pdGlvbj8gSSB3YW50IHRvIHNlZSBpZiB0aGUgY2hvc2VuIGFsZ29yaXRobSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGV4cGVjdGVkIHNpemUgYW5kIGNvbXBsZXhpdHkgb2YgdGhlIEJURiBkYXRhLgoKSSYjMzk7bGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucy4gRG9lcyBpdCB0cmF2ZXJzZSB0aGUgQlRGIHNlY3Rpb24gbGluZWFybHksIG9yIGRvZXMgaXQganVtcCBhcm91bmQ/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIGNhY2hlIG1pc3NlcyB0aGF0IGNvdWxkIGltcGFjdCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSB3aXRoIGxhcmdlIEJURiBibG9icz8gQW5kIGhvdyBkb2VzIGl0IGhhbmRsZSBuZXN0ZWQgc3RydWN0cyBhbmQgYW5vbnltb3VzIHVuaW9ucz8gVGhhdCYjMzk7cyBhbHdheXMgYSB0cmlja3kgYXJlYSwgYW5kIEkgZXhwZWN0IHRoZXJlIGlzIGEgd2VsbCB0aG91Z2h0LW91dCB0cmF2ZXJzYWwgc3RyYXRlZ3kgdGhlcmUuCgpJJiMzOTtsbCBhbHNvIGtlZXAgaW4gbWluZCB0aGUgcG90ZW50aWFsIGZvciBjb3JuZXIgY2FzZXMuIFdoYXQgaGFwcGVucyBpZiB0aGUgc3RydWN0IGlzbiYjMzk7dCBmb3VuZD8gRG9lcyBpdCByZXR1cm4gYW4gZXJyb3IgY29kZSwgYE5VTExgLCBvciBzb21ldGhpbmcgZWxzZT8gRG9lcyBpdCBoYXZlIGFueSBpbXBsaWNhdGlvbnMgZm9yIHdoYXQgaGFwcGVucyBpbiB0aGUgY2FsbGVyPyBJJiMzOTttIGN1cmlvdXMgaG93IGl0IGludGVyYWN0cyB3aXRoIEJURiB0eXBlIElEcywgYW5kIGhvdyBpdCBoYW5kbGVzIGR1cGxpY2F0ZSBzdHJ1Y3QgZGVmaW5pdGlvbnMsIGlmIGF0IGFsbC4KCkZpbmFsbHksIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBhYm91dCBmdXR1cmUgc2NhbGFiaWxpdHkuIElzIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXNpZ25lZCB0byBoYW5kbGUgdmVyeSBsYXJnZSBCVEYgZGF0YWJhc2VzPyBEb2VzIGl0IGFsbG93IGZvciBpbmNyZW1lbnRhbCB1cGRhdGVzIG9yIHBhcnRpYWwgQlRGIGxvYWRpbmc/IFRoZXNlIGFyZSBjcnVjaWFsIGFzcGVjdHMgdG8gY29uc2lkZXIgZm9yIGxvbmctdGVybSBtYWludGFpbmFiaWxpdHkgYW5kIHBlcmZvcm1hbmNlLiBUaGUgbW9yZSBJIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiwgdGhlIG1vcmUgY29uZmlkZW5jZSBJJiMzOTtsbCBoYXZlIGluIHRoZSBzdGFiaWxpdHkgb2YgdGhlIG92ZXJhbGwgZnJhbWV3b3JrLiBMZXQmIzM5O3Mgc2VlIGhvdyBpdCYjMzk7cyBkb25lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNjo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1OTYwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzU5NjA6XHRmcmVlX2FvZjpcbjU5NjE6XHRcdGtmcmVlKGFvZik7XG41OTYyOlx0XHRyZXR1cm4gRVJSX1BUUihyZXQpO1xuNTk2MzpcdH1cbjU5NjQ6XHRcbjU5NjU6XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICpidGZfZmluZF9zdHJ1Y3RfbWV0YShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBidGZfaWQpXG41OTY2Olx0e1xuNTk2NzpcdFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYjtcbjU5Njg6XHRcbjU5Njk6XHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhLCBidGZfaWQpICE9IDApO1xuNTk3MDpcdFx0dGFiID0gYnRmLVx1MDAzZXN0cnVjdF9tZXRhX3RhYjtcbjU5NzE6XHRcdGlmICghdGFiKVxuNTk3MjpcdFx0XHRyZXR1cm4gTlVMTDtcbjU5NzM6XHRcdHJldHVybiBic2VhcmNoKFx1MDAyNmJ0Zl9pZCwgdGFiLVx1MDAzZXR5cGVzLCB0YWItXHUwMDNlY250LCBzaXplb2YodGFiLVx1MDAzZXR5cGVzWzBdKSwgYnRmX2lkX2NtcF9mdW5jKTtcbjU5NzQ6XHR9XG41OTc1Olx0XG41OTc2Olx0c3RhdGljIGludCBidGZfY2hlY2tfbW9kaWZpZXJfY2hhaW5fbGVuZ3RoKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXG41OTc3Olx0XHRcdFx0XHRcdCAgIHN0cnVjdCBidGYgKmJ0ZiwgaW50IHN0YXJ0X2lkKVxuNTk3ODpcdHtcbjU5Nzk6XHRcdGludCBpLCBuLCBnb29kX2lkID0gc3RhcnRfaWQgLSAxO1xuNTk4MDpcdFxuNTk4MTpcdFx0biA9IGJ0Zl9ucl90eXBlcyhidGYpO1xuNTk4MjpcdFx0Zm9yIChpID0gc3RhcnRfaWQ7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG41OTgzOlx0XHRcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcbjU5ODQ6XHRcdFx0aW50IGNoYWluX2xpbWl0ID0gMzI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE2OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xMW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjI2MAoJCQkJCQkJb3V0cHV0OiAyODQKCQkJCQkJCXRob3VnaHRzOiAxNzY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIEJURiBPd25lcnNoaXAgRGVwdGggQ2hlY2sgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IHByaW1hcnkgY29uY2VybiBoZXJlIGlzIHdoZXRoZXIgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIG9yIGV4cG9zZXMgYW55IHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gYmUgcmVhZCwgd2hpY2ggY291bGQgbGVhZCB0byBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIEkmIzM5O20gZ29pbmcgdG8gZm9sbG93IHRoZSBlc3RhYmxpc2hlZCBjcml0ZXJpYSBmb3IgS01TQU4gYW5hbHlzaXMuCgpGaXJzdCwgSSBleGFtaW5lIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGJpbmFyeSBzZWFyY2ggd2l0aGluIHRoZSBgYnRmLSZndDtzdHJ1Y3RfbWV0YV90YWItJmd0O3R5cGVzYCBhcnJheS4gSWYgdGhlIHNlYXJjaCBpcyBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZm91bmQgbWV0YWRhdGEsIGBtZXRhYC4gVGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50IGlzIHRoZW4gY2FsY3VsYXRlZCBhcyBgbWV0YSAtIHRhYi0mZ3Q7dHlwZXNgLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSwgc3BlY2lmaWNhbGx5IGAwYCB0byBgdGFiLSZndDtjbnQgLSAxYC4gSWYgdGhlIHNlYXJjaCBmYWlscywgaXQgcmV0dXJucyBgTlVMTGAuCgpOb3csIGxvb2tpbmcgYXQgYGJ0Zl9vd25lZF90eXBlX2lkeGAuIEl0IGNhbGxzIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAsIGFuZCBpZiBhIHZhbGlkIGBtZXRhYCBpcyBmb3VuZCwgdGhlIGluZGV4IGNhbGN1bGF0aW9uIGBtZXRhIC0gdGFiLSZndDt0eXBlc2AgZ2l2ZXMgdXMgdGhlIGluZGV4LCBhbmQgYSBjaGVjayBpcyBwZXJmb3JtZWQgdG8gdmVyaWZ5IHRoZSByb290LiBJZiBgYnRmX2ZpbmRfc3RydWN0X21ldGFgIHJldHVybnMgYE5VTExgLCB0aGVuIHdlIGNoZWNrIHRoZSByb290IGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZSwgd2hpY2ggZG9lcyBub3QgaW50cm9kdWNlIGEgcmlzay4gVGhlcmVmb3JlLCBpdCBpcyBpbXBvcnRhbnQgdG8gcG9pbnQgb3V0IHRoYXQgYHRhYmAgaXMgYW4gYXJndW1lbnQsIHdoaWNoIGluIG91ciBjb250ZXh0IGlzIGBzdHJ1Y3RfbWV0YV90YWJgLiBUaGVyZWZvcmUsIHRoZSByZXR1cm5lZCBpbmRleCBpcyB3aXRoaW4gYm91bmRzIChpLmUuLCBgMGAgdG8gYHRhYi0mZ3Q7Y250IC0gMWApLgoKTXkgYW5hbHlzaXMgaXMgZ3VpZGVkIGJ5IHRoZXNlIHBvdGVudGlhbCByaXNrczoKCjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZToqKiBBcmUgYW55IGtlcm5lbCBzdHJ1Y3R1cmVzIGJlaW5nIHBhc3NlZCBiYWNrIHRvIHVzZXIgc3BhY2U/IE5vLCBub3QgaW4gdGhpcyBwYXRjaC4gVGhlIGZ1bmN0aW9ucyBgYnRmX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCBhcmUgaW50ZXJuYWwgdmVyaWZpY2F0aW9uIGZ1bmN0aW9ucyBhbmQgb25seSByZXR1cm4gYW4gZXJyb3IgY29kZSBvciBCVEYgZmQuIFRoaXMgZWxpbWluYXRlcyB0aGUgcG9zc2liaWxpdHkgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkLgoKMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlczoqKiBJIGNhcmVmdWxseSBleGFtaW5lZCB0aGUgbG9jYWwgdmFyaWFibGVzLiBJbiBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGFsbCB2YXJpYWJsZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLCBpbmNsdWRpbmcgYG1heF9kZXB0aGAsIGBpYCwgYW5kIGByZXRgLiBDcml0aWNhbGx5LCB0aGUgYGRlcHRoYCBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCBga3ZjYWxsb2NgLCB3aGljaCBlbnN1cmVzIGFsbCBlbGVtZW50cyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4gSW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLCB0aGUgYHJldGAgdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQgdG8gYDBgLiBgYnRmX2lkYCBpcyBhc3NpZ25lZCBpbiBib3RoIGJyYW5jaGVzIG9mIHRoZSBgYnRmX293bmVkX3R5cGVfaWR4YCBmdW5jdGlvbiB3aGVyZSBjb250cm9sIGRvZXMgbm90IHJldHVybi4KCjMuICAqKkFsbG9jYXRpb24vSW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXM6KiogVGhlIGBkZXB0aGAgYXJyYXksIHdoaWNoIGlzIGNyaXRpY2FsIHRvIHRoaXMgY2hlY2ssIGlzIGFsbG9jYXRlZCB1c2luZyBga3ZjYWxsb2NgLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCBhbGwgaXRzIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvLiBJIGRpZCB2ZXJpZnkgdGhhdCBgZGVwdGhgIGlzIHByb3Blcmx5IGZyZWVkIHZpYSBga3ZmcmVlYCB3aXRoaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLgoKNC4gICoqQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgYWxsb3dpbmcgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgYnVmZmVyIGJ5dGVzOioqIFRoZSBmb2N1cyBvZiB0aGlzIHBhdGNoIGlzIGltcHJvdmluZyBCVEYgb3duZXJzaGlwIHZhbGlkYXRpb24sIHNwZWNpZmljYWxseSBwcmV2ZW50aW5nIGN5Y2xpY2FsIG9yIGV4Y2Vzc2l2ZWx5IGRlZXAgb3duZXJzaGlwIHN0cnVjdHVyZXMuIFRoZSBjb2RlIGRvZXMgbm90IG1vZGlmeSBhbnkgYnVmZmVyIHJlYWRzIG9yIGNvcGllcy4gVGhlIGluZGV4IGBpZHhgIHBhc3NlZCB0byBgZGVwdGhbaWR4XWAgaXMgY2FsY3VsYXRlZCB2aWEgYG1ldGEgLSB0YWItJmd0O3R5cGVzYCBmcm9tIGEgc3VjY2Vzc2Z1bCBiaW5hcnkgc2VhcmNoLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgZWxlbWVudCBpcyB2YWxpZCBhbmQgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZWZvcmUgaXQgaXMgYWx3YXlzIHdpdGhpbiB0aGUgdmFsaWQgYm91bmRzLgoKSSByZS1jaGVja2VkIHRoZSBlc3RhYmxpc2hlZCBLTVNBTiBydWxlczogVGhlIHBhdGNoIGludHJvZHVjZXMgYSByZWN1cnNpb24gZGVwdGggY2hlY2sgZm9yIEJURiBzdHJ1Y3Qgb3duZXJzaGlwLCB1dGlsaXplcyB6ZXJvZWQgbWVtb3J5IGZyb20gYGt2Y2FsbG9jYCwgYW5kIHdvcmtzIHNvbGVseSBvbiBpbml0aWFsaXplZCB2ZXJpZmllciBtZXRhZGF0YS4gSXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFsbCBwb3RlbnRpYWwgcmlza3MgKGUuZy4sIG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzIGluIGBkZXB0aFtpZHhdYCwgaW5maW5pdGUgcmVjdXJzaW9uLCBvciBtZW1vcnkgbGVha3MpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuIFRoaXMgcGF0Y2ggY2xlYXJseSBhbGlnbnMgd2l0aCB0aGUgY3JpdGVyaWEgZm9yIHNldHRpbmcgYE5lZWRzS01TQU49ZmFsc2VgLiBUaGVyZWZvcmUsIEkgYW0gcmVhZHkgdG8gZm9ybXVsYXRlIHRoZSBmaW5hbCByZXN1bHQgYW5kIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTc6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBkZXB0aCBhbmQgZGV0ZWN0IGN5Y2xlcyBhY3Jvc3MgZ3JhcGggcm9vdHMgKGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290KSBhbmQgbG9jYWwga3B0cnMgKEJQRl9LUFRSX1JFRiwgQlBGX0tQVFJfUEVSQ1BVKSwgcHJldmVudGluZyBkZWVwIGtlcm5lbCByZWN1cnNpb24gZHVyaW5nIG9iamVjdCBjbGVhbnVwLlxuXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXG4yLiBMb2NhbCB2YXJpYWJsZXMgYW5kIGZpZWxkczogQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0IGZpZWxkcyBpbnNwZWN0ZWQgb3IgcG9wdWxhdGVkIChgcmV0YCwgYG1heF9kZXB0aGAsIGBidGZfaWRgLCBgZGVwdGhbaWR4XWApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBVc2VyLXNwYWNlIGNvcGllczogTm8gZGF0YSBvciBzdHJ1Y3R1cmUgaXMgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZTsgdGhlIHZhbGlkYXRpb24gcmV0dXJucyBzdGFuZGFyZCBlcnJvciBjb2Rlcy5cbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cblxuMS4gTWVtb3J5IGFsbG9jYXRpb246IFRoZSBvbmx5IGR5bmFtaWMgYWxsb2NhdGlvbiBpbnRyb2R1Y2VkIGlzIHRoZSB0ZW1wb3JhcnkgYGRlcHRoYCBhcnJheSBpbiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCwgd2hpY2ggaXMgYWxsb2NhdGVkIHVzaW5nIGBrdmNhbGxvYygpYCAoZnVsbHkgemVyby1pbml0aWFsaXplZCkgYW5kIGZyZWVkIHdpdGggYGt2ZnJlZSgpYCBiZWZvcmUgcmV0dXJuaW5nLlxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxuMy4gVXNlci1zcGFjZSBjb3BpZXM6IE5vIGRhdGEgb3Igc3RydWN0dXJlIGlzIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2U7IHRoZSB2YWxpZGF0aW9uIHJldHVybnMgc3RhbmRhcmQgZXJyb3IgY29kZXMuXG40LiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIChzdWNoIGFzIGluZGV4aW5nIGlzc3VlcywgcG9pbnRlciBhcml0aG1ldGljLCBvciByZWN1cnNpb24gbGltaXRzKSB3b3VsZCBiZSBjb3ZlcmVkIGJ5IEtBU0FOIG9yIHN0YW5kYXJkIGtlcm5lbCBjaGVja3MsIG5vdCBLTVNBTi5cblxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI4OjM0LjY3NDAyNTk2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkyMTAxNTE5NzAzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lZF90eXBlX2lkeFwiLFxuICAgIFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgICBcImJwZl9idGZfbG9hZFwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBkZXB0aCBhbmQgZGV0ZWN0IGN5Y2xlcyBhY3Jvc3MgZ3JhcGggcm9vdHMgKGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290KSBhbmQgbG9jYWwga3B0cnMgKEJQRl9LUFRSX1JFRiwgQlBGX0tQVFJfUEVSQ1BVKSwgcHJldmVudGluZyBkZWVwIGtlcm5lbCByZWN1cnNpb24gZHVyaW5nIG9iamVjdCBjbGVhbnVwLlxcblxcbjEuIE1lbW9yeSBhbGxvY2F0aW9uOiBUaGUgb25seSBkeW5hbWljIGFsbG9jYXRpb24gaW50cm9kdWNlZCBpcyB0aGUgdGVtcG9yYXJ5IGBkZXB0aGAgYXJyYXkgaW4gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAsIHdoaWNoIGlzIGFsbG9jYXRlZCB1c2luZyBga3ZjYWxsb2MoKWAgKGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQpIGFuZCBmcmVlZCB3aXRoIGBrdmZyZWUoKWAgYmVmb3JlIHJldHVybmluZy5cXG4yLiBMb2NhbCB2YXJpYWJsZXMgYW5kIGZpZWxkczogQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0IGZpZWxkcyBpbnNwZWN0ZWQgb3IgcG9wdWxhdGVkIChgcmV0YCwgYG1heF9kZXB0aGAsIGBidGZfaWRgLCBgZGVwdGhbaWR4XWApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gVXNlci1zcGFjZSBjb3BpZXM6IE5vIGRhdGEgb3Igc3RydWN0dXJlIGlzIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2U7IHRoZSB2YWxpZGF0aW9uIHJldHVybnMgc3RhbmRhcmQgZXJyb3IgY29kZXMuXFxuNC4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoc3VjaCBhcyBpbmRleGluZyBpc3N1ZXMsIHBvaW50ZXIgYXJpdGhtZXRpYywgb3IgcmVjdXJzaW9uIGxpbWl0cykgd291bGQgYmUgY292ZXJlZCBieSBLQVNBTiBvciBzdGFuZGFyZCBrZXJuZWwgY2hlY2tzLCBub3QgS01TQU4uXFxuXFxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBleHRlbmRzIEJURiBvd25lcnNoaXAgYW5kIGN5Y2xlIHZhbGlkYXRpb24gYnkgaW50cm9kdWNpbmcgZGVwdGgtYm91bmRlZCBncmFwaCB0cmF2ZXJzYWwgKGJ0Zl9vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgpIHRvIHZhbGlkYXRlIG93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGluIHVzZXItbG9hZGVkIEJURiB0eXBlcyAoc3VjaCBhcyBncmFwaCByb290cyBhbmQga3B0cnMpLiBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBpcyBkaXJlY3RseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBicGYoKSBzeXNjYWxsIChCUEZfQlRGX0xPQUQpLiBGdXp6aW5nIGNhbiB2ZXJpZnkgcmVjdXJzaW9uIGJvdW5kcywgY3ljbGUgZGV0ZWN0aW9uIGNvcnJlY3RuZXNzLCBhbmQgZWRnZSBjYXNlcyBpbiBwYXJzaW5nIGFyYml0cmFyeSB1c2VyLXN1cHBsaWVkIEJURiBkYXRhLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjoyODozNC42NzQwMzEzN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyMDc1OTUwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGY1ODQ1MjVmOTk2MDBmNmY3YWQ3YmRiODliZWFlY2M1ZmI0OGRmODFcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTY6Mjg6MzIgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmNcXG5pbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvYnRmLmNcXG4rKysgYi9rZXJuZWwvYnBmL2J0Zi5jXFxuQEAgLTQyODQsMTMgKzQyODQsMTAgQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG4ge1xcbiBcXHRpbnQgaTtcXG4gXFxuLVxcdC8qIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyB0aGF0IHNpZ25pZnkgb3duZXJzaGlwIG9mIHNvbWUgb3RoZXIgdHlwZTpcXG4tXFx0ICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC5cXG4tXFx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJ3Qgc3RvcmVcXG4tXFx0ICogcmVmZXJlbmNlcyB0byBwcm9ncmFtIGFsbG9jYXRlZCBsb2NhbCB0eXBlcy5cXG4tXFx0ICpcXG4tXFx0ICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcFxcbi1cXHQgKiBkb2VzIG5vdCBmb3JtIGN5Y2xlcy5cXG4rXFx0LypcXG4rXFx0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXFxuK1xcdCAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXNcXG4rXFx0ICogYmVlbiBmaXhlZCB1cC5cXG4gXFx0ICovXFxuIFxcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVxcdTAwM2VmaWVsZF9tYXNrIFxcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuQEAgLTQzMjEsNTEgKzQzMTgsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG4gXFx0XFx0aWYgKCFtZXRhKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFx0XFx0cmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVxcdTAwM2VyZWNvcmQ7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4gXFxuLVxcdFxcdC8qIFdlIG5lZWQgdG8gc2V0IHZhbHVlX3JlYyBmb3IgYWxsIHJvb3QgdHlwZXMsIGJ1dCBubyBuZWVkXFxuLVxcdFxcdCAqIHRvIGNoZWNrIG93bmVyc2hpcCBjeWNsZSBmb3IgYSB0eXBlIHVubGVzcyBpdCdzIGFsc28gYVxcbi1cXHRcXHQgKiBub2RlIHR5cGUuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoIShyZWMtXFx1MDAzZWZpZWxkX21hc2sgXFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXFxuK3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcXG4rXFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXFxuK3tcXG4rXFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcXG4rXFx0dTMyIGJ0Zl9pZDtcXG4rXFxuK1xcdGlmIChmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XFxuK1xcdFxcdGJ0Zl9pZCA9IGZpZWxkLVxcdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcXG4rXFx0fSBlbHNlIGlmIChmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XFxuK1xcdFxcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVxcdTAwM2VrcHRyLmJ0ZikpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNla3B0ci5idGZfaWQ7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHR9XFxuK1xcbitcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbitcXHRpZiAoIW1ldGEpXFxuK1xcdFxcdHJldHVybiBmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XFxuK1xcdHJldHVybiBtZXRhIC0gdGFiLVxcdTAwM2V0eXBlcztcXG4rfVxcbitcXG4rLypcXG4rICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXFxuKyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XFxuKyAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XFxuKyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXFxuKyAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cXG4rICovXFxuKyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxcbitcXG4rc3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcXG4rXFx0XFx0XFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxcbit7XFxuK1xcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXFx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xcbitcXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xcbitcXG4rXFx0aWYgKCFkZXB0aF9sZWZ0KVxcbitcXHRcXHRyZXR1cm4gLUVMT09QO1xcbitcXHRpZiAoZGVwdGhbaWR4XSlcXG4rXFx0XFx0Z290byBkb25lO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG4rXFx0XFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0pO1xcbitcXHRcXHRpZiAocmV0ID09IC1FTk9FTlQpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcXG4rXFx0fVxcbitcXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcXG4rZG9uZTpcXG4rXFx0cmV0dXJuIGRlcHRoW2lkeF0gXFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcXG4rfVxcbiBcXG4tXFx0XFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcXG4tXFx0XFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxcbi1cXHRcXHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXFxuLVxcdFxcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxcbi1cXHRcXHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcXG4tXFx0XFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCdzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy5cXG4tXFx0XFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhXFxuLVxcdFxcdCAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCdzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy5cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHNcXG4tXFx0XFx0ICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy5cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6XFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXBcXG4tXFx0XFx0ICogY2hhaW4gY2FuIGJlOlxcbi1cXHRcXHQgKlxcdEEgLVxcdTAwM2UgQiAtXFx1MDAzZSBDXFxuLVxcdFxcdCAqIFdoZXJlOlxcbi1cXHRcXHQgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuXFxuLVxcdFxcdCAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kXFxuLVxcdFxcdCAqICAgYnBmX2xpc3RfaGVhZC5cXG4tXFx0XFx0ICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZVxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5XFxuLVxcdFxcdCAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duXFxuLVxcdFxcdCAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuXFxuLVxcdFxcdCAqXFx0QSAtXFx1MDAzZSBCXFxuLVxcdFxcdCAqIFdoZXJlOlxcbi1cXHRcXHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxcbi1cXHRcXHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKG1ldGEtXFx1MDAzZXJlY29yZC1cXHUwMDNlZmllbGRfbWFzayBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxcbi1cXHRcXHRcXHRyZXR1cm4gLUVMT09QO1xcbitzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbitcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXFxuK3tcXG4rXFx0dTggKmRlcHRoO1xcbitcXHRpbnQgaSwgcmV0ID0gMDtcXG4rXFxuK1xcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVxcdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG4rXFx0aWYgKCFkZXB0aClcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbitcXHRcXHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0cmV0ID0gMDtcXG4gXFx0fVxcbi1cXHRyZXR1cm4gMDtcXG4rXFx0a3ZmcmVlKGRlcHRoKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxuQEAgLTYwNjAsNiArNjA5NCwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcXG4gXFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuIFxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuIFxcdFxcdH1cXG4rXFxuK1xcdFxcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xcbitcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBlcnJvdXRfbWV0YTtcXG4gXFx0fVxcbiBcXG4gXFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcXHUwMDI2ZW52LVxcdTAwM2Vsb2cpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xcbmluZGV4IGMzZDEzM2M2YTAwZDQuLjUyZmFiYmVlM2RkNWEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcXG5AQCAtNzE0LDcgKzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXG4gXFx0XFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XFxuLVxcdFxcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbitcXHRcXHRBU1NFUlRfRVEoZXJyLCAwLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0fVxcbkBAIC03NzMsNyArNzczLDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcbiBcXHRcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4tXFx0XFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShlcnIsIDAsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4gXFx0XFx0YnRmX19mcmVlKGJ0Zik7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHR9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5hNDg3YWE2OGYyZWVmXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmNcXG5AQCAtMCwwICsxLDI5NiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFNQSU5fTE9DSyAyXFxuKyNkZWZpbmUgTElTVF9IRUFEIDNcXG4rI2RlZmluZSBMSVNUX05PREUgNFxcbisvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi9cXG4rI2RlZmluZSBNQVhfT1dORVJTSElQX0RFUFRIIDhcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFx0aW50IGlkO1xcbitcXG4rXFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImJ0Zl9fbmV3X2VtcHR5XFxcIikpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRpZCA9IGJ0Zl9fYWRkX2ludChidGYsIFxcXCJpbnRcXFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCAxLCBcXFwiYnRmX19hZGRfaW50XFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiYnBmX3NwaW5fbG9ja1xcXCIsIDQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2tcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJicGZfbGlzdF9oZWFkXFxcIiwgMTYpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9IRUFELCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJicGZfbGlzdF9ub2RlXFxcIiwgMjQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X25vZGVcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHRyZXR1cm4gYnRmO1xcbitcXG4rZXJyX291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGFkZF9sb2NhbF9rcHRyKHN0cnVjdCBidGYgKmJ0ZiwgaW50IHBvaW50ZWVfaWQsIGNvbnN0IGNoYXIgKnRhZylcXG4re1xcbitcXHRpbnQgaWQ7XFxuK1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3R5cGVfdGFnKGJ0ZiwgdGFnLCBwb2ludGVlX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFxcXCJidGZfX2FkZF90eXBlX3RhZ1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gaWQ7XFxuK1xcdGlkID0gYnRmX19hZGRfcHRyKGJ0ZiwgaWQpO1xcbitcXHRBU1NFUlRfR1QoaWQsIDAsIFxcXCJidGZfX2FkZF9wdHJcXFwiKTtcXG4rXFx0cmV0dXJuIGlkO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKVxcbit7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFx0aW50IGlkLCBlcnI7XFxuK1xcbitcXHRidGYgPSBpbml0X2J0ZigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiaW5pdF9idGZcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgdGFnKTtcXG4rXFx0aWYgKGlkIFxcdTAwM2M9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJzZWxmX2N5Y2xlXFxcIiwgOCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcXFwiYnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcIm5leHRcXFwiLCA2LCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgc2VsZl9jeWNsZTo6bmV4dFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcXFwia3B0clxcXCIpO1xcbitcXHRpZiAoaWQgXFx1MDAzYz0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA5LCBcXFwia3B0clxcXCIpO1xcbitcXHRpZiAoaWQgXFx1MDAzYz0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcImN5Y2xlX2FcXFwiLCA4KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFxcXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwiYlxcXCIsIDYsIDAsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBjeWNsZV9hOjpiXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJjeWNsZV9iXFxcIiwgOCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJhXFxcIiwgOCwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIFxcXCJrcHRyXFxcIik7XFxuK1xcdGlmIChpZCBcXHUwMDNjPSAwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwibWl4ZWRfb3duZXJcXFwiLCAyMCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcXFwiYnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJyb290XFxcIiwgTElTVF9IRUFELCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcImxvY2tcXFwiLCBTUElOX0xPQ0ssIDEyOCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXFxcImNvbnRhaW5zOm1peGVkX25vZGU6bm9kZVxcXCIsIDcsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXFxcImJ0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJtaXhlZF9ub2RlXFxcIiwgMzIpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgOSwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJub2RlXFxcIiwgTElTVF9OT0RFLCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwib3duZXJcXFwiLCA2LCAxOTIsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgYm9vbCBjaGlsZF9maXJzdCwgYm9vbCBzaGFyZWRfc3VmZml4LCBpbnQgZXhwZWN0ZWRfZXJyKVxcbit7XFxuK1xcdGludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCArIDFdO1xcbitcXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyLCBpLCBuLCBwb2ludGVlX2lkO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRlcHRoOyBpKyspIHtcXG4rXFx0XFx0aWYgKGkgPT0gZGVwdGggLSAxKVxcbitcXHRcXHRcXHRwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICsgZGVwdGg7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0cG9pbnRlZV9pZCA9IGZpcnN0X3N0cnVjdF9pZCArIChjaGlsZF9maXJzdCA/IGRlcHRoIC0gMiAtIGkgOiBpICsgMSk7XFxuK1xcdFxcdHB0cl9pZFtpXSA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgcG9pbnRlZV9pZCwgXFxcImtwdHJcXFwiKTtcXG4rXFx0XFx0aWYgKHB0cl9pZFtpXSBcXHUwMDNjPSAwKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRmb3IgKG4gPSAwOyBuIFxcdTAwM2MgZGVwdGg7IG4rKykge1xcbitcXHRcXHRjaGFyIG5hbWVbMzJdO1xcbitcXHRcXHRpbnQgb2Zmc2V0ID0gMDtcXG4rXFxuK1xcdFxcdGkgPSBjaGlsZF9maXJzdCA/IGRlcHRoIC0gMSAtIG4gOiBuO1xcbitcXHRcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJvd25lcl8lZFxcXCIsIGkpO1xcbitcXHRcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggXFx1MDAyNlxcdTAwMjYgIWkgPyAxNiA6IDgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgbiwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBvd25lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWYgKHNoYXJlZF9zdWZmaXggXFx1MDAyNlxcdTAwMjYgIWkpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogVmlzaXQgdGhlIHNoYXJlZCBzdWZmaXggdGhyb3VnaCB0aGUgc2hvcnRlciBwYXRoIGJlZm9yZVxcbitcXHRcXHRcXHQgKiByZWFjaGluZyBpdCBhZ2FpbiB3aXRoIGxlc3MgcmVtYWluaW5nIGRlcHRoLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwic3VmZml4XFxcIiwgcHRyX2lkWzFdLCAwLCAwKTtcXG4rXFx0XFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgb3duZXI6OnN1ZmZpeFxcXCIpKVxcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0b2Zmc2V0ID0gNjQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibmV4dFxcXCIsIHB0cl9pZFtpXSwgb2Zmc2V0LCAwKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgb3duZXI6Om5leHRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwicGxhaW5fbGVhZlxcXCIsIDQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgZGVwdGgsIFxcXCJidGZfX2FkZF9zdHJ1Y3QgcGxhaW5fbGVhZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9ncmFwaF9kZXB0aChib29sIHJidHJlZSwgaW50IGRlcHRoLCBpbnQgZXhwZWN0ZWRfZXJyKVxcbit7XFxuK1xcdGludCByb290X3R5cGUgPSBMSVNUX0hFQUQsIG5vZGVfdHlwZSA9IExJU1RfTk9ERSwgbm9kZV9zaXplID0gMjQ7XFxuK1xcdGludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFxuK1xcdGJ0ZiA9IGluaXRfYnRmKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJpbml0X2J0ZlxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChyYnRyZWUpIHtcXG4rXFx0XFx0cm9vdF90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcImJwZl9yYl9yb290XFxcIiwgMTYpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HVChyb290X3R5cGUsIDAsIFxcXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX3Jvb3RcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJicGZfcmJfbm9kZVxcXCIsIDMyKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1Qobm9kZV90eXBlLCAwLCBcXFwiYnRmX19hZGRfc3RydWN0IGJwZl9yYl9ub2RlXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRub2RlX3NpemUgPSAzMjtcXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRlcHRoOyBpKyspIHtcXG4rXFx0XFx0Y2hhciBuYW1lWzMyXSwgdGFnWzY0XTtcXG4rXFxuK1xcdFxcdGxvY2tfb2ZmID0gaSA/IG5vZGVfc2l6ZSA6IDA7XFxuK1xcdFxcdHJvb3Rfb2ZmID0gbG9ja19vZmYgKyA4O1xcbitcXHRcXHRzaXplID0gaSA9PSBkZXB0aCAtIDEgPyBub2RlX3NpemUgOiByb290X29mZiArIDE2O1xcbitcXHRcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJncmFwaF9vd25lcl8lZFxcXCIsIGkpO1xcbitcXHRcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBncmFwaF9vd25lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWYgKGkpIHtcXG4rXFx0XFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibm9kZVxcXCIsIG5vZGVfdHlwZSwgMCwgMCk7XFxuK1xcdFxcdFxcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlXFxcIikpXFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChpID09IGRlcHRoIC0gMSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcImxvY2tcXFwiLCBTUElOX0xPQ0ssIGxvY2tfb2ZmICogOCwgMCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpsb2NrXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJyb290XFxcIiwgcm9vdF90eXBlLCByb290X29mZiAqIDgsIDApO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c25wcmludGYodGFnLCBzaXplb2YodGFnKSwgXFxcImNvbnRhaW5zOmdyYXBoX293bmVyXyVkOm5vZGVcXFwiLCBpICsgMSk7XFxuK1xcdFxcdGVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1QoZXJyLCAwLCBcXFwiYnRmX19hZGRfZGVjbF90YWcgZ3JhcGhfb3duZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbitcXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rb3V0OlxcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNlbGZfY3ljbGVcXFwiKSlcXG4rXFx0XFx0dGVzdF9zZWxmX2N5Y2xlKFxcXCJrcHRyXFxcIiwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInVudHJ1c3RlZF9zZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2VsZl9jeWNsZShcXFwia3B0cl91bnRydXN0ZWRcXFwiLCAwKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBlcmNwdV9zZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2VsZl9jeWNsZShcXFwicGVyY3B1X2twdHJcXFwiLCAtRUxPT1ApO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiQUJBX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3RfYWJhX2N5Y2xlKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtaXhlZF9ncmFwaF9yb290X2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3RfbWl4ZWRfY3ljbGUoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1heF9hY3ljbGljXFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgZmFsc2UsIDApO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidG9vX2RlZXBfYWN5Y2xpY1xcXCIpKVxcbitcXHRcXHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIGZhbHNlLCBmYWxzZSwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1heF9hY3ljbGljX2NoaWxkX2ZpcnN0XFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCB0cnVlLCBmYWxzZSwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0XFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgdHJ1ZSwgZmFsc2UsIC1FTE9PUCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYXhfYWN5Y2xpY19zaGFyZWRfc3VmZml4XFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgdHJ1ZSwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcXFwiKSlcXG4rXFx0XFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggKyAxLCBmYWxzZSwgdHJ1ZSwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxpc3RfdGhyZWVfdHlwZXNcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgMywgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJsaXN0X2ZvdXJfdHlwZXNcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJsaXN0X21heF9kZXB0aFxcXCIpKVxcbitcXHRcXHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxpc3RfdG9vX2RlZXBcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyYnRyZWVfdGhyZWVfdHlwZXNcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCAzLCAwKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJidHJlZV9mb3VyX3R5cGVzXFxcIikpXFxuK1xcdFxcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgNCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyYnRyZWVfbWF4X2RlcHRoXFxcIikpXFxuK1xcdFxcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyYnRyZWVfdG9vX2RlZXBcXFwiKSlcXG4rXFx0XFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCBNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgLUVMT09QKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjoyODozNi4xOTU0NjE2NzVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE1MDUyNjU5MTk5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lcnNoaXBfZGVwdGhcIixcbiAgICBcImJ0Zl9vd25lZF90eXBlX2lkeFwiLFxuICAgIFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgICBcImJwZl9idGZfbG9hZFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZXh0ZW5kcyBCVEYgb3duZXJzaGlwIGFuZCBjeWNsZSB2YWxpZGF0aW9uIGJ5IGludHJvZHVjaW5nIGRlcHRoLWJvdW5kZWQgZ3JhcGggdHJhdmVyc2FsIChidGZfb3duZXJzaGlwX2RlcHRoIGFuZCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKSB0byB2YWxpZGF0ZSBvd25lcnNoaXAgcmVsYXRpb25zaGlwcyBpbiB1c2VyLWxvYWRlZCBCVEYgdHlwZXMgKHN1Y2ggYXMgZ3JhcGggcm9vdHMgYW5kIGtwdHJzKS4gVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSBhbmQgaXMgZGlyZWN0bHkgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYnBmKCkgc3lzY2FsbCAoQlBGX0JURl9MT0FEKS4gRnV6emluZyBjYW4gdmVyaWZ5IHJlY3Vyc2lvbiBib3VuZHMsIGN5Y2xlIGRldGVjdGlvbiBjb3JyZWN0bmVzcywgYW5kIGVkZ2UgY2FzZXMgaW4gcGFyc2luZyBhcmJpdHJhcnkgdXNlci1zdXBwbGllZCBCVEYgZGF0YS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBmNTg0NTI1Zjk5NjAwZjZmN2FkN2JkYjg5YmVhZWNjNWZiNDhkZjgxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTY6Mjg6MzIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuY1xuaW5kZXggN2RhZjRjMjg2YzliMi4uOTIyMTdhMTRiOWQzZCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvYnRmLmNcbisrKyBiL2tlcm5lbC9icGYvYnRmLmNcbkBAIC00Mjg0LDEzICs0Mjg0LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4ge1xuIFx0aW50IGk7XG4gXG4tXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XG4tXHQgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LlxuLVx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJ3Qgc3RvcmVcbi1cdCAqIHJlZmVyZW5jZXMgdG8gcHJvZ3JhbSBhbGxvY2F0ZWQgbG9jYWwgdHlwZXMuXG4tXHQgKlxuLVx0ICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcFxuLVx0ICogZG9lcyBub3QgZm9ybSBjeWNsZXMuXG4rXHQvKlxuK1x0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG4rXHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXG4rXHQgKiBiZWVuIGZpeGVkIHVwLlxuIFx0ICovXG4gXHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxuIFx0XHRyZXR1cm4gMDtcbkBAIC00MzIxLDUxICs0MzE4LDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGlmICghbWV0YSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuK1x0fVxuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxuLVx0XHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQncyBhbHNvIGFcbi1cdFx0ICogbm9kZSB0eXBlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9OT0RFKSlcbitzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXG4rXHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG4re1xuK1x0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcbitcdHUzMiBidGZfaWQ7XG4rXG4rXHRpZiAoZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcbitcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG4rXHR9IGVsc2UgaWYgKGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XG4rXHRcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSlcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNla3B0ci5idGZfaWQ7XG4rXHR9IGVsc2Uge1xuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbitcbitcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG4rXHRpZiAoIW1ldGEpXG4rXHRcdHJldHVybiBmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xuK1x0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG4rfVxuK1xuKy8qXG4rICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXG4rICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcbisgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuKyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXG4rICogbm9uLXJlY3Vyc2luZyBkcm9wLlxuKyAqL1xuKyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxuK1xuK3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcbitcdFx0XHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi1cdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcbitcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XG4rXG4rXHRpZiAoIWRlcHRoX2xlZnQpXG4rXHRcdHJldHVybiAtRUxPT1A7XG4rXHRpZiAoZGVwdGhbaWR4XSlcbitcdFx0Z290byBkb25lO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSsrKSB7XG4rXHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG4rXHRcdGlmIChyZXQgPT0gLUVOT0VOVClcbiBcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcbitcdH1cbitcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggKyAxO1xuK2RvbmU6XG4rXHRyZXR1cm4gZGVwdGhbaWR4XSBcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XG4rfVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIGVuc3VyZSBvd25lcnNoaXAgYWN5Y2xpY2l0eSBhbW9uZyBhbGwgdHlwZXMuIFRoZVxuLVx0XHQgKiBwcm9wZXIgd2F5IHRvIGRvIGl0IHdvdWxkIGJlIHRvIHRvcG9sb2dpY2FsbHkgc29ydCBhbGwgQlRGXG4tXHRcdCAqIElEcyBiYXNlZCBvbiB0aGUgb3duZXJzaGlwIGVkZ2VzLCBzaW5jZSB0aGVyZSBjYW4gYmUgbXVsdGlwbGVcbi1cdFx0ICogYnBmX3tsaXN0X2hlYWQscmJfbm9kZX0gaW4gYSB0eXBlLiBJbnN0ZWFkLCB3ZSB1c2UgdGhlXG4tXHRcdCAqIGZvbGxvd2luZyByZXNhb25pbmc6XG4tXHRcdCAqXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IGJlIG93bmVkIGJ5IGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdFxuLVx0XHQgKiAgIGhhcyBhIGJwZl97bGlzdCxyYn1fbm9kZS4gTGV0J3MgY2FsbCB0aGVzZSBub2RlIHR5cGVzLlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBfb3duXyBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQgaGFzIGFcbi1cdFx0ICogICBicGZfe2xpc3RfaGVhZCxyYl9yb290fS4gTGV0J3MgY2FsbCB0aGVzZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0c1xuLVx0XHQgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eTpcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcFxuLVx0XHQgKiBjaGFpbiBjYW4gYmU6XG4tXHRcdCAqXHRBIC1cdTAwM2UgQiAtXHUwMDNlIENcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC5cbi1cdFx0ICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmRcbi1cdFx0ICogICBicGZfbGlzdF9oZWFkLlxuLVx0XHQgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlXG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHlcbi1cdFx0ICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd25cbi1cdFx0ICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy5cbi1cdFx0ICpcdEEgLVx1MDAzZSBCXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxuLVx0XHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKG1ldGEtXHUwMDNlcmVjb3JkLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxuLVx0XHRcdHJldHVybiAtRUxPT1A7XG4rc3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHRcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcbit7XG4rXHR1OCAqZGVwdGg7XG4rXHRpbnQgaSwgcmV0ID0gMDtcbitcbitcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuK1x0aWYgKCFkZXB0aClcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWItXHUwMDNlY250OyBpKyspIHtcbitcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksXG4rXHRcdFx0XHRcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRyZXQgPSAwO1xuIFx0fVxuLVx0cmV0dXJuIDA7XG4rXHRrdmZyZWUoZGVwdGgpO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG5AQCAtNjA2MCw2ICs2MDk0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0XHR9XG4rXG4rXHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xuK1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG4gXHR9XG4gXG4gXHRlcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFx1MDAyNmVudi1cdTAwM2Vsb2cpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXG5pbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuQEAgLTcxNCw3ICs3MTQsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCJjaGVjayBidGZcIik7XG4gXHRcdGJ0Zl9fZnJlZShidGYpO1xuIFx0XHRicmVhaztcbiBcdH1cbkBAIC03NzMsNyArNzczLDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcbiBcdFx0XHRicmVhaztcbiBcbiBcdFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4tXHRcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rXHRcdEFTU0VSVF9FUShlcnIsIDAsIFwiY2hlY2sgYnRmXCIpO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5hNDg3YWE2OGYyZWVmXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5AQCAtMCwwICsxLDI5NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rXG4rI2RlZmluZSBTUElOX0xPQ0sgMlxuKyNkZWZpbmUgTElTVF9IRUFEIDNcbisjZGVmaW5lIExJU1RfTk9ERSA0XG4rLyogS2VlcCBpbiBzeW5jIHdpdGggQlRGX01BWF9PV05FUlNISVBfREVQVEguICovXG4rI2RlZmluZSBNQVhfT1dORVJTSElQX0RFUFRIIDhcbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqaW5pdF9idGYodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQ7XG4rXG4rXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJidGZfX25ld19lbXB0eVwiKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZCA9IGJ0Zl9fYWRkX2ludChidGYsIFwiaW50XCIsIDQsIEJURl9JTlRfU0lHTkVEKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCAxLCBcImJ0Zl9fYWRkX2ludFwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9zcGluX2xvY2tcIiwgNCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfc3Bpbl9sb2NrXCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX2xpc3RfaGVhZFwiLCAxNik7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9IRUFELCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9oZWFkXCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX2xpc3Rfbm9kZVwiLCAyNCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRyZXR1cm4gYnRmO1xuK1xuK2Vycl9vdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgaW50IGFkZF9sb2NhbF9rcHRyKHN0cnVjdCBidGYgKmJ0ZiwgaW50IHBvaW50ZWVfaWQsIGNvbnN0IGNoYXIgKnRhZylcbit7XG4rXHRpbnQgaWQ7XG4rXG4rXHRpZCA9IGJ0Zl9fYWRkX3R5cGVfdGFnKGJ0ZiwgdGFnLCBwb2ludGVlX2lkKTtcbitcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcImJ0Zl9fYWRkX3R5cGVfdGFnXCIpKVxuK1x0XHRyZXR1cm4gaWQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3B0cihidGYsIGlkKTtcbitcdEFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF9wdHJcIik7XG4rXHRyZXR1cm4gaWQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2VsZl9jeWNsZShjb25zdCBjaGFyICp0YWcsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnI7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJzZWxmX2N5Y2xlXCIsIDgpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwiYnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm5leHRcIiwgNiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgc2VsZl9jeWNsZTo6bmV4dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnI7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcImtwdHJcIik7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA5LCBcImtwdHJcIik7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJjeWNsZV9hXCIsIDgpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2FcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImJcIiwgNiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiY3ljbGVfYlwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwiYVwiLCA4LCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBjeWNsZV9iOjphXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9taXhlZF9jeWNsZSh2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcImtwdHJcIik7XG4rXHRpZiAoaWQgXHUwMDNjPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJtaXhlZF9vd25lclwiLCAyMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXCJidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcInJvb3RcIiwgTElTVF9IRUFELCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6cm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibG9ja1wiLCBTUElOX0xPQ0ssIDEyOCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OmxvY2tcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9kZWNsX3RhZyhidGYsIFwiY29udGFpbnM6bWl4ZWRfbm9kZTpub2RlXCIsIDcsIDApO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDgsIFwiYnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcIm1peGVkX25vZGVcIiwgMzIpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwiYnRmX19hZGRfc3RydWN0IG1peGVkX25vZGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm5vZGVcIiwgTElTVF9OT0RFLCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpub2RlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJvd25lclwiLCA2LCAxOTIsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgYm9vbCBjaGlsZF9maXJzdCwgYm9vbCBzaGFyZWRfc3VmZml4LCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdGludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCArIDFdO1xuK1x0aW50IGZpcnN0X3N0cnVjdF9pZDtcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyLCBpLCBuLCBwb2ludGVlX2lkO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGZpcnN0X3N0cnVjdF9pZCA9IDUgKyAyICogZGVwdGg7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSsrKSB7XG4rXHRcdGlmIChpID09IGRlcHRoIC0gMSlcbitcdFx0XHRwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICsgZGVwdGg7XG4rXHRcdGVsc2VcbitcdFx0XHRwb2ludGVlX2lkID0gZmlyc3Rfc3RydWN0X2lkICsgKGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAyIC0gaSA6IGkgKyAxKTtcbitcdFx0cHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBwb2ludGVlX2lkLCBcImtwdHJcIik7XG4rXHRcdGlmIChwdHJfaWRbaV0gXHUwMDNjPSAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0Zm9yIChuID0gMDsgbiBcdTAwM2MgZGVwdGg7IG4rKykge1xuK1x0XHRjaGFyIG5hbWVbMzJdO1xuK1x0XHRpbnQgb2Zmc2V0ID0gMDtcbitcbitcdFx0aSA9IGNoaWxkX2ZpcnN0ID8gZGVwdGggLSAxIC0gbiA6IG47XG4rXHRcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCJvd25lcl8lZFwiLCBpKTtcbitcdFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBuYW1lLCBzaGFyZWRfc3VmZml4IFx1MDAyNlx1MDAyNiAhaSA/IDE2IDogOCk7XG4rXHRcdGlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgKyBuLCBcImJ0Zl9fYWRkX3N0cnVjdCBvd25lclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWYgKHNoYXJlZF9zdWZmaXggXHUwMDI2XHUwMDI2ICFpKSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBWaXNpdCB0aGUgc2hhcmVkIHN1ZmZpeCB0aHJvdWdoIHRoZSBzaG9ydGVyIHBhdGggYmVmb3JlXG4rXHRcdFx0ICogcmVhY2hpbmcgaXQgYWdhaW4gd2l0aCBsZXNzIHJlbWFpbmluZyBkZXB0aC5cbitcdFx0XHQgKi9cbitcdFx0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwic3VmZml4XCIsIHB0cl9pZFsxXSwgMCwgMCk7XG4rXHRcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG93bmVyOjpzdWZmaXhcIikpXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHRvZmZzZXQgPSA2NDtcbitcdFx0fVxuK1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibmV4dFwiLCBwdHJfaWRbaV0sIG9mZnNldCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJwbGFpbl9sZWFmXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcImJ0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9ncmFwaF9kZXB0aChib29sIHJidHJlZSwgaW50IGRlcHRoLCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdGludCByb290X3R5cGUgPSBMSVNUX0hFQUQsIG5vZGVfdHlwZSA9IExJU1RfTk9ERSwgbm9kZV9zaXplID0gMjQ7XG4rXHRpbnQgaWQsIGVyciwgaSwgbG9ja19vZmYsIHJvb3Rfb2ZmLCBzaXplO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlmIChyYnRyZWUpIHtcbitcdFx0cm9vdF90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfcmJfcm9vdFwiLCAxNik7XG4rXHRcdGlmICghQVNTRVJUX0dUKHJvb3RfdHlwZSwgMCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX3Jvb3RcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdG5vZGVfdHlwZSA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX3JiX25vZGVcIiwgMzIpO1xuK1x0XHRpZiAoIUFTU0VSVF9HVChub2RlX3R5cGUsIDAsIFwiYnRmX19hZGRfc3RydWN0IGJwZl9yYl9ub2RlXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRub2RlX3NpemUgPSAzMjtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0Y2hhciBuYW1lWzMyXSwgdGFnWzY0XTtcbitcbitcdFx0bG9ja19vZmYgPSBpID8gbm9kZV9zaXplIDogMDtcbitcdFx0cm9vdF9vZmYgPSBsb2NrX29mZiArIDg7XG4rXHRcdHNpemUgPSBpID09IGRlcHRoIC0gMSA/IG5vZGVfc2l6ZSA6IHJvb3Rfb2ZmICsgMTY7XG4rXHRcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCJncmFwaF9vd25lcl8lZFwiLCBpKTtcbitcdFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBuYW1lLCBzaXplKTtcbitcdFx0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfc3RydWN0IGdyYXBoX293bmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRpZiAoaSkge1xuK1x0XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJub2RlXCIsIG5vZGVfdHlwZSwgMCwgMCk7XG4rXHRcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpub2RlXCIpKVxuK1x0XHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0aWYgKGkgPT0gZGVwdGggLSAxKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibG9ja1wiLCBTUElOX0xPQ0ssIGxvY2tfb2ZmICogOCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6bG9ja1wiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcInJvb3RcIiwgcm9vdF90eXBlLCByb290X29mZiAqIDgsIDApO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6OnJvb3RcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNucHJpbnRmKHRhZywgc2l6ZW9mKHRhZyksIFwiY29udGFpbnM6Z3JhcGhfb3duZXJfJWQ6bm9kZVwiLCBpICsgMSk7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgdGFnLCBpZCwgaSA/IDIgOiAxKTtcbitcdFx0aWYgKCFBU1NFUlRfR1QoZXJyLCAwLCBcImJ0Zl9fYWRkX2RlY2xfdGFnIGdyYXBoX293bmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbit2b2lkIHRlc3RfbG9jYWxfa3B0cl9vd25lcnNoaXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcImtwdHJcIiwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidW50cnVzdGVkX3NlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcImtwdHJfdW50cnVzdGVkXCIsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwZXJjcHVfc2VsZl9jeWNsZVwiKSlcbitcdFx0dGVzdF9zZWxmX2N5Y2xlKFwicGVyY3B1X2twdHJcIiwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiQUJBX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X2FiYV9jeWNsZSgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtaXhlZF9ncmFwaF9yb290X2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X21peGVkX2N5Y2xlKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1heF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgZmFsc2UsIGZhbHNlLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidG9vX2RlZXBfYWN5Y2xpY1wiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggKyAxLCBmYWxzZSwgZmFsc2UsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1heF9hY3ljbGljX2NoaWxkX2ZpcnN0XCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgdHJ1ZSwgZmFsc2UsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljX2NoaWxkX2ZpcnN0XCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIHRydWUsIGZhbHNlLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYXhfYWN5Y2xpY19zaGFyZWRfc3VmZml4XCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgZmFsc2UsIHRydWUsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgZmFsc2UsIHRydWUsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfdGhyZWVfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDMsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJsaXN0X2ZvdXJfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIDQsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJsaXN0X21heF9kZXB0aFwiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfdG9vX2RlZXBcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgoZmFsc2UsIE1BWF9PV05FUlNISVBfREVQVEggKyAxLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyYnRyZWVfdGhyZWVfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgMywgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV9mb3VyX3R5cGVzXCIpKVxuK1x0XHR0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIDQsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyYnRyZWVfbWF4X2RlcHRoXCIpKVxuK1x0XHR0ZXN0X2dyYXBoX2RlcHRoKHRydWUsIE1BWF9PV05FUlNISVBfREVQVEgsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyYnRyZWVfdG9vX2RlZXBcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjg6MzYuMTk1NDYzMTc1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTYwMTUxNzQxNDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEJQRiBCVEYgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgcmV2aWV3IHJlcXVlc3QuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0IHRhcmdldHMgbW9kaWZpY2F0aW9ucyB3aXRoaW4gYGtlcm5lbC9icGYvYnRmLmNgIGFuZCBhbHNvIHRvdWNoZXMgdGhlIHNlbGZ0ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2AuIFRoYXQncyBhIHJlYXNvbmFibGUgc2NvcGU7IEJURiBjaGFuZ2VzIG9mdGVuIG5lY2Vzc2l0YXRlIHRlc3QgYWRqdXN0bWVudHMuXG5cbk5vdywgbGV0J3MgbG9vayBhdCB0aGUgZGlmZi4gU3BlY2lmaWNhbGx5LCBJIHNlZSBjaGFuZ2VzIHdpdGhpbiBga2VybmVsL2JwZi9idGYuY2AgaW1wYWN0aW5nIHRoZSBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGZ1bmN0aW9uLiBOb3RhYmx5LCB0aGV5J3ZlIHJlbW92ZWQgc29tZSBvbGQgY3ljbGUtY2hlY2tpbmcgbG9naWMgYW5kIGludHJvZHVjZWQgbmV3IGZ1bmN0aW9uczogYGJ0Zl9vd25lZF90eXBlX2lkeGAsIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYW5kIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYC4gQ3J1Y2lhbGx5LCBJIHNlZSB0aGF0IGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCBpcyBub3cgY2FsbGVkIHdpdGhpbiBgYnRmX3BhcnNlYDpcblxuYGBgY1xuXHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xuXHRcdGlmIChlcnIgXHUwMDNjIDApXG5cdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuYGBgXG5cblRoaXMgaXMgc2lnbmlmaWNhbnQuIGBidGZfcGFyc2VgIGlzIHBhcnQgb2YgdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSwgd2l0aGluIGBrZXJuZWwvYnBmL2J0Zi5jYCwgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIEJURiBsb2FkaW5nIGFuZCB2YWxpZGF0aW9uLiBSZW1lbWJlciwgYGJ0Zl9wYXJzZWAgaXMgaW52b2tlZCB3aGVuIGxvYWRpbmcgQlRGIGRhdGEgdmlhIHRoZSBgYnBmYCBzeXNjYWxsJ3MgYEJQRl9CVEZfTE9BRGAgb3BlcmF0aW9uLiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIFRoaXMgZnVuY3Rpb24gaXMgKmRpcmVjdGx5KiBpbnZvbHZlZCBpbiBwcm9jZXNzaW5nIHVudHJ1c3RlZCB1c2VyIGlucHV0IHRoYXQgY29tZXMgZnJvbSB1c2Vyc3BhY2Ugd2hlbiBjYWxsaW5nIGBzeXNfYnBmKEJQRl9CVEZfTE9BRCwgLi4uKWAhIFdlJ3JlIHRhbGtpbmcgYWJvdXQgYSBjcml0aWNhbCB2YWxpZGF0aW9uIHBvaW50LlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gcXVpY2tseSBldmFsdWF0ZSByZWFjaGFiaWxpdHkuIE5vIHN1cnByaXNlcyBoZXJlLCBJIGV4cGVjdCB0aGF0IHRoaXMgYEJQRl9CVEZfTE9BRGAgc3lzY2FsbCBpcyByZWFkaWx5IHJlYWNoYWJsZSBpbiBzdGFuZGFyZCBRRU1VL3N5emthbGxlciBzZXR1cHMuICBTeXprYWxsZXIgaXMga25vd24gdG8gYWdncmVzc2l2ZWx5IGZ1enogdGhpcyBzeXNjYWxsLCB3aGljaCBtYWtlcyB0aGlzIGNoYW5nZSBwb3RlbnRpYWxseSBoaWdoLWltcGFjdC5cblxuSSdsbCBub3cgbmVlZCB0byByZWFkIGFyb3VuZCB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgcmVsYXRlZCBjaGFuZ2VzIHdpdGhpbiBga2VybmVsL2JwZi9idGYuY2AgdG8gZ2V0IGEgYmV0dGVyIHNlbnNlIG9mIHRoZSBjb250ZXh0IGFuZCBpbXBhY3QgdXNpbmcgYHJlYWQtZmlsZWAgb3IgYGdyZXBwZXJgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzQ4LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzM1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjg6NTIuMjEwNjQwMTE5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwNDMzMDUyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9idGYuYz00MzU2PXN0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQzODMtXFxua2VybmVsL2JwZi9idGYuYzo0Mzg0OnN0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxua2VybmVsL2JwZi9idGYuYy00Mzg1LVxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjAxND1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA5Ny1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTg6XFx0XFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XFxua2VybmVsL2JwZi9idGYuYy02MDk5LVxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjoyODo1Mi4yNjEwNzg2NTFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNzgxNjE5MDMyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSBtZW50YWwgd2Fsa3Rocm91Z2gsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhlIGNvZGU6XG5cbioqRGl2aW5nIGludG8gQlRGIEludGVybmFscyoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gZm9jdXNpbmcgb24gYGtlcm5lbC9icGYvYnRmLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSA0MzEwIHRvIDQ0MDUgbGluZSByYW5nZS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB3aGF0J3MgaGFwcGVuaW5nIGluIHRoaXMgc2VjdGlvbi4gSSBiZXQgaXQncyByZWxhdGVkIHRvIHNvbWUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIG1ldGFkYXRhIGhhbmRsaW5nLCBsaWtlbHkgZGVhbGluZyB3aXRoIGhvdyB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgb3IgbWFuaXB1bGF0ZWQuIEdpdmVuIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIEJURiBjb2RlLCBpdCdzIHByb2JhYmx5IHJlbGF0ZWQgdG8gZWl0aGVyIHBhcnNpbmcsIGdlbmVyYXRpbmcsIG9yIGNvbnN1bWluZyBCVEYgaW5mb3JtYXRpb24uIEknbGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCBmdW5jdGlvbihzKSBvciBsb2dpYyBiZWluZyBpbXBsZW1lbnRlZCBpbiB0aGF0IHNlY3Rpb24uIEFyZSB3ZSB2YWxpZGF0aW5nIHNvbWV0aGluZz8gRGVjb2RpbmcgdHlwZSBpbmZvcm1hdGlvbj8gQnVpbGRpbmcgQlRGIHN0cnVjdHVyZXM/IE9yIHBlcmhhcHMsIG1vZGlmeWluZyBCVEYgZGF0YSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzIGxpa2Uga2VybmVsIHVwZ3JhZGVzPyBJJ2xsIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIHN1cnJvdW5kaW5nIGNvbW1lbnRzIGNsb3NlbHkgZm9yIGNvbnRleHQsIHRoZW4gZGlnIGludG8gdGhlIGNvZGUgaXRzZWxmLCBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIHZhcmlhYmxlIG5hbWVzIGFuZCBmdW5jdGlvbiBjYWxscy4gS25vd2luZyBtZSwgSSdsbCBuZWVkIHRvIHRyYWNlIGEgZmV3IGNhbGxzIGRvd24gdG8gYmUgY2VydGFpbiBvZiBpdHMgdHJ1ZSBmdW5jdGlvbiBhbmQgcHVycG9zZS4gTGV0J3Mgc2VlIHdoYXQgc2VjcmV0cyB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgaG9sZHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNDUxLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6MTAuMDc3MjcxNTY5WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkyMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvYnRmLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDMxMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjQzMTA6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FMkJJRztcXG40MzExOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzMTI6XFx0XFx0XFx0fVxcbjQzMTM6XFx0XFxuNDMxNDpcXHRcXHRcXHRpZiAoIShyZWMtXFx1MDAzZWZpZWxkc1tpXS50eXBlIFxcdTAwMjYgQlBGX0dSQVBIX1JPT1QpKVxcbjQzMTU6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuNDMxNjpcXHRcXHRcXHRidGZfaWQgPSByZWMtXFx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcXG40MzE3OlxcdFxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxuNDMxODpcXHRcXHRcXHRpZiAoIW1ldGEpXFxuNDMxOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG40MzIwOlxcdFxcdFxcdHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cXHUwMDNlcmVjb3JkO1xcbjQzMjE6XFx0XFx0fVxcbjQzMjI6XFx0XFx0cmV0dXJuIDA7XFxuNDMyMzpcXHR9XFxuNDMyNDpcXHRcXG40MzI1OlxcdHN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcXG40MzI2OlxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxcbjQzMjc6XFx0e1xcbjQzMjg6XFx0XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcXG40MzI5OlxcdFxcdHUzMiBidGZfaWQ7XFxuNDMzMDpcXHRcXG40MzMxOlxcdFxcdGlmIChmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XFxuNDMzMjpcXHRcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuNDMzMzpcXHRcXHR9IGVsc2UgaWYgKGZpZWxkLVxcdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHtcXG40MzM0OlxcdFxcdFxcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVxcdTAwM2VrcHRyLmJ0ZikpXFxuNDMzNTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG40MzM2OlxcdFxcdFxcdGJ0Zl9pZCA9IGZpZWxkLVxcdTAwM2VrcHRyLmJ0Zl9pZDtcXG40MzM3OlxcdFxcdH0gZWxzZSB7XFxuNDMzODpcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG40MzM5OlxcdFxcdH1cXG40MzQwOlxcdFxcbjQzNDE6XFx0XFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcXG40MzQyOlxcdFxcdGlmICghbWV0YSlcXG40MzQzOlxcdFxcdFxcdHJldHVybiBmaWVsZC1cXHUwMDNldHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XFxuNDM0NDpcXHRcXHRyZXR1cm4gbWV0YSAtIHRhYi1cXHUwMDNldHlwZXM7XFxuNDM0NTpcXHR9XFxuNDM0NjpcXHRcXG40MzQ3OlxcdC8qXFxuNDM0ODpcXHQgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmRcXG40MzQ5OlxcdCAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XFxuNDM1MDpcXHQgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxcbjQzNTE6XFx0ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcXG40MzUyOlxcdCAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cXG40MzUzOlxcdCAqL1xcbjQzNTQ6XFx0I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XFxuNDM1NTpcXHRcXG40MzU2OlxcdHN0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuNDM1NzpcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxcbjQzNTg6XFx0XFx0XFx0XFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxcbjQzNTk6XFx0e1xcbjQzNjA6XFx0XFx0Y29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi1cXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XFxuNDM2MTpcXHRcXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xcbjQzNjI6XFx0XFxuNDM2MzpcXHRcXHRpZiAoIWRlcHRoX2xlZnQpXFxuNDM2NDpcXHRcXHRcXHRyZXR1cm4gLUVMT09QO1xcbjQzNjU6XFx0XFx0aWYgKGRlcHRoW2lkeF0pXFxuNDM2NjpcXHRcXHRcXHRnb3RvIGRvbmU7XFxuNDM2NzpcXHRcXG40MzY4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyByZWMtXFx1MDAzZWNudDsgaSsrKSB7XFxuNDM2OTpcXHRcXHRcXHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFxcdTAwMjZyZWMtXFx1MDAzZWZpZWxkc1tpXSk7XFxuNDM3MDpcXHRcXHRcXHRpZiAocmV0ID09IC1FTk9FTlQpXFxuNDM3MTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzcyOlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNzM6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40Mzc0OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcXG40Mzc1OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNzY6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40Mzc3OlxcdFxcdFxcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XFxuNDM3ODpcXHRcXHR9XFxuNDM3OTpcXHRcXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcXG40MzgwOlxcdGRvbmU6XFxuNDM4MTpcXHRcXHRyZXR1cm4gZGVwdGhbaWR4XSBcXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xcbjQzODI6XFx0fVxcbjQzODM6XFx0XFxuNDM4NDpcXHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbjQzODU6XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbjQzODY6XFx0e1xcbjQzODc6XFx0XFx0dTggKmRlcHRoO1xcbjQzODg6XFx0XFx0aW50IGksIHJldCA9IDA7XFxuNDM4OTpcXHRcXG40MzkwOlxcdFxcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVxcdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG40MzkxOlxcdFxcdGlmICghZGVwdGgpXFxuNDM5MjpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG40MzkzOlxcdFxcbjQzOTQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRhYi1cXHUwMDNlY250OyBpKyspIHtcXG40Mzk1OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxcbjQzOTY6XFx0XFx0XFx0XFx0XFx0XFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XFxuNDM5NzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40Mzk4OlxcdFxcdFxcdFxcdGJyZWFrO1xcbjQzOTk6XFx0XFx0XFx0cmV0ID0gMDtcXG40NDAwOlxcdFxcdH1cXG40NDAxOlxcdFxcdGt2ZnJlZShkZXB0aCk7XFxuNDQwMjpcXHRcXHRyZXR1cm4gcmV0O1xcbjQ0MDM6XFx0fVxcbjQ0MDQ6XFx0XFxuNDQwNTpcXHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcXG40NDA2OlxcdFxcdFxcdFxcdCAgICAgIHUzMiB0eXBlX2lkLCB2b2lkICpkYXRhLCB1OCBiaXRzX29mZnNldCxcXG40NDA3OlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBidGZfc2hvdyAqc2hvdylcXG40NDA4OlxcdHtcXG40NDA5OlxcdFxcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjEwLjA3Nzc2NjEzOVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU5MjgzMDY3MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQW5hbHl6aW5nIHRoZSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgQ29udGV4dCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgYXJvdW5kIHRoYXQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgIGNhbGwuIExldCBtZSBxdWlja2x5IGV4YW1pbmUgdGhlIGNvZGUgZnJvbSBsaW5lIDYwODAgdG8gNjExNS4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgaW1tZWRpYXRlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEknbSBsb29raW5nIGZvciB0aGUgYXJndW1lbnRzIGJlaW5nIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24sIHRoZSB2YXJpYWJsZXMgYmVpbmcgdXNlZCwgYW5kIGFueSBjb25kaXRpb25hbCBsb2dpYyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSBpdHMgYmVoYXZpb3IuIEhvcGVmdWxseSB0aGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgb3duZXJzaGlwIGRlcHRoIGNoZWNrIGlzIHRyaWdnZXJlZCBhbmQgd2hhdCBpdCdzIHRyeWluZyB0byBhY2NvbXBsaXNoIHdpdGhpbiB0aGF0IHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGNvZGUuIFRoaXMgaXMgbGlrZWx5IHJlbGF0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIHBhc3NlZCBpbiBmcm9tIHNvbWV3aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzNDYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjE2LjAwNjA3NDkyNloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODcwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjYwODA6XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuNjA4MTpcXHRcXG42MDgyOlxcdFxcdHN0cnVjdF9tZXRhX3RhYiA9IGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoXFx1MDAyNmVudi1cXHUwMDNlbG9nLCBidGYpO1xcbjYwODM6XFx0XFx0aWYgKElTX0VSUihzdHJ1Y3RfbWV0YV90YWIpKSB7XFxuNjA4NDpcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKHN0cnVjdF9tZXRhX3RhYik7XFxuNjA4NTpcXHRcXHRcXHRnb3RvIGVycm91dDtcXG42MDg2OlxcdFxcdH1cXG42MDg3OlxcdFxcdGJ0Zi1cXHUwMDNlc3RydWN0X21ldGFfdGFiID0gc3RydWN0X21ldGFfdGFiO1xcbjYwODg6XFx0XFxuNjA4OTpcXHRcXHRpZiAoc3RydWN0X21ldGFfdGFiKSB7XFxuNjA5MDpcXHRcXHRcXHRpbnQgaTtcXG42MDkxOlxcdFxcbjYwOTI6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNlY250OyBpKyspIHtcXG42MDkzOlxcdFxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVxcdTAwM2V0eXBlc1tpXS5yZWNvcmQpO1xcbjYwOTQ6XFx0XFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuNjA5NTpcXHRcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbjYwOTY6XFx0XFx0XFx0fVxcbjYwOTc6XFx0XFxuNjA5ODpcXHRcXHRcXHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcXG42MDk5OlxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbjYxMDA6XFx0XFx0XFx0XFx0Z290byBlcnJvdXRfbWV0YTtcXG42MTAxOlxcdFxcdH1cXG42MTAyOlxcdFxcbjYxMDM6XFx0XFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcXHUwMDI2ZW52LVxcdTAwM2Vsb2cpO1xcbjYxMDQ6XFx0XFx0aWYgKGVycilcXG42MTA1OlxcdFxcdFxcdGdvdG8gZXJyb3V0X2ZyZWU7XFxuNjEwNjpcXHRcXG42MTA3OlxcdFxcdGJ0Zl92ZXJpZmllcl9lbnZfZnJlZShlbnYpO1xcbjYxMDg6XFx0XFx0cmVmY291bnRfc2V0KFxcdTAwMjZidGYtXFx1MDAzZXJlZmNudCwgMSk7XFxuNjEwOTpcXHRcXHRyZXR1cm4gYnRmO1xcbjYxMTA6XFx0XFxuNjExMTpcXHRlcnJvdXRfbWV0YTpcXG42MTEyOlxcdFxcdGJ0Zl9mcmVlX3N0cnVjdF9tZXRhX3RhYihidGYpO1xcbjYxMTM6XFx0ZXJyb3V0OlxcbjYxMTQ6XFx0XFx0Lyogb3ZlcndyaXRlIGVyciB3aXRoIC1FTk9TUEMgb3IgLUVGQVVMVCAqL1xcbjYxMTU6XFx0XFx0cmV0ID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcXHUwMDI2ZW52LVxcdTAwM2Vsb2cpO1xcbjYxMTY6XFx0XFx0aWYgKHJldClcXG42MTE3OlxcdFxcdFxcdGVyciA9IHJldDtcXG42MTE4OlxcdGVycm91dF9mcmVlOlxcbjYxMTk6XFx0XFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjE2LjAwNjU2NjA1NloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEwNDYxNjg0MzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBCUEYvQlRGIE93bmVyc2hpcCBEZXB0aCBDaGVjayoqXG5cbk9rYXksIHRoaXMgaXMgZGVmaW5pdGVseSBwcm9taXNpbmcuIFRoZSBCUEYvQlRGIHN1YnN5c3RlbSBpcyBhIGNyaXRpY2FsIHBpZWNlLCBhbmQgdGhpcyBjb2RlIHBhdGggaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggdGhlIGBCUEZfQlRGX0xPQURgIHN5c2NhbGwuIEl0J3MgbW9kaWZ5aW5nIHRoZSBCVEYgb3duZXJzaGlwIGdyYXBoIHZhbGlkYXRpb24gbG9naWMsIHNwZWNpZmljYWxseSByZXBsYWNpbmcgYW4gYWQtaG9jIGN5Y2xlIGNoZWNrIHdpdGggYSBkZXB0aC1jaGVja2luZyByZWN1cnNpdmUgYWxnb3JpdGhtIChgYnRmX293bmVyc2hpcF9kZXB0aGApLiBUaGF0J3MgYSByZWQgZmxhZyDigJMgYSByZWN1cnNpdmUgYWxnb3JpdGhtIG9wZXJhdGluZyBvbiB1c2VyLWNvbnRyb2xsZWQgaW5wdXQuIFRoaXMgc2NyZWFtcyBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzOiBidWdzIGluIHRoZSByZWN1cnNpdmUgbG9naWMgaXRzZWxmLCBwb3NzaWJsZSBpbnRlZ2VyIG92ZXJmbG93cywgbG9vcCBkZXRlY3Rpb24gZmFpbHVyZXMsIG1lbW9yeSBsZWFrcywgb3V0LW9mLWJvdW5kcyByZWFkcy93cml0ZXMsIG9yIGV2ZW4gc3RhY2sgb3ZlcmZsb3dzLiBgV29ydGhGdXp6aW5nID0gdHJ1ZWAuIE5vIHF1ZXN0aW9uLlxuXG5Ob3csIGxldCdzIG5haWwgZG93biB0aGUgY3JpdGljYWwgc3ltYm9scy4gSSBuZWVkIHRvIGtub3cgd2hpY2ggZnVuY3Rpb25zIGFyZSBlaXRoZXIgbW9kaWZpZWQgb3IgbmV3bHkgaW50cm9kdWNlZC4gTGV0J3Mgc2VlLi4uXG5cblRoZSBrZXkgc3VzcGVjdHMgYXJlOiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lZF90eXBlX2lkeGAsIGFuZCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBgYnRmX3BhcnNlYCBpcyB3aGVyZSB0aGlzIG5ldyBjb2RlIGlzIGNhbGxlZCwgYW5kIHBlcmhhcHMgYGJwZl9idGZfbG9hZGAgYXMgd2VsbCwgYnV0IHRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIHRoZSBvbmVzIGRvaW5nIHRoZSBjb3JlIHdvcmsuXG5cbldhaXQgYSBzZWNvbmQuLi4gYXJlIGBidGZfb3duZXJzaGlwX2RlcHRoYCBhbmQgYGJ0Zl9vd25lZF90eXBlX2lkeGAgc3RhdGljPyBZZXMsIHRoZXkgYXJlLiBUaGF0IGNvdWxkIGNvbXBsaWNhdGUgdGhpbmdzLiBUaGUgaW5zdHJ1Y3Rpb25zIHJlZ2FyZGluZyBzdGF0aWMgZnVuY3Rpb25zIGNvbWUgdG8gbWluZDogXCJDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlwiXG5cbkhvd2V2ZXIsIHRoZXkgYXJlIGluIGEgLmMgZmlsZSwgYnV0IHRoZXkgYXJlIG5vdCBpbmxpbmVkIGluIGEgaGVhZGVyLiBMZXQncyB0aGluay4uLiBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYW5ub3QgYmUgaW5saW5lZCwgdGhhdCdzIGNlcnRhaW4hIEJ1dCBpcyBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgaW5saW5lZD8gSXQgaXMgY2FsbGVkIG9ubHkgb25jZSBmcm9tIGBidGZfcGFyc2VgLCBzbyBpdCBtaWdodCBiZSBpbmxpbmVkIG9yIG5vdC5cblxuQnV0IGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgbm9uLXN0YXRpYyEgT2theSwgZ29vZC4gTGV0J3MganVzdCBjb25maXJtIHRoYXQgaXQncyBlaXRoZXIgZXhwb3J0ZWQgb3IgZGVjbGFyZWQgaW4gYSBoZWFkZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMTg4LCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTkwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6MjYuNDY4MjU1NjQ3WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzM4NjEyMzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvYnRmLmg9MjM0PXN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM1LVxcdFxcdFxcdFxcdCAgICB1MzIgZmllbGRfbWFzaywgdTMyIHZhbHVlX3NpemUpO1xcbmluY2x1ZGUvbGludXgvYnRmLmg6MjM2OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpO1xcbmluY2x1ZGUvbGludXgvYnRmLmgtMjM3LWJvb2wgYnRmX3R5cGVfaXNfdm9pZChjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz00MTUwPXN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MjgyLVxcbmtlcm5lbC9icGYvYnRmLmM6NDI4MzppbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbmtlcm5lbC9icGYvYnRmLmMtNDI4NC17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTYwMTQ9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwOTItXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNlY250OyBpKyspIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjYwOTM6XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxua2VybmVsL2JwZi9idGYuYy02MDk0LVxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xMzYzLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEzNjQ6XFx0cmV0ID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBtYXAtXFx1MDAzZXJlY29yZCk7XFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2NS1cXHRpZiAocmV0IFxcdTAwM2MgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6MjkuMjA2ODc3NTY3WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyNDIwMTQwMjA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gQlRGIFN5bWJvbCBSZXNvbHV0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBCVEYgc3R1ZmYuIEZpcnN0IHRoaW5ncyBmaXJzdCwgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYC4uLiBwcmV0dHkgc3VyZSB0aGF0J3MgYSBnbG9iYWwgc3ltYm9sLCBub3Qgc3RhdGljLiBOZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIHdoZW4gSSBzdGFydCB0cmFjaW5nIHRoaW5ncy4gTm93LCBJIHJlY2FsbCB0aG9zZSB0d28gZnVuY3Rpb25zLCBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgdGhhdCB3ZXJlIGFkZGVkIGluIGBrZXJuZWwvYnBmL2J0Zi5jYC4gVGhleSBzZWVtIHJlbGV2YW50IHRvIHdoYXRldmVyIEknbSB0cm91Ymxlc2hvb3RpbmcuXG5cblRoZSByZWFsIHF1ZXN0aW9uIEkgbmVlZCB0byBhbnN3ZXIsIHRob3VnaCwgaXMgd2hhdCBjYWxscyBgYnRmX3BhcnNlYD8gVW5kZXJzdGFuZGluZyBpdHMgY2FsbCBjaGFpbiBpcyBnb2luZyB0byBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgbGFyZ2VyIHBpY3R1cmUgaGVyZS4gQWx0ZXJuYXRpdmVseSwgd2hhdCdzIGNhbGxpbmcgYGJwZl9idGZfbG9hZGAgd291bGQgYWxzbyBnaXZlIG1lIGNsdWVzLiBHb3R0YSBnbyBjaGVjayB0aGUgY2FsbCBncmFwaHMgZm9yIHRob3NlIHR3byBub3cuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGVudHJ5IHBvaW50IGFuZCB0aGUgZmxvdyB0byBmb2xsb3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0ODQ2LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDEuNjI3MDIwMDQzWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5ODk4MTgwMTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX3BhcnNlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYnRmLmM9Mzk3Nj1zdGF0aWMgaW50IGJ0Zl9maW5kX2ZpZWxkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy0zOTg5LS8qIENhbGxlcnMgaGF2ZSB0byBlbnN1cmUgdGhlIGxpZmUgY3ljbGUgb2YgYnRmIGlmIGl0IGlzIHByb2dyYW0gQlRGICovXFxua2VybmVsL2JwZi9idGYuYzozOTkwOnN0YXRpYyBpbnQgYnRmX3BhcnNlX2twdHIoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCxcXG5rZXJuZWwvYnBmL2J0Zi5jLTM5OTEtXFx0XFx0XFx0ICBzdHJ1Y3QgYnRmX2ZpZWxkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQwMDgtXFx0aWYgKGlkID09IC1FTk9FTlQpIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjQwMDk6XFx0XFx0LyogYnRmX3BhcnNlX2twdHIgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHcvIGJ0ZiA9IHByb2dyYW0gQlRGICovXFxua2VybmVsL2JwZi9idGYuYy00MDEwLVxcdFxcdFdBUk5fT05fT05DRShidGZfaXNfa2VybmVsKGJ0ZikpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MDc5LVxcbmtlcm5lbC9icGYvYnRmLmM6NDA4MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9ncmFwaF9yb290KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG5rZXJuZWwvYnBmL2J0Zi5jLTQwODEtXFx0XFx0XFx0XFx0c3RydWN0IGJ0Zl9maWVsZCAqZmllbGQsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQxMjMtXFxua2VybmVsL2JwZi9idGYuYzo0MTI0OnN0YXRpYyBpbnQgYnRmX3BhcnNlX2xpc3RfaGVhZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLFxcbmtlcm5lbC9icGYvYnRmLmMtNDEyNS1cXHRcXHRcXHQgICAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxcbmtlcm5lbC9icGYvYnRmLmMtNDEyNi17XFxua2VybmVsL2JwZi9idGYuYzo0MTI3OlxcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcXFwiYnBmX2xpc3Rfbm9kZVxcXCIsXFxua2VybmVsL2JwZi9idGYuYy00MTI4LVxcdFxcdFxcdFxcdFxcdCAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2xpc3Rfbm9kZSkpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MTMwLVxcbmtlcm5lbC9icGYvYnRmLmM6NDEzMTpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9yYl9yb290KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQsXFxua2VybmVsL2JwZi9idGYuYy00MTMyLVxcdFxcdFxcdCAgICAgc3RydWN0IGJ0Zl9maWVsZF9pbmZvICppbmZvKVxcbmtlcm5lbC9icGYvYnRmLmMtNDEzMy17XFxua2VybmVsL2JwZi9idGYuYzo0MTM0OlxcdHJldHVybiBidGZfcGFyc2VfZ3JhcGhfcm9vdChidGYsIGZpZWxkLCBpbmZvLCBcXFwiYnBmX3JiX25vZGVcXFwiLFxcbmtlcm5lbC9icGYvYnRmLmMtNDEzNS1cXHRcXHRcXHRcXHRcXHQgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9yYl9ub2RlKSk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTQxMzg9c3RhdGljIGludCBidGZfZmllbGRfY21wKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYiwgY29uc3Qgdm9pZCAqcHJpdilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNDE0OS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjQxNTA6c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxua2VybmVsL2JwZi9idGYuYy00MTUxLVxcdFxcdFxcdFxcdCAgICB1MzIgZmllbGRfbWFzaywgdTMyIHZhbHVlX3NpemUpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQyMjktXFx0XFx0Y2FzZSBCUEZfVVBUUjpcXG5rZXJuZWwvYnBmL2J0Zi5jOjQyMzA6XFx0XFx0XFx0cmV0ID0gYnRmX3BhcnNlX2twdHIoYnRmLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0sIFxcdTAwMjZpbmZvX2FycltpXSk7XFxua2VybmVsL2JwZi9idGYuYy00MjMxLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MjM0LVxcdFxcdGNhc2UgQlBGX0xJU1RfSEVBRDpcXG5rZXJuZWwvYnBmL2J0Zi5jOjQyMzU6XFx0XFx0XFx0cmV0ID0gYnRmX3BhcnNlX2xpc3RfaGVhZChidGYsIFxcdTAwMjZyZWMtXFx1MDAzZWZpZWxkc1tpXSwgXFx1MDAyNmluZm9fYXJyW2ldKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTQyMzYtXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQyMzktXFx0XFx0Y2FzZSBCUEZfUkJfUk9PVDpcXG5rZXJuZWwvYnBmL2J0Zi5jOjQyNDA6XFx0XFx0XFx0cmV0ID0gYnRmX3BhcnNlX3JiX3Jvb3QoYnRmLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0sIFxcdTAwMjZpbmZvX2FycltpXSk7XFxua2VybmVsL2JwZi9idGYuYy00MjQxLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz01NTc0PXN0YXRpYyBpbnQgYnRmX2NoZWNrX2FsbF90eXBlcyhzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52KVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy01NjA3LVxcbmtlcm5lbC9icGYvYnRmLmM6NTYwODpzdGF0aWMgaW50IGJ0Zl9wYXJzZV90eXBlX3NlYyhzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52KVxcbmtlcm5lbC9icGYvYnRmLmMtNTYwOS17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU2MzAtXFxua2VybmVsL2JwZi9idGYuYzo1NjMxOnN0YXRpYyBpbnQgYnRmX3BhcnNlX3N0cl9zZWMoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcXG5rZXJuZWwvYnBmL2J0Zi5jLTU2MzIte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy01NjYyLVxcbmtlcm5lbC9icGYvYnRmLmM6NTY2MzpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9sYXlvdXRfc2VjKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYpXFxua2VybmVsL2JwZi9idGYuYy01NjY0LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTcxMz1zdGF0aWMgaW50IGJ0Zl9jaGVja19zZWNfaW5mbyhzdHJ1Y3QgYnRmX3ZlcmlmaWVyX2VudiAqZW52LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy01NzY5LVxcbmtlcm5lbC9icGYvYnRmLmM6NTc3MDpzdGF0aWMgaW50IGJ0Zl9wYXJzZV9oZHIoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudilcXG5rZXJuZWwvYnBmL2J0Zi5jLTU3NzEte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz01ODQzPXN0YXRpYyBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqXFxua2VybmVsL2JwZi9idGYuYzo1ODQ0OmJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoc3RydWN0IGJwZl92ZXJpZmllcl9sb2cgKmxvZywgc3RydWN0IGJ0ZiAqYnRmKVxcbmtlcm5lbC9icGYvYnRmLmMtNTg0NS17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NDQtXFx0XFx0dHlwZS1cXHUwMDNlYnRmX2lkID0gaTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NDU6XFx0XFx0cmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHQsIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9MSVNUX0hFQUQgfCBCUEZfTElTVF9OT0RFIHxcXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NDYtXFx0XFx0XFx0XFx0XFx0XFx0ICBCUEZfUkJfUk9PVCB8IEJQRl9SQl9OT0RFIHwgQlBGX1JFRkNPVU5UIHxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTk3Nj1zdGF0aWMgaW50IGJ0Zl9jaGVja19tb2RpZmllcl9jaGFpbl9sZW5ndGgoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjAxMy1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwMTQ6c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxua2VybmVsL2JwZi9idGYuYy02MDE1LVxcdFxcdFxcdCAgICAgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNTktXFxua2VybmVsL2JwZi9idGYuYzo2MDYwOlxcdGVyciA9IGJ0Zl9wYXJzZV9oZHIoZW52KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjEtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA2NS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNjY6XFx0ZXJyID0gYnRmX3BhcnNlX3N0cl9zZWMoZW52KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNjctXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA2OS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzA6XFx0ZXJyID0gYnRmX3BhcnNlX2xheW91dF9zZWMoZW52KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzEtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA3My1cXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzQ6XFx0ZXJyID0gYnRmX3BhcnNlX3R5cGVfc2VjKGVudik7XFxua2VybmVsL2JwZi9idGYuYy02MDc1LVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwODEtXFxua2VybmVsL2JwZi9idGYuYzo2MDgyOlxcdHN0cnVjdF9tZXRhX3RhYiA9IGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXMoXFx1MDAyNmVudi1cXHUwMDNlbG9nLCBidGYpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjA4My1cXHRpZiAoSVNfRVJSKHN0cnVjdF9tZXRhX3RhYikpIHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjQ1Mj1CVEZfSURfTElTVF9TSU5HTEUoYnBmX2N0eF9jb252ZXJ0X2J0Zl9pZCwgc3RydWN0LCBicGZfY3R4X2NvbnZlcnQpXFxua2VybmVsL2JwZi9idGYuYy02NDUzLVxcbmtlcm5lbC9icGYvYnRmLmM6NjQ1NDpzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NTUtXFx0XFx0XFx0XFx0ICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NDc1LVxcbmtlcm5lbC9icGYvYnRmLmM6NjQ3NjpcXHRlcnIgPSBidGZfcGFyc2VfaGRyKGVudik7XFxua2VybmVsL2JwZi9idGYuYy02NDc3LVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY0ODEtXFxua2VybmVsL2JwZi9idGYuYzo2NDgyOlxcdGVyciA9IGJ0Zl9wYXJzZV9zdHJfc2VjKGVudik7XFxua2VybmVsL2JwZi9idGYuYy02NDgzLVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY1MDYtXFxua2VybmVsL2JwZi9idGYuYzo2NTA3OnN0cnVjdCBidGYgKmJ0Zl9wYXJzZV92bWxpbnV4KHZvaWQpXFxua2VybmVsL2JwZi9idGYuYy02NTA4LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjUxOS1cXHRsb2ctXFx1MDAzZWxldmVsID0gQlBGX0xPR19LRVJORUw7XFxua2VybmVsL2JwZi9idGYuYzo2NTIwOlxcdGJ0ZiA9IGJ0Zl9wYXJzZV9iYXNlKGVudiwgXFxcInZtbGludXhcXFwiLCBfX3N0YXJ0X0JURiwgX19zdG9wX0JURiAtIF9fc3RhcnRfQlRGKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTY1MjEtXFx0aWYgKElTX0VSUihidGYpKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NTIzLVxcbmtlcm5lbC9icGYvYnRmLmM6NjUyNDpcXHQvKiBidGZfcGFyc2Vfdm1saW51eCgpIHJ1bnMgdW5kZXIgYnRmX3ZtbGludXhfbG9jayAqL1xcbmtlcm5lbC9icGYvYnRmLmMtNjUyNS1cXHRicGZfY3R4X2NvbnZlcnQudCA9IGJ0Zl90eXBlX2J5X2lkKGJ0ZiwgYnBmX2N0eF9jb252ZXJ0X2J0Zl9pZFswXSk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTY1NDA9X191MzIgYnRmX3JlbG9jYXRlX2lkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgX191MzIgaWQpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NDgtXFxua2VybmVsL2JwZi9idGYuYzo2NTQ5OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBjb25zdCB2b2lkICpkYXRhLFxcbmtlcm5lbC9icGYvYnRmLmMtNjU1MC1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwgdm9pZCAqYmFzZV9kYXRhLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NTcxLVxcdGlmIChiYXNlX2RhdGEpIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjY1NzI6XFx0XFx0YmFzZV9idGYgPSBidGZfcGFyc2VfYmFzZShlbnYsIFxcXCIuQlRGLmJhc2VcXFwiLCBiYXNlX2RhdGEsIGJhc2VfZGF0YV9zaXplKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTY1NzMtXFx0XFx0aWYgKElTX0VSUihiYXNlX2J0ZikpIHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjYwMS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY2MDI6XFx0ZXJyID0gYnRmX3BhcnNlX2hkcihlbnYpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjYwMy1cXHRpZiAoZXJyKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NjA3LVxcbmtlcm5lbC9icGYvYnRmLmM6NjYwODpcXHRlcnIgPSBidGZfcGFyc2Vfc3RyX3NlYyhlbnYpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjYwOS1cXHRpZiAoZXJyKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NDg2PWludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0OTAtXFxua2VybmVsL2JwZi9idGYuYzo4NDkxOlxcdGJ0ZiA9IGJ0Zl9wYXJzZShhdHRyLCB1YXR0ciwgYXR0cl9sb2cpO1xcbmtlcm5lbC9icGYvYnRmLmMtODQ5Mi1cXHRpZiAoSVNfRVJSKGJ0ZikpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg2NDA9c3RhdGljIGludCBidGZfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIG9wLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NjU5LVxcdFxcdH1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg2NjA6XFx0XFx0YnRmID0gYnRmX3BhcnNlX21vZHVsZShtb2QtXFx1MDAzZW5hbWUsIG1vZC1cXHUwMDNlYnRmX2RhdGEsIG1vZC1cXHUwMDNlYnRmX2RhdGFfc2l6ZSxcXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NjEtXFx0XFx0XFx0XFx0ICAgICAgIG1vZC1cXHUwMDNlYnRmX2Jhc2VfZGF0YSwgbW9kLVxcdTAwM2VidGZfYmFzZV9kYXRhX3NpemUpO1xcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmM9NzU5PWJvb2wgYnRmX3JlY29yZF9lcXVhbChjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjX2EsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYilcXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTc3MC1cXHRzaXplID0gc3RydWN0X3NpemUocmVjX2EsIGZpZWxkcywgcmVjX2EtXFx1MDAzZWNudCk7XFxua2VybmVsL2JwZi9zeXNjYWxsLmM6NzcxOlxcdC8qIGJ0Zl9wYXJzZV9maWVsZHMgdXNlcyBremFsbG9jIHRvIGFsbG9jYXRlIGEgYnRmX3JlY29yZCwgc28gdW51c2VkXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtNzcyLVxcdCAqIG1lbWJlcnMgYXJlIHplcm9lZCBvdXQuIFNvIG1lbWNtcCBpcyBzYWZlIHRvIGRvIHdpdGhvdXQgd29ycnlpbmdcXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jPTEyNTU9c3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTI3Ni1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzoxMjc3OlxcdG1hcC1cXHUwMDNlcmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHZhbHVlX3R5cGUsXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTI3OC1cXHRcXHRcXHRcXHQgICAgICAgQlBGX1NQSU5fTE9DSyB8IEJQRl9SRVNfU1BJTl9MT0NLIHwgQlBGX1RJTUVSIHwgQlBGX0tQVFIgfCBCUEZfTElTVF9IRUFEIHxcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yMDk3OT1zdHJ1Y3QgYnRmICpicGZfZ2V0X2J0Zl92bWxpbnV4KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODctXFx0XFx0aWYgKCFidGYpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjA5ODg6XFx0XFx0XFx0YnRmID0gYnRmX3BhcnNlX3ZtbGludXgoKTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODktXFx0XFx0XFx0LypcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDIuNjE2ODQ0MzU0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQxODg2NDEwNDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgTGluZSBvZiBJbnF1aXJ5OiBCVEYgRmlsZSBEZXNjcmlwdG9yIENyZWF0aW9uKipcblxuT2theSwgc28gYGJ0Zl9uZXdfZmRgIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHVsdGltYXRlbHkgZ2V0cyBjYWxsZWQgdG8gY3JlYXRlIGEgQlRGIGZpbGUgZGVzY3JpcHRvci4gVGhlIGltbWVkaWF0ZSBmdW5jdGlvbiB0byBjYWxsIGl0LCBpdCBzZWVtcywgaXMgYGJ0Zl9wYXJzZWAsIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb24uIEludGVyZXN0aW5nLiBOb3csIHdoZXJlIGlzIGBidGZfbmV3X2ZkYCBiZWluZyBpbnZva2VkPyBUaGUgdGV4dCBtZW50aW9ucyBga2VybmVsL2JwZi9zeXNjYWxsLmNgLCBhbmQgc3BlY2lmaWNhbGx5IHRoZSBoYW5kbGluZyBvZiBgQlBGX0JURl9MT0FEYC4gVGhhdCBtYWtlcyBwZXJmZWN0IHNlbnNlOyBsb2FkaW5nIEJURiBkYXRhIGlzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgaXQuXG5cbkhvd2V2ZXIsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsYXJnZXIgY29udGV4dC4gVG8gc29saWRpZnkgdGhpcyB1bmRlcnN0YW5kaW5nLCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIGNhbGxlcnMgb2YgYGJ0Zl9uZXdfZmRgLiBUcmFjaW5nIHRoZSBjYWxsIGdyYXBoIHdpbGwgaGVscCBtZSBlbnN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnl0aGluZyBjcnVjaWFsIGFuZCB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBvdmVyYWxsIEJURiBsb2FkaW5nIHByb2Nlc3MuIEl0IGlzIGltcG9ydGFudCB0byBrbm93IHdoaWNoIGNvZGUgcGF0aHMgYXJlIHJlbGF0ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4OTcxLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDYuODA1NDg3OTUyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTk1NzQ0NjM3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9uZXdfZmRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9idGYuaD0xNDk9c3RydWN0IGJwZl9sb2dfYXR0cjtcXG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjE1MDppbnQgYnRmX25ld19mZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKTtcXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTE1MS1zdHJ1Y3QgYnRmICpidGZfZ2V0X2J5X2ZkKGludCBmZCk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg0NzQ9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODQ4MC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg0ODE6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxcbmtlcm5lbC9icGYvYnRmLmMtODQ4Mi17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0ODUtXFxua2VybmVsL2JwZi9idGYuYzo4NDg2OmludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxua2VybmVsL2JwZi9idGYuYy04NDg3LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODUwNi1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg1MDc6XFx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XFxua2VybmVsL2JwZi9idGYuYy04NTA4LVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NTg2PWludCBidGZfZ2V0X2ZkX2J5X2lkKHUzMiBpZClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODU5OS1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg2MDA6XFx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg2MDEtXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODgzOD1CUEZfQ0FMTF80KGJwZl9idGZfZmluZF9ieV9uYW1lX2tpbmQsIGNoYXIgKiwgbmFtZSwgaW50LCBuYW1lX3N6LCB1MzIsIGtpbmQsIGludCwgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTEtXFx0aWYgKHJldCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgYnRmX2lzX21vZHVsZShidGYpKSB7XFxua2VybmVsL2JwZi9idGYuYzo4ODUyOlxcdFxcdGJ0Zl9vYmpfZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTMtXFx0XFx0aWYgKGJ0Zl9vYmpfZmQgXFx1MDAzYyAwKSB7XFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYz01NTY0PXN0YXRpYyBpbnQgYnBmX2J0Zl9sb2FkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkwLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjU1OTE6XFx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkyLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6Mjk6NDkuMDAxMjM4MTM5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM3MTI1MzMxNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipNeSBBbmFseXNpcyBvZiBCVEYgTG9hZGluZyBhbmQgQXNzb2NpYXRlZCBDaGVja3MqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgbG9hZGluZyBwcm9jZXNzLiBNeSBtZW50YWwgbW9kZWwgaXMgdHJhY2luZyB0aGUgZmxvdzogYGJwZl9idGZfbG9hZGAga2lja3MgdGhpbmdzIG9mZiwgd2hpY2ggdGhlbiBmZWVkcyBpbnRvIGBidGZfbmV3X2ZkYC4gRnJvbSB0aGVyZSwgaXQgZGl2ZXMgaW50byB0aGUgcGFyc2luZyBzdGFnZSB3aXRoIGBidGZfcGFyc2VgLCB3aGljaCBzZWVtcyB0byBiZSB0aGUgd29ya2hvcnNlLlxuXG5XaXRoaW4gYGJ0Zl9wYXJzZWAsIEkgc2VlIHR3byBjcnVjaWFsIHZhbGlkYXRpb24gZnVuY3Rpb25zIGJlaW5nIGNhbGxlZC4gT25lIGlzIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgd2hpY2ggdW5kb3VidGVkbHkgZGVhbHMgd2l0aCB0aGUgY29tcGxleCByZWxhdGlvbnNoaXBzIGFuZCBwb3RlbnRpYWwgbmVzdGVkIG93bmVyc2hpcCBpbXBsaWVkIGJ5IEJURidzIHR5cGUgaW5mb3JtYXRpb24uIEl0IGxvb2tzIGxpa2UgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIGFuZCBgYnRmX293bmVkX3R5cGVfaWR4YCBhcmUgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIHdpdGhpbiB0aGlzIG93bmVyc2hpcCBjaGVjay5cblxuQ3J1Y2lhbGx5LCBpdCBpcyBhbHNvIGNhbGxpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCB3aXRoaW4gYGJ0Zl9wYXJzZWAsIG1lYW5pbmcgdGhhdCBhcyB0eXBlcyBhcmUgcGFyc2VkIGFuZCBpbnNwZWN0ZWQsIGFueSBpc3N1ZXMgd2l0aCBzdHJ1Y3Qgb3IgdW5pb24gZmllbGRzIHdpbGwgYWxzbyBiZSBkZWFsdCB3aXRoLiBBbmQgb2YgY291cnNlLCB0aGVyZSdzIGBtYXBfY2hlY2tfYnRmYCB3aGljaCB3aWxsIGhhbmRsZSBhbnkgQlRGIGlzc3VlcyBmb3IgbWFwcy5cblxuTm93LCBJJ20gdGhpbmtpbmcgYWJvdXQgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBjb25maWd1cmF0aW9uLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgc2V0dGluZ3MgZm9yIGBrZXJuZWwvYnBmL2J0Zi5jYCB0byB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIEJURiBzdXBwb3J0IGlzIGVuYWJsZWQuIEFuZCB0aGUgYE1ha2VmaWxlYCBpbiBga2VybmVsL2JwZi9gIHdpbGwgdGVsbCBtZSBob3cgdGhlc2UgbW9kdWxlcyBhcmUgYnVpbHQgYW5kIGxpbmtlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgYXJlIGFueSBzcGVjaWZpYyBvcHRpb25zIG9yIG1vZHVsZXMgdGhhdCB0aGlzIEJURiBoYW5kbGluZyBkZXBlbmRzIG9uLiBUaGlzIGlzIGEgY29tbW9uIHByYWN0aWNlIHdoZW4gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBvZiBhbnkga2VybmVsIGZlYXR1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMDE4LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjUyLjcxMzc3MzcyM1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAxNzY3Nzc4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0ZlxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTEzPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2xvY2FsX3N0b3JhZ2UubyBicGZfdGFza19zdG9yYWdlLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE0Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gZml4dXBzLm8gY2ZnLm8gc3RhdGVzLm8gYmFja3RyYWNrLm8gY2hlY2tfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE1LW9iai0ke0NPTkZJR19CUEZfTFNNfVxcdCAgKz0gYnBmX2lub2RlX3N0b3JhZ2Uub1xcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT0xNz1vYmotJChDT05GSUdfQlBGX0pJVCkgKz0gdHJhbXBvbGluZS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZToxODpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZS0xOS1pZmVxICgkKENPTkZJR19NTVUpJChDT05GSUdfNjRCSVQpLHl5KVxcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcXG5rZXJuZWwvYnBmL01ha2VmaWxlOjQ0Om9iai0kKENPTkZJR19ERUJVR19JTkZPX0JURikgKz0gc3lzZnNfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTQ1LWVuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjI5OjUzLjQxNTU0NjE2WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY4MTUxMTQxNTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBCUEYgU3lzY2FsbCBDb21waWxhdGlvbioqXG5cbk9rYXksIHNvIEkgc2VlIHRoaXMgbGluZTogYG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnRmLm9gLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzIHRvIGltbWVkaWF0ZWx5IGRpc3NlY3Qgd2hhdCdzIGdvaW5nIG9uLiBUaGlzIHRlbGxzIHRoZSBidWlsZCBzeXN0ZW0gdGhhdCBpZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZCwgdGhlbiBgYnRmLm9gIHNob3VsZCBiZSBjb21waWxlZCBhbmQgbGlua2VkLiBUaGF0J3MgcHJldHR5IHN0YW5kYXJkLCBidXQgdGhlIGtleSBpcyB0aGF0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGBDT05GSUdfQlBGX1NZU0NBTExgLlxuXG5TbywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcy4gSSBuZWVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgYEJQRl9TWVNDQUxMYC4gSSdsbCBiZSBsb29raW5nIGZvciB3aGVyZSB0aGlzIG9wdGlvbiBpcyBkZWZpbmVkLCBpdHMgZGVmYXVsdCB2YWx1ZSAoaWYgYW55KSwgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgd2hhdCBpdCAqbWVhbnMqIGluIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgQlBGIGFuZCB0aGUga2VybmVsLiBJcyB0aGlzIHJlbGF0ZWQgdG8gdGhlIEJQRiBzeXN0ZW0gY2FsbCBpdHNlbGY/IERvZXMgaXQgZW5hYmxlIGV4dGVuc2lvbnMsIG9yIHBlcmhhcHMgc3BlY2lmaWMgZmVhdHVyZXMgbGlrZSBCVEYgZ2VuZXJhdGlvbiBvciB1c2FnZSBvZiBCUEYgcHJvZ3JhbXMgd2l0aCBzeXNjYWxscz8gVGhhdCdzIHdoYXQgSSBoYXZlIHRvIGZpZ3VyZSBvdXQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoaXMgYnVpbGQgcnVsZS4gVW5kZXJzdGFuZGluZyB0aGUgY29udGV4dCBvZiB0aGF0IEtjb25maWcgb3B0aW9uIHdpbGwgdGVsbCBtZSB0aGUgc2lnbmlmaWNhbmNlIG9mIGBidGYub2AncyBjb21waWxhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA4MjIsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMDowMC4yMzA2NjQ5NTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDk1NjkwODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJQRl9TWVNDQUxMXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFxcXCJCUEYgc3Vic3lzdGVtXFxcIlxcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cXG5rZXJuZWwvYnBmL0tjb25maWc6MzE6Y29uZmlnIEJQRl9TWVNDQUxMXFxua2VybmVsL2JwZi9LY29uZmlnLTMyLVxcdGJvb2wgXFxcIkVuYWJsZSBicGYoKSBzeXN0ZW0gY2FsbFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6MDIuNTQwMjQzNDA2WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEzNTU3MDI5Nzk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkV4YW1pbmluZyBCUEYgS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzKipcblxuT2theSwgSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGlzIEJQRiBjb25maWd1cmF0aW9uLiBJIGtub3cgYGtlcm5lbC9icGYvS2NvbmZpZ2AgaXMgdXN1YWxseSB0aGUgcGxhY2UgZm9yIHRoZXNlIHNvcnRzIG9mIGRlY2xhcmF0aW9ucywgc28gdGhhdCdzIHdoZXJlIEkgc2hvdWxkIHN0YXJ0LiBJJ20gdGhpbmtpbmcgYXJvdW5kIGxpbmUgMzEgaXMgbGlrZWx5IGEgZ29vZCBwbGFjZSB0byBsb29rIOKAkyB0aGF0J3Mgb2Z0ZW4gd2hlcmUgdGhlIGNvcmUgb3IgZGVmYXVsdCBvcHRpb25zIHJlc2lkZS4gTGV0J3MgZGlnIGluIHRoZXJlIGFuZCBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSBleHBlY3QgdG8gc2VlIHRoZSB0eXBpY2FsIGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIGxpbmtpbmcgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIG90aGVyIGtlcm5lbCBmZWF0dXJlcy4gTXkgZ29hbCBpcyB0byBtYXAgb3V0IHdoaWNoIHByZXJlcXVpc2l0ZXMgYXJlIHJlcXVpcmVkIGZvciBpdCB0byBiZSBlbmFibGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTIzMSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMwOjE2LjA5NzI3NTk5MVoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MjkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMjksXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMjk6XFx0bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG4gIDMwOlxcdFxcbiAgMzE6XFx0Y29uZmlnIEJQRl9TWVNDQUxMXFxuICAzMjpcXHRcXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuICAzMzpcXHRcXHRzZWxlY3QgQlBGXFxuICAzNDpcXHRcXHRzZWxlY3QgSVJRX1dPUktcXG4gIDM1OlxcdFxcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxcbiAgMzY6XFx0XFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxcbiAgMzc6XFx0XFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcXG4gIDM4OlxcdFxcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXFxuICAzOTpcXHRcXHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcXG4gIDQwOlxcdFxcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXFxuICA0MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDQyOlxcdFxcdGhlbHBcXG4gIDQzOlxcdFxcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xcbiAgNDQ6XFx0XFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0Y29uZmlnIEJQRl9KSVRcXG4gIDQ3OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXFxcIlxcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBCUEZcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXFxuICA1MDpcXHRcXHRzZWxlY3QgRVhFQ01FTVxcbiAgNTE6XFx0XFx0aGVscFxcbiAgNTI6XFx0XFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXFxuICA1MzpcXHRcXHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxcbiAgNTQ6XFx0XFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXFxuICA1NTpcXHRcXHQgIHByb2dyYW1zLlxcbiAgNTY6XFx0XFxuICA1NzpcXHRcXHQgIE5vdGUsIGFuIGFkbWluIHNob3VsZCBlbmFibGUgdGhpcyBmZWF0dXJlIGNoYW5naW5nOlxcbiAgNTg6XFx0XFx0ICAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9lbmFibGVcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6MTYuMDk3MzcwNzgxWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE0MzAxMTY1NTAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkJQRiBcdTAwMjYgQlRGIERlcGVuZGVuY3kgRGVlcCBEaXZlKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGUga2VybmVsIGJ1aWxkIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmljYWxseSBhcm91bmQgQlBGIGFuZCBCVEYuIE15IGluaXRpYWwgdW5kZXJzdGFuZGluZyB3YXMgdGhhdCBgQlBGX1NZU0NBTExgIHdhcyBmYWlybHkgaXNvbGF0ZWQsIG1heWJlIGp1c3QgZGVwZW5kZW50IG9uIHRoZSBhcmNoaXRlY3R1cmUgb3IgYSBwYXJlbnQgbWVudS4gSXQgKnNlbGVjdHMqIHRoaW5ncyBsaWtlIEJQRiBjb3JlIGZlYXR1cmVzLCBgSVJRX1dPUktgLCBhbmQgc3VjaC4gQnV0IEknbSBzdGFydGluZyB0byB3b25kZXIgYWJvdXQgdGhlIEJURiBjb21waWxhdGlvbiBwYXRoLCBhbmQgd2hldGhlciBpdCdzIHVuY29uZGl0aW9uYWxseSBidWlsdCB3aGVuIGBCUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZC5cblxuUmlnaHQsIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBrZXJuZWwvYnBmL01ha2VmaWxlYC4gQWgsIHRoZXJlIGl0IGlzIG9uIGxpbmUgMTg6IGBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vYC4gU28sICp5ZXMqLCBlbmFibGluZyBgQlBGX1NZU0NBTExgICpkb2VzKiBjb21waWxlIGBidGYub2AuIE5vIHN1cnByaXNlcyB0aGVyZSwgcmVhbGx5LCBidXQgZ29vZCB0byBoYXZlIGNvbmZpcm1lZCBpdCBkZWZpbml0aXZlbHkuXG5cbk5vdywgYSBtb3JlIG51YW5jZWQgcXVlc3Rpb246IERvZXMgQlRGICpyZXF1aXJlKiBgREVCVUdfSU5GT19CVEZgPyBJcyB0aGF0IGEgaGFyZCBkZXBlbmRlbmN5LCBvciBpcyBpdCBhIGNvbmRpdGlvbmFsIGJ1aWxkLXRpbWUgcmVxdWlyZW1lbnQ/IERvZXMgYGJ0Zl9wYXJzZWAgb3IgYW55IG9mIHRoZSBCUEYgQlRGIGxvYWRpbmcgbWVjaGFuaXNtcyBoYXZlIGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdGhhdCBpcyBkZXBlbmRlbnQgb24gYERFQlVHX0lORk9fQlRGYD9cblxuSSdsbCBxdWVyeSBgZ3JlcHBlcmAgYW5kIHNlZSBob3cgYERFQlVHX0lORk9fQlRGYCBpcyB1c2VkIHdpdGhpbiBga2VybmVsL2JwZi9idGYuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGZpbmFsIGFuc3dlci4gR290dGEgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgb3B0aW1pemVkIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTg0NCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMwOjMwLjM5ODUzOTI5NVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTg3MTkwNTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiREVCVUdfSU5GT19CVEZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcXG5rZXJuZWwvYnBmL01ha2VmaWxlOjQ0Om9iai0kKENPTkZJR19ERUJVR19JTkZPX0JURikgKz0gc3lzZnNfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTQ1LWVuZGlmXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTY0NTQ9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV9iYXNlKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTY0NTktXFxua2VybmVsL2JwZi9idGYuYzo2NDYwOlxcdGlmICghSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKVxcbmtlcm5lbC9icGYvYnRmLmMtNjQ2MS1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjU0MD1fX3UzMiBidGZfcmVsb2NhdGVfaWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBfX3UzMiBpZClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjU0Ni1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY1NDc6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy02NTQ4LVxcbmtlcm5lbC9icGYvYnRmLmM9NjU0OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX21vZHVsZShjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgY29uc3Qgdm9pZCAqZGF0YSxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjY0NC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY2NDU6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXFxua2VybmVsL2JwZi9idGYuYy02NjQ2LVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NjIyPWVudW0ge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NjI1LVxcbmtlcm5lbC9icGYvYnRmLmM6ODYyNjojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg2Mjctc3RydWN0IGJ0Zl9tb2R1bGUge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NzY0PWZzX2luaXRjYWxsKGJ0Zl9tb2R1bGVfaW5pdCk7XFxua2VybmVsL2JwZi9idGYuYzo4NzY1OiNlbmRpZiAvKiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUyAqL1xcbmtlcm5lbC9icGYvYnRmLmMtODc2Ni1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg3Njc9c3RydWN0IG1vZHVsZSAqYnRmX3RyeV9nZXRfbW9kdWxlKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODc2OS1cXHRzdHJ1Y3QgbW9kdWxlICpyZXMgPSBOVUxMO1xcbmtlcm5lbC9icGYvYnRmLmM6ODc3MDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3NzEtXFx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg3OTc9c3RydWN0IGJ0ZiAqYnRmX2dldF9tb2R1bGVfYnRmKGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZHVsZSlcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3OTgte1xcbmtlcm5lbC9icGYvYnRmLmM6ODc5OTojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg4MDAtXFx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg4MTAtXFxua2VybmVsL2JwZi9idGYuYzo4ODExOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODgxMi1cXHRtdXRleF9sb2NrKFxcdTAwMjZidGZfbW9kdWxlX211dGV4KTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODgyNz1zdGF0aWMgaW50IGNoZWNrX2J0Zl9rY29uZmlncyhjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGNvbnN0IGNoYXIgKmZlYXR1cmUpXFxua2VybmVsL2JwZi9idGYuYy04ODI4LXtcXG5rZXJuZWwvYnBmL2J0Zi5jOjg4Mjk6XFx0aWYgKCFtb2R1bGUgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKSB7XFxua2VybmVsL2JwZi9idGYuYy04ODMwLVxcdFxcdHByX2VycihcXFwibWlzc2luZyB2bWxpbnV4IEJURiwgY2Fubm90IHJlZ2lzdGVyICVzXFxcXG5cXFwiLCBmZWF0dXJlKTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODgzMi1cXHR9XFxua2VybmVsL2JwZi9idGYuYzo4ODMzOlxcdGlmIChtb2R1bGUgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUykpXFxua2VybmVsL2JwZi9idGYuYy04ODM0LVxcdFxcdHByX3dhcm4oXFxcIm1pc3NpbmcgbW9kdWxlIEJURiwgY2Fubm90IHJlZ2lzdGVyICVzXFxcXG5cXFwiLCBmZWF0dXJlKTtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODk3NT1zdGF0aWMgaW50IGJ0Zl9jaGVja19rZnVuY19uYW1lKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqZnVuY19uYW1lLCB1MzIga2luZClcXG5rZXJuZWwvYnBmL2J0Zi5jLTg5NzYte1xcbmtlcm5lbC9icGYvYnRmLmM6ODk3NzojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTg5NzgtXFx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg5OTEtXFxua2VybmVsL2JwZi9idGYuYzo4OTkyOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODk5My1cXHRndWFyZChtdXRleCkoXFx1MDAyNmJ0Zl9tb2R1bGVfbXV0ZXgpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz05NjQwPXN0YXRpYyBzdHJ1Y3QgYnBmX2NhbmRfY2FjaGUgKnBvcHVsYXRlX2NhbmRfY2FjaGUoc3RydWN0IGJwZl9jYW5kX2NhY2hlICpjYW5kcyxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtOTY2Ny1cXG5rZXJuZWwvYnBmL2J0Zi5jOjk2Njg6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy05NjY5LXN0YXRpYyB2b2lkIF9fcHVyZ2VfY2FuZF9jYWNoZShzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqKmNhY2hlLFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTI4NDk9aW50IGJwZl9hZGRfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgZnVuY19pZCwgdTE2IG9mZnNldClcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yODY1LVxcdFxcdGlmICghYnRmX3ZtbGludXgpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6Mjg2NjpcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImNhbGxpbmcga2VybmVsIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXFxcblxcXCIpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yODY3LVxcdFxcdFxcdHJldHVybiAtRU5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9NjIzMD1zdGF0aWMgaW50IGNoZWNrX3B0cl90b19tYXBfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtNjI0NC1cXHRpZiAoIWJ0Zl92bWxpbnV4KSB7XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjYyNDU6XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJtYXBfcHRyIGFjY2VzcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgQ09ORklHX0RFQlVHX0lORk9fQlRGXFxcXG5cXFwiKTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtNjI0Ni1cXHRcXHRyZXR1cm4gLUVOT1RTVVBQO1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTE5MDY4PXN0YXRpYyBpbnQgY2hlY2tfcHNldWRvX2J0Zl9pZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5MDg0LVxcdFxcdGlmICghYnRmX3ZtbGludXgpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTkwODU6XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJrZXJuZWwgaXMgbWlzc2luZyBCVEYsIG1ha2Ugc3VyZSBDT05GSUdfREVCVUdfSU5GT19CVEY9eSBpcyBzcGVjaWZpZWQgaW4gS2NvbmZpZy5cXFxcblxcXCIpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTA4Ni1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yMDk3OT1zdHJ1Y3QgYnRmICpicGZfZ2V0X2J0Zl92bWxpbnV4KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjA5ODMtXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjIwOTg0OlxcdGlmICghYnRmIFxcdTAwMjZcXHUwMDI2IElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk4NS1cXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZidGZfdm1saW51eF9sb2NrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6MzAuNDk3MjY1NzM5WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjcwNzAyNjM5OTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQlRGIFBhcnNpbmcgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgQlRGIHBhcnNpbmcgcm91dGluZSwgc3BlY2lmaWNhbGx5IGBidGZfcGFyc2UoKWAuIEkga25vdyB3ZSAqZG9uJ3QqIG5lZWQgYERFQlVHX0lORk9fQlRGYCBmb3IgaXQsIHdoaWNoIGlzIGdvb2QuIEJ1dCBJIG5lZWQgdG8gbmFpbCBkb3duIHdoZXRoZXIgaXQgcmVsaWVzIG9uIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2Agb3IgbWF5YmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8ga3B0ciwgbGlzdF9oZWFkLCBvciByYl9yb290LiBJIHRoaW5rIEkgd2lsbCBzdGFydCBieSBmb2N1c2luZyBvbiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBUaGVuLCBJJ2xsIG5lZWQgdG8gbG9vayBjbG9zZWx5IGF0IGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAgYW5kIGBidGZfcGFyc2Vfc3RydWN0X21ldGFzYCB0byB1bmRlcnN0YW5kIGhvdyB0aGV5IGFyZSBpbnZvbHZlZC4gVGhlIG5leHQgb2J2aW91cyBzdGVwIGlzIHRvIGZpZ3VyZSBvdXQgd2hlcmUgYGJ0Zl9maW5kX3N0cnVjdF9tZXRhYCBsaXZlcyBhbmQgaG93IGl0J3MgYWN0dWFsbHkgKnVzZWQqLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgcHJldHR5IGNsZWFyIHBpY3R1cmUgb2YgdGhlIGRlcGVuZGVuY2llcyBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDM2OCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMDozNy41Njc1MzQ4MTVaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYzNzI3NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9maW5kX3N0cnVjdF9tZXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYnRmLmM9NDI4Mz1pbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MzE2LVxcdFxcdGJ0Zl9pZCA9IHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbmtlcm5lbC9icGYvYnRmLmM6NDMxNzpcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbmtlcm5lbC9icGYvYnRmLmMtNDMxOC1cXHRcXHRpZiAoIW1ldGEpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTQzMjU9c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MzQwLVxcbmtlcm5lbC9icGYvYnRmLmM6NDM0MTpcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbmtlcm5lbC9icGYvYnRmLmMtNDM0Mi1cXHRpZiAoIW1ldGEpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTU4NDQ9YnRmX3BhcnNlX3N0cnVjdF9tZXRhcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLCBzdHJ1Y3QgYnRmICpidGYpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjQtXFxua2VybmVsL2JwZi9idGYuYzo1OTY1OnN0cnVjdCBidGZfc3RydWN0X21ldGEgKmJ0Zl9maW5kX3N0cnVjdF9tZXRhKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZClcXG5rZXJuZWwvYnBmL2J0Zi5jLTU5NjYte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz03NDQ4PWludCBidGZfc3RydWN0X2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy03NDY0LVxcbmtlcm5lbC9icGYvYnRmLmM6NzQ2NTpcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBpZCk7XFxua2VybmVsL2JwZi9idGYuYy03NDY2LVxcdFxcdGlmICghbWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jPTgxND12b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtODUwLVxcdFxcdFxcdGlmICghYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKSB7XFxua2VybmVsL2JwZi9zeXNjYWxsLmM6ODUxOlxcdFxcdFxcdFxcdHBvaW50ZWVfc3RydWN0X21ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShmaWVsZC1cXHUwMDNla3B0ci5idGYsXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtODUyLVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGZpZWxkLVxcdTAwM2VrcHRyLmJ0Zl9pZCk7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9Mzc2PXN0YXRpYyBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVnX2J0Zl9yZWNvcmQoY29uc3Qgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0zODMtXFx0fSBlbHNlIGlmICh0eXBlX2lzX3B0cl9hbGxvY19vYmoocmVnLVxcdTAwM2V0eXBlKSkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzozODQ6XFx0XFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKHJlZy1cXHUwMDNlYnRmLCByZWctXFx1MDAzZWJ0Zl9pZCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTM4NS1cXHRcXHRpZiAobWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz00Njc2PXN0YXRpYyBzdHJ1Y3QgYnRmX3JlY29yZCAqa3B0cl9wb2ludGVlX2J0Zl9yZWNvcmQoc3RydWN0IGJ0Zl9maWVsZCAqa3B0cl9maWVsZClcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy00NjgyLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzo0NjgzOlxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShrcHRyX2ZpZWxkLVxcdTAwM2VrcHRyLmJ0ZixcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtNDY4NC1cXHRcXHRcXHRcXHQgICAga3B0cl9maWVsZC1cXHUwMDNla3B0ci5idGZfaWQpO1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTEzODcyPXN0YXRpYyBpbnQgY2hlY2tfc3BlY2lhbF9rZnVuYyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTM5MzgtXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTM5OlxcdFxcdHN0cnVjdF9tZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEocmV0X2J0ZiwgcmV0X2J0Zl9pZCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTQwLVxcdFxcdGlmIChpc19icGZfcGVyY3B1X29ial9uZXdfa2Z1bmMobWV0YS1cXHUwMDNlZnVuY19pZCkpIHtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xMzk2Ny1cXHRcXHRpbnNuX2F1eC1cXHUwMDNla3B0cl9zdHJ1Y3RfbWV0YSA9XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjEzOTY4OlxcdFxcdFxcdGJ0Zl9maW5kX3N0cnVjdF9tZXRhKG1ldGEtXFx1MDAzZWFyZ19idGYsXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTEzOTY5LVxcdFxcdFxcdFxcdFxcdCAgICAgbWV0YS1cXHUwMDNlYXJnX2J0Zl9pZCk7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTQwNDM9c3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDE0OS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTQxNTA6XFx0XFx0c3RydWN0X21ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShtZXRhLmFyZ19idGYsIG1ldGEuYXJnX2J0Zl9pZCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE0MTUxLVxcdFxcdGlmIChzdHJ1Y3RfbWV0YSBcXHUwMDI2XFx1MDAyNiBidGZfcmVjb3JkX2hhc19ubWlfdW5zYWZlX2ZpZWxkcyhzdHJ1Y3RfbWV0YS1cXHUwMDNlcmVjb3JkKSkge1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE0MjYzLVxcdFxcdGluc25fYXV4LVxcdTAwM2VpbnNlcnRfb2ZmID0gcmVnc1tCUEZfUkVHXzJdLnZhcl9vZmYudmFsdWU7XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE0MjY0OlxcdFxcdGluc25fYXV4LVxcdTAwM2VrcHRyX3N0cnVjdF9tZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEobWV0YS5hcmdfYnRmLCBtZXRhLmFyZ19idGZfaWQpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDI2NS1cXHRcXHRyZWZfY29udmVydF9vd25pbmdfbm9uX293bmluZyhlbnYsIGlkKTtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNDQ3MS1cXHRcXHRcXHRcXHRpbnNuX2F1eC1cXHUwMDNla3B0cl9zdHJ1Y3RfbWV0YSA9XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE0NDcyOlxcdFxcdFxcdFxcdFxcdGJ0Zl9maW5kX3N0cnVjdF9tZXRhKG1ldGEuYXJnX2J0ZixcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTQ0NzMtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBtZXRhLmFyZ19idGZfaWQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMDozNy42MzEyNzA1OTVaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTM0NDM0MzMzMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIEJURiBTdHJ1Y3R1cmUgTWV0YWRhdGEgUGFyc2luZyoqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gYGJ0Zl9wYXJzZV9zdHJ1Y3RfbWV0YXNgLiBNeSBpbml0aWFsIGh1bmNoIGlzIHRoYXQgaXQncyBnb2luZyB0byBiZSB0aGUgY2VudHJhbCBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgYWN0dWFsbHkgZXh0cmFjdGluZyB0aGUgc3RydWN0dXJlIG1ldGFkYXRhIGZyb20gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBkYXRhIGluIGBrZXJuZWwvYnBmL2J0Zi5jYC4gR2l2ZW4gdGhhdCBCVEYgaXMgdGhlIGZvdW5kYXRpb24gZm9yIGVuaGFuY2VkIGRlYnVnZ2luZyBhbmQgaW50cm9zcGVjdGlvbiBvZiBCUEYgcHJvZ3JhbXMsIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBzdHJ1Y3R1cmUgbWV0YWRhdGEgaXMgaGFuZGxlZCBpcyBjcnVjaWFsLiBJIHN1c3BlY3QgdGhpcyBmdW5jdGlvbiBtaWdodCBpbnZvbHZlIHNvbWUgY2xldmVyIHBvaW50ZXIgYXJpdGhtZXRpYywgYml0ZmllbGQgaW50ZXJwcmV0YXRpb24sIGFuZCBwb3RlbnRpYWwgdXNlIG9mIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlY3Vyc2l2ZSBwYXJzaW5nIG9mIG5lc3RlZCBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMuIEknbSBleHBlY3Rpbmcgc29tZSBlcnJvciBoYW5kbGluZyBhcm91bmQgbWFsZm9ybWVkIEJURiBkYXRhLCBhbmQgcHJvYmFibHkgc29tZSBjaGVja3MgZm9yIGFsaWdubWVudCBjb25zdHJhaW50cywgZXNwZWNpYWxseSBjb25zaWRlcmluZyBob3cgQlBGIHdvcmtzLiBJdCdsbCBiZSBpbnRlcmVzdGluZyB0byBzZWUgaG93IGl0IHJlY29uY2lsZXMgdGhlIEJURiBpbmZvcm1hdGlvbiB3aXRoIHRoZSBjdXJyZW50IGtlcm5lbCdzIGRhdGEgbGF5b3V0LiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGhhbmRsZXMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgYW5kIGFueSBwb3RlbnRpYWwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGluIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gTGV0J3Mgc2VlIGlmIG15IHByZWxpbWluYXJ5IGFzc3VtcHRpb25zIGFyZSBvbiB0aGUgbW9uZXkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MjM5LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6NTEuMDc0NzA4NzA4WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MTcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU4NDQsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU4NDQ6XFx0YnRmX3BhcnNlX3N0cnVjdF9tZXRhcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLCBzdHJ1Y3QgYnRmICpidGYpXFxuNTg0NTpcXHR7XFxuNTg0NjpcXHRcXHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiID0gTlVMTDtcXG41ODQ3OlxcdFxcdHN0cnVjdCBidGZfaWRfc2V0ICphb2Y7XFxuNTg0ODpcXHRcXHRpbnQgaSwgbiwgaWQsIHJldDtcXG41ODQ5OlxcdFxcbjU4NTA6XFx0XFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBidGZfaWRfc2V0LCBjbnQpICE9IDApO1xcbjU4NTE6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnRmX2lkX3NldCkgIT0gc2l6ZW9mKHUzMikpO1xcbjU4NTI6XFx0XFxuNTg1MzpcXHRcXHRhb2YgPSBrbWFsbG9jX29iaigqYW9mLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG41ODU0OlxcdFxcdGlmICghYW9mKVxcbjU4NTU6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuNTg1NjpcXHRcXHRhb2YtXFx1MDAzZWNudCA9IDA7XFxuNTg1NzpcXHRcXG41ODU4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGFsbG9jX29ial9maWVsZHMpOyBpKyspIHtcXG41ODU5OlxcdFxcdFxcdC8qIFRyeSB0byBmaW5kIHdoZXRoZXIgdGhpcyBzcGVjaWFsIHR5cGUgZXhpc3RzIGluIHVzZXIgQlRGLCBhbmRcXG41ODYwOlxcdFxcdFxcdCAqIGlmIHNvIHJlbWVtYmVyIGl0cyBJRCBzbyB3ZSBjYW4gZWFzaWx5IGZpbmQgaXQgYW1vbmcgbWVtYmVyc1xcbjU4NjE6XFx0XFx0XFx0ICogb2Ygc3RydWN0cyB0aGF0IHdlIGl0ZXJhdGUgaW4gdGhlIG5leHQgbG9vcC5cXG41ODYyOlxcdFxcdFxcdCAqL1xcbjU4NjM6XFx0XFx0XFx0c3RydWN0IGJ0Zl9pZF9zZXQgKm5ld19hb2Y7XFxuNTg2NDpcXHRcXG41ODY1OlxcdFxcdFxcdGlkID0gYnRmX2ZpbmRfYnlfbmFtZV9raW5kKGJ0ZiwgYWxsb2Nfb2JqX2ZpZWxkc1tpXSwgQlRGX0tJTkRfU1RSVUNUKTtcXG41ODY2OlxcdFxcdFxcdGlmIChpZCBcXHUwMDNjIDApXFxuNTg2NzpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG41ODY4OlxcdFxcbjU4Njk6XFx0XFx0XFx0bmV3X2FvZiA9IGtyZWFsbG9jKGFvZiwgc3RydWN0X3NpemUobmV3X2FvZiwgaWRzLCBhb2YtXFx1MDAzZWNudCArIDEpLFxcbjU4NzA6XFx0XFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XFxuNTg3MTpcXHRcXHRcXHRpZiAoIW5ld19hb2YpIHtcXG41ODcyOlxcdFxcdFxcdFxcdHJldCA9IC1FTk9NRU07XFxuNTg3MzpcXHRcXHRcXHRcXHRnb3RvIGZyZWVfYW9mO1xcbjU4NzQ6XFx0XFx0XFx0fVxcbjU4NzU6XFx0XFx0XFx0YW9mID0gbmV3X2FvZjtcXG41ODc2OlxcdFxcdFxcdGFvZi1cXHUwMDNlaWRzW2FvZi1cXHUwMDNlY250KytdID0gaWQ7XFxuNTg3NzpcXHRcXHR9XFxuNTg3ODpcXHRcXG41ODc5OlxcdFxcdG4gPSBidGZfbnJfdHlwZXMoYnRmKTtcXG41ODgwOlxcdFxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG41ODgxOlxcdFxcdFxcdC8qIFRyeSB0byBmaW5kIGlmIHRoZXJlIGFyZSBrcHRycyBpbiB1c2VyIEJURiBhbmQgcmVtZW1iZXIgdGhlaXIgSUQgKi9cXG41ODgyOlxcdFxcdFxcdHN0cnVjdCBidGZfaWRfc2V0ICpuZXdfYW9mO1xcbjU4ODM6XFx0XFx0XFx0c3RydWN0IGJ0Zl9maWVsZF9pbmZvIHRtcDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6NTEuMDc1MTg1MDM4WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY5OTUzNTAwNDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEJURiBMb2FkaW5nIGFuZCBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIGhvdyBgYWxsb2Nfb2JqX2ZpZWxkc2Agd29ya3MgYW5kIGhvdyBCVEYgbG9hZGluZyBwbGF5cyBhIHJvbGUuIEl0IGxvb2tzIGxpa2Ugd2hlbiBhIEJURiBibG9iIGlzIGxvYWRlZCB1c2luZyBgYnBmKEJQRl9CVEZfTE9BRCwgLi4uKWAsIHRoZSBrZXJuZWwgY2FsbHMgYGJ0Zl9wYXJzZSgpYC4gV2l0aGluIGBidGZfcGFyc2UoKWAsIGBidGZfcGFyc2Vfc3RydWN0X21ldGFzKClgIHJ1bnMgb24gdGhlIHVzZXItcHJvdmlkZWQgQlRGIGRhdGEuIFRoYXQncyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBJZiBzdHJ1Y3QgbWV0YWRhdGEgaXMgZm91bmQsIHRoZSBjb2RlIGl0ZXJhdGVzIHRocm91Z2ggaXQsIGNhbGxpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKClgIGFuZCB0aGVuIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLlxuXG5JIHNlZSB0aGF0IHRoZSBgbG9jYWxfa3B0cl9vd25lcnNoaXAuY2Agc2VsZnRlc3QgZGVtb25zdHJhdGVzIHRoaXMgZXhhY3QgZmxvdy4gSXQgY3JlYXRlcyBhbiBlbXB0eSBCVEYsIGFkZHMgZGlmZmVyZW50IHR5cGVzIChpbnQsIGJwZl9zcGluX2xvY2ssIGJwZl9saXN0X2hlYWQsIGV0Yy4pLCBhbmQgbG9hZHMgaXQgd2l0aCBgYnRmX19sb2FkX2ludG9fa2VybmVsKClgLCB3aGljaCB0cmlnZ2VycyB0aGF0IGBicGYoQlBGX0JURl9MT0FELCAuLi4pYCBjYWxsLCB1bHRpbWF0ZWx5IGhpdHRpbmcgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAuXG5cbk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5LiBDbGVhcmx5LCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBlc3NlbnRpYWwuIEJ1dCBkb2VzIGBCUEZfU1lTQ0FMTGAgaGF2ZSBhbnkgZGVwZW5kZW5jaWVzPyBMZXQgbWUgY2hlY2sgdGhlIGBrZXJuZWwvYnBmL0tjb25maWdgLiBBaCwgYEJQRl9TWVNDQUxMYCBzZWxlY3RzIGBCUEZgLiBObyBkaXJlY3QgYGRlcGVuZHMgb25gIHRob3VnaC5cblxuV2hhdCBhYm91dCBgREVCVUdfSU5GT19CVEZgPyBJcyB0aGF0IG5lY2Vzc2FyeSBmb3IgYEJQRl9CVEZfTE9BRGA/IExldCBtZSBsb29rIGF0IGBicGZfYnRmX2xvYWRgIGluIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AuIEl0IGdvZXMgdG8gYGJ0Zl9uZXdfZmQoKWAgdGhlbiB0byBgYnRmX3BhcnNlKClgLiBUaGUgYGJ0Zl9wYXJzZWAgZnVuY3Rpb24gZG9lc24ndCBzZWVtIHRvIGNoZWNrIGZvciBgQ09ORklHX0RFQlVHX0lORk9fQlRGYC4gIEludGVyZXN0aW5nLiBBbHRob3VnaCBjb21tb25seSBlbmFibGVkIGZvciBCUEYgZnV6emluZywgaXQgc2VlbXMgc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgY3JpdGljYWwgY29uZmlnLCBhcyBpdCBidWlsZHMgYGJ0Zi5jYC5cblxuSSdsbCBkb3VibGUtY2hlY2sgdG8gZW5zdXJlIHRoZXJlIGFyZW4ndCBhbnkgb3RoZXIgY29uZmlncyBuZWVkZWQuIElzIGBCUEZfU1lTQ0FMTGAgcGFydCBvZiBhIFwiQlBGIHN1YnN5c3RlbVwiIG1lbnUsIGFzIHRoYXQgaXMgc29tZXRpbWVzIGEgZmFjdG9yPyBJJ2xsIGNoZWNrIGBrZXJuZWwvYnBmL0tjb25maWdgLCBzdGFydGluZyBhdCB0aGUgdG9wLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzI1MCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMwOjU4LjA3MDUzODg3N1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTg5MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRcXG4gICAzOlxcdCMgQlBGIGludGVycHJldGVyIHRoYXQsIGZvciBleGFtcGxlLCBjbGFzc2ljIHNvY2tldCBmaWx0ZXJzIGRlcGVuZCBvbi5cXG4gICA0OlxcdGNvbmZpZyBCUEZcXG4gICA1OlxcdFxcdGJvb2xcXG4gICA2OlxcdFxcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxcbiAgIDc6XFx0XFxuICAgODpcXHQjIFVzZWQgYnkgYXJjaHMgdG8gdGVsbCB0aGF0IHRoZXkgc3VwcG9ydCBCUEYgSklUIGNvbXBpbGVyIHBsdXMgd2hpY2hcXG4gICA5OlxcdCMgZmxhdm91ci4gT25seSBvbmUgb2YgdGhlIHR3byBjYW4gYmUgc2VsZWN0ZWQgZm9yIGEgc3BlY2lmaWMgYXJjaCBzaW5jZVxcbiAgMTA6XFx0IyBlQlBGIEpJVCBzdXBlcnNlZGVzIHRoZSBjQlBGIEpJVC5cXG4gIDExOlxcdFxcbiAgMTI6XFx0IyBDbGFzc2ljIEJQRiBKSVQgKGNCUEYpXFxuICAxMzpcXHRjb25maWcgSEFWRV9DQlBGX0pJVFxcbiAgMTQ6XFx0XFx0Ym9vbFxcbiAgMTU6XFx0XFxuICAxNjpcXHQjIEV4dGVuZGVkIEJQRiBKSVQgKGVCUEYpXFxuICAxNzpcXHRjb25maWcgSEFWRV9FQlBGX0pJVFxcbiAgMTg6XFx0XFx0Ym9vbFxcbiAgMTk6XFx0XFxuICAyMDpcXHQjIEtBU0FOIHN1cHBvcnQgZm9yIEpJVCBjb21waWxlclxcbiAgMjE6XFx0Y29uZmlnIEhBVkVfRUJQRl9KSVRfS0FTQU5cXG4gIDIyOlxcdFxcdGJvb2xcXG4gIDIzOlxcdFxcbiAgMjQ6XFx0IyBVc2VkIGJ5IGFyY2hzIHRvIHRlbGwgdGhhdCB0aGV5IHdhbnQgdGhlIEJQRiBKSVQgY29tcGlsZXIgZW5hYmxlZCBieVxcbiAgMjU6XFx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cXG4gIDI2OlxcdGNvbmZpZyBBUkNIX1dBTlRfREVGQVVMVF9CUEZfSklUXFxuICAyNzpcXHRcXHRib29sXFxuICAyODpcXHRcXG4gIDI5OlxcdG1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxuICAzMDpcXHRcXG4gIDMxOlxcdGNvbmZpZyBCUEZfU1lTQ0FMTFxcbiAgMzI6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcbiAgMzM6XFx0XFx0c2VsZWN0IEJQRlxcbiAgMzQ6XFx0XFx0c2VsZWN0IElSUV9XT1JLXFxuICAzNTpcXHRcXHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6MzA6NTguMDcwNjYxMzM3WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjg1MzExNTcyMzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhpcyBCUEYgUGF0Y2ggZm9yIEZ1enppbmcqKlxuXG5BbHJpZ2h0LCBzbyBJJ3ZlIGdvdCBhIGdvb2QgaGFuZGxlIG9uIHRoaXMgcGF0Y2guIGBCUEZfU1lTQ0FMTGAgaXMgdGhlIGtleSBjb25maWd1cmF0aW9uIGhlcmUsIHRoYXQncyB0aGUgZGlyZWN0IGNvbmZpZy4gTm93LCBsZXQncyBuYWlsIGRvd24gdGhlc2UgRm9jdXNTeW1ib2xzLiBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIG5vbi11YmlxdWl0b3VzIGZ1bmN0aW9ucyB0aGF0IGFyZSAqYWx0ZXJlZCogb3IgKmFkZGVkKiBpbiB0aGlzIHBhdGNoLCBhcyBwZXIgdGhlIGd1aWRlbGluZXMuIEkgbmVlZCB0byBhdm9pZCBsaXN0aW5nIGNvbW1vbiBmdW5jdGlvbnMgdGhhdCB3b3VsZCBqdXN0IGRpbHV0ZSB0aGUgZnV6emluZyBlZmZvcnQuXG5cbk9rYXksIGxldCdzIHNlZS4uLiBsb29raW5nIGF0IHRoZSBjb2RlIGNoYW5nZXM6XG5cbiogICBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGA6IEFkZGVkLCBzdGF0aWMgaW4gYGJ0Zi5jYC4gWWVwLCB0aGF0J3Mgc3BlY2lmaWMuXG4qICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgOiBBZGRlZCwgcmVjdXJzaXZlIHN0YXRpYyBpbiBgYnRmLmNgLiBTb3VuZHMgc3BlY2lmaWMgdG8gdGhpcyBuZXcgbG9naWMuXG4qICAgYGJ0Zl9vd25lZF90eXBlX2lkeGA6IEFkZGVkLCBzdGF0aWMgaW4gYGJ0Zi5jYC4gQW5vdGhlciBuZXcgZnVuY3Rpb24gcmVsYXRlZCB0byB0aGUgb3duZXJzaGlwIHRyYWNraW5nLlxuKiAgIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2A6IE1vZGlmaWVkLCBub24tc3RhdGljIGluIGBidGYuY2AuIENydWNpYWwsIHRoZSBjeWNsZSBjaGVjayBsb2dpYyB3YXMgc2ltcGxpZmllZCBpbiB0aGlzLlxuKiAgIGBidGZfcGFyc2VgOiBNb2RpZmllZCwgY2FsbGVyIGluIGBidGYuY2AuIEFkZGVkIGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBEZWZpbml0ZWx5IHJlbGV2YW50LCBzaW5jZSBpdCdzIHRoZSBjYWxsZXIuXG4qICAgYGJ0Zl9uZXdfZmRgIG9yIGBicGZfYnRmX2xvYWRgOiBUaGUgZW50cnkgcG9pbnQgZm9yIGxvYWRpbmcgQlRGLiBOb3csIHRoYXQncyBhIGtleSBlbnRyeSBwb2ludC4gTGV0J3MgdXNlIGBicGZfYnRmX2xvYWRgLlxuXG5TbywgaXQncyBjbGVhciBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIHdhcyBpbmRlZWQgbW9kaWZpZWQuIEdvb2QuIEFuZCB0aG9zZSB0aHJlZSBhZGRlZCBmdW5jdGlvbnMgKGBidGZfb3duZWRfdHlwZV9pZHhgLCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCkgYXJlIGFsbCBuZXcsIHNvLCB0aGV5IGFyZSBub3QgdWJpcXVpdG91cy4gYGJ0Zl9wYXJzZWAgaXMgYWxzbyBhZGRlZCBhbmQgcmVsZXZhbnQgYmVjYXVzZSBpdCBjYWxscyBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAuXG5cbk5vdywgYWNjb3JkaW5nIHRvIHRoZSBpbnN0cnVjdGlvbnMsIEkgbmVlZCB0byBmb2N1cyBvbiBmdW5jdGlvbnMgaW1wbGVtZW50aW5nIHRoZSBuZXcgbG9naWMgb3IgZW50cnlwb2ludHMuIFRoZXNlIGZ1bmN0aW9ucyBhbGwgZml0IHRoYXQgYmlsbCBwZXJmZWN0bHk6XG4tIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYFxuLSBgYnRmX293bmVyc2hpcF9kZXB0aGBcbi0gYGJ0Zl9vd25lZF90eXBlX2lkeGBcbi0gYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYFxuLSBgYnBmX2J0Zl9sb2FkYFxuXG5MZXQncyBtYWtlIHN1cmUgdGhlc2UgYXJlIHZhbGlkIGZ1bmN0aW9uIHN5bWJvbHM6IFllcywgYWxsIG9mIHRoZW0gYXJlIHJlYWwgZnVuY3Rpb24gc3ltYm9scyBpbiBgYnRmLmNgIGFuZCBgc3lzY2FsbC5jYC5cblxuT2theSwgbGV0J3MgZG8gYSBmaW5hbCBjaGVjazogSXMgdGhpcyBwYXRjaCBgV29ydGhGdXp6aW5nYD8gQWJzb2x1dGVseS4gSXQncyBtb2RpZnlpbmcgYGtlcm5lbC9icGYvYnRmLmNgLCBpbXBsZW1lbnRpbmcgYSBuZXcgb3duZXJzaGlwIGdyYXBoIGRlcHRoLWNoZWNraW5nIGFsZ29yaXRobSB0byBwcmV2ZW50IGN5Y2xlcyB3aGVuIHBhcnNpbmcgQlRGIG9iamVjdHMgbG9hZGVkIHZpYSBgYnBmKEJQRl9CVEZfTE9BRCwgLi4uKWAuIFVzZXItc3VwcGxpZWQgQlRGIGlucHV0LCByZWFjaGFibGUga2VybmVsIGNvZGUsIG5vIHNwZWNpYWwgaGFyZHdhcmUuIFRoaXMgaXMgcHJpbWUgZnV6emluZyB0ZXJyaXRvcnkuXG5cbkFuZCBmaW5hbGx5LCBgRW5hYmxlQ29uZmlnc2A6IGBCUEZfU1lTQ0FMTGAuIFNpbmNlIGBCUEZfU1lTQ0FMTGAgc2VsZWN0cyBgQlBGYCwgaXQncyBnb29kIHByYWN0aWNlIHRvIGVuYWJsZSBib3RoLCBhbHRob3VnaCBpdCdzIHJlZHVuZGFudC5cblxuU28sIGJlZm9yZSBJIGNhbGwgYHNldC1yZXN1bHRzYCwgbGV0J3MgdmVyaWZ5OlxuXG4qICAgYFdvcnRoRnV6emluZ2A6IFRydWVcbiogICBgRW5hYmxlQ29uZmlnc2A6IGBbXCJCUEZfU1lTQ0FMTFwiXWBcbiogICBgRm9jdXNTeW1ib2xzYDogYFtcImJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhcIiwgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsIFwiYnRmX293bmVkX3R5cGVfaWR4XCIsIFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIiwgXCJicGZfYnRmX2xvYWRcIl1gXG4qICAgUmVhc29uaW5nOiBDb25jaXNlIGFuZCBjb21wbGV0ZS5cblxuUmVhZHkgdG8gcm9sbC4gTGV0J3MgaW52b2tlIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDQyLCJPdXRwdXRUb2tlbnMiOjIwNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg5MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMxOjA2LjYwMTgyMTY0OFoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDIyODQ2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJicGZfYnRmX2xvYWRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJicGZfYnRmX2xvYWRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGV4dGVuZHMgQlRGIG93bmVyc2hpcCBhbmQgY3ljbGUgdmFsaWRhdGlvbiBieSBpbnRyb2R1Y2luZyBkZXB0aC1ib3VuZGVkIGdyYXBoIHRyYXZlcnNhbCAoYnRmX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCkgdG8gdmFsaWRhdGUgb3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgaW4gdXNlci1sb2FkZWQgQlRGIHR5cGVzIChzdWNoIGFzIGdyYXBoIHJvb3RzIGFuZCBrcHRycykuIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIGlzIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGJwZigpIHN5c2NhbGwgKEJQRl9CVEZfTE9BRCkuIEZ1enppbmcgY2FuIHZlcmlmeSByZWN1cnNpb24gYm91bmRzLCBjeWNsZSBkZXRlY3Rpb24gY29ycmVjdG5lc3MsIGFuZCBlZGdlIGNhc2VzIGluIHBhcnNpbmcgYXJiaXRyYXJ5IHVzZXItc3VwcGxpZWQgQlRGIGRhdGEuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMxOjA2LjcyMjA1Nzc4OVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc2ODk2NzE1MTE0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjMxOjA2LjcyMjYxMjM5OVoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE3Njg5NjY1OTEwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cXG5cXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXFxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxcbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxcblxcblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGY1ODQ1MjVmOTk2MDBmNmY3YWQ3YmRiODliZWFlY2M1ZmI0OGRmODFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNjoyODozMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA3ZGFmNGMyODZjOWIyLi45MjIxN2ExNGI5ZDNkIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuKysrIGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTQyODQsMTMgKzQyODQsMTAgQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbiB7XG4gXHRpbnQgaTtcbiBcbi1cdC8qIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyB0aGF0IHNpZ25pZnkgb3duZXJzaGlwIG9mIHNvbWUgb3RoZXIgdHlwZTpcbi1cdCAqICBrcHRyX3JlZiwgYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QuXG4tXHQgKiBrcHRyX3JlZiBvbmx5IHN1cHBvcnRzIHN0b3Jpbmcga2VybmVsIHR5cGVzLCB3aGljaCBjYW4ndCBzdG9yZVxuLVx0ICogcmVmZXJlbmNlcyB0byBwcm9ncmFtIGFsbG9jYXRlZCBsb2NhbCB0eXBlcy5cbi1cdCAqXG4tXHQgKiBIZW5jZSB3ZSBvbmx5IG5lZWQgdG8gZW5zdXJlIHRoYXQgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0gb3duZXJzaGlwXG4tXHQgKiBkb2VzIG5vdCBmb3JtIGN5Y2xlcy5cbitcdC8qXG4rXHQgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWVcbitcdCAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXNcbitcdCAqIGJlZW4gZml4ZWQgdXAuXG4gXHQgKi9cbiBcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXG4gXHRcdHJldHVybiAwO1xuQEAgLTQzMjEsNTEgKzQzMTgsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbiBcdFx0aWYgKCFtZXRhKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRyZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cdTAwM2VyZWNvcmQ7XG4rXHR9XG4rXHRyZXR1cm4gMDtcbit9XG4gXG4tXHRcdC8qIFdlIG5lZWQgdG8gc2V0IHZhbHVlX3JlYyBmb3IgYWxsIHJvb3QgdHlwZXMsIGJ1dCBubyBuZWVkXG4tXHRcdCAqIHRvIGNoZWNrIG93bmVyc2hpcCBjeWNsZSBmb3IgYSB0eXBlIHVubGVzcyBpdCdzIGFsc28gYVxuLVx0XHQgKiBub2RlIHR5cGUuXG4tXHRcdCAqL1xuLVx0XHRpZiAoIShyZWMtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgQlBGX0dSQVBIX05PREUpKVxuK3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbitcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcbit7XG4rXHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuK1x0dTMyIGJ0Zl9pZDtcbitcbitcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuK1x0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcbitcdH0gZWxzZSBpZiAoZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHtcbitcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VrcHRyLmJ0Zl9pZDtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1x0fVxuK1xuK1x0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcbitcdGlmICghbWV0YSlcbitcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG4rXHRyZXR1cm4gbWV0YSAtIHRhYi1cdTAwM2V0eXBlcztcbit9XG4rXG4rLypcbisgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmRcbisgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuKyAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XG4rICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcbisgKiBub24tcmVjdXJzaW5nIGRyb3AuXG4rICovXG4rI2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XG4rXG4rc3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxuK1x0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xuK1x0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbitcbitcdGlmICghZGVwdGhfbGVmdClcbitcdFx0cmV0dXJuIC1FTE9PUDtcbitcdGlmIChkZXB0aFtpZHhdKVxuK1x0XHRnb3RvIGRvbmU7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyByZWMtXHUwMDNlY250OyBpKyspIHtcbitcdFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcdTAwMjZyZWMtXHUwMDNlZmllbGRzW2ldKTtcbitcdFx0aWYgKHJldCA9PSAtRU5PRU5UKVxuIFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRtYXhfZGVwdGggPSBtYXgobWF4X2RlcHRoLCByZXQpO1xuK1x0fVxuK1x0ZGVwdGhbaWR4XSA9IG1heF9kZXB0aCArIDE7XG4rZG9uZTpcbitcdHJldHVybiBkZXB0aFtpZHhdIFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcbit9XG4gXG4tXHRcdC8qIFdlIG5lZWQgdG8gZW5zdXJlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFtb25nIGFsbCB0eXBlcy4gVGhlXG4tXHRcdCAqIHByb3BlciB3YXkgdG8gZG8gaXQgd291bGQgYmUgdG8gdG9wb2xvZ2ljYWxseSBzb3J0IGFsbCBCVEZcbi1cdFx0ICogSURzIGJhc2VkIG9uIHRoZSBvd25lcnNoaXAgZWRnZXMsIHNpbmNlIHRoZXJlIGNhbiBiZSBtdWx0aXBsZVxuLVx0XHQgKiBicGZfe2xpc3RfaGVhZCxyYl9ub2RlfSBpbiBhIHR5cGUuIEluc3RlYWQsIHdlIHVzZSB0aGVcbi1cdFx0ICogZm9sbG93aW5nIHJlc2FvbmluZzpcbi1cdFx0ICpcbi1cdFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgYmUgb3duZWQgYnkgYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0XG4tXHRcdCAqICAgaGFzIGEgYnBmX3tsaXN0LHJifV9ub2RlLiBMZXQncyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxuLVx0XHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQncyBjYWxsIHRoZXNlIHJvb3QgdHlwZXMuXG4tXHRcdCAqXG4tXHRcdCAqIFdlIGVuc3VyZSB0aGF0IGlmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgaXRzXG4tXHRcdCAqIGVsZW1lbnQgdHlwZXMgY2Fubm90IGJlIHJvb3QgdHlwZXMuXG4tXHRcdCAqXG4tXHRcdCAqIFRvIGVuc3VyZSBhY3ljbGljaXR5OlxuLVx0XHQgKlxuLVx0XHQgKiBXaGVuIEEgaXMgYW4gcm9vdCB0eXBlIGJ1dCBub3QgYSBub2RlLCBpdHMgb3duZXJzaGlwXG4tXHRcdCAqIGNoYWluIGNhbiBiZTpcbi1cdFx0ICpcdEEgLVx1MDAzZSBCIC1cdTAwM2UgQ1xuLVx0XHQgKiBXaGVyZTpcbi1cdFx0ICogLSBBIGlzIGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9yYl9yb290LlxuLVx0XHQgKiAtIEIgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGUuZy4gaGFzIGJwZl9yYl9ub2RlIGFuZFxuLVx0XHQgKiAgIGJwZl9saXN0X2hlYWQuXG4tXHRcdCAqIC0gQyBpcyBvbmx5IGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9saXN0X25vZGVcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBzb21lIG90aGVyIHR5cGUgYWxyZWFkeVxuLVx0XHQgKiBvd25zIGl0IGluIHRoZSBCVEYgZG9tYWluLCBoZW5jZSBpdCBjYW4gbm90IG93blxuLVx0XHQgKiBhbm90aGVyIHJvb3QgdHlwZSB0aHJvdWdoIGFueSBvZiB0aGUgb3duZXJzaGlwIGVkZ2VzLlxuLVx0XHQgKlx0QSAtXHUwMDNlIEJcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBib3RoIGFuIHJvb3QgYW5kIG5vZGUuXG4tXHRcdCAqIC0gQiBpcyBvbmx5IGFuIG5vZGUuXG4tXHRcdCAqL1xuLVx0XHRpZiAobWV0YS1cdTAwM2VyZWNvcmQtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpXG4tXHRcdFx0cmV0dXJuIC1FTE9PUDtcbitzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuK3tcbitcdHU4ICpkZXB0aDtcbitcdGludCBpLCByZXQgPSAwO1xuK1xuK1x0ZGVwdGggPSBrdmNhbGxvYyh0YWItXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XG4rXHRpZiAoIWRlcHRoKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkrKykge1xuK1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbitcdFx0XHRcdFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHJldCA9IDA7XG4gXHR9XG4tXHRyZXR1cm4gMDtcbitcdGt2ZnJlZShkZXB0aCk7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbkBAIC02MDYwLDYgKzYwOTQsMTAgQEAgc3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbiBcdFx0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG4gXHRcdH1cbitcbitcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG4rXHRcdGlmIChlcnIgXHUwMDNjIDApXG4rXHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbiBcdH1cbiBcbiBcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXHUwMDI2ZW52LVx1MDAzZWxvZyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbmluZGV4IGMzZDEzM2M2YTAwZDQuLjUyZmFiYmVlM2RkNWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXG5AQCAtNzE0LDcgKzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcImNoZWNrIGJ0ZlwiKTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuQEAgLTc3Myw3ICs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcImNoZWNrIGJ0ZlwiKTtcbitcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCJjaGVjayBidGZcIik7XG4gXHRcdGJ0Zl9fZnJlZShidGYpO1xuIFx0XHRicmVhaztcbiBcdH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmE0ODdhYTY4ZjJlZWZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmNcbkBAIC0wLDAgKzEsMjk2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbitcbisjZGVmaW5lIFNQSU5fTE9DSyAyXG4rI2RlZmluZSBMSVNUX0hFQUQgM1xuKyNkZWZpbmUgTElTVF9OT0RFIDRcbisvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi9cbisjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOFxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZDtcbitcbitcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImJ0Zl9fbmV3X2VtcHR5XCIpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlkID0gYnRmX19hZGRfaW50KGJ0ZiwgXCJpbnRcIiwgNCwgQlRGX0lOVF9TSUdORUQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEsIFwiYnRmX19hZGRfaW50XCIpKVxuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiYnBmX3NwaW5fbG9ja1wiLCA0KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCBTUElOX0xPQ0ssIFwiYnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2tcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfbGlzdF9oZWFkXCIsIDE2KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX0hFQUQsIFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfbGlzdF9ub2RlXCIsIDI0KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsIFwiYnRmX19hZGRfc3RydWN0IGJwZl9saXN0X25vZGVcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdHJldHVybiBidGY7XG4rXG4rZXJyX291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYWRkX2xvY2FsX2twdHIoc3RydWN0IGJ0ZiAqYnRmLCBpbnQgcG9pbnRlZV9pZCwgY29uc3QgY2hhciAqdGFnKVxuK3tcbitcdGludCBpZDtcbitcbitcdGlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpO1xuK1x0aWYgKCFBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfdHlwZV90YWdcIikpXG4rXHRcdHJldHVybiBpZDtcbitcdGlkID0gYnRmX19hZGRfcHRyKGJ0ZiwgaWQpO1xuK1x0QVNTRVJUX0dUKGlkLCAwLCBcImJ0Zl9fYWRkX3B0clwiKTtcbitcdHJldHVybiBpZDtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2Vycilcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgdGFnKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcInNlbGZfY3ljbGVcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXCJidGZfX2FkZF9zdHJ1Y3Qgc2VsZl9jeWNsZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibmV4dFwiLCA2LCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgMTAsIFwia3B0clwiKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksIFwia3B0clwiKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImN5Y2xlX2FcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgOSwgXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwiYlwiLCA2LCAwLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBjeWNsZV9hOjpiXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJjeWNsZV9iXCIsIDgpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEwLCBcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJhXCIsIDgsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnI7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIFwia3B0clwiKTtcbitcdGlmIChpZCBcdTAwM2M9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcIm1peGVkX293bmVyXCIsIDIwKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9vd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwicm9vdFwiLCBMSVNUX0hFQUQsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJsb2NrXCIsIFNQSU5fTE9DSywgMTI4LCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXCJjb250YWluczptaXhlZF9ub2RlOm5vZGVcIiwgNywgMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXCJidGZfX2FkZF9kZWNsX3RhZyBtaXhlZF9vd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwibWl4ZWRfbm9kZVwiLCAzMik7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgOSwgXCJidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwibm9kZVwiLCBMSVNUX05PREUsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm93bmVyXCIsIDYsIDE5MiwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6b3duZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2FjeWNsaWNfZGVwdGgoaW50IGRlcHRoLCBib29sIGNoaWxkX2ZpcnN0LCBib29sIHNoYXJlZF9zdWZmaXgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XG4rXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnIsIGksIG4sIHBvaW50ZWVfaWQ7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0aWYgKGkgPT0gZGVwdGggLSAxKVxuK1x0XHRcdHBvaW50ZWVfaWQgPSBmaXJzdF9zdHJ1Y3RfaWQgKyBkZXB0aDtcbitcdFx0ZWxzZVxuK1x0XHRcdHBvaW50ZWVfaWQgPSBmaXJzdF9zdHJ1Y3RfaWQgKyAoY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDIgLSBpIDogaSArIDEpO1xuK1x0XHRwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIHBvaW50ZWVfaWQsIFwia3B0clwiKTtcbitcdFx0aWYgKHB0cl9pZFtpXSBcdTAwM2M9IDApXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRmb3IgKG4gPSAwOyBuIFx1MDAzYyBkZXB0aDsgbisrKSB7XG4rXHRcdGNoYXIgbmFtZVszMl07XG4rXHRcdGludCBvZmZzZXQgPSAwO1xuK1xuK1x0XHRpID0gY2hpbGRfZmlyc3QgPyBkZXB0aCAtIDEgLSBuIDogbjtcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcIm93bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNoYXJlZF9zdWZmaXggXHUwMDI2XHUwMDI2ICFpID8gMTYgOiA4KTtcbitcdFx0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIG4sIFwiYnRmX19hZGRfc3RydWN0IG93bmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRpZiAoc2hhcmVkX3N1ZmZpeCBcdTAwMjZcdTAwMjYgIWkpIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIFZpc2l0IHRoZSBzaGFyZWQgc3VmZml4IHRocm91Z2ggdGhlIHNob3J0ZXIgcGF0aCBiZWZvcmVcbitcdFx0XHQgKiByZWFjaGluZyBpdCBhZ2FpbiB3aXRoIGxlc3MgcmVtYWluaW5nIGRlcHRoLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJzdWZmaXhcIiwgcHRyX2lkWzFdLCAwLCAwKTtcbitcdFx0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgb3duZXI6OnN1ZmZpeFwiKSlcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdG9mZnNldCA9IDY0O1xuK1x0XHR9XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIHB0cl9pZFtpXSwgb2Zmc2V0LCAwKTtcbitcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0XCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcInBsYWluX2xlYWZcIiwgNCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgZGVwdGgsIFwiYnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2dyYXBoX2RlcHRoKGJvb2wgcmJ0cmVlLCBpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHJvb3RfdHlwZSA9IExJU1RfSEVBRCwgbm9kZV90eXBlID0gTElTVF9OT0RFLCBub2RlX3NpemUgPSAyNDtcbitcdGludCBpZCwgZXJyLCBpLCBsb2NrX29mZiwgcm9vdF9vZmYsIHNpemU7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHJidHJlZSkge1xuK1x0XHRyb290X3R5cGUgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9yYl9yb290XCIsIDE2KTtcbitcdFx0aWYgKCFBU1NFUlRfR1Qocm9vdF90eXBlLCAwLCBcImJ0Zl9fYWRkX3N0cnVjdCBicGZfcmJfcm9vdFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0bm9kZV90eXBlID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfcmJfbm9kZVwiLCAzMik7XG4rXHRcdGlmICghQVNTRVJUX0dUKG5vZGVfdHlwZSwgMCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3JiX25vZGVcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdG5vZGVfc2l6ZSA9IDMyO1xuK1x0fVxuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZGVwdGg7IGkrKykge1xuK1x0XHRjaGFyIG5hbWVbMzJdLCB0YWdbNjRdO1xuK1xuK1x0XHRsb2NrX29mZiA9IGkgPyBub2RlX3NpemUgOiAwO1xuK1x0XHRyb290X29mZiA9IGxvY2tfb2ZmICsgODtcbitcdFx0c2l6ZSA9IGkgPT0gZGVwdGggLSAxID8gbm9kZV9zaXplIDogcm9vdF9vZmYgKyAxNjtcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcImdyYXBoX293bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIHNpemUpO1xuK1x0XHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF9zdHJ1Y3QgZ3JhcGhfb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlmIChpKSB7XG4rXHRcdFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcIm5vZGVcIiwgbm9kZV90eXBlLCAwLCAwKTtcbitcdFx0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgZ3JhcGhfb3duZXI6Om5vZGVcIikpXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRpZiAoaSA9PSBkZXB0aCAtIDEpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJsb2NrXCIsIFNQSU5fTE9DSywgbG9ja19vZmYgKiA4LCAwKTtcbitcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGdyYXBoX293bmVyOjpsb2NrXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwicm9vdFwiLCByb290X3R5cGUsIHJvb3Rfb2ZmICogOCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBncmFwaF9vd25lcjo6cm9vdFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0c25wcmludGYodGFnLCBzaXplb2YodGFnKSwgXCJjb250YWluczpncmFwaF9vd25lcl8lZDpub2RlXCIsIGkgKyAxKTtcbitcdFx0ZXJyID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCB0YWcsIGlkLCBpID8gMiA6IDEpO1xuK1x0XHRpZiAoIUFTU0VSVF9HVChlcnIsIDAsIFwiYnRmX19hZGRfZGVjbF90YWcgZ3JhcGhfb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKVxuK3tcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2VsZl9jeWNsZVwiKSlcbitcdFx0dGVzdF9zZWxmX2N5Y2xlKFwia3B0clwiLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ1bnRydXN0ZWRfc2VsZl9jeWNsZVwiKSlcbitcdFx0dGVzdF9zZWxmX2N5Y2xlKFwia3B0cl91bnRydXN0ZWRcIiwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBlcmNwdV9zZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJwZXJjcHVfa3B0clwiLCAtRUxPT1ApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJBQkFfY3ljbGVcIikpXG4rXHRcdHRlc3RfYWJhX2N5Y2xlKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1peGVkX2dyYXBoX3Jvb3RfY3ljbGVcIikpXG4rXHRcdHRlc3RfbWl4ZWRfY3ljbGUoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWF4X2FjeWNsaWNcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgZmFsc2UsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIGZhbHNlLCBmYWxzZSwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWF4X2FjeWNsaWNfY2hpbGRfZmlyc3RcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCB0cnVlLCBmYWxzZSwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRvb19kZWVwX2FjeWNsaWNfY2hpbGRfZmlyc3RcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgdHJ1ZSwgZmFsc2UsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1heF9hY3ljbGljX3NoYXJlZF9zdWZmaXhcIikpXG4rXHRcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCBmYWxzZSwgdHJ1ZSwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRvb19kZWVwX2FjeWNsaWNfc2hhcmVkX3N1ZmZpeFwiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggKyAxLCBmYWxzZSwgdHJ1ZSwgLUVMT09QKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibGlzdF90aHJlZV90eXBlc1wiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgMywgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfZm91cl90eXBlc1wiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgNCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxpc3RfbWF4X2RlcHRoXCIpKVxuK1x0XHR0ZXN0X2dyYXBoX2RlcHRoKGZhbHNlLCBNQVhfT1dORVJTSElQX0RFUFRILCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibGlzdF90b29fZGVlcFwiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aChmYWxzZSwgTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV90aHJlZV90eXBlc1wiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCAzLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmJ0cmVlX2ZvdXJfdHlwZXNcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgNCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV9tYXhfZGVwdGhcIikpXG4rXHRcdHRlc3RfZ3JhcGhfZGVwdGgodHJ1ZSwgTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJidHJlZV90b29fZGVlcFwiKSlcbitcdFx0dGVzdF9ncmFwaF9kZXB0aCh0cnVlLCBNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgLUVMT09QKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjozMTowNi43MjI2MTM4MjlaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTA1NDA4NDQwMjg0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFdmFsdWF0aW5nIHRoZSBLTVNBTiBGdXp6aW5nIEp1c3RpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gdGFraW5nIGEgbG9vayBhdCB0aGlzIHBhdGNoIHNlcmllcyB0byBzZWUgaWYgaXQgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCdzIHByb2JhYmx5IHdvcnRoIGl0LCBnaXZlbiB0aGUgY2hhbmdlcy5cblxuSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgc3BlY2lmaWNzLCBzbyBsZXQncyBzdGFydCB3aXRoIHRoZSBkaWZmIGl0c2VsZi4gSXQgbG9va3MgbGlrZSB3ZSdyZSBhZGRyZXNzaW5nIGEgY3ljbGUgY2hlY2sgaXNzdWUgaW4gYGtlcm5lbC9icGYvYnRmLmNgLiBTcGVjaWZpY2FsbHksIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgYmVpbmcgdXBkYXRlZC4gVGhlIG9yaWdpbmFsIHNpbXBsZSBgQlBGX0dSQVBIX1JPT1RgIGN5Y2xlIGNoZWNrIGlzIGdvbmUsIHJlcGxhY2VkIHdpdGggYSBtb3JlIGNvbXByZWhlbnNpdmUgb3duZXJzaGlwIGRlcHRoIGFuZCBjeWNsZSBjaGVjayB0aGF0IGNvbnNpZGVycyBhbGwgb3duZXJzaGlwIHR5cGVzOiBgQlBGX0dSQVBIX1JPT1RgLCBgQlBGX0tQVFJfUkVGYCwgYW5kIGBCUEZfS1BUUl9QRVJDUFVgLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQsIHJlcGxhY2luZyBhIHBvdGVudGlhbGx5IGluY29tcGxldGUgY2hlY2sgd2l0aCBzb21ldGhpbmcgbW9yZSByb2J1c3QuXG5cbkkgc2VlIG5ldyBoZWxwZXIgZnVuY3Rpb25zIGJlaW5nIGFkZGVkOiBgYnRmX293bmVkX3R5cGVfaWR4KClgLCB3aGljaCBhcHBlYXJzIHRvIGRldGVybWluZSB0aGUgaW5kZXggb2YgYSBwb2ludGVlIHN0cnVjdCBiYXNlZCBvbiB0aGUgb3duZXJzaGlwIHR5cGUsIGFuZCBgYnRmX293bmVyc2hpcF9kZXB0aCgpYCwgd2hpY2ggcGVyZm9ybXMgYSBkZXB0aC1maXJzdCBzZWFyY2ggKERGUykgd2l0aCBtZW1vaXphdGlvbiB0byBjYWxjdWxhdGUgb3duZXJzaGlwIGRlcHRoLiBJdCBsb29rcyBsaWtlIGl0IHVzZXMgYSBgZGVwdGhgIGFycmF5IGFsbG9jYXRlZCBieSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCB0byB0cmFjayB0aGUgZGVwdGguIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgIGl0c2VsZiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBzdHJ1Y3QgbWV0YXMsIGNhbGxzIGBidGZfb3duZXJzaGlwX2RlcHRoKClgLCBhbmQgbWFuYWdlcyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGRlcHRoIHRyYWNraW5nIGFycmF5LlxuXG5UaGUga2V5IGludGVncmF0aW9uIHBvaW50IHNlZW1zIHRvIGJlIGluIGBidGZfcGFyc2UoKWAsIHdoZXJlIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgIGlzIG5vdyBjYWxsZWQuIFRoaXMgc3VnZ2VzdHMgdGhlIG93bmVyc2hpcCBkZXB0aCBjaGVjayBpcyBiZWluZyBwZXJmb3JtZWQgZHVyaW5nIEJURiBwYXJzaW5nLCB3aGljaCBpcyBhIGNyaXRpY2FsIHN0ZXAuXG5cbkZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB0aGlzIGlzIGludGVyZXN0aW5nLiBJJ2xsIG5lZWQgdG8gZXhhbWluZSB0aGUgY29kZSBzdXJyb3VuZGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYCBtb3JlIGNsb3NlbHkgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhbmQgcG90ZW50aWFsIGFyZWFzIHdoZXJlIEtNU0FOIG1pZ2h0IGJlIHVzZWZ1bC4gVGhlIG5ldyBmdW5jdGlvbnMgYW5kIHRoZSBhZGRlZCBjaGVja3MgY291bGQgcmV2ZWFsIHN1YnRsZSBtZW1vcnkgc2FmZXR5IGlzc3VlcyB0aGF0IGZ1enppbmcgY2FuIHVuY292ZXIuIFRoZSBmYWN0IHRoYXQgdGhlIHBhdGNoIGluY2x1ZGVzIHNlbGZ0ZXN0cyBpcyBhIGdvb2Qgc2lnbiwgYnV0IHRoZSBuYXR1cmUgb2YgdGhlc2UgY2hlY2tzIG1ha2VzIG1lIGJlbGlldmUgdGhhdCBLTVNBTiBtaWdodCBiZSBwYXJ0aWN1bGFybHkgdmFsdWFibGUgaGVyZSwgcG90ZW50aWFsbHkgZmluZGluZyBjb21wbGV4IGN5Y2xlIHByb2JsZW1zIHRoYXQgZXZlbiB3ZWxsLWNyYWZ0ZWQgdGVzdHMgbWlnaHQgbWlzcy4gSXQgaXMgZ29pbmcgdG8gYmUgZ29vZCB0byB0cnkgYW5kIGNyZWF0ZSBmdXp6ZXIgc2VlZHMgdGhhdCB0YXJnZXQgdGhlc2UgbmV3IGZ1bmN0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODU2MCwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1NiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQwLjgwNzAyMDA4NFoiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI5MjIzNjMwMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYnRmLmM9NDE1MD1zdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNDI4Mi1cXG5rZXJuZWwvYnBmL2J0Zi5jOjQyODM6aW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG5rZXJuZWwvYnBmL2J0Zi5jLTQyODQte1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz02MDE0PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02MDkyLVxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZWNudDsgaSsrKSB7XFxua2VybmVsL2JwZi9idGYuYzo2MDkzOlxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVxcdTAwM2V0eXBlc1tpXS5yZWNvcmQpO1xcbmtlcm5lbC9icGYvYnRmLmMtNjA5NC1cXHRcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDg6NDIuMDk5MjY3MDQ3WiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI1MTI3NzMxODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgY29kZSBzbmlwcGV0cywgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0IHRocm91Z2g6XG5cbioqQW5hbHl6aW5nIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgYW5kIGBidGZfcGFyc2VgKipcblxuT2theSwgc28gSSBuZWVkIHRvIGRpdmUgaW50byBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBzZWN0aW9ucyBhcm91bmQgbGluZXMgNDI4MC00MzUwIGFuZCA2MDgwLTYxMTAuIEZyb20gcGFzdCBleHBlcmllbmNlLCBJJ20gZ3Vlc3NpbmcgdGhlc2Ugc2VjdGlvbnMgYXJlIGNyaXRpY2FsIGZvciBoYW5kbGluZyBmaWVsZCB2YWxpZGF0aW9uIGFuZCBwYXJzaW5nIHdpdGhpbiB0aGUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIG1ldGFkYXRhLiBHaXZlbiB0aGUgbGluZSBudW1iZXJzLCBJJ2QgYmV0IHRoZXkncmUgbGlrZWx5IHJlbGF0ZWQgdG8gZXJyb3IgaGFuZGxpbmcsIHR5cGUgc2l6ZSBjb25zaXN0ZW5jeSwgb3IgcGVyaGFwcyBldmVuIHBvaW50ZXIgZGVyZWZlcmVuY2luZyB3aXRoaW4gdGhlIEJURiBkYXRhIHN0cnVjdHVyZS4gVGhpcyBpcyBwcmV0dHkgc3RhbmRhcmQgZm9yIEJURiBwcm9jZXNzaW5nIOKAkyBlbnN1cmluZyBkYXRhIGludGVncml0eSBpcyBwYXJhbW91bnQuIEknbGwgbmVlZCB0byBsb29rIGF0IGhvdyB0aGVzZSBmdW5jdGlvbnMgaGFuZGxlIHBvdGVudGlhbCBpbmNvbnNpc3RlbmNpZXMgb3IgdmlvbGF0aW9ucyBvZiB0aGUgQlRGIHNwZWNpZmljYXRpb24gdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBsb2dpYyBhbmQgcG90ZW50aWFsIGFyZWFzIGZvciBpbXByb3ZlbWVudCBvciBkZWJ1Z2dpbmcuIEknbGwgYWxzbyBiZSB3YXRjaGluZyBmb3IgYW55IG51YW5jZXMgb3IgY2xldmVyIHRyaWNrcyB0aGUgZGV2ZWxvcGVycyBoYXZlIHVzZWQgdG8gb3B0aW1pemUgbWVtb3J5IHVzYWdlIG9yIHBlcmZvcm1hbmNlIHdpdGhpbiB0aGVzZSByb3V0aW5lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTk2MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQ0LjYxMjA0MzgxN1oiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MzM5MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MjgwLFxuICBcIkxpbmVDb3VudFwiOiA3MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI0MjgwOlxcdFxcdHJldHVybiBFUlJfUFRSKHJldCk7XFxuNDI4MTpcXHR9XFxuNDI4MjpcXHRcXG40MjgzOlxcdGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuNDI4NDpcXHR7XFxuNDI4NTpcXHRcXHRpbnQgaTtcXG40Mjg2OlxcdFxcbjQyODc6XFx0XFx0LypcXG40Mjg4OlxcdFxcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxcbjQyODk6XFx0XFx0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xcbjQyOTA6XFx0XFx0ICogYmVlbiBmaXhlZCB1cC5cXG40MjkxOlxcdFxcdCAqL1xcbjQyOTI6XFx0XFx0aWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtXFx1MDAzZWZpZWxkX21hc2sgXFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxcbjQyOTM6XFx0XFx0XFx0cmV0dXJuIDA7XFxuNDI5NDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcmVjLVxcdTAwM2VjbnQ7IGkrKykge1xcbjQyOTU6XFx0XFx0XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcXG40Mjk2OlxcdFxcdFxcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcXG40Mjk3OlxcdFxcdFxcdHUzMiBidGZfaWQ7XFxuNDI5ODpcXHRcXG40Mjk5OlxcdFxcdFxcdGlmIChyZWMtXFx1MDAzZWZpZWxkc1tpXS50eXBlID09IEJQRl9VUFRSKSB7XFxuNDMwMDpcXHRcXHRcXHRcXHQvKiBUaGUgdXB0ciBvbmx5IHN1cHBvcnRzIHBpbm5pbmcgb25lIHBhZ2UgYW5kIGNhbm5vdFxcbjQzMDE6XFx0XFx0XFx0XFx0ICogcG9pbnQgdG8gYSBrZXJuZWwgc3RydWN0XFxuNDMwMjpcXHRcXHRcXHRcXHQgKi9cXG40MzAzOlxcdFxcdFxcdFxcdGlmIChidGZfaXNfa2VybmVsKHJlYy1cXHUwMDNlZmllbGRzW2ldLmtwdHIuYnRmKSlcXG40MzA0OlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjQzMDU6XFx0XFx0XFx0XFx0dCA9IGJ0Zl90eXBlX2J5X2lkKHJlYy1cXHUwMDNlZmllbGRzW2ldLmtwdHIuYnRmLFxcbjQzMDY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgcmVjLVxcdTAwM2VmaWVsZHNbaV0ua3B0ci5idGZfaWQpO1xcbjQzMDc6XFx0XFx0XFx0XFx0aWYgKCF0LVxcdTAwM2VzaXplKVxcbjQzMDg6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuNDMwOTpcXHRcXHRcXHRcXHRpZiAodC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFBBR0VfU0laRSlcXG40MzEwOlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRTJCSUc7XFxuNDMxMTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzEyOlxcdFxcdFxcdH1cXG40MzEzOlxcdFxcbjQzMTQ6XFx0XFx0XFx0aWYgKCEocmVjLVxcdTAwM2VmaWVsZHNbaV0udHlwZSBcXHUwMDI2IEJQRl9HUkFQSF9ST09UKSlcXG40MzE1OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzMTY6XFx0XFx0XFx0YnRmX2lkID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuNDMxNzpcXHRcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbjQzMTg6XFx0XFx0XFx0aWYgKCFtZXRhKVxcbjQzMTk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuNDMyMDpcXHRcXHRcXHRyZWMtXFx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXFx1MDAzZXJlY29yZDtcXG40MzIxOlxcdFxcdH1cXG40MzIyOlxcdFxcdHJldHVybiAwO1xcbjQzMjM6XFx0fVxcbjQzMjQ6XFx0XFxuNDMyNTpcXHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuNDMyNjpcXHRcXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcXG40MzI3OlxcdHtcXG40MzI4OlxcdFxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuNDMyOTpcXHRcXHR1MzIgYnRmX2lkO1xcbjQzMzA6XFx0XFxuNDMzMTpcXHRcXHRpZiAoZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xcbjQzMzI6XFx0XFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbjQzMzM6XFx0XFx0fSBlbHNlIGlmIChmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XFxuNDMzNDpcXHRcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKVxcbjQzMzU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMzNjpcXHRcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNla3B0ci5idGZfaWQ7XFxuNDMzNzpcXHRcXHR9IGVsc2Uge1xcbjQzMzg6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMzOTpcXHRcXHR9XFxuNDM0MDpcXHRcXG40MzQxOlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxuNDM0MjpcXHRcXHRpZiAoIW1ldGEpXFxuNDM0MzpcXHRcXHRcXHRyZXR1cm4gZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xcbjQzNDQ6XFx0XFx0cmV0dXJuIG1ldGEgLSB0YWItXFx1MDAzZXR5cGVzO1xcbjQzNDU6XFx0fVxcbjQzNDY6XFx0XFxuNDM0NzpcXHQvKlxcbjQzNDg6XFx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXFxuNDM0OTpcXHQgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo0NC42MTI1ODAwOTdaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjkzNDAzNTYwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgcmVxdWVzdCwgZm9ybWF0dGVkIGFzIHJlcXVlc3RlZDpcblxuKipEaWdnaW5nIERlZXBlciBpbnRvIHRoZSBEYXRhKipcblxuQWxyaWdodCwgSSBuZWVkIHRvIGZvY3VzIG15IGF0dGVudGlvbi4gSXQgbG9va3MgbGlrZSBJJ20gYmVpbmcgYXNrZWQgdG8gZGVsdmUgZnVydGhlciBpbnRvIHRoaXMgZGF0YSBzZXQuIFNwZWNpZmljYWxseSwgSSBzaG91bGQgdGFrZSBhIGxvb2sgYXQgdGhlIGNvbnRlbnQgZnJvbSBsaW5lcyA0MzUwIHRvIDQ0MDAsIGFuZCB0aGVuIGFnYWluIGZyb20gbGluZXMgNjA4MCB0byA2MTEwLiBUaGlzIHNpZ25hbHMgdGhhdCB0aGVyZSdzIGxpa2VseSBzb21lIGNydWNpYWwgaW5mb3JtYXRpb24gb3IgYSBjcml0aWNhbCBwb2ludCBiZWluZyBtYWRlIHdpdGhpbiB0aG9zZSBzcGVjaWZpYyByYW5nZXMuIEknbGwgbmVlZCB0byBhbmFseXplIHRoZW0gY2FyZWZ1bGx5LCBsb29raW5nIGZvciBwYXR0ZXJucywgaW5jb25zaXN0ZW5jaWVzLCBvciBhbnl0aGluZyB0aGF0IHN0YW5kcyBvdXQgaW4gcmVsYXRpb24gdG8gdGhlIGJyb2FkZXIgc2NvcGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIHRob3NlIHNwZWNpZmljIGxpbmVzIGFyZSBpbXBvcnRhbnQgdG8gdGhlIGNvbnRleHQuIEl0J3MgdGltZSB0byBwdXQgb24gbXkgY3JpdGljYWwgdGhpbmtpbmcgaGF0IGFuZCBzZWUgd2hhdCBpbnNpZ2h0cyBJIGNhbiBnbGVhbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MjMsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQ3LjU0NjYxODM5MloiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjMwODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MzUwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI0MzUwOlxcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XFxuNDM1MTpcXHQgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxcbjQzNTI6XFx0ICogbm9uLXJlY3Vyc2luZyBkcm9wLlxcbjQzNTM6XFx0ICovXFxuNDM1NDpcXHQjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcXG40MzU1OlxcdFxcbjQzNTY6XFx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG40MzU3OlxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXFxuNDM1ODpcXHRcXHRcXHRcXHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXFxuNDM1OTpcXHR7XFxuNDM2MDpcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVxcdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcXG40MzYxOlxcdFxcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XFxuNDM2MjpcXHRcXG40MzYzOlxcdFxcdGlmICghZGVwdGhfbGVmdClcXG40MzY0OlxcdFxcdFxcdHJldHVybiAtRUxPT1A7XFxuNDM2NTpcXHRcXHRpZiAoZGVwdGhbaWR4XSlcXG40MzY2OlxcdFxcdFxcdGdvdG8gZG9uZTtcXG40MzY3OlxcdFxcbjQzNjg6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG40MzY5OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXFx1MDAyNnJlYy1cXHUwMDNlZmllbGRzW2ldKTtcXG40MzcwOlxcdFxcdFxcdGlmIChyZXQgPT0gLUVOT0VOVClcXG40MzcxOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzNzI6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNDM3MzpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbjQzNzQ6XFx0XFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xcbjQzNzU6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNDM3NjpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbjQzNzc6XFx0XFx0XFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcXG40Mzc4OlxcdFxcdH1cXG40Mzc5OlxcdFxcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggKyAxO1xcbjQzODA6XFx0ZG9uZTpcXG40MzgxOlxcdFxcdHJldHVybiBkZXB0aFtpZHhdIFxcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XFxuNDM4MjpcXHR9XFxuNDM4MzpcXHRcXG40Mzg0OlxcdHN0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuNDM4NTpcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXFxuNDM4NjpcXHR7XFxuNDM4NzpcXHRcXHR1OCAqZGVwdGg7XFxuNDM4ODpcXHRcXHRpbnQgaSwgcmV0ID0gMDtcXG40Mzg5OlxcdFxcbjQzOTA6XFx0XFx0ZGVwdGggPSBrdmNhbGxvYyh0YWItXFx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xcbjQzOTE6XFx0XFx0aWYgKCFkZXB0aClcXG40MzkyOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjQzOTM6XFx0XFxuNDM5NDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbjQzOTU6XFx0XFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksXFxuNDM5NjpcXHRcXHRcXHRcXHRcXHRcXHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcXG40Mzk3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzOTg6XFx0XFx0XFx0XFx0YnJlYWs7XFxuNDM5OTpcXHRcXHRcXHRyZXQgPSAwO1xcbjQ0MDA6XFx0XFx0fVxcbjQ0MDE6XFx0XFx0a3ZmcmVlKGRlcHRoKTtcXG40NDAyOlxcdFxcdHJldHVybiByZXQ7XFxuNDQwMzpcXHR9XFxuNDQwNDpcXHRcXG40NDA1OlxcdHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbjQ0MDY6XFx0XFx0XFx0XFx0ICAgICAgdTMyIHR5cGVfaWQsIHZvaWQgKmRhdGEsIHU4IGJpdHNfb2Zmc2V0LFxcbjQ0MDc6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGJ0Zl9zaG93ICpzaG93KVxcbjQ0MDg6XFx0e1xcbjQ0MDk6XFx0XFx0Y29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDg6NDcuNTQ3MTQ0MzYyWiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI0MjUyNTE0MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgcGVyc3BlY3RpdmUgb24gdGhhdCBzZWdtZW50OlxuXG4qKkFuYWx5emluZyBgYnRmX3BhcnNlYCAoTGluZXMgNjA4NS02MTE1KSoqXG5cblJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIGBidGZfcGFyc2VgIGJldHdlZW4gdGhvc2UgbGluZSBudW1iZXJzLCA2MDg1IGFuZCA2MTE1LiBUaGF0IGFyZWEgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBjb250ZXh0IG9mIHdoYXQncyBoYXBwZW5pbmcganVzdCBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgc2VjdGlvbi4gSSdtIGFzc3VtaW5nIHdlJ3JlIGRlYWxpbmcgd2l0aCBwYXJzaW5nIEJURiBkYXRhLiBTbywgd2hhdCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYXJlIGJlaW5nIGhhbmRsZWQgYXJvdW5kIHRob3NlIGxpbmVzPyBBcmUgd2UgbG9va2luZyBhdCB0aGUgY29yZSBwYXJzaW5nIGxvZ2ljLCBlcnJvciBoYW5kbGluZywgb3IgcGVyaGFwcyB0eXBlIGRlZmluaXRpb24gcmVzb2x1dGlvbj8gVGhlIGZ1bmN0aW9uJ3Mgc3RydWN0dXJlIGl0c2VsZiB3aWxsIHRlbGwgYSBsb3QuIEknbGwgbmVlZCB0byBjb25maXJtIHdoYXQgdGhlIGlucHV0IHBhcmFtZXRlcnMgYXJlIGFuZCBob3cgdGhleSdyZSBiZWluZyB1c2VkIHdpdGhpbiB0aGlzIHNuaXBwZXQuIEFueSBwb3RlbnRpYWwgZm9yIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgaW5jb3JyZWN0IHR5cGUgY2FzdGluZyBsZWFwcyBvdXQgaW1tZWRpYXRlbHkuIEFyZSB0aGVyZSBhbnkgaW5kaXJlY3QganVtcHMgb3IgcG9pbnRlciBtYW5pcHVsYXRpb24gb2NjdXJyaW5nIGhlcmU/IFRob3NlIGFyZSBhbHdheXMgd29ydGggYSBjbG9zZXIgaW5zcGVjdGlvbi4gSSdsbCBuZWVkIHRvIHBpbnBvaW50IGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIHRvIGVuc3VyZSB0aGlzIGNyaXRpY2FsIGZ1bmN0aW9uIGlzIHJvYnVzdCBhbmQgc2FmZSBmcm9tIG1pc3VzZS4gVGhlbiwgSSBuZWVkIHRvIGNvbnNpZGVyIGFueSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMg4oCTIGNvdWxkIHRoaXMgYmUgYSBib3R0bGVuZWNrIGluIHRoZSBvdmVyYWxsIHByb2Nlc3M/IEFueSBvcHRpbWl6YXRpb25zIEkgY2FuIG1ha2U/IFJpZ2h0LCB0aW1lIHRvIGRpdmUgaW4gYW5kIGdldCBteSBoYW5kcyBkaXJ0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI1OTgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE2OjQ4OjQ5Ljk3MjM5ODY3N1oiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjE5ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MDg1LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI2MDg1OlxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjYwODY6XFx0XFx0fVxcbjYwODc6XFx0XFx0YnRmLVxcdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XFxuNjA4ODpcXHRcXG42MDg5OlxcdFxcdGlmIChzdHJ1Y3RfbWV0YV90YWIpIHtcXG42MDkwOlxcdFxcdFxcdGludCBpO1xcbjYwOTE6XFx0XFxuNjA5MjpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbjYwOTM6XFx0XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxuNjA5NDpcXHRcXHRcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG42MDk1OlxcdFxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuNjA5NjpcXHRcXHRcXHR9XFxuNjA5NzpcXHRcXG42MDk4OlxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xcbjYwOTk6XFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuNjEwMDpcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbjYxMDE6XFx0XFx0fVxcbjYxMDI6XFx0XFxuNjEwMzpcXHRcXHRlcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjEwNDpcXHRcXHRpZiAoZXJyKVxcbjYxMDU6XFx0XFx0XFx0Z290byBlcnJvdXRfZnJlZTtcXG42MTA2OlxcdFxcbjYxMDc6XFx0XFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XFxuNjEwODpcXHRcXHRyZWZjb3VudF9zZXQoXFx1MDAyNmJ0Zi1cXHUwMDNlcmVmY250LCAxKTtcXG42MTA5OlxcdFxcdHJldHVybiBidGY7XFxuNjExMDpcXHRcXG42MTExOlxcdGVycm91dF9tZXRhOlxcbjYxMTI6XFx0XFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XFxuNjExMzpcXHRlcnJvdXQ6XFxuNjExNDpcXHRcXHQvKiBvdmVyd3JpdGUgZXJyIHdpdGggLUVOT1NQQyBvciAtRUZBVUxUICovXFxuNjExNTpcXHRcXHRyZXQgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjExNjpcXHRcXHRpZiAocmV0KVxcbjYxMTc6XFx0XFx0XFx0ZXJyID0gcmV0O1xcbjYxMTg6XFx0ZXJyb3V0X2ZyZWU6XFxuNjExOTpcXHRcXHRidGZfdmVyaWZpZXJfZW52X2ZyZWUoZW52KTtcXG42MTIwOlxcdFxcdGlmIChidGYpXFxuNjEyMTpcXHRcXHRcXHRidGZfZnJlZShidGYpO1xcbjYxMjI6XFx0XFx0cmV0dXJuIEVSUl9QVFIoZXJyKTtcXG42MTIzOlxcdH1cXG42MTI0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo0OS45NzI5MjQyMDZaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Njc5MDY2Mjg1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEJURiBTdHJ1Y3QgT3duZXJzaGlwIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoIGFuZCBpdHMgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gSXQgbG9va3MgbGlrZSB3ZSdyZSBjaGFuZ2luZyBob3cgd2UgdmFsaWRhdGUgdGhlIG93bmVyc2hpcCBsb2dpYyB3aXRoaW4gdGhlIEJURiBzdHJ1Y3R1cmUuIFByZXZpb3VzbHksIHRoZSBzeXN0ZW0gd2FzIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGEgbm9kZSB3YXMgYWxzbyBhIHJvb3QgaW4gdGhlIGdyYXBoIHN0cnVjdHVyZSwgd2Ugd2VyZW4ndCBpbnRyb2R1Y2luZyBjeWNsZXMsIGVzcGVjaWFsbHkgd2l0aGluIGBicGZfbGlzdF9oZWFkYCBhbmQgYGJwZl9yYl9yb290YC4gVGhlIG9sZCBtZXRob2Qgd2FzIHRvIGNoZWNrIGBtZXRhLVx1MDAzZXJlY29yZC1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfUk9PVGAuIFRoZSBuZXcgYXBwcm9hY2ggYnJpbmdzIGluIGEgcmVjdXJzaW9uIGRlcHRoIGNoZWNrIGZvciBvd25lcnNoaXAuXG5cbkVzc2VudGlhbGx5LCB0aGV5J3JlIGludHJvZHVjaW5nIGEgbGltaXQsIGBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSGAgKHNldCB0byA4LCB3aGljaCBzZWVtcyByZWFzb25hYmxlKSwgdG8gcHJldmVudCBpc3N1ZXMgbGlrZSBrZXJuZWwgc3RhY2sgb3ZlcmZsb3cgb3IgZXhjZXNzaXZlbHkgbG9uZyByZWN1cnNpb24gZHVyaW5nIHRoZSBgYnBmX29ial9mcmVlX2ZpZWxkcygpYCBvciBgX19icGZfb2JqX2Ryb3BfaW1wbCgpYCBwcm9jZXNzZXMuIFRoZSBwYXRjaCBub3cgYWxzbyBjaGVja3MgZm9yIG93bmVyc2hpcCBjeWNsZXMgaW52b2x2aW5nIGBCUEZfR1JBUEhfUk9PVGAsIGBCUEZfS1BUUl9SRUZgLCBhbmQgYEJQRl9LUFRSX1BFUkNQVWAuIFRoaXMgc2VlbXMgbGlrZSBhIGdvb2QgcHJvYWN0aXZlIG1lYXN1cmUuXG5cbk5vdywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCwgdmFyaWFibGVzLCBwb2ludGVycywgYW5kIHVzZXItc3BhY2UgY29waWVzIGludm9sdmVkLlxuXG5GaXJzdCwgd2UgaGF2ZSB0aGlzIGFsbG9jYXRpb246IGBkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtgLiBga3ZjYWxsb2NgIGlzIGFsbG9jYXRpbmcgemVyb2VkIG1lbW9yeS4gV2UncmUgYWxsb2NhdGluZyBgdGFiLVx1MDAzZWNudGAgZWxlbWVudHMsIGVhY2ggYHNpemVvZih1OClgIGluIHNpemUuIFllcywgYGt2Y2FsbG9jYCBndWFyYW50ZWVzIHRoYXQgYGRlcHRoYCBpcyBmdWxseSB6ZXJvLWluaXRpYWxpemVkLiBJbXBvcnRhbnRseSwgaXQncyBmcmVlZCBsYXRlciB3aXRoIGBrdmZyZWUoZGVwdGgpYC4gQWx3YXlzIGdvb2QgdG8gc2VlIHRoYXQgcGFpcmVkIHVwLlxuXG5XZSBoYXZlIHRvIGNvbnNpZGVyIGFycmF5IGJvdW5kcyBmb3IgdGhpcyBhbGxvY2F0aW9uLCBlc3BlY2lhbGx5IGFzIGBkZXB0aGAgaXMgaW5kZXhlZCBhcyBgZGVwdGhbaWR4XWAuXG5gaWR4YCBvcmlnaW5hdGVzIGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCB3aGVyZSB3ZSBoYXZlIHRoZSBsb29wOiBgZm9yIChpID0gMDsgaSBcdTAwM2MgdGFiLVx1MDAzZWNudDsgaSsrKSB7IC4uLiBidGZfb3duZXJzaGlwX2RlcHRoKC4uLiwgaSwgLi4uKTsgfWAuXG5JbnNpZGUgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgOiBgcmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcdTAwMjZyZWMtXHUwMDNlZmllbGRzW2ldKTtgIHRoZW4gd2UgY2FsbDogYHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtgLiBBbmQgdGhlbiB3aXRoaW4gYGJ0Zl9vd25lZF90eXBlX2lkeGAgd2UgaGF2ZSB0aGlzOlxuYGBgY1xuXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuXHRpZiAoIW1ldGEpXG5cdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG5cdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuYGBgXG5JdCBsb29rcyBsaWtlIGBtZXRhYCBjb21lcyBmcm9tIGBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZClgLiBXZSdsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayBob3cgdGhpcyB3b3Jrcy5cbmBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIEknbGwgaGF2ZSB0byBpbnZlc3RpZ2F0ZSB0aGF0IGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBvZmZzZXRzIGFuZCBpbmRleGluZyBhcmUgc2FmZSBhbmQgZG9uJ3QgaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM1MTAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NDQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo1Ni43NjM1ODk0MTZaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ5Njg0OTQyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0Zl9maW5kX3N0cnVjdF9tZXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvYnRmLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9idGYuYz00MjgzPWludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQzMTYtXFx0XFx0YnRmX2lkID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxua2VybmVsL2JwZi9idGYuYzo0MzE3OlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxua2VybmVsL2JwZi9idGYuYy00MzE4LVxcdFxcdGlmICghbWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NDMyNT1zdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNDAtXFxua2VybmVsL2JwZi9idGYuYzo0MzQxOlxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxua2VybmVsL2JwZi9idGYuYy00MzQyLVxcdGlmICghbWV0YSlcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTg0ND1idGZfcGFyc2Vfc3RydWN0X21ldGFzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIHN0cnVjdCBidGYgKmJ0ZilcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNTk2NC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjU5NjU6c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxcbmtlcm5lbC9icGYvYnRmLmMtNTk2Ni17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTc0NDg9aW50IGJ0Zl9zdHJ1Y3RfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjQtXFxua2VybmVsL2JwZi9idGYuYzo3NDY1OlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGlkKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTc0NjYtXFx0XFx0aWYgKCFtZXRhKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNjo0ODo1Ni44MTMyODU1NzhaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NDk1NzYyNzQ5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgdGhvdWdoIEkgd2VyZSBjb25zaWRlcmluZyB0aGUgYGJ0Zl9maW5kX3N0cnVjdF9tZXRhYCBpbXBsZW1lbnRhdGlvbiwga2VlcGluZyBpbiBtaW5kIEknbSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZC5cblxuKipEZWVwIERpdmUgaW50byBgYnRmX2ZpbmRfc3RydWN0X21ldGFgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiBgYnRmX2ZpbmRfc3RydWN0X21ldGFgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGlzIGZ1bmN0aW9uIHdvcmtzLiBJdCdzIGNydWNpYWwgZm9yIGVmZmljaWVudGx5IG5hdmlnYXRpbmcgYW5kIGludGVycHJldGluZyBCVEYgaW5mb3JtYXRpb24sIGFuZCBJIHdhbnQgdG8gYmUgY2VydGFpbiBhYm91dCB0aGUgZWRnZSBjYXNlcyBhbmQgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBJJ20gYXNzdW1pbmcsIG9mIGNvdXJzZSwgdGhhdCB3ZSdyZSB0YWxraW5nIGFib3V0IGEgd2VsbC1mb3JtZWQgQlRGIGRhdGEgc3RydWN0dXJlIOKAkyBidXQgaXQncyBhbHdheXMgZ29vZCB0byBjb25zaWRlciBlcnJvciBoYW5kbGluZyBpbXBsaWNpdGx5LlxuXG5NeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIHZhcmlvdXMgYXNwZWN0cy4gV2hhdCBhcmUgdGhlIGtleSBzZWFyY2ggcGFyYW1ldGVycz8gSXMgaXQgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCwgdGhlIHNpemUsIHRoZSBtZW1iZXIgbGF5b3V0LCBvciBzb21lIGNvbWJpbmF0aW9uIHRoZXJlb2Y/IEkgbmVlZCB0byBsb29rIGZvciBhbnkgb3B0aW1pemF0aW9ucyBlbXBsb3llZCBoZXJlLiBBcmUgdGhlcmUgYW55IGNhY2hpbmcgbWVjaGFuaXNtcyB0byBzcGVlZCB1cCByZXBlYXRlZCBsb29rdXBzPyBJcyBpdCB1c2luZyBhIGhhc2ggdGFibGUsIGxpbmVhciBzZWFyY2gsIG9yIHNvbWUgb3RoZXIgbWV0aG9kIGZvciBmaW5kaW5nIHRoZSBjb3JyZWN0IHN0cnVjdCBkZWZpbml0aW9uPyBJIHdhbnQgdG8gc2VlIGlmIHRoZSBjaG9zZW4gYWxnb3JpdGhtIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgZXhwZWN0ZWQgc2l6ZSBhbmQgY29tcGxleGl0eSBvZiB0aGUgQlRGIGRhdGEuXG5cbkknbGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucy4gRG9lcyBpdCB0cmF2ZXJzZSB0aGUgQlRGIHNlY3Rpb24gbGluZWFybHksIG9yIGRvZXMgaXQganVtcCBhcm91bmQ/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIGNhY2hlIG1pc3NlcyB0aGF0IGNvdWxkIGltcGFjdCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSB3aXRoIGxhcmdlIEJURiBibG9icz8gQW5kIGhvdyBkb2VzIGl0IGhhbmRsZSBuZXN0ZWQgc3RydWN0cyBhbmQgYW5vbnltb3VzIHVuaW9ucz8gVGhhdCdzIGFsd2F5cyBhIHRyaWNreSBhcmVhLCBhbmQgSSBleHBlY3QgdGhlcmUgaXMgYSB3ZWxsIHRob3VnaHQtb3V0IHRyYXZlcnNhbCBzdHJhdGVneSB0aGVyZS5cblxuSSdsbCBhbHNvIGtlZXAgaW4gbWluZCB0aGUgcG90ZW50aWFsIGZvciBjb3JuZXIgY2FzZXMuIFdoYXQgaGFwcGVucyBpZiB0aGUgc3RydWN0IGlzbid0IGZvdW5kPyBEb2VzIGl0IHJldHVybiBhbiBlcnJvciBjb2RlLCBgTlVMTGAsIG9yIHNvbWV0aGluZyBlbHNlPyBEb2VzIGl0IGhhdmUgYW55IGltcGxpY2F0aW9ucyBmb3Igd2hhdCBoYXBwZW5zIGluIHRoZSBjYWxsZXI/IEknbSBjdXJpb3VzIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBCVEYgdHlwZSBJRHMsIGFuZCBob3cgaXQgaGFuZGxlcyBkdXBsaWNhdGUgc3RydWN0IGRlZmluaXRpb25zLCBpZiBhdCBhbGwuXG5cbkZpbmFsbHksIEknbGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IGZ1dHVyZSBzY2FsYWJpbGl0eS4gSXMgdGhlIGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIHRvIGhhbmRsZSB2ZXJ5IGxhcmdlIEJURiBkYXRhYmFzZXM/IERvZXMgaXQgYWxsb3cgZm9yIGluY3JlbWVudGFsIHVwZGF0ZXMgb3IgcGFydGlhbCBCVEYgbG9hZGluZz8gVGhlc2UgYXJlIGNydWNpYWwgYXNwZWN0cyB0byBjb25zaWRlciBmb3IgbG9uZy10ZXJtIG1haW50YWluYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UuIFRoZSBtb3JlIEkgdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uLCB0aGUgbW9yZSBjb25maWRlbmNlIEknbGwgaGF2ZSBpbiB0aGUgc3RhYmlsaXR5IG9mIHRoZSBvdmVyYWxsIGZyYW1ld29yay4gTGV0J3Mgc2VlIGhvdyBpdCdzIGRvbmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MjczLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDk6MDEuNzcwOTE1MzkyWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMyOTE2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL2J0Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU5NjAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjU5NjA6XFx0ZnJlZV9hb2Y6XFxuNTk2MTpcXHRcXHRrZnJlZShhb2YpO1xcbjU5NjI6XFx0XFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcXG41OTYzOlxcdH1cXG41OTY0OlxcdFxcbjU5NjU6XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqYnRmX2ZpbmRfc3RydWN0X21ldGEoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxcbjU5NjY6XFx0e1xcbjU5Njc6XFx0XFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYjtcXG41OTY4OlxcdFxcbjU5Njk6XFx0XFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBidGZfc3RydWN0X21ldGEsIGJ0Zl9pZCkgIT0gMCk7XFxuNTk3MDpcXHRcXHR0YWIgPSBidGYtXFx1MDAzZXN0cnVjdF9tZXRhX3RhYjtcXG41OTcxOlxcdFxcdGlmICghdGFiKVxcbjU5NzI6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuNTk3MzpcXHRcXHRyZXR1cm4gYnNlYXJjaChcXHUwMDI2YnRmX2lkLCB0YWItXFx1MDAzZXR5cGVzLCB0YWItXFx1MDAzZWNudCwgc2l6ZW9mKHRhYi1cXHUwMDNldHlwZXNbMF0pLCBidGZfaWRfY21wX2Z1bmMpO1xcbjU5NzQ6XFx0fVxcbjU5NzU6XFx0XFxuNTk3NjpcXHRzdGF0aWMgaW50IGJ0Zl9jaGVja19tb2RpZmllcl9jaGFpbl9sZW5ndGgoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudixcXG41OTc3OlxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBidGYgKmJ0ZiwgaW50IHN0YXJ0X2lkKVxcbjU5Nzg6XFx0e1xcbjU5Nzk6XFx0XFx0aW50IGksIG4sIGdvb2RfaWQgPSBzdGFydF9pZCAtIDE7XFxuNTk4MDpcXHRcXG41OTgxOlxcdFxcdG4gPSBidGZfbnJfdHlwZXMoYnRmKTtcXG41OTgyOlxcdFxcdGZvciAoaSA9IHN0YXJ0X2lkOyBpIFxcdTAwM2MgbjsgaSsrKSB7XFxuNTk4MzpcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQ7XFxuNTk4NDpcXHRcXHRcXHRpbnQgY2hhaW5fbGltaXQgPSAzMjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTY6NDk6MDEuNzcxMjQ3MDcyWiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY5MzkxNzkzMTYxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBCVEYgT3duZXJzaGlwIERlcHRoIENoZWNrIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGhlcmUgaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgZXhwb3NlcyBhbnkgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBiZSByZWFkLCB3aGljaCBjb3VsZCBsZWFkIHRvIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gSSdtIGdvaW5nIHRvIGZvbGxvdyB0aGUgZXN0YWJsaXNoZWQgY3JpdGVyaWEgZm9yIEtNU0FOIGFuYWx5c2lzLlxuXG5GaXJzdCwgSSBleGFtaW5lIGBidGZfZmluZF9zdHJ1Y3RfbWV0YWAuIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGJpbmFyeSBzZWFyY2ggd2l0aGluIHRoZSBgYnRmLVx1MDAzZXN0cnVjdF9tZXRhX3RhYi1cdTAwM2V0eXBlc2AgYXJyYXkuIElmIHRoZSBzZWFyY2ggaXMgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZvdW5kIG1ldGFkYXRhLCBgbWV0YWAuIFRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCBpcyB0aGVuIGNhbGN1bGF0ZWQgYXMgYG1ldGEgLSB0YWItXHUwMDNldHlwZXNgLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSwgc3BlY2lmaWNhbGx5IGAwYCB0byBgdGFiLVx1MDAzZWNudCAtIDFgLiBJZiB0aGUgc2VhcmNoIGZhaWxzLCBpdCByZXR1cm5zIGBOVUxMYC5cblxuTm93LCBsb29raW5nIGF0IGBidGZfb3duZWRfdHlwZV9pZHhgLiBJdCBjYWxscyBgYnRmX2ZpbmRfc3RydWN0X21ldGFgLCBhbmQgaWYgYSB2YWxpZCBgbWV0YWAgaXMgZm91bmQsIHRoZSBpbmRleCBjYWxjdWxhdGlvbiBgbWV0YSAtIHRhYi1cdTAwM2V0eXBlc2AgZ2l2ZXMgdXMgdGhlIGluZGV4LCBhbmQgYSBjaGVjayBpcyBwZXJmb3JtZWQgdG8gdmVyaWZ5IHRoZSByb290LiBJZiBgYnRmX2ZpbmRfc3RydWN0X21ldGFgIHJldHVybnMgYE5VTExgLCB0aGVuIHdlIGNoZWNrIHRoZSByb290IGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZSwgd2hpY2ggZG9lcyBub3QgaW50cm9kdWNlIGEgcmlzay4gVGhlcmVmb3JlLCBpdCBpcyBpbXBvcnRhbnQgdG8gcG9pbnQgb3V0IHRoYXQgYHRhYmAgaXMgYW4gYXJndW1lbnQsIHdoaWNoIGluIG91ciBjb250ZXh0IGlzIGBzdHJ1Y3RfbWV0YV90YWJgLiBUaGVyZWZvcmUsIHRoZSByZXR1cm5lZCBpbmRleCBpcyB3aXRoaW4gYm91bmRzIChpLmUuLCBgMGAgdG8gYHRhYi1cdTAwM2VjbnQgLSAxYCkuXG5cbk15IGFuYWx5c2lzIGlzIGd1aWRlZCBieSB0aGVzZSBwb3RlbnRpYWwgcmlza3M6XG5cbjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZToqKiBBcmUgYW55IGtlcm5lbCBzdHJ1Y3R1cmVzIGJlaW5nIHBhc3NlZCBiYWNrIHRvIHVzZXIgc3BhY2U/IE5vLCBub3QgaW4gdGhpcyBwYXRjaC4gVGhlIGZ1bmN0aW9ucyBgYnRmX293bmVyc2hpcF9kZXB0aGAgYW5kIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCBhcmUgaW50ZXJuYWwgdmVyaWZpY2F0aW9uIGZ1bmN0aW9ucyBhbmQgb25seSByZXR1cm4gYW4gZXJyb3IgY29kZSBvciBCVEYgZmQuIFRoaXMgZWxpbWluYXRlcyB0aGUgcG9zc2liaWxpdHkgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkLlxuXG4yLiAgKipDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzOioqIEkgY2FyZWZ1bGx5IGV4YW1pbmVkIHRoZSBsb2NhbCB2YXJpYWJsZXMuIEluIGBidGZfb3duZXJzaGlwX2RlcHRoYCwgYWxsIHZhcmlhYmxlcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIGluY2x1ZGluZyBgbWF4X2RlcHRoYCwgYGlgLCBhbmQgYHJldGAuIENyaXRpY2FsbHksIHRoZSBgZGVwdGhgIGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIGBrdmNhbGxvY2AsIHdoaWNoIGVuc3VyZXMgYWxsIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvLiBJbiBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIHRoZSBgcmV0YCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCB0byBgMGAuIGBidGZfaWRgIGlzIGFzc2lnbmVkIGluIGJvdGggYnJhbmNoZXMgb2YgdGhlIGBidGZfb3duZWRfdHlwZV9pZHhgIGZ1bmN0aW9uIHdoZXJlIGNvbnRyb2wgZG9lcyBub3QgcmV0dXJuLlxuXG4zLiAgKipBbGxvY2F0aW9uL0luaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzOioqIFRoZSBgZGVwdGhgIGFycmF5LCB3aGljaCBpcyBjcml0aWNhbCB0byB0aGlzIGNoZWNrLCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jYC4gVGhpcyBndWFyYW50ZWVzIHRoYXQgYWxsIGl0cyBlbGVtZW50cyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4gSSBkaWQgdmVyaWZ5IHRoYXQgYGRlcHRoYCBpcyBwcm9wZXJseSBmcmVlZCB2aWEgYGt2ZnJlZWAgd2l0aGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYC5cblxuNC4gICoqQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgYWxsb3dpbmcgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgYnVmZmVyIGJ5dGVzOioqIFRoZSBmb2N1cyBvZiB0aGlzIHBhdGNoIGlzIGltcHJvdmluZyBCVEYgb3duZXJzaGlwIHZhbGlkYXRpb24sIHNwZWNpZmljYWxseSBwcmV2ZW50aW5nIGN5Y2xpY2FsIG9yIGV4Y2Vzc2l2ZWx5IGRlZXAgb3duZXJzaGlwIHN0cnVjdHVyZXMuIFRoZSBjb2RlIGRvZXMgbm90IG1vZGlmeSBhbnkgYnVmZmVyIHJlYWRzIG9yIGNvcGllcy4gVGhlIGluZGV4IGBpZHhgIHBhc3NlZCB0byBgZGVwdGhbaWR4XWAgaXMgY2FsY3VsYXRlZCB2aWEgYG1ldGEgLSB0YWItXHUwMDNldHlwZXNgIGZyb20gYSBzdWNjZXNzZnVsIGJpbmFyeSBzZWFyY2guIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBlbGVtZW50IGlzIHZhbGlkIGFuZCBpbml0aWFsaXplZCwgYW5kIHRoZXJlZm9yZSBpdCBpcyBhbHdheXMgd2l0aGluIHRoZSB2YWxpZCBib3VuZHMuXG5cbkkgcmUtY2hlY2tlZCB0aGUgZXN0YWJsaXNoZWQgS01TQU4gcnVsZXM6IFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgcmVjdXJzaW9uIGRlcHRoIGNoZWNrIGZvciBCVEYgc3RydWN0IG93bmVyc2hpcCwgdXRpbGl6ZXMgemVyb2VkIG1lbW9yeSBmcm9tIGBrdmNhbGxvY2AsIGFuZCB3b3JrcyBzb2xlbHkgb24gaW5pdGlhbGl6ZWQgdmVyaWZpZXIgbWV0YWRhdGEuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbGwgcG90ZW50aWFsIHJpc2tzIChlLmcuLCBvdXQtb2YtYm91bmRzIGFycmF5IGFjY2VzcyBpbiBgZGVwdGhbaWR4XWAsIGluZmluaXRlIHJlY3Vyc2lvbiwgb3IgbWVtb3J5IGxlYWtzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLiBUaGlzIHBhdGNoIGNsZWFybHkgYWxpZ25zIHdpdGggdGhlIGNyaXRlcmlhIGZvciBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYC4gVGhlcmVmb3JlLCBJIGFtIHJlYWR5IHRvIGZvcm11bGF0ZSB0aGUgZmluYWwgcmVzdWx0IGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MjYwLCJPdXRwdXRUb2tlbnMiOjI4NCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3NjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNzowMDozNS42ODkxODIzMDRaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTE5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cXG5cXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXFxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxcbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxcblxcblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgdGhlIEJURiB2ZXJpZmllciB0byB2YWxpZGF0ZSBvd25lcnNoaXAgZGVwdGggYW5kIGRldGVjdCBjeWNsZXMgYWNyb3NzIGdyYXBoIHJvb3RzIChicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdCkgYW5kIGxvY2FsIGtwdHJzIChCUEZfS1BUUl9SRUYsIEJQRl9LUFRSX1BFUkNQVSksIHByZXZlbnRpbmcgZGVlcCBrZXJuZWwgcmVjdXJzaW9uIGR1cmluZyBvYmplY3QgY2xlYW51cC5cXG5cXG4xLiBNZW1vcnkgYWxsb2NhdGlvbjogVGhlIG9ubHkgZHluYW1pYyBhbGxvY2F0aW9uIGludHJvZHVjZWQgaXMgdGhlIHRlbXBvcmFyeSBgZGVwdGhgIGFycmF5IGluIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKClgLCB3aGljaCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt2Y2FsbG9jKClgIChmdWxseSB6ZXJvLWluaXRpYWxpemVkKSBhbmQgZnJlZWQgd2l0aCBga3ZmcmVlKClgIGJlZm9yZSByZXR1cm5pbmcuXFxuMi4gTG9jYWwgdmFyaWFibGVzIGFuZCBmaWVsZHM6IEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBmaWVsZHMgaW5zcGVjdGVkIG9yIHBvcHVsYXRlZCAoYHJldGAsIGBtYXhfZGVwdGhgLCBgYnRmX2lkYCwgYGRlcHRoW2lkeF1gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIFVzZXItc3BhY2UgY29waWVzOiBObyBkYXRhIG9yIHN0cnVjdHVyZSBpcyBleHBvc2VkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlOyB0aGUgdmFsaWRhdGlvbiByZXR1cm5zIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxcbjQuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKHN1Y2ggYXMgaW5kZXhpbmcgaXNzdWVzLCBwb2ludGVyIGFyaXRobWV0aWMsIG9yIHJlY3Vyc2lvbiBsaW1pdHMpIHdvdWxkIGJlIGNvdmVyZWQgYnkgS0FTQU4gb3Igc3RhbmRhcmQga2VybmVsIGNoZWNrcywgbm90IEtNU0FOLlxcblxcblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[1] Phase: Succeeded StartedAt: 2026-09-14 17:00:46 +0000 UTC FinishedAt: 2026-09-14 17:00:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-14 17:00:46 +0000 UTC FinishedAt: 2026-09-14 17:00:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2] Phase: Succeeded StartedAt: 2026-09-14 17:00:46 +0000 UTC FinishedAt: 2026-09-14 20:50:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-14 17:00:46 +0000 UTC FinishedAt: 2026-09-14 20:50:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-14 17:00:46 +0000 UTC FinishedAt: 2026-09-14 17:01:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-14 17:00:46 +0000 UTC FinishedAt: 2026-09-14 17:00:56 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.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-workflowzhzk8/series-workflowzhzk8-convert-artifact-2419834668/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-14 17:01:01 +0000 UTC FinishedAt: 2026-09-14 17:17:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-14 17:01:01 +0000 UTC FinishedAt: 2026-09-14 17:17:45 +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:*a64bf1e7-0d38-438e-8dd8-15818f0bef8c,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-workflowzhzk8/series-workflowzhzk8-convert-artifact-2419834668/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": "a6463801-53ab-4979-83e5-f584d9bc6f90", "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-workflowzhzk8/series-workflowzhzk8-build-action-1509868890/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-14 17:01:01 +0000 UTC FinishedAt: 2026-09-14 17:17: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:*a64bf1e7-0d38-438e-8dd8-15818f0bef8c,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-workflowzhzk8/series-workflowzhzk8-convert-artifact-2419834668/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": "a6463801-53ab-4979-83e5-f584d9bc6f90", "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-workflowzhzk8/series-workflowzhzk8-build-action-1509868890/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-14 17:17:45 +0000 UTC FinishedAt: 2026-09-14 17:17:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-14 17:17:45 +0000 UTC FinishedAt: 2026-09-14 17:17:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-14 17:17:45 +0000 UTC FinishedAt: 2026-09-14 17:17:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-14 17:17:45 +0000 UTC FinishedAt: 2026-09-14 17:17:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.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-workflowzhzk8/series-workflowzhzk8-convert-artifact-2428703211/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-14 17:17:55 +0000 UTC FinishedAt: 2026-09-14 17:19:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-14 17:17:55 +0000 UTC FinishedAt: 2026-09-14 17:19:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a6463801-53ab-4979-83e5-f584d9bc6f90,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-workflowzhzk8/series-workflowzhzk8-build-action-1509868890/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-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-14 17:19:50 +0000 UTC FinishedAt: 2026-09-14 17:19:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-14 17:19:50 +0000 UTC FinishedAt: 2026-09-14 17:19:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-14 17:19:50 +0000 UTC FinishedAt: 2026-09-14 17:35:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-14 17:19:50 +0000 UTC FinishedAt: 2026-09-14 17:35:56 +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:*a64bf1e7-0d38-438e-8dd8-15818f0bef8c,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-workflowzhzk8/series-workflowzhzk8-convert-artifact-2428703211/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": "a02cc74a-2b28-4203-8b01-ecdd1b8066e7", "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-workflowzhzk8/series-workflowzhzk8-build-action-4009250575/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-14 17:19:50 +0000 UTC FinishedAt: 2026-09-14 17:35:46 +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:*a64bf1e7-0d38-438e-8dd8-15818f0bef8c,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-workflowzhzk8/series-workflowzhzk8-convert-artifact-2428703211/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": "a02cc74a-2b28-4203-8b01-ecdd1b8066e7", "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-workflowzhzk8/series-workflowzhzk8-build-action-4009250575/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-14 17:35:56 +0000 UTC FinishedAt: 2026-09-14 17:35:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-14 17:35:56 +0000 UTC FinishedAt: 2026-09-14 17:35:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-14 17:35:56 +0000 UTC FinishedAt: 2026-09-14 17:37:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-14 17:35:56 +0000 UTC FinishedAt: 2026-09-14 17:37:36 +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:*a02cc74a-2b28-4203-8b01-ecdd1b8066e7,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-workflowzhzk8/series-workflowzhzk8-build-action-4009250575/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-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-14 17:37:46 +0000 UTC FinishedAt: 2026-09-14 20:50:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-14 17:37:46 +0000 UTC FinishedAt: 2026-09-14 20:50:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*a6463801-53ab-4979-83e5-f584d9bc6f90,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a02cc74a-2b28-4203-8b01-ecdd1b8066e7,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-workflowzhzk8/series-workflowzhzk8-build-action-1509868890/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-workflowzhzk8/series-workflowzhzk8-build-action-4009250575/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-14 17:37:46 +0000 UTC FinishedAt: 2026-09-14 17:37:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-14 17:37:46 +0000 UTC FinishedAt: 2026-09-14 17:37:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzhzk8/series-workflowzhzk8-convert-artifact-3115197956/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-14 17:37:46 +0000 UTC FinishedAt: 2026-09-14 17:37:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-14 17:37:46 +0000 UTC FinishedAt: 2026-09-14 17:37:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-14 17:37:46 +0000 UTC FinishedAt: 2026-09-14 17:37:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-14 17:37:56 +0000 UTC FinishedAt: 2026-09-14 20:50:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzhzk8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"base_commit":"a41c69c6ea14596cfd95978483166d4eff52435e","base_tree":"bpf-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","bpf_btf_load"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a41c69c6ea14596cfd95978483166d4eff52435e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"4bc44d71-b488-4779-9276-5bae55679d77","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-14 17:37:56 +0000 UTC FinishedAt: 2026-09-14 20:50:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a6463801-53ab-4979-83e5-f584d9bc6f90,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a02cc74a-2b28-4203-8b01-ecdd1b8066e7,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-workflowzhzk8/series-workflowzhzk8-build-action-1509868890/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-workflowzhzk8/series-workflowzhzk8-build-action-4009250575/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-workflowzhzk8/series-workflowzhzk8-convert-artifact-3115197956/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,}