Name: series-workflowvlwgv Phase: Succeeded StartedAt: 2026-08-12 16:40:27 +0000 UTC FinishedAt: 2026-08-12 20:40:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[0] Phase: Succeeded StartedAt: 2026-08-12 16:40:27 +0000 UTC FinishedAt: 2026-08-12 16:57:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[0].run-triage Phase: Succeeded StartedAt: 2026-08-12 16:40:27 +0000 UTC FinishedAt: 2026-08-12 16:57:23 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "HUGETLBFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "HUGETLBFS" ], "series_id": "1a350144-2334-47f4-b57e-ffb039f7a32f" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "get_user_pages", "get_user_pages_remote", "get_user_pages_unlocked", "pin_user_pages", "pin_user_pages_remote", "pin_user_pages_unlocked", "faultin_page_range", "populate_vma_page_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0hVR0VUTEJGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzX3JlbW90ZSYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc191bmxvY2tlZCYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgICAmIzM0O3BvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIEdldCBVc2VyIFBhZ2VzIChHVVApIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa2luZyBhbmQgcmVmY291bnRpbmcuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMgYnV0IGRvZXMgbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGhhbmRsZSBjb21wbGV4IHBhcnNpbmcgd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgY291bGQgYmUgbGVha2VkLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGluY29ycmVjdCBudW1iZXIgb2YgcHJvY2Vzc2VkIHBhZ2VzLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkpIHdvdWxkIHJlc3VsdCBpbiB3aWxkIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBwYWdlIHJlZmVyZW5jZSBpbWJhbGFuY2VzLiBUaGVzZSB0eXBlcyBvZiBlcnJvcnMgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgY29yZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYyBpbiBgbW0vZ3VwLmNgIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MgYW5kIHJldHVybiBtdWx0aXBsZSBwYWdlcyBhdCBvbmNlIGluc3RlYWQgb2Ygb25lIGJ5IG9uZS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSB0aGF0IGlzIHJlYWNoYWJsZSB2aWEgbWFueSBzeXNjYWxscyAoZS5nLiwgbW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KS4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIGV4cG9ydGVkIEdVUCBBUEkgZW50cnkgcG9pbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNjdlNjc2ZThiMDM4ZTAxY2NkYzYyNzg1NzY5MzZkNjBkOWI3YWI4NFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmNcbmluZGV4IDA2OTIxMTliNzkwNDMuLjEwNjgwNjYzNGIzYzQgMTAwNjQ0XG4tLS0gYS9tbS9ndXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmNcbkBAIC02MDgsMTUgJiM0Mzs2MDgsMTUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0cmV0dXJuIHBhZ2UgXHUwMDI2XHUwMDI2IFBhZ2VBbm9uKHBhZ2UpIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbiYjNDM7c3RhdGljIGxvbmcgbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzKVxuIHtcbiBcdGlmICghKGZsYWdzIFx1MDAyNiBGT0xMX0RVTVApKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0LypcbiBcdCAqIFdoZW4gY29yZSBkdW1waW5nLCB3ZSBkb24mIzM5O3Qgd2FudCB0byBhbGxvY2F0ZSB1bm5lY2Vzc2FyeSBwYWdlcyBvclxuLVx0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiBOVUxMIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxuJiM0MztcdCAqIHBhZ2UgdGFibGVzLiAgUmV0dXJuIGVycm9yIGluc3RlYWQgb2YgMCB0byBza2lwIGhhbmRsZV9tbV9mYXVsdCxcbiBcdCAqIHRoZW4gZ2V0X2R1bXBfcGFnZSgpIHdpbGwgcmV0dXJuIE5VTEwgdG8gbGVhdmUgYSBob2xlIGluIHRoZSBkdW1wLlxuIFx0ICogQnV0IHdlIGNhbiBvbmx5IG1ha2UgdGhpcyBvcHRpbWl6YXRpb24gd2hlcmUgYSBob2xlIHdvdWxkIHN1cmVseVxuIFx0ICogYmUgemVyby1maWxsZWQgaWYgaGFuZGxlX21tX2ZhdWx0KCkgYWN0dWFsbHkgZGlkIGhhbmRsZSBpdC5cbkBAIC02MjUsMTIgJiM0Mzs2MjUsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xuIFxuIFx0XHRpZiAoIWh1Z2V0bGJmc19wYWdlY2FjaGVfcHJlc2VudChoLCB2bWEsIGFkZHJlc3MpKVxuLVx0XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdH0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VmYXVsdCkpIHtcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdH1cbiBcbi1cdHJldHVybiBOVUxMO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBndXBfZmlsbF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnIsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdGlmICghcGFnZXMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICYjNDM7IGk7XG4mIzQzO1xuJiM0MztcdFx0cGFnZXNbaV0gPSBzdWJwYWdlO1xuJiM0MztcdFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgYWRkcmVzcyAmIzQzOyBpICogUEFHRV9TSVpFKTtcbiYjNDM7XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xuJiM0MztcdH1cbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xuQEAgLTY0NiwzOCAmIzQzOzY2Myw0MyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihwYWdlLCB2bWEsIGZsYWdzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHB1ZF90IHB1ZCA9ICpwdWRwO1xuIFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwdWRfcGZuKHB1ZCk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvZmYsIG5yO1xuIFx0aW50IHJldDtcbiBcbiBcdGFzc2VydF9zcGluX2xvY2tlZChwdWRfbG9ja3B0cihtbSwgcHVkcCkpO1xuIFxuIFx0aWYgKCFwdWRfcHJlc2VudChwdWQpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4gXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZCwgcGZuX3RvX3BhZ2UocGZuKSwgdm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4gXG4tXHRwZm4gJiM0Mzs9IChhZGRyIFx1MDAyNiB+UFVEX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdG9mZiA9IFBGTl9ET1dOKGFkZHIgXHUwMDI2IH5QVURfTUFTSyk7XG4mIzQzO1x0cGZuICYjNDM7PSBvZmY7XG4gXHRwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcbiBcbiBcdGlmICghcHVkX3dyaXRlKHB1ZCkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xuJiM0MztcdFx0cmV0dXJuIC1FTUxJTks7XG4mIzQzO1xuJiM0MztcdG5yID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpO1xuIFxuLVx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xuJiM0MztcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7XG4gXHRpZiAocmV0KVxuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0ZWxzZVxuLVx0XHQqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChwYWdlcylcbiYjNDM7XHRcdHBhZ2VzWzBdID0gcGFnZTtcbiBcbi1cdHJldHVybiBwYWdlO1xuJiM0MztcdHJldHVybiBucjtcbiB9XG4gXG4gLyogRk9MTF9GT1JDRSBjYW4gd3JpdGUgdG8gZXZlbiB1bndyaXRhYmxlIFBNRHMgaW4gQ09XIG1hcHBpbmdzLiAqL1xuQEAgLTY5OCwxNCAmIzQzOzcyMCwxNCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfaHVnZV9wbWRfd3Aodm1hLCBwbWQpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHBtZF90IHBtZHZhbCA9ICpwbWQ7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XG4gXHRpbnQgcmV0O1xuIFxuIFx0YXNzZXJ0X3NwaW5fbG9ja2VkKHBtZF9sb2NrcHRyKG1tLCBwbWQpKTtcbkBAIC03MTMsNTAgJiM0Mzs3MzUsNTQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRwYWdlID0gcG1kX3BhZ2UocG1kdmFsKTtcbiBcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICFjYW5fZm9sbG93X3dyaXRlX3BtZChwbWR2YWwsIHBhZ2UsIHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0LyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqL1xuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9EVU1QKSBcdTAwMjZcdTAwMjYgaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZSgqcG1kKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKCFwbWRfd3JpdGUocG1kdmFsKSBcdTAwMjZcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVNTElOSztcbiBcbiBcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIFx1MDAyNlx1MDAyNiBQYWdlQW5vbihwYWdlKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XG4gXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4mIzQzO1x0b2ZmID0gUEZOX0RPV04oYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiYjNDM7XHRuciA9IG1pbihIUEFHRV9QTURfTlIgLSBvZmYsIFBGTl9ET1dOKGVuZCAtIGFkZHIpKTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgbnIsIGZsYWdzKTtcbiBcdGlmIChyZXQpXG4tXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuIFxuICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VcbiBcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IEZPTExfVE9VQ0gpKVxuIFx0XHR0b3VjaF9wbWQodm1hLCBhZGRyLCBwbWQsIGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKTtcbiAjZW5kaWZcdC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqL1xuIFxuLVx0cGFnZSAmIzQzOz0gKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcbiYjNDM7XHRwYWdlICYjNDM7PSBvZmY7XG4mIzQzO1xuJiM0MztcdGlmIChwYWdlcylcbiYjNDM7XHRcdHBhZ2VzWzBdID0gcGFnZTtcbiBcbi1cdHJldHVybiBwYWdlO1xuJiM0MztcdHJldHVybiBucjtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxuJiM0MztcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbi1cdHJldHVybiBOVUxMO1xuJiM0MztcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4tXHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gI2VuZGlmXHQvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi9cbiBcbkBAIC03OTksMTEwICYjNDM7ODI1LDIwNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzKVxuJiM0MzsvKlxuJiM0MzsgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IHJ1biBldmVyeSBwZXItUFRFIHNhZmV0eSBjaGVjayAocHJlc2VudCxcbiYjNDM7ICogd3JpdGUtZmF1bHQsIGd1cF9tdXN0X3Vuc2hhcmUoKSkgb24gdGhlIFBURSwgc28gdGhpcyBvbmx5IGRvZXMgdGhlXG4mIzQzOyAqIHBlci1mb2xpbyB3b3JrOiB0aGUgcmVmY291bnQgZ3JhYiwgdGhlIEZPTExfUElOIGFjY2Vzc2liaWxpdHkgZmF1bHQtaW4sXG4mIzQzOyAqIGRpcnR5L2FjY2Vzc2VkIG1hcmtpbmcsIGFuZCB0aGUgYXJyYXkgZmlsbCB3aXRoIHRoZSBjYWNoZSBmbHVzaC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpwYWdlLFxuJiM0MztcdFx0cHRlX3QgcHRlLCB1bnNpZ25lZCBsb25nIG5yLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIHRyeV9ncmFiX2ZvbGlvKCkgZG9lcyBub3RoaW5nIHVubGVzcyBGT0xMX0dFVCBvciBGT0xMX1BJTiBpcyBzZXQuICovXG4mIzQzO1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XG4mIzQzO1x0aWYgKHVubGlrZWx5KHJldCkpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFdlIG5lZWQgdG8gbWFrZSB0aGUgcGFnZSBhY2Nlc3NpYmxlIGlmIGFuZCBvbmx5IGlmIHdlIGFyZSBnb2luZ1xuJiM0MztcdCAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZVxuJiM0MztcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIHtcbiYjNDM7XHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbiYjNDM7XHRcdGlmIChyZXQpIHtcbiYjNDM7XHRcdFx0Z3VwX3B1dF9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSB7XG4mIzQzO1x0XHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAhcHRlX2RpcnR5KHB0ZSkgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlXG4mIzQzO1x0XHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2VcbiYjNDM7XHRcdCAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2UsIG5yLCBwYWdlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yXG4mIzQzOyAqIHdoZW4gdGhlIFBURSBjYW5ub3QgYmUgZm9sbG93ZWQgYnV0IHRoZSBjYWxsZXIgbWF5IGZhdWx0IGl0IGluLCBhbmQgYVxuJiM0MzsgKiBuZWdhdGl2ZSBlcnJubyB3aGVuIHRoZSBjYWxsZXIgbXVzdCByZXBvcnQgdGhlIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfb25lX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuJiM0MztcdFx0cHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VwKVxuIHtcbi1cdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuLVx0c3RydWN0IGZvbGlvICpmb2xpbztcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0cHRlX3QgKnB0ZXAsIHB0ZTtcbi1cdGludCByZXQ7XG4gXG4tXHRwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCBcdTAwMjZwdGwpO1xuLVx0aWYgKCFwdGVwKVxuLVx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbi1cdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuJiM0MztcdCpwYWdlcCA9IE5VTEw7XG4mIzQzO1xuIFx0aWYgKCFwdGVfcHJlc2VudChwdGUpKVxuLVx0XHRnb3RvIG5vX3BhZ2U7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcdGlmIChwdGVfcHJvdG5vbmUocHRlKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRnb3RvIG5vX3BhZ2U7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcbiBcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZSk7XG4gXG4gXHQvKlxuIFx0ICogV2Ugb25seSBjYXJlIGFib3V0IGFub24gcGFnZXMgaW4gY2FuX2ZvbGxvd193cml0ZV9wdGUoKS5cbiBcdCAqL1xuLVx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpIHtcbi1cdFx0cGFnZSA9IE5VTEw7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuJiM0MztcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNiAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKHVubGlrZWx5KCFwYWdlKSkge1xuIFx0XHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkge1xuIFx0XHRcdC8qIEF2b2lkIHNwZWNpYWwgKGxpa2UgemVybykgcGFnZXMgaW4gY29yZSBkdW1wcyAqL1xuLVx0XHRcdHBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGlmIChpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKSB7XG4tXHRcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0cmV0ID0gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7XG4tXHRcdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdH1cbiYjNDM7XHRcdGlmICghaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xuJiM0MztcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4gXHR9XG4tXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG4tXHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKSB7XG4tXHRcdHBhZ2UgPSBFUlJfUFRSKC1FTUxJTkspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbiYjNDM7XHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxuJiM0MztcdFx0cmV0dXJuIC1FTUxJTks7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSBcdTAwMjZcdTAwMjYgUGFnZUFub24ocGFnZSkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpO1xuIFxuLVx0LyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi9cbi1cdHJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCAxLCBmbGFncyk7XG4tXHRpZiAodW5saWtlbHkocmV0KSkge1xuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbiYjNDM7XHQqcGFnZXAgPSBwYWdlO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4gXG4tXHQvKlxuLVx0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXG4tXHQgKiB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZSBzZWVcbi1cdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuLVx0ICovXG4tXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSB7XG4tXHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbi1cdFx0aWYgKHJldCkge1xuLVx0XHRcdHVucGluX3VzZXJfcGFnZShwYWdlKTtcbi1cdFx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuJiM0MzsvKlxuJiM0MzsgKiBSZXR1cm4gaG93IG1hbnkgUFRFcyBtYXAgY29uc2VjdXRpdmUgcGFnZXMgb2YgdGhlIHNhbWUgZm9saW8gYW5kIGNhbiBiZVxuJiM0MzsgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB3cml0ZS1mYXVsdCBhbmQgdW5zaGFyZSBjaGVja3MgaW4gZm9sbG93X29uZV9wdGUoKSBhcmUgcGVyIFBURSwgYnV0IGFcbiYjNDM7ICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seVxuJiM0MzsgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5c1xuJiM0MzsgKiBvbmUgcGFnZSBhdCBhIHRpbWUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHdhbGtfZW5kLFxuJiM0MztcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgKnB0ZXAsIHB0ZV90ICpiYXRjaF9wdGUsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbWF4O1xuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0aWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdG1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdGlmIChtYXggXHUwMDNjPSAxKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdC8qIE1lcmdlIHlvdW5nL2RpcnR5IGFjcm9zcyBiYXRjaCBzbyBmb2xpb19tYXJrX2RpcnR5IHNlZXMgYW55IGRpcnR5LiAqL1xuJiM0MztcdHJldHVybiBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoZm9saW8sIHZtYSwgcHRlcCwgYmF0Y2hfcHRlLCBtYXgsXG4mIzQzO1x0XHRcdFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsXG4mIzQzOyAqIHdoaWNoZXZlciBjb21lcyBmaXJzdCwgYW5kIGNvbW1pdCBldmVyeSBwYWdlIGZvdW5kLlxuJiM0MzsgKlxuJiM0MzsgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdFxuJiM0MzsgKiBpcyBhIHNob3J0IHJlYWQ7IF9fZ2V0X3VzZXJfcGFnZXMoKSByZXRyeWluZyB0aGUgcmVhZCB3aWxsIGdldCB0aGUgZXJyb3IuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLFxuJiM0MztcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0Ym9vbCBuZWVkX25vX3BhZ2VfdGFibGUgPSBmYWxzZTtcbiYjNDM7XHRwdGVfdCAqcHRlcCwgKm9yaWdfcHRlcDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHdhbGtfZW5kO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnIgPSAwO1xuJiM0MztcdHNwaW5sb2NrX3QgKnB0bDtcbiYjNDM7XHRsb25nIHJldCA9IDA7XG4mIzQzO1xuJiM0MztcdG9yaWdfcHRlcCA9IHB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsIFx1MDAyNnB0bCk7XG4mIzQzO1x0aWYgKCFwdGVwKVxuJiM0MztcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4mIzQzO1xuJiM0MztcdHdhbGtfZW5kID0gbWluKHBtZF9hZGRyX2VuZChhZGRyZXNzLCBlbmQpLCB2bWEtXHUwMDNldm1fZW5kKTtcbiYjNDM7XG4mIzQzO1x0Zm9yICg7IGFkZHJlc3MgXHUwMDNjIHdhbGtfZW5kOyBhZGRyZXNzICYjNDM7PSBQQUdFX1NJWkUsIHB0ZXAmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRwdGVfdCBwdGUgPSBwdGVwX2dldChwdGVwKTtcbiYjNDM7XHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IGZvbGxvd19vbmVfcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgcHRlLCBmbGFncywgXHUwMDI2cGFnZSk7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgcGFnZSkge1xuJiM0MztcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRcdFx0dW5zaWduZWQgbG9uZyBiYXRjaDtcbiYjNDM7XG4mIzQzO1x0XHRcdHB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdGJhdGNoID0gZm9sbG93X3B0ZV9iYXRjaCh2bWEsIGFkZHJlc3MsIHdhbGtfZW5kLCBmb2xpbyxcbiYjNDM7XHRcdFx0XHRcdFx0IHB0ZXAsIFx1MDAyNmJhdGNoX3B0ZSwgZmxhZ3MpO1xuJiM0MztcdFx0XHRyZXQgPSBmb2xsb3dfcGFnZV9wdGVfY29tbWl0KHZtYSwgYWRkcmVzcywgZm9saW8sIHBhZ2UsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgcGFnZXMgPyBwYWdlcyAmIzQzOyBuciA6IE5VTEwpO1xuJiM0MztcdFx0XHRpZiAoIXJldCkge1xuJiM0MztcdFx0XHRcdG5yICYjNDM7PSBiYXRjaDtcbiYjNDM7XHRcdFx0XHQvKlxuJiM0MztcdFx0XHRcdCAqIFRoZSBsb29wJiMzOTtzIG93biBpbmNyZW1lbnQgY292ZXJzIG9uZSBQVEU7IHNraXBcbiYjNDM7XHRcdFx0XHQgKiB0aGUgcmVzdCBvZiB0aGUgYmF0Y2guXG4mIzQzO1x0XHRcdFx0ICovXG4mIzQzO1x0XHRcdFx0cHRlcCAmIzQzOz0gYmF0Y2ggLSAxO1xuJiM0MztcdFx0XHRcdGFkZHJlc3MgJiM0Mzs9IChiYXRjaCAtIDEpICogUEFHRV9TSVpFO1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHR9XG4gXHRcdH1cbi1cdH1cbi1cdGlmIChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkge1xuLVx0XHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFwdGVfZGlydHkocHRlKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuLVx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcbiBcdFx0Lypcbi1cdFx0ICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlXG4tXHRcdCAqIGlzIG5lZWRlZCB0byBhdm9pZCBsb3NpbmcgdGhlIGRpcnR5IGJpdDogaXQgaXMgZWFzaWVyIHRvIHVzZVxuLVx0XHQgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuXG4mIzQzO1x0XHQgKiBub19wYWdlX3RhYmxlKCkgbWF5IGxvb2sgdXAgdGhlIHBhZ2UgY2FjaGUsIHNvIGl0IGNhbm5vdCBydW5cbiYjNDM7XHRcdCAqIHVuZGVyIHRoZSBQVEUgbG9jay5cbiBcdFx0ICovXG4tXHRcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xuJiM0MztcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHB0ZV9ub25lKHB0ZSkpXG4mIzQzO1x0XHRcdG5lZWRfbm9fcGFnZV90YWJsZSA9IHRydWU7XG4mIzQzO1x0XHRicmVhaztcbiBcdH1cbi1vdXQ6XG4tXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7XG4tXHRyZXR1cm4gcGFnZTtcbi1ub19wYWdlOlxuLVx0cHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpO1xuLVx0aWYgKCFwdGVfbm9uZShwdGUpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuJiM0MztcbiYjNDM7XHRwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG5yKVxuJiM0MztcdFx0cmV0dXJuIG5yO1xuJiM0MztcdGlmIChuZWVkX25vX3BhZ2VfdGFibGUpXG4mIzQzO1x0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxuJiM0MztcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHBtZF90ICpwbWQsIHBtZHZhbDtcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdGxvbmcgcmV0O1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXG4gXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHJlc3MpO1xuQEAgLTkxMiw3ICYjNDM7MTAzMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGlmIChsaWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKVxuLVx0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4mIzQzO1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXG4gXHRpZiAocG1kX3Byb3Rub25lKHBtZHZhbCkgXHUwMDI2XHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG5AQCAtOTI1LDI4ICYjNDM7MTA0NiwzNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuJiM0MztcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0fVxuIFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9TUExJVF9QTUQpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4gXHRcdHNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTtcbiBcdFx0LyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqL1xuLVx0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gRVJSX1BUUigtRU5PTUVNKSA6XG4tXHRcdFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4mIzQzO1x0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gLUVOT01FTSA6XG4mIzQzO1x0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0fVxuLVx0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cmV0ID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXHRzcGluX3VubG9jayhwdGwpO1xuLVx0cmV0dXJuIHBhZ2U7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsIHRoZVxuJiM0MztcdCAqIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgcG1kIGxvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHJldCBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgcGFnZXMpXG4mIzQzO1x0XHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwNGRfdCAqcDRkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwNGRfdCAqcDRkcCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwdWRfdCAqcHVkcCwgcHVkO1xuIFx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4mIzQzO1x0bG9uZyByZXQ7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcbiBcdHB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpO1xuQEAgLTk1NSwyMiAmIzQzOzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRyZXQgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBwYWdlcyk7XG4gXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4tXHRcdGlmIChwYWdlKVxuLVx0XHRcdHJldHVybiBwYWdlO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxuJiM0MztcdFx0ICogdGhlIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgbG9jay4gQSAxIEdCIGZvbGlvXG4mIzQzO1x0XHQgKiBjYW4gYmUgdXAgdG8gSFBBR0VfUFVEX05SIHBhZ2VzLCB0b28gbG9uZyB0byBmbHVzaCB1bmRlciBhXG4mIzQzO1x0XHQgKiBzcGlubG9jay5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgcGFnZXMpXG4mIzQzO1x0XHRcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHR9XG4gXHRpZiAodW5saWtlbHkocHVkX2JhZChwdWQpKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ2RfdCAqcGdkcCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwNGRfdCAqcDRkcCwgcDRkO1xuIFxuQEAgLTk4MSwxNSAmIzQzOzExMTYsMTggQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcbi1cdHJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTtcbiYjNDM7XHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwNGRwLCBmbGFncywgcGFnZXMpO1xuIH1cbiBcbiAvKipcbi0gKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3NcbiYjNDM7ICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgcGFnZXMgYXQgYSB1c2VyLXZpcnR1YWwgYWRkcmVzc1xuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcbiAgKiBAYWRkcmVzczogdmlydHVhbCBhZGRyZXNzIHRvIGxvb2sgdXBcbiYjNDM7ICogQGVuZDogdmlydHVhbCBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0b3AgYmF0Y2hpbmcgY29udGlndW91cyBwYWdlc1xuICAqIEBmbGFnczogZmxhZ3MgbW9kaWZ5aW5nIGxvb2t1cCBiZWhhdmlvdXJcbi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFza1xuJiM0MzsgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG9cbiYjNDM7ICogICAgICAgICB3YWxrIHRoZSBwYWdlIHRhYmxlcyAoZS5nLiB0byBmYXVsdCBwYWdlcyBpbikgd2l0aG91dCBjb2xsZWN0aW5nXG4mIzQzOyAqICAgICAgICAgb3IgcmVmY291bnRpbmcgdGhlbVxuICAqXG4gICogQGZsYWdzIGNhbiBoYXZlIEZPTExfIGZsYWdzIHNldCwgZGVmaW5lZCBpbiBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gICpcbkBAIC05OTgsMzMgJiM0MzsxMTM2LDMyIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxuICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLlxuICAqXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXG4tICpcbi0gKiBSZXR1cm46IHRoZSBtYXBwZWQgKHN0cnVjdCBwYWdlICopLCAlTlVMTCBpZiBubyBtYXBwaW5nIGV4aXN0cywgb3Jcbi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXG4tICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLlxuJiM0MzsgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgY29udGlndW91cyBwYWdlcyBzdGFydGluZyBhdCBAYWRkcmVzcyB0aGF0IHdlcmVcbiYjNDM7ICogcGxhY2VkIGludG8gQHBhZ2VzIChpZiBub24tTlVMTCksIHdoaWNoIG1heSBiZSBmZXdlciB0aGFuIHRoZSBwYWdlc1xuJiM0MzsgKiByZXF1ZXN0ZWQgdmlhIEBlbmQ7IDAgaWYgbm8gbWFwcGluZyBleGlzdHMgYXQgQGFkZHJlc3M7IG9yIGEgbmVnYXRpdmVcbiYjNDM7ICogZXJybm8gZm9yIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkIGJ5IGEgcGFnZSBkZXNjcmlwdG9yXG4mIzQzOyAqIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cbiAgKi9cbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwZ2RfdCAqcGdkO1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHRsb25nIHJldDtcbiBcbiBcdHZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTtcbiBcbi1cdCpwYWdlX21hc2sgPSAwO1xuIFx0cGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7XG4gXG4gXHRpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpXG4tXHRcdHBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuJiM0MztcdFx0cmV0ID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGVsc2Vcbi1cdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRyZXQgPSBmb2xsb3dfcDRkX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHBnZCwgZmxhZ3MsIHBhZ2VzKTtcbiBcbiBcdHZtYV9wZ3RhYmxlX3dhbGtfZW5kKHZtYSk7XG4gXG4tXHRyZXR1cm4gcGFnZTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbkBAIC0xMzU4LDcgJiM0MzsxNDk1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiB7XG4gXHRsb25nIHJldCA9IDAsIGkgPSAwO1xuIFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xuLVx0dW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwO1xuIFxuIFx0aWYgKCFucl9wYWdlcylcbiBcdFx0cmV0dXJuIDA7XG5AQCAtMTM3Myw3ICYjNDM7MTUwOSw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRkbyB7XG4gXHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0XHR1bnNpZ25lZCBpbnQgcGFnZV9pbmNyZW07XG4mIzQzO1x0XHRsb25nIG5yO1xuIFxuIFx0XHQvKiBmaXJzdCBpdGVyYXRpb24gb3IgY3Jvc3Mgdm1hIGJvdW5kICovXG4gXHRcdGlmICghdm1hIHx8IHN0YXJ0IFx1MDAzZT0gdm1hLVx1MDAzZXZtX2VuZCkge1xuQEAgLTE0MDAsOCAmIzQzOzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0XHRwYWdlcyA/IFx1MDAyNnBhZ2UgOiBOVUxMKTtcbiBcdFx0XHRcdGlmIChyZXQpXG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0cGFnZV9tYXNrID0gMDtcbi1cdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuJiM0MztcdFx0XHRcdGd1cF9maWxsX3BhZ2VzKHZtYSwgc3RhcnQsIHBhZ2UsIDEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgcGFnZXMgPyBwYWdlcyAmIzQzOyBpIDogTlVMTCk7XG4mIzQzO1x0XHRcdFx0aSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdFx0c3RhcnQgJiM0Mzs9IFBBR0VfU0laRTtcbiYjNDM7XHRcdFx0XHRucl9wYWdlcy0tO1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRcdH1cbiBcbiBcdFx0XHRpZiAoIXZtYSkge1xuQEAgLTE0MjMsMTAgJiM0MzsxNTYzLDExIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXG4tXHRcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgXHUwMDI2cGFnZV9tYXNrKTtcbi1cdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuJiM0MztcdFx0bnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFLFxuJiM0MztcdFx0XHRcdCAgICAgIGd1cF9mbGFncywgcGFnZXMgPyBcdTAwMjZwYWdlc1tpXSA6IE5VTEwpO1xuJiM0MztcdFx0aWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7XG4gXHRcdFx0cmV0ID0gZmF1bHRpbl9wYWdlKHZtYSwgc3RhcnQsIGd1cF9mbGFncyxcbi1cdFx0XHRcdFx0ICAgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LLCBsb2NrZWQpO1xuJiM0MztcdFx0XHRcdFx0ICAgbnIgPT0gLUVNTElOSywgbG9ja2VkKTtcbiBcdFx0XHRzd2l0Y2ggKHJldCkge1xuIFx0XHRcdGNhc2UgMDpcbiBcdFx0XHRcdGdvdG8gcmV0cnk7XG5AQCAtMTQ0MCw3MCAmIzQzOzE1ODEsMzAgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbiBcdFx0XHRCVUcoKTtcbi1cdFx0fSBlbHNlIGlmIChQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcbiYjNDM7XHRcdH0gZWxzZSBpZiAobnIgPT0gLUVFWElTVCkge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZ1xuIFx0XHRcdCAqIHN0cnVjdCBwYWdlLiBJZiB0aGUgY2FsbGVyIGV4cGVjdHMgKipwYWdlcyB0byBiZVxuIFx0XHRcdCAqIGZpbGxlZCBpbiwgYmFpbCBvdXQgbm93LCBiZWNhdXNlIHRoYXQgY2FuJiMzOTt0IGJlIGRvbmVcbi1cdFx0XHQgKiBmb3IgdGhpcyBwYWdlLlxuJiM0MztcdFx0XHQgKiBmb3IgdGhpcyBwYWdlLiBPdGhlcndpc2UgYWR2YW5jZSBieSB0aGUgb25lIHBhZ2VcbiYjNDM7XHRcdFx0ICogZm9sbG93X3BhZ2VfbWFzaygpIGxvb2tlZCBhdC5cbiBcdFx0XHQgKi9cbiBcdFx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4mIzQzO1x0XHRcdFx0cmV0ID0gbnI7XG4gXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4tXHRcdH0gZWxzZSBpZiAoSVNfRVJSKHBhZ2UpKSB7XG4tXHRcdFx0cmV0ID0gUFRSX0VSUihwYWdlKTtcbiYjNDM7XHRcdFx0bnIgPSAxO1xuJiM0MztcdFx0fSBlbHNlIGlmIChuciBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRyZXQgPSBucjtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuLW5leHRfcGFnZTpcbi1cdFx0cGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgcGFnZV9tYXNrKTtcbi1cdFx0aWYgKHBhZ2VfaW5jcmVtIFx1MDAzZSBucl9wYWdlcylcbi1cdFx0XHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xuLVxuLVx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZTtcbi1cdFx0XHR1bnNpZ25lZCBpbnQgajtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRoaXMgbXVzdCBiZSBhIGxhcmdlIGZvbGlvIChhbmQgZG9lc24mIzM5O3QgbmVlZCB0b1xuLVx0XHRcdCAqIGJlIHRoZSB3aG9sZSBmb2xpbzsgaXQgY2FuIGJlIHBhcnQgb2YgaXQpLCBkb1xuLVx0XHRcdCAqIHRoZSByZWZjb3VudCB3b3JrIGZvciBhbGwgdGhlIHN1YnBhZ2VzIHRvby5cbi1cdFx0XHQgKlxuLVx0XHRcdCAqIE5PVEU6IGhlcmUgdGhlIHBhZ2UgbWF5IG5vdCBiZSB0aGUgaGVhZCBwYWdlXG4tXHRcdFx0ICogZS5nLiB3aGVuIHN0YXJ0IGFkZHIgaXMgbm90IHRocC1zaXplIGFsaWduZWQuXG4tXHRcdFx0ICogdHJ5X2dyYWJfZm9saW8oKSBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRhaWxcbi1cdFx0XHQgKiBwYWdlcy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocGFnZV9pbmNyZW0gXHUwMDNlIDEpIHtcbi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHRcdFx0Lypcbi1cdFx0XHRcdCAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGVcbi1cdFx0XHRcdCAqIGxhcmdlIGZvbGlvLCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLlxuLVx0XHRcdFx0ICovXG4tXHRcdFx0XHRpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSxcbi1cdFx0XHRcdFx0XHQgICBndXBfZmxhZ3MpKSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIFJlbGVhc2UgdGhlIDFzdCBwYWdlIHJlZiBpZiB0aGVcbi1cdFx0XHRcdFx0ICogZm9saW8gaXMgcHJvYmxlbWF0aWMsIGZhaWwgaGFyZC5cbi1cdFx0XHRcdFx0ICovXG4tXHRcdFx0XHRcdGd1cF9wdXRfZm9saW8oZm9saW8sIDEsIGd1cF9mbGFncyk7XG4tXHRcdFx0XHRcdHJldCA9IC1FRkFVTFQ7XG4tXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbi1cbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYWdlX2luY3JlbTsgaiYjNDM7JiM0MzspIHtcbi1cdFx0XHRcdHN1YnBhZ2UgPSBwYWdlICYjNDM7IGo7XG4tXHRcdFx0XHRwYWdlc1tpICYjNDM7IGpdID0gc3VicGFnZTtcbi1cdFx0XHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIHN0YXJ0ICYjNDM7IGogKiBQQUdFX1NJWkUpO1xuLVx0XHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7XG4tXHRcdFx0fVxuLVx0XHR9XG4mIzQzO1x0XHQvKiBDaGVjayB0aGF0IHdlIGRpZG4mIzM5O3QgcGluIG1vcmUgcGFnZXMgdGhhbiB0aGUgY2FsbGVyIHdpbGwgZnJlZS4gKi9cbiYjNDM7XHRcdFZNX1dBUk5fT05fT05DRShuciBcdTAwM2UgbnJfcGFnZXMpO1xuIFxuLVx0XHRpICYjNDM7PSBwYWdlX2luY3JlbTtcbi1cdFx0c3RhcnQgJiM0Mzs9IHBhZ2VfaW5jcmVtICogUEFHRV9TSVpFO1xuLVx0XHRucl9wYWdlcyAtPSBwYWdlX2luY3JlbTtcbiYjNDM7XHRcdGkgJiM0Mzs9IG5yO1xuJiM0MztcdFx0c3RhcnQgJiM0Mzs9IG5yICogUEFHRV9TSVpFO1xuJiM0MztcdFx0bnJfcGFnZXMgLT0gbnI7XG4gXHR9IHdoaWxlIChucl9wYWdlcyk7XG4gb3V0OlxuIFx0cmV0dXJuIGkgPyBpIDogcmV0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtIVUdFVExCRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXMmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfcmVtb3RlJiMzNDssCiAgICAmIzM0O3Bpbl91c2VyX3BhZ2VzX3VubG9ja2VkJiMzNDssCiAgICAmIzM0O2ZhdWx0aW5fcGFnZV9yYW5nZSYjMzQ7LAogICAgJiMzNDtwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY3ZTY3NmU4YjAzOGUwMWNjZGM2Mjc4NTc2OTM2ZDYwZDliN2FiODQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyAxMiAxNjo1NToxMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmMKaW5kZXggMDY5MjExOWI3OTA0My4uMTA2ODA2NjM0YjNjNCAxMDA2NDQKLS0tIGEvbW0vZ3VwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmMKQEAgLTYwOCwxNSAmIzQzOzYwOCwxNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9jb21tb24oc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuIHBhZ2UgJmFtcDsmYW1wOyBQYWdlQW5vbihwYWdlKSAmYW1wOyZhbXA7IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKm5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKJiM0MztzdGF0aWMgbG9uZyBub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJaWYgKCEoZmxhZ3MgJmFtcDsgRk9MTF9EVU1QKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAogCS8qCiAJICogV2hlbiBjb3JlIGR1bXBpbmcsIHdlIGRvbiYjMzk7dCB3YW50IHRvIGFsbG9jYXRlIHVubmVjZXNzYXJ5IHBhZ2VzIG9yCi0JICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiBOVUxMIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LAomIzQzOwkgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIDAgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsCiAJICogdGhlbiBnZXRfZHVtcF9wYWdlKCkgd2lsbCByZXR1cm4gTlVMTCB0byBsZWF2ZSBhIGhvbGUgaW4gdGhlIGR1bXAuCiAJICogQnV0IHdlIGNhbiBvbmx5IG1ha2UgdGhpcyBvcHRpbWl6YXRpb24gd2hlcmUgYSBob2xlIHdvdWxkIHN1cmVseQogCSAqIGJlIHplcm8tZmlsbGVkIGlmIGhhbmRsZV9tbV9mYXVsdCgpIGFjdHVhbGx5IGRpZCBoYW5kbGUgaXQuCkBAIC02MjUsMTIgJiM0Mzs2MjUsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpOwogCiAJCWlmICghaHVnZXRsYmZzX3BhZ2VjYWNoZV9wcmVzZW50KGgsIHZtYSwgYWRkcmVzcykpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKJiM0MzsJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IGVsc2UgaWYgKCh2bWFfaXNfYW5vbnltb3VzKHZtYSkgfHwgIXZtYS0mZ3Q7dm1fb3BzLSZndDtmYXVsdCkpIHsKLQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGd1cF9maWxsX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBuciwgc3RydWN0IHBhZ2UgKipwYWdlcykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJaWYgKCFwYWdlcykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICYjNDM7IGk7CiYjNDM7CiYjNDM7CQlwYWdlc1tpXSA9IHN1YnBhZ2U7CiYjNDM7CQlmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBhZGRyZXNzICYjNDM7IGkgKiBQQUdFX1NJWkUpOwomIzQzOwkJZmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7CiYjNDM7CX0KIH0KIAogI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUwpAQCAtNjQ2LDM4ICYjNDM7NjYzLDQzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLAogCXJldHVybiBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihwYWdlLCB2bWEsIGZsYWdzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsCi0JCQkJICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlwdWRfdCBwdWQgPSAqcHVkcDsKIAl1bnNpZ25lZCBsb25nIHBmbiA9IHB1ZF9wZm4ocHVkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvZmYsIG5yOwogCWludCByZXQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQocHVkX2xvY2twdHIobW0sIHB1ZHApKTsKIAogCWlmICghcHVkX3ByZXNlbnQocHVkKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAogCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOwogCSAgICAhY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkLCBwZm5fdG9fcGFnZShwZm4pLCB2bWEsIGZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAotCXBmbiAmIzQzOz0gKGFkZHIgJmFtcDsgflBVRF9NQVNLKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwlvZmYgPSBQRk5fRE9XTihhZGRyICZhbXA7IH5QVURfTUFTSyk7CiYjNDM7CXBmbiAmIzQzOz0gb2ZmOwogCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwogCiAJaWYgKCFwdWRfd3JpdGUocHVkKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpCi0JCXJldHVybiBFUlJfUFRSKC1FTUxJTkspOwomIzQzOwkJcmV0dXJuIC1FTUxJTks7CiYjNDM7CiYjNDM7CW5yID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpOwogCi0JcmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpOwomIzQzOwlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpOwogCWlmIChyZXQpCi0JCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JZWxzZQotCQkqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CWlmIChwYWdlcykKJiM0MzsJCXBhZ2VzWzBdID0gcGFnZTsKIAotCXJldHVybiBwYWdlOwomIzQzOwlyZXR1cm4gbnI7CiB9CiAKIC8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQTURzIGluIENPVyBtYXBwaW5ncy4gKi8KQEAgLTY5OCwxNCAmIzQzOzcyMCwxNCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAlyZXR1cm4gIXVzZXJmYXVsdGZkX2h1Z2VfcG1kX3dwKHZtYSwgcG1kKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAJcG1kX3QgcG1kdmFsID0gKnBtZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvZmYsIG5yOwogCWludCByZXQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQocG1kX2xvY2twdHIobW0sIHBtZCkpOwpAQCAtNzEzLDUwICYjNDM7NzM1LDU0IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpOwogCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOwogCSAgICAhY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kdmFsLCBwYWdlLCB2bWEsIGZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAogCS8qIEF2b2lkIGR1bXBpbmcgaHVnZSB6ZXJvIHBhZ2UgKi8KIAlpZiAoKGZsYWdzICZhbXA7IEZPTExfRFVNUCkgJmFtcDsmYW1wOyBpc19odWdlX3plcm9fcG1kKHBtZHZhbCkpCi0JCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAocG1kX3Byb3Rub25lKCpwbWQpICZhbXA7JmFtcDsgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJaWYgKCFwbWRfd3JpdGUocG1kdmFsKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpCi0JCXJldHVybiBFUlJfUFRSKC1FTUxJTkspOwomIzQzOwkJcmV0dXJuIC1FTUxJTks7CiAKIAlWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgJmFtcDsgRk9MTF9QSU4pICZhbXA7JmFtcDsgUGFnZUFub24ocGFnZSkgJmFtcDsmYW1wOwogCQkJICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpOwogCi0JcmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpOwomIzQzOwlvZmYgPSBQRk5fRE9XTihhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7CiYjNDM7CW5yID0gbWluKEhQQUdFX1BNRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpOwomIzQzOwomIzQzOwlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpOwogCWlmIChyZXQpCi0JCXJldHVybiBFUlJfUFRSKHJldCk7CiYjNDM7CQlyZXR1cm4gcmV0OwogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCiAJaWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgRk9MTF9UT1VDSCkpCiAJCXRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgJmFtcDsgRk9MTF9XUklURSk7CiAjZW5kaWYJLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCiAKLQlwYWdlICYjNDM7PSAoYWRkciAmYW1wOyB+SFBBR0VfUE1EX01BU0spICZndDsmZ3Q7IFBBR0VfU0hJRlQ7Ci0JKnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7CiYjNDM7CXBhZ2UgJiM0Mzs9IG9mZjsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VzKQomIzQzOwkJcGFnZXNbMF0gPSBwYWdlOwogCi0JcmV0dXJuIHBhZ2U7CiYjNDM7CXJldHVybiBucjsKIH0KIAogI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqLwotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsCi0JCQkJICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewotCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKLQlyZXR1cm4gTlVMTDsKJiM0MzsJcmV0dXJuIDA7CiB9CiAjZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovCiAKQEAgLTc5OSwxMTAgJiM0Mzs4MjUsMjA1IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGVfdCBwdGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCXJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzOy8qCiYjNDM7ICogVGhlIGNhbGxlciBoYXMgYWxyZWFkeSBydW4gZXZlcnkgcGVyLVBURSBzYWZldHkgY2hlY2sgKHByZXNlbnQsCiYjNDM7ICogd3JpdGUtZmF1bHQsIGd1cF9tdXN0X3Vuc2hhcmUoKSkgb24gdGhlIFBURSwgc28gdGhpcyBvbmx5IGRvZXMgdGhlCiYjNDM7ICogcGVyLWZvbGlvIHdvcms6IHRoZSByZWZjb3VudCBncmFiLCB0aGUgRk9MTF9QSU4gYWNjZXNzaWJpbGl0eSBmYXVsdC1pbiwKJiM0MzsgKiBkaXJ0eS9hY2Nlc3NlZCBtYXJraW5nLCBhbmQgdGhlIGFycmF5IGZpbGwgd2l0aCB0aGUgY2FjaGUgZmx1c2guCiYjNDM7ICovCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfcHRlX2NvbW1pdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UsCiYjNDM7CQlwdGVfdCBwdGUsIHVuc2lnbmVkIGxvbmcgbnIsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCXN0cnVjdCBwYWdlICoqcGFnZXMpCiYjNDM7ewomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJLyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi8KJiM0MzsJcmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7CiYjNDM7CWlmICh1bmxpa2VseShyZXQpKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nCiYjNDM7CSAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZQomIzQzOwkgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy4KJiM0MzsJICovCiYjNDM7CWlmIChmbGFncyAmYW1wOyBGT0xMX1BJTikgewomIzQzOwkJcmV0ID0gYXJjaF9tYWtlX2ZvbGlvX2FjY2Vzc2libGUoZm9saW8pOwomIzQzOwkJaWYgKHJldCkgewomIzQzOwkJCWd1cF9wdXRfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7CiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlpZiAoZmxhZ3MgJmFtcDsgRk9MTF9UT1VDSCkgewomIzQzOwkJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIXB0ZV9kaXJ0eShwdGUpICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKQomIzQzOwkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwomIzQzOwkJLyoKJiM0MzsJCSAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZQomIzQzOwkJICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlCiYjNDM7CQkgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuCiYjNDM7CQkgKi8KJiM0MzsJCWZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pOwomIzQzOwl9CiYjNDM7CiYjNDM7CWd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZSwgbnIsIHBhZ2VzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVzb2x2ZSBvbmUgcHJlc2VudCBQVEUgdG8gdGhlIHBhZ2UgaXQgbWFwcy4gUmV0dXJucyBubyBwYWdlIGFuZCBubyBlcnJvcgomIzQzOyAqIHdoZW4gdGhlIFBURSBjYW5ub3QgYmUgZm9sbG93ZWQgYnV0IHRoZSBjYWxsZXIgbWF5IGZhdWx0IGl0IGluLCBhbmQgYQomIzQzOyAqIG5lZ2F0aXZlIGVycm5vIHdoZW4gdGhlIGNhbGxlciBtdXN0IHJlcG9ydCB0aGUgZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfb25lX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAomIzQzOwkJcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VwKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKLQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXNwaW5sb2NrX3QgKnB0bDsKLQlwdGVfdCAqcHRlcCwgcHRlOwotCWludCByZXQ7CiAKLQlwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmYW1wO3B0bCk7Ci0JaWYgKCFwdGVwKQotCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKLQlwdGUgPSBwdGVwX2dldChwdGVwKTsKJiM0MzsJKnBhZ2VwID0gTlVMTDsKJiM0MzsKIAlpZiAoIXB0ZV9wcmVzZW50KHB0ZSkpCi0JCWdvdG8gbm9fcGFnZTsKJiM0MzsJCXJldHVybiAwOwogCWlmIChwdGVfcHJvdG5vbmUocHRlKSAmYW1wOyZhbXA7ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSkKLQkJZ290byBub19wYWdlOwomIzQzOwkJcmV0dXJuIDA7CiAKIAlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyZXNzLCBwdGUpOwogCiAJLyoKIAkgKiBXZSBvbmx5IGNhcmUgYWJvdXQgYW5vbiBwYWdlcyBpbiBjYW5fZm9sbG93X3dyaXRlX3B0ZSgpLgogCSAqLwotCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOwotCSAgICAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSkgewotCQlwYWdlID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQomIzQzOwlpZiAoKGZsYWdzICZhbXA7IEZPTExfV1JJVEUpICZhbXA7JmFtcDsgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpCiYjNDM7CQlyZXR1cm4gMDsKIAogCWlmICh1bmxpa2VseSghcGFnZSkpIHsKIAkJaWYgKGZsYWdzICZhbXA7IEZPTExfRFVNUCkgewogCQkJLyogQXZvaWQgc3BlY2lhbCAobGlrZSB6ZXJvKSBwYWdlcyBpbiBjb3JlIGR1bXBzICovCi0JCQlwYWdlID0gRVJSX1BUUigtRUZBVUxUKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGlzX3plcm9fcGZuKHB0ZV9wZm4ocHRlKSkpIHsKLQkJCXBhZ2UgPSBwdGVfcGFnZShwdGUpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7Ci0JCQlwYWdlID0gRVJSX1BUUihyZXQpOwotCQkJZ290byBvdXQ7CiYjNDM7CQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KJiM0MzsJCWlmICghaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkKJiM0MzsJCQlyZXR1cm4gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7CiYjNDM7CQlwYWdlID0gcHRlX3BhZ2UocHRlKTsKIAl9Ci0JZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwogCi0JaWYgKCFwdGVfd3JpdGUocHRlKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpIHsKLQkJcGFnZSA9IEVSUl9QVFIoLUVNTElOSyk7Ci0JCWdvdG8gb3V0OwotCX0KJiM0MzsJaWYgKCFwdGVfd3JpdGUocHRlKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpCiYjNDM7CQlyZXR1cm4gLUVNTElOSzsKIAogCVZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyAmYW1wOyBGT0xMX1BJTikgJmFtcDsmYW1wOyBQYWdlQW5vbihwYWdlKSAmYW1wOyZhbXA7CiAJCQkgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7CiAKLQkvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqLwotCXJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCAxLCBmbGFncyk7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJcGFnZSA9IEVSUl9QVFIocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQomIzQzOwkqcGFnZXAgPSBwYWdlOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkvKgotCSAqIFdlIG5lZWQgdG8gbWFrZSB0aGUgcGFnZSBhY2Nlc3NpYmxlIGlmIGFuZCBvbmx5IGlmIHdlIGFyZSBnb2luZwotCSAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZQotCSAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLgotCSAqLwotCWlmIChmbGFncyAmYW1wOyBGT0xMX1BJTikgewotCQlyZXQgPSBhcmNoX21ha2VfZm9saW9fYWNjZXNzaWJsZShmb2xpbyk7Ci0JCWlmIChyZXQpIHsKLQkJCXVucGluX3VzZXJfcGFnZShwYWdlKTsKLQkJCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKJiM0MzsvKgomIzQzOyAqIFJldHVybiBob3cgbWFueSBQVEVzIG1hcCBjb25zZWN1dGl2ZSBwYWdlcyBvZiB0aGUgc2FtZSBmb2xpbyBhbmQgY2FuIGJlCiYjNDM7ICogY29tbWl0dGVkIGFzIG9uZSBydW4uIEFsd2F5cyBhdCBsZWFzdCAxLgomIzQzOyAqCiYjNDM7ICogVGhlIHdyaXRlLWZhdWx0IGFuZCB1bnNoYXJlIGNoZWNrcyBpbiBmb2xsb3dfb25lX3B0ZSgpIGFyZSBwZXIgUFRFLCBidXQgYQomIzQzOyAqIHdyaXRhYmxlIHJ1biBuZWVkcyBubyByZXBlYXQ6IGEgd3JpdGFibGUgYW5vbiBwYWdlIGlzIGV4Y2x1c2l2ZS4gQSByZWFkLW9ubHkKJiM0MzsgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5cwomIzQzOyAqIG9uZSBwYWdlIGF0IGEgdGltZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHdhbGtfZW5kLAomIzQzOwkJc3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgKnB0ZXAsIHB0ZV90ICpiYXRjaF9wdGUsIHVuc2lnbmVkIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbWF4OwomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmICghcHRlX3dyaXRlKCpiYXRjaF9wdGUpICZhbXA7JmFtcDsgKGZsYWdzICZhbXA7IChGT0xMX1dSSVRFIHwgRk9MTF9QSU4pKSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwltYXggPSAod2Fsa19lbmQgLSBhZGRyZXNzKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwlpZiAobWF4ICZsdDs9IDEpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogTWVyZ2UgeW91bmcvZGlydHkgYWNyb3NzIGJhdGNoIHNvIGZvbGlvX21hcmtfZGlydHkgc2VlcyBhbnkgZGlydHkuICovCiYjNDM7CXJldHVybiBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoZm9saW8sIHZtYSwgcHRlcCwgYmF0Y2hfcHRlLCBtYXgsCiYjNDM7CQkJCSAgICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfTUVSR0VfWU9VTkdfRElSVFkpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsCiYjNDM7ICogd2hpY2hldmVyIGNvbWVzIGZpcnN0LCBhbmQgY29tbWl0IGV2ZXJ5IHBhZ2UgZm91bmQuCiYjNDM7ICoKJiM0MzsgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdAomIzQzOyAqIGlzIGEgc2hvcnQgcmVhZDsgX19nZXRfdXNlcl9wYWdlcygpIHJldHJ5aW5nIHRoZSByZWFkIHdpbGwgZ2V0IHRoZSBlcnJvci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQomIzQzO3sKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwlib29sIG5lZWRfbm9fcGFnZV90YWJsZSA9IGZhbHNlOwomIzQzOwlwdGVfdCAqcHRlcCwgKm9yaWdfcHRlcDsKJiM0MzsJdW5zaWduZWQgbG9uZyB3YWxrX2VuZDsKJiM0MzsJdW5zaWduZWQgbG9uZyBuciA9IDA7CiYjNDM7CXNwaW5sb2NrX3QgKnB0bDsKJiM0MzsJbG9uZyByZXQgPSAwOwomIzQzOwomIzQzOwlvcmlnX3B0ZXAgPSBwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmYW1wO3B0bCk7CiYjNDM7CWlmICghcHRlcCkKJiM0MzsJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwomIzQzOwl3YWxrX2VuZCA9IG1pbihwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSwgdm1hLSZndDt2bV9lbmQpOwomIzQzOwomIzQzOwlmb3IgKDsgYWRkcmVzcyAmbHQ7IHdhbGtfZW5kOyBhZGRyZXNzICYjNDM7PSBQQUdFX1NJWkUsIHB0ZXAmIzQzOyYjNDM7KSB7CiYjNDM7CQlwdGVfdCBwdGUgPSBwdGVwX2dldChwdGVwKTsKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwomIzQzOwkJcmV0ID0gZm9sbG93X29uZV9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBwdGUsIGZsYWdzLCAmYW1wO3BhZ2UpOwomIzQzOwkJaWYgKCFyZXQgJmFtcDsmYW1wOyBwYWdlKSB7CiYjNDM7CQkJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBiYXRjaDsKJiM0MzsKJiM0MzsJCQlwdGVfdCBiYXRjaF9wdGUgPSBwdGU7CiYjNDM7CiYjNDM7CQkJYmF0Y2ggPSBmb2xsb3dfcHRlX2JhdGNoKHZtYSwgYWRkcmVzcywgd2Fsa19lbmQsIGZvbGlvLAomIzQzOwkJCQkJCSBwdGVwLCAmYW1wO2JhdGNoX3B0ZSwgZmxhZ3MpOwomIzQzOwkJCXJldCA9IGZvbGxvd19wYWdlX3B0ZV9jb21taXQodm1hLCBhZGRyZXNzLCBmb2xpbywgcGFnZSwKJiM0MzsJCQkJCQkgICAgIGJhdGNoX3B0ZSwgYmF0Y2gsIGZsYWdzLAomIzQzOwkJCQkJCSAgICAgcGFnZXMgPyBwYWdlcyAmIzQzOyBuciA6IE5VTEwpOwomIzQzOwkJCWlmICghcmV0KSB7CiYjNDM7CQkJCW5yICYjNDM7PSBiYXRjaDsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogVGhlIGxvb3AmIzM5O3Mgb3duIGluY3JlbWVudCBjb3ZlcnMgb25lIFBURTsgc2tpcAomIzQzOwkJCQkgKiB0aGUgcmVzdCBvZiB0aGUgYmF0Y2guCiYjNDM7CQkJCSAqLwomIzQzOwkJCQlwdGVwICYjNDM7PSBiYXRjaCAtIDE7CiYjNDM7CQkJCWFkZHJlc3MgJiM0Mzs9IChiYXRjaCAtIDEpICogUEFHRV9TSVpFOwomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQl9CiAJCX0KLQl9Ci0JaWYgKGZsYWdzICZhbXA7IEZPTExfVE9VQ0gpIHsKLQkJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7Ci0JCSAgICAhcHRlX2RpcnR5KHB0ZSkgJmFtcDsmYW1wOyAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpCi0JCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKJiM0MzsKIAkJLyoKLQkJICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlCi0JCSAqIGlzIG5lZWRlZCB0byBhdm9pZCBsb3NpbmcgdGhlIGRpcnR5IGJpdDogaXQgaXMgZWFzaWVyIHRvIHVzZQotCQkgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuCiYjNDM7CQkgKiBub19wYWdlX3RhYmxlKCkgbWF5IGxvb2sgdXAgdGhlIHBhZ2UgY2FjaGUsIHNvIGl0IGNhbm5vdCBydW4KJiM0MzsJCSAqIHVuZGVyIHRoZSBQVEUgbG9jay4KIAkJICovCi0JCWZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pOwomIzQzOwkJaWYgKCFyZXQgJmFtcDsmYW1wOyBwdGVfbm9uZShwdGUpKQomIzQzOwkJCW5lZWRfbm9fcGFnZV90YWJsZSA9IHRydWU7CiYjNDM7CQlicmVhazsKIAl9Ci1vdXQ6Ci0JcHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpOwotCXJldHVybiBwYWdlOwotbm9fcGFnZToKLQlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Ci0JaWYgKCFwdGVfbm9uZShwdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKJiM0MzsKJiM0MzsJcHRlX3VubWFwX3VubG9jayhvcmlnX3B0ZXAsIHB0bCk7CiYjNDM7CiYjNDM7CWlmIChucikKJiM0MzsJCXJldHVybiBucjsKJiM0MzsJaWYgKG5lZWRfbm9fcGFnZV90YWJsZSkKJiM0MzsJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcG1kX3QgKnBtZCwgcG1kdmFsOwogCXNwaW5sb2NrX3QgKnB0bDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJbG9uZyByZXQ7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwogCiAJcG1kID0gcG1kX29mZnNldChwdWRwLCBhZGRyZXNzKTsKQEAgLTkxMiw3ICYjNDM7MTAzMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCWlmICghcG1kX3ByZXNlbnQocG1kdmFsKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpCi0JCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTsKIAogCWlmIChwbWRfcHJvdG5vbmUocG1kdmFsKSAmYW1wOyZhbXA7ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CkBAIC05MjUsMjggJiM0MzsxMDQ2LDM1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCX0KIAlpZiAodW5saWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKSB7CiAJCXNwaW5fdW5sb2NrKHB0bCk7Ci0JCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTsKIAl9CiAJaWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgRk9MTF9TUExJVF9QTUQpKSB7CiAJCXNwaW5fdW5sb2NrKHB0bCk7CiAJCXNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTsKIAkJLyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqLwotCQlyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gRVJSX1BUUigtRU5PTUVNKSA6Ci0JCQlmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyAtRU5PTUVNIDoKJiM0MzsJCQlmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTsKIAl9Ci0JcGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CXJldCA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCXNwaW5fdW5sb2NrKHB0bCk7Ci0JcmV0dXJuIHBhZ2U7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbCB0aGUKJiM0MzsJICogYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBwbWQgbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChyZXQgJmd0OyAwICZhbXA7JmFtcDsgcGFnZXMpCiYjNDM7CQlndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcDRkX3QgKnA0ZHAsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHA0ZF90ICpwNGRwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXB1ZF90ICpwdWRwLCBwdWQ7CiAJc3BpbmxvY2tfdCAqcHRsOwotCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlsb25nIHJldDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAKIAlwdWRwID0gcHVkX29mZnNldChwNGRwLCBhZGRyZXNzKTsKQEAgLTk1NSwyMiAmIzQzOzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwogCWlmIChwdWRfbGVhZihwdWQpKSB7CiAJCXB0bCA9IHB1ZF9sb2NrKG1tLCBwdWRwKTsKLQkJcGFnZSA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spOwomIzQzOwkJcmV0ID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpOwogCQlzcGluX3VubG9jayhwdGwpOwotCQlpZiAocGFnZSkKLQkJCXJldHVybiBwYWdlOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbAomIzQzOwkJICogdGhlIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgbG9jay4gQSAxIEdCIGZvbGlvCiYjNDM7CQkgKiBjYW4gYmUgdXAgdG8gSFBBR0VfUFVEX05SIHBhZ2VzLCB0b28gbG9uZyB0byBmbHVzaCB1bmRlciBhCiYjNDM7CQkgKiBzcGlubG9jay4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHJldCAmZ3Q7IDAgJmFtcDsmYW1wOyBwYWdlcykKJiM0MzsJCQlndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJfQogCWlmICh1bmxpa2VseShwdWRfYmFkKHB1ZCkpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAotCXJldHVybiBmb2xsb3dfcG1kX21hc2sodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBnZF90ICpwZ2RwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXA0ZF90ICpwNGRwLCBwNGQ7CiAKQEAgLTk4MSwxNSAmIzQzOzExMTYsMTggQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJaWYgKCFwNGRfcHJlc2VudChwNGQpIHx8IHA0ZF9iYWQocDRkKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAKLQlyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgcDRkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CXJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHA0ZHAsIGZsYWdzLCBwYWdlcyk7CiB9CiAKIC8qKgotICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzCiYjNDM7ICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgcGFnZXMgYXQgYSB1c2VyLXZpcnR1YWwgYWRkcmVzcwogICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzcwogICogQGFkZHJlc3M6IHZpcnR1YWwgYWRkcmVzcyB0byBsb29rIHVwCiYjNDM7ICogQGVuZDogdmlydHVhbCBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0b3AgYmF0Y2hpbmcgY29udGlndW91cyBwYWdlcwogICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91cgotICogQHBhZ2VfbWFzazogYSBwb2ludGVyIHRvIG91dHB1dCBwYWdlX21hc2sKJiM0MzsgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG8KJiM0MzsgKiAgICAgICAgIHdhbGsgdGhlIHBhZ2UgdGFibGVzIChlLmcuIHRvIGZhdWx0IHBhZ2VzIGluKSB3aXRob3V0IGNvbGxlY3RpbmcKJiM0MzsgKiAgICAgICAgIG9yIHJlZmNvdW50aW5nIHRoZW0KICAqCiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluICZsdDtsaW51eC9tbS5oJmd0OwogICoKQEAgLTk5OCwzMyAmIzQzOzExMzYsMzIgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAgKiB0cmlnZ2VyIGEgZmF1bHQgd2l0aCBGQVVMVF9GTEFHX1VOU0hBUkUgc2V0LiBOb3RlIHRoYXQgdW5zaGFyaW5nIGlzIG9ubHkKICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLgogICoKLSAqIE9uIG91dHB1dCwgQHBhZ2VfbWFzayBpcyBzZXQgYWNjb3JkaW5nIHRvIHRoZSBzaXplIG9mIHRoZSBwYWdlLgotICoKLSAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvcgotICogYW4gZXJyb3IgcG9pbnRlciBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZAotICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLgomIzQzOyAqIFJldHVybjogdGhlIG51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIHRoYXQgd2VyZQomIzQzOyAqIHBsYWNlZCBpbnRvIEBwYWdlcyAoaWYgbm9uLU5VTEwpLCB3aGljaCBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgcGFnZXMKJiM0MzsgKiByZXF1ZXN0ZWQgdmlhIEBlbmQ7IDAgaWYgbm8gbWFwcGluZyBleGlzdHMgYXQgQGFkZHJlc3M7IG9yIGEgbmVnYXRpdmUKJiM0MzsgKiBlcnJubyBmb3IgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWQgYnkgYSBwYWdlIGRlc2NyaXB0b3IKJiM0MzsgKiAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXBnZF90ICpwZ2Q7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwotCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlsb25nIHJldDsKIAogCXZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTsKIAotCSpwYWdlX21hc2sgPSAwOwogCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpOwogCiAJaWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKQotCQlwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKJiM0MzsJCXJldCA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJZWxzZQotCQlwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJCXJldCA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgcGFnZXMpOwogCiAJdm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTsKIAotCXJldHVybiBwYWdlOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKQEAgLTEzNTgsNyAmIzQzOzE0OTUsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogewogCWxvbmcgcmV0ID0gMCwgaSA9IDA7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDsKIAogCWlmICghbnJfcGFnZXMpCiAJCXJldHVybiAwOwpAQCAtMTM3Myw3ICYjNDM7MTUwOSw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAlkbyB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwotCQl1bnNpZ25lZCBpbnQgcGFnZV9pbmNyZW07CiYjNDM7CQlsb25nIG5yOwogCiAJCS8qIGZpcnN0IGl0ZXJhdGlvbiBvciBjcm9zcyB2bWEgYm91bmQgKi8KIAkJaWYgKCF2bWEgfHwgc3RhcnQgJmd0Oz0gdm1hLSZndDt2bV9lbmQpIHsKQEAgLTE0MDAsOCAmIzQzOzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJCXBhZ2VzID8gJmFtcDtwYWdlIDogTlVMTCk7CiAJCQkJaWYgKHJldCkKIAkJCQkJZ290byBvdXQ7Ci0JCQkJcGFnZV9tYXNrID0gMDsKLQkJCQlnb3RvIG5leHRfcGFnZTsKJiM0MzsJCQkJZ3VwX2ZpbGxfcGFnZXModm1hLCBzdGFydCwgcGFnZSwgMSwKJiM0MzsJCQkJCSAgICAgICBwYWdlcyA/IHBhZ2VzICYjNDM7IGkgOiBOVUxMKTsKJiM0MzsJCQkJaSYjNDM7JiM0Mzs7CiYjNDM7CQkJCXN0YXJ0ICYjNDM7PSBQQUdFX1NJWkU7CiYjNDM7CQkJCW5yX3BhZ2VzLS07CiYjNDM7CQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlpZiAoIXZtYSkgewpAQCAtMTQyMywxMCAmIzQzOzE1NjMsMTEgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJfQogCQljb25kX3Jlc2NoZWQoKTsKIAotCQlwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsICZhbXA7cGFnZV9tYXNrKTsKLQkJaWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykgewomIzQzOwkJbnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFLAomIzQzOwkJCQkgICAgICBndXBfZmxhZ3MsIHBhZ2VzID8gJmFtcDtwYWdlc1tpXSA6IE5VTEwpOwomIzQzOwkJaWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7CiAJCQlyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLAotCQkJCQkgICBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkssIGxvY2tlZCk7CiYjNDM7CQkJCQkgICBuciA9PSAtRU1MSU5LLCBsb2NrZWQpOwogCQkJc3dpdGNoIChyZXQpIHsKIAkJCWNhc2UgMDoKIAkJCQlnb3RvIHJldHJ5OwpAQCAtMTQ0MCw3MCAmIzQzOzE1ODEsMzAgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCUJVRygpOwotCQl9IGVsc2UgaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVFWElTVCkgewomIzQzOwkJfSBlbHNlIGlmIChuciA9PSAtRUVYSVNUKSB7CiAJCQkvKgogCQkJICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZwogCQkJICogc3RydWN0IHBhZ2UuIElmIHRoZSBjYWxsZXIgZXhwZWN0cyAqKnBhZ2VzIHRvIGJlCiAJCQkgKiBmaWxsZWQgaW4sIGJhaWwgb3V0IG5vdywgYmVjYXVzZSB0aGF0IGNhbiYjMzk7dCBiZSBkb25lCi0JCQkgKiBmb3IgdGhpcyBwYWdlLgomIzQzOwkJCSAqIGZvciB0aGlzIHBhZ2UuIE90aGVyd2lzZSBhZHZhbmNlIGJ5IHRoZSBvbmUgcGFnZQomIzQzOwkJCSAqIGZvbGxvd19wYWdlX21hc2soKSBsb29rZWQgYXQuCiAJCQkgKi8KIAkJCWlmIChwYWdlcykgewotCQkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiYjNDM7CQkJCXJldCA9IG5yOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKElTX0VSUihwYWdlKSkgewotCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKJiM0MzsJCQluciA9IDE7CiYjNDM7CQl9IGVsc2UgaWYgKG5yICZsdDsgMCkgewomIzQzOwkJCXJldCA9IG5yOwogCQkJZ290byBvdXQ7CiAJCX0KLW5leHRfcGFnZToKLQkJcGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0ICZndDsmZ3Q7IFBBR0VfU0hJRlQpICZhbXA7IHBhZ2VfbWFzayk7Ci0JCWlmIChwYWdlX2luY3JlbSAmZ3Q7IG5yX3BhZ2VzKQotCQkJcGFnZV9pbmNyZW0gPSBucl9wYWdlczsKLQotCQlpZiAocGFnZXMpIHsKLQkJCXN0cnVjdCBwYWdlICpzdWJwYWdlOwotCQkJdW5zaWduZWQgaW50IGo7CiAKLQkJCS8qCi0JCQkgKiBUaGlzIG11c3QgYmUgYSBsYXJnZSBmb2xpbyAoYW5kIGRvZXNuJiMzOTt0IG5lZWQgdG8KLQkJCSAqIGJlIHRoZSB3aG9sZSBmb2xpbzsgaXQgY2FuIGJlIHBhcnQgb2YgaXQpLCBkbwotCQkJICogdGhlIHJlZmNvdW50IHdvcmsgZm9yIGFsbCB0aGUgc3VicGFnZXMgdG9vLgotCQkJICoKLQkJCSAqIE5PVEU6IGhlcmUgdGhlIHBhZ2UgbWF5IG5vdCBiZSB0aGUgaGVhZCBwYWdlCi0JCQkgKiBlLmcuIHdoZW4gc3RhcnQgYWRkciBpcyBub3QgdGhwLXNpemUgYWxpZ25lZC4KLQkJCSAqIHRyeV9ncmFiX2ZvbGlvKCkgc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0YWlsCi0JCQkgKiBwYWdlcy4KLQkJCSAqLwotCQkJaWYgKHBhZ2VfaW5jcmVtICZndDsgMSkgewotCQkJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCi0JCQkJLyoKLQkJCQkgKiBTaW5jZSB3ZSBhbHJlYWR5IGhvbGQgcmVmY291bnQgb24gdGhlCi0JCQkJICogbGFyZ2UgZm9saW8sIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCi0JCQkJICovCi0JCQkJaWYgKHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCBwYWdlX2luY3JlbSAtIDEsCi0JCQkJCQkgICBndXBfZmxhZ3MpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFJlbGVhc2UgdGhlIDFzdCBwYWdlIHJlZiBpZiB0aGUKLQkJCQkJICogZm9saW8gaXMgcHJvYmxlbWF0aWMsIGZhaWwgaGFyZC4KLQkJCQkJICovCi0JCQkJCWd1cF9wdXRfZm9saW8oZm9saW8sIDEsIGd1cF9mbGFncyk7Ci0JCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChqID0gMDsgaiAmbHQ7IHBhZ2VfaW5jcmVtOyBqJiM0MzsmIzQzOykgewotCQkJCXN1YnBhZ2UgPSBwYWdlICYjNDM7IGo7Ci0JCQkJcGFnZXNbaSAmIzQzOyBqXSA9IHN1YnBhZ2U7Ci0JCQkJZmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgc3RhcnQgJiM0MzsgaiAqIFBBR0VfU0laRSk7Ci0JCQkJZmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7Ci0JCQl9Ci0JCX0KJiM0MzsJCS8qIENoZWNrIHRoYXQgd2UgZGlkbiYjMzk7dCBwaW4gbW9yZSBwYWdlcyB0aGFuIHRoZSBjYWxsZXIgd2lsbCBmcmVlLiAqLwomIzQzOwkJVk1fV0FSTl9PTl9PTkNFKG5yICZndDsgbnJfcGFnZXMpOwogCi0JCWkgJiM0Mzs9IHBhZ2VfaW5jcmVtOwotCQlzdGFydCAmIzQzOz0gcGFnZV9pbmNyZW0gKiBQQUdFX1NJWkU7Ci0JCW5yX3BhZ2VzIC09IHBhZ2VfaW5jcmVtOwomIzQzOwkJaSAmIzQzOz0gbnI7CiYjNDM7CQlzdGFydCAmIzQzOz0gbnIgKiBQQUdFX1NJWkU7CiYjNDM7CQlucl9wYWdlcyAtPSBucjsKIAl9IHdoaWxlIChucl9wYWdlcyk7CiBvdXQ6CiAJcmV0dXJuIGkgPyBpIDogcmV0Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4OQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDQ3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipHVVAgUmVmYWN0b3JpbmcgYW5kIEZ1enppbmcgQ29uc2lkZXJhdGlvbnMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7WWVzLCB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIHRob3JvdWdoIGxvb2sgZm9yIGZ1enppbmcgcG90ZW50aWFsLiYjMzQ7IFRoaXMgcGF0Y2ggaXMgY2xlYXJseSB0b3VjaGluZyB0aGUgR1VQIChHZXQgVXNlciBQYWdlcykgY29kZSwgc3BlY2lmaWNhbGx5IGBtbS9ndXAuY2AsIGFuZCB0aGF0JiMzOTtzIGEgcmVkIGZsYWcgaW4gYSBnb29kIHdheSwgbWVhbmluZyBpdOKAmXMgYSBoaWdoLWltcGFjdCBhcmVhLiBUaGlzIGlzbiYjMzk7dCBzb21lIG1pbm9yIHR3ZWFrOyBpdCYjMzk7cyBhIGZ1bmRhbWVudGFsIHJlZmFjdG9yaW5nIG9mIGhvdyBHVVAgd29ya3MuIFRoZXkmIzM5O3JlIGNoYW5naW5nIHRoZSByZXR1cm4gdmFsdWVzIGFuZCBwb3B1bGF0aW9uIG9mIHRoZSBgcGFnZXNgIGFycmF5LCB3aGljaCBpbiB0dXJuIG1lYW5zIHRoZSBjb3JlIGxvZ2ljIGZvciB0cmFuc2xhdGluZyB1c2VyIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHBoeXNpY2FsIHBhZ2VzIGlzIGJlaW5nIG1vZGlmaWVkLiBXZSBuZWVkIHRvIGFzc2VzcyB0aGUgZnV6emluZyBhdHRhY2sgc3VyZmFjZS4KClRoZXkmIzM5O3JlIHRha2luZyBgc3RydWN0IHBhZ2UgKmAgYW5kIGBwYWdlX21hc2tgIGFuZCBtb3ZpbmcgdG8gcmV0dXJuaW5nIGEgYGxvbmdgIHZhbHVlIChjb3VudCBvZiBwYWdlcyBvciBlcnJvcikgYW5kIGRpcmVjdGx5IGZpbGxpbmcgdGhlIGBwYWdlc2AgYXJyYXkuIEEgc2VyaW91cyBjaGFuZ2UgdG8gYSBmdW5kYW1lbnRhbCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gbGlrZSB0aGlzIGRlbWFuZHMgc2NydXRpbnkuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgc2hpZnQgaW4gdGhlICp3YXkqIHdlIGdldCB1c2VyIHBhZ2VzLgoKTG9va2luZyBhdCB0aGUgY2hhbmdlZCBmdW5jdGlvbnMuLi4geWVhaCwgdGhpcyBpcyBzaWduaWZpY2FudDogYG5vX3BhZ2VfdGFibGVgLCBgZ3VwX2ZpbGxfcGFnZXNgLCBgZm9sbG93X2h1Z2VfcHVkYCwgYGZvbGxvd19odWdlX3BtZGAsIHRoZSBuZXcgY29tbWl0IGZ1bmN0aW9ucywgYW5kIG9mIGNvdXJzZSwgdGhlIG1hc2sgZnVuY3Rpb25zLiBUaGlzIGlzIEdVUCBsb2dpYywgdG91Y2hpbmcgc2V2ZXJhbCBrZXkgY29tcG9uZW50cyBvZiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LgoKU28sIHRoZSBuZXh0IHN0ZXAgaXMgdG8gbmFpbCBkb3duIHRoZSBtb3N0IGNyaXRpY2FsIGZ1bmN0aW9ucyBmb3IgZnV6emluZy4gYF9fZ2V0X3VzZXJfcGFnZXNgIG1pZ2h0IGJlIHRvbyBnZW5lcmFsLCBidXQgYGZvbGxvd19wYWdlX21hc2tgLCBgZm9sbG93X3BhZ2VfcHRlYCwgYGZvbGxvd19wbWRfbWFza2AsIGBmb2xsb3dfcHVkX21hc2tgLCBhbmQgYGZvbGxvd19wNGRfbWFza2AgYWxsIGxvb2sgbGlrZSBwcmltZSB0YXJnZXRzLiBUaGUgbWFzayBmdW5jdGlvbnMgYXJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBiZWNhdXNlIHRoZXkgZGVhbCB3aXRoIHZhcmlvdXMgcGFnZSB0YWJsZSBsZXZlbHMsIGFuZCBzdWJ0bGUgZXJyb3JzIGluIHRob3NlIGNhbiBsZWFkIHRvIHNpZ25pZmljYW50IGlzc3Vlcy4KCkZpbmFsbHksIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gU2luY2UgdGhlIHBhdGNoIGlzIGluIGBtbS9ndXAuY2AsIHRoZSBjb2RlIHdpbGwgYWx3YXlzIGJlIGNvbXBpbGVkLCBob3dldmVyIHNvbWUgcGFydHMgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgYENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU2AgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIHNob3VsZCBwdWxsIHVwIHRoZSB0cmVlIGFuZCBjaGVjay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ndXAuYz02MzY9c3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi0tXG5tbS9ndXAuYy02NTItXG5tbS9ndXAuYzo2NTM6I2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xubW0vZ3VwLmMtNjU0LS8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQVURzIGluIENPVyBtYXBwaW5ncy4gKi9cbi0tXG5tbS9ndXAuYz03MjM9c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTc3Mi1cbm1tL2d1cC5jOjc3MzojZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXG5tbS9ndXAuYy03NzQtc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jPTc4MT1zdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtNzg2LX1cbm1tL2d1cC5jOjc4NzojZW5kaWZcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xubW0vZ3VwLmMtNzg4LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMzg4CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlcyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gRmlyc3Qgb3JkZXIgb2YgYnVzaW5lc3M6IEkgbmVlZCB0byB2ZXJpZnkgdGhlIHN0YXR1cyBvZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhpcyBpcyBmdW5kYW1lbnRhbC4gRGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQmIzM5O3MgZW5hYmxlZCBvciBub3QsIGl0IGRpY3RhdGVzIGEgaHVnZSBzd2F0aCBvZiB0aGUga2VybmVsJiMzOTtzIG1lbW9yeSBtYW5hZ2VtZW50IGJlaGF2aW9yLCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MsIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zIHdpdGggb3RoZXIgc3Vic3lzdGVtcy4gSSBuZWVkIHRvIGtub3cgd2hlcmUgd2Ugc3RhbmQuIEEgcXVpY2sgY2hlY2sgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgYWJzb2x1dGVseSBlc3NlbnRpYWwgYmVmb3JlIHByb2NlZWRpbmcuIEFyZSBUSFBzIGVuYWJsZWQgb3IgaXMgdGhlcmUgc29tZXRoaW5nIGVsc2UgZ29pbmcgb24/CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZ3VwLmM9NzIzPXN0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy03NTktXG5tbS9ndXAuYzo3NjA6I2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vZ3VwLmMtNzYxLVx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkpXG5tbS9ndXAuYy03NjItXHRcdHRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpO1xubW0vZ3VwLmM6NzYzOiNlbmRpZlx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXG5tbS9ndXAuYy03NjQtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3NTUKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgSHVnZSBQYWdlIENvbmZpZ3VyYXRpb24gZm9yIEdVUCBUZXN0aW5nKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBjb25maWd1cmF0aW9ucyBhbmQgdGhpbmtpbmcsICYjMzQ7WWVwLCB0aGVzZSBhcmUgZGVmaW5pdGVseSB0aGUgcmlnaHQgc2V0dGluZ3MgdG8gaGF2ZSBlbmFibGVkIHdoZW4gdGVzdGluZyBodWdlIHBhZ2VzIGluIEdVUC4mIzM0OyBJdCYjMzk7cyBnb29kIHRvIGJlIG1ldGljdWxvdXMgYWJvdXQgdGhpcyBzdHVmZi4gKlRSQU5TUEFSRU5UX0hVR0VQQUdFKiBpcyBhIGdpdmVuOyB0aGF0JiMzOTtzIHRoZSBicmVhZCBhbmQgYnV0dGVyIGZvciB0cmFuc3BhcmVudCBodWdlIHBhZ2Ugc3VwcG9ydCwgbm8gc3VycHJpc2VzIHRoZXJlLiBOb3csICpQR1RBQkxFX0hBU19IVUdFX0xFQVZFUyogaXMgdGhlIG1vcmUgaW50ZXJlc3Rpbmcgb25lLiBUaGF0JiMzOTtzIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQsIHNvIEkgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgY2FuIGVuYWJsZSB0aGlzIG9uZSBkaXJlY3RseSwgb3IgaWYgdGhlIGFyY2hpdGVjdHVyZSB3aWxsIHNlbGVjdCB0aGlzIGl0c2VsZi4gSSYjMzk7bSBnb2luZyB0byBkaWcgYSBsaXR0bGUgZGVlcGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBQR1RBQkxFX0hBU19IVUdFX0xFQVZFUyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTEwMDg9Y29uZmlnIFBBR0VfTUFQQ09VTlRcbi0tXG5tbS9LY29uZmlnLTEwMTMtI1xubW0vS2NvbmZpZzoxMDE0OmNvbmZpZyBQR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xubW0vS2NvbmZpZy0xMDE1LVx0ZGVmX2Jvb2wgVFJBTlNQQVJFTlRfSFVHRVBBR0UgfHwgSFVHRVRMQl9QQUdFXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMwOTgKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiA3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uIGZvciBIdWdlIFBhZ2VzKioKCk9rYXksIHNvIEkgc2VlIHRoYXQgYFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTYCBpcyBkZWZpbmVkIGFzIGVpdGhlciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIG9yIGBIVUdFVExCX1BBR0VgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGl0JiMzOTtzIGEgbG9naWNhbCBjb25uZWN0aW9uLiBDb25zaWRlcmluZyB0aGlzLCB0aGUgb2J2aW91cyBhcHByb2FjaCBpcyB0byBtYWtlIHN1cmUgKmJvdGgqIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCX1BBR0VgIGFyZSBlbmFibGVkLiBJdCYjMzk7cyB0aGUgbW9zdCByb2J1c3Qgc29sdXRpb24uIExldCYjMzk7cyBkaWcgaW50byB0aGUgYEhVR0VUTEJfUEFHRWAgb3B0aW9uIGluIHRoZSBLY29uZmlnIGZpbGUgYW5kIHZlcmlmeSBpdHMgc3RhdHVzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3MgaW4gcGxhY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBIVUdFVExCX1BBR0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9zaC9tbS9LY29uZmlnPTE1OD1jaG9pY2Vcbi0tXG5hcmNoL3NoL21tL0tjb25maWctMTYzLVxuYXJjaC9zaC9tbS9LY29uZmlnOjE2NDpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRLXG5hcmNoL3NoL21tL0tjb25maWctMTY1LVx0Ym9vbCBcJiMzNDs2NGtCXCYjMzQ7XG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE2Ny1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNjg6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzI1NktcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNjktXHRib29sIFwmIzM0OzI1NmtCXCYjMzQ7XG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE3MS1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzI6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzFNQlxuYXJjaC9zaC9tbS9LY29uZmlnLTE3My1cdGJvb2wgXCYjMzQ7MU1CXCYjMzQ7XG5hcmNoL3NoL21tL0tjb25maWctMTc0LVxuYXJjaC9zaC9tbS9LY29uZmlnOjE3NTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNE1CXG5hcmNoL3NoL21tL0tjb25maWctMTc2LVx0Ym9vbCBcJiMzNDs0TUJcJiMzNDtcbi0tXG5hcmNoL3NoL21tL0tjb25maWctMTc4LVxuYXJjaC9zaC9tbS9LY29uZmlnOjE3OTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRNQlxuYXJjaC9zaC9tbS9LY29uZmlnLTE4MC1cdGJvb2wgXCYjMzQ7NjRNQlwmIzM0O1xuLS1cbmZzL0tjb25maWc9MjYyPWlmIEhVR0VUTEJGU1xuZnMvS2NvbmZpZzoyNjM6Y29uZmlnIEhVR0VUTEJfUEFHRV9PUFRJTUlaRV9WTUVNTUFQX0RFRkFVTFRfT05cbmZzL0tjb25maWctMjY0LVx0Ym9vbCBcJiMzNDtIdWdlVExCIFZtZW1tYXAgT3B0aW1pemF0aW9uIChIVk8pIGRlZmF1bHRzIHRvIG9uXCYjMzQ7XG4tLVxuZnMvS2NvbmZpZz0yNzE9ZW5kaWYgIyBIVUdFVExCRlNcbmZzL0tjb25maWctMjcyLVxuZnMvS2NvbmZpZzoyNzM6Y29uZmlnIEhVR0VUTEJfUEFHRVxuZnMvS2NvbmZpZy0yNzQtXHRkZWZfYm9vbCBIVUdFVExCRlNcbi0tXG5mcy9LY29uZmlnLTI3Ni1cbmZzL0tjb25maWc6Mjc3OmNvbmZpZyBIVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUFxuZnMvS2NvbmZpZy0yNzgtXHRkZWZfYm9vbCBIVUdFVExCX1BBR0Vcbi0tXG5tbS9LY29uZmlnPTcwNj1jb25maWcgQVJDSF9FTkFCTEVfVEhQX01JR1JBVElPTlxuLS1cbm1tL0tjb25maWctNzA4LVxubW0vS2NvbmZpZzo3MDk6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFX1ZBUklBQkxFXG5tbS9LY29uZmlnLTcxMC1cdGRlZl9ib29sIG5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5MzAKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFbmFibGluZyBIdWdlIFBhZ2VzIGFuZCB0aGUgRmlsZXN5c3RlbSoqCgpPa2F5LCBzbyBgSFVHRVRMQl9QQUdFYCBpcyBkZWZpbmVkIGFzIGEgYm9vbGVhbiAoYGRlZl9ib29sYCkgYW5kIGxpbmtlZCBkaXJlY3RseSB0byBgSFVHRVRMQkZTYC4gVGhpcyBzZWVtcyBzdHJhaWdodGZvcndhcmQ6IElmIHdlIHdhbnQgdG8gdXNlIGh1Z2UgcGFnZXMsIHdlIGRlZmluaXRlbHkgbmVlZCB0aGUgaHVnZSBwYWdlIGZpbGVzeXN0ZW0gKGBIVUdFVExCRlNgKSBlbmFibGVkLiBJdCYjMzk7cyBhIGRlcGVuZGVuY3kuIE1ha2VzIHNlbnNlLgoKTm93LCBsZXQmIzM5O3MganVzdCBjb25maXJtIHNvbWV0aGluZyBhYm91dCBob3cgdHJhbnNwYXJlbnQgaHVnZSBwYWdlcyBhcmUgaGFuZGxlZC4gTGV0IG1lIGRvdWJsZS1jaGVjayB0aGUgY29uZmlndXJhdGlvbiAoYEtjb25maWdgKSBhbmQgc2VlIGhvdyBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHNldCB1cCBpbiByZWxhdGlvbiB0byBhbGwgdGhpcy4gSSYjMzk7bGwgbmVlZCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyYjMzk7cyBjb25zaXN0ZW50IGFuZCB0aGF0IHdlJiMzOTtyZSBjb3ZlcmluZyBhbGwgb3VyIGJhc2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04NDM9Y29uZmlnIE1NX0lEXG4tLVxubW0vS2NvbmZpZy04NDUtXG5tbS9LY29uZmlnOjg0NjptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTg0Ny1cdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODY0PWNob2ljZVxuLS1cbm1tL0tjb25maWctODY5LVxubW0vS2NvbmZpZzo4NzA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg3MS1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg3Ni1cbm1tL0tjb25maWc6ODc3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0Vcbm1tL0tjb25maWctODc4LVx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg4NS1cbm1tL0tjb25maWc6ODg2Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXG5tbS9LY29uZmlnLTg4Ny1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODkzPWNob2ljZVxuLS1cbm1tL0tjb25maWctOTAyLVxubW0vS2NvbmZpZzo5MDM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MDQtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkxMi1cbm1tL0tjb25maWc6OTEzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTkxNC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkyMC1cbm1tL0tjb25maWc6OTIxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTIyLVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MjgtXG5tbS9LY29uZmlnOjkyOTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05MzAtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05Mzg9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy05NDctXG5tbS9LY29uZmlnOjk0ODpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXG5tbS9LY29uZmlnLTk0OS1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTU2LVxubW0vS2NvbmZpZzo5NTc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTU4LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTY0LVxubW0vS2NvbmZpZzo5NjU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05NjYtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk3Mi1cbm1tL0tjb25maWc6OTczOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTk3NC1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ4NjEKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA1MDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBIYW5kbGluZyBmb3IgT3B0aW1pemF0aW9uKioKCk9rYXksIHNvIHRoZSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZW5hYmxlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCRlNgLiBUaGF0IHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIHN0YXJ0aW5nIHBvaW50LiBOb3csIGxldCYjMzk7cyBkcmlsbCBkb3duIGludG8gdGhlIGtlcm5lbCBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gaGFuZGxpbmcgdGhlc2UgcGFnZXMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUga2V5IGZ1bmN0aW9ucyB0aGF0IGFyZSByZWxldmFudCB0byB0aGlzIGFyZWEgZm9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24uCgpNeSBpbml0aWFsIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBsb29rIGF0IHRoZSB2YXJpb3VzIGBmb2xsb3dfKmAgZnVuY3Rpb25zIGFuZCBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy4KCkhvbGQgb24gYSBtb21lbnQsIGEgZGVlcGVyIGxvb2sgYXQgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZXMsIHJldmVhbHMgdGhhdCBgZm9sbG93X29uZV9wdGVgLCBgZm9sbG93X3B0ZV9iYXRjaGAsIGBmb2xsb3dfcGFnZV9wdGVfY29tbWl0YCwgYGd1cF9maWxsX3BhZ2VzYCwgYW5kIGBub19wYWdlX3RhYmxlYCBhcmUgYWxsICpzdGF0aWMqIGZ1bmN0aW9ucy4gVGhhdCBtYWtlcyBtZSB3b25kZXIgaWYgdGhleSYjMzk7cmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIuIExldCYjMzk7cyBjaGVjay4KCkl0IGxvb2tzIGxpa2UgdGhlIGNvbXBpbGVyIGlzbiYjMzk7dCBpbmxpbmluZyB0aGVtLiBUaGV5JiMzOTtyZSBhbGwgc3RhdGljLCBidXQgbm90IGlubGluZS4gTm93LCBJIHNlZSB0aGUgcHJvbXB0JiMzOTtzIGluc3RydWN0aW9uOiAmIzM0O1ByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucy4mIzM0OyBUaGlzIG1lYW5zIHRoZSBmb2N1cyBzaG91bGQgYmUgb24gdGhlICpub24tc3RhdGljKiBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoZXNlIGludGVybmFsIGhlbHBlcnMuIFRoaXMgaXMgYSBjcnVjaWFsIGRpc3RpbmN0aW9uLiBXZSB3YW50IHRoZSBzdGFibGUsIHdlbGwtZGVmaW5lZCBlbnRyeSBwb2ludHMsIG5vdCB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KClNpbmNlIGBfX2dldF91c2VyX3BhZ2VzYCBpcyBzdGF0aWMsIG15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHdoYXQgY2FsbHMgaXQuIFRoYXQmIzM5O3MgdGhlIGNvcnJlY3QgcGF0aCB0byBmaW5kaW5nIGEgbm9uLXN0YXRpYyBBUEkgZW50cnkgcG9pbnQuIFRoaXMgaXMgdGhlIHBhdGggdG8gcHVyc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX2dldF91c2VyX3BhZ2VzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZ3VwLmM9OTI5PXN0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtOTUzLSAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0XG5tbS9ndXAuYzo5NTQ6ICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLlxubW0vZ3VwLmMtOTU1LSAqL1xuLS1cbm1tL2d1cC5jPTE0MDI9c3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZ3VwX3ZtYV9sb29rdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vZ3VwLmMtMTQzNy0vKipcbm1tL2d1cC5jOjE0Mzg6ICogX19nZXRfdXNlcl9wYWdlcygpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5XG5tbS9ndXAuYy0xNDM5LSAqIEBtbTpcdFx0bW1fc3RydWN0IG9mIHRhcmdldCBtbVxuLS1cbm1tL2d1cC5jLTE0NjAtICpcbm1tL2d1cC5jOjE0NjE6ICogX19nZXRfdXNlcl9wYWdlcyB3YWxrcyBhIHByb2Nlc3MmIzM5O3MgcGFnZSB0YWJsZXMgYW5kIHRha2VzIGEgcmVmZXJlbmNlIHRvXG5tbS9ndXAuYy0xNDYyLSAqIGVhY2ggc3RydWN0IHBhZ2UgdGhhdCBlYWNoIHVzZXIgYWRkcmVzcyBjb3JyZXNwb25kcyB0byBhdCBhIGdpdmVuXG4tLVxubW0vZ3VwLmMtMTQ2Ni0gKiBUaGlzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBwYWdlIGV4aXN0cyBpbiB0aGUgdXNlciBtYXBwaW5ncyB3aGVuXG5tbS9ndXAuYzoxNDY3OiAqIF9fZ2V0X3VzZXJfcGFnZXMgcmV0dXJucywgYW5kIHRoZXJlIG1heSBldmVuIGJlIGEgY29tcGxldGVseSBkaWZmZXJlbnRcbm1tL2d1cC5jLTE0NjgtICogcGFnZSB0aGVyZSBpbiBzb21lIGNhc2VzIChlZy4gaWYgbW1hcHBlZCBwYWdlY2FjaGUgaGFzIGJlZW4gaW52YWxpZGF0ZWRcbi0tXG5tbS9ndXAuYy0xNDg3LSAqIEluIG1vc3QgY2FzZXMsIGdldF91c2VyX3BhZ2VzIG9yIGdldF91c2VyX3BhZ2VzX2Zhc3Qgc2hvdWxkIGJlIHVzZWRcbm1tL2d1cC5jOjE0ODg6ICogaW5zdGVhZCBvZiBfX2dldF91c2VyX3BhZ2VzLiBfX2dldF91c2VyX3BhZ2VzIHNob3VsZCBiZSB1c2VkIG9ubHkgaWZcbm1tL2d1cC5jLTE0ODktICogeW91IG5lZWQgc29tZSBzcGVjaWFsIEBndXBfZmxhZ3MuXG5tbS9ndXAuYy0xNDkwLSAqL1xubW0vZ3VwLmM6MTQ5MTpzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0vZ3VwLmMtMTQ5Mi1cdFx0dW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9ndXAuYz0xNzI2PXN0YXRpYyBib29sIGd1cF9zaWduYWxfcGVuZGluZyh1bnNpZ25lZCBpbnQgZmxhZ3MpXG4tLVxubW0vZ3VwLmMtMTc0Ni0gKlxubW0vZ3VwLmM6MTc0NzogKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24sIHVubGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHdpbGwgbm90IHJldHVybiAwXG5tbS9ndXAuYy0xNzQ4LSAqIGZvciBucl9wYWdlcyBcdTAwM2UgMCwgdW5sZXNzIEZPTExfTk9XQUlUIGlzIHVzZWQuXG5tbS9ndXAuYy0xNzQ5LSAqL1xubW0vZ3VwLmM6MTc1MDpzdGF0aWMgX19hbHdheXNfaW5saW5lIGxvbmcgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG5tbS9ndXAuYy0xNzUxLVx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0vZ3VwLmMtMTc5Mi1cdGZvciAoOzspIHtcbm1tL2d1cC5jOjE3OTM6XHRcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZmxhZ3MsIHBhZ2VzLFxubW0vZ3VwLmMtMTc5NC1cdFx0XHRcdCAgICAgICBsb2NrZWQpO1xuLS1cbm1tL2d1cC5jLTE4NTItXHRcdCpsb2NrZWQgPSAxO1xubW0vZ3VwLmM6MTg1MzpcdFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIDEsIGZsYWdzIHwgRk9MTF9UUklFRCxcbm1tL2d1cC5jLTE4NTQtXHRcdFx0XHQgICAgICAgcGFnZXMsIGxvY2tlZCk7XG4tLVxubW0vZ3VwLmM9MTkxND1sb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTE5NjAtXHQgKi9cbm1tL2d1cC5jOjE5NjE6XHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgbnJfcGFnZXMsIGd1cF9mbGFncyxcbm1tL2d1cC5jLTE5NjItXHRcdFx0ICAgICAgIE5VTEwsIGxvY2tlZCA/IGxvY2tlZCA6IFx1MDAyNmxvY2FsX2xvY2tlZCk7XG4tLVxubW0vZ3VwLmMtMTk3OS0gKiBSZXR1cm5zIGVpdGhlciBudW1iZXIgb2YgcHJvY2Vzc2VkIHBhZ2VzIGluIHRoZSBNTSwgb3IgYSBuZWdhdGl2ZSBlcnJvclxubW0vZ3VwLmM6MTk4MDogKiBjb2RlIG9uIGVycm9yIChzZWUgX19nZXRfdXNlcl9wYWdlcygpKS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVwb3J0c1xubW0vZ3VwLmMtMTk4MS0gKiBlcnJvcnMgcmVsYXRlZCB0byBWTUFzLCBzdWNoIGFzIGluY29tcGF0aWJsZSBtYXBwaW5ncywgYXMgZXhwZWN0ZWQgYnlcbi0tXG5tbS9ndXAuYz0xOTg4PWxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuLS1cbm1tL2d1cC5jLTIwMTItXG5tbS9ndXAuYzoyMDEzOlx0cmV0ID0gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgTlVMTCwgbG9ja2VkLFxubW0vZ3VwLmMtMjAxNC1cdFx0XHRcdCAgICAgIGd1cF9mbGFncyk7XG4tLVxubW0vZ3VwLmM9MjAyNj1pbnQgX19tbV9wb3B1bGF0ZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IGlnbm9yZV9lcnJvcnMpXG4tLVxubW0vZ3VwLmMtMjA3OS0jZWxzZSAvKiBDT05GSUdfTU1VICovXG5tbS9ndXAuYzoyMDgwOnN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXNfbG9ja2VkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0vZ3VwLmMtMjA4MS1cdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlcyxcbi0tXG5tbS9ndXAuYz0yMjg4PXN0cnVjdCBwYWdlICpnZXRfZHVtcF9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50ICpsb2NrZWQpXG4tLVxubW0vZ3VwLmMtMjI5Mi1cbm1tL2d1cC5jOjIyOTM6XHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChjdXJyZW50LVx1MDAzZW1tLCBhZGRyLCAxLCBcdTAwMjZwYWdlLCBsb2NrZWQsXG5tbS9ndXAuYy0yMjk0LVx0XHRcdFx0ICAgICAgRk9MTF9GT1JDRSB8IEZPTExfRFVNUCB8IEZPTExfR0VUKTtcbi0tXG5tbS9ndXAuYz0yNDIyPW1pZ3JhdGVfbG9uZ3Rlcm1fdW5waW5uYWJsZV9mb2xpb3Moc3RydWN0IGxpc3RfaGVhZCAqbW92YWJsZV9mb2xpb19saXN0LFxuLS1cbm1tL2d1cC5jLTI0NTAtXHRcdCAqIFdlIGNhbiYjMzk7dCBtaWdyYXRlIGZvbGlvcyB3aXRoIHVuZXhwZWN0ZWQgcmVmZXJlbmNlcywgc28gZHJvcFxubW0vZ3VwLmM6MjQ1MTpcdFx0ICogdGhlIHJlZmVyZW5jZSBvYnRhaW5lZCBieSBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZCgpLlxubW0vZ3VwLmMtMjQ1Mi1cdFx0ICogTWlncmF0aW5nIGZvbGlvcyBoYXZlIGJlZW4gYWRkZWQgdG8gbW92YWJsZV9mb2xpb19saXN0IGFmdGVyXG4tLVxubW0vZ3VwLmM9MjU1NT1zdGF0aWMgbG9uZyBjaGVja19hbmRfbWlncmF0ZV9tb3ZhYmxlX2ZvbGlvcyh1bnNpZ25lZCBsb25nIG5yX2ZvbGlvcyxcbi0tXG5tbS9ndXAuYy0yNTYyLS8qXG5tbS9ndXAuYzoyNTYzOiAqIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZCgpIGlzIGEgd3JhcHBlciBmb3IgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQgd2hpY2hcbm1tL2d1cC5jLTI1NjQtICogYWxsb3dzIHVzIHRvIHByb2Nlc3MgdGhlIEZPTExfTE9OR1RFUk0gZmxhZy5cbi0tXG5tbS9ndXAuYz0yNTY2PXN0YXRpYyBsb25nIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0yNTc2LVx0aWYgKCEoZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX0xPTkdURVJNKSlcbm1tL2d1cC5jOjI1Nzc6XHRcdHJldHVybiBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChtbSwgc3RhcnQsIG5yX3BhZ2VzLCBwYWdlcyxcbm1tL2d1cC5jLTI1NzgtXHRcdFx0XHRcdCAgICAgICBsb2NrZWQsIGd1cF9mbGFncyk7XG4tLVxubW0vZ3VwLmMtMjU4MS1cdGRvIHtcbm1tL2d1cC5jOjI1ODI6XHRcdG5yX3Bpbm5lZF9wYWdlcyA9IF9fZ2V0X3VzZXJfcGFnZXNfbG9ja2VkKG1tLCBzdGFydCwgbnJfcGFnZXMsXG5tbS9ndXAuYy0yNTgzLVx0XHRcdFx0XHRcdFx0ICBwYWdlcywgbG9ja2VkLFxuLS1cbm1tL2d1cC5jPTI3MDQ9bG9uZyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vZ3VwLmMtMjcxNC1cbm1tL2d1cC5jOjI3MTU6XHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgcGFnZXMsXG5tbS9ndXAuYy0yNzE2LVx0XHRcdFx0ICAgICAgIGxvY2tlZCA/IGxvY2tlZCA6IFx1MDAyNmxvY2FsX2xvY2tlZCxcbi0tXG5tbS9ndXAuYz0yNzQ1PWxvbmcgZ2V0X3VzZXJfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9ndXAuYy0yNzUyLVxubW0vZ3VwLmM6Mjc1MzpcdHJldHVybiBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChjdXJyZW50LVx1MDAzZW1tLCBzdGFydCwgbnJfcGFnZXMsIHBhZ2VzLFxubW0vZ3VwLmMtMjc1NC1cdFx0XHRcdCAgICAgICBcdTAwMjZsb2NrZWQsIGd1cF9mbGFncyk7XG4tLVxubW0vZ3VwLmM9Mjc3Mz1sb25nIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vZ3VwLmMtMjc4MS1cbm1tL2d1cC5jOjI3ODI6XHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoY3VycmVudC1cdTAwM2VtbSwgc3RhcnQsIG5yX3BhZ2VzLCBwYWdlcyxcbm1tL2d1cC5jLTI3ODMtXHRcdFx0XHQgICAgICAgXHUwMDI2bG9ja2VkLCBndXBfZmxhZ3MpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg5MgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDIzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgVXNlciBQYWdlIEZhdWx0cyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGVzZSB1c2VyIHBhZ2UgZnVuY3Rpb25zLiBNeSBwcmltYXJ5IGVudHJ5IHBvaW50cyBoZXJlIHNlZW0gdG8gYmUgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgLCBhbmQgYGdldF9kdW1wX3BhZ2VgLiBJJiMzOTttIHN0YXJ0aW5nIHRvIHRoaW5rIGBnZXRfdXNlcl9wYWdlc2AgaXMgYSAqdmVyeSogaG90IHBhdGgg4oCTIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGl0dGluZyB0aGF0LiBMZXQgbWUgbG9vayBhdCBzb21lIG9mIHRoZSBzeXNjYWxscyB0byB1bmRlcnN0YW5kIGhvdyB0aG9zZSBwYXRocyBhcmUgdG91Y2hlZC4KCkFscmlnaHQsIGBtbWFwYCB3aXRoIGBNQVBfUE9QVUxBVEVgIHdpbGwgY2xlYXJseSBoaXQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYC4gYG1sb2NrYCB0cmlnZ2VycyBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgbWFrZXMgc2Vuc2UgZm9yIHByZXZlbnRpbmcgc3dhcHBpbmcuIFRoZW4sIGBtYWR2aXNlYCB3aXRoIGBNQURWX1BPUFVMQVRFX1JFQURgIG9yIGBNQURWX1BPUFVMQVRFX1dSSVRFYCAqYWxzbyogY2FsbHMgYGZhdWx0aW5fcGFnZV9yYW5nZWAuIFRoYXQmIzM5O3MgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCwgYW5kIHRoYXQgaGFzIGltcGxpY2F0aW9ucyBmb3IgdGhlIGBtYWR2aXNlYCBzZW1hbnRpY3MuIGBwcm9jZXNzX3ZtX3JlYWR2YCBhbmQgYHByb2Nlc3Nfdm1fd3JpdGV2YCB3aWxsIG9idmlvdXNseSBpbnZva2UgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAgb3IgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAsIGFzIGRvZXMgYHB0cmFjZWAuCgpOb3csIGJlZm9yZSBJIGdvIGRlZXBlciBpbnRvIHRoZSBgZ2V0X3VzZXJfcGFnZXNgIGZhbWlseSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IGBwaW5fdXNlcl9wYWdlc2AgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIG1vcmUgY2xvc2VseS4gSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhpcyBsb2dpYyBwYXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwaW5fdXNlcl9wYWdlcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2d1cC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cC5jPTE0MD1pbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxuLS1cbm1tL2d1cC5jLTE3OS0gKlxubW0vZ3VwLmM6MTgwOiAqIFBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIHBpbl91c2VyX3BhZ2VzKigpIG11c3QgYmUgcmVsZWFzZWQgdmlhIGVpdGhlclxubW0vZ3VwLmM6MTgxOiAqIHVucGluX3VzZXJfcGFnZSgpLCBvciBvbmUgb2YgdGhlIHVucGluX3VzZXJfcGFnZXMqKCkgcm91dGluZXMuIFRoaXMgaXMgc29cbm1tL2d1cC5jLTE4Mi0gKiB0aGF0IHN1Y2ggcGFnZXMgY2FuIGJlIHNlcGFyYXRlbHkgdHJhY2tlZCBhbmQgdW5pcXVlbHkgaGFuZGxlZC4gSW5cbi0tXG5tbS9ndXAuYz0yNDc9c3RhdGljIGlubGluZSBzdHJ1Y3QgZm9saW8gKmd1cF9mb2xpb19uZXh0KHN0cnVjdCBwYWdlICoqbGlzdCxcbi0tXG5tbS9ndXAuYy0yNjItLyoqXG5tbS9ndXAuYzoyNjM6ICogdW5waW5fdXNlcl9wYWdlc19kaXJ0eV9sb2NrKCkgLSByZWxlYXNlIGFuZCBvcHRpb25hbGx5IGRpcnR5IGd1cC1waW5uZWQgcGFnZXNcbm1tL2d1cC5jLTI2NC0gKiBAcGFnZXM6ICBhcnJheSBvZiBwYWdlcyB0byBiZSBtYXliZSBtYXJrZWQgZGlydHksIGFuZCBkZWZpbml0ZWx5IHJlbGVhc2VkLlxuLS1cbm1tL2d1cC5jLTI3My0gKiBsaXN0ZWQgYXMgY2xlYW4uIEluIGFueSBjYXNlLCByZWxlYXNlcyBhbGwgcGFnZXMgdXNpbmcgdW5waW5fdXNlcl9wYWdlKCksXG5tbS9ndXAuYzoyNzQ6ICogcG9zc2libHkgdmlhIHVucGluX3VzZXJfcGFnZXMoKSwgZm9yIHRoZSBub24tZGlydHkgY2FzZS5cbm1tL2d1cC5jLTI3NS0gKlxuLS1cbm1tL2d1cC5jLTI4My0gKi9cbm1tL2d1cC5jOjI4NDp2b2lkIHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jayhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nIG5wYWdlcyxcbm1tL2d1cC5jLTI4NS1cdFx0XHRcdCBib29sIG1ha2VfZGlydHkpXG4tLVxubW0vZ3VwLmMtMjkxLVx0aWYgKCFtYWtlX2RpcnR5KSB7XG5tbS9ndXAuYzoyOTI6XHRcdHVucGluX3VzZXJfcGFnZXMocGFnZXMsIG5wYWdlcyk7XG5tbS9ndXAuYy0yOTMtXHRcdHJldHVybjtcbi0tXG5tbS9ndXAuYy0zMjYtfVxubW0vZ3VwLmM6MzI3OkVYUE9SVF9TWU1CT0wodW5waW5fdXNlcl9wYWdlc19kaXJ0eV9sb2NrKTtcbm1tL2d1cC5jLTMyOC1cbi0tXG5tbS9ndXAuYy0zMzctICogXCYjMzQ7Z3VwLXBpbm5lZCBwYWdlIHJhbmdlXCYjMzQ7IHJlZmVycyB0byBhIHJhbmdlIG9mIHBhZ2VzIHRoYXQgaGFzIGhhZCBvbmUgb2YgdGhlXG5tbS9ndXAuYzozMzg6ICogcGluX3VzZXJfcGFnZXMoKSB2YXJpYW50cyBjYWxsZWQgb24gdGhhdCBwYWdlLlxubW0vZ3VwLmMtMzM5LSAqXG4tLVxubW0vZ3VwLmM9MzczPUVYUE9SVF9TWU1CT0wodW5waW5fdXNlcl9wYWdlX3JhbmdlX2RpcnR5X2xvY2spO1xubW0vZ3VwLmMtMzc0LVxubW0vZ3VwLmM6Mzc1OnN0YXRpYyB2b2lkIGd1cF9mYXN0X3VucGluX3VzZXJfcGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyBucGFnZXMpXG5tbS9ndXAuYy0zNzYte1xuLS1cbm1tL2d1cC5jLTM5Mi0vKipcbm1tL2d1cC5jOjM5MzogKiB1bnBpbl91c2VyX3BhZ2VzKCkgLSByZWxlYXNlIGFuIGFycmF5IG9mIGd1cC1waW5uZWQgcGFnZXMuXG5tbS9ndXAuYy0zOTQtICogQHBhZ2VzOiAgYXJyYXkgb2YgcGFnZXMgdG8gYmUgbWFya2VkIGRpcnR5IGFuZCByZWxlYXNlZC5cbi0tXG5tbS9ndXAuYy00MDAtICovXG5tbS9ndXAuYzo0MDE6dm9pZCB1bnBpbl91c2VyX3BhZ2VzKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKVxubW0vZ3VwLmMtNDAyLXtcbi0tXG5tbS9ndXAuYy00MjQtfVxubW0vZ3VwLmM6NDI1OkVYUE9SVF9TWU1CT0wodW5waW5fdXNlcl9wYWdlcyk7XG5tbS9ndXAuYy00MjYtXG4tLVxubW0vZ3VwLmM9NDc5PXN0YXRpYyBpbmxpbmUgdm9pZCBtbV9zZXRfaGFzX3Bpbm5lZF9mbGFnKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuLS1cbm1tL2d1cC5jLTQ5OC0gKiBzYW1lIHRpbWUuIChUaGF0JiMzOTtzIHRydWUgdGhyb3VnaG91dCB0aGUgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kXG5tbS9ndXAuYzo0OTk6ICogcGluX3VzZXJfcGFnZXMqKCkgQVBJcy4pIENhc2VzOlxubW0vZ3VwLmMtNTAwLSAqXG4tLVxubW0vZ3VwLmM9ODM0PXN0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtODQ4LVx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXG5tbS9ndXAuYzo4NDk6XHQgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbm1tL2d1cC5jLTg1MC1cdCAqL1xuLS1cbm1tL2d1cC5jPTIzMzA9c3RhdGljIHZvaWQgcG9mc191bnBpbihzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKVxuLS1cbm1tL2d1cC5jLTIzMzQtXHRlbHNlXG5tbS9ndXAuYzoyMzM1Olx0XHR1bnBpbl91c2VyX3BhZ2VzKHBvZnMtXHUwMDNlcGFnZXMsIHBvZnMtXHUwMDNlbnJfZW50cmllcyk7XG5tbS9ndXAuYy0yMzM2LX1cbi0tXG5tbS9ndXAuYz0yOTMwPXN0YXRpYyBpbnQgZ3VwX2Zhc3RfcHRlX3JhbmdlKHBtZF90IHBtZCwgcG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9ndXAuYy0yOTg3LVx0XHQgKiBnb2luZyB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZVxubW0vZ3VwLmM6Mjk4ODpcdFx0ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvclxubW0vZ3VwLmMtMjk4OS1cdFx0ICogZGV0YWlscy5cbi0tXG5tbS9ndXAuYz0zMjMwPXN0YXRpYyB1bnNpZ25lZCBsb25nIGd1cF9mYXN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxuLS1cbm1tL2d1cC5jLTMyNjYtXHRcdGlmIChyZWFkX3NlcWNvdW50X3JldHJ5KFx1MDAyNmN1cnJlbnQtXHUwMDNlbW0tXHUwMDNld3JpdGVfcHJvdGVjdF9zZXEsIHNlcSkpIHtcbm1tL2d1cC5jOjMyNjc6XHRcdFx0Z3VwX2Zhc3RfdW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnJfcGlubmVkKTtcbm1tL2d1cC5jLTMyNjgtXHRcdFx0cmV0dXJuIDA7XG4tLVxubW0vZ3VwLmM9MzM5MD1FWFBPUlRfU1lNQk9MX0dQTChnZXRfdXNlcl9wYWdlc19mYXN0KTtcbi0tXG5tbS9ndXAuYy0zMzkyLS8qKlxubW0vZ3VwLmM6MzM5MzogKiBwaW5fdXNlcl9wYWdlc19mYXN0KCkgLSBwaW4gdXNlciBwYWdlcyBpbiBtZW1vcnkgd2l0aG91dCB0YWtpbmcgbG9ja3Ncbm1tL2d1cC5jLTMzOTQtICpcbi0tXG5tbS9ndXAuYy0zNDA1LSAqIEZPTExfUElOIG1lYW5zIHRoYXQgdGhlIHBhZ2VzIG11c3QgYmUgcmVsZWFzZWQgdmlhIHVucGluX3VzZXJfcGFnZSgpLiBQbGVhc2Vcbm1tL2d1cC5jOjM0MDY6ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBmdXJ0aGVyIGRldGFpbHMuXG5tbS9ndXAuYy0zNDA3LSAqXG4tLVxubW0vZ3VwLmMtMzQxMC0gKi9cbm1tL2d1cC5jOjM0MTE6aW50IHBpbl91c2VyX3BhZ2VzX2Zhc3QodW5zaWduZWQgbG9uZyBzdGFydCwgaW50IG5yX3BhZ2VzLFxubW0vZ3VwLmMtMzQxMi1cdFx0XHR1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuLS1cbm1tL2d1cC5jLTM0MTctfVxubW0vZ3VwLmM6MzQxODpFWFBPUlRfU1lNQk9MX0dQTChwaW5fdXNlcl9wYWdlc19mYXN0KTtcbm1tL2d1cC5jLTM0MTktXG5tbS9ndXAuYy0zNDIwLS8qKlxubW0vZ3VwLmM6MzQyMTogKiBwaW5fdXNlcl9wYWdlc19yZW1vdGUoKSAtIHBpbiBwYWdlcyBvZiBhIHJlbW90ZSBwcm9jZXNzXG5tbS9ndXAuYy0zNDIyLSAqXG4tLVxubW0vZ3VwLmMtMzQzNy0gKiBGT0xMX1BJTiBtZWFucyB0aGF0IHRoZSBwYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHZpYSB1bnBpbl91c2VyX3BhZ2UoKS4gUGxlYXNlXG5tbS9ndXAuYzozNDM4OiAqIHNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbm1tL2d1cC5jLTM0MzktICpcbi0tXG5tbS9ndXAuYy0zNDQyLSAqL1xubW0vZ3VwLmM6MzQ0Mzpsb25nIHBpbl91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2d1cC5jLTM0NDQtXHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9ndXAuYy0zNDU2LX1cbm1tL2d1cC5jOjM0NTc6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlc19yZW1vdGUpO1xubW0vZ3VwLmMtMzQ1OC1cbm1tL2d1cC5jLTM0NTktLyoqXG5tbS9ndXAuYzozNDYwOiAqIHBpbl91c2VyX3BhZ2VzKCkgLSBwaW4gdXNlciBwYWdlcyBpbiBtZW1vcnkgZm9yIHVzZSBieSBvdGhlciBkZXZpY2VzXG5tbS9ndXAuYy0zNDYxLSAqXG4tLVxubW0vZ3VwLmMtMzQ3MS0gKiBGT0xMX1BJTiBtZWFucyB0aGF0IHRoZSBwYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHZpYSB1bnBpbl91c2VyX3BhZ2UoKS4gUGxlYXNlXG5tbS9ndXAuYzozNDcyOiAqIHNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbm1tL2d1cC5jLTM0NzMtICpcbi0tXG5tbS9ndXAuYy0zNDc2LSAqL1xubW0vZ3VwLmM6MzQ3Nzpsb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG5tbS9ndXAuYy0zNDc4LVx0XHQgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbi0tXG5tbS9ndXAuYy0zNDg2LX1cbm1tL2d1cC5jOjM0ODc6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlcyk7XG5tbS9ndXAuYy0zNDg4LVxubW0vZ3VwLmMtMzQ4OS0vKlxubW0vZ3VwLmM6MzQ5MDogKiBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCgpIGlzIHRoZSBGT0xMX1BJTiB2YXJpYW50IG9mXG5tbS9ndXAuYy0zNDkxLSAqIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKCkuIEJlaGF2aW9yIGlzIHRoZSBzYW1lLCBleGNlcHQgdGhhdCB0aGlzIG9uZSBzZXRzXG4tLVxubW0vZ3VwLmMtMzQ5Ni0gKi9cbm1tL2d1cC5jOjM0OTc6bG9uZyBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxubW0vZ3VwLmMtMzQ5OC1cdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vZ3VwLmMtMzUwOC19XG5tbS9ndXAuYzozNTA5OkVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXNfdW5sb2NrZWQpO1xubW0vZ3VwLmMtMzUxMC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA5NDMKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA0MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEFQSSBFbnRyeSBQb2ludHMgZm9yIGEgQ29kZSBDaGFuZ2UqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoZXNlIGNoYW5nZXMgYW5kIG5lZWQgdG8gaWRlbnRpZnkgdGhlIHJlbGV2YW50IEFQSSBlbnRyeSBwb2ludHMgYWZmZWN0ZWQgYnkgdGhpcyBsb2dpYy4gSSBzZWUgd2UgaGF2ZTogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFJpZ2h0LCBhbmQgSSBzaG91bGQgbm90ZSB0aGF0IGBnZXRfdXNlcl9wYWdlc19mYXN0YCBhbmQgYHBpbl91c2VyX3BhZ2VzX2Zhc3RgIGhhdmUgdGhhdCBsb2NrbGVzcyBgZ3VwX2Zhc3RgIHBhdGgsIGJ1dCB1bHRpbWF0ZWx5IGZhbGwgYmFjayB0byBgX19nZXRfdXNlcl9wYWdlc2AgaWYgbmVlZGVkLCBzbyB0aGV5JiMzOTtyZSByZWxldmFudCwgdG9vLCB0aG91Z2ggbm90IHRoZSBwcmltYXJ5IHRhcmdldC4gVGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gYGZvbGxvd19wYWdlX21hc2tgIGFuZCBgX19nZXRfdXNlcl9wYWdlc2AsIHdoaWNoIEkgcmVjb2duaXplIGFzIHRoZSBzbG93ZXIgZmFsbGJhY2sgcGF0aHMuCgpJIG5lZWQgdG8gZm9jdXMgb24gdGhlIGV4dGVybmFsLCBub24tc3RhdGljIGVudHJ5IHBvaW50cywgc2luY2UgdGhhdCYjMzk7cyB3aGF0IHRoZSBwcm9tcHQgaXMgZW1waGFzaXppbmc6ICYjMzQ7UHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiYjMzQ7IFNvLCBgZ2V0X3VzZXJfcGFnZXNgIGlzIHF1aXRlIGdlbmVyaWMsIGFuZCBoZWF2aWx5IHVzZWQuIEhvd2V2ZXIsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgIGFuZCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGFyZSBhbHNvIHBvc3NpYmlsaXRpZXMuIEFjdHVhbGx5LCBgZm9sbG93X3BhZ2VfbWFza2AgKmlzKiBzdGF0aWMsIGJ1dCBpdCYjMzk7cyB0aGUgY2VudHJhbCBmdW5jdGlvbiBiZWluZyBtb2RpZmllZC4gU28gaXQgc2VlbXMgdGhlIGJlc3QgbGlzdCBvZiBwb3RlbnRpYWwgdGFyZ2V0cyBpbmNsdWRlczogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIE5vdyBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgYXJlIGluZGVlZCBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZ3VwLmM9MTkxND1sb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTE5NjctLypcbm1tL2d1cC5jOjE5Njg6ICogZmF1bHRpbl9wYWdlX3JhbmdlKCkgLSBwb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2UgdGFibGVzIGluc2lkZSB0aGVcbm1tL2d1cC5jLTE5NjktICpcdFx0XHQgIGdpdmVuIHJhbmdlIHJlYWRhYmxlL3dyaXRhYmxlXG4tLVxubW0vZ3VwLmMtMTk4Ny0gKi9cbm1tL2d1cC5jOjE5ODg6bG9uZyBmYXVsdGluX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG5tbS9ndXAuYy0xOTg5LVx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kLCBib29sIHdyaXRlLCBpbnQgKmxvY2tlZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIwMTYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemluZyB0aGVtIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlOgoKKipBbmFseXppbmcgUGFnZSBGYXVsdCBIYW5kbGluZyoqCgpBbHJpZ2h0LCBzbyBgZmF1bHRpbl9wYWdlX3JhbmdlYCBpcyBkZWZpbml0ZWx5IG5vbi1zdGF0aWMsIGdvb2QuIEFuZCwgc2ltaWxhcmx5LCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGlzbiYjMzk7dCBzdGF0aWMgZWl0aGVyLiBUaGF0JiMzOTtzIHdoYXQgSSBleHBlY3RlZCBiYXNlZCBvbiB0aGUgYnJvYWRlciBkZXNpZ24uIE5vdywgSSBzaG91bGQgc2hpZnQgbXkgZm9jdXMgdG8gZXhhbWluaW5nIGBmYXVsdGluX3ZtYV9wYWdlX3JhbmdlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb25zIHdlJiMzOTt2ZSBpZGVudGlmaWVkIGFzIG5vbi1zdGF0aWMsIHRvIGNvbnRpbnVlIGRldmVsb3BpbmcgdGhlIHN5c3RlbSBlZmZpY2llbnRseS4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgaG93IHRoZSB2YXJpYWJsZXMgaW50ZXJhY3QgYW5kIHdoZXRoZXIgdGhleSB3aWxsIGludGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIuIFRoaXMgaXMgbGlrZWx5IHRoZSBuZXh0IHBpZWNlIG9mIHRoZSBwdXp6bGUgdG8gdW5kZXJzdGFuZCBmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmYXVsdGluX3ZtYV9wYWdlX3JhbmdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjI3NgoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDM2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBGdW5jdGlvbioqCgpPa2F5LCBzbyBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGlzbiYjMzk7dCBzdGF0aWMuIFRoYXQgaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZyBmb3IgbWUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgaW1wbGljYXRpb25zIG9mIHRoaXMgbm9uLXN0YXRpYyBkZWNsYXJhdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBjb2RlYmFzZSBhbmQgZmluZCBhbGwgdGhlIHBsYWNlcyB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGJlaW5nICp1c2VkKi4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBzaXRlcyBpcyBjcnVjaWFsIHRvIGdyYXNwaW5nIGl0cyBpbnRlbmRlZCBiZWhhdmlvciBhbmQgcG90ZW50aWFsIHNpZGUgZWZmZWN0cyB3aXRoaW4gdGhlIGxhcmdlciB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IGZyYW1ld29yay4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7RG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0PTQ3Nj10aGUgbW1hcCgpIGhhbmRsZXIgYW5kIHRhc2sgYWRkcmVzcyBzcGFjZSBleHBhbnNpb24gZnVuY3Rpb25zIGNhbGxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDo0Nzc6cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSBzcGVjaWZ5aW5nIHRoZSB2bWEgYW5kIHRoZSBhZGRyZXNzIHJhbmdlIHRvIG1sb2NrLlxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTQ3OC1cbi0tXG5tbS9ndXAuYz0xNzUwPXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0xODk0LS8qKlxubW0vZ3VwLmM6MTg5NTogKiBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpIC0gIHBvcHVsYXRlIGEgcmFuZ2Ugb2YgcGFnZXMgaW4gdGhlIHZtYS5cbm1tL2d1cC5jLTE4OTYtICogQHZtYTogICB0YXJnZXQgdm1hXG4tLVxubW0vZ3VwLmMtMTkxMy0gKi9cbm1tL2d1cC5jOjE5MTQ6bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL2d1cC5jLTE5MTUtXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgKmxvY2tlZClcbi0tXG5tbS9ndXAuYz0yMDI2PWludCBfX21tX3BvcHVsYXRlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgaWdub3JlX2Vycm9ycylcbi0tXG5tbS9ndXAuYy0yMDU5LVx0XHQvKlxubW0vZ3VwLmM6MjA2MDpcdFx0ICogTm93IGZhdWx0IGluIGEgcmFuZ2Ugb2YgcGFnZXMuIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKClcbm1tL2d1cC5jLTIwNjEtXHRcdCAqIGRvdWJsZSBjaGVja3MgdGhlIHZtYSBmbGFncywgc28gdGhhdCBpdCB3b24mIzM5O3QgbWxvY2sgcGFnZXNcbi0tXG5tbS9ndXAuYy0yMDYzLVx0XHQgKi9cbm1tL2d1cC5jOjIwNjQ6XHRcdHJldCA9IHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHZtYSwgbnN0YXJ0LCBuZW5kLCBcdTAwMjZsb2NrZWQpO1xubW0vZ3VwLmMtMjA2NS1cdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuLS1cbm1tL2ludGVybmFsLmg9MTExOT12b2lkIHVubWFwX21hcHBpbmdfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG5tbS9pbnRlcm5hbC5oOjExMjA6ZXh0ZXJuIGxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9pbnRlcm5hbC5oLTExMjEtXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgKmxvY2tlZCk7XG4tLVxubW0vbWxvY2suYz00Njc9c3RhdGljIGludCBtbG9ja19maXh1cChzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL21sb2NrLmMtNTA0LVx0ICogSXQmIzM5O3Mgb2theSBpZiB0cnlfdG9fdW5tYXBfb25lIHVubWFwcyBhIHBhZ2UganVzdCBhZnRlciB3ZVxubW0vbWxvY2suYzo1MDU6XHQgKiBzZXQgVk1fTE9DS0VELCBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSB3aWxsIGJyaW5nIGl0IGJhY2suXG5tbS9tbG9jay5jLTUwNi1cdCAqL1xuLS1cbm1tL21tYXAuYz05NjE9c3RydWN0IHZtX2FyZWFfc3RydWN0ICpmaW5kX2V4dGVuZF92bWFfbG9ja2VkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpXG4tLVxubW0vbW1hcC5jLTk3My1cdGlmIChwcmV2LVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG5tbS9tbWFwLmM6OTc0Olx0XHRwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShwcmV2LCBhZGRyLCBwcmV2LVx1MDAzZXZtX2VuZCwgTlVMTCk7XG5tbS9tbWFwLmMtOTc1LVx0cmV0dXJuIHByZXY7XG4tLVxubW0vbW1hcC5jPTk4Mz1zdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmZpbmRfZXh0ZW5kX3ZtYV9sb2NrZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcbi0tXG5tbS9tbWFwLmMtOTk3LVx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxubW0vbW1hcC5jOjk5ODpcdFx0cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uodm1hLCBhZGRyLCBzdGFydCwgTlVMTCk7XG5tbS9tbWFwLmMtOTk5LVx0cmV0dXJuIHZtYTtcbi0tXG5tbS9tcHJvdGVjdC5jPTcyNT1tcHJvdGVjdF9maXh1cChzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsXG4tLVxubW0vbXByb3RlY3QuYy04MTktXHQgICAgIXZtYV9mbGFnc190ZXN0X2FueShcdTAwMjZvbGRfdm1hX2ZsYWdzLCBWTUFfV1JJVEVfQklULCBWTUFfU0hBUkVEX0JJVCkpXG5tbS9tcHJvdGVjdC5jOjgyMDpcdFx0cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uodm1hLCBzdGFydCwgZW5kLCBOVUxMKTtcbm1tL21wcm90ZWN0LmMtODIxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzUwMQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIHNpdHVhdGlvbiwgZnJvbSBhbiBleHBlcnQmIzM5O3MgcGVyc3BlY3RpdmU6CgoqKk1lbW9yeSBQb3B1bGF0aW9uIFN0cmF0ZWdpZXMgYW5kIFRoZWlyIERyaXZlcnMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyBtZW1vcnkgaXMgcG9wdWxhdGVkIHdpdGhpbiB0aGUgdmlydHVhbCBtZW1vcnkgYXJlYSAoVk1BKSBtYW5hZ2VtZW50IGNvZGUuIEl0IGxvb2tzIGxpa2UgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBpcyBhIGtleSBmdW5jdGlvbi4gSSBzZWUgdGhhdCBpdCYjMzk7cyB0aGUgd29ya2hvcnNlIGNhbGxlZCBieSBzZXZlcmFsIGltcG9ydGFudCBmdW5jdGlvbnM6IGBfX21tX3BvcHVsYXRlYCwgd2hpY2ggaXMgdGhlIGNvcmUgaGFuZGxlciBmb3IgdGhlIGBNQVBfUE9QVUxBVEVgIGZsYWcgZHVyaW5nIGBtbWFwYCBjYWxscyBhbmQgYG1sb2NrYCBvcGVyYXRpb25zICh0aGF0JiMzOTtzIGNydWNpYWwgZm9yIHBpbm5pbmcgbWVtb3J5KSwgYW5kIHRoZW4gYWxzbyBgbXByb3RlY3RfZml4dXBgIHdoaWNoIGlzIHVzZWQgZHVyaW5nIHBhZ2UgcHJvdGVjdGlvbiBhZGp1c3RtZW50cy4gSXQmIzM5O3MgYWxzbyBjYWxsZWQgYnkgYGZpbmRfZXh0ZW5kX3ZtYV9sb2NrZWRgLCB3aGljaCBoYXMgdG8gZG8gd2l0aCBWTUEgZXhwYW5zaW9uIGFuZCBtZXJnaW5nLiBJbnRlcmVzdGluZy4gU28sIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgc2VlbXMgdG8gYmUgdGhlIGZ1bmN0aW9uIGhhbmRsaW5nIHRoZSAqZWFnZXIqIHBvcHVsYXRpb24gb2YgcGFnZXMuCgpPbiB0aGUgb3RoZXIgaGFuZCwgYGZhdWx0aW5fcGFnZV9yYW5nZWAgaXMgdXNlZCBpbiBhIG1vcmUgcmVhY3RpdmUgY29udGV4dC4gSXQmIzM5O3MgaW52b2tlZCBieSBgbWFkdmlzZWAgc3BlY2lmaWNhbGx5IHdoZW4gdXNpbmcgdGhlIGBNQURWX1BPUFVMQVRFX1JFQURgIGFuZCBgTUFEVl9QT1BVTEFURV9XUklURWAgZmxhZ3MuIFRoaXMgaW5kaWNhdGVzIGEgZGVtYW5kLXBhZ2luZyBzdHJhdGVneSwgYnV0IHdpdGggYSBoaW50IHRvIHByZS1mYXVsdCBwYWdlcy4gSXQmIzM5O3MgYSBuaWNlIGRpc3RpbmN0aW9uLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGRlYWxzIHdpdGggdXBmcm9udCwgZWFnZXIgcG9wdWxhdGlvbiB3aGlsZSBgZmF1bHRpbl9wYWdlX3JhbmdlYCBkZWFscyB3aXRoIGhpbnQtZHJpdmVuIGZhdWx0aW5nLiBJIGNhbiBzZWUgdGhlIHBvdGVudGlhbCBmb3Igc29tZSBpbnRlcmVzdGluZyBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIGhvdyB0aGVzZSBhcmUgdXNlZCBpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEkmIzM5O2xsIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBjb250ZXh0cyBhbmQgdXNhZ2UgcGF0dGVybnMgdG8gdW5kZXJzdGFuZCB0aGUgdHJhZGUtb2Zmcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy0xOTY3LS8qXG5tbS9ndXAuYzoxOTY4OiAqIGZhdWx0aW5fcGFnZV9yYW5nZSgpIC0gcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdlIHRhYmxlcyBpbnNpZGUgdGhlXG5tbS9ndXAuYy0xOTY5LSAqXHRcdFx0ICBnaXZlbiByYW5nZSByZWFkYWJsZS93cml0YWJsZVxuLS1cbm1tL2d1cC5jLTE5ODctICovXG5tbS9ndXAuYzoxOTg4OmxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0vZ3VwLmMtMTk4OS1cdFx0XHR1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCB3cml0ZSwgaW50ICpsb2NrZWQpXG4tLVxubW0vaW50ZXJuYWwuaD0xMTIwPWV4dGVybiBsb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0vaW50ZXJuYWwuaC0xMTIxLVx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50ICpsb2NrZWQpO1xubW0vaW50ZXJuYWwuaDoxMTIyOmV4dGVybiBsb25nIGZhdWx0aW5fcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2ludGVybmFsLmgtMTEyMy1cdFx0dW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgd3JpdGUsIGludCAqbG9ja2VkKTtcbi0tXG5tbS9tYWR2aXNlLmM9OTU3PXN0YXRpYyBsb25nIG1hZHZpc2VfcG9wdWxhdGUoc3RydWN0IG1hZHZpc2VfYmVoYXZpb3IgKm1hZHZfYmVoYXZpb3IpXG4tLVxubW0vbWFkdmlzZS5jLTk2Ny1cdFx0LyogUG9wdWxhdGUgKHByZWZhdWx0KSBwYWdlIHRhYmxlcyByZWFkYWJsZS93cml0YWJsZS4gKi9cbm1tL21hZHZpc2UuYzo5Njg6XHRcdHBhZ2VzID0gZmF1bHRpbl9wYWdlX3JhbmdlKG1tLCBzdGFydCwgZW5kLCB3cml0ZSwgXHUwMDI2bG9ja2VkKTtcbm1tL21hZHZpc2UuYy05NjktXHRcdGlmICghbG9ja2VkKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0MzkwCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKlBvdGVudGlhbCBQYWdlLUZhdWx0IEhhbmRsZXJzIGFuZCBQYWdlIFBpbm5pbmcgRnVuY3Rpb25zKioKClJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgcG90ZW50aWFsIHN0YXJ0aW5nIHBvaW50cyBmb3IgdGhpcywgYW5kIHR3byBuYW1lcyBpbW1lZGlhdGVseSBqdW1wIG91dDogYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgc2VlbSBsaWtlIHRoZXkmIzM5O2QgYmUgZGlyZWN0bHkgaW52b2x2ZWQgaW4gdGhlIHByb2Nlc3Mgb2YgZGVhbGluZyB3aXRoIHBhZ2UgZmF1bHRzIGFuZCBwb3B1bGF0aW5nIG1lbW9yeS4gUHJvbWlzaW5nLgoKQmV5b25kIHRob3NlLCBJJiMzOTt2ZSBnb3QgYSBtZW50YWwgbm90ZSB0byBjaGVjayBvdXQgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGFuZCBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYC4gVGhleSYjMzk7cmUgcmVsYXRlZCB0byB1c2VyLXNwYWNlIHBhZ2UgYWNjZXNzIGFuZCBwaW5uaW5nLCB3aGljaCBzZWVtcyByZWxldmFudC4gR2l2ZW4gdGhlaXIgZnVuY3Rpb25zLCB0aGV5IGxpa2VseSBhY3QgdXBvbiBzb21lIG9mIHRoZSBmdW5kYW1lbnRhbHMgb2YgYSBwYWdlIHRhYmxlLgoKTm93LCBiZWZvcmUgSSBkaWcgYW55IGRlZXBlciwgSSBzaG91bGQgYWxzbyB0YWtlIGEgbG9vayBhdCBgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRgLiBJdOKAmXMgcHJvYmFibHkgd29ydGggaW52ZXN0aWdhdGluZyB0aGF0IGZ1bmN0aW9uIGluIHBhcnRpY3VsYXIsIHNpbmNlIHRoZSAmIzM5O3VubG9ja2VkJiMzOTsgdmFyaWFudCBtaWdodCBvZmZlciBpbnNpZ2h0cyBpbnRvIGhvdyB0aGV5IGhhbmRsZSBsb2NraW5nIHdpdGhpbiB0aGF0IHBhcnRpY3VsYXIgcHJvY2Vzcy4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGlmIGl04oCZcyBoYW5kbGluZyBjb25jdXJyZW5jeSBhdCBhbGwsIGJ1dCBJ4oCZbSBnb2luZyB0byBjb25zaWRlciBpdCBhIGhpZ2gtcHJpb3JpdHkgY2FuZGlkYXRlIGFzIGEgc3RhcnRpbmcgcG9pbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2dldF91c2VyX3BhZ2VzX3VubG9ja2VkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmlydC9uaXRyb19lbmNsYXZlcy9uZV9taXNjX2Rldi5jPTkxND1zdGF0aWMgaW50IG5lX3NldF91c2VyX21lbW9yeV9yZWdpb25faW9jdGwoc3RydWN0IG5lX2VuY2xhdmUgKm5lX2VuY2xhdmUsXG4tLVxuZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmMtOTYyLVxuZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmM6OTYzOlx0XHRndXBfcmMgPSBnZXRfdXNlcl9wYWdlc191bmxvY2tlZChtZW1fcmVnaW9uLnVzZXJzcGFjZV9hZGRyICYjNDM7IG1lbW9yeV9zaXplLCAxLFxuZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmMtOTY0LVx0XHRcdFx0XHRcdCBuZV9tZW1fcmVnaW9uLVx1MDAzZXBhZ2VzICYjNDM7IGksIEZPTExfR0VUKTtcbi0tXG5pbmNsdWRlL2xpbnV4L21tLmg9MzI3MD1sb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzI3MS1cdFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xuaW5jbHVkZS9saW51eC9tbS5oOjMyNzI6bG9uZyBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNzMtXHRcdCAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKTtcbi0tXG5tbS9ndXAuYz0yNzU2PUVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXMpO1xuLS1cbm1tL2d1cC5jLTI3NTgtLypcbm1tL2d1cC5jOjI3NTk6ICogZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoKSBpcyBzdWl0YWJsZSB0byByZXBsYWNlIHRoZSBmb3JtOlxubW0vZ3VwLmMtMjc2MC0gKlxuLS1cbm1tL2d1cC5jLTI3NjYtICpcbm1tL2d1cC5jOjI3Njc6ICogICAgICBnZXRfdXNlcl9wYWdlc191bmxvY2tlZChtbSwgLi4uLCBwYWdlcyk7XG5tbS9ndXAuYy0yNzY4LSAqXG4tLVxubW0vZ3VwLmMtMjc3Mi0gKi9cbm1tL2d1cC5jOjI3NzM6bG9uZyBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxubW0vZ3VwLmMtMjc3NC1cdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vZ3VwLmMtMjc4NC19XG5tbS9ndXAuYzoyNzg1OkVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQpO1xubW0vZ3VwLmMtMjc4Ni1cbi0tXG5tbS9ndXAuYz0zNDg3PUVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXMpO1xuLS1cbm1tL2d1cC5jLTM0OTAtICogcGluX3VzZXJfcGFnZXNfdW5sb2NrZWQoKSBpcyB0aGUgRk9MTF9QSU4gdmFyaWFudCBvZlxubW0vZ3VwLmM6MzQ5MTogKiBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCgpLiBCZWhhdmlvciBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhpcyBvbmUgc2V0c1xubW0vZ3VwLmMtMzQ5Mi0gKiBGT0xMX1BJTiBhbmQgcmVqZWN0cyBGT0xMX0dFVC5cbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTI4ODM9c3RhdGljIGludCBodmFfdG9fcGZuX3Nsb3coc3RydWN0IGt2bV9mb2xsb3dfcGZuICprZnAsIGt2bV9wZm5fdCAqcGZuKVxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMjkwMi1cdGVsc2VcbnZpcnQva3ZtL2t2bV9tYWluLmM6MjkwMzpcdFx0bnBhZ2VzID0gZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoa2ZwLVx1MDAzZWh2YSwgMSwgXHUwMDI2cGFnZSwgZmxhZ3MpO1xudmlydC9rdm0va3ZtX21haW4uYy0yOTA0LVx0aWYgKG5wYWdlcyAhPSAxKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTU4NwoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDkzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBHVVAgUGF0Y2ggZm9yIEZ1enppbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBpZGVudGlmeSB0aGUgbW9zdCBlZmZlY3RpdmUgdGFyZ2V0cyBmb3IgZnV6emluZyBhIHJlY2VudCBrZXJuZWwgcGF0Y2ggdGhhdCByZWZhY3RvcnMgdGhlIEdldCBVc2VyIFBhZ2VzIChHVVApIGxvZ2ljLiBJIG5lZWQgdG8gYmFsYW5jZSBjb3ZlcmFnZSB3aXRoIGF2b2lkaW5nIG92ZXJseSBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IHdpbGwgc2tldyByZXN1bHRzLgoKRmlyc3QsIEkgbmVlZCB0byBsaXN0IG91dCB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zLiBCYXNlZCBvbiB0aGUgcGF0Y2ggYW5hbHlzaXMgYW5kIGtub3dpbmcgdGhhdCBJIHNob3VsZCBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLCB0aGUgaW5pdGlhbCBjYW5kaWRhdGVzIGFyZTogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIEkga25vdyB0aGF0IGBfX2dldF91c2VyX3BhZ2VzYCBpcyB0aGUgc3RhdGljIGNvcmUsIHNvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgYXJlIHRoZSBjb3JyZWN0IGNob2ljZS4KCk5vdywgd2hpY2ggY29uZmlndXJhdGlvbnMgYXJlIHJlbGV2YW50PyBUaGUgcGF0Y2ggdXNlcyBgI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU2AgYW5kIGAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYW5kIGJhc2VkIG9uIHRoZSBjb25maWcgZGVwZW5kZW5jaWVzLCBJIGtub3cgdGhhdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgSFVHRVRMQkZTYCBhcmUgc3VmZmljaWVudCB0byBlbmFibGUgdGhpcywgc28gdGhvc2UgYXJlIHRoZSBrZXkgb25lcyB0byBlbmFibGUuIEl0JiMzOTtzIGEgZ2VuZXJpYyBgbW0vZ3VwLmNgIGZpbGUsIHNvIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb25jZXJucy4KClRoZSBpbml0aWFsIHN1bW1hcnkgd291bGQgYmU6CgoqICAgKipXb3J0aEZ1enppbmcqKjogYHRydWVgCiogICAqKkZvY3VzU3ltYm9scyoqOiBgZ2V0X3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYGdldF91c2VyX3BhZ2VzX3VubG9ja2VkYCwgYHBpbl91c2VyX3BhZ2VzYCwgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgCiogICAqKkVuYWJsZUNvbmZpZ3MqKjogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEhVR0VUTEJGU2AKKiAgICoqUmVhc29uaW5nKio6IFNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlLgoKQnV0IEkgbmVlZCB0byBiZSBhIGJpdCBtb3JlIG51YW5jZWQuIEkgbmVlZCB0byBhdm9pZCB2ZXJ5IGhvdCBwYXRocy4gYGdldF91c2VyX3BhZ2VzYCBpcyAqdGhlKiBtYWluIGVudHJ5IHBvaW50IGZvciBHVVAsIHNvIEkgaGF2ZSB0byBpbmNsdWRlIGl0LiBBbmQgSSYjMzk7bGwgbGVhdmUgYHBpbl91c2VyX3BhZ2VzYCB0b28uIGBnZXRfdXNlcl9wYWdlc2AgaXRzZWxmIGhhcyBkcml2ZXIgY2FsbHMsIGJ1dCBpdCYjMzk7cyBub3QgbGlrZWx5IHRvIGJlIGFzIGdlbmVyaWMgYXMgYGttYWxsb2NgIG9yIGBzY2hlZHVsZWAuIFRoZSBwYXRjaCBwcmltYXJpbHkgZGVhbHMgd2l0aCBETUEgc2V0dXBzIGFuZCBtZW1vcnkgcGlubmluZy4KCmBmYXVsdGluX3BhZ2VfcmFuZ2VgIGFuZCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGFyZSBtb3JlIHNwZWNpZmljLCB0cmlnZ2VyZWQgYnkgYG1hZHZpc2VgIGFuZCBgbW1hcChNQVBfUE9QVUxBVEUpIC8gbWxvY2tgLCByZXNwZWN0aXZlbHkuIGBnZXRfdXNlcl9wYWdlc19yZW1vdGVgIGlzIGFsc28gaW1wb3J0YW50IGJlY2F1c2UgaXQgZGVhbHMgd2l0aCBgcHRyYWNlYCBhbmQgYHByb2Nlc3Nfdm1fcmVhZHZgLCB3aGljaCBhcmUgZGVmaW5pdGVseSBnb29kIGZ1enppbmcgdGFyZ2V0cy4KClNvLCB0YWtpbmcgdGhlIGhvdC1wYXRoIGNvbnNpZGVyYXRpb24gaW50byBhY2NvdW50LCB0aGUgZmluYWwgc2VsZWN0aW9uIGlzOgoKKiAgICoqV29ydGhGdXp6aW5nKio6IGB0cnVlYAoqICAgKipGb2N1c1N5bWJvbHMqKjogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYAoqICAgKipFbmFibGVDb25maWdzKio6IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBIVUdFVExCRlNgCiogICAqKlJlYXNvbmluZyoqOiBUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBjb3JlIEdldCBVc2VyIFBhZ2VzIChHVVApIGxvZ2ljIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MsIHRvdWNoaW5nIG11bHRpcGxlIGltcG9ydGFudCBzdWJzeXN0ZW1zLiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgZXhwb3J0ZWQgR1VQIEFQSSBlbnRyeSBwb2ludHMsIGJhbGFuY2luZyBjb3ZlcmFnZSB3aXRoIHRhcmdldGVkIGZ1bmN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Z2V0X3VzZXJfcGFnZXNcXCgmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7RG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0PTg0PWxhdHRlciBoYXBwZW5zIHdoZW46XG4tLVxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0LTkyLVxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0OjkzOiAtIGEgcGFnZSBpcyBhY2Nlc3NlZCBieSBhIGRldmljZSBkcml2ZXIgdXNpbmcgZ2V0X3VzZXJfcGFnZXMoKVxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0LTk0LVxuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvY2FjaGV0bGIucnN0PTI1Mz1tYXBzIHRoaXMgcGFnZSBhdCBpdHMgdmlydHVhbCBhZGRyZXNzLlxuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvY2FjaGV0bGIucnN0LTM1My1cdHBhZ2UsIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gKGN1cnJlbnRseSBvbmx5XG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2NhY2hldGxiLnJzdDozNTQ6XHRnZXRfdXNlcl9wYWdlcygpKS4gIE5vdGU6IGZsdXNoX2RjYWNoZV9mb2xpbygpIGRlbGliZXJhdGVseVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzU1LVx0ZG9lc24mIzM5O3Qgd29yayBmb3IgYW4gYW5vbnltb3VzIHBhZ2UuICBUaGUgZGVmYXVsdFxuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0PTExMz1jb3VudGVyIHRoYXQgaW5jcmVtZW50cyAxMCBiaXRzIGF0IGEgdGltZS5cbi0tXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdC0xMjEtKiBDYWxsZXJzIG11c3Qgc3BlY2lmaWNhbGx5IHJlcXVlc3QgXCYjMzQ7ZG1hLXBpbm5lZCB0cmFja2luZyBvZiBwYWdlc1wmIzM0Oy4gSW4gb3RoZXJcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjEyMjogIHdvcmRzLCBqdXN0IGNhbGxpbmcgZ2V0X3VzZXJfcGFnZXMoKSB3aWxsIG5vdCBzdWZmaWNlOyBhIG5ldyBzZXQgb2YgZnVuY3Rpb25zLFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMTIzLSAgcGluX3VzZXJfcGFnZSgpIGFuZCByZWxhdGVkLCBtdXN0IGJlIHVzZWQuXG4tLVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9MTk0PUlOQ09SUkVDVCAodXNlcyBGT0xMX0dFVCBjYWxscyk6XG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoxOTU6ICAgIGdldF91c2VyX3BhZ2VzKClcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTE5Ni0gICAgd3JpdGUgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBwYWdlc1xuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0PTI0NT1sb25nLXRlcm0gW1JdRE1BIHBpbnMgaW4gcGxhY2UsIG9yIGR1cmluZyBwaW4vdW5waW4gdHJhbnNpdGlvbnMuXG4tLVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjQ5LSAgcGlubmVkIG9uY2UgZm9yIGVhY2ggcGFnZSAoaGVhZCBwYWdlIGFuZCBlYWNoIHRhaWwgcGFnZSkgd2l0aGluIHRoZSBodWdlIHBhZ2UuXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyNTA6ICBUaGlzIGZvbGxvd3MgdGhlIHNhbWUgc29ydCBvZiBiZWhhdmlvciB0aGF0IGdldF91c2VyX3BhZ2VzKCkgdXNlcyBmb3IgaHVnZVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjUxLSAgcGFnZXM6IHRoZSBoZWFkIHBhZ2UgaXMgcmVmY291bnRlZCBvbmNlIGZvciBlYWNoIHRhaWwgb3IgaGVhZCBwYWdlIGluIHRoZSBodWdlXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyNTI6ICBwYWdlLCB3aGVuIGdldF91c2VyX3BhZ2VzKCkgaXMgYXBwbGllZCB0byBhIGh1Z2UgcGFnZS5cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI1My1cbi0tXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdD0yNzg9UmVmZXJlbmNlc1xuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI4MC1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI4MToqIGBTb21lIHNsb3cgcHJvZ3Jlc3Mgb24gZ2V0X3VzZXJfcGFnZXMoKSAoQXByIDIsIDIwMTkpIFx1MDAzY2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy83ODQ1NzQvXHUwMDNlYF9cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI4MjoqIGBETUEgYW5kIGdldF91c2VyX3BhZ2VzKCkgKExQQzogRGVjIDEyLCAyMDE4KSBcdTAwM2NodHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvNzc0NDExL1x1MDAzZWBfXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODM6KiBgVGhlIHRyb3VibGUgd2l0aCBnZXRfdXNlcl9wYWdlcygpIChBcHIgMzAsIDIwMTgpIFx1MDAzY2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy83NTMwMjcvXHUwMDNlYF9cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI4NDoqIGBMV04ga2VybmVsIGluZGV4OiBnZXRfdXNlcl9wYWdlcygpIFx1MDAzY2h0dHBzOi8vbHduLm5ldC9LZXJuZWwvSW5kZXgvI01lbW9yeV9tYW5hZ2VtZW50LWdldF91c2VyX3BhZ2VzXHUwMDNlYF9cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI4NS1cbi0tXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC5yc3Q9Mjg5PW1hcHBlZCBjYWNoZXMgc3VjaCBhcyBBUk0sIE1JUFMgYW5kIFNQQVJDLlxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgucnN0LTI5MC1cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdDoyOTE6Q2FsbGluZyA6YzpmdW5jOmBnZXRfdXNlcl9wYWdlcygpYCBvbiBhIHJhbmdlIG9mIHVzZXIgbWVtb3J5IHRoYXQgaGFzIGJlZW5cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdC0yOTItbW1hcHBlZCBmcm9tIGEgYERBWGAgZmlsZSB3aWxsIGZhaWwgd2hlbiB0aGVyZSBhcmUgbm8gJiMzOTtzdHJ1Y3QgcGFnZSYjMzk7IHRvIGRlc2NyaWJlXG4tLVxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0PTQzOD13aGlsZSB0aGUgcGFnZShzKSBiZWxvbmdpbmcgdG8gdGhlIHdyaXRlIGJ1ZmZlciBhcmUgZmF1bHRlZCB3aXRoXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZS5yc3Q6NDM5OmdldF91c2VyX3BhZ2VzKCkuICBUaGUgJiMzOTtyZXEtXHUwMDNlbG9ja2VkJiMzOTsgZmxhZyBpbmRpY2F0ZXMgd2hlbiB0aGUgY29weSBpc1xuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0LTQ0MC10YWtpbmcgcGxhY2UsIGFuZCBhYm9ydCBpcyBkZWxheWVkIHVudGlsIHRoaXMgZmxhZyBpcyB1bnNldC5cbi0tXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0PTY0MT1hbiBlcnJvci5cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbG9ja2luZy5yc3QtNjQyLVxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9sb2NraW5nLnJzdDo2NDM6LVx1MDAzZWFjY2VzcygpIGlzIGNhbGxlZCB3aGVuIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMgaW5cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbG9ja2luZy5yc3QtNjQ0LWFjY2Vzc19wcm9jZXNzX3ZtKCksIHR5cGljYWxseSB1c2VkIHRvIGRlYnVnIGEgcHJvY2VzcyB0aHJvdWdoXG4tLVxuRG9jdW1lbnRhdGlvbi9ncHUvZHJtLXZtLWJpbmQtbG9ja2luZy5yc3Q9NDE2PU5vdywgdGhlIG1ldGhvZCBvZiBvYnRhaW5pbmcgc3RydWN0IHBhZ2UgcmVmZXJlbmNlcyB1c2luZ1xuRG9jdW1lbnRhdGlvbi9ncHUvZHJtLXZtLWJpbmQtbG9ja2luZy5yc3Q6NDE3OmdldF91c2VyX3BhZ2VzKCkgdW5mb3J0dW5hdGVseSBjYW4mIzM5O3QgYmUgdXNlZCB1bmRlciBhIGRtYV9yZXN2IGxvY2tcbkRvY3VtZW50YXRpb24vZ3B1L2RybS12bS1iaW5kLWxvY2tpbmcucnN0LTQxOC1zaW5jZSB0aGF0IHdvdWxkIHZpb2xhdGUgdGhlIGxvY2tpbmcgb3JkZXIgb2YgdGhlIGRtYV9yZXN2IGxvY2sgdnMgdGhlXG4tLVxuRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0PTQ3PU1lbW9yeSBwaW5uaW5nXG4tLVxuRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0LTUyLSAgaWJfdXZlcmJzIG1vZHVsZSBtYW5hZ2VzIHBpbm5pbmcgYW5kIHVucGlubmluZyBtZW1vcnkgcmVnaW9ucyB2aWFcbkRvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1MzogIGdldF91c2VyX3BhZ2VzKCkgYW5kIHB1dF9wYWdlKCkgY2FsbHMuICBJdCBhbHNvIGFjY291bnRzIGZvciB0aGVcbkRvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdC01NC0gIGFtb3VudCBvZiBtZW1vcnkgcGlubmVkIGluIHRoZSBwcm9jZXNzJiMzOTtzIHBpbm5lZF92bSwgYW5kIGNoZWNrcyB0aGF0XG4tLVxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0PTMwND1CZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIHN5c3RlbSBjYWxsLCBkb19tbG9jaygpIG9yIG1sb2NrYWxsKCkgd2lsbCBjYWxsXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q6MzA1Ol9fbW1fcG9wdWxhdGUoKSB0byBmYXVsdCBpbiB0aGUgcmVtYWluaW5nIHBhZ2VzIHZpYSBnZXRfdXNlcl9wYWdlcygpIGFuZCB0b1xuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTMwNi1tYXJrIHRob3NlIHBhZ2VzIGFzIG1sb2NrZWQgYXMgdGhleSBhcmUgZmF1bHRlZC5cbi0tXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9MzA4PU5vdGUgdGhhdCB0aGUgVk1BIGJlaW5nIG1sb2NrZWQgbWlnaHQgYmUgbWFwcGVkIHdpdGggUFJPVF9OT05FLiAgSW4gdGhpcyBjYXNlLFxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0OjMwOTpnZXRfdXNlcl9wYWdlcygpIHdpbGwgYmUgdW5hYmxlIHRvIGZhdWx0IGluIHRoZSBwYWdlcy4gIFRoYXQmIzM5O3Mgb2theS4gIElmIHBhZ2VzXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3QtMzEwLWRvIGVuZCB1cCBnZXR0aW5nIGZhdWx0ZWQgaW50byB0aGlzIFZNX0xPQ0tFRCBWTUEsIHRoZXkgd2lsbCBiZSBoYW5kbGVkIGluIHRoZVxuLS1cbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdD0zNDA9bWxvY2tfZml4dXAoKSBmaWx0ZXJzIHNldmVyYWwgY2xhc3NlcyBvZiBcJiMzNDtzcGVjaWFsXCYjMzQ7IFZNQXM6XG4tLVxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTM0NC0gICBtbG9ja2VkLiAgSW4gYW55IGNhc2UsIG1vc3Qgb2YgdGhlIHBhZ2VzIGhhdmUgbm8gc3RydWN0IHBhZ2UgaW4gd2hpY2ggdG8gc29cbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDozNDU6ICAgbWFyayB0aGUgcGFnZS4gIEJlY2F1c2Ugb2YgdGhpcywgZ2V0X3VzZXJfcGFnZXMoKSB3aWxsIGZhaWwgZm9yIHRoZXNlIFZNQXMsXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3QtMzQ2LSAgIHNvIHRoZXJlIGlzIG5vIHNlbnNlIGluIGF0dGVtcHRpbmcgdG8gdmlzaXQgdGhlbS5cbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9jYWNoZXRsYi5yc3Q9MTA5PUh5cGVyU3BhcmMgY3B15bCx5piv6L+Z5qC35LiA5Liq5YW35pyJ6L+Z56eN5bGe5oCn55qEY3B144CCXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkvY2FjaGV0bGIucnN0LTMwMi1cdOW9k+WGheaguOmcgOimgeiuv+mXruS4gOS4quWMv+WQjemhteeahOWGheWuueaXtu+8jOWug+S8muiwg+eUqOi/meS4quWHveaVsO+8iOebruWJjeWPquaciVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkvY2FjaGV0bGIucnN0OjMwMzpcdGdldF91c2VyX3BhZ2VzKCnvvInjgILms6jmhI/vvJpmbHVzaF9kY2FjaGVfcGFnZSgp5pWF5oSP5a+55Yy/5ZCN6aG15LiN6LW35L2cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzA0LVx055So44CC6buY6K6k55qE5a6e546w5pivbm9w77yI5a+55LqO5omA5pyJ55u45bmy55qE5p625p6E5bqU6K+l5L+d5oyB6L+Z5qC377yJ44CC5a+55LqO5LiN5LiA6Ie05oCnXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdC01My0gIOebtOaOpeeahOeUqOaIt+epuumXtEkvT+imgeaxguS4juS9nOS4uua9nOWcqEkvT+ebruagh+eahOWGheWtmOWMuuWfn+S/neaMgeWcqOWQjOS4gOeJqeeQhuWcsOWdgOS4iuOAgmliX3V2ZXJic1xuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1NDogIOaooeWdl+mAmui/h2dldF91c2VyX3BhZ2VzKCnlkoxwdXRfcGFnZSgp6LCD55So5p2l566h55CG5YaF5a2Y5Yy65Z+f55qE5Zu65a6a5ZKM6Kej6Zmk5Zu65a6a44CC5a6D6L+Y5qC4XG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0LTU1LSAg566X6L+b56iL55qEcGlubmVkX3Zt5Lit6KKr5Zu65a6a55qE5YaF5a2Y6YeP77yM5bm25qOA5p+l6Z2e54m55p2D6L+b56iL5piv5ZCm6LaF6L+H5YW2UkxJTUlUX01FTUxPQ0vpmZDliLbjgIJcbi0tXG5hcmNoL2FybS9tbS9mbHVzaC5jPTM3Mz1FWFBPUlRfU1lNQk9MKGZsdXNoX2RjYWNoZV9wYWdlKTtcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc0LS8qXG5hcmNoL2FybS9tbS9mbHVzaC5jOjM3NTogKiBGbHVzaCBhbiBhbm9ueW1vdXMgcGFnZSBzbyB0aGF0IHVzZXJzIG9mIGdldF91c2VyX3BhZ2VzKClcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc2LSAqIGNhbiBzYWZlbHkgYWNjZXNzIHRoZSBkYXRhLiAgVGhlIGV4cGVjdGVkIHNlcXVlbmNlIGlzOlxuYXJjaC9hcm0vbW0vZmx1c2guYy0zNzctICpcbmFyY2gvYXJtL21tL2ZsdXNoLmM6Mzc4OiAqICBnZXRfdXNlcl9wYWdlcygpXG5hcmNoL2FybS9tbS9mbHVzaC5jLTM3OS0gKiAgICAtXHUwMDNlIGZsdXNoX2Fub25fcGFnZVxuLS1cbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYz03NzI9c3RhdGljIGludCBrdm1fbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdwYSwgYm9vbCB3cml0ZSlcbi0tXG5hcmNoL2xvb25nYXJjaC9rdm0vbW11LmMtODEwLVx0ICogRW5zdXJlIHRoZSByZWFkIG9mIG1tdV9pbnZhbGlkYXRlX3NlcSBpc24mIzM5O3QgcmVvcmRlcmVkIHdpdGggUFRFIHJlYWRzIGluXG5hcmNoL2xvb25nYXJjaC9rdm0vbW11LmM6ODExOlx0ICoga3ZtX2ZhdWx0aW5fcGZuKCkgKHdoaWNoIGNhbGxzIGdldF91c2VyX3BhZ2VzKCkpLCBzbyB0aGF0IHdlIGRvbiYjMzk7dFxuYXJjaC9sb29uZ2FyY2gva3ZtL21tdS5jLTgxMi1cdCAqIHJpc2sgdGhlIHBhZ2Ugd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIGdldHRpbmcgdW5tYXBwZWQgYmVmb3JlIHdlIGhhdmUgYVxuLS1cbmFyY2gvbWlwcy9rdm0vbW11LmM9NTQ3PXN0YXRpYyBpbnQga3ZtX21pcHNfbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdwYSxcbi0tXG5hcmNoL21pcHMva3ZtL21tdS5jLTU4MS1cdCAqIEVuc3VyZSB0aGUgcmVhZCBvZiBtbXVfaW52YWxpZGF0ZV9zZXEgaXNuJiMzOTt0IHJlb3JkZXJlZCB3aXRoIFBURSByZWFkc1xuYXJjaC9taXBzL2t2bS9tbXUuYzo1ODI6XHQgKiBpbiBrdm1fZmF1bHRpbl9wZm4oKSAod2hpY2ggY2FsbHMgZ2V0X3VzZXJfcGFnZXMoKSksIHNvIHRoYXQgd2UgZG9uJiMzOTt0XG5hcmNoL21pcHMva3ZtL21tdS5jLTU4My1cdCAqIHJpc2sgdGhlIHBhZ2Ugd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIGdldHRpbmcgdW5tYXBwZWQgYmVmb3JlIHdlIGhhdmUgYVxuLS1cbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmM9Njc4PXN0YXRpYyB2b2lkIGt2bXBwY191cGRhdGVfdnBhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bXBwY192cGEgKnZwYXAsXG4tLVxuYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYy02ODgtXHQgKiBidXQgd2UgY2FuJiMzOTt0IGNhbGwga3ZtcHBjX3Bpbl9ndWVzdF9wYWdlIHVuZGVyIHRoZSBsb2NrXG5hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jOjY4OTpcdCAqIGFzIGl0IGRvZXMgZ2V0X3VzZXJfcGFnZXMoKSBhbmQgZG93bl9yZWFkKCkuICBTbyB3ZVxuYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYy02OTAtXHQgKiBoYXZlIHRvIGRyb3AgdGhlIGxvY2ssIHBpbiB0aGUgcGFnZSwgdGhlbiBnZXQgdGhlIGxvY2tcbi0tXG5hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2VfNjQuYz05MT12b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpXG4tLVxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmMtOTYtLyogVG8gZ2V0IHRoZSBuZWNlc3NhcnkgcGFnZSBzdHJ1Y3QsIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZmlyc3QgY2FsbHNcbmFyY2gvc3BhcmMva2VybmVsL3B0cmFjZV82NC5jOjk3OiAqIGdldF91c2VyX3BhZ2VzKCkuICBUaGlzIGhhcyBkb25lIGEgZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGVcbmFyY2gvc3BhcmMva2VybmVsL3B0cmFjZV82NC5jLTk4LSAqIGFjY2Vzc2VkIHBhZ2UuICBUaGVuIG91ciBjYWxsZXIgKGNvcHlfe3RvLGZyb219X3VzZXJfcGFnZSgpKSBkaWRcbi0tXG5hcmNoL3g4Ni9rZXJuZWwvY3B1L3NneC9pb2N0bC5jPTIwNz1zdGF0aWMgaW50IF9fc2d4X2VuY2xfYWRkX3BhZ2Uoc3RydWN0IHNneF9lbmNsICplbmNsLFxuLS1cbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMtMjI0LVxuYXJjaC94ODYva2VybmVsL2NwdS9zZ3gvaW9jdGwuYzoyMjU6XHRyZXQgPSBnZXRfdXNlcl9wYWdlcyhzcmMsIDEsIDAsIFx1MDAyNnNyY19wYWdlKTtcbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMtMjI2LVx0aWYgKHJldCBcdTAwM2MgMSlcbi0tXG5hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jPTIxNj12b2lkIHVwZGF0ZV9tbXVfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbmFyY2gveHRlbnNhL21tL2NhY2hlLmMtMjY2LS8qXG5hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jOjI2NzogKiBhY2Nlc3NfcHJvY2Vzc192bSgpIGhhcyBjYWxsZWQgZ2V0X3VzZXJfcGFnZXMoKSwgd2hpY2ggaGFzIGRvbmUgYVxuYXJjaC94dGVuc2EvbW0vY2FjaGUuYy0yNjgtICogZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGUgcGFnZS5cbi0tXG5ibG9jay9iaW8uYz0xNjUwPUVYUE9SVF9TWU1CT0woYmlvX2ZyZWVfcGFnZXMpO1xuLS1cbmJsb2NrL2Jpby5jLTE2NjItICogTm90ZSB0aGF0IHRoaXMgY29kZSBpcyB2ZXJ5IGhhcmQgdG8gdGVzdCB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyBiZWNhdXNlXG5ibG9jay9iaW8uYzoxNjYzOiAqIGRpcmVjdC1pbyBwaW5zIHRoZSBwYWdlcyB3aXRoIGdldF91c2VyX3BhZ2VzKCkuICBUaGlzIG1ha2VzXG5ibG9jay9iaW8uYy0xNjY0LSAqIGlzX3BhZ2VfY2FjaGVfZnJlZWFibGUgcmV0dXJuIGZhbHNlLCBhbmQgdGhlIFZNIHdpbGwgbm90IGNsZWFuIHRoZSBwYWdlcy5cbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM9MTA2MT1zdGF0aWMgaW50IGluaXRfdXNlcl9wYWdlcyhzdHJ1Y3Qga2dkX21lbSAqbWVtLCB1aW50NjRfdCB1c2VyX2FkZHIsXG4tLVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2FtZGtmZF9ncHV2bS5jLTExMDQtXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM6MTEwNTpcdHJldCA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIHJhbmdlKTtcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0xMTA2LVx0aWYgKHJldCkge1xuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYz0yNTQyPXN0YXRpYyBpbnQgdXBkYXRlX2ludmFsaWRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1ka2ZkX3Byb2Nlc3NfaW5mbyAqcHJvY2Vzc19pbmZvLFxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0yNjAwLVx0XHQvKiBHZXQgdXBkYXRlZCB1c2VyIHBhZ2VzICovXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM6MjYwMTpcdFx0cmV0ID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgbWVtLVx1MDAzZXJhbmdlKTtcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0yNjAyLVx0XHRpZiAocmV0KSB7XG4tLVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2NzLmM9ODQ0PXN0YXRpYyBpbnQgYW1kZ3B1X2NzX3BhcnNlcl9ib3Moc3RydWN0IGFtZGdwdV9jc19wYXJzZXIgKnAsXG4tLVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2NzLmMtODg3LVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2NzLmM6ODg4Olx0XHRyID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgZS1cdTAwM2VyYW5nZSk7XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYy04ODktXHRcdGlmIChyKVxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYz00OTU9aW50IGFtZGdwdV9nZW1fdXNlcnB0cl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLFxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYy01NTAtXHRcdFx0cmV0dXJuIC1FTk9NRU07XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2VtLmM6NTUxOlx0XHRyID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgcmFuZ2UpO1xuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dlbS5jLTU1Mi1cdFx0aWYgKHIpIHtcbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmM9NzIyPXN0cnVjdCBhbWRncHVfdHRtX3R0IHtcbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmMtNzQzLSAqL1xuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jOjc0NDppbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpibyxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYy03NDUtXHRcdFx0XHQgc3RydWN0IGFtZGdwdV9obW1fcmFuZ2UgKnJhbmdlKVxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaD0yMDc9dWludDY0X3QgYW1kZ3B1X3R0bV9kb21haW5fc3RhcnQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHVpbnQzMl90IHR5cGUpO1xuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaC0yMDktI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9BTURHUFVfVVNFUlBUUilcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaDoyMTA6aW50IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGFtZGdwdV9ibyAqYm8sXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjExLVx0XHRcdFx0IHN0cnVjdCBhbWRncHVfaG1tX3JhbmdlICpyYW5nZSk7XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjEyLSNlbHNlXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmg6MjEzOnN0YXRpYyBpbmxpbmUgaW50IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGFtZGdwdV9ibyAqYm8sXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjE0LVx0XHRcdFx0XHQgICAgICAgc3RydWN0IGFtZGdwdV9obW1fcmFuZ2UgKnJhbmdlKVxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jPTk1OD1hbWRncHVfdXNlcnFfdm1fdmFsaWRhdGUoc3RydWN0IGFtZGdwdV91c2VycV9tZ3IgKnVxX21ncilcbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdXNlcnEuYy0xMDU5LVx0XHRcdGJvID0gcmFuZ2UtXHUwMDNlYm87XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdXNlcnEuYzoxMDYwOlx0XHRcdHJldCA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIHJhbmdlKTtcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jLTEwNjEtXHRcdFx0aWYgKHJldClcbi0tXG5kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90dG0uYz0zMjM9c3RhdGljIGludCByYWRlb25fdHRtX3R0X3Bpbl91c2VycHRyKHN0cnVjdCB0dG1fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX3R0ICp0dG0pXG4tLVxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMtMzUxLVxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmM6MzUyOlx0XHRyID0gZ2V0X3VzZXJfcGFnZXModXNlcnB0ciwgbnVtX3BhZ2VzLCB3cml0ZSA/IEZPTExfV1JJVEUgOiAwLFxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMtMzUzLVx0XHRcdFx0ICAgcGFnZXMpO1xuLS1cbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmM9MTc3PXN0YXRpYyBpbnQgbm9uX2F0b21pY19wdGVfbG9va3VwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMtMTg3LSNlbmRpZlxuZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmF1bHQuYzoxODg6XHRpZiAoZ2V0X3VzZXJfcGFnZXModmFkZHIsIDEsIHdyaXRlID8gRk9MTF9XUklURSA6IDAsIFx1MDAyNnBhZ2UpIFx1MDAzYz0gMClcbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMtMTg5LVx0XHRyZXR1cm4gLUVGQVVMVDtcbi0tXG5mcy9kYXguYz02ODc9c3RhdGljIHZvaWQgKmdyYWJfbWFwcGluZ19lbnRyeShzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbi0tXG5mcy9kYXguYy03ODMtICogYW55IHBhZ2UgaW4gdGhlIG1hcHBpbmcgaXMgYnVzeSwgaS5lLiBmb3IgRE1BLCBvciBvdGhlclxuZnMvZGF4LmM6Nzg0OiAqIGdldF91c2VyX3BhZ2VzKCkgdXNhZ2VzLlxuZnMvZGF4LmMtNzg1LSAqXG4tLVxuZnMvZGF4LmM9NzkxPXN0cnVjdCBwYWdlICpkYXhfbGF5b3V0X2J1c3lfcGFnZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9kYXguYy04MTMtXHQgKiBhZ2FpbnN0IGlzIG5vIGxvbmdlciBtYXBwZWQgaW4gdGhlIHBhZ2UgdGFibGVzIGFuZCBiYWlsIHRvIHRoZVxuZnMvZGF4LmM6ODE0Olx0ICogZ2V0X3VzZXJfcGFnZXMoKSBzbG93IHBhdGguICBUaGUgc2xvdyBwYXRoIGlzIHByb3RlY3RlZCBieVxuZnMvZGF4LmMtODE1LVx0ICogcHRlX2xvY2soKSBhbmQgcG1kX2xvY2soKS4gTmV3IHJlZmVyZW5jZXMgYXJlIG5vdCB0YWtlbiB3aXRob3V0XG4tLVxuZnMvZGlyZWN0LWlvLmM9MjQ0PXN0YXRpYyBzc2l6ZV90IGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIHNzaXplX3QgcmV0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4tLVxuZnMvZGlyZWN0LWlvLmMtMjg3LVx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxuZnMvZGlyZWN0LWlvLmM6Mjg4Olx0ICogbm9uLWRpcmVjdCByZWFkYWhlYWQsIG9yIGZhdWx0ZWQgaW4gYnkgZ2V0X3VzZXJfcGFnZXMoKSBpZiB0aGUgc291cmNlXG5mcy9kaXJlY3QtaW8uYy0yODktXHQgKiBvZiB0aGUgd3JpdGUgd2FzIGFuIG1tYXAmIzM5O2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSYjMzk7cmUgd3JpdGluZy4gIEVpdGhlclxuLS1cbmZzL2RpcmVjdC1pby5jPTg5OT1zdGF0aWMgaW50IGRvX2RpcmVjdF9JTyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLFxuLS1cbmZzL2RpcmVjdC1pby5jLTEwNDYtXG5mcy9kaXJlY3QtaW8uYzoxMDQ3Olx0XHQvKiBEcm9wIHRoZSBwaW4gd2hpY2ggd2FzIHRha2VuIGluIGdldF91c2VyX3BhZ2VzKCkgKi9cbmZzL2RpcmVjdC1pby5jLTEwNDgtXHRcdGRpb191bnBpbl9wYWdlKGRpbywgcGFnZSk7XG4tLVxuZnMvZXhlYy5jPTQwMj1zdGF0aWMgaW50IGJwcm1fc3RhY2tfbGltaXRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4tLVxuZnMvZXhlYy5jLTQ0OC0gKiAmIzM5O2NvcHlfc3RyaW5ncygpJiMzOTsgY29waWVzIGFyZ3VtZW50L2Vudmlyb25tZW50IHN0cmluZ3MgZnJvbSB0aGUgb2xkXG5mcy9leGVjLmM6NDQ5OiAqIHByb2Nlc3NlcyYjMzk7cyBtZW1vcnkgdG8gdGhlIG5ldyBwcm9jZXNzJiMzOTtzIHN0YWNrLiAgVGhlIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKVxuZnMvZXhlYy5jLTQ1MC0gKiBlbnN1cmVzIHRoZSBkZXN0aW5hdGlvbiBwYWdlIGlzIGNyZWF0ZWQgYW5kIG5vdCBzd2FwcGVkIG91dC5cbi0tXG5mcy9mdXNlL2RheC5jPTkxMj1pbm9kZV9pbmxpbmVfcmVjbGFpbV9vbmVfZG1hcChzdHJ1Y3QgZnVzZV9jb25uX2RheCAqZmNkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2Z1c2UvZGF4LmMtOTM3LVx0ICogTWFrZSBzdXJlIHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIGlub2RlIHBhZ2VzIHVzaW5nXG5mcy9mdXNlL2RheC5jOjkzODpcdCAqIGdldF91c2VyX3BhZ2VzKClcbmZzL2Z1c2UvZGF4LmMtOTM5LVx0ICovXG4tLVxuZnMvZnVzZS9maWxlLmM9MTU2MT1zdGF0aWMgaW5saW5lIHNpemVfdCBmdXNlX2dldF9mcmFnX3NpemUoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppaSxcbi0tXG5mcy9mdXNlL2ZpbGUuYy0xNTY2LVxuZnMvZnVzZS9maWxlLmM6MTU2NzpzdGF0aWMgaW50IGZ1c2VfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGZ1c2VfYXJnc19wYWdlcyAqYXAsIHN0cnVjdCBpb3ZfaXRlciAqaWksXG5mcy9mdXNlL2ZpbGUuYy0xNTY4LVx0XHRcdCAgICAgICBzaXplX3QgKm5ieXRlc3AsIGludCB3cml0ZSxcbi0tXG5mcy9mdXNlL2ZpbGUuYz0xNjY1PXNzaXplX3QgZnVzZV9kaXJlY3RfaW8oc3RydWN0IGZ1c2VfaW9fcHJpdiAqaW8sIHN0cnVjdCBpb3ZfaXRlciAqaXRlcixcbi0tXG5mcy9mdXNlL2ZpbGUuYy0xNzE5LVxuZnMvZnVzZS9maWxlLmM6MTcyMDpcdFx0ZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhcdTAwMjZpYS1cdTAwM2VhcCwgaXRlciwgXHUwMDI2bmJ5dGVzLCB3cml0ZSxcbmZzL2Z1c2UvZmlsZS5jLTE3MjEtXHRcdFx0XHRcdCAgbWF4X3BhZ2VzLCBmYy1cdTAwM2V1c2VfcGFnZXNfZm9yX2t2ZWNfaW8pO1xuLS1cbmZzL2lvbWFwL2RpcmVjdC1pby5jPTEwND1zc2l6ZV90IGlvbWFwX2Rpb19jb21wbGV0ZShzdHJ1Y3QgaW9tYXBfZGlvICpkaW8pXG4tLVxuZnMvaW9tYXAvZGlyZWN0LWlvLmMtMTI3LVx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxuZnMvaW9tYXAvZGlyZWN0LWlvLmM6MTI4Olx0ICogbm9uLWRpcmVjdCByZWFkYWhlYWQsIG9yIGZhdWx0ZWQgaW4gYnkgZ2V0X3VzZXJfcGFnZXMoKSBpZiB0aGUgc291cmNlXG5mcy9pb21hcC9kaXJlY3QtaW8uYy0xMjktXHQgKiBvZiB0aGUgd3JpdGUgd2FzIGFuIG1tYXAmIzM5O2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSYjMzk7cmUgd3JpdGluZy4gIEVpdGhlclxuLS1cbmZzL25mcy9kaXJlY3QuYz0zMjY9c3RhdGljIGNvbnN0IHN0cnVjdCBuZnNfcGdpb19jb21wbGV0aW9uX29wcyBuZnNfZGlyZWN0X3JlYWRfY29tcGxldGlvbl9vcHMgPSB7XG4tLVxuZnMvbmZzL2RpcmVjdC5jLTMzMy0gKiBGb3IgZWFjaCByc2l6ZSYjMzk7ZCBjaHVuayBvZiB0aGUgdXNlciYjMzk7cyBidWZmZXIsIGRpc3BhdGNoIGFuIE5GUyBSRUFEXG5mcy9uZnMvZGlyZWN0LmM6MzM0OiAqIG9wZXJhdGlvbi4gIElmIG5mc19yZWFkZGF0YV9hbGxvYygpIG9yIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsXG5mcy9uZnMvZGlyZWN0LmMtMzM1LSAqIGJhaWwgYW5kIHN0b3Agc2VuZGluZyBtb3JlIHJlYWRzLiAgUmVhZCBsZW5ndGggYWNjb3VudGluZyBpc1xuLS1cbmZzL25mcy9kaXJlY3QuYz04NTI9c3RhdGljIGNvbnN0IHN0cnVjdCBuZnNfcGdpb19jb21wbGV0aW9uX29wcyBuZnNfZGlyZWN0X3dyaXRlX2NvbXBsZXRpb25fb3BzID0ge1xuLS1cbmZzL25mcy9kaXJlY3QuYy04NjUtICogRm9yIGVhY2ggd3NpemUmIzM5O2QgY2h1bmsgb2YgdGhlIHVzZXImIzM5O3MgYnVmZmVyLCBkaXNwYXRjaCBhbiBORlMgV1JJVEVcbmZzL25mcy9kaXJlY3QuYzo4NjY6ICogb3BlcmF0aW9uLiAgSWYgbmZzX3dyaXRlZGF0YV9hbGxvYygpIG9yIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsXG5mcy9uZnMvZGlyZWN0LmMtODY3LSAqIGJhaWwgYW5kIHN0b3Agc2VuZGluZyBtb3JlIHdyaXRlcy4gIFdyaXRlIGxlbmd0aCBhY2NvdW50aW5nIGlzXG4tLVxuZnMveGZzL3hmc19pbm9kZS5jPTk2PXhmc19sb2NrX2ZsYWdzX2Fzc2VydChcbi0tXG5mcy94ZnMveGZzX2lub2RlLmMtMTI4LSAqIGNhbiBmYXVsdCBpbiBwYWdlcyBkdXJpbmcgY29weSBpbi9vdXQgKGZvciBidWZmZXJlZCBJTykgb3IgcmVxdWlyZSB0aGVcbmZzL3hmcy94ZnNfaW5vZGUuYzoxMjk6ICogbW1hcF9sb2NrIGluIGdldF91c2VyX3BhZ2VzKCkgdG8gbWFwIHRoZSB1c2VyIHBhZ2VzIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzXG5mcy94ZnMveGZzX2lub2RlLmMtMTMwLSAqIHNwYWNlIGZvciBkaXJlY3QgSU8uIFNpbWlsYXJseSB0aGUgaV9yd3NlbSBjYW5ub3QgYmUgdGFrZW4gaW5zaWRlIGEgcGFnZVxuLS1cbmluY2x1ZGUvbGludXgvbW0uaD03ODM9c3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHtcbi0tXG5pbmNsdWRlL2xpbnV4L21tLmgtODM0LVxuaW5jbHVkZS9saW51eC9tbS5oOjgzNTpcdC8qIGNhbGxlZCBieSBhY2Nlc3NfcHJvY2Vzc192bSB3aGVuIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsIHR5cGljYWxseVxuaW5jbHVkZS9saW51eC9tbS5oLTgzNi1cdCAqIGZvciB1c2UgYnkgc3BlY2lhbCBWTUFzLiBTZWUgYWxzbyBnZW5lcmljX2FjY2Vzc19waHlzKCkgZm9yIGEgZ2VuZXJpY1xuLS1cbmluY2x1ZGUvbGludXgvbW0uaD0yMTg2PXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbi0tXG5pbmNsdWRlL2xpbnV4L21tLmgtMjIyMi0gKiBMb2NraW5nOiB0aGUgbG9ja2xlc3MgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiBmb2xpb190cnlfZ2V0X3JjdSgpXG5pbmNsdWRlL2xpbnV4L21tLmg6MjIyMzogKiBwcm92aWRlcyBzYWZlIG9wZXJhdGlvbiBmb3IgZ2V0X3VzZXJfcGFnZXMoKSwgZm9saW9fbWtjbGVhbigpIGFuZFxuaW5jbHVkZS9saW51eC9tbS5oLTIyMjQtICogb3RoZXIgY2FsbHMgdGhhdCByYWNlIHRvIHNldCB1cCBwYWdlIHRhYmxlIGVudHJpZXMuXG4tLVxuaW5jbHVkZS9saW51eC9tbS5oPTMyNDE9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbmluY2x1ZGUvbGludXgvbW0uaC0zMjY3LVxuaW5jbHVkZS9saW51eC9tbS5oOjMyNjg6bG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNjktXHRcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTtcbi0tXG5pbmNsdWRlL3VhcGkvbGludXgvbml0cm9fZW5jbGF2ZXMuaC0xNDYtICogKiBORV9FUlJfSU5WQUxJRF9GTEFHX1ZBTFVFXHRcdC0gVGhlIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBmbGFnIGlzIGludmFsaWQuXG5pbmNsdWRlL3VhcGkvbGludXgvbml0cm9fZW5jbGF2ZXMuaDoxNDc6ICogKiBFcnJvciBjb2RlcyBmcm9tIGdldF91c2VyX3BhZ2VzKCkuXG5pbmNsdWRlL3VhcGkvbGludXgvbml0cm9fZW5jbGF2ZXMuaC0xNDgtICogKiBFcnJvciBjb2RlcyBmcm9tIHRoZSBORSBQQ0kgZGV2aWNlIHJlcXVlc3QuXG4tLVxua2VybmVsL2V2ZW50cy91cHJvYmVzLmM9MjQwMD1zdGF0aWMgaW50IGlzX3RyYXBfYXRfYWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2YWRkcilcbi0tXG5rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYy0yNDE1LVxua2VybmVsL2V2ZW50cy91cHJvYmVzLmM6MjQxNjpcdHJlc3VsdCA9IGdldF91c2VyX3BhZ2VzKHZhZGRyLCAxLCBGT0xMX0ZPUkNFLCBcdTAwMjZwYWdlKTtcbmtlcm5lbC9ldmVudHMvdXByb2Jlcy5jLTI0MTctXHRpZiAocmVzdWx0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9mdXRleC9jb3JlLmM9NTAyPWludCBnZXRfZnV0ZXhfa2V5KHUzMiBfX3VzZXIgKnVhZGRyLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuaW9uIGZ1dGV4X2tleSAqa2V5LFxuLS1cbmtlcm5lbC9mdXRleC9jb3JlLmMtNzM1LSAqIGRpc2FibGVkIHNlY3Rpb24gc28gd2UgY2FuIGFzIHdlbGwgYXZvaWQgdGhlICNQRiBvdmVyaGVhZCBieVxua2VybmVsL2Z1dGV4L2NvcmUuYzo3MzY6ICogY2FsbGluZyBnZXRfdXNlcl9wYWdlcygpIHJpZ2h0IGF3YXkuXG5rZXJuZWwvZnV0ZXgvY29yZS5jLTczNy0gKi9cbi0tXG5saWIvaW92X2l0ZXIuYz0xMjk9RVhQT1JUX1NZTUJPTChmYXVsdF9pbl9pb3ZfaXRlcl9yZWFkYWJsZSk7XG4tLVxubGliL2lvdl9pdGVyLmMtMTM1LSAqXG5saWIvaW92X2l0ZXIuYzoxMzY6ICogRmF1bHRzIGluIHRoZSBpdGVyYXRvciB1c2luZyBnZXRfdXNlcl9wYWdlcygpLCBpLmUuLCB3aXRob3V0IHRyaWdnZXJpbmdcbmxpYi9pb3ZfaXRlci5jLTEzNy0gKiBoYXJkd2FyZSBwYWdlIGZhdWx0cy4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0XG4tLVxubW0vS2NvbmZpZz0xMzA2PWNvbmZpZyBHVVBfVEVTVFxubW0vS2NvbmZpZzoxMzA3Olx0Ym9vbCBcJiMzNDtFbmFibGUgaW5mcmFzdHJ1Y3R1cmUgZm9yIGdldF91c2VyX3BhZ2VzKCktcmVsYXRlZCB1bml0IHRlc3RzXCYjMzQ7XG5tbS9LY29uZmlnLTEzMDgtXHRkZXBlbmRzIG9uIERFQlVHX0ZTXG4tLVxubW0vZmlsZW1hcC5jPTE1MD1zdGF0aWMgdm9pZCBmaWxlbWFwX3VuYWNjb3VudF9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5tbS9maWxlbWFwLmMtMjAyLVx0ICogQnV0IGl0JiMzOTtzIGhhcm1sZXNzIG9uIGluLW1lbW9yeSBmaWxlc3lzdGVtcyBsaWtlIHRtcGZzOyBhbmQgY2FuXG5tbS9maWxlbWFwLmM6MjAzOlx0ICogb2NjdXIgd2hlbiBhIGRyaXZlciB3aGljaCBkaWQgZ2V0X3VzZXJfcGFnZXMoKSBzZXRzIHBhZ2UgZGlydHlcbm1tL2ZpbGVtYXAuYy0yMDQtXHQgKiBiZWZvcmUgcHV0dGluZyBpdCwgd2hpbGUgdGhlIGlub2RlIGlzIGJlaW5nIGZpbmFsbHkgZXZpY3RlZC5cbi0tXG5tbS9maWxlbWFwLmM9NDI4MT1nZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxuLS1cbm1tL2ZpbGVtYXAuYy00MzAxLVx0ICogRmluYWxseSwgdHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuXG5tbS9maWxlbWFwLmM6NDMwMjpcdCAqIGNhY2hlZCBieSBub24tZGlyZWN0IHJlYWRhaGVhZCwgb3IgZmF1bHRlZCBpbiBieSBnZXRfdXNlcl9wYWdlcygpXG5tbS9maWxlbWFwLmMtNDMwMy1cdCAqIGlmIHRoZSBzb3VyY2Ugb2YgdGhlIHdyaXRlIHdhcyBhbiBtbWFwJiMzOTtlZCByZWdpb24gb2YgdGhlIGZpbGVcbi0tXG5tbS9ndXAuYz0yNDc9c3RhdGljIGlubGluZSBzdHJ1Y3QgZm9saW8gKmd1cF9mb2xpb19uZXh0KHN0cnVjdCBwYWdlICoqbGlzdCxcbi0tXG5tbS9ndXAuYy0yNjctICpcbm1tL2d1cC5jOjI2ODogKiBcJiMzNDtndXAtcGlubmVkIHBhZ2VcJiMzNDsgcmVmZXJzIHRvIGEgcGFnZSB0aGF0IGhhcyBoYWQgb25lIG9mIHRoZSBnZXRfdXNlcl9wYWdlcygpXG5tbS9ndXAuYy0yNjktICogdmFyaWFudHMgY2FsbGVkIG9uIHRoYXQgcGFnZS5cbi0tXG5tbS9ndXAuYz05Mjk9c3RhdGljIHVuc2lnbmVkIGxvbmcgZm9sbG93X3B0ZV9iYXRjaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy05NTMtICogQSBmYWlsdXJlIG9uIHRoZSBmaXJzdCBQVEUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gQSBmYWlsdXJlIGFmdGVyIHRoYXRcbm1tL2d1cC5jOjk1NDogKiBpcyBhIHNob3J0IHJlYWQ7IF9fZ2V0X3VzZXJfcGFnZXMoKSByZXRyeWluZyB0aGUgcmVhZCB3aWxsIGdldCB0aGUgZXJyb3IuXG5tbS9ndXAuYy05NTUtICovXG4tLVxubW0vZ3VwLmM9MTQwMj1zdGF0aWMgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpndXBfdm1hX2xvb2t1cChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0xNDM3LS8qKlxubW0vZ3VwLmM6MTQzODogKiBfX2dldF91c2VyX3BhZ2VzKCkgLSBwaW4gdXNlciBwYWdlcyBpbiBtZW1vcnlcbm1tL2d1cC5jLTE0MzktICogQG1tOlx0XHRtbV9zdHJ1Y3Qgb2YgdGFyZ2V0IG1tXG4tLVxubW0vZ3VwLmMtMTQ5MC0gKi9cbm1tL2d1cC5jOjE0OTE6c3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2d1cC5jLTE0OTItXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vZ3VwLmM9MTYxMz1zdGF0aWMgYm9vbCB2bWFfcGVybWl0c19mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy0xNjUxLSAqXG5tbS9ndXAuYzoxNjUyOiAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBnZXRfdXNlcl9wYWdlcygpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsXG5tbS9ndXAuYy0xNjUzLSAqIHVuY29uZGl0aW9uYWxseSBjYWxsIGhhbmRsZV9tbV9mYXVsdCgpIHdoaWNoIHdpbGwgaW4gdHVybiBwZXJmb3JtIGFsbCB0aGVcbm1tL2d1cC5jLTE2NTQtICogbmVjZXNzYXJ5IFNXIGZpeHVwIG9mIHRoZSBkaXJ0eSBhbmQgeW91bmcgYml0cyBpbiB0aGUgUFRFLCB3aGlsZVxubW0vZ3VwLmM6MTY1NTogKiBnZXRfdXNlcl9wYWdlcygpIG9ubHkgZ3VhcmFudGVlcyB0byB1cGRhdGUgdGhlc2UgaW4gdGhlIHN0cnVjdCBwYWdlLlxubW0vZ3VwLmMtMTY1Ni0gKlxuLS1cbm1tL2d1cC5jPTE3MjY9c3RhdGljIGJvb2wgZ3VwX3NpZ25hbF9wZW5kaW5nKHVuc2lnbmVkIGludCBmbGFncylcbi0tXG5tbS9ndXAuYy0xNzQ2LSAqXG5tbS9ndXAuYzoxNzQ3OiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiwgdW5saWtlIF9fZ2V0X3VzZXJfcGFnZXMoKSwgd2lsbCBub3QgcmV0dXJuIDBcbm1tL2d1cC5jLTE3NDgtICogZm9yIG5yX3BhZ2VzIFx1MDAzZSAwLCB1bmxlc3MgRk9MTF9OT1dBSVQgaXMgdXNlZC5cbi0tXG5tbS9ndXAuYz0xNzUwPXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0xNzkyLVx0Zm9yICg7Oykge1xubW0vZ3VwLmM6MTc5MzpcdFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIG5yX3BhZ2VzLCBmbGFncywgcGFnZXMsXG5tbS9ndXAuYy0xNzk0LVx0XHRcdFx0ICAgICAgIGxvY2tlZCk7XG4tLVxubW0vZ3VwLmMtMTg1Mi1cdFx0KmxvY2tlZCA9IDE7XG5tbS9ndXAuYzoxODUzOlx0XHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgMSwgZmxhZ3MgfCBGT0xMX1RSSUVELFxubW0vZ3VwLmMtMTg1NC1cdFx0XHRcdCAgICAgICBwYWdlcywgbG9ja2VkKTtcbi0tXG5tbS9ndXAuYz0xOTE0PWxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtMTk2MC1cdCAqL1xubW0vZ3VwLmM6MTk2MTpcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZ3VwX2ZsYWdzLFxubW0vZ3VwLmMtMTk2Mi1cdFx0XHQgICAgICAgTlVMTCwgbG9ja2VkID8gbG9ja2VkIDogXHUwMDI2bG9jYWxfbG9ja2VkKTtcbi0tXG5tbS9ndXAuYy0xOTc5LSAqIFJldHVybnMgZWl0aGVyIG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMgaW4gdGhlIE1NLCBvciBhIG5lZ2F0aXZlIGVycm9yXG5tbS9ndXAuYzoxOTgwOiAqIGNvZGUgb24gZXJyb3IgKHNlZSBfX2dldF91c2VyX3BhZ2VzKCkpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXBvcnRzXG5tbS9ndXAuYy0xOTgxLSAqIGVycm9ycyByZWxhdGVkIHRvIFZNQXMsIHN1Y2ggYXMgaW5jb21wYXRpYmxlIG1hcHBpbmdzLCBhcyBleHBlY3RlZCBieVxuLS1cbm1tL2d1cC5jPTI3MjI9bG9uZyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vZ3VwLmMtMjczMS0vKipcbm1tL2d1cC5jOjI3MzI6ICogZ2V0X3VzZXJfcGFnZXMoKSAtIHBpbiB1c2VyIHBhZ2VzIGluIG1lbW9yeVxubW0vZ3VwLmMtMjczMy0gKiBAc3RhcnQ6ICAgICAgc3RhcnRpbmcgdXNlciBhZGRyZXNzXG4tLVxubW0vZ3VwLmMtMjc0NC0gKi9cbm1tL2d1cC5jOjI3NDU6bG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxubW0vZ3VwLmMtMjc0Ni1cdFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4tLVxubW0vZ3VwLmM9Mjc1Nj1FWFBPUlRfU1lNQk9MKGdldF91c2VyX3BhZ2VzKTtcbi0tXG5tbS9ndXAuYy0yNzYxLSAqICAgICAgbW1hcF9yZWFkX2xvY2sobW0pO1xubW0vZ3VwLmM6Mjc2MjogKiAgICAgIGdldF91c2VyX3BhZ2VzKG1tLCAuLi4sIHBhZ2VzLCBOVUxMKTtcbm1tL2d1cC5jLTI3NjMtICogICAgICBtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbi0tXG5tbS9ndXAuYz0zMzU5PUVYUE9SVF9TWU1CT0xfR1BMKGdldF91c2VyX3BhZ2VzX2Zhc3Rfb25seSk7XG4tLVxubW0vZ3VwLmMtMzM3MC0gKiBJZiBub3Qgc3VjY2Vzc2Z1bCwgaXQgd2lsbCBmYWxsIGJhY2sgdG8gdGFraW5nIHRoZSBsb2NrIGFuZFxubW0vZ3VwLmM6MzM3MTogKiBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkuXG5tbS9ndXAuYy0zMzcyLSAqXG4tLVxubW0vZ3VwLmM9MzQ1Nz1FWFBPUlRfU1lNQk9MKHBpbl91c2VyX3BhZ2VzX3JlbW90ZSk7XG4tLVxubW0vZ3VwLmMtMzQ2Ny0gKlxubW0vZ3VwLmM6MzQ2ODogKiBOZWFybHkgdGhlIHNhbWUgYXMgZ2V0X3VzZXJfcGFnZXMoKSwgZXhjZXB0IHRoYXQgRk9MTF9UT1VDSCBpcyBub3Qgc2V0LCBhbmRcbm1tL2d1cC5jLTM0NjktICogRk9MTF9QSU4gaXMgc2V0LlxuLS1cbm1tL2d1cF90ZXN0LmM9MTAxPXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMTQ3LVx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxubW0vZ3VwX3Rlc3QuYzoxNDg6XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncywgcGFnZXMgJiM0MzsgaSk7XG5tbS9ndXBfdGVzdC5jLTE0OS1cdFx0XHRicmVhaztcbi0tXG5tbS9ndXBfdGVzdC5jLTE2Ni1cdFx0XHRlbHNlXG5tbS9ndXBfdGVzdC5jOjE2NzpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE2OC1cdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4tLVxubW0vaG1tLmM9NjMxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1fd2Fsa19vcHMgaG1tX3dhbGtfb3BzID0ge1xuLS1cbm1tL2htbS5jLTY1NS0gKlxubW0vaG1tLmM6NjU2OiAqIFRoaXMgaXMgc2ltaWxhciB0byBnZXRfdXNlcl9wYWdlcygpLCBleGNlcHQgdGhhdCBpdCBjYW4gcmVhZCB0aGUgcGFnZSB0YWJsZXNcbm1tL2htbS5jLTY1Ny0gKiB3aXRob3V0IG11dGF0aW5nIHRoZW0gKGllIGNhdXNpbmcgZmF1bHRzKS5cbi0tXG5tbS9tYWR2aXNlLmM9MTg4Nz1zdGF0aWMgaW50IG1hZHZpc2VfZG9fYmVoYXZpb3IodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbl9pbixcbi0tXG5tbS9tYWR2aXNlLmMtMTkzOC0gKiAgTUFEVl9ET05URk9SSyAtIG9taXQgdGhpcyBhcmVhIGZyb20gY2hpbGQmIzM5O3MgYWRkcmVzcyBzcGFjZSB3aGVuIGZvcmtpbmc6XG5tbS9tYWR2aXNlLmM6MTkzOTogKlx0XHR0eXBpY2FsbHksIHRvIGF2b2lkIENPV2luZyBwYWdlcyBwaW5uZWQgYnkgZ2V0X3VzZXJfcGFnZXMoKS5cbm1tL21hZHZpc2UuYy0xOTQwLSAqICBNQURWX0RPRk9SSyAtIGNhbmNlbCBNQURWX0RPTlRGT1JLOiBubyBsb25nZXIgb21pdCB0aGlzIGFyZWEgd2hlbiBmb3JraW5nLlxuLS1cbm1tL21lbWZkLmM9Njc9c3RydWN0IGZvbGlvICptZW1mZF9hbGxvY19mb2xpbyhzdHJ1Y3QgZmlsZSAqbWVtZmQsIHBnb2ZmX3QgaWR4KVxuLS1cbm1tL21lbWZkLmMtMTQ3LSAqIFNldHRpbmcgU0VBTF9XUklURSByZXF1aXJlcyB1cyB0byB2ZXJpZnkgdGhlcmUmIzM5O3Mgbm8gcGVuZGluZyB3cml0ZXIuIEhvd2V2ZXIsXG5tbS9tZW1mZC5jOjE0ODogKiB2aWEgZ2V0X3VzZXJfcGFnZXMoKSwgZHJpdmVycyBtaWdodCBoYXZlIHNvbWUgcGVuZGluZyBJL08gd2l0aG91dCBhbnkgYWN0aXZlXG5tbS9tZW1mZC5jLTE0OS0gKiB1c2VyLXNwYWNlIG1hcHBpbmdzIChlZy4sIGRpcmVjdC1JTywgQUlPKS4gVGhlcmVmb3JlLCB3ZSBsb29rIGF0IGFsbCBmb2xpb3Ncbi0tXG5tbS9tbG9jay5jPTU3Nz1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb3VudF9tbV9tbG9ja2VkX3BhZ2VfbnIoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vbWxvY2suYy02MDYtLypcbm1tL21sb2NrLmM6NjA3OiAqIGNvbnZlcnQgZ2V0X3VzZXJfcGFnZXMoKSByZXR1cm4gdmFsdWUgdG8gcG9zaXggbWxvY2soKSBlcnJvclxubW0vbWxvY2suYy02MDgtICovXG4tLVxubW0vcGFnZXdhbGsuYz04MDA9aW50IHdhbGtfcGFnZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90IGZpcnN0X2luZGV4LFxuLS1cbm1tL3BhZ2V3YWxrLmMtODgxLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCAqbm90KiBiZSB1c2VkIGFzIGEgbmFpdmUgcmVwbGFjZW1lbnQgZm9yXG5tbS9wYWdld2Fsay5jOjg4MjogKiBnZXRfdXNlcl9wYWdlcygpIC8gcGluX3VzZXJfcGFnZXMoKSwgZXNwZWNpYWxseSBub3QgdG8gcGVyZm9ybSBETUEgb3Jcbm1tL3BhZ2V3YWxrLmMtODgzLSAqIHRvIGNhcmVsZXNzbHkgbW9kaWZ5IHBhZ2UgY29udGVudC4gVGhpcyBmdW5jdGlvbiBtYXkgKm9ubHkqIGJlIHVzZWQgdG8gZ3JhYlxuLS1cbm1tL3Ztc2Nhbi5jPTY3OT1zdGF0aWMgaW50IF9fcmVtb3ZlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4tLVxubW0vdm1zY2FuLmMtNzAzLVx0ICpcbm1tL3Ztc2Nhbi5jOjcwNDpcdCAqIGdldF91c2VyX3BhZ2VzKFx1MDAyNnBhZ2UpO1xubW0vdm1zY2FuLmMtNzA1LVx0ICogW3VzZXIgbWFwcGluZyBnb2VzIGF3YXldXG4tLVxubmV0L3Jkcy9pbmZvLmM9MTA1PXZvaWQgcmRzX2luZm9faXRlcl91bm1hcChzdHJ1Y3QgcmRzX2luZm9faXRlcmF0b3IgKml0ZXIpXG4tLVxubmV0L3Jkcy9pbmZvLmMtMTEzLS8qXG5uZXQvcmRzL2luZm8uYzoxMTQ6ICogZ2V0X3VzZXJfcGFnZXMoKSBjYWxsZWQgZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGUgcGFnZXMgZm9yIHVzLlxubmV0L3Jkcy9pbmZvLmMtMTE1LSAqL1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYz0xODEyPVRFU1RfRihpb21tdWZkX21vY2tfZG9tYWluLCByb191bnNoYXJlKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYy0xODI2LVx0ICogVGhlcmUgaGF2ZSBiZWVuIGxvdHMgb2YgY2hhbmdlcyB0byB0aGUgXCYjMzQ7dW5zaGFyZVwmIzM0OyBtZWNoYW5pc20gaW5cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYzoxODI3Olx0ICogZ2V0X3VzZXJfcGFnZXMoKSwgbWFrZSBzdXJlIGl0IHdvcmtzIHJpZ2h0LiBUaGUgd3JpdGUgdG8gdGhlIHBhZ2VcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYy0xODI4LVx0ICogYWZ0ZXIgd2UgbWFwIGl0IGZvciByZWFkaW5nIHNob3VsZCBub3QgY2hhbmdlIHRoZSBhc3NpZ25lZCBQRk4uXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYy04LSAqIHBhZ2VzIGR1cmluZyByZWFkcygpLiBEdWUgdG8gdGhlIDFzIGRlbGF5IG9mIHRoaXMgZmlsZS1zeXN0ZW0sIHRoaXMgaXMgYVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYzo5OiAqIG5pY2Ugd2F5IHRvIHRlc3QgcmFjZS1jb25kaXRpb25zIGFnYWluc3QgZ2V0X3VzZXJfcGFnZXMoKSBpbiB0aGUga2VybmVsLlxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYy0xMC0gKlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfdGVzdC5jLTMtICogbWVtZmQgR1VQIHRlc3QtY2FzZVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmM6NDogKiBUaGlzIHRlc3RzIG1lbWZkIGludGVyYWN0aW9ucyB3aXRoIGdldF91c2VyX3BhZ2VzKCkuIFdlIHJlcXVpcmUgdGhlXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy01LSAqIGZ1c2VfbW50LmMgcHJvZ3JhbSB0byBwcm92aWRlIGEgZmFrZSBkaXJlY3QtSU8gRlVTRSBtb3VudC1wb2ludCBmb3IgdXMuIFRoaXNcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy03LSAqIHJlYWQoKSBvbiBmaWxlcyBpbiB0aGF0IGZpbGUtc3lzdGVtIHdpbGwgcGluIHRoZSByZWNlaXZlLWJ1ZmZlciBwYWdlcyBmb3IgYXRcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfdGVzdC5jOjg6ICogbGVhc3QgMXMgdmlhIGdldF91c2VyX3BhZ2VzKCkuXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy05LSAqXG4tLVxudG9vbHMvdGVzdGluZy92bWEvaW5jbHVkZS9kdXAuaD02MzI9c3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHtcbi0tXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4My1cbnRvb2xzL3Rlc3Rpbmcvdm1hL2luY2x1ZGUvZHVwLmg6Njg0Olx0LyogY2FsbGVkIGJ5IGFjY2Vzc19wcm9jZXNzX3ZtIHdoZW4gZ2V0X3VzZXJfcGFnZXMoKSBmYWlscywgdHlwaWNhbGx5XG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4NS1cdCAqIGZvciB1c2UgYnkgc3BlY2lhbCBWTUFzLiBTZWUgYWxzbyBnZW5lcmljX2FjY2Vzc19waHlzKCkgZm9yIGEgZ2VuZXJpY1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzODA1MwoJCQkJCQkJb3V0cHV0OiAyMTgKCQkJCQkJCXRob3VnaHRzOiAyNTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgR1VQIFJlZmFjdG9yKioKCk9rYXksIHNvIEkgc2VlIHRoaXMgcGF0Y2ggaXMgdGFja2xpbmcgdGhlIGNvcmUgJiMzNDtHZXQgVXNlciBQYWdlcyYjMzQ7IChHVVApIGxvZ2ljIHdpdGhpbiBgbW0vZ3VwLmNgLiBUaGlzIGlzIGEgKm1ham9yKiByZWZhY3RvciwgYW5kIGl0JiMzOTtzIGEgY3JpdGljYWwgYXJlYS4gYGdldF91c2VyX3BhZ2VzYCBpcyB0aGUgbGluY2hwaW47IGl0JiMzOTtzIHRoZSBwcmltYXJ5IEFQSSB1c2VkIGJ5IGEgaHVnZSBudW1iZXIgb2YgZHJpdmVycywgc28gaXQgaGFzIHRvIGJlIG9uIHRoZSBsaXN0LiBJJiMzOTtsbCBkZWZpbml0ZWx5IGJlIGluY2x1ZGluZyB0aGF0IG9uZS4KCkxvb2tpbmcgYXQgdGhlIG90aGVyIGZvY3VzIHN5bWJvbHMsIEkgc2VlIHRoZXJlJiMzOTtzIGEgZmFtaWx5IG9mIGZ1bmN0aW9uczogYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgYXJlIGFsbCByZWxhdGVkIHRvIHBpbm5pbmcgb3IgZmF1bHRpbmcgaW4gdXNlciBwYWdlcywgd2hpY2ggYXJlIHVzZWQgdG8gYWNjZXNzIHVzZXItc3BhY2UgbWVtb3J5IGZyb20gdGhlIGtlcm5lbC4gVGhpcyBhbHNvIHN1Z2dlc3RzIHRoYXQgdGhlcmUgYXJlIHNpbWlsYXIgY2hhbmdlcyB0aGF0IHdlcmUgZG9uZS4gVGhlc2UgYWxsIG5lZWQgdG8gYmUgY2FyZWZ1bGx5IGV4YW1pbmVkIGFzIHdlbGwuIFRoZSBpbXBsaWNhdGlvbnMgb2YgYmF0Y2hpbmcgcGFnZSB0YWJsZSB3YWxrcyBmb3IgdGhlc2UgYXJlIHNpZ25pZmljYW50LgoKQW5kIG9mIGNvdXJzZSwgY29uc2lkZXJpbmcgdGhlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCRlNgIGNvbmZpZyBvcHRpb25zIGFyZSBhbHNvIG1lbnRpb25lZCwgSSBuZWVkIHRvIGtlZXAgdGhvc2UgaW4gbWluZC4gQW55IGNoYW5nZXMgaGVyZSBjb3VsZCBoYXZlIGZhci1yZWFjaGluZyBlZmZlY3RzIHdoZW4gdGhvc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQuCgpUaGUgcmVhc29uaW5nIGhlcmUgaXMgc29saWQuIFRoZSBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIGhvdyBHVVAgd29ya3Mg4oCTIGJhdGNoaW5nIHBhZ2UgdGFibGUgd2Fsa3MgbWVhbnMgaW1wcm92ZWQgcGVyZm9ybWFuY2UsIGJ1dCBhbHNvIGEgcG90ZW50aWFsIGZvciBuZXcgZWRnZSBjYXNlcyBhbmQgdnVsbmVyYWJpbGl0aWVzIHRvIGFwcGVhci4gQmVjYXVzZSB0aGlzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpcyB0b3VjaGVkIGJ5IHNvIG1hbnkgc3lzdGVtIGNhbGxzIChtbWFwLCBtYWR2aXNlLCBwdHJhY2UsIHByb2Nlc3Nfdm1fcmVhZHYpLCB0aGUgYXR0YWNrIHN1cmZhY2UgaXMgc3Vic3RhbnRpYWwuIEZ1enppbmcgdGhlIEdVUCBBUEkgZW50cnkgcG9pbnRzIGlzIHRoZSByaWdodCBhcHByb2FjaC4KCkkmIzM5O2xsIHVzZSBgc2V0LXJlc3VsdHNgIHRvIHJlcG9ydCB0aGlzLiBNeSByZXBvcnQgd2lsbCBpZGVudGlmeSB0aGUgc2lnbmlmaWNhbnQgY2hhbmdlcyBhbmQgdGhlIGZvY3VzIG5lZWRlZCBmb3IgZW5zdXJpbmcgdGhlIGNvZGUgaXMgY29ycmVjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0hVR0VUTEJGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzX3JlbW90ZSYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc191bmxvY2tlZCYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgICAmIzM0O3BvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgY29yZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYyBpbiBgbW0vZ3VwLmNgIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MgYW5kIHJldHVybiBtdWx0aXBsZSBwYWdlcyBhdCBvbmNlIGluc3RlYWQgb2Ygb25lIGJ5IG9uZS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSB0aGF0IGlzIHJlYWNoYWJsZSB2aWEgbWFueSBzeXNjYWxscyAoZS5nLiwgbW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KS4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIGV4cG9ydGVkIEdVUCBBUEkgZW50cnkgcG9pbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtIVUdFVExCRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXMmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfcmVtb3RlJiMzNDssCiAgICAmIzM0O3Bpbl91c2VyX3BhZ2VzX3VubG9ja2VkJiMzNDssCiAgICAmIzM0O2ZhdWx0aW5fcGFnZV9yYW5nZSYjMzQ7LAogICAgJiMzNDtwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdlNjc2ZThiMDM4ZTAxY2NkYzYyNzg1NzY5MzZkNjBkOWI3YWI4NApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vZ3VwLmMgYi9tbS9ndXAuYwppbmRleCAwNjkyMTE5Yjc5MDQzLi4xMDY4MDY2MzRiM2M0IDEwMDY0NAotLS0gYS9tbS9ndXAuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9ndXAuYwpAQCAtNjA4LDE1ICYjNDM7NjA4LDE1IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihzdHJ1Y3QgcGFnZSAqcGFnZSwKIAlyZXR1cm4gcGFnZSAmYW1wOyZhbXA7IFBhZ2VBbm9uKHBhZ2UpICZhbXA7JmFtcDsgUGFnZUFub25FeGNsdXNpdmUocGFnZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQomIzQzO3N0YXRpYyBsb25nIG5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlpZiAoIShmbGFncyAmYW1wOyBGT0xMX0RVTVApKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJLyoKIAkgKiBXaGVuIGNvcmUgZHVtcGluZywgd2UgZG9uJiMzOTt0IHdhbnQgdG8gYWxsb2NhdGUgdW5uZWNlc3NhcnkgcGFnZXMgb3IKLQkgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIE5VTEwgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsCiYjNDM7CSAqIHBhZ2UgdGFibGVzLiAgUmV0dXJuIGVycm9yIGluc3RlYWQgb2YgMCB0byBza2lwIGhhbmRsZV9tbV9mYXVsdCwKIAkgKiB0aGVuIGdldF9kdW1wX3BhZ2UoKSB3aWxsIHJldHVybiBOVUxMIHRvIGxlYXZlIGEgaG9sZSBpbiB0aGUgZHVtcC4KIAkgKiBCdXQgd2UgY2FuIG9ubHkgbWFrZSB0aGlzIG9wdGltaXphdGlvbiB3aGVyZSBhIGhvbGUgd291bGQgc3VyZWx5CiAJICogYmUgemVyby1maWxsZWQgaWYgaGFuZGxlX21tX2ZhdWx0KCkgYWN0dWFsbHkgZGlkIGhhbmRsZSBpdC4KQEAgLTYyNSwxMiAmIzQzOzYyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKm5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7CiAKIAkJaWYgKCFodWdldGxiZnNfcGFnZWNhY2hlX3ByZXNlbnQoaCwgdm1hLCBhZGRyZXNzKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwomIzQzOwkJCXJldHVybiAtRUZBVUxUOwogCX0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLSZndDt2bV9vcHMtJmd0O2ZhdWx0KSkgewotCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKJiM0MzsJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlpZiAoIXBhZ2VzKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzdHJ1Y3QgcGFnZSAqc3VicGFnZSA9IHBhZ2UgJiM0MzsgaTsKJiM0MzsKJiM0MzsJCXBhZ2VzW2ldID0gc3VicGFnZTsKJiM0MzsJCWZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIGFkZHJlc3MgJiM0MzsgaSAqIFBBR0VfU0laRSk7CiYjNDM7CQlmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTsKJiM0MzsJfQogfQogCiAjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTCkBAIC02NDYsMzggJiM0Mzs2NjMsNDMgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZF90IHB1ZCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHBhZ2UsIHZtYSwgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXB1ZF90IHB1ZCA9ICpwdWRwOwogCXVuc2lnbmVkIGxvbmcgcGZuID0gcHVkX3BmbihwdWQpOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZiwgbnI7CiAJaW50IHJldDsKIAogCWFzc2VydF9zcGluX2xvY2tlZChwdWRfbG9ja3B0cihtbSwgcHVkcCkpOwogCiAJaWYgKCFwdWRfcHJlc2VudChwdWQpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7CiAJICAgICFjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWQsIHBmbl90b19wYWdlKHBmbiksIHZtYSwgZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCi0JcGZuICYjNDM7PSAoYWRkciAmYW1wOyB+UFVEX01BU0spICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CW9mZiA9IFBGTl9ET1dOKGFkZHIgJmFtcDsgflBVRF9NQVNLKTsKJiM0MzsJcGZuICYjNDM7PSBvZmY7CiAJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAKIAlpZiAoIXB1ZF93cml0ZShwdWQpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7CiYjNDM7CQlyZXR1cm4gLUVNTElOSzsKJiM0MzsKJiM0MzsJbnIgPSBtaW4oSFBBR0VfUFVEX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7CiAKLQlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7CiYjNDM7CXJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7CiAJaWYgKHJldCkKLQkJcGFnZSA9IEVSUl9QVFIocmV0KTsKLQllbHNlCi0JCSpwYWdlX21hc2sgPSBIUEFHRV9QVURfTlIgLSAxOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VzKQomIzQzOwkJcGFnZXNbMF0gPSBwYWdlOwogCi0JcmV0dXJuIHBhZ2U7CiYjNDM7CXJldHVybiBucjsKIH0KIAogLyogRk9MTF9GT1JDRSBjYW4gd3JpdGUgdG8gZXZlbiB1bndyaXRhYmxlIFBNRHMgaW4gQ09XIG1hcHBpbmdzLiAqLwpAQCAtNjk4LDE0ICYjNDM7NzIwLDE0IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3BtZChwbWRfdCBwbWQsIHN0cnVjdCBwYWdlICpwYWdlLAogCXJldHVybiAhdXNlcmZhdWx0ZmRfaHVnZV9wbWRfd3Aodm1hLCBwbWQpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCAqcG1kLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlwbWRfdCBwbWR2YWwgPSAqcG1kOwogCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZiwgbnI7CiAJaW50IHJldDsKIAogCWFzc2VydF9zcGluX2xvY2tlZChwbWRfbG9ja3B0cihtbSwgcG1kKSk7CkBAIC03MTMsNTAgJiM0Mzs3MzUsNTQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7CiAJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7CiAJICAgICFjYW5fZm9sbG93X3dyaXRlX3BtZChwbWR2YWwsIHBhZ2UsIHZtYSwgZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJLyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqLwogCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9EVU1QKSAmYW1wOyZhbXA7IGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChwbWRfcHJvdG5vbmUoKnBtZCkgJmFtcDsmYW1wOyAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpCi0JCXJldHVybiBOVUxMOwomIzQzOwkJcmV0dXJuIDA7CiAKIAlpZiAoIXBtZF93cml0ZShwbWR2YWwpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7CiYjNDM7CQlyZXR1cm4gLUVNTElOSzsKIAogCVZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyAmYW1wOyBGT0xMX1BJTikgJmFtcDsmYW1wOyBQYWdlQW5vbihwYWdlKSAmYW1wOyZhbXA7CiAJCQkgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7CiAKLQlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7CiYjNDM7CW9mZiA9IFBGTl9ET1dOKGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKTsKJiM0MzsJbnIgPSBtaW4oSFBBR0VfUE1EX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7CiYjNDM7CiYjNDM7CXJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKJiM0MzsJCXJldHVybiByZXQ7CiAKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKIAlpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBGT0xMX1RPVUNIKSkKIAkJdG91Y2hfcG1kKHZtYSwgYWRkciwgcG1kLCBmbGFncyAmYW1wOyBGT0xMX1dSSVRFKTsKICNlbmRpZgkvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KIAotCXBhZ2UgJiM0Mzs9IChhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSykgJmd0OyZndDsgUEFHRV9TSElGVDsKLQkqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTsKJiM0MzsJcGFnZSAmIzQzOz0gb2ZmOwomIzQzOwomIzQzOwlpZiAocGFnZXMpCiYjNDM7CQlwYWdlc1swXSA9IHBhZ2U7CiAKLQlyZXR1cm4gcGFnZTsKJiM0MzsJcmV0dXJuIG5yOwogfQogCiAjZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7Ci0JcmV0dXJuIE5VTEw7CiYjNDM7CXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCAqcG1kLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewotCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gMDsKIH0KICNlbmRpZgkvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi8KIApAQCAtNzk5LDExMCAmIzQzOzgyNSwyMDUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiYjNDM7LyoKJiM0MzsgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IHJ1biBldmVyeSBwZXItUFRFIHNhZmV0eSBjaGVjayAocHJlc2VudCwKJiM0MzsgKiB3cml0ZS1mYXVsdCwgZ3VwX211c3RfdW5zaGFyZSgpKSBvbiB0aGUgUFRFLCBzbyB0aGlzIG9ubHkgZG9lcyB0aGUKJiM0MzsgKiBwZXItZm9saW8gd29yazogdGhlIHJlZmNvdW50IGdyYWIsIHRoZSBGT0xMX1BJTiBhY2Nlc3NpYmlsaXR5IGZhdWx0LWluLAomIzQzOyAqIGRpcnR5L2FjY2Vzc2VkIG1hcmtpbmcsIGFuZCB0aGUgYXJyYXkgZmlsbCB3aXRoIHRoZSBjYWNoZSBmbHVzaC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGVfY29tbWl0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKJiM0MzsJCXB0ZV90IHB0ZSwgdW5zaWduZWQgbG9uZyBuciwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJc3RydWN0IHBhZ2UgKipwYWdlcykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwkvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqLwomIzQzOwlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTsKJiM0MzsJaWYgKHVubGlrZWx5KHJldCkpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhZ2UgYWNjZXNzaWJsZSBpZiBhbmQgb25seSBpZiB3ZSBhcmUgZ29pbmcKJiM0MzsJICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlCiYjNDM7CSAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGZsYWdzICZhbXA7IEZPTExfUElOKSB7CiYjNDM7CQlyZXQgPSBhcmNoX21ha2VfZm9saW9fYWNjZXNzaWJsZShmb2xpbyk7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJZ3VwX3B1dF9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTsKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWlmIChmbGFncyAmYW1wOyBGT0xMX1RPVUNIKSB7CiYjNDM7CQlpZiAoKGZsYWdzICZhbXA7IEZPTExfV1JJVEUpICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhcHRlX2RpcnR5KHB0ZSkgJmFtcDsmYW1wOyAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQkvKgomIzQzOwkJICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlCiYjNDM7CQkgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2UKJiM0MzsJCSAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS4KJiM0MzsJCSAqLwomIzQzOwkJZm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZ3VwX2ZpbGxfcGFnZXModm1hLCBhZGRyZXNzLCBwYWdlLCBuciwgcGFnZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yCiYjNDM7ICogd2hlbiB0aGUgUFRFIGNhbm5vdCBiZSBmb2xsb3dlZCBidXQgdGhlIGNhbGxlciBtYXkgZmF1bHQgaXQgaW4sIGFuZCBhCiYjNDM7ICogbmVnYXRpdmUgZXJybm8gd2hlbiB0aGUgY2FsbGVyIG11c3QgcmVwb3J0IHRoZSBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19vbmVfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQlwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXApCiB7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwotCXN0cnVjdCBmb2xpbyAqZm9saW87CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3BpbmxvY2tfdCAqcHRsOwotCXB0ZV90ICpwdGVwLCBwdGU7Ci0JaW50IHJldDsKIAotCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsICZhbXA7cHRsKTsKLQlpZiAoIXB0ZXApCi0JCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwotCXB0ZSA9IHB0ZXBfZ2V0KHB0ZXApOwomIzQzOwkqcGFnZXAgPSBOVUxMOwomIzQzOwogCWlmICghcHRlX3ByZXNlbnQocHRlKSkKLQkJZ290byBub19wYWdlOwomIzQzOwkJcmV0dXJuIDA7CiAJaWYgKHB0ZV9wcm90bm9uZShwdGUpICZhbXA7JmFtcDsgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKQotCQlnb3RvIG5vX3BhZ2U7CiYjNDM7CQlyZXR1cm4gMDsKIAogCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZSk7CiAKIAkvKgogCSAqIFdlIG9ubHkgY2FyZSBhYm91dCBhbm9uIHBhZ2VzIGluIGNhbl9mb2xsb3dfd3JpdGVfcHRlKCkuCiAJICovCi0JaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7Ci0JICAgICFjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGUsIHBhZ2UsIHZtYSwgZmxhZ3MpKSB7Ci0JCXBhZ2UgPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9CiYjNDM7CWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOyAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSkKJiM0MzsJCXJldHVybiAwOwogCiAJaWYgKHVubGlrZWx5KCFwYWdlKSkgewogCQlpZiAoZmxhZ3MgJmFtcDsgRk9MTF9EVU1QKSB7CiAJCQkvKiBBdm9pZCBzcGVjaWFsIChsaWtlIHplcm8pIHBhZ2VzIGluIGNvcmUgZHVtcHMgKi8KLQkJCXBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkgewotCQkJcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBmb2xsb3dfcGZuX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIGZsYWdzKTsKLQkJCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKJiM0MzsJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQomIzQzOwkJaWYgKCFpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKQomIzQzOwkJCXJldHVybiBmb2xsb3dfcGZuX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIGZsYWdzKTsKJiM0MzsJCXBhZ2UgPSBwdGVfcGFnZShwdGUpOwogCX0KLQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiAKLQlpZiAoIXB0ZV93cml0ZShwdGUpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkgewotCQlwYWdlID0gRVJSX1BUUigtRU1MSU5LKTsKLQkJZ290byBvdXQ7Ci0JfQomIzQzOwlpZiAoIXB0ZV93cml0ZShwdGUpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkKJiM0MzsJCXJldHVybiAtRU1MSU5LOwogCiAJVk1fV0FSTl9PTl9PTkNFX1BBR0UoKGZsYWdzICZhbXA7IEZPTExfUElOKSAmYW1wOyZhbXA7IFBhZ2VBbm9uKHBhZ2UpICZhbXA7JmFtcDsKIAkJCSAgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBwYWdlKTsKIAotCS8qIHRyeV9ncmFiX2ZvbGlvKCkgZG9lcyBub3RoaW5nIHVubGVzcyBGT0xMX0dFVCBvciBGT0xMX1BJTiBpcyBzZXQuICovCi0JcmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIDEsIGZsYWdzKTsKLQlpZiAodW5saWtlbHkocmV0KSkgewotCQlwYWdlID0gRVJSX1BUUihyZXQpOwotCQlnb3RvIG91dDsKLQl9CiYjNDM7CSpwYWdlcCA9IHBhZ2U7CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCS8qCi0JICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nCi0JICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlCi0JICogRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QgZm9yIGRldGFpbHMuCi0JICovCi0JaWYgKGZsYWdzICZhbXA7IEZPTExfUElOKSB7Ci0JCXJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTsKLQkJaWYgKHJldCkgewotCQkJdW5waW5fdXNlcl9wYWdlKHBhZ2UpOwotCQkJcGFnZSA9IEVSUl9QVFIocmV0KTsKLQkJCWdvdG8gb3V0OwomIzQzOy8qCiYjNDM7ICogUmV0dXJuIGhvdyBtYW55IFBURXMgbWFwIGNvbnNlY3V0aXZlIHBhZ2VzIG9mIHRoZSBzYW1lIGZvbGlvIGFuZCBjYW4gYmUKJiM0MzsgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuCiYjNDM7ICoKJiM0MzsgKiBUaGUgd3JpdGUtZmF1bHQgYW5kIHVuc2hhcmUgY2hlY2tzIGluIGZvbGxvd19vbmVfcHRlKCkgYXJlIHBlciBQVEUsIGJ1dCBhCiYjNDM7ICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seQomIzQzOyAqIHJ1biB1bmRlciBGT0xMX1dSSVRFIG9yIEZPTExfUElOIGRvZXMgbmVlZCB0aGUgcGVyLXBhZ2UgY2hlY2ssIHNvIGl0IHN0YXlzCiYjNDM7ICogb25lIHBhZ2UgYXQgYSB0aW1lLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCAqcHRlcCwgcHRlX3QgKmJhdGNoX3B0ZSwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBtYXg7CiYjNDM7CiYjNDM7CWlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CW1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CWlmIChtYXggJmx0Oz0gMSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBNZXJnZSB5b3VuZy9kaXJ0eSBhY3Jvc3MgYmF0Y2ggc28gZm9saW9fbWFya19kaXJ0eSBzZWVzIGFueSBkaXJ0eS4gKi8KJiM0MzsJcmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBiYXRjaF9wdGUsIG1heCwKJiM0MzsJCQkJICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2FsayB0aGUgUFRFcyBmcm9tIHRoZSBzdGFydCBhZGRyZXNzIHRvIHRoZSBlbmQgb2YgdGhpcyBwYWdlIHRhYmxlIG9yIFZNQSwKJiM0MzsgKiB3aGljaGV2ZXIgY29tZXMgZmlyc3QsIGFuZCBjb21taXQgZXZlcnkgcGFnZSBmb3VuZC4KJiM0MzsgKgomIzQzOyAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0CiYjNDM7ICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiYjNDM7CWJvb2wgbmVlZF9ub19wYWdlX3RhYmxlID0gZmFsc2U7CiYjNDM7CXB0ZV90ICpwdGVwLCAqb3JpZ19wdGVwOwomIzQzOwl1bnNpZ25lZCBsb25nIHdhbGtfZW5kOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yID0gMDsKJiM0MzsJc3BpbmxvY2tfdCAqcHRsOwomIzQzOwlsb25nIHJldCA9IDA7CiYjNDM7CiYjNDM7CW9yaWdfcHRlcCA9IHB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsICZhbXA7cHRsKTsKJiM0MzsJaWYgKCFwdGVwKQomIzQzOwkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiYjNDM7CiYjNDM7CXdhbGtfZW5kID0gbWluKHBtZF9hZGRyX2VuZChhZGRyZXNzLCBlbmQpLCB2bWEtJmd0O3ZtX2VuZCk7CiYjNDM7CiYjNDM7CWZvciAoOyBhZGRyZXNzICZsdDsgd2Fsa19lbmQ7IGFkZHJlc3MgJiM0Mzs9IFBBR0VfU0laRSwgcHRlcCYjNDM7JiM0MzspIHsKJiM0MzsJCXB0ZV90IHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApOwomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CiYjNDM7CQlyZXQgPSBmb2xsb3dfb25lX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIHB0ZSwgZmxhZ3MsICZhbXA7cGFnZSk7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7IHBhZ2UpIHsKJiM0MzsJCQlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKJiM0MzsJCQl1bnNpZ25lZCBsb25nIGJhdGNoOwomIzQzOwomIzQzOwkJCXB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTsKJiM0MzsKJiM0MzsJCQliYXRjaCA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCB3YWxrX2VuZCwgZm9saW8sCiYjNDM7CQkJCQkJIHB0ZXAsICZhbXA7YmF0Y2hfcHRlLCBmbGFncyk7CiYjNDM7CQkJcmV0ID0gZm9sbG93X3BhZ2VfcHRlX2NvbW1pdCh2bWEsIGFkZHJlc3MsIGZvbGlvLCBwYWdlLAomIzQzOwkJCQkJCSAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsCiYjNDM7CQkJCQkJICAgICBwYWdlcyA/IHBhZ2VzICYjNDM7IG5yIDogTlVMTCk7CiYjNDM7CQkJaWYgKCFyZXQpIHsKJiM0MzsJCQkJbnIgJiM0Mzs9IGJhdGNoOwomIzQzOwkJCQkvKgomIzQzOwkJCQkgKiBUaGUgbG9vcCYjMzk7cyBvd24gaW5jcmVtZW50IGNvdmVycyBvbmUgUFRFOyBza2lwCiYjNDM7CQkJCSAqIHRoZSByZXN0IG9mIHRoZSBiYXRjaC4KJiM0MzsJCQkJICovCiYjNDM7CQkJCXB0ZXAgJiM0Mzs9IGJhdGNoIC0gMTsKJiM0MzsJCQkJYWRkcmVzcyAmIzQzOz0gKGJhdGNoIC0gMSkgKiBQQUdFX1NJWkU7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KIAkJfQotCX0KLQlpZiAoZmxhZ3MgJmFtcDsgRk9MTF9UT1VDSCkgewotCQlpZiAoKGZsYWdzICZhbXA7IEZPTExfV1JJVEUpICZhbXA7JmFtcDsKLQkJICAgICFwdGVfZGlydHkocHRlKSAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSkKLQkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwomIzQzOwogCQkvKgotCQkgKiBwdGVfbWt5b3VuZygpIHdvdWxkIGJlIG1vcmUgY29ycmVjdCBoZXJlLCBidXQgYXRvbWljIGNhcmUKLQkJICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlCi0JCSAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS4KJiM0MzsJCSAqIG5vX3BhZ2VfdGFibGUoKSBtYXkgbG9vayB1cCB0aGUgcGFnZSBjYWNoZSwgc28gaXQgY2Fubm90IHJ1bgomIzQzOwkJICogdW5kZXIgdGhlIFBURSBsb2NrLgogCQkgKi8KLQkJZm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7IHB0ZV9ub25lKHB0ZSkpCiYjNDM7CQkJbmVlZF9ub19wYWdlX3RhYmxlID0gdHJ1ZTsKJiM0MzsJCWJyZWFrOwogCX0KLW91dDoKLQlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Ci0JcmV0dXJuIHBhZ2U7Ci1ub19wYWdlOgotCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsKLQlpZiAoIXB0ZV9ub25lKHB0ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwomIzQzOwlwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTsKJiM0MzsKJiM0MzsJaWYgKG5yKQomIzQzOwkJcmV0dXJuIG5yOwomIzQzOwlpZiAobmVlZF9ub19wYWdlX3RhYmxlKQomIzQzOwkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwdWRfdCAqcHVkcCwKJiM0MzsJCXVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAlwbWRfdCAqcG1kLCBwbWR2YWw7CiAJc3BpbmxvY2tfdCAqcHRsOwotCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlsb25nIHJldDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHJlc3MpOwpAQCAtOTEyLDcgJiM0MzsxMDMzLDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJaWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAlpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSkKLQkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCiAJaWYgKHBtZF9wcm90bm9uZShwbWR2YWwpICZhbXA7JmFtcDsgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKQEAgLTkyNSwyOCAmIzQzOzEwNDYsMzUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJfQogCWlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKLQkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCX0KIAlpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBGT0xMX1NQTElUX1BNRCkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKIAkJc3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpOwogCQkvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovCi0JCXJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDoKLQkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IC1FTk9NRU0gOgomIzQzOwkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCX0KLQlwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0ID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7CiAJc3Bpbl91bmxvY2socHRsKTsKLQlyZXR1cm4gcGFnZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsIHRoZQomIzQzOwkgKiBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIHBtZCBsb2NrLgomIzQzOwkgKi8KJiM0MzsJaWYgKHJldCAmZ3Q7IDAgJmFtcDsmYW1wOyBwYWdlcykKJiM0MzsJCWd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwNGRfdCAqcDRkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcDRkX3QgKnA0ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcHVkX3QgKnB1ZHAsIHB1ZDsKIAlzcGlubG9ja190ICpwdGw7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWxvbmcgcmV0OwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAogCXB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpOwpAQCAtOTU1LDIyICYjNDM7MTA4MywyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKHB1ZF9sZWFmKHB1ZCkpIHsKIAkJcHRsID0gcHVkX2xvY2sobW0sIHB1ZHApOwotCQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CQlyZXQgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBwYWdlcyk7CiAJCXNwaW5fdW5sb2NrKHB0bCk7Ci0JCWlmIChwYWdlKQotCQkJcmV0dXJuIHBhZ2U7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsCiYjNDM7CQkgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW8KJiM0MzsJCSAqIGNhbiBiZSB1cCB0byBIUEFHRV9QVURfTlIgcGFnZXMsIHRvbyBsb25nIHRvIGZsdXNoIHVuZGVyIGEKJiM0MzsJCSAqIHNwaW5sb2NrLgomIzQzOwkJICovCiYjNDM7CQlpZiAocmV0ICZndDsgMCAmYW1wOyZhbXA7IHBhZ2VzKQomIzQzOwkJCWd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAl9CiAJaWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpCiAJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwogCi0JcmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spOwomIzQzOwlyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcGdkX3QgKnBnZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcDRkX3QgKnA0ZHAsIHA0ZDsKIApAQCAtOTgxLDE1ICYjNDM7MTExNiwxOCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAotCXJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIHBhZ2VzKTsKIH0KIAogLyoqCi0gKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3MKJiM0MzsgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBwYWdlcyBhdCBhIHVzZXItdmlydHVhbCBhZGRyZXNzCiAgKiBAdm1hOiB2bV9hcmVhX3N0cnVjdCBtYXBwaW5nIEBhZGRyZXNzCiAgKiBAYWRkcmVzczogdmlydHVhbCBhZGRyZXNzIHRvIGxvb2sgdXAKJiM0MzsgKiBAZW5kOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RvcCBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzCiAgKiBAZmxhZ3M6IGZsYWdzIG1vZGlmeWluZyBsb29rdXAgYmVoYXZpb3VyCi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFzawomIzQzOyAqIEBwYWdlczogYXJyYXkgdG8gcmVjZWl2ZSB0aGUgcGFnZXMsIHJlZmNvdW50ZWQgcGVyIEBmbGFncywgb3IgTlVMTCB0bwomIzQzOyAqICAgICAgICAgd2FsayB0aGUgcGFnZSB0YWJsZXMgKGUuZy4gdG8gZmF1bHQgcGFnZXMgaW4pIHdpdGhvdXQgY29sbGVjdGluZwomIzQzOyAqICAgICAgICAgb3IgcmVmY291bnRpbmcgdGhlbQogICoKICAqIEBmbGFncyBjYW4gaGF2ZSBGT0xMXyBmbGFncyBzZXQsIGRlZmluZWQgaW4gJmx0O2xpbnV4L21tLmgmZ3Q7CiAgKgpAQCAtOTk4LDMzICYjNDM7MTEzNiwzMiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seQogICogcmVsZXZhbnQgd2l0aCBGT0xMX1BJTiBhbmQgIUZPTExfV1JJVEUuCiAgKgotICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuCi0gKgotICogUmV0dXJuOiB0aGUgbWFwcGVkIChzdHJ1Y3QgcGFnZSAqKSwgJU5VTEwgaWYgbm8gbWFwcGluZyBleGlzdHMsIG9yCi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkCi0gKiBieSBhIHBhZ2UgZGVzY3JpcHRvciAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuCiYjNDM7ICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgc3RhcnRpbmcgYXQgQGFkZHJlc3MgdGhhdCB3ZXJlCiYjNDM7ICogcGxhY2VkIGludG8gQHBhZ2VzIChpZiBub24tTlVMTCksIHdoaWNoIG1heSBiZSBmZXdlciB0aGFuIHRoZSBwYWdlcwomIzQzOyAqIHJlcXVlc3RlZCB2aWEgQGVuZDsgMCBpZiBubyBtYXBwaW5nIGV4aXN0cyBhdCBAYWRkcmVzczsgb3IgYSBuZWdhdGl2ZQomIzQzOyAqIGVycm5vIGZvciBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZCBieSBhIHBhZ2UgZGVzY3JpcHRvcgomIzQzOyAqIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS4KICAqLwotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcGdkX3QgKnBnZDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWxvbmcgcmV0OwogCiAJdm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpOwogCi0JKnBhZ2VfbWFzayA9IDA7CiAJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7CiAKIAlpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpCi0JCXBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwkJcmV0ID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAllbHNlCi0JCXBhZ2UgPSBmb2xsb3dfcDRkX21hc2sodm1hLCBhZGRyZXNzLCBwZ2QsIGZsYWdzLCBwYWdlX21hc2spOwomIzQzOwkJcmV0ID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwZ2QsIGZsYWdzLCBwYWdlcyk7CiAKIAl2bWFfcGd0YWJsZV93YWxrX2VuZCh2bWEpOwogCi0JcmV0dXJuIHBhZ2U7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2dhdGVfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLApAQCAtMTM1OCw3ICYjNDM7MTQ5NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiB7CiAJbG9uZyByZXQgPSAwLCBpID0gMDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwOwogCiAJaWYgKCFucl9wYWdlcykKIAkJcmV0dXJuIDA7CkBAIC0xMzczLDcgJiM0MzsxNTA5LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogCWRvIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIGludCBwYWdlX2luY3JlbTsKJiM0MzsJCWxvbmcgbnI7CiAKIAkJLyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqLwogCQlpZiAoIXZtYSB8fCBzdGFydCAmZ3Q7PSB2bWEtJmd0O3ZtX2VuZCkgewpAQCAtMTQwMCw4ICYjNDM7MTUzNiwxMiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQkJcGFnZXMgPyAmYW1wO3BhZ2UgOiBOVUxMKTsKIAkJCQlpZiAocmV0KQogCQkJCQlnb3RvIG91dDsKLQkJCQlwYWdlX21hc2sgPSAwOwotCQkJCWdvdG8gbmV4dF9wYWdlOwomIzQzOwkJCQlndXBfZmlsbF9wYWdlcyh2bWEsIHN0YXJ0LCBwYWdlLCAxLAomIzQzOwkJCQkJICAgICAgIHBhZ2VzID8gcGFnZXMgJiM0MzsgaSA6IE5VTEwpOwomIzQzOwkJCQlpJiM0MzsmIzQzOzsKJiM0MzsJCQkJc3RhcnQgJiM0Mzs9IFBBR0VfU0laRTsKJiM0MzsJCQkJbnJfcGFnZXMtLTsKJiM0MzsJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCWlmICghdm1hKSB7CkBAIC0xNDIzLDEwICYjNDM7MTU2MywxMSBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQl9CiAJCWNvbmRfcmVzY2hlZCgpOwogCi0JCXBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgJmFtcDtwYWdlX21hc2spOwotCQlpZiAoIXBhZ2UgfHwgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LKSB7CiYjNDM7CQluciA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsCiYjNDM7CQkJCSAgICAgIGd1cF9mbGFncywgcGFnZXMgPyAmYW1wO3BhZ2VzW2ldIDogTlVMTCk7CiYjNDM7CQlpZiAoIW5yIHx8IG5yID09IC1FTUxJTkspIHsKIAkJCXJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsCi0JCQkJCSAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTsKJiM0MzsJCQkJCSAgIG5yID09IC1FTUxJTkssIGxvY2tlZCk7CiAJCQlzd2l0Y2ggKHJldCkgewogCQkJY2FzZSAwOgogCQkJCWdvdG8gcmV0cnk7CkBAIC0xNDQwLDcwICYjNDM7MTU4MSwzMCBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJQlVHKCk7Ci0JCX0gZWxzZSBpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUVYSVNUKSB7CiYjNDM7CQl9IGVsc2UgaWYgKG5yID09IC1FRVhJU1QpIHsKIAkJCS8qCiAJCQkgKiBQcm9wZXIgcGFnZSB0YWJsZSBlbnRyeSBleGlzdHMsIGJ1dCBubyBjb3JyZXNwb25kaW5nCiAJCQkgKiBzdHJ1Y3QgcGFnZS4gSWYgdGhlIGNhbGxlciBleHBlY3RzICoqcGFnZXMgdG8gYmUKIAkJCSAqIGZpbGxlZCBpbiwgYmFpbCBvdXQgbm93LCBiZWNhdXNlIHRoYXQgY2FuJiMzOTt0IGJlIGRvbmUKLQkJCSAqIGZvciB0aGlzIHBhZ2UuCiYjNDM7CQkJICogZm9yIHRoaXMgcGFnZS4gT3RoZXJ3aXNlIGFkdmFuY2UgYnkgdGhlIG9uZSBwYWdlCiYjNDM7CQkJICogZm9sbG93X3BhZ2VfbWFzaygpIGxvb2tlZCBhdC4KIAkJCSAqLwogCQkJaWYgKHBhZ2VzKSB7Ci0JCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKJiM0MzsJCQkJcmV0ID0gbnI7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoSVNfRVJSKHBhZ2UpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwomIzQzOwkJCW5yID0gMTsKJiM0MzsJCX0gZWxzZSBpZiAobnIgJmx0OyAwKSB7CiYjNDM7CQkJcmV0ID0gbnI7CiAJCQlnb3RvIG91dDsKIAkJfQotbmV4dF9wYWdlOgotCQlwYWdlX2luY3JlbSA9IDEgJiM0MzsgKH4oc3RhcnQgJmd0OyZndDsgUEFHRV9TSElGVCkgJmFtcDsgcGFnZV9tYXNrKTsKLQkJaWYgKHBhZ2VfaW5jcmVtICZndDsgbnJfcGFnZXMpCi0JCQlwYWdlX2luY3JlbSA9IG5yX3BhZ2VzOwotCi0JCWlmIChwYWdlcykgewotCQkJc3RydWN0IHBhZ2UgKnN1YnBhZ2U7Ci0JCQl1bnNpZ25lZCBpbnQgajsKIAotCQkJLyoKLQkJCSAqIFRoaXMgbXVzdCBiZSBhIGxhcmdlIGZvbGlvIChhbmQgZG9lc24mIzM5O3QgbmVlZCB0bwotCQkJICogYmUgdGhlIHdob2xlIGZvbGlvOyBpdCBjYW4gYmUgcGFydCBvZiBpdCksIGRvCi0JCQkgKiB0aGUgcmVmY291bnQgd29yayBmb3IgYWxsIHRoZSBzdWJwYWdlcyB0b28uCi0JCQkgKgotCQkJICogTk9URTogaGVyZSB0aGUgcGFnZSBtYXkgbm90IGJlIHRoZSBoZWFkIHBhZ2UKLQkJCSAqIGUuZy4gd2hlbiBzdGFydCBhZGRyIGlzIG5vdCB0aHAtc2l6ZSBhbGlnbmVkLgotCQkJICogdHJ5X2dyYWJfZm9saW8oKSBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRhaWwKLQkJCSAqIHBhZ2VzLgotCQkJICovCi0JCQlpZiAocGFnZV9pbmNyZW0gJmd0OyAxKSB7Ci0JCQkJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0KLQkJCQkvKgotCQkJCSAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGUKLQkJCQkgKiBsYXJnZSBmb2xpbywgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbC4KLQkJCQkgKi8KLQkJCQlpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSwKLQkJCQkJCSAgIGd1cF9mbGFncykpIHsKLQkJCQkJLyoKLQkJCQkJICogUmVsZWFzZSB0aGUgMXN0IHBhZ2UgcmVmIGlmIHRoZQotCQkJCQkgKiBmb2xpbyBpcyBwcm9ibGVtYXRpYywgZmFpbCBoYXJkLgotCQkJCQkgKi8KLQkJCQkJZ3VwX3B1dF9mb2xpbyhmb2xpbywgMSwgZ3VwX2ZsYWdzKTsKLQkJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKGogPSAwOyBqICZsdDsgcGFnZV9pbmNyZW07IGomIzQzOyYjNDM7KSB7Ci0JCQkJc3VicGFnZSA9IHBhZ2UgJiM0MzsgajsKLQkJCQlwYWdlc1tpICYjNDM7IGpdID0gc3VicGFnZTsKLQkJCQlmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBzdGFydCAmIzQzOyBqICogUEFHRV9TSVpFKTsKLQkJCQlmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTsKLQkJCX0KLQkJfQomIzQzOwkJLyogQ2hlY2sgdGhhdCB3ZSBkaWRuJiMzOTt0IHBpbiBtb3JlIHBhZ2VzIHRoYW4gdGhlIGNhbGxlciB3aWxsIGZyZWUuICovCiYjNDM7CQlWTV9XQVJOX09OX09OQ0UobnIgJmd0OyBucl9wYWdlcyk7CiAKLQkJaSAmIzQzOz0gcGFnZV9pbmNyZW07Ci0JCXN0YXJ0ICYjNDM7PSBwYWdlX2luY3JlbSAqIFBBR0VfU0laRTsKLQkJbnJfcGFnZXMgLT0gcGFnZV9pbmNyZW07CiYjNDM7CQlpICYjNDM7PSBucjsKJiM0MzsJCXN0YXJ0ICYjNDM7PSBuciAqIFBBR0VfU0laRTsKJiM0MzsJCW5yX3BhZ2VzIC09IG5yOwogCX0gd2hpbGUgKG5yX3BhZ2VzKTsKIG91dDoKIAlyZXR1cm4gaSA/IGkgOiByZXQ7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4NgoJCQkJCQkJb3V0cHV0OiAxNTUKCQkJCQkJCXRob3VnaHRzOiAyMTYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQgb2YgR1VQIEJhdGNoaW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgZGl2aW5nIGludG8gYG1tL2d1cC5jYCwgdGhlIGhlYXJ0IG9mIEdldCBVc2VyIFBhZ2VzLCBhbmQgaXQmIzM5O3MgYWxsIGFib3V0IG9wdGltaXppbmcgaG93IHdlIHdhbGsgYW5kIGJhdGNoIHBhZ2UgdGFibGVzLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIHJlZmFjdG9yaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhhdCBwYWdlIHRhYmxlIHdhbGtpbmcgYW5kIGJhdGNoaW5nOiBgZm9sbG93X3BhZ2VfbWFza2AsIGBmb2xsb3dfaHVnZV9wdWRgLCBgZm9sbG93X2h1Z2VfcG1kYCwgYW5kIGBmb2xsb3dfcGFnZV9wdGVgLiBJdCYjMzk7cyBpbnRyb2R1Y2luZyBuZXcgZnVuY3Rpb25zIGxpa2UgYGZvbGxvd19wYWdlX3B0ZV9jb21taXRgLCBgZm9sbG93X29uZV9wdGVgLCBhbmQgYGZvbGxvd19wdGVfYmF0Y2hgIHRvIGhhbmRsZSBQVEUgcHJvY2Vzc2luZyBpbiBiYXRjaGVzLiBUaGUgcmV0dXJuIHR5cGVzIGFyZSBhbHNvIGNoYW5nZWQgZnJvbSBgc3RydWN0IHBhZ2UgKmAgdG8gYGxvbmdgIHRvIHJlZmxlY3QgZWl0aGVyIHRoZSBudW1iZXIgb2YgcGFnZXMgcHJvY2Vzc2VkIG9yIGFuIGVycm9yIGNvZGUuIGBfX2dldF91c2VyX3BhZ2VzYCBpcyB1cGRhdGVkIHRvIHV0aWxpemUgdGhlIG5ldyBiYXRjaGVkIGFwcHJvYWNoLgoKVGhlIGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeS4gQXJlIHdlIGNyZWF0aW5nIGFueSByaXNrcyBoZXJlPyBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBtYWlubHkgYWJvdXQgdGhlIG1lY2hhbmljcyBvZiAqcGlubmluZyogcGFnZXMgYW5kIHBvdGVudGlhbGx5IHJlZmNvdW50aW5nIHRoZW0gYW5kIGRvZXMgbm90IHNlbmQgYW55IG5ldyBzdHJ1Y3R1cmVzIHRvIHRoZSB1c2VyLiBUaGVyZSYjMzk7cyBubyBmYW5jeSBuZXcgZGF0YSBiZWluZyBhbGxvY2F0ZWQsIGZpbGxlZCwgYW5kIHRoZW4gaGFuZGVkIG92ZXIgdG8gdXNlciBzcGFjZSB3aGVyZSB1bmluaXRpYWxpemVkIHZhbHVlcyBtaWdodCBsZWFrLiBJIGFsc28gZG9uJiMzOTt0IHNlZSBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCAqZGVwZW5kcyogb24gdGhlIHZhbHVlIG9mIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGluIGFueSBuZXcgY29kZSBvciBicmFuY2hlcy4KCkhvd2V2ZXIsIEdVUCBpdHNlbGYgaXMgaW50ZXJlc3RpbmcuIEdVUCAqZG9lcyogcGluIHVzZXIgcGFnZXMuIElmIHRoZXJlIGlzIGEgYnVnLCBpbmNvcnJlY3QgcGlubmluZyAqY291bGQqIGxlYWQgdG8gY29ycnVwdGlvbiwgdXNlLWFmdGVyLWZyZWUsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiBUaG9zZSBjYW4gYWxsIGJlIGNhdWdodCBieSBLQVNBTi4gV2UgYXJlIGxvb2tpbmcgZm9yIHNvbWV0aGluZyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoICpiZXR0ZXIqIHRoYW4gS0FTQU4uIEl0JiMzOTtzIGEgY29yZSBNTSBtZWNoYW5pc20sIHNvIGJ1Z3MgaGVyZSBhcmUgbW9yZSBsaWtlbHkgdG8gY3Jhc2gsIHBhZ2UgZmF1bHQsIG9yIGNhdXNlIGRhdGEgY29ycnVwdGlvbi4gTm93LCBLTVNBTiBkZXRlY3RzIHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSwgcmlnaHQ/IExldCYjMzk7cyBjb25zaWRlci4KClRoZSBgcGFnZXNgIGFycmF5IHBhc3NlZCB0byBgZm9sbG93X3BhZ2VfbWFza2AgaXMgd2hlcmUgdGhlIHJldHVybmVkIHBhZ2VzIGVuZCB1cC4gSXQgZ2V0cyBmaWxsZWQgYnkgYGd1cF9maWxsX3BhZ2VzYC4gVGhlIHJpc2sgaXMgKmlmKiBgZ3VwX2ZpbGxfcGFnZXNgIGZhaWxzIHRvIGZpbGwgdGhlIHdob2xlIGFycmF5IGJ1dCByZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIChzdWNjZXNzKSwgdGhhdCB3b3VsZCBtZWFuIHRoYXQgdGhlIGNhbGxlciB3b3VsZCBoYXZlIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkuIExldCYjMzk7cyBsb29rIGF0IGBndXBfZmlsbF9wYWdlc2A6CgpgYGBjCiYjNDM7c3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlpZiAoIXBhZ2VzKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzdHJ1Y3QgcGFnZSAqc3VicGFnZSA9IHBhZ2UgJiM0MzsgaTsKJiM0MzsKJiM0MzsJCXBhZ2VzW2ldID0gc3VicGFnZTsKJiM0MzsJCWZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIGFkZHJlc3MgJiM0MzsgaSAqIFBBR0VfU0laRSk7CiYjNDM7CQlmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTsKJiM0MzsJfQomIzQzO30KYGBgCgpJdCBmaWxscyBgcGFnZXNbMF1gIHRocm91Z2ggYHBhZ2VzW25yIC0gMV1gLiBJZiBgZm9sbG93X3BhZ2VfbWFza2AgcmV0dXJucyBgbnJgLCBpdCAqc2hvdWxkKiBtZWFuIGBucmAgcGFnZXMgaGF2ZSBiZWVuIGZpbGxlZC4gSW4gYF9fZ2V0X3VzZXJfcGFnZXNgLCB3ZSYjMzk7cmUgaXRlcmF0aW5nIGFuZCBpbmNyZW1lbnRpbmcgdGhlIGFycmF5LCBgaSAmIzQzOz0gbnJgLiBUaGUgY2FsbGVyIGFsbG9jYXRlcyBgcGFnZXNgIGFuZCBleHBlY3RzIGBwYWdlc1swXWAgdGhyb3VnaCBgcGFnZXNbaS0xXWAgdG8gYmUgaW5pdGlhbGl6ZWQuIEJ1dCBpcyB0aGVyZSBhIHNjZW5hcmlvIHdoZXJlIGBmb2xsb3dfcGFnZV9tYXNrYCByZXR1cm5zIGBuciAmZ3Q7IDBgIGJ1dCBkb2VzbiYjMzk7dCBmaWxsIHRoZSBlbnRpcmUgYXJyYXk/CgpIZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIGBmb2xsb3dfaHVnZV9wdWRgOgoKYGBgYwomIzQzOwlpZiAocGFnZXMpCiYjNDM7CQlwYWdlc1swXSA9IHBhZ2U7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKYGBgCgpJdCBvbmx5IHNldHMgYHBhZ2VzWzBdID0gcGFnZWAhIFdoYXQgaWYgYG5yICZndDsgMWA/IEFuZCB0aGUgY2FsbHNpdGUgaXMgaW4gYGZvbGxvd19wdWRfbWFza2A6CgpgYGBjCiAJaWYgKHB1ZF9sZWFmKHB1ZCkpIHsKIAkJcHRsID0gcHVkX2xvY2sobW0sIHB1ZHApOwotCQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CQlyZXQgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBwYWdlcyk7CiAJCXNwaW5fdW5sb2NrKHB0bCk7Ci0JCWlmIChwYWdlKQotCQkJcmV0dXJuIHBhZ2U7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsCiYjNDM7CQkgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW8KJiM0MzsJCSAqIGNhbiBiZQoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBHZXQgVXNlciBQYWdlcyAoR1VQKSB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtpbmcgYW5kIHJlZmNvdW50aW5nLiBJdCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzIGJ1dCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG9lcyBpdCBoYW5kbGUgY29tcGxleCBwYXJzaW5nIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGNvdWxkIGJlIGxlYWtlZC4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHJldHVybmluZyBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIHByb2Nlc3NlZCBwYWdlcywgbGVhZGluZyB0byB1bmluaXRpYWxpemVkIHBvaW50ZXJzIGluIHRoZSBgcGFnZXNgIGFycmF5KSB3b3VsZCByZXN1bHQgaW4gd2lsZCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgb3IgcGFnZSByZWZlcmVuY2UgaW1iYWxhbmNlcy4gVGhlc2UgdHlwZXMgb2YgZXJyb3JzIGFyZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgdG9vbHMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIEdldCBVc2VyIFBhZ2VzIChHVVApIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa2luZyBhbmQgcmVmY291bnRpbmcuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMgYnV0IGRvZXMgbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGhhbmRsZSBjb21wbGV4IHBhcnNpbmcgd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgY291bGQgYmUgbGVha2VkLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGluY29ycmVjdCBudW1iZXIgb2YgcHJvY2Vzc2VkIHBhZ2VzLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkpIHdvdWxkIHJlc3VsdCBpbiB3aWxkIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBwYWdlIHJlZmVyZW5jZSBpbWJhbGFuY2VzLiBUaGVzZSB0eXBlcyBvZiBlcnJvcnMgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU1OjEyLjc0NzIyOTQ0NFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExOTAxNzc5MjIxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiSFVHRVRMQkZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZXNcIixcbiAgICBcImdldF91c2VyX3BhZ2VzX3JlbW90ZVwiLFxuICAgIFwiZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc19yZW1vdGVcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzX3VubG9ja2VkXCIsXG4gICAgXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgICBcInBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MTIuNzQ3MjM1MTI0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNjc2ODE3MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2N2U2NzZlOGIwMzhlMDFjY2RjNjI3ODU3NjkzNmQ2MGQ5YjdhYjg0XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmNcXG5pbmRleCAwNjkyMTE5Yjc5MDQzLi4xMDY4MDY2MzRiM2M0IDEwMDY0NFxcbi0tLSBhL21tL2d1cC5jXFxuKysrIGIvbW0vZ3VwLmNcXG5AQCAtNjA4LDE1ICs2MDgsMTUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRyZXR1cm4gcGFnZSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbihwYWdlKSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzKVxcbitzdGF0aWMgbG9uZyBub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcXG4ge1xcbiBcXHRpZiAoIShmbGFncyBcXHUwMDI2IEZPTExfRFVNUCkpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFdoZW4gY29yZSBkdW1waW5nLCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHVubmVjZXNzYXJ5IHBhZ2VzIG9yXFxuLVxcdCAqIHBhZ2UgdGFibGVzLiAgUmV0dXJuIGVycm9yIGluc3RlYWQgb2YgTlVMTCB0byBza2lwIGhhbmRsZV9tbV9mYXVsdCxcXG4rXFx0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiAwIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxcbiBcXHQgKiB0aGVuIGdldF9kdW1wX3BhZ2UoKSB3aWxsIHJldHVybiBOVUxMIHRvIGxlYXZlIGEgaG9sZSBpbiB0aGUgZHVtcC5cXG4gXFx0ICogQnV0IHdlIGNhbiBvbmx5IG1ha2UgdGhpcyBvcHRpbWl6YXRpb24gd2hlcmUgYSBob2xlIHdvdWxkIHN1cmVseVxcbiBcXHQgKiBiZSB6ZXJvLWZpbGxlZCBpZiBoYW5kbGVfbW1fZmF1bHQoKSBhY3R1YWxseSBkaWQgaGFuZGxlIGl0LlxcbkBAIC02MjUsMTIgKzYyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKm5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7XFxuIFxcbiBcXHRcXHRpZiAoIWh1Z2V0bGJmc19wYWdlY2FjaGVfcHJlc2VudChoLCB2bWEsIGFkZHJlc3MpKVxcbi1cXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdH0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWZhdWx0KSkge1xcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdH1cXG4gXFxuLVxcdHJldHVybiBOVUxMO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnIsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXG4rXFx0aWYgKCFwYWdlcylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspIHtcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICsgaTtcXG4rXFxuK1xcdFxcdHBhZ2VzW2ldID0gc3VicGFnZTtcXG4rXFx0XFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgYWRkcmVzcyArIGkgKiBQQUdFX1NJWkUpO1xcbitcXHRcXHRmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTtcXG4rXFx0fVxcbiB9XFxuIFxcbiAjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxuQEAgLTY0NiwzOCArNjYzLDQzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRyZXR1cm4gY2FuX2ZvbGxvd193cml0ZV9jb21tb24ocGFnZSwgdm1hLCBmbGFncyk7XFxuIH1cXG4gXFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcXG4tXFx0XFx0XFx0XFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gXFx0cHVkX3QgcHVkID0gKnB1ZHA7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcGZuID0gcHVkX3BmbihwdWQpO1xcbitcXHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XFxuIFxcdGludCByZXQ7XFxuIFxcbiBcXHRhc3NlcnRfc3Bpbl9sb2NrZWQocHVkX2xvY2twdHIobW0sIHB1ZHApKTtcXG4gXFxuIFxcdGlmICghcHVkX3ByZXNlbnQocHVkKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0aWYgKChmbGFncyBcXHUwMDI2IEZPTExfV1JJVEUpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkLCBwZm5fdG9fcGFnZShwZm4pLCB2bWEsIGZsYWdzKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0cGZuICs9IChhZGRyIFxcdTAwMjYgflBVRF9NQVNLKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHRvZmYgPSBQRk5fRE9XTihhZGRyIFxcdTAwMjYgflBVRF9NQVNLKTtcXG4rXFx0cGZuICs9IG9mZjtcXG4gXFx0cGFnZSA9IHBmbl90b19wYWdlKHBmbik7XFxuIFxcbiBcXHRpZiAoIXB1ZF93cml0ZShwdWQpIFxcdTAwMjZcXHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xcbitcXHRcXHRyZXR1cm4gLUVNTElOSztcXG4rXFxuK1xcdG5yID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpO1xcbiBcXG4tXFx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xcbitcXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpO1xcbiBcXHRpZiAocmV0KVxcbi1cXHRcXHRwYWdlID0gRVJSX1BUUihyZXQpO1xcbi1cXHRlbHNlXFxuLVxcdFxcdCpwYWdlX21hc2sgPSBIUEFHRV9QVURfTlIgLSAxO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0aWYgKHBhZ2VzKVxcbitcXHRcXHRwYWdlc1swXSA9IHBhZ2U7XFxuIFxcbi1cXHRyZXR1cm4gcGFnZTtcXG4rXFx0cmV0dXJuIG5yO1xcbiB9XFxuIFxcbiAvKiBGT0xMX0ZPUkNFIGNhbiB3cml0ZSB0byBldmVuIHVud3JpdGFibGUgUE1EcyBpbiBDT1cgbWFwcGluZ3MuICovXFxuQEAgLTY5OCwxNCArNzIwLDE0IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3BtZChwbWRfdCBwbWQsIHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRyZXR1cm4gIXVzZXJmYXVsdGZkX2h1Z2VfcG1kX3dwKHZtYSwgcG1kKTtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcXG4rXFx0XFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxcbiB7XFxuIFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4gXFx0cG1kX3QgcG1kdmFsID0gKnBtZDtcXG4gXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb2ZmLCBucjtcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdGFzc2VydF9zcGluX2xvY2tlZChwbWRfbG9ja3B0cihtbSwgcG1kKSk7XFxuQEAgLTcxMyw1MCArNzM1LDU0IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRwYWdlID0gcG1kX3BhZ2UocG1kdmFsKTtcXG4gXFx0aWYgKChmbGFncyBcXHUwMDI2IEZPTExfV1JJVEUpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kdmFsLCBwYWdlLCB2bWEsIGZsYWdzKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0LyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqL1xcbiBcXHRpZiAoKGZsYWdzIFxcdTAwMjYgRk9MTF9EVU1QKSBcXHUwMDI2XFx1MDAyNiBpc19odWdlX3plcm9fcG1kKHBtZHZhbCkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xcbitcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFxuIFxcdGlmIChwbWRfcHJvdG5vbmUoKnBtZCkgXFx1MDAyNlxcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuIFxcbiBcXHRpZiAoIXBtZF93cml0ZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xcbitcXHRcXHRyZXR1cm4gLUVNTElOSztcXG4gXFxuIFxcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcXHUwMDI2IEZPTExfUElOKSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbihwYWdlKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XFxuIFxcbi1cXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XFxuK1xcdG9mZiA9IFBGTl9ET1dOKGFkZHIgXFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xcbitcXHRuciA9IG1pbihIUEFHRV9QTURfTlIgLSBvZmYsIFBGTl9ET1dOKGVuZCAtIGFkZHIpKTtcXG4rXFxuK1xcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKHJldCk7XFxuK1xcdFxcdHJldHVybiByZXQ7XFxuIFxcbiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXFxuIFxcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IChmbGFncyBcXHUwMDI2IEZPTExfVE9VQ0gpKVxcbiBcXHRcXHR0b3VjaF9wbWQodm1hLCBhZGRyLCBwbWQsIGZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSk7XFxuICNlbmRpZlxcdC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqL1xcbiBcXG4tXFx0cGFnZSArPSAoYWRkciBcXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4tXFx0KnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7XFxuK1xcdHBhZ2UgKz0gb2ZmO1xcbitcXG4rXFx0aWYgKHBhZ2VzKVxcbitcXHRcXHRwYWdlc1swXSA9IHBhZ2U7XFxuIFxcbi1cXHRyZXR1cm4gcGFnZTtcXG4rXFx0cmV0dXJuIG5yO1xcbiB9XFxuIFxcbiAjZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcXG4tXFx0XFx0XFx0XFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4tXFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcXG4rc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4tXFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuICNlbmRpZlxcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xcbiBcXG5AQCAtNzk5LDExMCArODI1LDIwNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4gXFx0cmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuKy8qXFxuKyAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgcnVuIGV2ZXJ5IHBlci1QVEUgc2FmZXR5IGNoZWNrIChwcmVzZW50LFxcbisgKiB3cml0ZS1mYXVsdCwgZ3VwX211c3RfdW5zaGFyZSgpKSBvbiB0aGUgUFRFLCBzbyB0aGlzIG9ubHkgZG9lcyB0aGVcXG4rICogcGVyLWZvbGlvIHdvcms6IHRoZSByZWZjb3VudCBncmFiLCB0aGUgRk9MTF9QSU4gYWNjZXNzaWJpbGl0eSBmYXVsdC1pbixcXG4rICogZGlydHkvYWNjZXNzZWQgbWFya2luZywgYW5kIHRoZSBhcnJheSBmaWxsIHdpdGggdGhlIGNhY2hlIGZsdXNoLlxcbisgKi9cXG4rc3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfcHRlX2NvbW1pdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4rXFx0XFx0cHRlX3QgcHRlLCB1bnNpZ25lZCBsb25nIG5yLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuK1xcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuK3tcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHQvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqL1xcbitcXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTtcXG4rXFx0aWYgKHVubGlrZWx5KHJldCkpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhZ2UgYWNjZXNzaWJsZSBpZiBhbmQgb25seSBpZiB3ZSBhcmUgZ29pbmdcXG4rXFx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXFxuK1xcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGZsYWdzIFxcdTAwMjYgRk9MTF9QSU4pIHtcXG4rXFx0XFx0cmV0ID0gYXJjaF9tYWtlX2ZvbGlvX2FjY2Vzc2libGUoZm9saW8pO1xcbitcXHRcXHRpZiAocmV0KSB7XFxuK1xcdFxcdFxcdGd1cF9wdXRfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1RPVUNIKSB7XFxuK1xcdFxcdGlmICgoZmxhZ3MgXFx1MDAyNiBGT0xMX1dSSVRFKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXB0ZV9kaXJ0eShwdGUpIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcXG4rXFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZVxcbitcXHRcXHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2VcXG4rXFx0XFx0ICogZm9saW9fbWFya19hY2Nlc3NlZCgpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XFxuK1xcdH1cXG4rXFxuK1xcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZSwgbnIsIHBhZ2VzKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yXFxuKyAqIHdoZW4gdGhlIFBURSBjYW5ub3QgYmUgZm9sbG93ZWQgYnV0IHRoZSBjYWxsZXIgbWF5IGZhdWx0IGl0IGluLCBhbmQgYVxcbisgKiBuZWdhdGl2ZSBlcnJubyB3aGVuIHRoZSBjYWxsZXIgbXVzdCByZXBvcnQgdGhlIGZhaWx1cmUuXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBmb2xsb3dfb25lX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbitcXHRcXHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXApXFxuIHtcXG4tXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbi1cXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRwdGVfdCAqcHRlcCwgcHRlO1xcbi1cXHRpbnQgcmV0O1xcbiBcXG4tXFx0cHRlcCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgXFx1MDAyNnB0bCk7XFxuLVxcdGlmICghcHRlcClcXG4tXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuLVxcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xcbitcXHQqcGFnZXAgPSBOVUxMO1xcbitcXG4gXFx0aWYgKCFwdGVfcHJlc2VudChwdGUpKVxcbi1cXHRcXHRnb3RvIG5vX3BhZ2U7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXHRpZiAocHRlX3Byb3Rub25lKHB0ZSkgXFx1MDAyNlxcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIG5vX3BhZ2U7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkcmVzcywgcHRlKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFdlIG9ubHkgY2FyZSBhYm91dCBhbm9uIHBhZ2VzIGluIGNhbl9mb2xsb3dfd3JpdGVfcHRlKCkuXFxuIFxcdCAqL1xcbi1cXHRpZiAoKGZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0ICAgICFjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGUsIHBhZ2UsIHZtYSwgZmxhZ3MpKSB7XFxuLVxcdFxcdHBhZ2UgPSBOVUxMO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbitcXHRpZiAoKGZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSkgXFx1MDAyNlxcdTAwMjYgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpXFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0aWYgKHVubGlrZWx5KCFwYWdlKSkge1xcbiBcXHRcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX0RVTVApIHtcXG4gXFx0XFx0XFx0LyogQXZvaWQgc3BlY2lhbCAobGlrZSB6ZXJvKSBwYWdlcyBpbiBjb3JlIGR1bXBzICovXFxuLVxcdFxcdFxcdHBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0aWYgKGlzX3plcm9fcGZuKHB0ZV9wZm4ocHRlKSkpIHtcXG4tXFx0XFx0XFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHJldCA9IGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xcbi1cXHRcXHRcXHRwYWdlID0gRVJSX1BUUihyZXQpO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdFxcdH1cXG4rXFx0XFx0aWYgKCFpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKVxcbitcXHRcXHRcXHRyZXR1cm4gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7XFxuK1xcdFxcdHBhZ2UgPSBwdGVfcGFnZShwdGUpO1xcbiBcXHR9XFxuLVxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4gXFxuLVxcdGlmICghcHRlX3dyaXRlKHB0ZSkgXFx1MDAyNlxcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkge1xcbi1cXHRcXHRwYWdlID0gRVJSX1BUUigtRU1MSU5LKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4rXFx0aWYgKCFwdGVfd3JpdGUocHRlKSBcXHUwMDI2XFx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxcbitcXHRcXHRyZXR1cm4gLUVNTElOSztcXG4gXFxuIFxcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcXHUwMDI2IEZPTExfUElOKSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbihwYWdlKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XFxuIFxcbi1cXHQvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqL1xcbi1cXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgMSwgZmxhZ3MpO1xcbi1cXHRpZiAodW5saWtlbHkocmV0KSkge1xcbi1cXHRcXHRwYWdlID0gRVJSX1BUUihyZXQpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbitcXHQqcGFnZXAgPSBwYWdlO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbiBcXG4tXFx0LypcXG4tXFx0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXFxuLVxcdCAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZVxcbi1cXHQgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cXG4tXFx0ICovXFxuLVxcdGlmIChmbGFncyBcXHUwMDI2IEZPTExfUElOKSB7XFxuLVxcdFxcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcXG4tXFx0XFx0aWYgKHJldCkge1xcbi1cXHRcXHRcXHR1bnBpbl91c2VyX3BhZ2UocGFnZSk7XFxuLVxcdFxcdFxcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbisvKlxcbisgKiBSZXR1cm4gaG93IG1hbnkgUFRFcyBtYXAgY29uc2VjdXRpdmUgcGFnZXMgb2YgdGhlIHNhbWUgZm9saW8gYW5kIGNhbiBiZVxcbisgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuXFxuKyAqXFxuKyAqIFRoZSB3cml0ZS1mYXVsdCBhbmQgdW5zaGFyZSBjaGVja3MgaW4gZm9sbG93X29uZV9wdGUoKSBhcmUgcGVyIFBURSwgYnV0IGFcXG4rICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seVxcbisgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5c1xcbisgKiBvbmUgcGFnZSBhdCBhIHRpbWUuXFxuKyAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQsXFxuK1xcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHB0ZV90ICpwdGVwLCBwdGVfdCAqYmF0Y2hfcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBtYXg7XFxuK1xcbitcXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFx0aWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdG1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdGlmIChtYXggXFx1MDAzYz0gMSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBNZXJnZSB5b3VuZy9kaXJ0eSBhY3Jvc3MgYmF0Y2ggc28gZm9saW9fbWFya19kaXJ0eSBzZWVzIGFueSBkaXJ0eS4gKi9cXG4rXFx0cmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBiYXRjaF9wdGUsIG1heCxcXG4rXFx0XFx0XFx0XFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsXFxuKyAqIHdoaWNoZXZlciBjb21lcyBmaXJzdCwgYW5kIGNvbW1pdCBldmVyeSBwYWdlIGZvdW5kLlxcbisgKlxcbisgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdFxcbisgKiBpcyBhIHNob3J0IHJlYWQ7IF9fZ2V0X3VzZXJfcGFnZXMoKSByZXRyeWluZyB0aGUgcmVhZCB3aWxsIGdldCB0aGUgZXJyb3IuXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXFxuK1xcdFxcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4re1xcbitcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuK1xcdGJvb2wgbmVlZF9ub19wYWdlX3RhYmxlID0gZmFsc2U7XFxuK1xcdHB0ZV90ICpwdGVwLCAqb3JpZ19wdGVwO1xcbitcXHR1bnNpZ25lZCBsb25nIHdhbGtfZW5kO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yID0gMDtcXG4rXFx0c3BpbmxvY2tfdCAqcHRsO1xcbitcXHRsb25nIHJldCA9IDA7XFxuK1xcbitcXHRvcmlnX3B0ZXAgPSBwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCBcXHUwMDI2cHRsKTtcXG4rXFx0aWYgKCFwdGVwKVxcbitcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4rXFxuK1xcdHdhbGtfZW5kID0gbWluKHBtZF9hZGRyX2VuZChhZGRyZXNzLCBlbmQpLCB2bWEtXFx1MDAzZXZtX2VuZCk7XFxuK1xcbitcXHRmb3IgKDsgYWRkcmVzcyBcXHUwMDNjIHdhbGtfZW5kOyBhZGRyZXNzICs9IFBBR0VfU0laRSwgcHRlcCsrKSB7XFxuK1xcdFxcdHB0ZV90IHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xcbitcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4rXFxuK1xcdFxcdHJldCA9IGZvbGxvd19vbmVfcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgcHRlLCBmbGFncywgXFx1MDAyNnBhZ2UpO1xcbitcXHRcXHRpZiAoIXJldCBcXHUwMDI2XFx1MDAyNiBwYWdlKSB7XFxuK1xcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGJhdGNoO1xcbitcXG4rXFx0XFx0XFx0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xcbitcXG4rXFx0XFx0XFx0YmF0Y2ggPSBmb2xsb3dfcHRlX2JhdGNoKHZtYSwgYWRkcmVzcywgd2Fsa19lbmQsIGZvbGlvLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgcHRlcCwgXFx1MDAyNmJhdGNoX3B0ZSwgZmxhZ3MpO1xcbitcXHRcXHRcXHRyZXQgPSBmb2xsb3dfcGFnZV9wdGVfY29tbWl0KHZtYSwgYWRkcmVzcywgZm9saW8sIHBhZ2UsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZXMgPyBwYWdlcyArIG5yIDogTlVMTCk7XFxuK1xcdFxcdFxcdGlmICghcmV0KSB7XFxuK1xcdFxcdFxcdFxcdG5yICs9IGJhdGNoO1xcbitcXHRcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHRcXHQgKiBUaGUgbG9vcCdzIG93biBpbmNyZW1lbnQgY292ZXJzIG9uZSBQVEU7IHNraXBcXG4rXFx0XFx0XFx0XFx0ICogdGhlIHJlc3Qgb2YgdGhlIGJhdGNoLlxcbitcXHRcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0XFx0cHRlcCArPSBiYXRjaCAtIDE7XFxuK1xcdFxcdFxcdFxcdGFkZHJlc3MgKz0gKGJhdGNoIC0gMSkgKiBQQUdFX1NJWkU7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdH1cXG4tXFx0fVxcbi1cXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1RPVUNIKSB7XFxuLVxcdFxcdGlmICgoZmxhZ3MgXFx1MDAyNiBGT0xMX1dSSVRFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgIXB0ZV9kaXJ0eShwdGUpIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcXG4tXFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBwdGVfbWt5b3VuZygpIHdvdWxkIGJlIG1vcmUgY29ycmVjdCBoZXJlLCBidXQgYXRvbWljIGNhcmVcXG4tXFx0XFx0ICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlXFxuLVxcdFxcdCAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS5cXG4rXFx0XFx0ICogbm9fcGFnZV90YWJsZSgpIG1heSBsb29rIHVwIHRoZSBwYWdlIGNhY2hlLCBzbyBpdCBjYW5ub3QgcnVuXFxuK1xcdFxcdCAqIHVuZGVyIHRoZSBQVEUgbG9jay5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xcbitcXHRcXHRpZiAoIXJldCBcXHUwMDI2XFx1MDAyNiBwdGVfbm9uZShwdGUpKVxcbitcXHRcXHRcXHRuZWVkX25vX3BhZ2VfdGFibGUgPSB0cnVlO1xcbitcXHRcXHRicmVhaztcXG4gXFx0fVxcbi1vdXQ6XFxuLVxcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcXG4tXFx0cmV0dXJuIHBhZ2U7XFxuLW5vX3BhZ2U6XFxuLVxcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcXG4tXFx0aWYgKCFwdGVfbm9uZShwdGUpKVxcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuK1xcbitcXHRwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTtcXG4rXFxuK1xcdGlmIChucilcXG4rXFx0XFx0cmV0dXJuIG5yO1xcbitcXHRpZiAobmVlZF9ub19wYWdlX3RhYmxlKVxcbitcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4gXFx0cG1kX3QgKnBtZCwgcG1kdmFsO1xcbiBcXHRzcGlubG9ja190ICpwdGw7XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRsb25nIHJldDtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXG4gXFx0cG1kID0gcG1kX29mZnNldChwdWRwLCBhZGRyZXNzKTtcXG5AQCAtOTEyLDcgKzEwMzMsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0aWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKVxcbiBcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4gXFx0aWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpXFxuLVxcdFxcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcXG4rXFx0XFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xcbiBcXG4gXFx0aWYgKHBtZF9wcm90bm9uZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcXG4gXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuQEAgLTkyNSwyOCArMTA0NiwzNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0fVxcbiBcXHRpZiAodW5saWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKSB7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuLVxcdFxcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcXG4rXFx0XFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xcbiBcXHR9XFxuIFxcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IChmbGFncyBcXHUwMDI2IEZPTExfU1BMSVRfUE1EKSkge1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbiBcXHRcXHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcyk7XFxuIFxcdFxcdC8qIElmIHBtZCB3YXMgbGVmdCBlbXB0eSwgc3R1ZmYgYSBwYWdlIHRhYmxlIGluIHRoZXJlIHF1aWNrbHkgKi9cXG4tXFx0XFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IEVSUl9QVFIoLUVOT01FTSkgOlxcbi1cXHRcXHRcXHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcXG4rXFx0XFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IC1FTk9NRU0gOlxcbitcXHRcXHRcXHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTtcXG4gXFx0fVxcbi1cXHRwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0cmV0ID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XFxuIFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuLVxcdHJldHVybiBwYWdlO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsIHRoZVxcbitcXHQgKiBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIHBtZCBsb2NrLlxcbitcXHQgKi9cXG4rXFx0aWYgKHJldCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgcGFnZXMpXFxuK1xcdFxcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHA0ZF90ICpwNGRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4gXFx0cHVkX3QgKnB1ZHAsIHB1ZDtcXG4gXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4rXFx0bG9uZyByZXQ7XFxuIFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4gXFxuIFxcdHB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpO1xcbkBAIC05NTUsMjIgKzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXHRpZiAocHVkX2xlYWYocHVkKSkge1xcbiBcXHRcXHRwdGwgPSBwdWRfbG9jayhtbSwgcHVkcCk7XFxuLVxcdFxcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0XFx0cmV0ID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbi1cXHRcXHRpZiAocGFnZSlcXG4tXFx0XFx0XFx0cmV0dXJuIHBhZ2U7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxcbitcXHRcXHQgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW9cXG4rXFx0XFx0ICogY2FuIGJlIHVwIHRvIEhQQUdFX1BVRF9OUiBwYWdlcywgdG9vIGxvbmcgdG8gZmx1c2ggdW5kZXIgYVxcbitcXHRcXHQgKiBzcGlubG9jay5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzZSAwIFxcdTAwMjZcXHUwMDI2IHBhZ2VzKVxcbitcXHRcXHRcXHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuIFxcdH1cXG4gXFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXG4tXFx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK3N0YXRpYyBsb25nIGZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcGdkX3QgKnBnZHAsXFxuK1xcdFxcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4ge1xcbiBcXHRwNGRfdCAqcDRkcCwgcDRkO1xcbiBcXG5AQCAtOTgxLDE1ICsxMTE2LDE4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKVxcbiBcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4gXFxuLVxcdHJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIHBhZ2VzKTtcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIGZvbGxvd19wYWdlX21hc2sgLSBsb29rIHVwIGEgcGFnZSBkZXNjcmlwdG9yIGZyb20gYSB1c2VyLXZpcnR1YWwgYWRkcmVzc1xcbisgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBwYWdlcyBhdCBhIHVzZXItdmlydHVhbCBhZGRyZXNzXFxuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcXG4gICogQGFkZHJlc3M6IHZpcnR1YWwgYWRkcmVzcyB0byBsb29rIHVwXFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxcbi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFza1xcbisgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG9cXG4rICogICAgICAgICB3YWxrIHRoZSBwYWdlIHRhYmxlcyAoZS5nLiB0byBmYXVsdCBwYWdlcyBpbikgd2l0aG91dCBjb2xsZWN0aW5nXFxuKyAqICAgICAgICAgb3IgcmVmY291bnRpbmcgdGhlbVxcbiAgKlxcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAgKlxcbkBAIC05OTgsMzMgKzExMzYsMzIgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxcbiAgKiByZWxldmFudCB3aXRoIEZPTExfUElOIGFuZCAhRk9MTF9XUklURS5cXG4gICpcXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXFxuLSAqXFxuLSAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxcbi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXFxuLSAqIGJ5IGEgcGFnZSBkZXNjcmlwdG9yIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cXG4rICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgc3RhcnRpbmcgYXQgQGFkZHJlc3MgdGhhdCB3ZXJlXFxuKyAqIHBsYWNlZCBpbnRvIEBwYWdlcyAoaWYgbm9uLU5VTEwpLCB3aGljaCBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgcGFnZXNcXG4rICogcmVxdWVzdGVkIHZpYSBAZW5kOyAwIGlmIG5vIG1hcHBpbmcgZXhpc3RzIGF0IEBhZGRyZXNzOyBvciBhIG5lZ2F0aXZlXFxuKyAqIGVycm5vIGZvciBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZCBieSBhIHBhZ2UgZGVzY3JpcHRvclxcbisgKiAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXFxuICAqL1xcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4ge1xcbiBcXHRwZ2RfdCAqcGdkO1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRsb25nIHJldDtcXG4gXFxuIFxcdHZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTtcXG4gXFxuLVxcdCpwYWdlX21hc2sgPSAwO1xcbiBcXHRwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTtcXG4gXFxuIFxcdGlmIChwZ2Rfbm9uZSgqcGdkKSB8fCB1bmxpa2VseShwZ2RfYmFkKCpwZ2QpKSlcXG4tXFx0XFx0cGFnZSA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuK1xcdFxcdHJldCA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuIFxcdGVsc2VcXG4tXFx0XFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XFxuK1xcdFxcdHJldCA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgcGFnZXMpO1xcbiBcXG4gXFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcXG4gXFxuLVxcdHJldHVybiBwYWdlO1xcbitcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG5AQCAtMTM1OCw3ICsxNDk1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4ge1xcbiBcXHRsb25nIHJldCA9IDAsIGkgPSAwO1xcbiBcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcXG4gXFxuIFxcdGlmICghbnJfcGFnZXMpXFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC0xMzczLDcgKzE1MDksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXG4gXFx0ZG8ge1xcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0XFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xcbitcXHRcXHRsb25nIG5yO1xcbiBcXG4gXFx0XFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xcbiBcXHRcXHRpZiAoIXZtYSB8fCBzdGFydCBcXHUwMDNlPSB2bWEtXFx1MDAzZXZtX2VuZCkge1xcbkBAIC0xNDAwLDggKzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0cGFnZXMgPyBcXHUwMDI2cGFnZSA6IE5VTEwpO1xcbiBcXHRcXHRcXHRcXHRpZiAocmV0KVxcbiBcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0XFx0cGFnZV9tYXNrID0gMDtcXG4tXFx0XFx0XFx0XFx0Z290byBuZXh0X3BhZ2U7XFxuK1xcdFxcdFxcdFxcdGd1cF9maWxsX3BhZ2VzKHZtYSwgc3RhcnQsIHBhZ2UsIDEsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBwYWdlcyA/IHBhZ2VzICsgaSA6IE5VTEwpO1xcbitcXHRcXHRcXHRcXHRpKys7XFxuK1xcdFxcdFxcdFxcdHN0YXJ0ICs9IFBBR0VfU0laRTtcXG4rXFx0XFx0XFx0XFx0bnJfcGFnZXMtLTtcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdFxcdH1cXG4gXFxuIFxcdFxcdFxcdGlmICghdm1hKSB7XFxuQEAgLTE0MjMsMTAgKzE1NjMsMTEgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0fVxcbiBcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4gXFxuLVxcdFxcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgXFx1MDAyNnBhZ2VfbWFzayk7XFxuLVxcdFxcdGlmICghcGFnZSB8fCBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkspIHtcXG4rXFx0XFx0bnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGd1cF9mbGFncywgcGFnZXMgPyBcXHUwMDI2cGFnZXNbaV0gOiBOVUxMKTtcXG4rXFx0XFx0aWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7XFxuIFxcdFxcdFxcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdFxcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAgbnIgPT0gLUVNTElOSywgbG9ja2VkKTtcXG4gXFx0XFx0XFx0c3dpdGNoIChyZXQpIHtcXG4gXFx0XFx0XFx0Y2FzZSAwOlxcbiBcXHRcXHRcXHRcXHRnb3RvIHJldHJ5O1xcbkBAIC0xNDQwLDcwICsxNTgxLDMwIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdEJVRygpO1xcbi1cXHRcXHR9IGVsc2UgaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVFWElTVCkge1xcbitcXHRcXHR9IGVsc2UgaWYgKG5yID09IC1FRVhJU1QpIHtcXG4gXFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0ICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZ1xcbiBcXHRcXHRcXHQgKiBzdHJ1Y3QgcGFnZS4gSWYgdGhlIGNhbGxlciBleHBlY3RzICoqcGFnZXMgdG8gYmVcXG4gXFx0XFx0XFx0ICogZmlsbGVkIGluLCBiYWlsIG91dCBub3csIGJlY2F1c2UgdGhhdCBjYW4ndCBiZSBkb25lXFxuLVxcdFxcdFxcdCAqIGZvciB0aGlzIHBhZ2UuXFxuK1xcdFxcdFxcdCAqIGZvciB0aGlzIHBhZ2UuIE90aGVyd2lzZSBhZHZhbmNlIGJ5IHRoZSBvbmUgcGFnZVxcbitcXHRcXHRcXHQgKiBmb2xsb3dfcGFnZV9tYXNrKCkgbG9va2VkIGF0LlxcbiBcXHRcXHRcXHQgKi9cXG4gXFx0XFx0XFx0aWYgKHBhZ2VzKSB7XFxuLVxcdFxcdFxcdFxcdHJldCA9IFBUUl9FUlIocGFnZSk7XFxuK1xcdFxcdFxcdFxcdHJldCA9IG5yO1xcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0fVxcbi1cXHRcXHR9IGVsc2UgaWYgKElTX0VSUihwYWdlKSkge1xcbi1cXHRcXHRcXHRyZXQgPSBQVFJfRVJSKHBhZ2UpO1xcbitcXHRcXHRcXHRuciA9IDE7XFxuK1xcdFxcdH0gZWxzZSBpZiAobnIgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdHJldCA9IG5yO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbi1uZXh0X3BhZ2U6XFxuLVxcdFxcdHBhZ2VfaW5jcmVtID0gMSArICh+KHN0YXJ0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpIFxcdTAwMjYgcGFnZV9tYXNrKTtcXG4tXFx0XFx0aWYgKHBhZ2VfaW5jcmVtIFxcdTAwM2UgbnJfcGFnZXMpXFxuLVxcdFxcdFxcdHBhZ2VfaW5jcmVtID0gbnJfcGFnZXM7XFxuLVxcbi1cXHRcXHRpZiAocGFnZXMpIHtcXG4tXFx0XFx0XFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XFxuLVxcdFxcdFxcdHVuc2lnbmVkIGludCBqO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogVGhpcyBtdXN0IGJlIGEgbGFyZ2UgZm9saW8gKGFuZCBkb2Vzbid0IG5lZWQgdG9cXG4tXFx0XFx0XFx0ICogYmUgdGhlIHdob2xlIGZvbGlvOyBpdCBjYW4gYmUgcGFydCBvZiBpdCksIGRvXFxuLVxcdFxcdFxcdCAqIHRoZSByZWZjb3VudCB3b3JrIGZvciBhbGwgdGhlIHN1YnBhZ2VzIHRvby5cXG4tXFx0XFx0XFx0ICpcXG4tXFx0XFx0XFx0ICogTk9URTogaGVyZSB0aGUgcGFnZSBtYXkgbm90IGJlIHRoZSBoZWFkIHBhZ2VcXG4tXFx0XFx0XFx0ICogZS5nLiB3aGVuIHN0YXJ0IGFkZHIgaXMgbm90IHRocC1zaXplIGFsaWduZWQuXFxuLVxcdFxcdFxcdCAqIHRyeV9ncmFiX2ZvbGlvKCkgc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0YWlsXFxuLVxcdFxcdFxcdCAqIHBhZ2VzLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aWYgKHBhZ2VfaW5jcmVtIFxcdTAwM2UgMSkge1xcbi1cXHRcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFxuLVxcdFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdFxcdCAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGVcXG4tXFx0XFx0XFx0XFx0ICogbGFyZ2UgZm9saW8sIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuXFxuLVxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgZ3VwX2ZsYWdzKSkge1xcbi1cXHRcXHRcXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBSZWxlYXNlIHRoZSAxc3QgcGFnZSByZWYgaWYgdGhlXFxuLVxcdFxcdFxcdFxcdFxcdCAqIGZvbGlvIGlzIHByb2JsZW1hdGljLCBmYWlsIGhhcmQuXFxuLVxcdFxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRcXHRndXBfcHV0X2ZvbGlvKGZvbGlvLCAxLCBndXBfZmxhZ3MpO1xcbi1cXHRcXHRcXHRcXHRcXHRyZXQgPSAtRUZBVUxUO1xcbi1cXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHR9XFxuLVxcbi1cXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGFnZV9pbmNyZW07IGorKykge1xcbi1cXHRcXHRcXHRcXHRzdWJwYWdlID0gcGFnZSArIGo7XFxuLVxcdFxcdFxcdFxcdHBhZ2VzW2kgKyBqXSA9IHN1YnBhZ2U7XFxuLVxcdFxcdFxcdFxcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIHN0YXJ0ICsgaiAqIFBBR0VfU0laRSk7XFxuLVxcdFxcdFxcdFxcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4rXFx0XFx0LyogQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgcGluIG1vcmUgcGFnZXMgdGhhbiB0aGUgY2FsbGVyIHdpbGwgZnJlZS4gKi9cXG4rXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKG5yIFxcdTAwM2UgbnJfcGFnZXMpO1xcbiBcXG4tXFx0XFx0aSArPSBwYWdlX2luY3JlbTtcXG4tXFx0XFx0c3RhcnQgKz0gcGFnZV9pbmNyZW0gKiBQQUdFX1NJWkU7XFxuLVxcdFxcdG5yX3BhZ2VzIC09IHBhZ2VfaW5jcmVtO1xcbitcXHRcXHRpICs9IG5yO1xcbitcXHRcXHRzdGFydCArPSBuciAqIFBBR0VfU0laRTtcXG4rXFx0XFx0bnJfcGFnZXMgLT0gbnI7XFxuIFxcdH0gd2hpbGUgKG5yX3BhZ2VzKTtcXG4gb3V0OlxcbiBcXHRyZXR1cm4gaSA/IGkgOiByZXQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU1OjEzLjExNjI4MTUyNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjk1MjYwODEwOTA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJIVUdFVExCRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJnZXRfdXNlcl9wYWdlc1wiLFxuICAgIFwiZ2V0X3VzZXJfcGFnZXNfcmVtb3RlXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlc191bmxvY2tlZFwiLFxuICAgIFwicGluX3VzZXJfcGFnZXNcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzX3JlbW90ZVwiLFxuICAgIFwicGluX3VzZXJfcGFnZXNfdW5sb2NrZWRcIixcbiAgICBcImZhdWx0aW5fcGFnZV9yYW5nZVwiLFxuICAgIFwicG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjdlNjc2ZThiMDM4ZTAxY2NkYzYyNzg1NzY5MzZkNjBkOWI3YWI4NFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vZ3VwLmMgYi9tbS9ndXAuY1xuaW5kZXggMDY5MjExOWI3OTA0My4uMTA2ODA2NjM0YjNjNCAxMDA2NDRcbi0tLSBhL21tL2d1cC5jXG4rKysgYi9tbS9ndXAuY1xuQEAgLTYwOCwxNSArNjA4LDE1IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiBwYWdlIFx1MDAyNlx1MDAyNiBQYWdlQW5vbihwYWdlKSBcdTAwMjZcdTAwMjYgUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXG4rc3RhdGljIGxvbmcgbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXG4ge1xuIFx0aWYgKCEoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdC8qXG4gXHQgKiBXaGVuIGNvcmUgZHVtcGluZywgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSB1bm5lY2Vzc2FyeSBwYWdlcyBvclxuLVx0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiBOVUxMIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxuK1x0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiAwIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxuIFx0ICogdGhlbiBnZXRfZHVtcF9wYWdlKCkgd2lsbCByZXR1cm4gTlVMTCB0byBsZWF2ZSBhIGhvbGUgaW4gdGhlIGR1bXAuXG4gXHQgKiBCdXQgd2UgY2FuIG9ubHkgbWFrZSB0aGlzIG9wdGltaXphdGlvbiB3aGVyZSBhIGhvbGUgd291bGQgc3VyZWx5XG4gXHQgKiBiZSB6ZXJvLWZpbGxlZCBpZiBoYW5kbGVfbW1fZmF1bHQoKSBhY3R1YWxseSBkaWQgaGFuZGxlIGl0LlxuQEAgLTYyNSwxMiArNjI1LDI5IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0c3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTtcbiBcbiBcdFx0aWYgKCFodWdldGxiZnNfcGFnZWNhY2hlX3ByZXNlbnQoaCwgdm1hLCBhZGRyZXNzKSlcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdH0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VmYXVsdCkpIHtcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4rXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuLVx0cmV0dXJuIE5VTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbitcdFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnIsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0aWYgKCFwYWdlcylcbitcdFx0cmV0dXJuO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKykge1xuK1x0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZSA9IHBhZ2UgKyBpO1xuK1xuK1x0XHRwYWdlc1tpXSA9IHN1YnBhZ2U7XG4rXHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIGFkZHJlc3MgKyBpICogUEFHRV9TSVpFKTtcbitcdFx0Zmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7XG4rXHR9XG4gfVxuIFxuICNpZmRlZiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVNcbkBAIC02NDYsMzggKzY2Myw0MyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihwYWdlLCB2bWEsIGZsYWdzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHB1ZF90IHB1ZCA9ICpwdWRwO1xuIFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwdWRfcGZuKHB1ZCk7XG4rXHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XG4gXHRpbnQgcmV0O1xuIFxuIFx0YXNzZXJ0X3NwaW5fbG9ja2VkKHB1ZF9sb2NrcHRyKG1tLCBwdWRwKSk7XG4gXG4gXHRpZiAoIXB1ZF9wcmVzZW50KHB1ZCkpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICFjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWQsIHBmbl90b19wYWdlKHBmbiksIHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbitcdFx0cmV0dXJuIDA7XG4gXG4tXHRwZm4gKz0gKGFkZHIgXHUwMDI2IH5QVURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRvZmYgPSBQRk5fRE9XTihhZGRyIFx1MDAyNiB+UFVEX01BU0spO1xuK1x0cGZuICs9IG9mZjtcbiBcdHBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pO1xuIFxuIFx0aWYgKCFwdWRfd3JpdGUocHVkKSBcdTAwMjZcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7XG4rXHRcdHJldHVybiAtRU1MSU5LO1xuK1xuK1x0bnIgPSBtaW4oSFBBR0VfUFVEX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7XG4gXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4rXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpO1xuIFx0aWYgKHJldClcbi1cdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdGVsc2Vcbi1cdFx0KnBhZ2VfbWFzayA9IEhQQUdFX1BVRF9OUiAtIDE7XG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRpZiAocGFnZXMpXG4rXHRcdHBhZ2VzWzBdID0gcGFnZTtcbiBcbi1cdHJldHVybiBwYWdlO1xuK1x0cmV0dXJuIG5yO1xuIH1cbiBcbiAvKiBGT0xMX0ZPUkNFIGNhbiB3cml0ZSB0byBldmVuIHVud3JpdGFibGUgUE1EcyBpbiBDT1cgbWFwcGluZ3MuICovXG5AQCAtNjk4LDE0ICs3MjAsMTQgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZF90IHBtZCwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRyZXR1cm4gIXVzZXJmYXVsdGZkX2h1Z2VfcG1kX3dwKHZtYSwgcG1kKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCAqcG1kLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRwbWRfdCBwbWR2YWwgPSAqcG1kO1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XG4gXHRpbnQgcmV0O1xuIFxuIFx0YXNzZXJ0X3NwaW5fbG9ja2VkKHBtZF9sb2NrcHRyKG1tLCBwbWQpKTtcbkBAIC03MTMsNTAgKzczNSw1NCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpO1xuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4gXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZHZhbCwgcGFnZSwgdm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdC8qIEF2b2lkIGR1bXBpbmcgaHVnZSB6ZXJvIHBhZ2UgKi9cbiBcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkgXHUwMDI2XHUwMDI2IGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4rXHRcdHJldHVybiAtRUZBVUxUO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZSgqcG1kKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbitcdFx0cmV0dXJuIDA7XG4gXG4gXHRpZiAoIXBtZF93cml0ZShwbWR2YWwpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU1MSU5LKTtcbitcdFx0cmV0dXJuIC1FTUxJTks7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSBcdTAwMjZcdTAwMjYgUGFnZUFub24ocGFnZSkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpO1xuIFxuLVx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xuK1x0b2ZmID0gUEZOX0RPV04oYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbitcdG5yID0gbWluKEhQQUdFX1BNRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpO1xuK1xuK1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgbnIsIGZsYWdzKTtcbiBcdGlmIChyZXQpXG4tXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4rXHRcdHJldHVybiByZXQ7XG4gXG4gI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRVxuIFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkpXG4gXHRcdHRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpO1xuICNlbmRpZlx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXG4gXG4tXHRwYWdlICs9IChhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuLVx0KnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7XG4rXHRwYWdlICs9IG9mZjtcbitcbitcdGlmIChwYWdlcylcbitcdFx0cGFnZXNbMF0gPSBwYWdlO1xuIFxuLVx0cmV0dXJuIHBhZ2U7XG4rXHRyZXR1cm4gbnI7XG4gfVxuIFxuICNlbHNlICAvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi9cbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4tXHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4tXHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAwO1xuIH1cbiAjZW5kaWZcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuIFxuQEAgLTc5OSwxMTAgKzgyNSwyMDUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRyZXR1cm4gIXVzZXJmYXVsdGZkX3B0ZV93cCh2bWEsIHB0ZSk7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncylcbisvKlxuKyAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgcnVuIGV2ZXJ5IHBlci1QVEUgc2FmZXR5IGNoZWNrIChwcmVzZW50LFxuKyAqIHdyaXRlLWZhdWx0LCBndXBfbXVzdF91bnNoYXJlKCkpIG9uIHRoZSBQVEUsIHNvIHRoaXMgb25seSBkb2VzIHRoZVxuKyAqIHBlci1mb2xpbyB3b3JrOiB0aGUgcmVmY291bnQgZ3JhYiwgdGhlIEZPTExfUElOIGFjY2Vzc2liaWxpdHkgZmF1bHQtaW4sXG4rICogZGlydHkvYWNjZXNzZWQgbWFya2luZywgYW5kIHRoZSBhcnJheSBmaWxsIHdpdGggdGhlIGNhY2hlIGZsdXNoLlxuKyAqL1xuK3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UsXG4rXHRcdHB0ZV90IHB0ZSwgdW5zaWduZWQgbG9uZyBuciwgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuK3tcbitcdGxvbmcgcmV0O1xuK1xuK1x0LyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi9cbitcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCBuciwgZmxhZ3MpO1xuK1x0aWYgKHVubGlrZWx5KHJldCkpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKlxuK1x0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXG4rXHQgKiB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZSBzZWVcbitcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuK1x0ICovXG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSB7XG4rXHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbitcdFx0aWYgKHJldCkge1xuK1x0XHRcdGd1cF9wdXRfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSB7XG4rXHRcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIXB0ZV9kaXJ0eShwdGUpIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpXG4rXHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4rXHRcdC8qXG4rXHRcdCAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZVxuK1x0XHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2VcbitcdFx0ICogZm9saW9fbWFya19hY2Nlc3NlZCgpLlxuK1x0XHQgKi9cbitcdFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XG4rXHR9XG4rXG4rXHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2UsIG5yLCBwYWdlcyk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yXG4rICogd2hlbiB0aGUgUFRFIGNhbm5vdCBiZSBmb2xsb3dlZCBidXQgdGhlIGNhbGxlciBtYXkgZmF1bHQgaXQgaW4sIGFuZCBhXG4rICogbmVnYXRpdmUgZXJybm8gd2hlbiB0aGUgY2FsbGVyIG11c3QgcmVwb3J0IHRoZSBmYWlsdXJlLlxuKyAqL1xuK3N0YXRpYyBsb25nIGZvbGxvd19vbmVfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4rXHRcdHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHB0ZV90ICpwdGVwLCBwdGU7XG4tXHRpbnQgcmV0O1xuIFxuLVx0cHRlcCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgXHUwMDI2cHRsKTtcbi1cdGlmICghcHRlcClcbi1cdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4tXHRwdGUgPSBwdGVwX2dldChwdGVwKTtcbitcdCpwYWdlcCA9IE5VTEw7XG4rXG4gXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZSkpXG4tXHRcdGdvdG8gbm9fcGFnZTtcbitcdFx0cmV0dXJuIDA7XG4gXHRpZiAocHRlX3Byb3Rub25lKHB0ZSkgXHUwMDI2XHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcbi1cdFx0Z290byBub19wYWdlO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZSk7XG4gXG4gXHQvKlxuIFx0ICogV2Ugb25seSBjYXJlIGFib3V0IGFub24gcGFnZXMgaW4gY2FuX2ZvbGxvd193cml0ZV9wdGUoKS5cbiBcdCAqL1xuLVx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpIHtcbi1cdFx0cGFnZSA9IE5VTEw7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuK1x0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2ICFjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGUsIHBhZ2UsIHZtYSwgZmxhZ3MpKVxuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdGlmICh1bmxpa2VseSghcGFnZSkpIHtcbiBcdFx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX0RVTVApIHtcbiBcdFx0XHQvKiBBdm9pZCBzcGVjaWFsIChsaWtlIHplcm8pIHBhZ2VzIGluIGNvcmUgZHVtcHMgKi9cbi1cdFx0XHRwYWdlID0gRVJSX1BUUigtRUZBVUxUKTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRpZiAoaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkge1xuLVx0XHRcdHBhZ2UgPSBwdGVfcGFnZShwdGUpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHJldCA9IGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xuLVx0XHRcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XG4tXHRcdFx0Z290byBvdXQ7XG4rXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdH1cbitcdFx0aWYgKCFpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKVxuK1x0XHRcdHJldHVybiBmb2xsb3dfcGZuX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIGZsYWdzKTtcbitcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4gXHR9XG4tXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG4tXHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKSB7XG4tXHRcdHBhZ2UgPSBFUlJfUFRSKC1FTUxJTkspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbitcdGlmICghcHRlX3dyaXRlKHB0ZSkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXG4rXHRcdHJldHVybiAtRU1MSU5LO1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX1BBR0UoKGZsYWdzIFx1MDAyNiBGT0xMX1BJTikgXHUwMDI2XHUwMDI2IFBhZ2VBbm9uKHBhZ2UpIFx1MDAyNlx1MDAyNlxuIFx0XHRcdCAgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBwYWdlKTtcbiBcbi1cdC8qIHRyeV9ncmFiX2ZvbGlvKCkgZG9lcyBub3RoaW5nIHVubGVzcyBGT0xMX0dFVCBvciBGT0xMX1BJTiBpcyBzZXQuICovXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgMSwgZmxhZ3MpO1xuLVx0aWYgKHVubGlrZWx5KHJldCkpIHtcbi1cdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4rXHQqcGFnZXAgPSBwYWdlO1xuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0Lypcbi1cdCAqIFdlIG5lZWQgdG8gbWFrZSB0aGUgcGFnZSBhY2Nlc3NpYmxlIGlmIGFuZCBvbmx5IGlmIHdlIGFyZSBnb2luZ1xuLVx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXG4tXHQgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbi1cdCAqL1xuLVx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1BJTikge1xuLVx0XHRyZXQgPSBhcmNoX21ha2VfZm9saW9fYWNjZXNzaWJsZShmb2xpbyk7XG4tXHRcdGlmIChyZXQpIHtcbi1cdFx0XHR1bnBpbl91c2VyX3BhZ2UocGFnZSk7XG4tXHRcdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0XHRnb3RvIG91dDtcbisvKlxuKyAqIFJldHVybiBob3cgbWFueSBQVEVzIG1hcCBjb25zZWN1dGl2ZSBwYWdlcyBvZiB0aGUgc2FtZSBmb2xpbyBhbmQgY2FuIGJlXG4rICogY29tbWl0dGVkIGFzIG9uZSBydW4uIEFsd2F5cyBhdCBsZWFzdCAxLlxuKyAqXG4rICogVGhlIHdyaXRlLWZhdWx0IGFuZCB1bnNoYXJlIGNoZWNrcyBpbiBmb2xsb3dfb25lX3B0ZSgpIGFyZSBwZXIgUFRFLCBidXQgYVxuKyAqIHdyaXRhYmxlIHJ1biBuZWVkcyBubyByZXBlYXQ6IGEgd3JpdGFibGUgYW5vbiBwYWdlIGlzIGV4Y2x1c2l2ZS4gQSByZWFkLW9ubHlcbisgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5c1xuKyAqIG9uZSBwYWdlIGF0IGEgdGltZS5cbisgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQsXG4rXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHB0ZV90ICpwdGVwLCBwdGVfdCAqYmF0Y2hfcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBtYXg7XG4rXG4rXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuK1x0XHRyZXR1cm4gMTtcbitcdGlmICghcHRlX3dyaXRlKCpiYXRjaF9wdGUpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IChGT0xMX1dSSVRFIHwgRk9MTF9QSU4pKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRtYXggPSAod2Fsa19lbmQgLSBhZGRyZXNzKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdGlmIChtYXggXHUwMDNjPSAxKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIE1lcmdlIHlvdW5nL2RpcnR5IGFjcm9zcyBiYXRjaCBzbyBmb2xpb19tYXJrX2RpcnR5IHNlZXMgYW55IGRpcnR5LiAqL1xuK1x0cmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBiYXRjaF9wdGUsIG1heCxcbitcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfTUVSR0VfWU9VTkdfRElSVFkpO1xuK31cbitcbisvKlxuKyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsXG4rICogd2hpY2hldmVyIGNvbWVzIGZpcnN0LCBhbmQgY29tbWl0IGV2ZXJ5IHBhZ2UgZm91bmQuXG4rICpcbisgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdFxuKyAqIGlzIGEgc2hvcnQgcmVhZDsgX19nZXRfdXNlcl9wYWdlcygpIHJldHJ5aW5nIHRoZSByZWFkIHdpbGwgZ2V0IHRoZSBlcnJvci5cbisgKi9cbitzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbit7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcdGJvb2wgbmVlZF9ub19wYWdlX3RhYmxlID0gZmFsc2U7XG4rXHRwdGVfdCAqcHRlcCwgKm9yaWdfcHRlcDtcbitcdHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQ7XG4rXHR1bnNpZ25lZCBsb25nIG5yID0gMDtcbitcdHNwaW5sb2NrX3QgKnB0bDtcbitcdGxvbmcgcmV0ID0gMDtcbitcbitcdG9yaWdfcHRlcCA9IHB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsIFx1MDAyNnB0bCk7XG4rXHRpZiAoIXB0ZXApXG4rXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1xuK1x0d2Fsa19lbmQgPSBtaW4ocG1kX2FkZHJfZW5kKGFkZHJlc3MsIGVuZCksIHZtYS1cdTAwM2V2bV9lbmQpO1xuK1xuK1x0Zm9yICg7IGFkZHJlc3MgXHUwMDNjIHdhbGtfZW5kOyBhZGRyZXNzICs9IFBBR0VfU0laRSwgcHRlcCsrKSB7XG4rXHRcdHB0ZV90IHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcbitcdFx0cmV0ID0gZm9sbG93X29uZV9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBwdGUsIGZsYWdzLCBcdTAwMjZwYWdlKTtcbitcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHBhZ2UpIHtcbitcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbitcdFx0XHR1bnNpZ25lZCBsb25nIGJhdGNoO1xuK1xuK1x0XHRcdHB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTtcbitcbitcdFx0XHRiYXRjaCA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCB3YWxrX2VuZCwgZm9saW8sXG4rXHRcdFx0XHRcdFx0IHB0ZXAsIFx1MDAyNmJhdGNoX3B0ZSwgZmxhZ3MpO1xuK1x0XHRcdHJldCA9IGZvbGxvd19wYWdlX3B0ZV9jb21taXQodm1hLCBhZGRyZXNzLCBmb2xpbywgcGFnZSxcbitcdFx0XHRcdFx0XHQgICAgIGJhdGNoX3B0ZSwgYmF0Y2gsIGZsYWdzLFxuK1x0XHRcdFx0XHRcdCAgICAgcGFnZXMgPyBwYWdlcyArIG5yIDogTlVMTCk7XG4rXHRcdFx0aWYgKCFyZXQpIHtcbitcdFx0XHRcdG5yICs9IGJhdGNoO1xuK1x0XHRcdFx0LypcbitcdFx0XHRcdCAqIFRoZSBsb29wJ3Mgb3duIGluY3JlbWVudCBjb3ZlcnMgb25lIFBURTsgc2tpcFxuK1x0XHRcdFx0ICogdGhlIHJlc3Qgb2YgdGhlIGJhdGNoLlxuK1x0XHRcdFx0ICovXG4rXHRcdFx0XHRwdGVwICs9IGJhdGNoIC0gMTtcbitcdFx0XHRcdGFkZHJlc3MgKz0gKGJhdGNoIC0gMSkgKiBQQUdFX1NJWkU7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4gXHRcdH1cbi1cdH1cbi1cdGlmIChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkge1xuLVx0XHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFwdGVfZGlydHkocHRlKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuLVx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuK1xuIFx0XHQvKlxuLVx0XHQgKiBwdGVfbWt5b3VuZygpIHdvdWxkIGJlIG1vcmUgY29ycmVjdCBoZXJlLCBidXQgYXRvbWljIGNhcmVcbi1cdFx0ICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlXG4tXHRcdCAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS5cbitcdFx0ICogbm9fcGFnZV90YWJsZSgpIG1heSBsb29rIHVwIHRoZSBwYWdlIGNhY2hlLCBzbyBpdCBjYW5ub3QgcnVuXG4rXHRcdCAqIHVuZGVyIHRoZSBQVEUgbG9jay5cbiBcdFx0ICovXG4tXHRcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgcHRlX25vbmUocHRlKSlcbitcdFx0XHRuZWVkX25vX3BhZ2VfdGFibGUgPSB0cnVlO1xuK1x0XHRicmVhaztcbiBcdH1cbi1vdXQ6XG4tXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7XG4tXHRyZXR1cm4gcGFnZTtcbi1ub19wYWdlOlxuLVx0cHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpO1xuLVx0aWYgKCFwdGVfbm9uZShwdGUpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1xuK1x0cHRlX3VubWFwX3VubG9jayhvcmlnX3B0ZXAsIHB0bCk7XG4rXG4rXHRpZiAobnIpXG4rXHRcdHJldHVybiBucjtcbitcdGlmIChuZWVkX25vX3BhZ2VfdGFibGUpXG4rXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwbWRfdCAqcG1kLCBwbWR2YWw7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdGxvbmcgcmV0O1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXG4gXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHJlc3MpO1xuQEAgLTkxMiw3ICsxMDMzLDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRpZiAoIXBtZF9wcmVzZW50KHBtZHZhbCkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpXG4tXHRcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcbitcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuQEAgLTkyNSwyOCArMTA0NiwzNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXHR9XG4gXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBGT0xMX1NQTElUX1BNRCkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpO1xuIFx0XHQvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovXG4tXHRcdHJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDpcbi1cdFx0XHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcbitcdFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IC1FTk9NRU0gOlxuK1x0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0fVxuLVx0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRyZXQgPSBmb2xsb3dfaHVnZV9wbWQodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdHNwaW5fdW5sb2NrKHB0bCk7XG4tXHRyZXR1cm4gcGFnZTtcbitcbitcdC8qXG4rXHQgKiBUaGUgcmVmIGlzIGFscmVhZHkgaGVsZCwgc28gdGhlIHBhZ2UgY2Fubm90IGdvIGF3YXk6IGZpbGwgdGhlXG4rXHQgKiBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIHBtZCBsb2NrLlxuK1x0ICovXG4rXHRpZiAocmV0IFx1MDAzZSAwIFx1MDAyNlx1MDAyNiBwYWdlcylcbitcdFx0Z3VwX2ZpbGxfcGFnZXModm1hLCBhZGRyZXNzLCBwYWdlc1swXSwgcmV0LCBwYWdlcyk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwNGRfdCAqcDRkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHB1ZF90ICpwdWRwLCBwdWQ7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdGxvbmcgcmV0O1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXG4gXHRwdWRwID0gcHVkX29mZnNldChwNGRwLCBhZGRyZXNzKTtcbkBAIC05NTUsMjIgKzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRcdHJldCA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0aWYgKHBhZ2UpXG4tXHRcdFx0cmV0dXJuIHBhZ2U7XG4rXHRcdC8qXG4rXHRcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxuK1x0XHQgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW9cbitcdFx0ICogY2FuIGJlIHVwIHRvIEhQQUdFX1BVRF9OUiBwYWdlcywgdG9vIGxvbmcgdG8gZmx1c2ggdW5kZXIgYVxuK1x0XHQgKiBzcGlubG9jay5cbitcdFx0ICovXG4rXHRcdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IHBhZ2VzKVxuK1x0XHRcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0fVxuIFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcGdkX3QgKnBnZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwNGRfdCAqcDRkcCwgcDRkO1xuIFxuQEAgLTk4MSwxNSArMTExNiwxOCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcDRkX3ByZXNlbnQocDRkKSB8fCBwNGRfYmFkKHA0ZCkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIHA0ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIHBhZ2VzKTtcbiB9XG4gXG4gLyoqXG4tICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4rICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgcGFnZXMgYXQgYSB1c2VyLXZpcnR1YWwgYWRkcmVzc1xuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcbiAgKiBAYWRkcmVzczogdmlydHVhbCBhZGRyZXNzIHRvIGxvb2sgdXBcbisgKiBAZW5kOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RvcCBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxuLSAqIEBwYWdlX21hc2s6IGEgcG9pbnRlciB0byBvdXRwdXQgcGFnZV9tYXNrXG4rICogQHBhZ2VzOiBhcnJheSB0byByZWNlaXZlIHRoZSBwYWdlcywgcmVmY291bnRlZCBwZXIgQGZsYWdzLCBvciBOVUxMIHRvXG4rICogICAgICAgICB3YWxrIHRoZSBwYWdlIHRhYmxlcyAoZS5nLiB0byBmYXVsdCBwYWdlcyBpbikgd2l0aG91dCBjb2xsZWN0aW5nXG4rICogICAgICAgICBvciByZWZjb3VudGluZyB0aGVtXG4gICpcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAgKlxuQEAgLTk5OCwzMyArMTEzNiwzMiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiAgKiB0cmlnZ2VyIGEgZmF1bHQgd2l0aCBGQVVMVF9GTEFHX1VOU0hBUkUgc2V0LiBOb3RlIHRoYXQgdW5zaGFyaW5nIGlzIG9ubHlcbiAgKiByZWxldmFudCB3aXRoIEZPTExfUElOIGFuZCAhRk9MTF9XUklURS5cbiAgKlxuLSAqIE9uIG91dHB1dCwgQHBhZ2VfbWFzayBpcyBzZXQgYWNjb3JkaW5nIHRvIHRoZSBzaXplIG9mIHRoZSBwYWdlLlxuLSAqXG4tICogUmV0dXJuOiB0aGUgbWFwcGVkIChzdHJ1Y3QgcGFnZSAqKSwgJU5VTEwgaWYgbm8gbWFwcGluZyBleGlzdHMsIG9yXG4tICogYW4gZXJyb3IgcG9pbnRlciBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZFxuLSAqIGJ5IGEgcGFnZSBkZXNjcmlwdG9yIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cbisgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgY29udGlndW91cyBwYWdlcyBzdGFydGluZyBhdCBAYWRkcmVzcyB0aGF0IHdlcmVcbisgKiBwbGFjZWQgaW50byBAcGFnZXMgKGlmIG5vbi1OVUxMKSwgd2hpY2ggbWF5IGJlIGZld2VyIHRoYW4gdGhlIHBhZ2VzXG4rICogcmVxdWVzdGVkIHZpYSBAZW5kOyAwIGlmIG5vIG1hcHBpbmcgZXhpc3RzIGF0IEBhZGRyZXNzOyBvciBhIG5lZ2F0aXZlXG4rICogZXJybm8gZm9yIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkIGJ5IGEgcGFnZSBkZXNjcmlwdG9yXG4rICogKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLlxuICAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHBnZF90ICpwZ2Q7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0bG9uZyByZXQ7XG4gXG4gXHR2bWFfcGd0YWJsZV93YWxrX2JlZ2luKHZtYSk7XG4gXG4tXHQqcGFnZV9tYXNrID0gMDtcbiBcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpO1xuIFxuIFx0aWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKVxuLVx0XHRwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbitcdFx0cmV0ID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGVsc2Vcbi1cdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRcdHJldCA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgcGFnZXMpO1xuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcbiBcbi1cdHJldHVybiBwYWdlO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG5AQCAtMTM1OCw3ICsxNDk1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiB7XG4gXHRsb25nIHJldCA9IDAsIGkgPSAwO1xuIFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xuLVx0dW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwO1xuIFxuIFx0aWYgKCFucl9wYWdlcylcbiBcdFx0cmV0dXJuIDA7XG5AQCAtMTM3Myw3ICsxNTA5LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdGRvIHtcbiBcdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRcdHVuc2lnbmVkIGludCBwYWdlX2luY3JlbTtcbitcdFx0bG9uZyBucjtcbiBcbiBcdFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xuIFx0XHRpZiAoIXZtYSB8fCBzdGFydCBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbkBAIC0xNDAwLDggKzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0XHRwYWdlcyA/IFx1MDAyNnBhZ2UgOiBOVUxMKTtcbiBcdFx0XHRcdGlmIChyZXQpXG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0cGFnZV9tYXNrID0gMDtcbi1cdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuK1x0XHRcdFx0Z3VwX2ZpbGxfcGFnZXModm1hLCBzdGFydCwgcGFnZSwgMSxcbitcdFx0XHRcdFx0ICAgICAgIHBhZ2VzID8gcGFnZXMgKyBpIDogTlVMTCk7XG4rXHRcdFx0XHRpKys7XG4rXHRcdFx0XHRzdGFydCArPSBQQUdFX1NJWkU7XG4rXHRcdFx0XHRucl9wYWdlcy0tO1xuK1x0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0fVxuIFxuIFx0XHRcdGlmICghdm1hKSB7XG5AQCAtMTQyMywxMCArMTU2MywxMSBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHR9XG4gXHRcdGNvbmRfcmVzY2hlZCgpO1xuIFxuLVx0XHRwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsIFx1MDAyNnBhZ2VfbWFzayk7XG4tXHRcdGlmICghcGFnZSB8fCBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkspIHtcbitcdFx0bnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsXG4rXHRcdFx0XHQgICAgICBndXBfZmxhZ3MsIHBhZ2VzID8gXHUwMDI2cGFnZXNbaV0gOiBOVUxMKTtcbitcdFx0aWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7XG4gXHRcdFx0cmV0ID0gZmF1bHRpbl9wYWdlKHZtYSwgc3RhcnQsIGd1cF9mbGFncyxcbi1cdFx0XHRcdFx0ICAgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LLCBsb2NrZWQpO1xuK1x0XHRcdFx0XHQgICBuciA9PSAtRU1MSU5LLCBsb2NrZWQpO1xuIFx0XHRcdHN3aXRjaCAocmV0KSB7XG4gXHRcdFx0Y2FzZSAwOlxuIFx0XHRcdFx0Z290byByZXRyeTtcbkBAIC0xNDQwLDcwICsxNTgxLDMwIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4gXHRcdFx0QlVHKCk7XG4tXHRcdH0gZWxzZSBpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUVYSVNUKSB7XG4rXHRcdH0gZWxzZSBpZiAobnIgPT0gLUVFWElTVCkge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZ1xuIFx0XHRcdCAqIHN0cnVjdCBwYWdlLiBJZiB0aGUgY2FsbGVyIGV4cGVjdHMgKipwYWdlcyB0byBiZVxuIFx0XHRcdCAqIGZpbGxlZCBpbiwgYmFpbCBvdXQgbm93LCBiZWNhdXNlIHRoYXQgY2FuJ3QgYmUgZG9uZVxuLVx0XHRcdCAqIGZvciB0aGlzIHBhZ2UuXG4rXHRcdFx0ICogZm9yIHRoaXMgcGFnZS4gT3RoZXJ3aXNlIGFkdmFuY2UgYnkgdGhlIG9uZSBwYWdlXG4rXHRcdFx0ICogZm9sbG93X3BhZ2VfbWFzaygpIGxvb2tlZCBhdC5cbiBcdFx0XHQgKi9cbiBcdFx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4rXHRcdFx0XHRyZXQgPSBucjtcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbi1cdFx0fSBlbHNlIGlmIChJU19FUlIocGFnZSkpIHtcbi1cdFx0XHRyZXQgPSBQVFJfRVJSKHBhZ2UpO1xuK1x0XHRcdG5yID0gMTtcbitcdFx0fSBlbHNlIGlmIChuciBcdTAwM2MgMCkge1xuK1x0XHRcdHJldCA9IG5yO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4tbmV4dF9wYWdlOlxuLVx0XHRwYWdlX2luY3JlbSA9IDEgKyAofihzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IHBhZ2VfbWFzayk7XG4tXHRcdGlmIChwYWdlX2luY3JlbSBcdTAwM2UgbnJfcGFnZXMpXG4tXHRcdFx0cGFnZV9pbmNyZW0gPSBucl9wYWdlcztcbi1cbi1cdFx0aWYgKHBhZ2VzKSB7XG4tXHRcdFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4tXHRcdFx0dW5zaWduZWQgaW50IGo7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBUaGlzIG11c3QgYmUgYSBsYXJnZSBmb2xpbyAoYW5kIGRvZXNuJ3QgbmVlZCB0b1xuLVx0XHRcdCAqIGJlIHRoZSB3aG9sZSBmb2xpbzsgaXQgY2FuIGJlIHBhcnQgb2YgaXQpLCBkb1xuLVx0XHRcdCAqIHRoZSByZWZjb3VudCB3b3JrIGZvciBhbGwgdGhlIHN1YnBhZ2VzIHRvby5cbi1cdFx0XHQgKlxuLVx0XHRcdCAqIE5PVEU6IGhlcmUgdGhlIHBhZ2UgbWF5IG5vdCBiZSB0aGUgaGVhZCBwYWdlXG4tXHRcdFx0ICogZS5nLiB3aGVuIHN0YXJ0IGFkZHIgaXMgbm90IHRocC1zaXplIGFsaWduZWQuXG4tXHRcdFx0ICogdHJ5X2dyYWJfZm9saW8oKSBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRhaWxcbi1cdFx0XHQgKiBwYWdlcy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocGFnZV9pbmNyZW0gXHUwMDNlIDEpIHtcbi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHRcdFx0Lypcbi1cdFx0XHRcdCAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGVcbi1cdFx0XHRcdCAqIGxhcmdlIGZvbGlvLCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLlxuLVx0XHRcdFx0ICovXG4tXHRcdFx0XHRpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSxcbi1cdFx0XHRcdFx0XHQgICBndXBfZmxhZ3MpKSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIFJlbGVhc2UgdGhlIDFzdCBwYWdlIHJlZiBpZiB0aGVcbi1cdFx0XHRcdFx0ICogZm9saW8gaXMgcHJvYmxlbWF0aWMsIGZhaWwgaGFyZC5cbi1cdFx0XHRcdFx0ICovXG4tXHRcdFx0XHRcdGd1cF9wdXRfZm9saW8oZm9saW8sIDEsIGd1cF9mbGFncyk7XG4tXHRcdFx0XHRcdHJldCA9IC1FRkFVTFQ7XG4tXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbi1cbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYWdlX2luY3JlbTsgaisrKSB7XG4tXHRcdFx0XHRzdWJwYWdlID0gcGFnZSArIGo7XG4tXHRcdFx0XHRwYWdlc1tpICsgal0gPSBzdWJwYWdlO1xuLVx0XHRcdFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgc3RhcnQgKyBqICogUEFHRV9TSVpFKTtcbi1cdFx0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xuLVx0XHRcdH1cbi1cdFx0fVxuK1x0XHQvKiBDaGVjayB0aGF0IHdlIGRpZG4ndCBwaW4gbW9yZSBwYWdlcyB0aGFuIHRoZSBjYWxsZXIgd2lsbCBmcmVlLiAqL1xuK1x0XHRWTV9XQVJOX09OX09OQ0UobnIgXHUwMDNlIG5yX3BhZ2VzKTtcbiBcbi1cdFx0aSArPSBwYWdlX2luY3JlbTtcbi1cdFx0c3RhcnQgKz0gcGFnZV9pbmNyZW0gKiBQQUdFX1NJWkU7XG4tXHRcdG5yX3BhZ2VzIC09IHBhZ2VfaW5jcmVtO1xuK1x0XHRpICs9IG5yO1xuK1x0XHRzdGFydCArPSBuciAqIFBBR0VfU0laRTtcbitcdFx0bnJfcGFnZXMgLT0gbnI7XG4gXHR9IHdoaWxlIChucl9wYWdlcyk7XG4gb3V0OlxuIFx0cmV0dXJuIGkgPyBpIDogcmV0O1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MTMuMTE2MjgzMDc2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzQ5ODY5MDA0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipHVVAgUmVmYWN0b3JpbmcgYW5kIEZ1enppbmcgQ29uc2lkZXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIlllcywgdGhpcyBwYXRjaCBzZXJpZXMgd2FycmFudHMgYSB0aG9yb3VnaCBsb29rIGZvciBmdXp6aW5nIHBvdGVudGlhbC5cIiBUaGlzIHBhdGNoIGlzIGNsZWFybHkgdG91Y2hpbmcgdGhlIEdVUCAoR2V0IFVzZXIgUGFnZXMpIGNvZGUsIHNwZWNpZmljYWxseSBgbW0vZ3VwLmNgLCBhbmQgdGhhdCdzIGEgcmVkIGZsYWcgaW4gYSBnb29kIHdheSwgbWVhbmluZyBpdOKAmXMgYSBoaWdoLWltcGFjdCBhcmVhLiBUaGlzIGlzbid0IHNvbWUgbWlub3IgdHdlYWs7IGl0J3MgYSBmdW5kYW1lbnRhbCByZWZhY3RvcmluZyBvZiBob3cgR1VQIHdvcmtzLiBUaGV5J3JlIGNoYW5naW5nIHRoZSByZXR1cm4gdmFsdWVzIGFuZCBwb3B1bGF0aW9uIG9mIHRoZSBgcGFnZXNgIGFycmF5LCB3aGljaCBpbiB0dXJuIG1lYW5zIHRoZSBjb3JlIGxvZ2ljIGZvciB0cmFuc2xhdGluZyB1c2VyIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHBoeXNpY2FsIHBhZ2VzIGlzIGJlaW5nIG1vZGlmaWVkLiBXZSBuZWVkIHRvIGFzc2VzcyB0aGUgZnV6emluZyBhdHRhY2sgc3VyZmFjZS5cblxuVGhleSdyZSB0YWtpbmcgYHN0cnVjdCBwYWdlICpgIGFuZCBgcGFnZV9tYXNrYCBhbmQgbW92aW5nIHRvIHJldHVybmluZyBhIGBsb25nYCB2YWx1ZSAoY291bnQgb2YgcGFnZXMgb3IgZXJyb3IpIGFuZCBkaXJlY3RseSBmaWxsaW5nIHRoZSBgcGFnZXNgIGFycmF5LiBBIHNlcmlvdXMgY2hhbmdlIHRvIGEgZnVuZGFtZW50YWwgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIGxpa2UgdGhpcyBkZW1hbmRzIHNjcnV0aW55LiBJdCdzIGEgZnVuZGFtZW50YWwgc2hpZnQgaW4gdGhlICp3YXkqIHdlIGdldCB1c2VyIHBhZ2VzLlxuXG5Mb29raW5nIGF0IHRoZSBjaGFuZ2VkIGZ1bmN0aW9ucy4uLiB5ZWFoLCB0aGlzIGlzIHNpZ25pZmljYW50OiBgbm9fcGFnZV90YWJsZWAsIGBndXBfZmlsbF9wYWdlc2AsIGBmb2xsb3dfaHVnZV9wdWRgLCBgZm9sbG93X2h1Z2VfcG1kYCwgdGhlIG5ldyBjb21taXQgZnVuY3Rpb25zLCBhbmQgb2YgY291cnNlLCB0aGUgbWFzayBmdW5jdGlvbnMuIFRoaXMgaXMgR1VQIGxvZ2ljLCB0b3VjaGluZyBzZXZlcmFsIGtleSBjb21wb25lbnRzIG9mIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQuXG5cblNvLCB0aGUgbmV4dCBzdGVwIGlzIHRvIG5haWwgZG93biB0aGUgbW9zdCBjcml0aWNhbCBmdW5jdGlvbnMgZm9yIGZ1enppbmcuIGBfX2dldF91c2VyX3BhZ2VzYCBtaWdodCBiZSB0b28gZ2VuZXJhbCwgYnV0IGBmb2xsb3dfcGFnZV9tYXNrYCwgYGZvbGxvd19wYWdlX3B0ZWAsIGBmb2xsb3dfcG1kX21hc2tgLCBgZm9sbG93X3B1ZF9tYXNrYCwgYW5kIGBmb2xsb3dfcDRkX21hc2tgIGFsbCBsb29rIGxpa2UgcHJpbWUgdGFyZ2V0cy4gVGhlIG1hc2sgZnVuY3Rpb25zIGFyZSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcgYmVjYXVzZSB0aGV5IGRlYWwgd2l0aCB2YXJpb3VzIHBhZ2UgdGFibGUgbGV2ZWxzLCBhbmQgc3VidGxlIGVycm9ycyBpbiB0aG9zZSBjYW4gbGVhZCB0byBzaWduaWZpY2FudCBpc3N1ZXMuXG5cbkZpbmFsbHksIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gU2luY2UgdGhlIHBhdGNoIGlzIGluIGBtbS9ndXAuY2AsIHRoZSBjb2RlIHdpbGwgYWx3YXlzIGJlIGNvbXBpbGVkLCBob3dldmVyIHNvbWUgcGFydHMgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgYENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU2AgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIHNob3VsZCBwdWxsIHVwIHRoZSB0cmVlIGFuZCBjaGVjay5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEwODksIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NzYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NToyMC42MTQ5NzYzMjlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU2MDk4MTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTYzNj1zdGF0aWMgdm9pZCBndXBfZmlsbF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0vZ3VwLmMtNjUyLVxcbm1tL2d1cC5jOjY1MzojaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxubW0vZ3VwLmMtNjU0LS8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQVURzIGluIENPVyBtYXBwaW5ncy4gKi9cXG4tLVxcbm1tL2d1cC5jPTcyMz1zdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy03NzItXFxubW0vZ3VwLmM6NzczOiNlbHNlICAvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi9cXG5tbS9ndXAuYy03NzQtc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vZ3VwLmM9NzgxPXN0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTc4Ni19XFxubW0vZ3VwLmM6Nzg3OiNlbmRpZlxcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xcbm1tL2d1cC5jLTc4OC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MjAuNjYwNTk5OTk1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUwMzU0MTgwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlcyoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW4uIEZpcnN0IG9yZGVyIG9mIGJ1c2luZXNzOiBJIG5lZWQgdG8gdmVyaWZ5IHRoZSBzdGF0dXMgb2YgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAuIFRoaXMgaXMgZnVuZGFtZW50YWwuIERlcGVuZGluZyBvbiB3aGV0aGVyIGl0J3MgZW5hYmxlZCBvciBub3QsIGl0IGRpY3RhdGVzIGEgaHVnZSBzd2F0aCBvZiB0aGUga2VybmVsJ3MgbWVtb3J5IG1hbmFnZW1lbnQgYmVoYXZpb3IsIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcywgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBzdWJzeXN0ZW1zLiBJIG5lZWQgdG8ga25vdyB3aGVyZSB3ZSBzdGFuZC4gQSBxdWljayBjaGVjayBvZiB0aGUgY29uZmlndXJhdGlvbiBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbCBiZWZvcmUgcHJvY2VlZGluZy4gQXJlIFRIUHMgZW5hYmxlZCBvciBpcyB0aGVyZSBzb21ldGhpbmcgZWxzZSBnb2luZyBvbj9cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzODgsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NToyNC4xNjQxNDM2NDJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ2MjYyMTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTcyMz1zdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy03NTktXFxubW0vZ3VwLmM6NzYwOiNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9ndXAuYy03NjEtXFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgRk9MTF9UT1VDSCkpXFxubW0vZ3VwLmMtNzYyLVxcdFxcdHRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgXFx1MDAyNiBGT0xMX1dSSVRFKTtcXG5tbS9ndXAuYzo3NjM6I2VuZGlmXFx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXFxubW0vZ3VwLmMtNzY0LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NToyNC4yMDg3NzgzMjhaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTM5MjY2MzQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV4YW1pbmluZyBIdWdlIFBhZ2UgQ29uZmlndXJhdGlvbiBmb3IgR1VQIFRlc3RpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjb25maWd1cmF0aW9ucyBhbmQgdGhpbmtpbmcsIFwiWWVwLCB0aGVzZSBhcmUgZGVmaW5pdGVseSB0aGUgcmlnaHQgc2V0dGluZ3MgdG8gaGF2ZSBlbmFibGVkIHdoZW4gdGVzdGluZyBodWdlIHBhZ2VzIGluIEdVUC5cIiBJdCdzIGdvb2QgdG8gYmUgbWV0aWN1bG91cyBhYm91dCB0aGlzIHN0dWZmLiAqVFJBTlNQQVJFTlRfSFVHRVBBR0UqIGlzIGEgZ2l2ZW47IHRoYXQncyB0aGUgYnJlYWQgYW5kIGJ1dHRlciBmb3IgdHJhbnNwYXJlbnQgaHVnZSBwYWdlIHN1cHBvcnQsIG5vIHN1cnByaXNlcyB0aGVyZS4gTm93LCAqUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMqIGlzIHRoZSBtb3JlIGludGVyZXN0aW5nIG9uZS4gVGhhdCdzIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQsIHNvIEkgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgY2FuIGVuYWJsZSB0aGlzIG9uZSBkaXJlY3RseSwgb3IgaWYgdGhlIGFyY2hpdGVjdHVyZSB3aWxsIHNlbGVjdCB0aGlzIGl0c2VsZi4gSSdtIGdvaW5nIHRvIGRpZyBhIGxpdHRsZSBkZWVwZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNzU1LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MjguNzQ4MDQ3MTE5WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2OTM2MDAyNzIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MTAwOD1jb25maWcgUEFHRV9NQVBDT1VOVFxcbi0tXFxubW0vS2NvbmZpZy0xMDEzLSNcXG5tbS9LY29uZmlnOjEwMTQ6Y29uZmlnIFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxubW0vS2NvbmZpZy0xMDE1LVxcdGRlZl9ib29sIFRSQU5TUEFSRU5UX0hVR0VQQUdFIHx8IEhVR0VUTEJfUEFHRVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTozMS40NDE2NTYzN1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MTk0MjQ0MDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgSHVnZSBQYWdlcyoqXG5cbk9rYXksIHNvIEkgc2VlIHRoYXQgYFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTYCBpcyBkZWZpbmVkIGFzIGVpdGhlciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIG9yIGBIVUdFVExCX1BBR0VgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGl0J3MgYSBsb2dpY2FsIGNvbm5lY3Rpb24uIENvbnNpZGVyaW5nIHRoaXMsIHRoZSBvYnZpb3VzIGFwcHJvYWNoIGlzIHRvIG1ha2Ugc3VyZSAqYm90aCogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYEhVR0VUTEJfUEFHRWAgYXJlIGVuYWJsZWQuIEl0J3MgdGhlIG1vc3Qgcm9idXN0IHNvbHV0aW9uLiBMZXQncyBkaWcgaW50byB0aGUgYEhVR0VUTEJfUEFHRWAgb3B0aW9uIGluIHRoZSBLY29uZmlnIGZpbGUgYW5kIHZlcmlmeSBpdHMgc3RhdHVzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3MgaW4gcGxhY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMDk4LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MzQuOTYxMDgzMzE2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODI3NDQ5NjYxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBIVUdFVExCX1BBR0VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9zaC9tbS9LY29uZmlnPTE1OD1jaG9pY2VcXG4tLVxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNjMtXFxuYXJjaC9zaC9tbS9LY29uZmlnOjE2NDpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRLXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2NS1cXHRib29sIFxcXCI2NGtCXFxcIlxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2Ny1cXG5hcmNoL3NoL21tL0tjb25maWc6MTY4OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8yNTZLXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2OS1cXHRib29sIFxcXCIyNTZrQlxcXCJcXG4tLVxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzEtXFxuYXJjaC9zaC9tbS9LY29uZmlnOjE3Mjpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfMU1CXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3My1cXHRib29sIFxcXCIxTUJcXFwiXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3NC1cXG5hcmNoL3NoL21tL0tjb25maWc6MTc1OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV80TUJcXG5hcmNoL3NoL21tL0tjb25maWctMTc2LVxcdGJvb2wgXFxcIjRNQlxcXCJcXG4tLVxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzgtXFxuYXJjaC9zaC9tbS9LY29uZmlnOjE3OTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRNQlxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xODAtXFx0Ym9vbCBcXFwiNjRNQlxcXCJcXG4tLVxcbmZzL0tjb25maWc9MjYyPWlmIEhVR0VUTEJGU1xcbmZzL0tjb25maWc6MjYzOmNvbmZpZyBIVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUF9ERUZBVUxUX09OXFxuZnMvS2NvbmZpZy0yNjQtXFx0Ym9vbCBcXFwiSHVnZVRMQiBWbWVtbWFwIE9wdGltaXphdGlvbiAoSFZPKSBkZWZhdWx0cyB0byBvblxcXCJcXG4tLVxcbmZzL0tjb25maWc9MjcxPWVuZGlmICMgSFVHRVRMQkZTXFxuZnMvS2NvbmZpZy0yNzItXFxuZnMvS2NvbmZpZzoyNzM6Y29uZmlnIEhVR0VUTEJfUEFHRVxcbmZzL0tjb25maWctMjc0LVxcdGRlZl9ib29sIEhVR0VUTEJGU1xcbi0tXFxuZnMvS2NvbmZpZy0yNzYtXFxuZnMvS2NvbmZpZzoyNzc6Y29uZmlnIEhVR0VUTEJfUEFHRV9PUFRJTUlaRV9WTUVNTUFQXFxuZnMvS2NvbmZpZy0yNzgtXFx0ZGVmX2Jvb2wgSFVHRVRMQl9QQUdFXFxuLS1cXG5tbS9LY29uZmlnPTcwNj1jb25maWcgQVJDSF9FTkFCTEVfVEhQX01JR1JBVElPTlxcbi0tXFxubW0vS2NvbmZpZy03MDgtXFxubW0vS2NvbmZpZzo3MDk6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFX1ZBUklBQkxFXFxubW0vS2NvbmZpZy03MTAtXFx0ZGVmX2Jvb2wgblxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTozNi43ODg1Mzk3MDdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzE3Nzk3NjM2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFbmFibGluZyBIdWdlIFBhZ2VzIGFuZCB0aGUgRmlsZXN5c3RlbSoqXG5cbk9rYXksIHNvIGBIVUdFVExCX1BBR0VgIGlzIGRlZmluZWQgYXMgYSBib29sZWFuIChgZGVmX2Jvb2xgKSBhbmQgbGlua2VkIGRpcmVjdGx5IHRvIGBIVUdFVExCRlNgLiBUaGlzIHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZDogSWYgd2Ugd2FudCB0byB1c2UgaHVnZSBwYWdlcywgd2UgZGVmaW5pdGVseSBuZWVkIHRoZSBodWdlIHBhZ2UgZmlsZXN5c3RlbSAoYEhVR0VUTEJGU2ApIGVuYWJsZWQuIEl0J3MgYSBkZXBlbmRlbmN5LiBNYWtlcyBzZW5zZS5cblxuTm93LCBsZXQncyBqdXN0IGNvbmZpcm0gc29tZXRoaW5nIGFib3V0IGhvdyB0cmFuc3BhcmVudCBodWdlIHBhZ2VzIGFyZSBoYW5kbGVkLiBMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIChgS2NvbmZpZ2ApIGFuZCBzZWUgaG93IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgc2V0IHVwIGluIHJlbGF0aW9uIHRvIGFsbCB0aGlzLiBJJ2xsIG5lZWQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBjb25zaXN0ZW50IGFuZCB0aGF0IHdlJ3JlIGNvdmVyaW5nIGFsbCBvdXIgYmFzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzOTMwLCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MzkuOTY2NTE4NzY5WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjIyMzQ4MzIyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTg0Mz1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODQ1LVxcbm1tL0tjb25maWc6ODQ2Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTg0Ny1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NjQ9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg2OS1cXG5tbS9LY29uZmlnOjg3MDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NzEtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzYtXFxubW0vS2NvbmZpZzo4Nzc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg3OC1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04ODUtXFxubW0vS2NvbmZpZzo4ODY6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04ODctXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg5Mz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTAyLVxcbm1tL0tjb25maWc6OTAzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05MDQtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkxMi1cXG5tbS9LY29uZmlnOjkxMzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkxNC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkyMC1cXG5tbS9LY29uZmlnOjkyMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTIyLVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MjgtXFxubW0vS2NvbmZpZzo5Mjk6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MzAtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05Mzg9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTk0Ny1cXG5tbS9LY29uZmlnOjk0ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTQ5LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTYtXFxubW0vS2NvbmZpZzo5NTc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NTgtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjQtXFxubW0vS2NvbmZpZzo5NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk2Ni1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTcyLVxcbm1tL0tjb25maWc6OTczOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTc0LVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6NDEuNTg4ODcxNTgxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwNTE3MDUyMTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBIYW5kbGluZyBmb3IgT3B0aW1pemF0aW9uKipcblxuT2theSwgc28gdGhlIGluaXRpYWwgdGhvdWdodCBpcyB0byBlbmFibGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYEhVR0VUTEJGU2AuIFRoYXQgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0J3MgZHJpbGwgZG93biBpbnRvIHRoZSBrZXJuZWwgZnVuY3Rpb25zIGludm9sdmVkIGluIGhhbmRsaW5nIHRoZXNlIHBhZ2VzLiBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhpcyBhcmVhIGZvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLlxuXG5NeSBpbml0aWFsIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBsb29rIGF0IHRoZSB2YXJpb3VzIGBmb2xsb3dfKmAgZnVuY3Rpb25zIGFuZCBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy5cblxuSG9sZCBvbiBhIG1vbWVudCwgYSBkZWVwZXIgbG9vayBhdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlcywgcmV2ZWFscyB0aGF0IGBmb2xsb3dfb25lX3B0ZWAsIGBmb2xsb3dfcHRlX2JhdGNoYCwgYGZvbGxvd19wYWdlX3B0ZV9jb21taXRgLCBgZ3VwX2ZpbGxfcGFnZXNgLCBhbmQgYG5vX3BhZ2VfdGFibGVgIGFyZSBhbGwgKnN0YXRpYyogZnVuY3Rpb25zLiBUaGF0IG1ha2VzIG1lIHdvbmRlciBpZiB0aGV5J3JlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyLiBMZXQncyBjaGVjay5cblxuSXQgbG9va3MgbGlrZSB0aGUgY29tcGlsZXIgaXNuJ3QgaW5saW5pbmcgdGhlbS4gVGhleSdyZSBhbGwgc3RhdGljLCBidXQgbm90IGlubGluZS4gTm93LCBJIHNlZSB0aGUgcHJvbXB0J3MgaW5zdHJ1Y3Rpb246IFwiUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLlwiIFRoaXMgbWVhbnMgdGhlIGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgKm5vbi1zdGF0aWMqIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlc2UgaW50ZXJuYWwgaGVscGVycy4gVGhpcyBpcyBhIGNydWNpYWwgZGlzdGluY3Rpb24uIFdlIHdhbnQgdGhlIHN0YWJsZSwgd2VsbC1kZWZpbmVkIGVudHJ5IHBvaW50cywgbm90IHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuXG5TaW5jZSBgX19nZXRfdXNlcl9wYWdlc2AgaXMgc3RhdGljLCBteSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB3aGF0IGNhbGxzIGl0LiBUaGF0J3MgdGhlIGNvcnJlY3QgcGF0aCB0byBmaW5kaW5nIGEgbm9uLXN0YXRpYyBBUEkgZW50cnkgcG9pbnQuIFRoaXMgaXMgdGhlIHBhdGggdG8gcHVyc3VlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDg2MSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTo0OC42NDA1ODA3MTJaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4MjAxOTg5MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX2dldF91c2VyX3BhZ2VzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTkyOT1zdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vZ3VwLmMtOTUzLSAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0XFxubW0vZ3VwLmM6OTU0OiAqIGlzIGEgc2hvcnQgcmVhZDsgX19nZXRfdXNlcl9wYWdlcygpIHJldHJ5aW5nIHRoZSByZWFkIHdpbGwgZ2V0IHRoZSBlcnJvci5cXG5tbS9ndXAuYy05NTUtICovXFxuLS1cXG5tbS9ndXAuYz0xNDAyPXN0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmd1cF92bWFfbG9va3VwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0vZ3VwLmMtMTQzNy0vKipcXG5tbS9ndXAuYzoxNDM4OiAqIF9fZ2V0X3VzZXJfcGFnZXMoKSAtIHBpbiB1c2VyIHBhZ2VzIGluIG1lbW9yeVxcbm1tL2d1cC5jLTE0MzktICogQG1tOlxcdFxcdG1tX3N0cnVjdCBvZiB0YXJnZXQgbW1cXG4tLVxcbm1tL2d1cC5jLTE0NjAtICpcXG5tbS9ndXAuYzoxNDYxOiAqIF9fZ2V0X3VzZXJfcGFnZXMgd2Fsa3MgYSBwcm9jZXNzJ3MgcGFnZSB0YWJsZXMgYW5kIHRha2VzIGEgcmVmZXJlbmNlIHRvXFxubW0vZ3VwLmMtMTQ2Mi0gKiBlYWNoIHN0cnVjdCBwYWdlIHRoYXQgZWFjaCB1c2VyIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gYXQgYSBnaXZlblxcbi0tXFxubW0vZ3VwLmMtMTQ2Ni0gKiBUaGlzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBwYWdlIGV4aXN0cyBpbiB0aGUgdXNlciBtYXBwaW5ncyB3aGVuXFxubW0vZ3VwLmM6MTQ2NzogKiBfX2dldF91c2VyX3BhZ2VzIHJldHVybnMsIGFuZCB0aGVyZSBtYXkgZXZlbiBiZSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50XFxubW0vZ3VwLmMtMTQ2OC0gKiBwYWdlIHRoZXJlIGluIHNvbWUgY2FzZXMgKGVnLiBpZiBtbWFwcGVkIHBhZ2VjYWNoZSBoYXMgYmVlbiBpbnZhbGlkYXRlZFxcbi0tXFxubW0vZ3VwLmMtMTQ4Ny0gKiBJbiBtb3N0IGNhc2VzLCBnZXRfdXNlcl9wYWdlcyBvciBnZXRfdXNlcl9wYWdlc19mYXN0IHNob3VsZCBiZSB1c2VkXFxubW0vZ3VwLmM6MTQ4ODogKiBpbnN0ZWFkIG9mIF9fZ2V0X3VzZXJfcGFnZXMuIF9fZ2V0X3VzZXJfcGFnZXMgc2hvdWxkIGJlIHVzZWQgb25seSBpZlxcbm1tL2d1cC5jLTE0ODktICogeW91IG5lZWQgc29tZSBzcGVjaWFsIEBndXBfZmxhZ3MuXFxubW0vZ3VwLmMtMTQ5MC0gKi9cXG5tbS9ndXAuYzoxNDkxOnN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0vZ3VwLmMtMTQ5Mi1cXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vZ3VwLmM9MTcyNj1zdGF0aWMgYm9vbCBndXBfc2lnbmFsX3BlbmRpbmcodW5zaWduZWQgaW50IGZsYWdzKVxcbi0tXFxubW0vZ3VwLmMtMTc0Ni0gKlxcbm1tL2d1cC5jOjE3NDc6ICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uLCB1bmxpa2UgX19nZXRfdXNlcl9wYWdlcygpLCB3aWxsIG5vdCByZXR1cm4gMFxcbm1tL2d1cC5jLTE3NDgtICogZm9yIG5yX3BhZ2VzIFxcdTAwM2UgMCwgdW5sZXNzIEZPTExfTk9XQUlUIGlzIHVzZWQuXFxubW0vZ3VwLmMtMTc0OS0gKi9cXG5tbS9ndXAuYzoxNzUwOnN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9ndXAuYy0xNzUxLVxcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuLS1cXG5tbS9ndXAuYy0xNzkyLVxcdGZvciAoOzspIHtcXG5tbS9ndXAuYzoxNzkzOlxcdFxcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZmxhZ3MsIHBhZ2VzLFxcbm1tL2d1cC5jLTE3OTQtXFx0XFx0XFx0XFx0ICAgICAgIGxvY2tlZCk7XFxuLS1cXG5tbS9ndXAuYy0xODUyLVxcdFxcdCpsb2NrZWQgPSAxO1xcbm1tL2d1cC5jOjE4NTM6XFx0XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIDEsIGZsYWdzIHwgRk9MTF9UUklFRCxcXG5tbS9ndXAuYy0xODU0LVxcdFxcdFxcdFxcdCAgICAgICBwYWdlcywgbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE5NjAtXFx0ICovXFxubW0vZ3VwLmM6MTk2MTpcXHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgbnJfcGFnZXMsIGd1cF9mbGFncyxcXG5tbS9ndXAuYy0xOTYyLVxcdFxcdFxcdCAgICAgICBOVUxMLCBsb2NrZWQgPyBsb2NrZWQgOiBcXHUwMDI2bG9jYWxfbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jLTE5NzktICogUmV0dXJucyBlaXRoZXIgbnVtYmVyIG9mIHByb2Nlc3NlZCBwYWdlcyBpbiB0aGUgTU0sIG9yIGEgbmVnYXRpdmUgZXJyb3JcXG5tbS9ndXAuYzoxOTgwOiAqIGNvZGUgb24gZXJyb3IgKHNlZSBfX2dldF91c2VyX3BhZ2VzKCkpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXBvcnRzXFxubW0vZ3VwLmMtMTk4MS0gKiBlcnJvcnMgcmVsYXRlZCB0byBWTUFzLCBzdWNoIGFzIGluY29tcGF0aWJsZSBtYXBwaW5ncywgYXMgZXhwZWN0ZWQgYnlcXG4tLVxcbm1tL2d1cC5jPTE5ODg9bG9uZyBmYXVsdGluX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuLS1cXG5tbS9ndXAuYy0yMDEyLVxcbm1tL2d1cC5jOjIwMTM6XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgTlVMTCwgbG9ja2VkLFxcbm1tL2d1cC5jLTIwMTQtXFx0XFx0XFx0XFx0ICAgICAgZ3VwX2ZsYWdzKTtcXG4tLVxcbm1tL2d1cC5jPTIwMjY9aW50IF9fbW1fcG9wdWxhdGUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sIGludCBpZ25vcmVfZXJyb3JzKVxcbi0tXFxubW0vZ3VwLmMtMjA3OS0jZWxzZSAvKiBDT05GSUdfTU1VICovXFxubW0vZ3VwLmM6MjA4MDpzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG5tbS9ndXAuYy0yMDgxLVxcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuLS1cXG5tbS9ndXAuYz0yMjg4PXN0cnVjdCBwYWdlICpnZXRfZHVtcF9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50ICpsb2NrZWQpXFxuLS1cXG5tbS9ndXAuYy0yMjkyLVxcbm1tL2d1cC5jOjIyOTM6XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoY3VycmVudC1cXHUwMDNlbW0sIGFkZHIsIDEsIFxcdTAwMjZwYWdlLCBsb2NrZWQsXFxubW0vZ3VwLmMtMjI5NC1cXHRcXHRcXHRcXHQgICAgICBGT0xMX0ZPUkNFIHwgRk9MTF9EVU1QIHwgRk9MTF9HRVQpO1xcbi0tXFxubW0vZ3VwLmM9MjQyMj1taWdyYXRlX2xvbmd0ZXJtX3VucGlubmFibGVfZm9saW9zKHN0cnVjdCBsaXN0X2hlYWQgKm1vdmFibGVfZm9saW9fbGlzdCxcXG4tLVxcbm1tL2d1cC5jLTI0NTAtXFx0XFx0ICogV2UgY2FuJ3QgbWlncmF0ZSBmb2xpb3Mgd2l0aCB1bmV4cGVjdGVkIHJlZmVyZW5jZXMsIHNvIGRyb3BcXG5tbS9ndXAuYzoyNDUxOlxcdFxcdCAqIHRoZSByZWZlcmVuY2Ugb2J0YWluZWQgYnkgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoKS5cXG5tbS9ndXAuYy0yNDUyLVxcdFxcdCAqIE1pZ3JhdGluZyBmb2xpb3MgaGF2ZSBiZWVuIGFkZGVkIHRvIG1vdmFibGVfZm9saW9fbGlzdCBhZnRlclxcbi0tXFxubW0vZ3VwLmM9MjU1NT1zdGF0aWMgbG9uZyBjaGVja19hbmRfbWlncmF0ZV9tb3ZhYmxlX2ZvbGlvcyh1bnNpZ25lZCBsb25nIG5yX2ZvbGlvcyxcXG4tLVxcbm1tL2d1cC5jLTI1NjItLypcXG5tbS9ndXAuYzoyNTYzOiAqIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZCgpIGlzIGEgd3JhcHBlciBmb3IgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQgd2hpY2hcXG5tbS9ndXAuYy0yNTY0LSAqIGFsbG93cyB1cyB0byBwcm9jZXNzIHRoZSBGT0xMX0xPTkdURVJNIGZsYWcuXFxuLS1cXG5tbS9ndXAuYz0yNTY2PXN0YXRpYyBsb25nIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2d1cC5jLTI1NzYtXFx0aWYgKCEoZ3VwX2ZsYWdzIFxcdTAwMjYgRk9MTF9MT05HVEVSTSkpXFxubW0vZ3VwLmM6MjU3NzpcXHRcXHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgcGFnZXMsXFxubW0vZ3VwLmMtMjU3OC1cXHRcXHRcXHRcXHRcXHQgICAgICAgbG9ja2VkLCBndXBfZmxhZ3MpO1xcbi0tXFxubW0vZ3VwLmMtMjU4MS1cXHRkbyB7XFxubW0vZ3VwLmM6MjU4MjpcXHRcXHRucl9waW5uZWRfcGFnZXMgPSBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChtbSwgc3RhcnQsIG5yX3BhZ2VzLFxcbm1tL2d1cC5jLTI1ODMtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBwYWdlcywgbG9ja2VkLFxcbi0tXFxubW0vZ3VwLmM9MjcwND1sb25nIGdldF91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2d1cC5jLTI3MTQtXFxubW0vZ3VwLmM6MjcxNTpcXHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgcGFnZXMsXFxubW0vZ3VwLmMtMjcxNi1cXHRcXHRcXHRcXHQgICAgICAgbG9ja2VkID8gbG9ja2VkIDogXFx1MDAyNmxvY2FsX2xvY2tlZCxcXG4tLVxcbm1tL2d1cC5jPTI3NDU9bG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vZ3VwLmMtMjc1Mi1cXG5tbS9ndXAuYzoyNzUzOlxcdHJldHVybiBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChjdXJyZW50LVxcdTAwM2VtbSwgc3RhcnQsIG5yX3BhZ2VzLCBwYWdlcyxcXG5tbS9ndXAuYy0yNzU0LVxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2bG9ja2VkLCBndXBfZmxhZ3MpO1xcbi0tXFxubW0vZ3VwLmM9Mjc3Mz1sb25nIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9ndXAuYy0yNzgxLVxcbm1tL2d1cC5jOjI3ODI6XFx0cmV0dXJuIF9fZ2V0X3VzZXJfcGFnZXNfbG9ja2VkKGN1cnJlbnQtXFx1MDAzZW1tLCBzdGFydCwgbnJfcGFnZXMsIHBhZ2VzLFxcbm1tL2d1cC5jLTI3ODMtXFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZsb2NrZWQsIGd1cF9mbGFncyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU1OjQ4LjkyMjYwNTgzM1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NzA3NjkzOTM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBVc2VyIFBhZ2UgRmF1bHRzKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGVzZSB1c2VyIHBhZ2UgZnVuY3Rpb25zLiBNeSBwcmltYXJ5IGVudHJ5IHBvaW50cyBoZXJlIHNlZW0gdG8gYmUgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgLCBhbmQgYGdldF9kdW1wX3BhZ2VgLiBJJ20gc3RhcnRpbmcgdG8gdGhpbmsgYGdldF91c2VyX3BhZ2VzYCBpcyBhICp2ZXJ5KiBob3QgcGF0aCDigJMgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhpdHRpbmcgdGhhdC4gTGV0IG1lIGxvb2sgYXQgc29tZSBvZiB0aGUgc3lzY2FsbHMgdG8gdW5kZXJzdGFuZCBob3cgdGhvc2UgcGF0aHMgYXJlIHRvdWNoZWQuXG5cbkFscmlnaHQsIGBtbWFwYCB3aXRoIGBNQVBfUE9QVUxBVEVgIHdpbGwgY2xlYXJseSBoaXQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYC4gYG1sb2NrYCB0cmlnZ2VycyBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgbWFrZXMgc2Vuc2UgZm9yIHByZXZlbnRpbmcgc3dhcHBpbmcuIFRoZW4sIGBtYWR2aXNlYCB3aXRoIGBNQURWX1BPUFVMQVRFX1JFQURgIG9yIGBNQURWX1BPUFVMQVRFX1dSSVRFYCAqYWxzbyogY2FsbHMgYGZhdWx0aW5fcGFnZV9yYW5nZWAuIFRoYXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kLCBhbmQgdGhhdCBoYXMgaW1wbGljYXRpb25zIGZvciB0aGUgYG1hZHZpc2VgIHNlbWFudGljcy4gYHByb2Nlc3Nfdm1fcmVhZHZgIGFuZCBgcHJvY2Vzc192bV93cml0ZXZgIHdpbGwgb2J2aW91c2x5IGludm9rZSBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCBvciBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYCwgYXMgZG9lcyBgcHRyYWNlYC5cblxuTm93LCBiZWZvcmUgSSBnbyBkZWVwZXIgaW50byB0aGUgYGdldF91c2VyX3BhZ2VzYCBmYW1pbHksIGxldCdzIHRha2UgYSBsb29rIGF0IGBwaW5fdXNlcl9wYWdlc2AgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIG1vcmUgY2xvc2VseS4gSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhpcyBsb2dpYyBwYXRoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg5MiwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTo1NC42MzAzMDI0MTJaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYwMjM4OTk0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInBpbl91c2VyX3BhZ2VzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTE0MD1pbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxcbi0tXFxubW0vZ3VwLmMtMTc5LSAqXFxubW0vZ3VwLmM6MTgwOiAqIFBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIHBpbl91c2VyX3BhZ2VzKigpIG11c3QgYmUgcmVsZWFzZWQgdmlhIGVpdGhlclxcbm1tL2d1cC5jOjE4MTogKiB1bnBpbl91c2VyX3BhZ2UoKSwgb3Igb25lIG9mIHRoZSB1bnBpbl91c2VyX3BhZ2VzKigpIHJvdXRpbmVzLiBUaGlzIGlzIHNvXFxubW0vZ3VwLmMtMTgyLSAqIHRoYXQgc3VjaCBwYWdlcyBjYW4gYmUgc2VwYXJhdGVseSB0cmFja2VkIGFuZCB1bmlxdWVseSBoYW5kbGVkLiBJblxcbi0tXFxubW0vZ3VwLmM9MjQ3PXN0YXRpYyBpbmxpbmUgc3RydWN0IGZvbGlvICpndXBfZm9saW9fbmV4dChzdHJ1Y3QgcGFnZSAqKmxpc3QsXFxuLS1cXG5tbS9ndXAuYy0yNjItLyoqXFxubW0vZ3VwLmM6MjYzOiAqIHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jaygpIC0gcmVsZWFzZSBhbmQgb3B0aW9uYWxseSBkaXJ0eSBndXAtcGlubmVkIHBhZ2VzXFxubW0vZ3VwLmMtMjY0LSAqIEBwYWdlczogIGFycmF5IG9mIHBhZ2VzIHRvIGJlIG1heWJlIG1hcmtlZCBkaXJ0eSwgYW5kIGRlZmluaXRlbHkgcmVsZWFzZWQuXFxuLS1cXG5tbS9ndXAuYy0yNzMtICogbGlzdGVkIGFzIGNsZWFuLiBJbiBhbnkgY2FzZSwgcmVsZWFzZXMgYWxsIHBhZ2VzIHVzaW5nIHVucGluX3VzZXJfcGFnZSgpLFxcbm1tL2d1cC5jOjI3NDogKiBwb3NzaWJseSB2aWEgdW5waW5fdXNlcl9wYWdlcygpLCBmb3IgdGhlIG5vbi1kaXJ0eSBjYXNlLlxcbm1tL2d1cC5jLTI3NS0gKlxcbi0tXFxubW0vZ3VwLmMtMjgzLSAqL1xcbm1tL2d1cC5jOjI4NDp2b2lkIHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jayhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nIG5wYWdlcyxcXG5tbS9ndXAuYy0yODUtXFx0XFx0XFx0XFx0IGJvb2wgbWFrZV9kaXJ0eSlcXG4tLVxcbm1tL2d1cC5jLTI5MS1cXHRpZiAoIW1ha2VfZGlydHkpIHtcXG5tbS9ndXAuYzoyOTI6XFx0XFx0dW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnBhZ2VzKTtcXG5tbS9ndXAuYy0yOTMtXFx0XFx0cmV0dXJuO1xcbi0tXFxubW0vZ3VwLmMtMzI2LX1cXG5tbS9ndXAuYzozMjc6RVhQT1JUX1NZTUJPTCh1bnBpbl91c2VyX3BhZ2VzX2RpcnR5X2xvY2spO1xcbm1tL2d1cC5jLTMyOC1cXG4tLVxcbm1tL2d1cC5jLTMzNy0gKiBcXFwiZ3VwLXBpbm5lZCBwYWdlIHJhbmdlXFxcIiByZWZlcnMgdG8gYSByYW5nZSBvZiBwYWdlcyB0aGF0IGhhcyBoYWQgb25lIG9mIHRoZVxcbm1tL2d1cC5jOjMzODogKiBwaW5fdXNlcl9wYWdlcygpIHZhcmlhbnRzIGNhbGxlZCBvbiB0aGF0IHBhZ2UuXFxubW0vZ3VwLmMtMzM5LSAqXFxuLS1cXG5tbS9ndXAuYz0zNzM9RVhQT1JUX1NZTUJPTCh1bnBpbl91c2VyX3BhZ2VfcmFuZ2VfZGlydHlfbG9jayk7XFxubW0vZ3VwLmMtMzc0LVxcbm1tL2d1cC5jOjM3NTpzdGF0aWMgdm9pZCBndXBfZmFzdF91bnBpbl91c2VyX3BhZ2VzKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKVxcbm1tL2d1cC5jLTM3Ni17XFxuLS1cXG5tbS9ndXAuYy0zOTItLyoqXFxubW0vZ3VwLmM6MzkzOiAqIHVucGluX3VzZXJfcGFnZXMoKSAtIHJlbGVhc2UgYW4gYXJyYXkgb2YgZ3VwLXBpbm5lZCBwYWdlcy5cXG5tbS9ndXAuYy0zOTQtICogQHBhZ2VzOiAgYXJyYXkgb2YgcGFnZXMgdG8gYmUgbWFya2VkIGRpcnR5IGFuZCByZWxlYXNlZC5cXG4tLVxcbm1tL2d1cC5jLTQwMC0gKi9cXG5tbS9ndXAuYzo0MDE6dm9pZCB1bnBpbl91c2VyX3BhZ2VzKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKVxcbm1tL2d1cC5jLTQwMi17XFxuLS1cXG5tbS9ndXAuYy00MjQtfVxcbm1tL2d1cC5jOjQyNTpFWFBPUlRfU1lNQk9MKHVucGluX3VzZXJfcGFnZXMpO1xcbm1tL2d1cC5jLTQyNi1cXG4tLVxcbm1tL2d1cC5jPTQ3OT1zdGF0aWMgaW5saW5lIHZvaWQgbW1fc2V0X2hhc19waW5uZWRfZmxhZyhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4tLVxcbm1tL2d1cC5jLTQ5OC0gKiBzYW1lIHRpbWUuIChUaGF0J3MgdHJ1ZSB0aHJvdWdob3V0IHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmRcXG5tbS9ndXAuYzo0OTk6ICogcGluX3VzZXJfcGFnZXMqKCkgQVBJcy4pIENhc2VzOlxcbm1tL2d1cC5jLTUwMC0gKlxcbi0tXFxubW0vZ3VwLmM9ODM0PXN0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy04NDgtXFx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXFxubW0vZ3VwLmM6ODQ5OlxcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbm1tL2d1cC5jLTg1MC1cXHQgKi9cXG4tLVxcbm1tL2d1cC5jPTIzMzA9c3RhdGljIHZvaWQgcG9mc191bnBpbihzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKVxcbi0tXFxubW0vZ3VwLmMtMjMzNC1cXHRlbHNlXFxubW0vZ3VwLmM6MjMzNTpcXHRcXHR1bnBpbl91c2VyX3BhZ2VzKHBvZnMtXFx1MDAzZXBhZ2VzLCBwb2ZzLVxcdTAwM2Vucl9lbnRyaWVzKTtcXG5tbS9ndXAuYy0yMzM2LX1cXG4tLVxcbm1tL2d1cC5jPTI5MzA9c3RhdGljIGludCBndXBfZmFzdF9wdGVfcmFuZ2UocG1kX3QgcG1kLCBwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vZ3VwLmMtMjk4Ny1cXHRcXHQgKiBnb2luZyB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZVxcbm1tL2d1cC5jOjI5ODg6XFx0XFx0ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvclxcbm1tL2d1cC5jLTI5ODktXFx0XFx0ICogZGV0YWlscy5cXG4tLVxcbm1tL2d1cC5jPTMyMzA9c3RhdGljIHVuc2lnbmVkIGxvbmcgZ3VwX2Zhc3QodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXFxuLS1cXG5tbS9ndXAuYy0zMjY2LVxcdFxcdGlmIChyZWFkX3NlcWNvdW50X3JldHJ5KFxcdTAwMjZjdXJyZW50LVxcdTAwM2VtbS1cXHUwMDNld3JpdGVfcHJvdGVjdF9zZXEsIHNlcSkpIHtcXG5tbS9ndXAuYzozMjY3OlxcdFxcdFxcdGd1cF9mYXN0X3VucGluX3VzZXJfcGFnZXMocGFnZXMsIG5yX3Bpbm5lZCk7XFxubW0vZ3VwLmMtMzI2OC1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tLVxcbm1tL2d1cC5jPTMzOTA9RVhQT1JUX1NZTUJPTF9HUEwoZ2V0X3VzZXJfcGFnZXNfZmFzdCk7XFxuLS1cXG5tbS9ndXAuYy0zMzkyLS8qKlxcbm1tL2d1cC5jOjMzOTM6ICogcGluX3VzZXJfcGFnZXNfZmFzdCgpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5IHdpdGhvdXQgdGFraW5nIGxvY2tzXFxubW0vZ3VwLmMtMzM5NC0gKlxcbi0tXFxubW0vZ3VwLmMtMzQwNS0gKiBGT0xMX1BJTiBtZWFucyB0aGF0IHRoZSBwYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHZpYSB1bnBpbl91c2VyX3BhZ2UoKS4gUGxlYXNlXFxubW0vZ3VwLmM6MzQwNjogKiBzZWUgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QgZm9yIGZ1cnRoZXIgZGV0YWlscy5cXG5tbS9ndXAuYy0zNDA3LSAqXFxuLS1cXG5tbS9ndXAuYy0zNDEwLSAqL1xcbm1tL2d1cC5jOjM0MTE6aW50IHBpbl91c2VyX3BhZ2VzX2Zhc3QodW5zaWduZWQgbG9uZyBzdGFydCwgaW50IG5yX3BhZ2VzLFxcbm1tL2d1cC5jLTM0MTItXFx0XFx0XFx0dW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4tLVxcbm1tL2d1cC5jLTM0MTctfVxcbm1tL2d1cC5jOjM0MTg6RVhQT1JUX1NZTUJPTF9HUEwocGluX3VzZXJfcGFnZXNfZmFzdCk7XFxubW0vZ3VwLmMtMzQxOS1cXG5tbS9ndXAuYy0zNDIwLS8qKlxcbm1tL2d1cC5jOjM0MjE6ICogcGluX3VzZXJfcGFnZXNfcmVtb3RlKCkgLSBwaW4gcGFnZXMgb2YgYSByZW1vdGUgcHJvY2Vzc1xcbm1tL2d1cC5jLTM0MjItICpcXG4tLVxcbm1tL2d1cC5jLTM0MzctICogRk9MTF9QSU4gbWVhbnMgdGhhdCB0aGUgcGFnZXMgbXVzdCBiZSByZWxlYXNlZCB2aWEgdW5waW5fdXNlcl9wYWdlKCkuIFBsZWFzZVxcbm1tL2d1cC5jOjM0Mzg6ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbm1tL2d1cC5jLTM0MzktICpcXG4tLVxcbm1tL2d1cC5jLTM0NDItICovXFxubW0vZ3VwLmM6MzQ0Mzpsb25nIHBpbl91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9ndXAuYy0zNDQ0LVxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9ndXAuYy0zNDU2LX1cXG5tbS9ndXAuYzozNDU3OkVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXNfcmVtb3RlKTtcXG5tbS9ndXAuYy0zNDU4LVxcbm1tL2d1cC5jLTM0NTktLyoqXFxubW0vZ3VwLmM6MzQ2MDogKiBwaW5fdXNlcl9wYWdlcygpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5IGZvciB1c2UgYnkgb3RoZXIgZGV2aWNlc1xcbm1tL2d1cC5jLTM0NjEtICpcXG4tLVxcbm1tL2d1cC5jLTM0NzEtICogRk9MTF9QSU4gbWVhbnMgdGhhdCB0aGUgcGFnZXMgbXVzdCBiZSByZWxlYXNlZCB2aWEgdW5waW5fdXNlcl9wYWdlKCkuIFBsZWFzZVxcbm1tL2d1cC5jOjM0NzI6ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbm1tL2d1cC5jLTM0NzMtICpcXG4tLVxcbm1tL2d1cC5jLTM0NzYtICovXFxubW0vZ3VwLmM6MzQ3Nzpsb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxubW0vZ3VwLmMtMzQ3OC1cXHRcXHQgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4tLVxcbm1tL2d1cC5jLTM0ODYtfVxcbm1tL2d1cC5jOjM0ODc6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlcyk7XFxubW0vZ3VwLmMtMzQ4OC1cXG5tbS9ndXAuYy0zNDg5LS8qXFxubW0vZ3VwLmM6MzQ5MDogKiBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCgpIGlzIHRoZSBGT0xMX1BJTiB2YXJpYW50IG9mXFxubW0vZ3VwLmMtMzQ5MS0gKiBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCgpLiBCZWhhdmlvciBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhpcyBvbmUgc2V0c1xcbi0tXFxubW0vZ3VwLmMtMzQ5Ni0gKi9cXG5tbS9ndXAuYzozNDk3OmxvbmcgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG5tbS9ndXAuYy0zNDk4LVxcdFxcdFxcdCAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL2d1cC5jLTM1MDgtfVxcbm1tL2d1cC5jOjM1MDk6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlc191bmxvY2tlZCk7XFxubW0vZ3VwLmMtMzUxMC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6NTQuNjkwNTQ1Njg2WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc0NDY2OTM2MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEFQSSBFbnRyeSBQb2ludHMgZm9yIGEgQ29kZSBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzIGFuZCBuZWVkIHRvIGlkZW50aWZ5IHRoZSByZWxldmFudCBBUEkgZW50cnkgcG9pbnRzIGFmZmVjdGVkIGJ5IHRoaXMgbG9naWMuIEkgc2VlIHdlIGhhdmU6IGBnZXRfdXNlcl9wYWdlc2AsIGBnZXRfdXNlcl9wYWdlc19yZW1vdGVgLCBgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgcGluX3VzZXJfcGFnZXNgLCBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYCwgYHBpbl91c2VyX3BhZ2VzX3VubG9ja2VkYCwgYGZhdWx0aW5fcGFnZV9yYW5nZWAsIGFuZCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgLiBSaWdodCwgYW5kIEkgc2hvdWxkIG5vdGUgdGhhdCBgZ2V0X3VzZXJfcGFnZXNfZmFzdGAgYW5kIGBwaW5fdXNlcl9wYWdlc19mYXN0YCBoYXZlIHRoYXQgbG9ja2xlc3MgYGd1cF9mYXN0YCBwYXRoLCBidXQgdWx0aW1hdGVseSBmYWxsIGJhY2sgdG8gYF9fZ2V0X3VzZXJfcGFnZXNgIGlmIG5lZWRlZCwgc28gdGhleSdyZSByZWxldmFudCwgdG9vLCB0aG91Z2ggbm90IHRoZSBwcmltYXJ5IHRhcmdldC4gVGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gYGZvbGxvd19wYWdlX21hc2tgIGFuZCBgX19nZXRfdXNlcl9wYWdlc2AsIHdoaWNoIEkgcmVjb2duaXplIGFzIHRoZSBzbG93ZXIgZmFsbGJhY2sgcGF0aHMuXG5cbkkgbmVlZCB0byBmb2N1cyBvbiB0aGUgZXh0ZXJuYWwsIG5vbi1zdGF0aWMgZW50cnkgcG9pbnRzLCBzaW5jZSB0aGF0J3Mgd2hhdCB0aGUgcHJvbXB0IGlzIGVtcGhhc2l6aW5nOiBcIlByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucy5cIiBTbywgYGdldF91c2VyX3BhZ2VzYCBpcyBxdWl0ZSBnZW5lcmljLCBhbmQgaGVhdmlseSB1c2VkLiBIb3dldmVyLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCBhbmQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBhcmUgYWxzbyBwb3NzaWJpbGl0aWVzLiBBY3R1YWxseSwgYGZvbGxvd19wYWdlX21hc2tgICppcyogc3RhdGljLCBidXQgaXQncyB0aGUgY2VudHJhbCBmdW5jdGlvbiBiZWluZyBtb2RpZmllZC4gU28gaXQgc2VlbXMgdGhlIGJlc3QgbGlzdCBvZiBwb3RlbnRpYWwgdGFyZ2V0cyBpbmNsdWRlczogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIE5vdyBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgYXJlIGluZGVlZCBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA5NDMsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MDIuMTM3MjQ0MDM2WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjM0MTAzNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vZ3VwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vZ3VwLmM9MTkxND1sb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vZ3VwLmMtMTk2Ny0vKlxcbm1tL2d1cC5jOjE5Njg6ICogZmF1bHRpbl9wYWdlX3JhbmdlKCkgLSBwb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2UgdGFibGVzIGluc2lkZSB0aGVcXG5tbS9ndXAuYy0xOTY5LSAqXFx0XFx0XFx0ICBnaXZlbiByYW5nZSByZWFkYWJsZS93cml0YWJsZVxcbi0tXFxubW0vZ3VwLmMtMTk4Ny0gKi9cXG5tbS9ndXAuYzoxOTg4OmxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2d1cC5jLTE5ODktXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgd3JpdGUsIGludCAqbG9ja2VkKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NjowMi4xOTM1ODk5ODFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDcxMTI2Mzk1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6aW5nIHRoZW0gZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipBbmFseXppbmcgUGFnZSBGYXVsdCBIYW5kbGluZyoqXG5cbkFscmlnaHQsIHNvIGBmYXVsdGluX3BhZ2VfcmFuZ2VgIGlzIGRlZmluaXRlbHkgbm9uLXN0YXRpYywgZ29vZC4gQW5kLCBzaW1pbGFybHksIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgaXNuJ3Qgc3RhdGljIGVpdGhlci4gVGhhdCdzIHdoYXQgSSBleHBlY3RlZCBiYXNlZCBvbiB0aGUgYnJvYWRlciBkZXNpZ24uIE5vdywgSSBzaG91bGQgc2hpZnQgbXkgZm9jdXMgdG8gZXhhbWluaW5nIGBmYXVsdGluX3ZtYV9wYWdlX3JhbmdlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb25zIHdlJ3ZlIGlkZW50aWZpZWQgYXMgbm9uLXN0YXRpYywgdG8gY29udGludWUgZGV2ZWxvcGluZyB0aGUgc3lzdGVtIGVmZmljaWVudGx5LiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyB0aGUgdmFyaWFibGVzIGludGVyYWN0IGFuZCB3aGV0aGVyIHRoZXkgd2lsbCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLiBUaGlzIGlzIGxpa2VseSB0aGUgbmV4dCBwaWVjZSBvZiB0aGUgcHV6emxlIHRvIHVuZGVyc3RhbmQgZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMDE2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MDYuOTA0ODU3NDc0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTAzOTUwMywiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZmF1bHRpbl92bWFfcGFnZV9yYW5nZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9ndXAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MDYuOTczOTAzNDM3WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4MTA1OTk3MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIEZ1bmN0aW9uKipcblxuT2theSwgc28gYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBpc24ndCBzdGF0aWMuIFRoYXQgaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZyBmb3IgbWUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgaW1wbGljYXRpb25zIG9mIHRoaXMgbm9uLXN0YXRpYyBkZWNsYXJhdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gTGV0J3MgZGlnIGludG8gdGhlIGNvZGViYXNlIGFuZCBmaW5kIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIHNpdGVzIGlzIGNydWNpYWwgdG8gZ3Jhc3BpbmcgaXRzIGludGVuZGVkIGJlaGF2aW9yIGFuZCBwb3RlbnRpYWwgc2lkZSBlZmZlY3RzIHdpdGhpbiB0aGUgbGFyZ2VyIHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQgZnJhbWV3b3JrLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMjc2LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MTAuNzg0NTA1MzI0WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTgzNzk2NzE0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJEb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9NDc2PXRoZSBtbWFwKCkgaGFuZGxlciBhbmQgdGFzayBhZGRyZXNzIHNwYWNlIGV4cGFuc2lvbiBmdW5jdGlvbnMgY2FsbFxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDo0Nzc6cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSBzcGVjaWZ5aW5nIHRoZSB2bWEgYW5kIHRoZSBhZGRyZXNzIHJhbmdlIHRvIG1sb2NrLlxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdC00NzgtXFxuLS1cXG5tbS9ndXAuYz0xNzUwPXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2d1cC5jLTE4OTQtLyoqXFxubW0vZ3VwLmM6MTg5NTogKiBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpIC0gIHBvcHVsYXRlIGEgcmFuZ2Ugb2YgcGFnZXMgaW4gdGhlIHZtYS5cXG5tbS9ndXAuYy0xODk2LSAqIEB2bWE6ICAgdGFyZ2V0IHZtYVxcbi0tXFxubW0vZ3VwLmMtMTkxMy0gKi9cXG5tbS9ndXAuYzoxOTE0OmxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vZ3VwLmMtMTkxNS1cXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50ICpsb2NrZWQpXFxuLS1cXG5tbS9ndXAuYz0yMDI2PWludCBfX21tX3BvcHVsYXRlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgaWdub3JlX2Vycm9ycylcXG4tLVxcbm1tL2d1cC5jLTIwNTktXFx0XFx0LypcXG5tbS9ndXAuYzoyMDYwOlxcdFxcdCAqIE5vdyBmYXVsdCBpbiBhIHJhbmdlIG9mIHBhZ2VzLiBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpXFxubW0vZ3VwLmMtMjA2MS1cXHRcXHQgKiBkb3VibGUgY2hlY2tzIHRoZSB2bWEgZmxhZ3MsIHNvIHRoYXQgaXQgd29uJ3QgbWxvY2sgcGFnZXNcXG4tLVxcbm1tL2d1cC5jLTIwNjMtXFx0XFx0ICovXFxubW0vZ3VwLmM6MjA2NDpcXHRcXHRyZXQgPSBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSh2bWEsIG5zdGFydCwgbmVuZCwgXFx1MDAyNmxvY2tlZCk7XFxubW0vZ3VwLmMtMjA2NS1cXHRcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbi0tXFxubW0vaW50ZXJuYWwuaD0xMTE5PXZvaWQgdW5tYXBfbWFwcGluZ19mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG5tbS9pbnRlcm5hbC5oOjExMjA6ZXh0ZXJuIGxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vaW50ZXJuYWwuaC0xMTIxLVxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgKmxvY2tlZCk7XFxuLS1cXG5tbS9tbG9jay5jPTQ2Nz1zdGF0aWMgaW50IG1sb2NrX2ZpeHVwKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9tbG9jay5jLTUwNC1cXHQgKiBJdCdzIG9rYXkgaWYgdHJ5X3RvX3VubWFwX29uZSB1bm1hcHMgYSBwYWdlIGp1c3QgYWZ0ZXIgd2VcXG5tbS9tbG9jay5jOjUwNTpcXHQgKiBzZXQgVk1fTE9DS0VELCBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSB3aWxsIGJyaW5nIGl0IGJhY2suXFxubW0vbWxvY2suYy01MDYtXFx0ICovXFxuLS1cXG5tbS9tbWFwLmM9OTYxPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF9leHRlbmRfdm1hX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxcbi0tXFxubW0vbW1hcC5jLTk3My1cXHRpZiAocHJldi1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9MT0NLRUQpXFxubW0vbW1hcC5jOjk3NDpcXHRcXHRwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShwcmV2LCBhZGRyLCBwcmV2LVxcdTAwM2V2bV9lbmQsIE5VTEwpO1xcbm1tL21tYXAuYy05NzUtXFx0cmV0dXJuIHByZXY7XFxuLS1cXG5tbS9tbWFwLmM9OTgzPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF9leHRlbmRfdm1hX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxcbi0tXFxubW0vbW1hcC5jLTk5Ny1cXHRpZiAodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0xPQ0tFRClcXG5tbS9tbWFwLmM6OTk4OlxcdFxcdHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHZtYSwgYWRkciwgc3RhcnQsIE5VTEwpO1xcbm1tL21tYXAuYy05OTktXFx0cmV0dXJuIHZtYTtcXG4tLVxcbm1tL21wcm90ZWN0LmM9NzI1PW1wcm90ZWN0X2ZpeHVwKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IG1tdV9nYXRoZXIgKnRsYixcXG4tLVxcbm1tL21wcm90ZWN0LmMtODE5LVxcdCAgICAhdm1hX2ZsYWdzX3Rlc3RfYW55KFxcdTAwMjZvbGRfdm1hX2ZsYWdzLCBWTUFfV1JJVEVfQklULCBWTUFfU0hBUkVEX0JJVCkpXFxubW0vbXByb3RlY3QuYzo4MjA6XFx0XFx0cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uodm1hLCBzdGFydCwgZW5kLCBOVUxMKTtcXG5tbS9tcHJvdGVjdC5jLTgyMS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MTIuOTY4MzA4NjQ4WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMjMyMTI4MjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzaXR1YXRpb24sIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqTWVtb3J5IFBvcHVsYXRpb24gU3RyYXRlZ2llcyBhbmQgVGhlaXIgRHJpdmVycyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBtZW1vcnkgaXMgcG9wdWxhdGVkIHdpdGhpbiB0aGUgdmlydHVhbCBtZW1vcnkgYXJlYSAoVk1BKSBtYW5hZ2VtZW50IGNvZGUuIEl0IGxvb2tzIGxpa2UgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBpcyBhIGtleSBmdW5jdGlvbi4gSSBzZWUgdGhhdCBpdCdzIHRoZSB3b3JraG9yc2UgY2FsbGVkIGJ5IHNldmVyYWwgaW1wb3J0YW50IGZ1bmN0aW9uczogYF9fbW1fcG9wdWxhdGVgLCB3aGljaCBpcyB0aGUgY29yZSBoYW5kbGVyIGZvciB0aGUgYE1BUF9QT1BVTEFURWAgZmxhZyBkdXJpbmcgYG1tYXBgIGNhbGxzIGFuZCBgbWxvY2tgIG9wZXJhdGlvbnMgKHRoYXQncyBjcnVjaWFsIGZvciBwaW5uaW5nIG1lbW9yeSksIGFuZCB0aGVuIGFsc28gYG1wcm90ZWN0X2ZpeHVwYCB3aGljaCBpcyB1c2VkIGR1cmluZyBwYWdlIHByb3RlY3Rpb24gYWRqdXN0bWVudHMuIEl0J3MgYWxzbyBjYWxsZWQgYnkgYGZpbmRfZXh0ZW5kX3ZtYV9sb2NrZWRgLCB3aGljaCBoYXMgdG8gZG8gd2l0aCBWTUEgZXhwYW5zaW9uIGFuZCBtZXJnaW5nLiBJbnRlcmVzdGluZy4gU28sIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgc2VlbXMgdG8gYmUgdGhlIGZ1bmN0aW9uIGhhbmRsaW5nIHRoZSAqZWFnZXIqIHBvcHVsYXRpb24gb2YgcGFnZXMuXG5cbk9uIHRoZSBvdGhlciBoYW5kLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCBpcyB1c2VkIGluIGEgbW9yZSByZWFjdGl2ZSBjb250ZXh0LiBJdCdzIGludm9rZWQgYnkgYG1hZHZpc2VgIHNwZWNpZmljYWxseSB3aGVuIHVzaW5nIHRoZSBgTUFEVl9QT1BVTEFURV9SRUFEYCBhbmQgYE1BRFZfUE9QVUxBVEVfV1JJVEVgIGZsYWdzLiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdpbmcgc3RyYXRlZ3ksIGJ1dCB3aXRoIGEgaGludCB0byBwcmUtZmF1bHQgcGFnZXMuIEl0J3MgYSBuaWNlIGRpc3RpbmN0aW9uLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGRlYWxzIHdpdGggdXBmcm9udCwgZWFnZXIgcG9wdWxhdGlvbiB3aGlsZSBgZmF1bHRpbl9wYWdlX3JhbmdlYCBkZWFscyB3aXRoIGhpbnQtZHJpdmVuIGZhdWx0aW5nLiBJIGNhbiBzZWUgdGhlIHBvdGVudGlhbCBmb3Igc29tZSBpbnRlcmVzdGluZyBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIGhvdyB0aGVzZSBhcmUgdXNlZCBpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEknbGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNvbnRleHRzIGFuZCB1c2FnZSBwYXR0ZXJucyB0byB1bmRlcnN0YW5kIHRoZSB0cmFkZS1vZmZzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzUwMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU2OjE3Ljk5MTUyMzkwOFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE1NDE0NTI2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE5NjctLypcXG5tbS9ndXAuYzoxOTY4OiAqIGZhdWx0aW5fcGFnZV9yYW5nZSgpIC0gcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdlIHRhYmxlcyBpbnNpZGUgdGhlXFxubW0vZ3VwLmMtMTk2OS0gKlxcdFxcdFxcdCAgZ2l2ZW4gcmFuZ2UgcmVhZGFibGUvd3JpdGFibGVcXG4tLVxcbm1tL2d1cC5jLTE5ODctICovXFxubW0vZ3VwLmM6MTk4ODpsb25nIGZhdWx0aW5fcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG5tbS9ndXAuYy0xOTg5LVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kLCBib29sIHdyaXRlLCBpbnQgKmxvY2tlZClcXG4tLVxcbm1tL2ludGVybmFsLmg9MTEyMD1leHRlcm4gbG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9pbnRlcm5hbC5oLTExMjEtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIGludCAqbG9ja2VkKTtcXG5tbS9pbnRlcm5hbC5oOjExMjI6ZXh0ZXJuIGxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2ludGVybmFsLmgtMTEyMy1cXHRcXHR1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCB3cml0ZSwgaW50ICpsb2NrZWQpO1xcbi0tXFxubW0vbWFkdmlzZS5jPTk1Nz1zdGF0aWMgbG9uZyBtYWR2aXNlX3BvcHVsYXRlKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxcbi0tXFxubW0vbWFkdmlzZS5jLTk2Ny1cXHRcXHQvKiBQb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2UgdGFibGVzIHJlYWRhYmxlL3dyaXRhYmxlLiAqL1xcbm1tL21hZHZpc2UuYzo5Njg6XFx0XFx0cGFnZXMgPSBmYXVsdGluX3BhZ2VfcmFuZ2UobW0sIHN0YXJ0LCBlbmQsIHdyaXRlLCBcXHUwMDI2bG9ja2VkKTtcXG5tbS9tYWR2aXNlLmMtOTY5LVxcdFxcdGlmICghbG9ja2VkKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU2OjIwLjE0NTY3ODEyNloiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODEwNzE3OTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqUG90ZW50aWFsIFBhZ2UtRmF1bHQgSGFuZGxlcnMgYW5kIFBhZ2UgUGlubmluZyBGdW5jdGlvbnMqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgcG90ZW50aWFsIHN0YXJ0aW5nIHBvaW50cyBmb3IgdGhpcywgYW5kIHR3byBuYW1lcyBpbW1lZGlhdGVseSBqdW1wIG91dDogYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgc2VlbSBsaWtlIHRoZXknZCBiZSBkaXJlY3RseSBpbnZvbHZlZCBpbiB0aGUgcHJvY2VzcyBvZiBkZWFsaW5nIHdpdGggcGFnZSBmYXVsdHMgYW5kIHBvcHVsYXRpbmcgbWVtb3J5LiBQcm9taXNpbmcuXG5cbkJleW9uZCB0aG9zZSwgSSd2ZSBnb3QgYSBtZW50YWwgbm90ZSB0byBjaGVjayBvdXQgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGFuZCBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYC4gVGhleSdyZSByZWxhdGVkIHRvIHVzZXItc3BhY2UgcGFnZSBhY2Nlc3MgYW5kIHBpbm5pbmcsIHdoaWNoIHNlZW1zIHJlbGV2YW50LiBHaXZlbiB0aGVpciBmdW5jdGlvbnMsIHRoZXkgbGlrZWx5IGFjdCB1cG9uIHNvbWUgb2YgdGhlIGZ1bmRhbWVudGFscyBvZiBhIHBhZ2UgdGFibGUuXG5cbk5vdywgYmVmb3JlIEkgZGlnIGFueSBkZWVwZXIsIEkgc2hvdWxkIGFsc28gdGFrZSBhIGxvb2sgYXQgYGdldF91c2VyX3BhZ2VzX3VubG9ja2VkYC4gSXTigJlzIHByb2JhYmx5IHdvcnRoIGludmVzdGlnYXRpbmcgdGhhdCBmdW5jdGlvbiBpbiBwYXJ0aWN1bGFyLCBzaW5jZSB0aGUgJ3VubG9ja2VkJyB2YXJpYW50IG1pZ2h0IG9mZmVyIGluc2lnaHRzIGludG8gaG93IHRoZXkgaGFuZGxlIGxvY2tpbmcgd2l0aGluIHRoYXQgcGFydGljdWxhciBwcm9jZXNzLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiBpdOKAmXMgaGFuZGxpbmcgY29uY3VycmVuY3kgYXQgYWxsLCBidXQgSeKAmW0gZ29pbmcgdG8gY29uc2lkZXIgaXQgYSBoaWdoLXByaW9yaXR5IGNhbmRpZGF0ZSBhcyBhIHN0YXJ0aW5nIHBvaW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDM5MCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjczLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU2OjIzLjk1NjM5OTM3MloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM0MzY0NDUxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJnZXRfdXNlcl9wYWdlc191bmxvY2tlZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmM9OTE0PXN0YXRpYyBpbnQgbmVfc2V0X3VzZXJfbWVtb3J5X3JlZ2lvbl9pb2N0bChzdHJ1Y3QgbmVfZW5jbGF2ZSAqbmVfZW5jbGF2ZSxcXG4tLVxcbmRyaXZlcnMvdmlydC9uaXRyb19lbmNsYXZlcy9uZV9taXNjX2Rldi5jLTk2Mi1cXG5kcml2ZXJzL3ZpcnQvbml0cm9fZW5jbGF2ZXMvbmVfbWlzY19kZXYuYzo5NjM6XFx0XFx0Z3VwX3JjID0gZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQobWVtX3JlZ2lvbi51c2Vyc3BhY2VfYWRkciArIG1lbW9yeV9zaXplLCAxLFxcbmRyaXZlcnMvdmlydC9uaXRyb19lbmNsYXZlcy9uZV9taXNjX2Rldi5jLTk2NC1cXHRcXHRcXHRcXHRcXHRcXHQgbmVfbWVtX3JlZ2lvbi1cXHUwMDNlcGFnZXMgKyBpLCBGT0xMX0dFVCk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tLmg9MzI3MD1sb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNzEtXFx0XFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xcbmluY2x1ZGUvbGludXgvbW0uaDozMjcyOmxvbmcgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzI3My1cXHRcXHQgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IGd1cF9mbGFncyk7XFxuLS1cXG5tbS9ndXAuYz0yNzU2PUVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXMpO1xcbi0tXFxubW0vZ3VwLmMtMjc1OC0vKlxcbm1tL2d1cC5jOjI3NTk6ICogZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoKSBpcyBzdWl0YWJsZSB0byByZXBsYWNlIHRoZSBmb3JtOlxcbm1tL2d1cC5jLTI3NjAtICpcXG4tLVxcbm1tL2d1cC5jLTI3NjYtICpcXG5tbS9ndXAuYzoyNzY3OiAqICAgICAgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQobW0sIC4uLiwgcGFnZXMpO1xcbm1tL2d1cC5jLTI3NjgtICpcXG4tLVxcbm1tL2d1cC5jLTI3NzItICovXFxubW0vZ3VwLmM6Mjc3Mzpsb25nIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxubW0vZ3VwLmMtMjc3NC1cXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXFxuLS1cXG5tbS9ndXAuYy0yNzg0LX1cXG5tbS9ndXAuYzoyNzg1OkVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQpO1xcbm1tL2d1cC5jLTI3ODYtXFxuLS1cXG5tbS9ndXAuYz0zNDg3PUVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXMpO1xcbi0tXFxubW0vZ3VwLmMtMzQ5MC0gKiBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCgpIGlzIHRoZSBGT0xMX1BJTiB2YXJpYW50IG9mXFxubW0vZ3VwLmM6MzQ5MTogKiBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCgpLiBCZWhhdmlvciBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhpcyBvbmUgc2V0c1xcbm1tL2d1cC5jLTM0OTItICogRk9MTF9QSU4gYW5kIHJlamVjdHMgRk9MTF9HRVQuXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTI4ODM9c3RhdGljIGludCBodmFfdG9fcGZuX3Nsb3coc3RydWN0IGt2bV9mb2xsb3dfcGZuICprZnAsIGt2bV9wZm5fdCAqcGZuKVxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0yOTAyLVxcdGVsc2VcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjI5MDM6XFx0XFx0bnBhZ2VzID0gZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoa2ZwLVxcdTAwM2VodmEsIDEsIFxcdTAwMjZwYWdlLCBmbGFncyk7XFxudmlydC9rdm0va3ZtX21haW4uYy0yOTA0LVxcdGlmIChucGFnZXMgIT0gMSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MjYuMzAwMDUzNloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTQ0MDM2NTY5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBHVVAgUGF0Y2ggZm9yIEZ1enppbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaXMgdG8gaWRlbnRpZnkgdGhlIG1vc3QgZWZmZWN0aXZlIHRhcmdldHMgZm9yIGZ1enppbmcgYSByZWNlbnQga2VybmVsIHBhdGNoIHRoYXQgcmVmYWN0b3JzIHRoZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYy4gSSBuZWVkIHRvIGJhbGFuY2UgY292ZXJhZ2Ugd2l0aCBhdm9pZGluZyBvdmVybHkgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCB3aWxsIHNrZXcgcmVzdWx0cy5cblxuRmlyc3QsIEkgbmVlZCB0byBsaXN0IG91dCB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zLiBCYXNlZCBvbiB0aGUgcGF0Y2ggYW5hbHlzaXMgYW5kIGtub3dpbmcgdGhhdCBJIHNob3VsZCBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLCB0aGUgaW5pdGlhbCBjYW5kaWRhdGVzIGFyZTogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIEkga25vdyB0aGF0IGBfX2dldF91c2VyX3BhZ2VzYCBpcyB0aGUgc3RhdGljIGNvcmUsIHNvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgYXJlIHRoZSBjb3JyZWN0IGNob2ljZS5cblxuTm93LCB3aGljaCBjb25maWd1cmF0aW9ucyBhcmUgcmVsZXZhbnQ/IFRoZSBwYXRjaCB1c2VzIGAjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTYCBhbmQgYCNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBhbmQgYmFzZWQgb24gdGhlIGNvbmZpZyBkZXBlbmRlbmNpZXMsIEkga25vdyB0aGF0IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCRlNgIGFyZSBzdWZmaWNpZW50IHRvIGVuYWJsZSB0aGlzLCBzbyB0aG9zZSBhcmUgdGhlIGtleSBvbmVzIHRvIGVuYWJsZS4gSXQncyBhIGdlbmVyaWMgYG1tL2d1cC5jYCBmaWxlLCBzbyBubyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29uY2VybnMuXG5cblRoZSBpbml0aWFsIHN1bW1hcnkgd291bGQgYmU6XG5cbiogICAqKldvcnRoRnV6emluZyoqOiBgdHJ1ZWBcbiogICAqKkZvY3VzU3ltYm9scyoqOiBgZ2V0X3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYGdldF91c2VyX3BhZ2VzX3VubG9ja2VkYCwgYHBpbl91c2VyX3BhZ2VzYCwgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgXG4qICAgKipFbmFibGVDb25maWdzKio6IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBIVUdFVExCRlNgXG4qICAgKipSZWFzb25pbmcqKjogU2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UuXG5cbkJ1dCBJIG5lZWQgdG8gYmUgYSBiaXQgbW9yZSBudWFuY2VkLiBJIG5lZWQgdG8gYXZvaWQgdmVyeSBob3QgcGF0aHMuIGBnZXRfdXNlcl9wYWdlc2AgaXMgKnRoZSogbWFpbiBlbnRyeSBwb2ludCBmb3IgR1VQLCBzbyBJIGhhdmUgdG8gaW5jbHVkZSBpdC4gQW5kIEknbGwgbGVhdmUgYHBpbl91c2VyX3BhZ2VzYCB0b28uIGBnZXRfdXNlcl9wYWdlc2AgaXRzZWxmIGhhcyBkcml2ZXIgY2FsbHMsIGJ1dCBpdCdzIG5vdCBsaWtlbHkgdG8gYmUgYXMgZ2VuZXJpYyBhcyBga21hbGxvY2Agb3IgYHNjaGVkdWxlYC4gVGhlIHBhdGNoIHByaW1hcmlseSBkZWFscyB3aXRoIERNQSBzZXR1cHMgYW5kIG1lbW9yeSBwaW5uaW5nLlxuXG5gZmF1bHRpbl9wYWdlX3JhbmdlYCBhbmQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBhcmUgbW9yZSBzcGVjaWZpYywgdHJpZ2dlcmVkIGJ5IGBtYWR2aXNlYCBhbmQgYG1tYXAoTUFQX1BPUFVMQVRFKSAvIG1sb2NrYCwgcmVzcGVjdGl2ZWx5LiBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCBpcyBhbHNvIGltcG9ydGFudCBiZWNhdXNlIGl0IGRlYWxzIHdpdGggYHB0cmFjZWAgYW5kIGBwcm9jZXNzX3ZtX3JlYWR2YCwgd2hpY2ggYXJlIGRlZmluaXRlbHkgZ29vZCBmdXp6aW5nIHRhcmdldHMuXG5cblNvLCB0YWtpbmcgdGhlIGhvdC1wYXRoIGNvbnNpZGVyYXRpb24gaW50byBhY2NvdW50LCB0aGUgZmluYWwgc2VsZWN0aW9uIGlzOlxuXG4qICAgKipXb3J0aEZ1enppbmcqKjogYHRydWVgXG4qICAgKipGb2N1c1N5bWJvbHMqKjogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYFxuKiAgICoqRW5hYmxlQ29uZmlncyoqOiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgSFVHRVRMQkZTYFxuKiAgICoqUmVhc29uaW5nKio6IFRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxrcywgdG91Y2hpbmcgbXVsdGlwbGUgaW1wb3J0YW50IHN1YnN5c3RlbXMuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cywgYmFsYW5jaW5nIGNvdmVyYWdlIHdpdGggdGFyZ2V0ZWQgZnVuY3Rpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTU4NywiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkzMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NjozNy43NDA0MjQwMTZaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0MzQ1MTgxODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZ2V0X3VzZXJfcGFnZXNcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0PTg0PWxhdHRlciBoYXBwZW5zIHdoZW46XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL2lkbGVfcGFnZV90cmFja2luZy5yc3QtOTItXFxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0OjkzOiAtIGEgcGFnZSBpcyBhY2Nlc3NlZCBieSBhIGRldmljZSBkcml2ZXIgdXNpbmcgZ2V0X3VzZXJfcGFnZXMoKVxcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vaWRsZV9wYWdlX3RyYWNraW5nLnJzdC05NC1cXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvY2FjaGV0bGIucnN0PTI1Mz1tYXBzIHRoaXMgcGFnZSBhdCBpdHMgdmlydHVhbCBhZGRyZXNzLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzUzLVxcdHBhZ2UsIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gKGN1cnJlbnRseSBvbmx5XFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3Q6MzU0OlxcdGdldF91c2VyX3BhZ2VzKCkpLiAgTm90ZTogZmx1c2hfZGNhY2hlX2ZvbGlvKCkgZGVsaWJlcmF0ZWx5XFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzU1LVxcdGRvZXNuJ3Qgd29yayBmb3IgYW4gYW5vbnltb3VzIHBhZ2UuICBUaGUgZGVmYXVsdFxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9MTEzPWNvdW50ZXIgdGhhdCBpbmNyZW1lbnRzIDEwIGJpdHMgYXQgYSB0aW1lLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMTIxLSogQ2FsbGVycyBtdXN0IHNwZWNpZmljYWxseSByZXF1ZXN0IFxcXCJkbWEtcGlubmVkIHRyYWNraW5nIG9mIHBhZ2VzXFxcIi4gSW4gb3RoZXJcXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoxMjI6ICB3b3JkcywganVzdCBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkgd2lsbCBub3Qgc3VmZmljZTsgYSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyxcXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdC0xMjMtICBwaW5fdXNlcl9wYWdlKCkgYW5kIHJlbGF0ZWQsIG11c3QgYmUgdXNlZC5cXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0PTE5ND1JTkNPUlJFQ1QgKHVzZXMgRk9MTF9HRVQgY2FsbHMpOlxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjE5NTogICAgZ2V0X3VzZXJfcGFnZXMoKVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTE5Ni0gICAgd3JpdGUgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBwYWdlc1xcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9MjQ1PWxvbmctdGVybSBbUl1ETUEgcGlucyBpbiBwbGFjZSwgb3IgZHVyaW5nIHBpbi91bnBpbiB0cmFuc2l0aW9ucy5cXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI0OS0gIHBpbm5lZCBvbmNlIGZvciBlYWNoIHBhZ2UgKGhlYWQgcGFnZSBhbmQgZWFjaCB0YWlsIHBhZ2UpIHdpdGhpbiB0aGUgaHVnZSBwYWdlLlxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI1MDogIFRoaXMgZm9sbG93cyB0aGUgc2FtZSBzb3J0IG9mIGJlaGF2aW9yIHRoYXQgZ2V0X3VzZXJfcGFnZXMoKSB1c2VzIGZvciBodWdlXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjUxLSAgcGFnZXM6IHRoZSBoZWFkIHBhZ2UgaXMgcmVmY291bnRlZCBvbmNlIGZvciBlYWNoIHRhaWwgb3IgaGVhZCBwYWdlIGluIHRoZSBodWdlXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q6MjUyOiAgcGFnZSwgd2hlbiBnZXRfdXNlcl9wYWdlcygpIGlzIGFwcGxpZWQgdG8gYSBodWdlIHBhZ2UuXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjUzLVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9Mjc4PVJlZmVyZW5jZXNcXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI4MC1cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODE6KiBgU29tZSBzbG93IHByb2dyZXNzIG9uIGdldF91c2VyX3BhZ2VzKCkgKEFwciAyLCAyMDE5KSBcXHUwMDNjaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzc4NDU3NC9cXHUwMDNlYF9cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODI6KiBgRE1BIGFuZCBnZXRfdXNlcl9wYWdlcygpIChMUEM6IERlYyAxMiwgMjAxOCkgXFx1MDAzY2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy83NzQ0MTEvXFx1MDAzZWBfXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q6MjgzOiogYFRoZSB0cm91YmxlIHdpdGggZ2V0X3VzZXJfcGFnZXMoKSAoQXByIDMwLCAyMDE4KSBcXHUwMDNjaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzc1MzAyNy9cXHUwMDNlYF9cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODQ6KiBgTFdOIGtlcm5lbCBpbmRleDogZ2V0X3VzZXJfcGFnZXMoKSBcXHUwMDNjaHR0cHM6Ly9sd24ubmV0L0tlcm5lbC9JbmRleC8jTWVtb3J5X21hbmFnZW1lbnQtZ2V0X3VzZXJfcGFnZXNcXHUwMDNlYF9cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdC0yODUtXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC5yc3Q9Mjg5PW1hcHBlZCBjYWNoZXMgc3VjaCBhcyBBUk0sIE1JUFMgYW5kIFNQQVJDLlxcbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdC0yOTAtXFxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgucnN0OjI5MTpDYWxsaW5nIDpjOmZ1bmM6YGdldF91c2VyX3BhZ2VzKClgIG9uIGEgcmFuZ2Ugb2YgdXNlciBtZW1vcnkgdGhhdCBoYXMgYmVlblxcbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdC0yOTItbW1hcHBlZCBmcm9tIGEgYERBWGAgZmlsZSB3aWxsIGZhaWwgd2hlbiB0aGVyZSBhcmUgbm8gJ3N0cnVjdCBwYWdlJyB0byBkZXNjcmliZVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0PTQzOD13aGlsZSB0aGUgcGFnZShzKSBiZWxvbmdpbmcgdG8gdGhlIHdyaXRlIGJ1ZmZlciBhcmUgZmF1bHRlZCB3aXRoXFxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0OjQzOTpnZXRfdXNlcl9wYWdlcygpLiAgVGhlICdyZXEtXFx1MDAzZWxvY2tlZCcgZmxhZyBpbmRpY2F0ZXMgd2hlbiB0aGUgY29weSBpc1xcbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS9mdXNlLnJzdC00NDAtdGFraW5nIHBsYWNlLCBhbmQgYWJvcnQgaXMgZGVsYXllZCB1bnRpbCB0aGlzIGZsYWcgaXMgdW5zZXQuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0PTY0MT1hbiBlcnJvci5cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0LTY0Mi1cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0OjY0MzotXFx1MDAzZWFjY2VzcygpIGlzIGNhbGxlZCB3aGVuIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMgaW5cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0LTY0NC1hY2Nlc3NfcHJvY2Vzc192bSgpLCB0eXBpY2FsbHkgdXNlZCB0byBkZWJ1ZyBhIHByb2Nlc3MgdGhyb3VnaFxcbi0tXFxuRG9jdW1lbnRhdGlvbi9ncHUvZHJtLXZtLWJpbmQtbG9ja2luZy5yc3Q9NDE2PU5vdywgdGhlIG1ldGhvZCBvZiBvYnRhaW5pbmcgc3RydWN0IHBhZ2UgcmVmZXJlbmNlcyB1c2luZ1xcbkRvY3VtZW50YXRpb24vZ3B1L2RybS12bS1iaW5kLWxvY2tpbmcucnN0OjQxNzpnZXRfdXNlcl9wYWdlcygpIHVuZm9ydHVuYXRlbHkgY2FuJ3QgYmUgdXNlZCB1bmRlciBhIGRtYV9yZXN2IGxvY2tcXG5Eb2N1bWVudGF0aW9uL2dwdS9kcm0tdm0tYmluZC1sb2NraW5nLnJzdC00MTgtc2luY2UgdGhhdCB3b3VsZCB2aW9sYXRlIHRoZSBsb2NraW5nIG9yZGVyIG9mIHRoZSBkbWFfcmVzdiBsb2NrIHZzIHRoZVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0PTQ3PU1lbW9yeSBwaW5uaW5nXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy5yc3QtNTItICBpYl91dmVyYnMgbW9kdWxlIG1hbmFnZXMgcGlubmluZyBhbmQgdW5waW5uaW5nIG1lbW9yeSByZWdpb25zIHZpYVxcbkRvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1MzogIGdldF91c2VyX3BhZ2VzKCkgYW5kIHB1dF9wYWdlKCkgY2FsbHMuICBJdCBhbHNvIGFjY291bnRzIGZvciB0aGVcXG5Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy5yc3QtNTQtICBhbW91bnQgb2YgbWVtb3J5IHBpbm5lZCBpbiB0aGUgcHJvY2VzcydzIHBpbm5lZF92bSwgYW5kIGNoZWNrcyB0aGF0XFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9MzA0PUJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgc3lzdGVtIGNhbGwsIGRvX21sb2NrKCkgb3IgbWxvY2thbGwoKSB3aWxsIGNhbGxcXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q6MzA1Ol9fbW1fcG9wdWxhdGUoKSB0byBmYXVsdCBpbiB0aGUgcmVtYWluaW5nIHBhZ2VzIHZpYSBnZXRfdXNlcl9wYWdlcygpIGFuZCB0b1xcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdC0zMDYtbWFyayB0aG9zZSBwYWdlcyBhcyBtbG9ja2VkIGFzIHRoZXkgYXJlIGZhdWx0ZWQuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9MzA4PU5vdGUgdGhhdCB0aGUgVk1BIGJlaW5nIG1sb2NrZWQgbWlnaHQgYmUgbWFwcGVkIHdpdGggUFJPVF9OT05FLiAgSW4gdGhpcyBjYXNlLFxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDozMDk6Z2V0X3VzZXJfcGFnZXMoKSB3aWxsIGJlIHVuYWJsZSB0byBmYXVsdCBpbiB0aGUgcGFnZXMuICBUaGF0J3Mgb2theS4gIElmIHBhZ2VzXFxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTMxMC1kbyBlbmQgdXAgZ2V0dGluZyBmYXVsdGVkIGludG8gdGhpcyBWTV9MT0NLRUQgVk1BLCB0aGV5IHdpbGwgYmUgaGFuZGxlZCBpbiB0aGVcXG4tLVxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdD0zNDA9bWxvY2tfZml4dXAoKSBmaWx0ZXJzIHNldmVyYWwgY2xhc3NlcyBvZiBcXFwic3BlY2lhbFxcXCIgVk1BczpcXG4tLVxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdC0zNDQtICAgbWxvY2tlZC4gIEluIGFueSBjYXNlLCBtb3N0IG9mIHRoZSBwYWdlcyBoYXZlIG5vIHN0cnVjdCBwYWdlIGluIHdoaWNoIHRvIHNvXFxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0OjM0NTogICBtYXJrIHRoZSBwYWdlLiAgQmVjYXVzZSBvZiB0aGlzLCBnZXRfdXNlcl9wYWdlcygpIHdpbGwgZmFpbCBmb3IgdGhlc2UgVk1BcyxcXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3QtMzQ2LSAgIHNvIHRoZXJlIGlzIG5vIHNlbnNlIGluIGF0dGVtcHRpbmcgdG8gdmlzaXQgdGhlbS5cXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2NhY2hldGxiLnJzdD0xMDk9SHlwZXJTcGFyYyBjcHXlsLHmmK/ov5nmoLfkuIDkuKrlhbfmnInov5nnp43lsZ7mgKfnmoRjcHXjgIJcXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2NhY2hldGxiLnJzdC0zMDItXFx05b2T5YaF5qC46ZyA6KaB6K6/6Zeu5LiA5Liq5Yy/5ZCN6aG155qE5YaF5a655pe277yM5a6D5Lya6LCD55So6L+Z5Liq5Ye95pWw77yI55uu5YmN5Y+q5pyJXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkvY2FjaGV0bGIucnN0OjMwMzpcXHRnZXRfdXNlcl9wYWdlcygp77yJ44CC5rOo5oSP77yaZmx1c2hfZGNhY2hlX3BhZ2UoKeaVheaEj+WvueWMv+WQjemhteS4jei1t+S9nFxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2NhY2hldGxiLnJzdC0zMDQtXFx055So44CC6buY6K6k55qE5a6e546w5pivbm9w77yI5a+55LqO5omA5pyJ55u45bmy55qE5p625p6E5bqU6K+l5L+d5oyB6L+Z5qC377yJ44CC5a+55LqO5LiN5LiA6Ie05oCnXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0LTUzLSAg55u05o6l55qE55So5oi356m66Ze0SS9P6KaB5rGC5LiO5L2c5Li65r2c5ZyoSS9P55uu5qCH55qE5YaF5a2Y5Yy65Z+f5L+d5oyB5Zyo5ZCM5LiA54mp55CG5Zyw5Z2A5LiK44CCaWJfdXZlcmJzXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1NDogIOaooeWdl+mAmui/h2dldF91c2VyX3BhZ2VzKCnlkoxwdXRfcGFnZSgp6LCD55So5p2l566h55CG5YaF5a2Y5Yy65Z+f55qE5Zu65a6a5ZKM6Kej6Zmk5Zu65a6a44CC5a6D6L+Y5qC4XFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdC01NS0gIOeul+i/m+eoi+eahHBpbm5lZF92beS4reiiq+WbuuWumueahOWGheWtmOmHj++8jOW5tuajgOafpemdnueJueadg+i/m+eoi+aYr+WQpui2hei/h+WFtlJMSU1JVF9NRU1MT0NL6ZmQ5Yi244CCXFxuLS1cXG5hcmNoL2FybS9tbS9mbHVzaC5jPTM3Mz1FWFBPUlRfU1lNQk9MKGZsdXNoX2RjYWNoZV9wYWdlKTtcXG5hcmNoL2FybS9tbS9mbHVzaC5jLTM3NC0vKlxcbmFyY2gvYXJtL21tL2ZsdXNoLmM6Mzc1OiAqIEZsdXNoIGFuIGFub255bW91cyBwYWdlIHNvIHRoYXQgdXNlcnMgb2YgZ2V0X3VzZXJfcGFnZXMoKVxcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc2LSAqIGNhbiBzYWZlbHkgYWNjZXNzIHRoZSBkYXRhLiAgVGhlIGV4cGVjdGVkIHNlcXVlbmNlIGlzOlxcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc3LSAqXFxuYXJjaC9hcm0vbW0vZmx1c2guYzozNzg6ICogIGdldF91c2VyX3BhZ2VzKClcXG5hcmNoL2FybS9tbS9mbHVzaC5jLTM3OS0gKiAgICAtXFx1MDAzZSBmbHVzaF9hbm9uX3BhZ2VcXG4tLVxcbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYz03NzI9c3RhdGljIGludCBrdm1fbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdwYSwgYm9vbCB3cml0ZSlcXG4tLVxcbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYy04MTAtXFx0ICogRW5zdXJlIHRoZSByZWFkIG9mIG1tdV9pbnZhbGlkYXRlX3NlcSBpc24ndCByZW9yZGVyZWQgd2l0aCBQVEUgcmVhZHMgaW5cXG5hcmNoL2xvb25nYXJjaC9rdm0vbW11LmM6ODExOlxcdCAqIGt2bV9mYXVsdGluX3BmbigpICh3aGljaCBjYWxscyBnZXRfdXNlcl9wYWdlcygpKSwgc28gdGhhdCB3ZSBkb24ndFxcbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYy04MTItXFx0ICogcmlzayB0aGUgcGFnZSB3ZSBnZXQgYSByZWZlcmVuY2UgdG8gZ2V0dGluZyB1bm1hcHBlZCBiZWZvcmUgd2UgaGF2ZSBhXFxuLS1cXG5hcmNoL21pcHMva3ZtL21tdS5jPTU0Nz1zdGF0aWMgaW50IGt2bV9taXBzX21hcF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBncGEsXFxuLS1cXG5hcmNoL21pcHMva3ZtL21tdS5jLTU4MS1cXHQgKiBFbnN1cmUgdGhlIHJlYWQgb2YgbW11X2ludmFsaWRhdGVfc2VxIGlzbid0IHJlb3JkZXJlZCB3aXRoIFBURSByZWFkc1xcbmFyY2gvbWlwcy9rdm0vbW11LmM6NTgyOlxcdCAqIGluIGt2bV9mYXVsdGluX3BmbigpICh3aGljaCBjYWxscyBnZXRfdXNlcl9wYWdlcygpKSwgc28gdGhhdCB3ZSBkb24ndFxcbmFyY2gvbWlwcy9rdm0vbW11LmMtNTgzLVxcdCAqIHJpc2sgdGhlIHBhZ2Ugd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIGdldHRpbmcgdW5tYXBwZWQgYmVmb3JlIHdlIGhhdmUgYVxcbi0tXFxuYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYz02Nzg9c3RhdGljIHZvaWQga3ZtcHBjX3VwZGF0ZV92cGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtcHBjX3ZwYSAqdnBhcCxcXG4tLVxcbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMtNjg4LVxcdCAqIGJ1dCB3ZSBjYW4ndCBjYWxsIGt2bXBwY19waW5fZ3Vlc3RfcGFnZSB1bmRlciB0aGUgbG9ja1xcbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmM6Njg5OlxcdCAqIGFzIGl0IGRvZXMgZ2V0X3VzZXJfcGFnZXMoKSBhbmQgZG93bl9yZWFkKCkuICBTbyB3ZVxcbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMtNjkwLVxcdCAqIGhhdmUgdG8gZHJvcCB0aGUgbG9jaywgcGluIHRoZSBwYWdlLCB0aGVuIGdldCB0aGUgbG9ja1xcbi0tXFxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmM9OTE9dm9pZCBwdHJhY2VfZGlzYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKVxcbi0tXFxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmMtOTYtLyogVG8gZ2V0IHRoZSBuZWNlc3NhcnkgcGFnZSBzdHJ1Y3QsIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZmlyc3QgY2FsbHNcXG5hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2VfNjQuYzo5NzogKiBnZXRfdXNlcl9wYWdlcygpLiAgVGhpcyBoYXMgZG9uZSBhIGZsdXNoX2RjYWNoZV9wYWdlKCkgb24gdGhlXFxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmMtOTgtICogYWNjZXNzZWQgcGFnZS4gIFRoZW4gb3VyIGNhbGxlciAoY29weV97dG8sZnJvbX1fdXNlcl9wYWdlKCkpIGRpZFxcbi0tXFxuYXJjaC94ODYva2VybmVsL2NwdS9zZ3gvaW9jdGwuYz0yMDc9c3RhdGljIGludCBfX3NneF9lbmNsX2FkZF9wYWdlKHN0cnVjdCBzZ3hfZW5jbCAqZW5jbCxcXG4tLVxcbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMtMjI0LVxcbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmM6MjI1OlxcdHJldCA9IGdldF91c2VyX3BhZ2VzKHNyYywgMSwgMCwgXFx1MDAyNnNyY19wYWdlKTtcXG5hcmNoL3g4Ni9rZXJuZWwvY3B1L3NneC9pb2N0bC5jLTIyNi1cXHRpZiAocmV0IFxcdTAwM2MgMSlcXG4tLVxcbmFyY2gveHRlbnNhL21tL2NhY2hlLmM9MjE2PXZvaWQgdXBkYXRlX21tdV9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jLTI2Ni0vKlxcbmFyY2gveHRlbnNhL21tL2NhY2hlLmM6MjY3OiAqIGFjY2Vzc19wcm9jZXNzX3ZtKCkgaGFzIGNhbGxlZCBnZXRfdXNlcl9wYWdlcygpLCB3aGljaCBoYXMgZG9uZSBhXFxuYXJjaC94dGVuc2EvbW0vY2FjaGUuYy0yNjgtICogZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGUgcGFnZS5cXG4tLVxcbmJsb2NrL2Jpby5jPTE2NTA9RVhQT1JUX1NZTUJPTChiaW9fZnJlZV9wYWdlcyk7XFxuLS1cXG5ibG9jay9iaW8uYy0xNjYyLSAqIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgdmVyeSBoYXJkIHRvIHRlc3QgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgYmVjYXVzZVxcbmJsb2NrL2Jpby5jOjE2NjM6ICogZGlyZWN0LWlvIHBpbnMgdGhlIHBhZ2VzIHdpdGggZ2V0X3VzZXJfcGFnZXMoKS4gIFRoaXMgbWFrZXNcXG5ibG9jay9iaW8uYy0xNjY0LSAqIGlzX3BhZ2VfY2FjaGVfZnJlZWFibGUgcmV0dXJuIGZhbHNlLCBhbmQgdGhlIFZNIHdpbGwgbm90IGNsZWFuIHRoZSBwYWdlcy5cXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYz0xMDYxPXN0YXRpYyBpbnQgaW5pdF91c2VyX3BhZ2VzKHN0cnVjdCBrZ2RfbWVtICptZW0sIHVpbnQ2NF90IHVzZXJfYWRkcixcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0xMTA0LVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYzoxMTA1OlxcdHJldCA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIHJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmMtMTEwNi1cXHRpZiAocmV0KSB7XFxuLS1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM9MjU0Mj1zdGF0aWMgaW50IHVwZGF0ZV9pbnZhbGlkX3VzZXJfcGFnZXMoc3RydWN0IGFtZGtmZF9wcm9jZXNzX2luZm8gKnByb2Nlc3NfaW5mbyxcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0yNjAwLVxcdFxcdC8qIEdldCB1cGRhdGVkIHVzZXIgcGFnZXMgKi9cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM6MjYwMTpcXHRcXHRyZXQgPSBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKGJvLCBtZW0tXFx1MDAzZXJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmMtMjYwMi1cXHRcXHRpZiAocmV0KSB7XFxuLS1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYz04NDQ9c3RhdGljIGludCBhbWRncHVfY3NfcGFyc2VyX2JvcyhzdHJ1Y3QgYW1kZ3B1X2NzX3BhcnNlciAqcCxcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9jcy5jLTg4Ny1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYzo4ODg6XFx0XFx0ciA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIGUtXFx1MDAzZXJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYy04ODktXFx0XFx0aWYgKHIpXFxuLS1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2VtLmM9NDk1PWludCBhbWRncHVfZ2VtX3VzZXJwdHJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSxcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYy01NTAtXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dlbS5jOjU1MTpcXHRcXHRyID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgcmFuZ2UpO1xcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYy01NTItXFx0XFx0aWYgKHIpIHtcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYz03MjI9c3RydWN0IGFtZGdwdV90dG1fdHQge1xcbi0tXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jLTc0My0gKi9cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmM6NzQ0OmludCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKHN0cnVjdCBhbWRncHVfYm8gKmJvLFxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYy03NDUtXFx0XFx0XFx0XFx0IHN0cnVjdCBhbWRncHVfaG1tX3JhbmdlICpyYW5nZSlcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaD0yMDc9dWludDY0X3QgYW1kZ3B1X3R0bV9kb21haW5fc3RhcnQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHVpbnQzMl90IHR5cGUpO1xcbi0tXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5oLTIwOS0jaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0FNREdQVV9VU0VSUFRSKVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaDoyMTA6aW50IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGFtZGdwdV9ibyAqYm8sXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5oLTIxMS1cXHRcXHRcXHRcXHQgc3RydWN0IGFtZGdwdV9obW1fcmFuZ2UgKnJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjEyLSNlbHNlXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5oOjIxMzpzdGF0aWMgaW5saW5lIGludCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKHN0cnVjdCBhbWRncHVfYm8gKmJvLFxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaC0yMTQtXFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBhbWRncHVfaG1tX3JhbmdlICpyYW5nZSlcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jPTk1OD1hbWRncHVfdXNlcnFfdm1fdmFsaWRhdGUoc3RydWN0IGFtZGdwdV91c2VycV9tZ3IgKnVxX21ncilcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jLTEwNTktXFx0XFx0XFx0Ym8gPSByYW5nZS1cXHUwMDNlYm87XFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3VzZXJxLmM6MTA2MDpcXHRcXHRcXHRyZXQgPSBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKGJvLCByYW5nZSk7XFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3VzZXJxLmMtMTA2MS1cXHRcXHRcXHRpZiAocmV0KVxcbi0tXFxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmM9MzIzPXN0YXRpYyBpbnQgcmFkZW9uX3R0bV90dF9waW5fdXNlcnB0cihzdHJ1Y3QgdHRtX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV90dCAqdHRtKVxcbi0tXFxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMtMzUxLVxcbmRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jOjM1MjpcXHRcXHRyID0gZ2V0X3VzZXJfcGFnZXModXNlcnB0ciwgbnVtX3BhZ2VzLCB3cml0ZSA/IEZPTExfV1JJVEUgOiAwLFxcbmRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jLTM1My1cXHRcXHRcXHRcXHQgICBwYWdlcyk7XFxuLS1cXG5kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVmYXVsdC5jPTE3Nz1zdGF0aWMgaW50IG5vbl9hdG9taWNfcHRlX2xvb2t1cChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMtMTg3LSNlbmRpZlxcbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmM6MTg4OlxcdGlmIChnZXRfdXNlcl9wYWdlcyh2YWRkciwgMSwgd3JpdGUgPyBGT0xMX1dSSVRFIDogMCwgXFx1MDAyNnBhZ2UpIFxcdTAwM2M9IDApXFxuZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmF1bHQuYy0xODktXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuLS1cXG5mcy9kYXguYz02ODc9c3RhdGljIHZvaWQgKmdyYWJfbWFwcGluZ19lbnRyeShzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcXG4tLVxcbmZzL2RheC5jLTc4My0gKiBhbnkgcGFnZSBpbiB0aGUgbWFwcGluZyBpcyBidXN5LCBpLmUuIGZvciBETUEsIG9yIG90aGVyXFxuZnMvZGF4LmM6Nzg0OiAqIGdldF91c2VyX3BhZ2VzKCkgdXNhZ2VzLlxcbmZzL2RheC5jLTc4NS0gKlxcbi0tXFxuZnMvZGF4LmM9NzkxPXN0cnVjdCBwYWdlICpkYXhfbGF5b3V0X2J1c3lfcGFnZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2RheC5jLTgxMy1cXHQgKiBhZ2FpbnN0IGlzIG5vIGxvbmdlciBtYXBwZWQgaW4gdGhlIHBhZ2UgdGFibGVzIGFuZCBiYWlsIHRvIHRoZVxcbmZzL2RheC5jOjgxNDpcXHQgKiBnZXRfdXNlcl9wYWdlcygpIHNsb3cgcGF0aC4gIFRoZSBzbG93IHBhdGggaXMgcHJvdGVjdGVkIGJ5XFxuZnMvZGF4LmMtODE1LVxcdCAqIHB0ZV9sb2NrKCkgYW5kIHBtZF9sb2NrKCkuIE5ldyByZWZlcmVuY2VzIGFyZSBub3QgdGFrZW4gd2l0aG91dFxcbi0tXFxuZnMvZGlyZWN0LWlvLmM9MjQ0PXN0YXRpYyBzc2l6ZV90IGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIHNzaXplX3QgcmV0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuLS1cXG5mcy9kaXJlY3QtaW8uYy0yODctXFx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxcbmZzL2RpcmVjdC1pby5jOjI4ODpcXHQgKiBub24tZGlyZWN0IHJlYWRhaGVhZCwgb3IgZmF1bHRlZCBpbiBieSBnZXRfdXNlcl9wYWdlcygpIGlmIHRoZSBzb3VyY2VcXG5mcy9kaXJlY3QtaW8uYy0yODktXFx0ICogb2YgdGhlIHdyaXRlIHdhcyBhbiBtbWFwJ2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSdyZSB3cml0aW5nLiAgRWl0aGVyXFxuLS1cXG5mcy9kaXJlY3QtaW8uYz04OTk9c3RhdGljIGludCBkb19kaXJlY3RfSU8oc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbyxcXG4tLVxcbmZzL2RpcmVjdC1pby5jLTEwNDYtXFxuZnMvZGlyZWN0LWlvLmM6MTA0NzpcXHRcXHQvKiBEcm9wIHRoZSBwaW4gd2hpY2ggd2FzIHRha2VuIGluIGdldF91c2VyX3BhZ2VzKCkgKi9cXG5mcy9kaXJlY3QtaW8uYy0xMDQ4LVxcdFxcdGRpb191bnBpbl9wYWdlKGRpbywgcGFnZSk7XFxuLS1cXG5mcy9leGVjLmM9NDAyPXN0YXRpYyBpbnQgYnBybV9zdGFja19saW1pdHMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4tLVxcbmZzL2V4ZWMuYy00NDgtICogJ2NvcHlfc3RyaW5ncygpJyBjb3BpZXMgYXJndW1lbnQvZW52aXJvbm1lbnQgc3RyaW5ncyBmcm9tIHRoZSBvbGRcXG5mcy9leGVjLmM6NDQ5OiAqIHByb2Nlc3NlcydzIG1lbW9yeSB0byB0aGUgbmV3IHByb2Nlc3MncyBzdGFjay4gIFRoZSBjYWxsIHRvIGdldF91c2VyX3BhZ2VzKClcXG5mcy9leGVjLmMtNDUwLSAqIGVuc3VyZXMgdGhlIGRlc3RpbmF0aW9uIHBhZ2UgaXMgY3JlYXRlZCBhbmQgbm90IHN3YXBwZWQgb3V0Llxcbi0tXFxuZnMvZnVzZS9kYXguYz05MTI9aW5vZGVfaW5saW5lX3JlY2xhaW1fb25lX2RtYXAoc3RydWN0IGZ1c2VfY29ubl9kYXggKmZjZCwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2Z1c2UvZGF4LmMtOTM3LVxcdCAqIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyB0byBpbm9kZSBwYWdlcyB1c2luZ1xcbmZzL2Z1c2UvZGF4LmM6OTM4OlxcdCAqIGdldF91c2VyX3BhZ2VzKClcXG5mcy9mdXNlL2RheC5jLTkzOS1cXHQgKi9cXG4tLVxcbmZzL2Z1c2UvZmlsZS5jPTE1NjE9c3RhdGljIGlubGluZSBzaXplX3QgZnVzZV9nZXRfZnJhZ19zaXplKGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaWksXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0xNTY2LVxcbmZzL2Z1c2UvZmlsZS5jOjE1Njc6c3RhdGljIGludCBmdXNlX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBmdXNlX2FyZ3NfcGFnZXMgKmFwLCBzdHJ1Y3QgaW92X2l0ZXIgKmlpLFxcbmZzL2Z1c2UvZmlsZS5jLTE1NjgtXFx0XFx0XFx0ICAgICAgIHNpemVfdCAqbmJ5dGVzcCwgaW50IHdyaXRlLFxcbi0tXFxuZnMvZnVzZS9maWxlLmM9MTY2NT1zc2l6ZV90IGZ1c2VfZGlyZWN0X2lvKHN0cnVjdCBmdXNlX2lvX3ByaXYgKmlvLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0xNzE5LVxcbmZzL2Z1c2UvZmlsZS5jOjE3MjA6XFx0XFx0ZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhcXHUwMDI2aWEtXFx1MDAzZWFwLCBpdGVyLCBcXHUwMDI2bmJ5dGVzLCB3cml0ZSxcXG5mcy9mdXNlL2ZpbGUuYy0xNzIxLVxcdFxcdFxcdFxcdFxcdCAgbWF4X3BhZ2VzLCBmYy1cXHUwMDNldXNlX3BhZ2VzX2Zvcl9rdmVjX2lvKTtcXG4tLVxcbmZzL2lvbWFwL2RpcmVjdC1pby5jPTEwND1zc2l6ZV90IGlvbWFwX2Rpb19jb21wbGV0ZShzdHJ1Y3QgaW9tYXBfZGlvICpkaW8pXFxuLS1cXG5mcy9pb21hcC9kaXJlY3QtaW8uYy0xMjctXFx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxcbmZzL2lvbWFwL2RpcmVjdC1pby5jOjEyODpcXHQgKiBub24tZGlyZWN0IHJlYWRhaGVhZCwgb3IgZmF1bHRlZCBpbiBieSBnZXRfdXNlcl9wYWdlcygpIGlmIHRoZSBzb3VyY2VcXG5mcy9pb21hcC9kaXJlY3QtaW8uYy0xMjktXFx0ICogb2YgdGhlIHdyaXRlIHdhcyBhbiBtbWFwJ2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSdyZSB3cml0aW5nLiAgRWl0aGVyXFxuLS1cXG5mcy9uZnMvZGlyZWN0LmM9MzI2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZzX3BnaW9fY29tcGxldGlvbl9vcHMgbmZzX2RpcmVjdF9yZWFkX2NvbXBsZXRpb25fb3BzID0ge1xcbi0tXFxuZnMvbmZzL2RpcmVjdC5jLTMzMy0gKiBGb3IgZWFjaCByc2l6ZSdkIGNodW5rIG9mIHRoZSB1c2VyJ3MgYnVmZmVyLCBkaXNwYXRjaCBhbiBORlMgUkVBRFxcbmZzL25mcy9kaXJlY3QuYzozMzQ6ICogb3BlcmF0aW9uLiAgSWYgbmZzX3JlYWRkYXRhX2FsbG9jKCkgb3IgZ2V0X3VzZXJfcGFnZXMoKSBmYWlscyxcXG5mcy9uZnMvZGlyZWN0LmMtMzM1LSAqIGJhaWwgYW5kIHN0b3Agc2VuZGluZyBtb3JlIHJlYWRzLiAgUmVhZCBsZW5ndGggYWNjb3VudGluZyBpc1xcbi0tXFxuZnMvbmZzL2RpcmVjdC5jPTg1Mj1zdGF0aWMgY29uc3Qgc3RydWN0IG5mc19wZ2lvX2NvbXBsZXRpb25fb3BzIG5mc19kaXJlY3Rfd3JpdGVfY29tcGxldGlvbl9vcHMgPSB7XFxuLS1cXG5mcy9uZnMvZGlyZWN0LmMtODY1LSAqIEZvciBlYWNoIHdzaXplJ2QgY2h1bmsgb2YgdGhlIHVzZXIncyBidWZmZXIsIGRpc3BhdGNoIGFuIE5GUyBXUklURVxcbmZzL25mcy9kaXJlY3QuYzo4NjY6ICogb3BlcmF0aW9uLiAgSWYgbmZzX3dyaXRlZGF0YV9hbGxvYygpIG9yIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsXFxuZnMvbmZzL2RpcmVjdC5jLTg2Ny0gKiBiYWlsIGFuZCBzdG9wIHNlbmRpbmcgbW9yZSB3cml0ZXMuICBXcml0ZSBsZW5ndGggYWNjb3VudGluZyBpc1xcbi0tXFxuZnMveGZzL3hmc19pbm9kZS5jPTk2PXhmc19sb2NrX2ZsYWdzX2Fzc2VydChcXG4tLVxcbmZzL3hmcy94ZnNfaW5vZGUuYy0xMjgtICogY2FuIGZhdWx0IGluIHBhZ2VzIGR1cmluZyBjb3B5IGluL291dCAoZm9yIGJ1ZmZlcmVkIElPKSBvciByZXF1aXJlIHRoZVxcbmZzL3hmcy94ZnNfaW5vZGUuYzoxMjk6ICogbW1hcF9sb2NrIGluIGdldF91c2VyX3BhZ2VzKCkgdG8gbWFwIHRoZSB1c2VyIHBhZ2VzIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzXFxuZnMveGZzL3hmc19pbm9kZS5jLTEzMC0gKiBzcGFjZSBmb3IgZGlyZWN0IElPLiBTaW1pbGFybHkgdGhlIGlfcndzZW0gY2Fubm90IGJlIHRha2VuIGluc2lkZSBhIHBhZ2VcXG4tLVxcbmluY2x1ZGUvbGludXgvbW0uaD03ODM9c3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHtcXG4tLVxcbmluY2x1ZGUvbGludXgvbW0uaC04MzQtXFxuaW5jbHVkZS9saW51eC9tbS5oOjgzNTpcXHQvKiBjYWxsZWQgYnkgYWNjZXNzX3Byb2Nlc3Nfdm0gd2hlbiBnZXRfdXNlcl9wYWdlcygpIGZhaWxzLCB0eXBpY2FsbHlcXG5pbmNsdWRlL2xpbnV4L21tLmgtODM2LVxcdCAqIGZvciB1c2UgYnkgc3BlY2lhbCBWTUFzLiBTZWUgYWxzbyBnZW5lcmljX2FjY2Vzc19waHlzKCkgZm9yIGEgZ2VuZXJpY1xcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTIxODY9c3RhdGljIGlubGluZSB2b2lkIHB1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oLTIyMjItICogTG9ja2luZzogdGhlIGxvY2tsZXNzIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gZm9saW9fdHJ5X2dldF9yY3UoKVxcbmluY2x1ZGUvbGludXgvbW0uaDoyMjIzOiAqIHByb3ZpZGVzIHNhZmUgb3BlcmF0aW9uIGZvciBnZXRfdXNlcl9wYWdlcygpLCBmb2xpb19ta2NsZWFuKCkgYW5kXFxuaW5jbHVkZS9saW51eC9tbS5oLTIyMjQtICogb3RoZXIgY2FsbHMgdGhhdCByYWNlIHRvIHNldCB1cCBwYWdlIHRhYmxlIGVudHJpZXMuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tLmg9MzI0MT1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tLmgtMzI2Ny1cXG5pbmNsdWRlL2xpbnV4L21tLmg6MzI2ODpsb25nIGdldF91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNjktXFx0XFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L25pdHJvX2VuY2xhdmVzLmgtMTQ2LSAqICogTkVfRVJSX0lOVkFMSURfRkxBR19WQUxVRVxcdFxcdC0gVGhlIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBmbGFnIGlzIGludmFsaWQuXFxuaW5jbHVkZS91YXBpL2xpbnV4L25pdHJvX2VuY2xhdmVzLmg6MTQ3OiAqICogRXJyb3IgY29kZXMgZnJvbSBnZXRfdXNlcl9wYWdlcygpLlxcbmluY2x1ZGUvdWFwaS9saW51eC9uaXRyb19lbmNsYXZlcy5oLTE0OC0gKiAqIEVycm9yIGNvZGVzIGZyb20gdGhlIE5FIFBDSSBkZXZpY2UgcmVxdWVzdC5cXG4tLVxcbmtlcm5lbC9ldmVudHMvdXByb2Jlcy5jPTI0MDA9c3RhdGljIGludCBpc190cmFwX2F0X2FkZHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgdmFkZHIpXFxuLS1cXG5rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYy0yNDE1LVxcbmtlcm5lbC9ldmVudHMvdXByb2Jlcy5jOjI0MTY6XFx0cmVzdWx0ID0gZ2V0X3VzZXJfcGFnZXModmFkZHIsIDEsIEZPTExfRk9SQ0UsIFxcdTAwMjZwYWdlKTtcXG5rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYy0yNDE3LVxcdGlmIChyZXN1bHQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2Z1dGV4L2NvcmUuYz01MDI9aW50IGdldF9mdXRleF9rZXkodTMyIF9fdXNlciAqdWFkZHIsIHVuc2lnbmVkIGludCBmbGFncywgdW5pb24gZnV0ZXhfa2V5ICprZXksXFxuLS1cXG5rZXJuZWwvZnV0ZXgvY29yZS5jLTczNS0gKiBkaXNhYmxlZCBzZWN0aW9uIHNvIHdlIGNhbiBhcyB3ZWxsIGF2b2lkIHRoZSAjUEYgb3ZlcmhlYWQgYnlcXG5rZXJuZWwvZnV0ZXgvY29yZS5jOjczNjogKiBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkgcmlnaHQgYXdheS5cXG5rZXJuZWwvZnV0ZXgvY29yZS5jLTczNy0gKi9cXG4tLVxcbmxpYi9pb3ZfaXRlci5jPTEyOT1FWFBPUlRfU1lNQk9MKGZhdWx0X2luX2lvdl9pdGVyX3JlYWRhYmxlKTtcXG4tLVxcbmxpYi9pb3ZfaXRlci5jLTEzNS0gKlxcbmxpYi9pb3ZfaXRlci5jOjEzNjogKiBGYXVsdHMgaW4gdGhlIGl0ZXJhdG9yIHVzaW5nIGdldF91c2VyX3BhZ2VzKCksIGkuZS4sIHdpdGhvdXQgdHJpZ2dlcmluZ1xcbmxpYi9pb3ZfaXRlci5jLTEzNy0gKiBoYXJkd2FyZSBwYWdlIGZhdWx0cy4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0XFxuLS1cXG5tbS9LY29uZmlnPTEzMDY9Y29uZmlnIEdVUF9URVNUXFxubW0vS2NvbmZpZzoxMzA3OlxcdGJvb2wgXFxcIkVuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcXFwiXFxubW0vS2NvbmZpZy0xMzA4LVxcdGRlcGVuZHMgb24gREVCVUdfRlNcXG4tLVxcbm1tL2ZpbGVtYXAuYz0xNTA9c3RhdGljIHZvaWQgZmlsZW1hcF91bmFjY291bnRfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5tbS9maWxlbWFwLmMtMjAyLVxcdCAqIEJ1dCBpdCdzIGhhcm1sZXNzIG9uIGluLW1lbW9yeSBmaWxlc3lzdGVtcyBsaWtlIHRtcGZzOyBhbmQgY2FuXFxubW0vZmlsZW1hcC5jOjIwMzpcXHQgKiBvY2N1ciB3aGVuIGEgZHJpdmVyIHdoaWNoIGRpZCBnZXRfdXNlcl9wYWdlcygpIHNldHMgcGFnZSBkaXJ0eVxcbm1tL2ZpbGVtYXAuYy0yMDQtXFx0ICogYmVmb3JlIHB1dHRpbmcgaXQsIHdoaWxlIHRoZSBpbm9kZSBpcyBiZWluZyBmaW5hbGx5IGV2aWN0ZWQuXFxuLS1cXG5tbS9maWxlbWFwLmM9NDI4MT1nZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxcbi0tXFxubW0vZmlsZW1hcC5jLTQzMDEtXFx0ICogRmluYWxseSwgdHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuXFxubW0vZmlsZW1hcC5jOjQzMDI6XFx0ICogY2FjaGVkIGJ5IG5vbi1kaXJlY3QgcmVhZGFoZWFkLCBvciBmYXVsdGVkIGluIGJ5IGdldF91c2VyX3BhZ2VzKClcXG5tbS9maWxlbWFwLmMtNDMwMy1cXHQgKiBpZiB0aGUgc291cmNlIG9mIHRoZSB3cml0ZSB3YXMgYW4gbW1hcCdlZCByZWdpb24gb2YgdGhlIGZpbGVcXG4tLVxcbm1tL2d1cC5jPTI0Nz1zdGF0aWMgaW5saW5lIHN0cnVjdCBmb2xpbyAqZ3VwX2ZvbGlvX25leHQoc3RydWN0IHBhZ2UgKipsaXN0LFxcbi0tXFxubW0vZ3VwLmMtMjY3LSAqXFxubW0vZ3VwLmM6MjY4OiAqIFxcXCJndXAtcGlubmVkIHBhZ2VcXFwiIHJlZmVycyB0byBhIHBhZ2UgdGhhdCBoYXMgaGFkIG9uZSBvZiB0aGUgZ2V0X3VzZXJfcGFnZXMoKVxcbm1tL2d1cC5jLTI2OS0gKiB2YXJpYW50cyBjYWxsZWQgb24gdGhhdCBwYWdlLlxcbi0tXFxubW0vZ3VwLmM9OTI5PXN0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy05NTMtICogQSBmYWlsdXJlIG9uIHRoZSBmaXJzdCBQVEUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gQSBmYWlsdXJlIGFmdGVyIHRoYXRcXG5tbS9ndXAuYzo5NTQ6ICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLlxcbm1tL2d1cC5jLTk1NS0gKi9cXG4tLVxcbm1tL2d1cC5jPTE0MDI9c3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZ3VwX3ZtYV9sb29rdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9ndXAuYy0xNDM3LS8qKlxcbm1tL2d1cC5jOjE0Mzg6ICogX19nZXRfdXNlcl9wYWdlcygpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5XFxubW0vZ3VwLmMtMTQzOS0gKiBAbW06XFx0XFx0bW1fc3RydWN0IG9mIHRhcmdldCBtbVxcbi0tXFxubW0vZ3VwLmMtMTQ5MC0gKi9cXG5tbS9ndXAuYzoxNDkxOnN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0vZ3VwLmMtMTQ5Mi1cXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vZ3VwLmM9MTYxMz1zdGF0aWMgYm9vbCB2bWFfcGVybWl0c19mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE2NTEtICpcXG5tbS9ndXAuYzoxNjUyOiAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBnZXRfdXNlcl9wYWdlcygpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsXFxubW0vZ3VwLmMtMTY1My0gKiB1bmNvbmRpdGlvbmFsbHkgY2FsbCBoYW5kbGVfbW1fZmF1bHQoKSB3aGljaCB3aWxsIGluIHR1cm4gcGVyZm9ybSBhbGwgdGhlXFxubW0vZ3VwLmMtMTY1NC0gKiBuZWNlc3NhcnkgU1cgZml4dXAgb2YgdGhlIGRpcnR5IGFuZCB5b3VuZyBiaXRzIGluIHRoZSBQVEUsIHdoaWxlXFxubW0vZ3VwLmM6MTY1NTogKiBnZXRfdXNlcl9wYWdlcygpIG9ubHkgZ3VhcmFudGVlcyB0byB1cGRhdGUgdGhlc2UgaW4gdGhlIHN0cnVjdCBwYWdlLlxcbm1tL2d1cC5jLTE2NTYtICpcXG4tLVxcbm1tL2d1cC5jPTE3MjY9c3RhdGljIGJvb2wgZ3VwX3NpZ25hbF9wZW5kaW5nKHVuc2lnbmVkIGludCBmbGFncylcXG4tLVxcbm1tL2d1cC5jLTE3NDYtICpcXG5tbS9ndXAuYzoxNzQ3OiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiwgdW5saWtlIF9fZ2V0X3VzZXJfcGFnZXMoKSwgd2lsbCBub3QgcmV0dXJuIDBcXG5tbS9ndXAuYy0xNzQ4LSAqIGZvciBucl9wYWdlcyBcXHUwMDNlIDAsIHVubGVzcyBGT0xMX05PV0FJVCBpcyB1c2VkLlxcbi0tXFxubW0vZ3VwLmM9MTc1MD1zdGF0aWMgX19hbHdheXNfaW5saW5lIGxvbmcgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9ndXAuYy0xNzkyLVxcdGZvciAoOzspIHtcXG5tbS9ndXAuYzoxNzkzOlxcdFxcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZmxhZ3MsIHBhZ2VzLFxcbm1tL2d1cC5jLTE3OTQtXFx0XFx0XFx0XFx0ICAgICAgIGxvY2tlZCk7XFxuLS1cXG5tbS9ndXAuYy0xODUyLVxcdFxcdCpsb2NrZWQgPSAxO1xcbm1tL2d1cC5jOjE4NTM6XFx0XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIDEsIGZsYWdzIHwgRk9MTF9UUklFRCxcXG5tbS9ndXAuYy0xODU0LVxcdFxcdFxcdFxcdCAgICAgICBwYWdlcywgbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE5NjAtXFx0ICovXFxubW0vZ3VwLmM6MTk2MTpcXHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgbnJfcGFnZXMsIGd1cF9mbGFncyxcXG5tbS9ndXAuYy0xOTYyLVxcdFxcdFxcdCAgICAgICBOVUxMLCBsb2NrZWQgPyBsb2NrZWQgOiBcXHUwMDI2bG9jYWxfbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jLTE5NzktICogUmV0dXJucyBlaXRoZXIgbnVtYmVyIG9mIHByb2Nlc3NlZCBwYWdlcyBpbiB0aGUgTU0sIG9yIGEgbmVnYXRpdmUgZXJyb3JcXG5tbS9ndXAuYzoxOTgwOiAqIGNvZGUgb24gZXJyb3IgKHNlZSBfX2dldF91c2VyX3BhZ2VzKCkpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXBvcnRzXFxubW0vZ3VwLmMtMTk4MS0gKiBlcnJvcnMgcmVsYXRlZCB0byBWTUFzLCBzdWNoIGFzIGluY29tcGF0aWJsZSBtYXBwaW5ncywgYXMgZXhwZWN0ZWQgYnlcXG4tLVxcbm1tL2d1cC5jPTI3MjI9bG9uZyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9ndXAuYy0yNzMxLS8qKlxcbm1tL2d1cC5jOjI3MzI6ICogZ2V0X3VzZXJfcGFnZXMoKSAtIHBpbiB1c2VyIHBhZ2VzIGluIG1lbW9yeVxcbm1tL2d1cC5jLTI3MzMtICogQHN0YXJ0OiAgICAgIHN0YXJ0aW5nIHVzZXIgYWRkcmVzc1xcbi0tXFxubW0vZ3VwLmMtMjc0NC0gKi9cXG5tbS9ndXAuYzoyNzQ1OmxvbmcgZ2V0X3VzZXJfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG5tbS9ndXAuYy0yNzQ2LVxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxcbi0tXFxubW0vZ3VwLmM9Mjc1Nj1FWFBPUlRfU1lNQk9MKGdldF91c2VyX3BhZ2VzKTtcXG4tLVxcbm1tL2d1cC5jLTI3NjEtICogICAgICBtbWFwX3JlYWRfbG9jayhtbSk7XFxubW0vZ3VwLmM6Mjc2MjogKiAgICAgIGdldF91c2VyX3BhZ2VzKG1tLCAuLi4sIHBhZ2VzLCBOVUxMKTtcXG5tbS9ndXAuYy0yNzYzLSAqICAgICAgbW1hcF9yZWFkX3VubG9jayhtbSk7XFxuLS1cXG5tbS9ndXAuYz0zMzU5PUVYUE9SVF9TWU1CT0xfR1BMKGdldF91c2VyX3BhZ2VzX2Zhc3Rfb25seSk7XFxuLS1cXG5tbS9ndXAuYy0zMzcwLSAqIElmIG5vdCBzdWNjZXNzZnVsLCBpdCB3aWxsIGZhbGwgYmFjayB0byB0YWtpbmcgdGhlIGxvY2sgYW5kXFxubW0vZ3VwLmM6MzM3MTogKiBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkuXFxubW0vZ3VwLmMtMzM3Mi0gKlxcbi0tXFxubW0vZ3VwLmM9MzQ1Nz1FWFBPUlRfU1lNQk9MKHBpbl91c2VyX3BhZ2VzX3JlbW90ZSk7XFxuLS1cXG5tbS9ndXAuYy0zNDY3LSAqXFxubW0vZ3VwLmM6MzQ2ODogKiBOZWFybHkgdGhlIHNhbWUgYXMgZ2V0X3VzZXJfcGFnZXMoKSwgZXhjZXB0IHRoYXQgRk9MTF9UT1VDSCBpcyBub3Qgc2V0LCBhbmRcXG5tbS9ndXAuYy0zNDY5LSAqIEZPTExfUElOIGlzIHNldC5cXG4tLVxcbm1tL2d1cF90ZXN0LmM9MTAxPXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0xNDctXFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG5tbS9ndXBfdGVzdC5jOjE0ODpcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncywgcGFnZXMgKyBpKTtcXG5tbS9ndXBfdGVzdC5jLTE0OS1cXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTY2LVxcdFxcdFxcdGVsc2VcXG5tbS9ndXBfdGVzdC5jOjE2NzpcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE2OC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4tLVxcbm1tL2htbS5jPTYzMT1zdGF0aWMgY29uc3Qgc3RydWN0IG1tX3dhbGtfb3BzIGhtbV93YWxrX29wcyA9IHtcXG4tLVxcbm1tL2htbS5jLTY1NS0gKlxcbm1tL2htbS5jOjY1NjogKiBUaGlzIGlzIHNpbWlsYXIgdG8gZ2V0X3VzZXJfcGFnZXMoKSwgZXhjZXB0IHRoYXQgaXQgY2FuIHJlYWQgdGhlIHBhZ2UgdGFibGVzXFxubW0vaG1tLmMtNjU3LSAqIHdpdGhvdXQgbXV0YXRpbmcgdGhlbSAoaWUgY2F1c2luZyBmYXVsdHMpLlxcbi0tXFxubW0vbWFkdmlzZS5jPTE4ODc9c3RhdGljIGludCBtYWR2aXNlX2RvX2JlaGF2aW9yKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW5faW4sXFxuLS1cXG5tbS9tYWR2aXNlLmMtMTkzOC0gKiAgTUFEVl9ET05URk9SSyAtIG9taXQgdGhpcyBhcmVhIGZyb20gY2hpbGQncyBhZGRyZXNzIHNwYWNlIHdoZW4gZm9ya2luZzpcXG5tbS9tYWR2aXNlLmM6MTkzOTogKlxcdFxcdHR5cGljYWxseSwgdG8gYXZvaWQgQ09XaW5nIHBhZ2VzIHBpbm5lZCBieSBnZXRfdXNlcl9wYWdlcygpLlxcbm1tL21hZHZpc2UuYy0xOTQwLSAqICBNQURWX0RPRk9SSyAtIGNhbmNlbCBNQURWX0RPTlRGT1JLOiBubyBsb25nZXIgb21pdCB0aGlzIGFyZWEgd2hlbiBmb3JraW5nLlxcbi0tXFxubW0vbWVtZmQuYz02Nz1zdHJ1Y3QgZm9saW8gKm1lbWZkX2FsbG9jX2ZvbGlvKHN0cnVjdCBmaWxlICptZW1mZCwgcGdvZmZfdCBpZHgpXFxuLS1cXG5tbS9tZW1mZC5jLTE0Ny0gKiBTZXR0aW5nIFNFQUxfV1JJVEUgcmVxdWlyZXMgdXMgdG8gdmVyaWZ5IHRoZXJlJ3Mgbm8gcGVuZGluZyB3cml0ZXIuIEhvd2V2ZXIsXFxubW0vbWVtZmQuYzoxNDg6ICogdmlhIGdldF91c2VyX3BhZ2VzKCksIGRyaXZlcnMgbWlnaHQgaGF2ZSBzb21lIHBlbmRpbmcgSS9PIHdpdGhvdXQgYW55IGFjdGl2ZVxcbm1tL21lbWZkLmMtMTQ5LSAqIHVzZXItc3BhY2UgbWFwcGluZ3MgKGVnLiwgZGlyZWN0LUlPLCBBSU8pLiBUaGVyZWZvcmUsIHdlIGxvb2sgYXQgYWxsIGZvbGlvc1xcbi0tXFxubW0vbWxvY2suYz01Nzc9c3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRfbW1fbWxvY2tlZF9wYWdlX25yKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0vbWxvY2suYy02MDYtLypcXG5tbS9tbG9jay5jOjYwNzogKiBjb252ZXJ0IGdldF91c2VyX3BhZ2VzKCkgcmV0dXJuIHZhbHVlIHRvIHBvc2l4IG1sb2NrKCkgZXJyb3JcXG5tbS9tbG9jay5jLTYwOC0gKi9cXG4tLVxcbm1tL3BhZ2V3YWxrLmM9ODAwPWludCB3YWxrX3BhZ2VfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBmaXJzdF9pbmRleCxcXG4tLVxcbm1tL3BhZ2V3YWxrLmMtODgxLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCAqbm90KiBiZSB1c2VkIGFzIGEgbmFpdmUgcmVwbGFjZW1lbnQgZm9yXFxubW0vcGFnZXdhbGsuYzo4ODI6ICogZ2V0X3VzZXJfcGFnZXMoKSAvIHBpbl91c2VyX3BhZ2VzKCksIGVzcGVjaWFsbHkgbm90IHRvIHBlcmZvcm0gRE1BIG9yXFxubW0vcGFnZXdhbGsuYy04ODMtICogdG8gY2FyZWxlc3NseSBtb2RpZnkgcGFnZSBjb250ZW50LiBUaGlzIGZ1bmN0aW9uIG1heSAqb25seSogYmUgdXNlZCB0byBncmFiXFxuLS1cXG5tbS92bXNjYW4uYz02Nzk9c3RhdGljIGludCBfX3JlbW92ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbi0tXFxubW0vdm1zY2FuLmMtNzAzLVxcdCAqXFxubW0vdm1zY2FuLmM6NzA0OlxcdCAqIGdldF91c2VyX3BhZ2VzKFxcdTAwMjZwYWdlKTtcXG5tbS92bXNjYW4uYy03MDUtXFx0ICogW3VzZXIgbWFwcGluZyBnb2VzIGF3YXldXFxuLS1cXG5uZXQvcmRzL2luZm8uYz0xMDU9dm9pZCByZHNfaW5mb19pdGVyX3VubWFwKHN0cnVjdCByZHNfaW5mb19pdGVyYXRvciAqaXRlcilcXG4tLVxcbm5ldC9yZHMvaW5mby5jLTExMy0vKlxcbm5ldC9yZHMvaW5mby5jOjExNDogKiBnZXRfdXNlcl9wYWdlcygpIGNhbGxlZCBmbHVzaF9kY2FjaGVfcGFnZSgpIG9uIHRoZSBwYWdlcyBmb3IgdXMuXFxubmV0L3Jkcy9pbmZvLmMtMTE1LSAqL1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvaW9tbXUvaW9tbXVmZC5jPTE4MTI9VEVTVF9GKGlvbW11ZmRfbW9ja19kb21haW4sIHJvX3Vuc2hhcmUpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9pb21tdS9pb21tdWZkLmMtMTgyNi1cXHQgKiBUaGVyZSBoYXZlIGJlZW4gbG90cyBvZiBjaGFuZ2VzIHRvIHRoZSBcXFwidW5zaGFyZVxcXCIgbWVjaGFuaXNtIGluXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvaW9tbXUvaW9tbXVmZC5jOjE4Mjc6XFx0ICogZ2V0X3VzZXJfcGFnZXMoKSwgbWFrZSBzdXJlIGl0IHdvcmtzIHJpZ2h0LiBUaGUgd3JpdGUgdG8gdGhlIHBhZ2VcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9pb21tdS9pb21tdWZkLmMtMTgyOC1cXHQgKiBhZnRlciB3ZSBtYXAgaXQgZm9yIHJlYWRpbmcgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGFzc2lnbmVkIFBGTi5cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfbW50LmMtOC0gKiBwYWdlcyBkdXJpbmcgcmVhZHMoKS4gRHVlIHRvIHRoZSAxcyBkZWxheSBvZiB0aGlzIGZpbGUtc3lzdGVtLCB0aGlzIGlzIGFcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX21udC5jOjk6ICogbmljZSB3YXkgdG8gdGVzdCByYWNlLWNvbmRpdGlvbnMgYWdhaW5zdCBnZXRfdXNlcl9wYWdlcygpIGluIHRoZSBrZXJuZWwuXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYy0xMC0gKlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmMtMy0gKiBtZW1mZCBHVVAgdGVzdC1jYXNlXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmM6NDogKiBUaGlzIHRlc3RzIG1lbWZkIGludGVyYWN0aW9ucyB3aXRoIGdldF91c2VyX3BhZ2VzKCkuIFdlIHJlcXVpcmUgdGhlXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmMtNS0gKiBmdXNlX21udC5jIHByb2dyYW0gdG8gcHJvdmlkZSBhIGZha2UgZGlyZWN0LUlPIEZVU0UgbW91bnQtcG9pbnQgZm9yIHVzLiBUaGlzXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy03LSAqIHJlYWQoKSBvbiBmaWxlcyBpbiB0aGF0IGZpbGUtc3lzdGVtIHdpbGwgcGluIHRoZSByZWNlaXZlLWJ1ZmZlciBwYWdlcyBmb3IgYXRcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYzo4OiAqIGxlYXN0IDFzIHZpYSBnZXRfdXNlcl9wYWdlcygpLlxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfdGVzdC5jLTktICpcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvdm1hL2luY2x1ZGUvZHVwLmg9NjMyPXN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB7XFxuLS1cXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4My1cXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oOjY4NDpcXHQvKiBjYWxsZWQgYnkgYWNjZXNzX3Byb2Nlc3Nfdm0gd2hlbiBnZXRfdXNlcl9wYWdlcygpIGZhaWxzLCB0eXBpY2FsbHlcXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4NS1cXHQgKiBmb3IgdXNlIGJ5IHNwZWNpYWwgVk1Bcy4gU2VlIGFsc28gZ2VuZXJpY19hY2Nlc3NfcGh5cygpIGZvciBhIGdlbmVyaWNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6NDAuMTc0OTQ2MTY0WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgwODM0NDM5MzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgR1VQIFJlZmFjdG9yKipcblxuT2theSwgc28gSSBzZWUgdGhpcyBwYXRjaCBpcyB0YWNrbGluZyB0aGUgY29yZSBcIkdldCBVc2VyIFBhZ2VzXCIgKEdVUCkgbG9naWMgd2l0aGluIGBtbS9ndXAuY2AuIFRoaXMgaXMgYSAqbWFqb3IqIHJlZmFjdG9yLCBhbmQgaXQncyBhIGNyaXRpY2FsIGFyZWEuIGBnZXRfdXNlcl9wYWdlc2AgaXMgdGhlIGxpbmNocGluOyBpdCdzIHRoZSBwcmltYXJ5IEFQSSB1c2VkIGJ5IGEgaHVnZSBudW1iZXIgb2YgZHJpdmVycywgc28gaXQgaGFzIHRvIGJlIG9uIHRoZSBsaXN0LiBJJ2xsIGRlZmluaXRlbHkgYmUgaW5jbHVkaW5nIHRoYXQgb25lLlxuXG5Mb29raW5nIGF0IHRoZSBvdGhlciBmb2N1cyBzeW1ib2xzLCBJIHNlZSB0aGVyZSdzIGEgZmFtaWx5IG9mIGZ1bmN0aW9uczogYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgYXJlIGFsbCByZWxhdGVkIHRvIHBpbm5pbmcgb3IgZmF1bHRpbmcgaW4gdXNlciBwYWdlcywgd2hpY2ggYXJlIHVzZWQgdG8gYWNjZXNzIHVzZXItc3BhY2UgbWVtb3J5IGZyb20gdGhlIGtlcm5lbC4gVGhpcyBhbHNvIHN1Z2dlc3RzIHRoYXQgdGhlcmUgYXJlIHNpbWlsYXIgY2hhbmdlcyB0aGF0IHdlcmUgZG9uZS4gVGhlc2UgYWxsIG5lZWQgdG8gYmUgY2FyZWZ1bGx5IGV4YW1pbmVkIGFzIHdlbGwuIFRoZSBpbXBsaWNhdGlvbnMgb2YgYmF0Y2hpbmcgcGFnZSB0YWJsZSB3YWxrcyBmb3IgdGhlc2UgYXJlIHNpZ25pZmljYW50LlxuXG5BbmQgb2YgY291cnNlLCBjb25zaWRlcmluZyB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYEhVR0VUTEJGU2AgY29uZmlnIG9wdGlvbnMgYXJlIGFsc28gbWVudGlvbmVkLCBJIG5lZWQgdG8ga2VlcCB0aG9zZSBpbiBtaW5kLiBBbnkgY2hhbmdlcyBoZXJlIGNvdWxkIGhhdmUgZmFyLXJlYWNoaW5nIGVmZmVjdHMgd2hlbiB0aG9zZSBmZWF0dXJlcyBhcmUgZW5hYmxlZC5cblxuVGhlIHJlYXNvbmluZyBoZXJlIGlzIHNvbGlkLiBUaGUgcGF0Y2ggaXMgZnVuZGFtZW50YWxseSBjaGFuZ2luZyBob3cgR1VQIHdvcmtzIOKAkyBiYXRjaGluZyBwYWdlIHRhYmxlIHdhbGtzIG1lYW5zIGltcHJvdmVkIHBlcmZvcm1hbmNlLCBidXQgYWxzbyBhIHBvdGVudGlhbCBmb3IgbmV3IGVkZ2UgY2FzZXMgYW5kIHZ1bG5lcmFiaWxpdGllcyB0byBhcHBlYXIuIEJlY2F1c2UgdGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaXMgdG91Y2hlZCBieSBzbyBtYW55IHN5c3RlbSBjYWxscyAobW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KSwgdGhlIGF0dGFjayBzdXJmYWNlIGlzIHN1YnN0YW50aWFsLiBGdXp6aW5nIHRoZSBHVVAgQVBJIGVudHJ5IHBvaW50cyBpcyB0aGUgcmlnaHQgYXBwcm9hY2guXG5cbkknbGwgdXNlIGBzZXQtcmVzdWx0c2AgdG8gcmVwb3J0IHRoaXMuIE15IHJlcG9ydCB3aWxsIGlkZW50aWZ5IHRoZSBzaWduaWZpY2FudCBjaGFuZ2VzIGFuZCB0aGUgZm9jdXMgbmVlZGVkIGZvciBlbnN1cmluZyB0aGUgY29kZSBpcyBjb3JyZWN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjozODA1MywiT3V0cHV0VG9rZW5zIjoyMTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6NDguMjU4MzkzMTk4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE4Njk2MTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiSFVHRVRMQkZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZXNcIixcbiAgICBcImdldF91c2VyX3BhZ2VzX3JlbW90ZVwiLFxuICAgIFwiZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc19yZW1vdGVcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzX3VubG9ja2VkXCIsXG4gICAgXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgICBcInBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBjb3JlIEdldCBVc2VyIFBhZ2VzIChHVVApIGxvZ2ljIGluIGBtbS9ndXAuY2AgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxrcyBhbmQgcmV0dXJuIG11bHRpcGxlIHBhZ2VzIGF0IG9uY2UgaW5zdGVhZCBvZiBvbmUgYnkgb25lLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIHRoYXQgaXMgcmVhY2hhYmxlIHZpYSBtYW55IHN5c2NhbGxzIChlLmcuLCBtbWFwLCBtYWR2aXNlLCBwdHJhY2UsIHByb2Nlc3Nfdm1fcmVhZHYpLiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgZXhwb3J0ZWQgR1VQIEFQSSBlbnRyeSBwb2ludHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkhVR0VUTEJGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF91c2VyX3BhZ2VzXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlc19yZW1vdGVcIixcbiAgICBcImdldF91c2VyX3BhZ2VzX3VubG9ja2VkXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc1wiLFxuICAgIFwicGluX3VzZXJfcGFnZXNfcmVtb3RlXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc191bmxvY2tlZFwiLFxuICAgIFwiZmF1bHRpbl9wYWdlX3JhbmdlXCIsXG4gICAgXCJwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgY29yZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYyBpbiBgbW0vZ3VwLmNgIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MgYW5kIHJldHVybiBtdWx0aXBsZSBwYWdlcyBhdCBvbmNlIGluc3RlYWQgb2Ygb25lIGJ5IG9uZS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSB0aGF0IGlzIHJlYWNoYWJsZSB2aWEgbWFueSBzeXNjYWxscyAoZS5nLiwgbW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KS4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIGV4cG9ydGVkIEdVUCBBUEkgZW50cnkgcG9pbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1Njo0OC4zNzcwOTY4NjVaIiwiU2VxIjozMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzg3OTE2NDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6NDguMzc3NjE4NDM1WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjIzMzg3MzkwODAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2N2U2NzZlOGIwMzhlMDFjY2RjNjI3ODU3NjkzNmQ2MGQ5YjdhYjg0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgMTIgMTY6NTU6MTEgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jXG5pbmRleCAwNjkyMTE5Yjc5MDQzLi4xMDY4MDY2MzRiM2M0IDEwMDY0NFxuLS0tIGEvbW0vZ3VwLmNcbisrKyBiL21tL2d1cC5jXG5AQCAtNjA4LDE1ICs2MDgsMTUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0cmV0dXJuIHBhZ2UgXHUwMDI2XHUwMDI2IFBhZ2VBbm9uKHBhZ2UpIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbitzdGF0aWMgbG9uZyBub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbiB7XG4gXHRpZiAoIShmbGFncyBcdTAwMjYgRk9MTF9EVU1QKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0LypcbiBcdCAqIFdoZW4gY29yZSBkdW1waW5nLCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHVubmVjZXNzYXJ5IHBhZ2VzIG9yXG4tXHQgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIE5VTEwgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsXG4rXHQgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIDAgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsXG4gXHQgKiB0aGVuIGdldF9kdW1wX3BhZ2UoKSB3aWxsIHJldHVybiBOVUxMIHRvIGxlYXZlIGEgaG9sZSBpbiB0aGUgZHVtcC5cbiBcdCAqIEJ1dCB3ZSBjYW4gb25seSBtYWtlIHRoaXMgb3B0aW1pemF0aW9uIHdoZXJlIGEgaG9sZSB3b3VsZCBzdXJlbHlcbiBcdCAqIGJlIHplcm8tZmlsbGVkIGlmIGhhbmRsZV9tbV9mYXVsdCgpIGFjdHVhbGx5IGRpZCBoYW5kbGUgaXQuXG5AQCAtNjI1LDEyICs2MjUsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xuIFxuIFx0XHRpZiAoIWh1Z2V0bGJmc19wYWdlY2FjaGVfcHJlc2VudChoLCB2bWEsIGFkZHJlc3MpKVxuLVx0XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuK1x0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fSBlbHNlIGlmICgodm1hX2lzX2Fub255bW91cyh2bWEpIHx8ICF2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWZhdWx0KSkge1xuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHR9XG4gXG4tXHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBndXBfZmlsbF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBuciwgc3RydWN0IHBhZ2UgKipwYWdlcylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRpZiAoIXBhZ2VzKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKSB7XG4rXHRcdHN0cnVjdCBwYWdlICpzdWJwYWdlID0gcGFnZSArIGk7XG4rXG4rXHRcdHBhZ2VzW2ldID0gc3VicGFnZTtcbitcdFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgYWRkcmVzcyArIGkgKiBQQUdFX1NJWkUpO1xuK1x0XHRmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTtcbitcdH1cbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xuQEAgLTY0NiwzOCArNjYzLDQzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0cmV0dXJuIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHBhZ2UsIHZtYSwgZmxhZ3MpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuIFx0cHVkX3QgcHVkID0gKnB1ZHA7XG4gXHR1bnNpZ25lZCBsb25nIHBmbiA9IHB1ZF9wZm4ocHVkKTtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmLCBucjtcbiBcdGludCByZXQ7XG4gXG4gXHRhc3NlcnRfc3Bpbl9sb2NrZWQocHVkX2xvY2twdHIobW0sIHB1ZHApKTtcbiBcbiBcdGlmICghcHVkX3ByZXNlbnQocHVkKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4gXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZCwgcGZuX3RvX3BhZ2UocGZuKSwgdm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbi1cdHBmbiArPSAoYWRkciBcdTAwMjYgflBVRF9NQVNLKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdG9mZiA9IFBGTl9ET1dOKGFkZHIgXHUwMDI2IH5QVURfTUFTSyk7XG4rXHRwZm4gKz0gb2ZmO1xuIFx0cGFnZSA9IHBmbl90b19wYWdlKHBmbik7XG4gXG4gXHRpZiAoIXB1ZF93cml0ZShwdWQpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU1MSU5LKTtcbitcdFx0cmV0dXJuIC1FTUxJTks7XG4rXG4rXHRuciA9IG1pbihIUEFHRV9QVURfTlIgLSBvZmYsIFBGTl9ET1dOKGVuZCAtIGFkZHIpKTtcbiBcbi1cdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIDEsIGZsYWdzKTtcbitcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7XG4gXHRpZiAocmV0KVxuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0ZWxzZVxuLVx0XHQqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTtcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGlmIChwYWdlcylcbitcdFx0cGFnZXNbMF0gPSBwYWdlO1xuIFxuLVx0cmV0dXJuIHBhZ2U7XG4rXHRyZXR1cm4gbnI7XG4gfVxuIFxuIC8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQTURzIGluIENPVyBtYXBwaW5ncy4gKi9cbkBAIC02OTgsMTQgKzcyMCwxNCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfaHVnZV9wbWRfd3Aodm1hLCBwbWQpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHBtZF90IHBtZHZhbCA9ICpwbWQ7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmLCBucjtcbiBcdGludCByZXQ7XG4gXG4gXHRhc3NlcnRfc3Bpbl9sb2NrZWQocG1kX2xvY2twdHIobW0sIHBtZCkpO1xuQEAgLTcxMyw1MCArNzM1LDU0IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0cGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XG4gXHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbiBcdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kdmFsLCBwYWdlLCB2bWEsIGZsYWdzKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0LyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqL1xuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9EVU1QKSBcdTAwMjZcdTAwMjYgaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4gXHRpZiAocG1kX3Byb3Rub25lKCpwbWQpIFx1MDAyNlx1MDAyNiAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdGlmICghcG1kX3dyaXRlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xuK1x0XHRyZXR1cm4gLUVNTElOSztcbiBcbiBcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIFx1MDAyNlx1MDAyNiBQYWdlQW5vbihwYWdlKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XG4gXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4rXHRvZmYgPSBQRk5fRE9XTihhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuK1x0bnIgPSBtaW4oSFBBR0VfUE1EX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7XG4rXG4rXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpO1xuIFx0aWYgKHJldClcbi1cdFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcbitcdFx0cmV0dXJuIHJldDtcbiBcbiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXG4gXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSlcbiBcdFx0dG91Y2hfcG1kKHZtYSwgYWRkciwgcG1kLCBmbGFncyBcdTAwMjYgRk9MTF9XUklURSk7XG4gI2VuZGlmXHQvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi9cbiBcbi1cdHBhZ2UgKz0gKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcbitcdHBhZ2UgKz0gb2ZmO1xuK1xuK1x0aWYgKHBhZ2VzKVxuK1x0XHRwYWdlc1swXSA9IHBhZ2U7XG4gXG4tXHRyZXR1cm4gcGFnZTtcbitcdHJldHVybiBucjtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwdWRfdCAqcHVkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbi1cdHJldHVybiBOVUxMO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbi1cdHJldHVybiBOVUxMO1xuK1x0cmV0dXJuIDA7XG4gfVxuICNlbmRpZlx0LyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXG4gXG5AQCAtNzk5LDExMCArODI1LDIwNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzKVxuKy8qXG4rICogVGhlIGNhbGxlciBoYXMgYWxyZWFkeSBydW4gZXZlcnkgcGVyLVBURSBzYWZldHkgY2hlY2sgKHByZXNlbnQsXG4rICogd3JpdGUtZmF1bHQsIGd1cF9tdXN0X3Vuc2hhcmUoKSkgb24gdGhlIFBURSwgc28gdGhpcyBvbmx5IGRvZXMgdGhlXG4rICogcGVyLWZvbGlvIHdvcms6IHRoZSByZWZjb3VudCBncmFiLCB0aGUgRk9MTF9QSU4gYWNjZXNzaWJpbGl0eSBmYXVsdC1pbixcbisgKiBkaXJ0eS9hY2Nlc3NlZCBtYXJraW5nLCBhbmQgdGhlIGFycmF5IGZpbGwgd2l0aCB0aGUgY2FjaGUgZmx1c2guXG4rICovXG4rc3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfcHRlX2NvbW1pdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbitcdFx0cHRlX3QgcHRlLCB1bnNpZ25lZCBsb25nIG5yLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4rXHRcdHN0cnVjdCBwYWdlICoqcGFnZXMpXG4re1xuK1x0bG9uZyByZXQ7XG4rXG4rXHQvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqL1xuK1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XG4rXHRpZiAodW5saWtlbHkocmV0KSlcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qXG4rXHQgKiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhZ2UgYWNjZXNzaWJsZSBpZiBhbmQgb25seSBpZiB3ZSBhcmUgZ29pbmdcbitcdCAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZVxuK1x0ICogRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QgZm9yIGRldGFpbHMuXG4rXHQgKi9cbitcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIHtcbitcdFx0cmV0ID0gYXJjaF9tYWtlX2ZvbGlvX2FjY2Vzc2libGUoZm9saW8pO1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0Z3VwX3B1dF9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTtcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHR9XG4rXHR9XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfVE9VQ0gpIHtcbitcdFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhcHRlX2RpcnR5KHB0ZSkgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0LypcbitcdFx0ICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlXG4rXHRcdCAqIGlzIG5lZWRlZCB0byBhdm9pZCBsb3NpbmcgdGhlIGRpcnR5IGJpdDogaXQgaXMgZWFzaWVyIHRvIHVzZVxuK1x0XHQgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuXG4rXHRcdCAqL1xuK1x0XHRmb2xpb19tYXJrX2FjY2Vzc2VkKGZvbGlvKTtcbitcdH1cbitcbitcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZSwgbnIsIHBhZ2VzKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFJlc29sdmUgb25lIHByZXNlbnQgUFRFIHRvIHRoZSBwYWdlIGl0IG1hcHMuIFJldHVybnMgbm8gcGFnZSBhbmQgbm8gZXJyb3JcbisgKiB3aGVuIHRoZSBQVEUgY2Fubm90IGJlIGZvbGxvd2VkIGJ1dCB0aGUgY2FsbGVyIG1heSBmYXVsdCBpdCBpbiwgYW5kIGFcbisgKiBuZWdhdGl2ZSBlcnJubyB3aGVuIHRoZSBjYWxsZXIgbXVzdCByZXBvcnQgdGhlIGZhaWx1cmUuXG4rICovXG4rc3RhdGljIGxvbmcgZm9sbG93X29uZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbitcdFx0cHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VwKVxuIHtcbi1cdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuLVx0c3RydWN0IGZvbGlvICpmb2xpbztcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0cHRlX3QgKnB0ZXAsIHB0ZTtcbi1cdGludCByZXQ7XG4gXG4tXHRwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCBcdTAwMjZwdGwpO1xuLVx0aWYgKCFwdGVwKVxuLVx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbi1cdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuK1x0KnBhZ2VwID0gTlVMTDtcbitcbiBcdGlmICghcHRlX3ByZXNlbnQocHRlKSlcbi1cdFx0Z290byBub19wYWdlO1xuK1x0XHRyZXR1cm4gMDtcbiBcdGlmIChwdGVfcHJvdG5vbmUocHRlKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRnb3RvIG5vX3BhZ2U7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkcmVzcywgcHRlKTtcbiBcbiBcdC8qXG4gXHQgKiBXZSBvbmx5IGNhcmUgYWJvdXQgYW5vbiBwYWdlcyBpbiBjYW5fZm9sbG93X3dyaXRlX3B0ZSgpLlxuIFx0ICovXG4tXHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbi1cdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSkge1xuLVx0XHRwYWdlID0gTlVMTDtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4rXHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjYgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpXG4rXHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKHVubGlrZWx5KCFwYWdlKSkge1xuIFx0XHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkge1xuIFx0XHRcdC8qIEF2b2lkIHNwZWNpYWwgKGxpa2UgemVybykgcGFnZXMgaW4gY29yZSBkdW1wcyAqL1xuLVx0XHRcdHBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGlmIChpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKSB7XG4tXHRcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0cmV0ID0gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7XG4tXHRcdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0XHRnb3RvIG91dDtcbitcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0fVxuK1x0XHRpZiAoIWlzX3plcm9fcGZuKHB0ZV9wZm4ocHRlKSkpXG4rXHRcdFx0cmV0dXJuIGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xuK1x0XHRwYWdlID0gcHRlX3BhZ2UocHRlKTtcbiBcdH1cbi1cdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiBcbi1cdGlmICghcHRlX3dyaXRlKHB0ZSkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpIHtcbi1cdFx0cGFnZSA9IEVSUl9QVFIoLUVNTElOSyk7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuK1x0aWYgKCFwdGVfd3JpdGUocHRlKSBcdTAwMjZcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSlcbitcdFx0cmV0dXJuIC1FTUxJTks7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSBcdTAwMjZcdTAwMjYgUGFnZUFub24ocGFnZSkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpO1xuIFxuLVx0LyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi9cbi1cdHJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCAxLCBmbGFncyk7XG4tXHRpZiAodW5saWtlbHkocmV0KSkge1xuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbitcdCpwYWdlcCA9IHBhZ2U7XG4rXHRyZXR1cm4gMDtcbit9XG4gXG4tXHQvKlxuLVx0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXG4tXHQgKiB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZSBzZWVcbi1cdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuLVx0ICovXG4tXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSB7XG4tXHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbi1cdFx0aWYgKHJldCkge1xuLVx0XHRcdHVucGluX3VzZXJfcGFnZShwYWdlKTtcbi1cdFx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuKy8qXG4rICogUmV0dXJuIGhvdyBtYW55IFBURXMgbWFwIGNvbnNlY3V0aXZlIHBhZ2VzIG9mIHRoZSBzYW1lIGZvbGlvIGFuZCBjYW4gYmVcbisgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuXG4rICpcbisgKiBUaGUgd3JpdGUtZmF1bHQgYW5kIHVuc2hhcmUgY2hlY2tzIGluIGZvbGxvd19vbmVfcHRlKCkgYXJlIHBlciBQVEUsIGJ1dCBhXG4rICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seVxuKyAqIHJ1biB1bmRlciBGT0xMX1dSSVRFIG9yIEZPTExfUElOIGRvZXMgbmVlZCB0aGUgcGVyLXBhZ2UgY2hlY2ssIHNvIGl0IHN0YXlzXG4rICogb25lIHBhZ2UgYXQgYSB0aW1lLlxuKyAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyB3YWxrX2VuZCxcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgKnB0ZXAsIHB0ZV90ICpiYXRjaF9wdGUsIHVuc2lnbmVkIGludCBmbGFncylcbit7XG4rXHR1bnNpZ25lZCBsb25nIG1heDtcbitcbitcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4rXHRcdHJldHVybiAxO1xuK1x0aWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdG1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0aWYgKG1heCBcdTAwM2M9IDEpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0LyogTWVyZ2UgeW91bmcvZGlydHkgYWNyb3NzIGJhdGNoIHNvIGZvbGlvX21hcmtfZGlydHkgc2VlcyBhbnkgZGlydHkuICovXG4rXHRyZXR1cm4gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB0ZXAsIGJhdGNoX3B0ZSwgbWF4LFxuK1x0XHRcdFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7XG4rfVxuK1xuKy8qXG4rICogV2FsayB0aGUgUFRFcyBmcm9tIHRoZSBzdGFydCBhZGRyZXNzIHRvIHRoZSBlbmQgb2YgdGhpcyBwYWdlIHRhYmxlIG9yIFZNQSxcbisgKiB3aGljaGV2ZXIgY29tZXMgZmlyc3QsIGFuZCBjb21taXQgZXZlcnkgcGFnZSBmb3VuZC5cbisgKlxuKyAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0XG4rICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLlxuKyAqL1xuK3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuK3tcbitcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuK1x0Ym9vbCBuZWVkX25vX3BhZ2VfdGFibGUgPSBmYWxzZTtcbitcdHB0ZV90ICpwdGVwLCAqb3JpZ19wdGVwO1xuK1x0dW5zaWduZWQgbG9uZyB3YWxrX2VuZDtcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSAwO1xuK1x0c3BpbmxvY2tfdCAqcHRsO1xuK1x0bG9uZyByZXQgPSAwO1xuK1xuK1x0b3JpZ19wdGVwID0gcHRlcCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgXHUwMDI2cHRsKTtcbitcdGlmICghcHRlcClcbitcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4rXG4rXHR3YWxrX2VuZCA9IG1pbihwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSwgdm1hLVx1MDAzZXZtX2VuZCk7XG4rXG4rXHRmb3IgKDsgYWRkcmVzcyBcdTAwM2Mgd2Fsa19lbmQ7IGFkZHJlc3MgKz0gUEFHRV9TSVpFLCBwdGVwKyspIHtcbitcdFx0cHRlX3QgcHRlID0gcHRlcF9nZXQocHRlcCk7XG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuK1xuK1x0XHRyZXQgPSBmb2xsb3dfb25lX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIHB0ZSwgZmxhZ3MsIFx1MDAyNnBhZ2UpO1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgcGFnZSkge1xuK1x0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuK1x0XHRcdHVuc2lnbmVkIGxvbmcgYmF0Y2g7XG4rXG4rXHRcdFx0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xuK1xuK1x0XHRcdGJhdGNoID0gZm9sbG93X3B0ZV9iYXRjaCh2bWEsIGFkZHJlc3MsIHdhbGtfZW5kLCBmb2xpbyxcbitcdFx0XHRcdFx0XHQgcHRlcCwgXHUwMDI2YmF0Y2hfcHRlLCBmbGFncyk7XG4rXHRcdFx0cmV0ID0gZm9sbG93X3BhZ2VfcHRlX2NvbW1pdCh2bWEsIGFkZHJlc3MsIGZvbGlvLCBwYWdlLFxuK1x0XHRcdFx0XHRcdCAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsXG4rXHRcdFx0XHRcdFx0ICAgICBwYWdlcyA/IHBhZ2VzICsgbnIgOiBOVUxMKTtcbitcdFx0XHRpZiAoIXJldCkge1xuK1x0XHRcdFx0bnIgKz0gYmF0Y2g7XG4rXHRcdFx0XHQvKlxuK1x0XHRcdFx0ICogVGhlIGxvb3AncyBvd24gaW5jcmVtZW50IGNvdmVycyBvbmUgUFRFOyBza2lwXG4rXHRcdFx0XHQgKiB0aGUgcmVzdCBvZiB0aGUgYmF0Y2guXG4rXHRcdFx0XHQgKi9cbitcdFx0XHRcdHB0ZXAgKz0gYmF0Y2ggLSAxO1xuK1x0XHRcdFx0YWRkcmVzcyArPSAoYmF0Y2ggLSAxKSAqIFBBR0VfU0laRTtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbiBcdFx0fVxuLVx0fVxuLVx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSB7XG4tXHRcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgIXB0ZV9kaXJ0eShwdGUpIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpXG4tXHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4rXG4gXHRcdC8qXG4tXHRcdCAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZVxuLVx0XHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2Vcbi1cdFx0ICogZm9saW9fbWFya19hY2Nlc3NlZCgpLlxuK1x0XHQgKiBub19wYWdlX3RhYmxlKCkgbWF5IGxvb2sgdXAgdGhlIHBhZ2UgY2FjaGUsIHNvIGl0IGNhbm5vdCBydW5cbitcdFx0ICogdW5kZXIgdGhlIFBURSBsb2NrLlxuIFx0XHQgKi9cbi1cdFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XG4rXHRcdGlmICghcmV0IFx1MDAyNlx1MDAyNiBwdGVfbm9uZShwdGUpKVxuK1x0XHRcdG5lZWRfbm9fcGFnZV90YWJsZSA9IHRydWU7XG4rXHRcdGJyZWFrO1xuIFx0fVxuLW91dDpcbi1cdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcbi1cdHJldHVybiBwYWdlO1xuLW5vX3BhZ2U6XG4tXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7XG4tXHRpZiAoIXB0ZV9ub25lKHB0ZSkpXG4tXHRcdHJldHVybiBOVUxMO1xuLVx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4rXG4rXHRwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTtcbitcbitcdGlmIChucilcbitcdFx0cmV0dXJuIG5yO1xuK1x0aWYgKG5lZWRfbm9fcGFnZV90YWJsZSlcbitcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwdWRfdCAqcHVkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHBtZF90ICpwbWQsIHBtZHZhbDtcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0bG9uZyByZXQ7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcbiBcdHBtZCA9IHBtZF9vZmZzZXQocHVkcCwgYWRkcmVzcyk7XG5AQCAtOTEyLDcgKzEwMzMsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcG1kX3ByZXNlbnQocG1kdmFsKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSlcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXG4gXHRpZiAocG1kX3Byb3Rub25lKHBtZHZhbCkgXHUwMDI2XHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG5AQCAtOTI1LDI4ICsxMDQ2LDM1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0fVxuIFx0aWYgKHVubGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSkge1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuLVx0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4rXHRcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdH1cbiBcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IEZPTExfU1BMSVRfUE1EKSkge1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuIFx0XHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcyk7XG4gXHRcdC8qIElmIHBtZCB3YXMgbGVmdCBlbXB0eSwgc3R1ZmYgYSBwYWdlIHRhYmxlIGluIHRoZXJlIHF1aWNrbHkgKi9cbi1cdFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IEVSUl9QVFIoLUVOT01FTSkgOlxuLVx0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gLUVOT01FTSA6XG4rXHRcdFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXHR9XG4tXHRwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdHJldCA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdHJldHVybiBwYWdlO1xuK1xuK1x0LypcbitcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbCB0aGVcbitcdCAqIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgcG1kIGxvY2suXG4rXHQgKi9cbitcdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IHBhZ2VzKVxuK1x0XHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTtcbitcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcDRkX3QgKnA0ZHAsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHA0ZF90ICpwNGRwLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0cHVkX3QgKnB1ZHAsIHB1ZDtcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0bG9uZyByZXQ7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcbiBcdHB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpO1xuQEAgLTk1NSwyMiArMTA4MywyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAocHVkX2xlYWYocHVkKSkge1xuIFx0XHRwdGwgPSBwdWRfbG9jayhtbSwgcHVkcCk7XG4tXHRcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cmV0ID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuLVx0XHRpZiAocGFnZSlcbi1cdFx0XHRyZXR1cm4gcGFnZTtcbitcdFx0LypcbitcdFx0ICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsXG4rXHRcdCAqIHRoZSBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIGxvY2suIEEgMSBHQiBmb2xpb1xuK1x0XHQgKiBjYW4gYmUgdXAgdG8gSFBBR0VfUFVEX05SIHBhZ2VzLCB0b28gbG9uZyB0byBmbHVzaCB1bmRlciBhXG4rXHRcdCAqIHNwaW5sb2NrLlxuK1x0XHQgKi9cbitcdFx0aWYgKHJldCBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgcGFnZXMpXG4rXHRcdFx0Z3VwX2ZpbGxfcGFnZXModm1hLCBhZGRyZXNzLCBwYWdlc1swXSwgcmV0LCBwYWdlcyk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHR9XG4gXHRpZiAodW5saWtlbHkocHVkX2JhZChwdWQpKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBnZF90ICpwZ2RwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ2RfdCAqcGdkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHA0ZF90ICpwNGRwLCBwNGQ7XG4gXG5AQCAtOTgxLDE1ICsxMTE2LDE4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwNGRfcHJlc2VudChwNGQpIHx8IHA0ZF9iYWQocDRkKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgcDRkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwNGRwLCBmbGFncywgcGFnZXMpO1xuIH1cbiBcbiAvKipcbi0gKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3NcbisgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBwYWdlcyBhdCBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4gICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzc1xuICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcbiAgKiBAZmxhZ3M6IGZsYWdzIG1vZGlmeWluZyBsb29rdXAgYmVoYXZpb3VyXG4tICogQHBhZ2VfbWFzazogYSBwb2ludGVyIHRvIG91dHB1dCBwYWdlX21hc2tcbisgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG9cbisgKiAgICAgICAgIHdhbGsgdGhlIHBhZ2UgdGFibGVzIChlLmcuIHRvIGZhdWx0IHBhZ2VzIGluKSB3aXRob3V0IGNvbGxlY3RpbmdcbisgKiAgICAgICAgIG9yIHJlZmNvdW50aW5nIHRoZW1cbiAgKlxuICAqIEBmbGFncyBjYW4gaGF2ZSBGT0xMXyBmbGFncyBzZXQsIGRlZmluZWQgaW4gXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICAqXG5AQCAtOTk4LDMzICsxMTM2LDMyIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxuICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLlxuICAqXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXG4tICpcbi0gKiBSZXR1cm46IHRoZSBtYXBwZWQgKHN0cnVjdCBwYWdlICopLCAlTlVMTCBpZiBubyBtYXBwaW5nIGV4aXN0cywgb3Jcbi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXG4tICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLlxuKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIHRoYXQgd2VyZVxuKyAqIHBsYWNlZCBpbnRvIEBwYWdlcyAoaWYgbm9uLU5VTEwpLCB3aGljaCBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgcGFnZXNcbisgKiByZXF1ZXN0ZWQgdmlhIEBlbmQ7IDAgaWYgbm8gbWFwcGluZyBleGlzdHMgYXQgQGFkZHJlc3M7IG9yIGEgbmVnYXRpdmVcbisgKiBlcnJubyBmb3IgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWQgYnkgYSBwYWdlIGRlc2NyaXB0b3JcbisgKiAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXG4gICovXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0cGdkX3QgKnBnZDtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRsb25nIHJldDtcbiBcbiBcdHZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTtcbiBcbi1cdCpwYWdlX21hc2sgPSAwO1xuIFx0cGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7XG4gXG4gXHRpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpXG4tXHRcdHBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1x0XHRyZXQgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0ZWxzZVxuLVx0XHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cmV0ID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwZ2QsIGZsYWdzLCBwYWdlcyk7XG4gXG4gXHR2bWFfcGd0YWJsZV93YWxrX2VuZCh2bWEpO1xuIFxuLVx0cmV0dXJuIHBhZ2U7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbkBAIC0xMzU4LDcgKzE0OTUsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIHtcbiBcdGxvbmcgcmV0ID0gMCwgaSA9IDA7XG4gXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XG4tXHR1bnNpZ25lZCBsb25nIHBhZ2VfbWFzayA9IDA7XG4gXG4gXHRpZiAoIW5yX3BhZ2VzKVxuIFx0XHRyZXR1cm4gMDtcbkBAIC0xMzczLDcgKzE1MDksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0ZG8ge1xuIFx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xuK1x0XHRsb25nIG5yO1xuIFxuIFx0XHQvKiBmaXJzdCBpdGVyYXRpb24gb3IgY3Jvc3Mgdm1hIGJvdW5kICovXG4gXHRcdGlmICghdm1hIHx8IHN0YXJ0IFx1MDAzZT0gdm1hLVx1MDAzZXZtX2VuZCkge1xuQEAgLTE0MDAsOCArMTUzNiwxMiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0XHRcdHBhZ2VzID8gXHUwMDI2cGFnZSA6IE5VTEwpO1xuIFx0XHRcdFx0aWYgKHJldClcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0XHRwYWdlX21hc2sgPSAwO1xuLVx0XHRcdFx0Z290byBuZXh0X3BhZ2U7XG4rXHRcdFx0XHRndXBfZmlsbF9wYWdlcyh2bWEsIHN0YXJ0LCBwYWdlLCAxLFxuK1x0XHRcdFx0XHQgICAgICAgcGFnZXMgPyBwYWdlcyArIGkgOiBOVUxMKTtcbitcdFx0XHRcdGkrKztcbitcdFx0XHRcdHN0YXJ0ICs9IFBBR0VfU0laRTtcbitcdFx0XHRcdG5yX3BhZ2VzLS07XG4rXHRcdFx0XHRjb250aW51ZTtcbiBcdFx0XHR9XG4gXG4gXHRcdFx0aWYgKCF2bWEpIHtcbkBAIC0xNDIzLDEwICsxNTYzLDExIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXG4tXHRcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgXHUwMDI2cGFnZV9tYXNrKTtcbi1cdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuK1x0XHRuciA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgKyBucl9wYWdlcyAqIFBBR0VfU0laRSxcbitcdFx0XHRcdCAgICAgIGd1cF9mbGFncywgcGFnZXMgPyBcdTAwMjZwYWdlc1tpXSA6IE5VTEwpO1xuK1x0XHRpZiAoIW5yIHx8IG5yID09IC1FTUxJTkspIHtcbiBcdFx0XHRyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLFxuLVx0XHRcdFx0XHQgICBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkssIGxvY2tlZCk7XG4rXHRcdFx0XHRcdCAgIG5yID09IC1FTUxJTkssIGxvY2tlZCk7XG4gXHRcdFx0c3dpdGNoIChyZXQpIHtcbiBcdFx0XHRjYXNlIDA6XG4gXHRcdFx0XHRnb3RvIHJldHJ5O1xuQEAgLTE0NDAsNzAgKzE1ODEsMzAgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbiBcdFx0XHRCVUcoKTtcbi1cdFx0fSBlbHNlIGlmIChQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcbitcdFx0fSBlbHNlIGlmIChuciA9PSAtRUVYSVNUKSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiBQcm9wZXIgcGFnZSB0YWJsZSBlbnRyeSBleGlzdHMsIGJ1dCBubyBjb3JyZXNwb25kaW5nXG4gXHRcdFx0ICogc3RydWN0IHBhZ2UuIElmIHRoZSBjYWxsZXIgZXhwZWN0cyAqKnBhZ2VzIHRvIGJlXG4gXHRcdFx0ICogZmlsbGVkIGluLCBiYWlsIG91dCBub3csIGJlY2F1c2UgdGhhdCBjYW4ndCBiZSBkb25lXG4tXHRcdFx0ICogZm9yIHRoaXMgcGFnZS5cbitcdFx0XHQgKiBmb3IgdGhpcyBwYWdlLiBPdGhlcndpc2UgYWR2YW5jZSBieSB0aGUgb25lIHBhZ2VcbitcdFx0XHQgKiBmb2xsb3dfcGFnZV9tYXNrKCkgbG9va2VkIGF0LlxuIFx0XHRcdCAqL1xuIFx0XHRcdGlmIChwYWdlcykge1xuLVx0XHRcdFx0cmV0ID0gUFRSX0VSUihwYWdlKTtcbitcdFx0XHRcdHJldCA9IG5yO1xuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuLVx0XHR9IGVsc2UgaWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4rXHRcdFx0bnIgPSAxO1xuK1x0XHR9IGVsc2UgaWYgKG5yIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gbnI7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbi1uZXh0X3BhZ2U6XG4tXHRcdHBhZ2VfaW5jcmVtID0gMSArICh+KHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgcGFnZV9tYXNrKTtcbi1cdFx0aWYgKHBhZ2VfaW5jcmVtIFx1MDAzZSBucl9wYWdlcylcbi1cdFx0XHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xuLVxuLVx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZTtcbi1cdFx0XHR1bnNpZ25lZCBpbnQgajtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRoaXMgbXVzdCBiZSBhIGxhcmdlIGZvbGlvIChhbmQgZG9lc24ndCBuZWVkIHRvXG4tXHRcdFx0ICogYmUgdGhlIHdob2xlIGZvbGlvOyBpdCBjYW4gYmUgcGFydCBvZiBpdCksIGRvXG4tXHRcdFx0ICogdGhlIHJlZmNvdW50IHdvcmsgZm9yIGFsbCB0aGUgc3VicGFnZXMgdG9vLlxuLVx0XHRcdCAqXG4tXHRcdFx0ICogTk9URTogaGVyZSB0aGUgcGFnZSBtYXkgbm90IGJlIHRoZSBoZWFkIHBhZ2Vcbi1cdFx0XHQgKiBlLmcuIHdoZW4gc3RhcnQgYWRkciBpcyBub3QgdGhwLXNpemUgYWxpZ25lZC5cbi1cdFx0XHQgKiB0cnlfZ3JhYl9mb2xpbygpIHNob3VsZCBoYXZlIHRha2VuIGNhcmUgb2YgdGFpbFxuLVx0XHRcdCAqIHBhZ2VzLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChwYWdlX2luY3JlbSBcdTAwM2UgMSkge1xuLVx0XHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXG4tXHRcdFx0XHQvKlxuLVx0XHRcdFx0ICogU2luY2Ugd2UgYWxyZWFkeSBob2xkIHJlZmNvdW50IG9uIHRoZVxuLVx0XHRcdFx0ICogbGFyZ2UgZm9saW8sIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuXG4tXHRcdFx0XHQgKi9cbi1cdFx0XHRcdGlmICh0cnlfZ3JhYl9mb2xpbyhmb2xpbywgcGFnZV9pbmNyZW0gLSAxLFxuLVx0XHRcdFx0XHRcdCAgIGd1cF9mbGFncykpIHtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogUmVsZWFzZSB0aGUgMXN0IHBhZ2UgcmVmIGlmIHRoZVxuLVx0XHRcdFx0XHQgKiBmb2xpbyBpcyBwcm9ibGVtYXRpYywgZmFpbCBoYXJkLlxuLVx0XHRcdFx0XHQgKi9cbi1cdFx0XHRcdFx0Z3VwX3B1dF9mb2xpbyhmb2xpbywgMSwgZ3VwX2ZsYWdzKTtcbi1cdFx0XHRcdFx0cmV0ID0gLUVGQVVMVDtcbi1cdFx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuLVxuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhZ2VfaW5jcmVtOyBqKyspIHtcbi1cdFx0XHRcdHN1YnBhZ2UgPSBwYWdlICsgajtcbi1cdFx0XHRcdHBhZ2VzW2kgKyBqXSA9IHN1YnBhZ2U7XG4tXHRcdFx0XHRmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBzdGFydCArIGogKiBQQUdFX1NJWkUpO1xuLVx0XHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7XG4tXHRcdFx0fVxuLVx0XHR9XG4rXHRcdC8qIENoZWNrIHRoYXQgd2UgZGlkbid0IHBpbiBtb3JlIHBhZ2VzIHRoYW4gdGhlIGNhbGxlciB3aWxsIGZyZWUuICovXG4rXHRcdFZNX1dBUk5fT05fT05DRShuciBcdTAwM2UgbnJfcGFnZXMpO1xuIFxuLVx0XHRpICs9IHBhZ2VfaW5jcmVtO1xuLVx0XHRzdGFydCArPSBwYWdlX2luY3JlbSAqIFBBR0VfU0laRTtcbi1cdFx0bnJfcGFnZXMgLT0gcGFnZV9pbmNyZW07XG4rXHRcdGkgKz0gbnI7XG4rXHRcdHN0YXJ0ICs9IG5yICogUEFHRV9TSVpFO1xuK1x0XHRucl9wYWdlcyAtPSBucjtcbiBcdH0gd2hpbGUgKG5yX3BhZ2VzKTtcbiBvdXQ6XG4gXHRyZXR1cm4gaSA/IGkgOiByZXQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1Njo0OC4zNzc2MTk2MzVaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjMzODczNzAyNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudCBvZiBHVVAgQmF0Y2hpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgZGl2aW5nIGludG8gYG1tL2d1cC5jYCwgdGhlIGhlYXJ0IG9mIEdldCBVc2VyIFBhZ2VzLCBhbmQgaXQncyBhbGwgYWJvdXQgb3B0aW1pemluZyBob3cgd2Ugd2FsayBhbmQgYmF0Y2ggcGFnZSB0YWJsZXMuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgdG8gYmUgcmVmYWN0b3JpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGF0IHBhZ2UgdGFibGUgd2Fsa2luZyBhbmQgYmF0Y2hpbmc6IGBmb2xsb3dfcGFnZV9tYXNrYCwgYGZvbGxvd19odWdlX3B1ZGAsIGBmb2xsb3dfaHVnZV9wbWRgLCBhbmQgYGZvbGxvd19wYWdlX3B0ZWAuIEl0J3MgaW50cm9kdWNpbmcgbmV3IGZ1bmN0aW9ucyBsaWtlIGBmb2xsb3dfcGFnZV9wdGVfY29tbWl0YCwgYGZvbGxvd19vbmVfcHRlYCwgYW5kIGBmb2xsb3dfcHRlX2JhdGNoYCB0byBoYW5kbGUgUFRFIHByb2Nlc3NpbmcgaW4gYmF0Y2hlcy4gVGhlIHJldHVybiB0eXBlcyBhcmUgYWxzbyBjaGFuZ2VkIGZyb20gYHN0cnVjdCBwYWdlICpgIHRvIGBsb25nYCB0byByZWZsZWN0IGVpdGhlciB0aGUgbnVtYmVyIG9mIHBhZ2VzIHByb2Nlc3NlZCBvciBhbiBlcnJvciBjb2RlLiBgX19nZXRfdXNlcl9wYWdlc2AgaXMgdXBkYXRlZCB0byB1dGlsaXplIHRoZSBuZXcgYmF0Y2hlZCBhcHByb2FjaC5cblxuVGhlIGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeS4gQXJlIHdlIGNyZWF0aW5nIGFueSByaXNrcyBoZXJlPyBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBtYWlubHkgYWJvdXQgdGhlIG1lY2hhbmljcyBvZiAqcGlubmluZyogcGFnZXMgYW5kIHBvdGVudGlhbGx5IHJlZmNvdW50aW5nIHRoZW0gYW5kIGRvZXMgbm90IHNlbmQgYW55IG5ldyBzdHJ1Y3R1cmVzIHRvIHRoZSB1c2VyLiBUaGVyZSdzIG5vIGZhbmN5IG5ldyBkYXRhIGJlaW5nIGFsbG9jYXRlZCwgZmlsbGVkLCBhbmQgdGhlbiBoYW5kZWQgb3ZlciB0byB1c2VyIHNwYWNlIHdoZXJlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIG1pZ2h0IGxlYWsuIEkgYWxzbyBkb24ndCBzZWUgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgKmRlcGVuZHMqIG9uIHRoZSB2YWx1ZSBvZiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBhbnkgbmV3IGNvZGUgb3IgYnJhbmNoZXMuXG5cbkhvd2V2ZXIsIEdVUCBpdHNlbGYgaXMgaW50ZXJlc3RpbmcuIEdVUCAqZG9lcyogcGluIHVzZXIgcGFnZXMuIElmIHRoZXJlIGlzIGEgYnVnLCBpbmNvcnJlY3QgcGlubmluZyAqY291bGQqIGxlYWQgdG8gY29ycnVwdGlvbiwgdXNlLWFmdGVyLWZyZWUsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiBUaG9zZSBjYW4gYWxsIGJlIGNhdWdodCBieSBLQVNBTi4gV2UgYXJlIGxvb2tpbmcgZm9yIHNvbWV0aGluZyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoICpiZXR0ZXIqIHRoYW4gS0FTQU4uIEl0J3MgYSBjb3JlIE1NIG1lY2hhbmlzbSwgc28gYnVncyBoZXJlIGFyZSBtb3JlIGxpa2VseSB0byBjcmFzaCwgcGFnZSBmYXVsdCwgb3IgY2F1c2UgZGF0YSBjb3JydXB0aW9uLiBOb3csIEtNU0FOIGRldGVjdHMgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCByaWdodD8gTGV0J3MgY29uc2lkZXIuXG5cblRoZSBgcGFnZXNgIGFycmF5IHBhc3NlZCB0byBgZm9sbG93X3BhZ2VfbWFza2AgaXMgd2hlcmUgdGhlIHJldHVybmVkIHBhZ2VzIGVuZCB1cC4gSXQgZ2V0cyBmaWxsZWQgYnkgYGd1cF9maWxsX3BhZ2VzYC4gVGhlIHJpc2sgaXMgKmlmKiBgZ3VwX2ZpbGxfcGFnZXNgIGZhaWxzIHRvIGZpbGwgdGhlIHdob2xlIGFycmF5IGJ1dCByZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIChzdWNjZXNzKSwgdGhhdCB3b3VsZCBtZWFuIHRoYXQgdGhlIGNhbGxlciB3b3VsZCBoYXZlIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkuIExldCdzIGxvb2sgYXQgYGd1cF9maWxsX3BhZ2VzYDpcblxuYGBgY1xuK3N0YXRpYyB2b2lkIGd1cF9maWxsX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdGlmICghcGFnZXMpXG4rXHRcdHJldHVybjtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspIHtcbitcdFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICsgaTtcbitcbitcdFx0cGFnZXNbaV0gPSBzdWJwYWdlO1xuK1x0XHRmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBhZGRyZXNzICsgaSAqIFBBR0VfU0laRSk7XG4rXHRcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xuK1x0fVxuK31cbmBgYFxuXG5JdCBmaWxscyBgcGFnZXNbMF1gIHRocm91Z2ggYHBhZ2VzW25yIC0gMV1gLiBJZiBgZm9sbG93X3BhZ2VfbWFza2AgcmV0dXJucyBgbnJgLCBpdCAqc2hvdWxkKiBtZWFuIGBucmAgcGFnZXMgaGF2ZSBiZWVuIGZpbGxlZC4gSW4gYF9fZ2V0X3VzZXJfcGFnZXNgLCB3ZSdyZSBpdGVyYXRpbmcgYW5kIGluY3JlbWVudGluZyB0aGUgYXJyYXksIGBpICs9IG5yYC4gVGhlIGNhbGxlciBhbGxvY2F0ZXMgYHBhZ2VzYCBhbmQgZXhwZWN0cyBgcGFnZXNbMF1gIHRocm91Z2ggYHBhZ2VzW2ktMV1gIHRvIGJlIGluaXRpYWxpemVkLiBCdXQgaXMgdGhlcmUgYSBzY2VuYXJpbyB3aGVyZSBgZm9sbG93X3BhZ2VfbWFza2AgcmV0dXJucyBgbnIgXHUwMDNlIDBgIGJ1dCBkb2Vzbid0IGZpbGwgdGhlIGVudGlyZSBhcnJheT9cblxuSGVyZSdzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIGBmb2xsb3dfaHVnZV9wdWRgOlxuXG5gYGBjXG4rXHRpZiAocGFnZXMpXG4rXHRcdHBhZ2VzWzBdID0gcGFnZTtcbitcbitcdHJldHVybiBucjtcbmBgYFxuXG5JdCBvbmx5IHNldHMgYHBhZ2VzWzBdID0gcGFnZWAhIFdoYXQgaWYgYG5yIFx1MDAzZSAxYD8gQW5kIHRoZSBjYWxsc2l0ZSBpcyBpbiBgZm9sbG93X3B1ZF9tYXNrYDpcblxuYGBgY1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRcdHJldCA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0aWYgKHBhZ2UpXG4tXHRcdFx0cmV0dXJuIHBhZ2U7XG4rXHRcdC8qXG4rXHRcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxuK1x0XHQgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW9cbitcdFx0ICogY2FuIGJlXG5cbiIsIklucHV0VG9rZW5zIjoxMTA4NiwiT3V0cHV0VG9rZW5zIjoxNTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMTYyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTc6MTEuNzY0OTkyOTc2WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ1OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-12 16:40:27 +0000 UTC FinishedAt: 2026-08-12 16:57:13 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "HUGETLBFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "HUGETLBFS" ], "series_id": "1a350144-2334-47f4-b57e-ffb039f7a32f" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "get_user_pages", "get_user_pages_remote", "get_user_pages_unlocked", "pin_user_pages", "pin_user_pages_remote", "pin_user_pages_unlocked", "faultin_page_range", "populate_vma_page_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0hVR0VUTEJGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzX3JlbW90ZSYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc191bmxvY2tlZCYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgICAmIzM0O3BvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIEdldCBVc2VyIFBhZ2VzIChHVVApIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa2luZyBhbmQgcmVmY291bnRpbmcuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMgYnV0IGRvZXMgbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGhhbmRsZSBjb21wbGV4IHBhcnNpbmcgd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgY291bGQgYmUgbGVha2VkLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGluY29ycmVjdCBudW1iZXIgb2YgcHJvY2Vzc2VkIHBhZ2VzLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkpIHdvdWxkIHJlc3VsdCBpbiB3aWxkIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBwYWdlIHJlZmVyZW5jZSBpbWJhbGFuY2VzLiBUaGVzZSB0eXBlcyBvZiBlcnJvcnMgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgY29yZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYyBpbiBgbW0vZ3VwLmNgIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MgYW5kIHJldHVybiBtdWx0aXBsZSBwYWdlcyBhdCBvbmNlIGluc3RlYWQgb2Ygb25lIGJ5IG9uZS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSB0aGF0IGlzIHJlYWNoYWJsZSB2aWEgbWFueSBzeXNjYWxscyAoZS5nLiwgbW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KS4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIGV4cG9ydGVkIEdVUCBBUEkgZW50cnkgcG9pbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNjdlNjc2ZThiMDM4ZTAxY2NkYzYyNzg1NzY5MzZkNjBkOWI3YWI4NFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmNcbmluZGV4IDA2OTIxMTliNzkwNDMuLjEwNjgwNjYzNGIzYzQgMTAwNjQ0XG4tLS0gYS9tbS9ndXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmNcbkBAIC02MDgsMTUgJiM0Mzs2MDgsMTUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0cmV0dXJuIHBhZ2UgXHUwMDI2XHUwMDI2IFBhZ2VBbm9uKHBhZ2UpIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbiYjNDM7c3RhdGljIGxvbmcgbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzKVxuIHtcbiBcdGlmICghKGZsYWdzIFx1MDAyNiBGT0xMX0RVTVApKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0LypcbiBcdCAqIFdoZW4gY29yZSBkdW1waW5nLCB3ZSBkb24mIzM5O3Qgd2FudCB0byBhbGxvY2F0ZSB1bm5lY2Vzc2FyeSBwYWdlcyBvclxuLVx0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiBOVUxMIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxuJiM0MztcdCAqIHBhZ2UgdGFibGVzLiAgUmV0dXJuIGVycm9yIGluc3RlYWQgb2YgMCB0byBza2lwIGhhbmRsZV9tbV9mYXVsdCxcbiBcdCAqIHRoZW4gZ2V0X2R1bXBfcGFnZSgpIHdpbGwgcmV0dXJuIE5VTEwgdG8gbGVhdmUgYSBob2xlIGluIHRoZSBkdW1wLlxuIFx0ICogQnV0IHdlIGNhbiBvbmx5IG1ha2UgdGhpcyBvcHRpbWl6YXRpb24gd2hlcmUgYSBob2xlIHdvdWxkIHN1cmVseVxuIFx0ICogYmUgemVyby1maWxsZWQgaWYgaGFuZGxlX21tX2ZhdWx0KCkgYWN0dWFsbHkgZGlkIGhhbmRsZSBpdC5cbkBAIC02MjUsMTIgJiM0Mzs2MjUsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xuIFxuIFx0XHRpZiAoIWh1Z2V0bGJmc19wYWdlY2FjaGVfcHJlc2VudChoLCB2bWEsIGFkZHJlc3MpKVxuLVx0XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdH0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VmYXVsdCkpIHtcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdH1cbiBcbi1cdHJldHVybiBOVUxMO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBndXBfZmlsbF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnIsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdGlmICghcGFnZXMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICYjNDM7IGk7XG4mIzQzO1xuJiM0MztcdFx0cGFnZXNbaV0gPSBzdWJwYWdlO1xuJiM0MztcdFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgYWRkcmVzcyAmIzQzOyBpICogUEFHRV9TSVpFKTtcbiYjNDM7XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xuJiM0MztcdH1cbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xuQEAgLTY0NiwzOCAmIzQzOzY2Myw0MyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihwYWdlLCB2bWEsIGZsYWdzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHB1ZF90IHB1ZCA9ICpwdWRwO1xuIFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwdWRfcGZuKHB1ZCk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvZmYsIG5yO1xuIFx0aW50IHJldDtcbiBcbiBcdGFzc2VydF9zcGluX2xvY2tlZChwdWRfbG9ja3B0cihtbSwgcHVkcCkpO1xuIFxuIFx0aWYgKCFwdWRfcHJlc2VudChwdWQpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4gXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZCwgcGZuX3RvX3BhZ2UocGZuKSwgdm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4gXG4tXHRwZm4gJiM0Mzs9IChhZGRyIFx1MDAyNiB+UFVEX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdG9mZiA9IFBGTl9ET1dOKGFkZHIgXHUwMDI2IH5QVURfTUFTSyk7XG4mIzQzO1x0cGZuICYjNDM7PSBvZmY7XG4gXHRwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcbiBcbiBcdGlmICghcHVkX3dyaXRlKHB1ZCkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xuJiM0MztcdFx0cmV0dXJuIC1FTUxJTks7XG4mIzQzO1xuJiM0MztcdG5yID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpO1xuIFxuLVx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xuJiM0MztcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7XG4gXHRpZiAocmV0KVxuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0ZWxzZVxuLVx0XHQqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChwYWdlcylcbiYjNDM7XHRcdHBhZ2VzWzBdID0gcGFnZTtcbiBcbi1cdHJldHVybiBwYWdlO1xuJiM0MztcdHJldHVybiBucjtcbiB9XG4gXG4gLyogRk9MTF9GT1JDRSBjYW4gd3JpdGUgdG8gZXZlbiB1bndyaXRhYmxlIFBNRHMgaW4gQ09XIG1hcHBpbmdzLiAqL1xuQEAgLTY5OCwxNCAmIzQzOzcyMCwxNCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfaHVnZV9wbWRfd3Aodm1hLCBwbWQpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHBtZF90IHBtZHZhbCA9ICpwbWQ7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XG4gXHRpbnQgcmV0O1xuIFxuIFx0YXNzZXJ0X3NwaW5fbG9ja2VkKHBtZF9sb2NrcHRyKG1tLCBwbWQpKTtcbkBAIC03MTMsNTAgJiM0Mzs3MzUsNTQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRwYWdlID0gcG1kX3BhZ2UocG1kdmFsKTtcbiBcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICFjYW5fZm9sbG93X3dyaXRlX3BtZChwbWR2YWwsIHBhZ2UsIHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0LyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqL1xuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9EVU1QKSBcdTAwMjZcdTAwMjYgaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZSgqcG1kKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKCFwbWRfd3JpdGUocG1kdmFsKSBcdTAwMjZcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVNTElOSztcbiBcbiBcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIFx1MDAyNlx1MDAyNiBQYWdlQW5vbihwYWdlKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XG4gXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4mIzQzO1x0b2ZmID0gUEZOX0RPV04oYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiYjNDM7XHRuciA9IG1pbihIUEFHRV9QTURfTlIgLSBvZmYsIFBGTl9ET1dOKGVuZCAtIGFkZHIpKTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgbnIsIGZsYWdzKTtcbiBcdGlmIChyZXQpXG4tXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuIFxuICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VcbiBcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IEZPTExfVE9VQ0gpKVxuIFx0XHR0b3VjaF9wbWQodm1hLCBhZGRyLCBwbWQsIGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKTtcbiAjZW5kaWZcdC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqL1xuIFxuLVx0cGFnZSAmIzQzOz0gKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcbiYjNDM7XHRwYWdlICYjNDM7PSBvZmY7XG4mIzQzO1xuJiM0MztcdGlmIChwYWdlcylcbiYjNDM7XHRcdHBhZ2VzWzBdID0gcGFnZTtcbiBcbi1cdHJldHVybiBwYWdlO1xuJiM0MztcdHJldHVybiBucjtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxuJiM0MztcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbi1cdHJldHVybiBOVUxMO1xuJiM0MztcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4tXHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gI2VuZGlmXHQvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi9cbiBcbkBAIC03OTksMTEwICYjNDM7ODI1LDIwNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzKVxuJiM0MzsvKlxuJiM0MzsgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IHJ1biBldmVyeSBwZXItUFRFIHNhZmV0eSBjaGVjayAocHJlc2VudCxcbiYjNDM7ICogd3JpdGUtZmF1bHQsIGd1cF9tdXN0X3Vuc2hhcmUoKSkgb24gdGhlIFBURSwgc28gdGhpcyBvbmx5IGRvZXMgdGhlXG4mIzQzOyAqIHBlci1mb2xpbyB3b3JrOiB0aGUgcmVmY291bnQgZ3JhYiwgdGhlIEZPTExfUElOIGFjY2Vzc2liaWxpdHkgZmF1bHQtaW4sXG4mIzQzOyAqIGRpcnR5L2FjY2Vzc2VkIG1hcmtpbmcsIGFuZCB0aGUgYXJyYXkgZmlsbCB3aXRoIHRoZSBjYWNoZSBmbHVzaC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpwYWdlLFxuJiM0MztcdFx0cHRlX3QgcHRlLCB1bnNpZ25lZCBsb25nIG5yLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIHRyeV9ncmFiX2ZvbGlvKCkgZG9lcyBub3RoaW5nIHVubGVzcyBGT0xMX0dFVCBvciBGT0xMX1BJTiBpcyBzZXQuICovXG4mIzQzO1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XG4mIzQzO1x0aWYgKHVubGlrZWx5KHJldCkpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFdlIG5lZWQgdG8gbWFrZSB0aGUgcGFnZSBhY2Nlc3NpYmxlIGlmIGFuZCBvbmx5IGlmIHdlIGFyZSBnb2luZ1xuJiM0MztcdCAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZVxuJiM0MztcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIHtcbiYjNDM7XHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbiYjNDM7XHRcdGlmIChyZXQpIHtcbiYjNDM7XHRcdFx0Z3VwX3B1dF9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSB7XG4mIzQzO1x0XHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAhcHRlX2RpcnR5KHB0ZSkgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlXG4mIzQzO1x0XHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2VcbiYjNDM7XHRcdCAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2UsIG5yLCBwYWdlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yXG4mIzQzOyAqIHdoZW4gdGhlIFBURSBjYW5ub3QgYmUgZm9sbG93ZWQgYnV0IHRoZSBjYWxsZXIgbWF5IGZhdWx0IGl0IGluLCBhbmQgYVxuJiM0MzsgKiBuZWdhdGl2ZSBlcnJubyB3aGVuIHRoZSBjYWxsZXIgbXVzdCByZXBvcnQgdGhlIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfb25lX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuJiM0MztcdFx0cHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VwKVxuIHtcbi1cdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuLVx0c3RydWN0IGZvbGlvICpmb2xpbztcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0cHRlX3QgKnB0ZXAsIHB0ZTtcbi1cdGludCByZXQ7XG4gXG4tXHRwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCBcdTAwMjZwdGwpO1xuLVx0aWYgKCFwdGVwKVxuLVx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbi1cdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuJiM0MztcdCpwYWdlcCA9IE5VTEw7XG4mIzQzO1xuIFx0aWYgKCFwdGVfcHJlc2VudChwdGUpKVxuLVx0XHRnb3RvIG5vX3BhZ2U7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcdGlmIChwdGVfcHJvdG5vbmUocHRlKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRnb3RvIG5vX3BhZ2U7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcbiBcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZSk7XG4gXG4gXHQvKlxuIFx0ICogV2Ugb25seSBjYXJlIGFib3V0IGFub24gcGFnZXMgaW4gY2FuX2ZvbGxvd193cml0ZV9wdGUoKS5cbiBcdCAqL1xuLVx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpIHtcbi1cdFx0cGFnZSA9IE5VTEw7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuJiM0MztcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNiAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKHVubGlrZWx5KCFwYWdlKSkge1xuIFx0XHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkge1xuIFx0XHRcdC8qIEF2b2lkIHNwZWNpYWwgKGxpa2UgemVybykgcGFnZXMgaW4gY29yZSBkdW1wcyAqL1xuLVx0XHRcdHBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGlmIChpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKSB7XG4tXHRcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0cmV0ID0gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7XG4tXHRcdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdH1cbiYjNDM7XHRcdGlmICghaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xuJiM0MztcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4gXHR9XG4tXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG4tXHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKSB7XG4tXHRcdHBhZ2UgPSBFUlJfUFRSKC1FTUxJTkspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbiYjNDM7XHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxuJiM0MztcdFx0cmV0dXJuIC1FTUxJTks7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSBcdTAwMjZcdTAwMjYgUGFnZUFub24ocGFnZSkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpO1xuIFxuLVx0LyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi9cbi1cdHJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCAxLCBmbGFncyk7XG4tXHRpZiAodW5saWtlbHkocmV0KSkge1xuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbiYjNDM7XHQqcGFnZXAgPSBwYWdlO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4gXG4tXHQvKlxuLVx0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXG4tXHQgKiB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZSBzZWVcbi1cdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuLVx0ICovXG4tXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSB7XG4tXHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbi1cdFx0aWYgKHJldCkge1xuLVx0XHRcdHVucGluX3VzZXJfcGFnZShwYWdlKTtcbi1cdFx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuJiM0MzsvKlxuJiM0MzsgKiBSZXR1cm4gaG93IG1hbnkgUFRFcyBtYXAgY29uc2VjdXRpdmUgcGFnZXMgb2YgdGhlIHNhbWUgZm9saW8gYW5kIGNhbiBiZVxuJiM0MzsgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB3cml0ZS1mYXVsdCBhbmQgdW5zaGFyZSBjaGVja3MgaW4gZm9sbG93X29uZV9wdGUoKSBhcmUgcGVyIFBURSwgYnV0IGFcbiYjNDM7ICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seVxuJiM0MzsgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5c1xuJiM0MzsgKiBvbmUgcGFnZSBhdCBhIHRpbWUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHdhbGtfZW5kLFxuJiM0MztcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgKnB0ZXAsIHB0ZV90ICpiYXRjaF9wdGUsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbWF4O1xuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0aWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdG1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdGlmIChtYXggXHUwMDNjPSAxKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdC8qIE1lcmdlIHlvdW5nL2RpcnR5IGFjcm9zcyBiYXRjaCBzbyBmb2xpb19tYXJrX2RpcnR5IHNlZXMgYW55IGRpcnR5LiAqL1xuJiM0MztcdHJldHVybiBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoZm9saW8sIHZtYSwgcHRlcCwgYmF0Y2hfcHRlLCBtYXgsXG4mIzQzO1x0XHRcdFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsXG4mIzQzOyAqIHdoaWNoZXZlciBjb21lcyBmaXJzdCwgYW5kIGNvbW1pdCBldmVyeSBwYWdlIGZvdW5kLlxuJiM0MzsgKlxuJiM0MzsgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdFxuJiM0MzsgKiBpcyBhIHNob3J0IHJlYWQ7IF9fZ2V0X3VzZXJfcGFnZXMoKSByZXRyeWluZyB0aGUgcmVhZCB3aWxsIGdldCB0aGUgZXJyb3IuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLFxuJiM0MztcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0Ym9vbCBuZWVkX25vX3BhZ2VfdGFibGUgPSBmYWxzZTtcbiYjNDM7XHRwdGVfdCAqcHRlcCwgKm9yaWdfcHRlcDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHdhbGtfZW5kO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnIgPSAwO1xuJiM0MztcdHNwaW5sb2NrX3QgKnB0bDtcbiYjNDM7XHRsb25nIHJldCA9IDA7XG4mIzQzO1xuJiM0MztcdG9yaWdfcHRlcCA9IHB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsIFx1MDAyNnB0bCk7XG4mIzQzO1x0aWYgKCFwdGVwKVxuJiM0MztcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4mIzQzO1xuJiM0MztcdHdhbGtfZW5kID0gbWluKHBtZF9hZGRyX2VuZChhZGRyZXNzLCBlbmQpLCB2bWEtXHUwMDNldm1fZW5kKTtcbiYjNDM7XG4mIzQzO1x0Zm9yICg7IGFkZHJlc3MgXHUwMDNjIHdhbGtfZW5kOyBhZGRyZXNzICYjNDM7PSBQQUdFX1NJWkUsIHB0ZXAmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRwdGVfdCBwdGUgPSBwdGVwX2dldChwdGVwKTtcbiYjNDM7XHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IGZvbGxvd19vbmVfcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgcHRlLCBmbGFncywgXHUwMDI2cGFnZSk7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgcGFnZSkge1xuJiM0MztcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRcdFx0dW5zaWduZWQgbG9uZyBiYXRjaDtcbiYjNDM7XG4mIzQzO1x0XHRcdHB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdGJhdGNoID0gZm9sbG93X3B0ZV9iYXRjaCh2bWEsIGFkZHJlc3MsIHdhbGtfZW5kLCBmb2xpbyxcbiYjNDM7XHRcdFx0XHRcdFx0IHB0ZXAsIFx1MDAyNmJhdGNoX3B0ZSwgZmxhZ3MpO1xuJiM0MztcdFx0XHRyZXQgPSBmb2xsb3dfcGFnZV9wdGVfY29tbWl0KHZtYSwgYWRkcmVzcywgZm9saW8sIHBhZ2UsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgcGFnZXMgPyBwYWdlcyAmIzQzOyBuciA6IE5VTEwpO1xuJiM0MztcdFx0XHRpZiAoIXJldCkge1xuJiM0MztcdFx0XHRcdG5yICYjNDM7PSBiYXRjaDtcbiYjNDM7XHRcdFx0XHQvKlxuJiM0MztcdFx0XHRcdCAqIFRoZSBsb29wJiMzOTtzIG93biBpbmNyZW1lbnQgY292ZXJzIG9uZSBQVEU7IHNraXBcbiYjNDM7XHRcdFx0XHQgKiB0aGUgcmVzdCBvZiB0aGUgYmF0Y2guXG4mIzQzO1x0XHRcdFx0ICovXG4mIzQzO1x0XHRcdFx0cHRlcCAmIzQzOz0gYmF0Y2ggLSAxO1xuJiM0MztcdFx0XHRcdGFkZHJlc3MgJiM0Mzs9IChiYXRjaCAtIDEpICogUEFHRV9TSVpFO1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHR9XG4gXHRcdH1cbi1cdH1cbi1cdGlmIChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkge1xuLVx0XHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFwdGVfZGlydHkocHRlKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuLVx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcbiBcdFx0Lypcbi1cdFx0ICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlXG4tXHRcdCAqIGlzIG5lZWRlZCB0byBhdm9pZCBsb3NpbmcgdGhlIGRpcnR5IGJpdDogaXQgaXMgZWFzaWVyIHRvIHVzZVxuLVx0XHQgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuXG4mIzQzO1x0XHQgKiBub19wYWdlX3RhYmxlKCkgbWF5IGxvb2sgdXAgdGhlIHBhZ2UgY2FjaGUsIHNvIGl0IGNhbm5vdCBydW5cbiYjNDM7XHRcdCAqIHVuZGVyIHRoZSBQVEUgbG9jay5cbiBcdFx0ICovXG4tXHRcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xuJiM0MztcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHB0ZV9ub25lKHB0ZSkpXG4mIzQzO1x0XHRcdG5lZWRfbm9fcGFnZV90YWJsZSA9IHRydWU7XG4mIzQzO1x0XHRicmVhaztcbiBcdH1cbi1vdXQ6XG4tXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7XG4tXHRyZXR1cm4gcGFnZTtcbi1ub19wYWdlOlxuLVx0cHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpO1xuLVx0aWYgKCFwdGVfbm9uZShwdGUpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuJiM0MztcbiYjNDM7XHRwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG5yKVxuJiM0MztcdFx0cmV0dXJuIG5yO1xuJiM0MztcdGlmIChuZWVkX25vX3BhZ2VfdGFibGUpXG4mIzQzO1x0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4mIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxuJiM0MztcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHBtZF90ICpwbWQsIHBtZHZhbDtcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdGxvbmcgcmV0O1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXG4gXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHJlc3MpO1xuQEAgLTkxMiw3ICYjNDM7MTAzMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGlmIChsaWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKVxuLVx0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4mIzQzO1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXG4gXHRpZiAocG1kX3Byb3Rub25lKHBtZHZhbCkgXHUwMDI2XHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG5AQCAtOTI1LDI4ICYjNDM7MTA0NiwzNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuJiM0MztcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0fVxuIFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9TUExJVF9QTUQpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4gXHRcdHNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTtcbiBcdFx0LyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqL1xuLVx0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gRVJSX1BUUigtRU5PTUVNKSA6XG4tXHRcdFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4mIzQzO1x0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gLUVOT01FTSA6XG4mIzQzO1x0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0fVxuLVx0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cmV0ID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXHRzcGluX3VubG9jayhwdGwpO1xuLVx0cmV0dXJuIHBhZ2U7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsIHRoZVxuJiM0MztcdCAqIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgcG1kIGxvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHJldCBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgcGFnZXMpXG4mIzQzO1x0XHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwNGRfdCAqcDRkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwNGRfdCAqcDRkcCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwdWRfdCAqcHVkcCwgcHVkO1xuIFx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4mIzQzO1x0bG9uZyByZXQ7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcbiBcdHB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpO1xuQEAgLTk1NSwyMiAmIzQzOzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRyZXQgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBwYWdlcyk7XG4gXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4tXHRcdGlmIChwYWdlKVxuLVx0XHRcdHJldHVybiBwYWdlO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxuJiM0MztcdFx0ICogdGhlIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgbG9jay4gQSAxIEdCIGZvbGlvXG4mIzQzO1x0XHQgKiBjYW4gYmUgdXAgdG8gSFBBR0VfUFVEX05SIHBhZ2VzLCB0b28gbG9uZyB0byBmbHVzaCB1bmRlciBhXG4mIzQzO1x0XHQgKiBzcGlubG9jay5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgcGFnZXMpXG4mIzQzO1x0XHRcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHR9XG4gXHRpZiAodW5saWtlbHkocHVkX2JhZChwdWQpKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ2RfdCAqcGdkcCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwNGRfdCAqcDRkcCwgcDRkO1xuIFxuQEAgLTk4MSwxNSAmIzQzOzExMTYsMTggQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKVxuIFx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcbi1cdHJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTtcbiYjNDM7XHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwNGRwLCBmbGFncywgcGFnZXMpO1xuIH1cbiBcbiAvKipcbi0gKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3NcbiYjNDM7ICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgcGFnZXMgYXQgYSB1c2VyLXZpcnR1YWwgYWRkcmVzc1xuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcbiAgKiBAYWRkcmVzczogdmlydHVhbCBhZGRyZXNzIHRvIGxvb2sgdXBcbiYjNDM7ICogQGVuZDogdmlydHVhbCBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0b3AgYmF0Y2hpbmcgY29udGlndW91cyBwYWdlc1xuICAqIEBmbGFnczogZmxhZ3MgbW9kaWZ5aW5nIGxvb2t1cCBiZWhhdmlvdXJcbi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFza1xuJiM0MzsgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG9cbiYjNDM7ICogICAgICAgICB3YWxrIHRoZSBwYWdlIHRhYmxlcyAoZS5nLiB0byBmYXVsdCBwYWdlcyBpbikgd2l0aG91dCBjb2xsZWN0aW5nXG4mIzQzOyAqICAgICAgICAgb3IgcmVmY291bnRpbmcgdGhlbVxuICAqXG4gICogQGZsYWdzIGNhbiBoYXZlIEZPTExfIGZsYWdzIHNldCwgZGVmaW5lZCBpbiBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gICpcbkBAIC05OTgsMzMgJiM0MzsxMTM2LDMyIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxuICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLlxuICAqXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXG4tICpcbi0gKiBSZXR1cm46IHRoZSBtYXBwZWQgKHN0cnVjdCBwYWdlICopLCAlTlVMTCBpZiBubyBtYXBwaW5nIGV4aXN0cywgb3Jcbi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXG4tICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLlxuJiM0MzsgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgY29udGlndW91cyBwYWdlcyBzdGFydGluZyBhdCBAYWRkcmVzcyB0aGF0IHdlcmVcbiYjNDM7ICogcGxhY2VkIGludG8gQHBhZ2VzIChpZiBub24tTlVMTCksIHdoaWNoIG1heSBiZSBmZXdlciB0aGFuIHRoZSBwYWdlc1xuJiM0MzsgKiByZXF1ZXN0ZWQgdmlhIEBlbmQ7IDAgaWYgbm8gbWFwcGluZyBleGlzdHMgYXQgQGFkZHJlc3M7IG9yIGEgbmVnYXRpdmVcbiYjNDM7ICogZXJybm8gZm9yIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkIGJ5IGEgcGFnZSBkZXNjcmlwdG9yXG4mIzQzOyAqIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cbiAgKi9cbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwZ2RfdCAqcGdkO1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHRsb25nIHJldDtcbiBcbiBcdHZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTtcbiBcbi1cdCpwYWdlX21hc2sgPSAwO1xuIFx0cGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7XG4gXG4gXHRpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpXG4tXHRcdHBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuJiM0MztcdFx0cmV0ID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGVsc2Vcbi1cdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4mIzQzO1x0XHRyZXQgPSBmb2xsb3dfcDRkX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHBnZCwgZmxhZ3MsIHBhZ2VzKTtcbiBcbiBcdHZtYV9wZ3RhYmxlX3dhbGtfZW5kKHZtYSk7XG4gXG4tXHRyZXR1cm4gcGFnZTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbkBAIC0xMzU4LDcgJiM0MzsxNDk1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiB7XG4gXHRsb25nIHJldCA9IDAsIGkgPSAwO1xuIFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xuLVx0dW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwO1xuIFxuIFx0aWYgKCFucl9wYWdlcylcbiBcdFx0cmV0dXJuIDA7XG5AQCAtMTM3Myw3ICYjNDM7MTUwOSw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRkbyB7XG4gXHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0XHR1bnNpZ25lZCBpbnQgcGFnZV9pbmNyZW07XG4mIzQzO1x0XHRsb25nIG5yO1xuIFxuIFx0XHQvKiBmaXJzdCBpdGVyYXRpb24gb3IgY3Jvc3Mgdm1hIGJvdW5kICovXG4gXHRcdGlmICghdm1hIHx8IHN0YXJ0IFx1MDAzZT0gdm1hLVx1MDAzZXZtX2VuZCkge1xuQEAgLTE0MDAsOCAmIzQzOzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0XHRwYWdlcyA/IFx1MDAyNnBhZ2UgOiBOVUxMKTtcbiBcdFx0XHRcdGlmIChyZXQpXG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0cGFnZV9tYXNrID0gMDtcbi1cdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuJiM0MztcdFx0XHRcdGd1cF9maWxsX3BhZ2VzKHZtYSwgc3RhcnQsIHBhZ2UsIDEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgcGFnZXMgPyBwYWdlcyAmIzQzOyBpIDogTlVMTCk7XG4mIzQzO1x0XHRcdFx0aSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdFx0c3RhcnQgJiM0Mzs9IFBBR0VfU0laRTtcbiYjNDM7XHRcdFx0XHRucl9wYWdlcy0tO1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRcdH1cbiBcbiBcdFx0XHRpZiAoIXZtYSkge1xuQEAgLTE0MjMsMTAgJiM0MzsxNTYzLDExIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXG4tXHRcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgXHUwMDI2cGFnZV9tYXNrKTtcbi1cdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuJiM0MztcdFx0bnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFLFxuJiM0MztcdFx0XHRcdCAgICAgIGd1cF9mbGFncywgcGFnZXMgPyBcdTAwMjZwYWdlc1tpXSA6IE5VTEwpO1xuJiM0MztcdFx0aWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7XG4gXHRcdFx0cmV0ID0gZmF1bHRpbl9wYWdlKHZtYSwgc3RhcnQsIGd1cF9mbGFncyxcbi1cdFx0XHRcdFx0ICAgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LLCBsb2NrZWQpO1xuJiM0MztcdFx0XHRcdFx0ICAgbnIgPT0gLUVNTElOSywgbG9ja2VkKTtcbiBcdFx0XHRzd2l0Y2ggKHJldCkge1xuIFx0XHRcdGNhc2UgMDpcbiBcdFx0XHRcdGdvdG8gcmV0cnk7XG5AQCAtMTQ0MCw3MCAmIzQzOzE1ODEsMzAgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbiBcdFx0XHRCVUcoKTtcbi1cdFx0fSBlbHNlIGlmIChQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcbiYjNDM7XHRcdH0gZWxzZSBpZiAobnIgPT0gLUVFWElTVCkge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZ1xuIFx0XHRcdCAqIHN0cnVjdCBwYWdlLiBJZiB0aGUgY2FsbGVyIGV4cGVjdHMgKipwYWdlcyB0byBiZVxuIFx0XHRcdCAqIGZpbGxlZCBpbiwgYmFpbCBvdXQgbm93LCBiZWNhdXNlIHRoYXQgY2FuJiMzOTt0IGJlIGRvbmVcbi1cdFx0XHQgKiBmb3IgdGhpcyBwYWdlLlxuJiM0MztcdFx0XHQgKiBmb3IgdGhpcyBwYWdlLiBPdGhlcndpc2UgYWR2YW5jZSBieSB0aGUgb25lIHBhZ2VcbiYjNDM7XHRcdFx0ICogZm9sbG93X3BhZ2VfbWFzaygpIGxvb2tlZCBhdC5cbiBcdFx0XHQgKi9cbiBcdFx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4mIzQzO1x0XHRcdFx0cmV0ID0gbnI7XG4gXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4tXHRcdH0gZWxzZSBpZiAoSVNfRVJSKHBhZ2UpKSB7XG4tXHRcdFx0cmV0ID0gUFRSX0VSUihwYWdlKTtcbiYjNDM7XHRcdFx0bnIgPSAxO1xuJiM0MztcdFx0fSBlbHNlIGlmIChuciBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRyZXQgPSBucjtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuLW5leHRfcGFnZTpcbi1cdFx0cGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgcGFnZV9tYXNrKTtcbi1cdFx0aWYgKHBhZ2VfaW5jcmVtIFx1MDAzZSBucl9wYWdlcylcbi1cdFx0XHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xuLVxuLVx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZTtcbi1cdFx0XHR1bnNpZ25lZCBpbnQgajtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRoaXMgbXVzdCBiZSBhIGxhcmdlIGZvbGlvIChhbmQgZG9lc24mIzM5O3QgbmVlZCB0b1xuLVx0XHRcdCAqIGJlIHRoZSB3aG9sZSBmb2xpbzsgaXQgY2FuIGJlIHBhcnQgb2YgaXQpLCBkb1xuLVx0XHRcdCAqIHRoZSByZWZjb3VudCB3b3JrIGZvciBhbGwgdGhlIHN1YnBhZ2VzIHRvby5cbi1cdFx0XHQgKlxuLVx0XHRcdCAqIE5PVEU6IGhlcmUgdGhlIHBhZ2UgbWF5IG5vdCBiZSB0aGUgaGVhZCBwYWdlXG4tXHRcdFx0ICogZS5nLiB3aGVuIHN0YXJ0IGFkZHIgaXMgbm90IHRocC1zaXplIGFsaWduZWQuXG4tXHRcdFx0ICogdHJ5X2dyYWJfZm9saW8oKSBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRhaWxcbi1cdFx0XHQgKiBwYWdlcy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocGFnZV9pbmNyZW0gXHUwMDNlIDEpIHtcbi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHRcdFx0Lypcbi1cdFx0XHRcdCAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGVcbi1cdFx0XHRcdCAqIGxhcmdlIGZvbGlvLCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLlxuLVx0XHRcdFx0ICovXG4tXHRcdFx0XHRpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSxcbi1cdFx0XHRcdFx0XHQgICBndXBfZmxhZ3MpKSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIFJlbGVhc2UgdGhlIDFzdCBwYWdlIHJlZiBpZiB0aGVcbi1cdFx0XHRcdFx0ICogZm9saW8gaXMgcHJvYmxlbWF0aWMsIGZhaWwgaGFyZC5cbi1cdFx0XHRcdFx0ICovXG4tXHRcdFx0XHRcdGd1cF9wdXRfZm9saW8oZm9saW8sIDEsIGd1cF9mbGFncyk7XG4tXHRcdFx0XHRcdHJldCA9IC1FRkFVTFQ7XG4tXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbi1cbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYWdlX2luY3JlbTsgaiYjNDM7JiM0MzspIHtcbi1cdFx0XHRcdHN1YnBhZ2UgPSBwYWdlICYjNDM7IGo7XG4tXHRcdFx0XHRwYWdlc1tpICYjNDM7IGpdID0gc3VicGFnZTtcbi1cdFx0XHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIHN0YXJ0ICYjNDM7IGogKiBQQUdFX1NJWkUpO1xuLVx0XHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7XG4tXHRcdFx0fVxuLVx0XHR9XG4mIzQzO1x0XHQvKiBDaGVjayB0aGF0IHdlIGRpZG4mIzM5O3QgcGluIG1vcmUgcGFnZXMgdGhhbiB0aGUgY2FsbGVyIHdpbGwgZnJlZS4gKi9cbiYjNDM7XHRcdFZNX1dBUk5fT05fT05DRShuciBcdTAwM2UgbnJfcGFnZXMpO1xuIFxuLVx0XHRpICYjNDM7PSBwYWdlX2luY3JlbTtcbi1cdFx0c3RhcnQgJiM0Mzs9IHBhZ2VfaW5jcmVtICogUEFHRV9TSVpFO1xuLVx0XHRucl9wYWdlcyAtPSBwYWdlX2luY3JlbTtcbiYjNDM7XHRcdGkgJiM0Mzs9IG5yO1xuJiM0MztcdFx0c3RhcnQgJiM0Mzs9IG5yICogUEFHRV9TSVpFO1xuJiM0MztcdFx0bnJfcGFnZXMgLT0gbnI7XG4gXHR9IHdoaWxlIChucl9wYWdlcyk7XG4gb3V0OlxuIFx0cmV0dXJuIGkgPyBpIDogcmV0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtIVUdFVExCRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXMmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfcmVtb3RlJiMzNDssCiAgICAmIzM0O3Bpbl91c2VyX3BhZ2VzX3VubG9ja2VkJiMzNDssCiAgICAmIzM0O2ZhdWx0aW5fcGFnZV9yYW5nZSYjMzQ7LAogICAgJiMzNDtwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY3ZTY3NmU4YjAzOGUwMWNjZGM2Mjc4NTc2OTM2ZDYwZDliN2FiODQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyAxMiAxNjo1NToxMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmMKaW5kZXggMDY5MjExOWI3OTA0My4uMTA2ODA2NjM0YjNjNCAxMDA2NDQKLS0tIGEvbW0vZ3VwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmMKQEAgLTYwOCwxNSAmIzQzOzYwOCwxNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9jb21tb24oc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuIHBhZ2UgJmFtcDsmYW1wOyBQYWdlQW5vbihwYWdlKSAmYW1wOyZhbXA7IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKm5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKJiM0MztzdGF0aWMgbG9uZyBub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJaWYgKCEoZmxhZ3MgJmFtcDsgRk9MTF9EVU1QKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAogCS8qCiAJICogV2hlbiBjb3JlIGR1bXBpbmcsIHdlIGRvbiYjMzk7dCB3YW50IHRvIGFsbG9jYXRlIHVubmVjZXNzYXJ5IHBhZ2VzIG9yCi0JICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiBOVUxMIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LAomIzQzOwkgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIDAgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsCiAJICogdGhlbiBnZXRfZHVtcF9wYWdlKCkgd2lsbCByZXR1cm4gTlVMTCB0byBsZWF2ZSBhIGhvbGUgaW4gdGhlIGR1bXAuCiAJICogQnV0IHdlIGNhbiBvbmx5IG1ha2UgdGhpcyBvcHRpbWl6YXRpb24gd2hlcmUgYSBob2xlIHdvdWxkIHN1cmVseQogCSAqIGJlIHplcm8tZmlsbGVkIGlmIGhhbmRsZV9tbV9mYXVsdCgpIGFjdHVhbGx5IGRpZCBoYW5kbGUgaXQuCkBAIC02MjUsMTIgJiM0Mzs2MjUsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpOwogCiAJCWlmICghaHVnZXRsYmZzX3BhZ2VjYWNoZV9wcmVzZW50KGgsIHZtYSwgYWRkcmVzcykpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKJiM0MzsJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IGVsc2UgaWYgKCh2bWFfaXNfYW5vbnltb3VzKHZtYSkgfHwgIXZtYS0mZ3Q7dm1fb3BzLSZndDtmYXVsdCkpIHsKLQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGd1cF9maWxsX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBuciwgc3RydWN0IHBhZ2UgKipwYWdlcykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJaWYgKCFwYWdlcykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICYjNDM7IGk7CiYjNDM7CiYjNDM7CQlwYWdlc1tpXSA9IHN1YnBhZ2U7CiYjNDM7CQlmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBhZGRyZXNzICYjNDM7IGkgKiBQQUdFX1NJWkUpOwomIzQzOwkJZmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7CiYjNDM7CX0KIH0KIAogI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUwpAQCAtNjQ2LDM4ICYjNDM7NjYzLDQzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLAogCXJldHVybiBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihwYWdlLCB2bWEsIGZsYWdzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsCi0JCQkJICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlwdWRfdCBwdWQgPSAqcHVkcDsKIAl1bnNpZ25lZCBsb25nIHBmbiA9IHB1ZF9wZm4ocHVkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvZmYsIG5yOwogCWludCByZXQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQocHVkX2xvY2twdHIobW0sIHB1ZHApKTsKIAogCWlmICghcHVkX3ByZXNlbnQocHVkKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAogCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOwogCSAgICAhY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkLCBwZm5fdG9fcGFnZShwZm4pLCB2bWEsIGZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAotCXBmbiAmIzQzOz0gKGFkZHIgJmFtcDsgflBVRF9NQVNLKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwlvZmYgPSBQRk5fRE9XTihhZGRyICZhbXA7IH5QVURfTUFTSyk7CiYjNDM7CXBmbiAmIzQzOz0gb2ZmOwogCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwogCiAJaWYgKCFwdWRfd3JpdGUocHVkKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpCi0JCXJldHVybiBFUlJfUFRSKC1FTUxJTkspOwomIzQzOwkJcmV0dXJuIC1FTUxJTks7CiYjNDM7CiYjNDM7CW5yID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpOwogCi0JcmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpOwomIzQzOwlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpOwogCWlmIChyZXQpCi0JCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JZWxzZQotCQkqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CWlmIChwYWdlcykKJiM0MzsJCXBhZ2VzWzBdID0gcGFnZTsKIAotCXJldHVybiBwYWdlOwomIzQzOwlyZXR1cm4gbnI7CiB9CiAKIC8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQTURzIGluIENPVyBtYXBwaW5ncy4gKi8KQEAgLTY5OCwxNCAmIzQzOzcyMCwxNCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAlyZXR1cm4gIXVzZXJmYXVsdGZkX2h1Z2VfcG1kX3dwKHZtYSwgcG1kKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAJcG1kX3QgcG1kdmFsID0gKnBtZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvZmYsIG5yOwogCWludCByZXQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQocG1kX2xvY2twdHIobW0sIHBtZCkpOwpAQCAtNzEzLDUwICYjNDM7NzM1LDU0IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpOwogCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOwogCSAgICAhY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kdmFsLCBwYWdlLCB2bWEsIGZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyZXR1cm4gMDsKIAogCS8qIEF2b2lkIGR1bXBpbmcgaHVnZSB6ZXJvIHBhZ2UgKi8KIAlpZiAoKGZsYWdzICZhbXA7IEZPTExfRFVNUCkgJmFtcDsmYW1wOyBpc19odWdlX3plcm9fcG1kKHBtZHZhbCkpCi0JCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAocG1kX3Byb3Rub25lKCpwbWQpICZhbXA7JmFtcDsgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJaWYgKCFwbWRfd3JpdGUocG1kdmFsKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpCi0JCXJldHVybiBFUlJfUFRSKC1FTUxJTkspOwomIzQzOwkJcmV0dXJuIC1FTUxJTks7CiAKIAlWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgJmFtcDsgRk9MTF9QSU4pICZhbXA7JmFtcDsgUGFnZUFub24ocGFnZSkgJmFtcDsmYW1wOwogCQkJICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpOwogCi0JcmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpOwomIzQzOwlvZmYgPSBQRk5fRE9XTihhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7CiYjNDM7CW5yID0gbWluKEhQQUdFX1BNRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpOwomIzQzOwomIzQzOwlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpOwogCWlmIChyZXQpCi0JCXJldHVybiBFUlJfUFRSKHJldCk7CiYjNDM7CQlyZXR1cm4gcmV0OwogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCiAJaWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgRk9MTF9UT1VDSCkpCiAJCXRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgJmFtcDsgRk9MTF9XUklURSk7CiAjZW5kaWYJLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCiAKLQlwYWdlICYjNDM7PSAoYWRkciAmYW1wOyB+SFBBR0VfUE1EX01BU0spICZndDsmZ3Q7IFBBR0VfU0hJRlQ7Ci0JKnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7CiYjNDM7CXBhZ2UgJiM0Mzs9IG9mZjsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VzKQomIzQzOwkJcGFnZXNbMF0gPSBwYWdlOwogCi0JcmV0dXJuIHBhZ2U7CiYjNDM7CXJldHVybiBucjsKIH0KIAogI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqLwotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsCi0JCQkJICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewotCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKLQlyZXR1cm4gTlVMTDsKJiM0MzsJcmV0dXJuIDA7CiB9CiAjZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovCiAKQEAgLTc5OSwxMTAgJiM0Mzs4MjUsMjA1IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGVfdCBwdGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCXJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzOy8qCiYjNDM7ICogVGhlIGNhbGxlciBoYXMgYWxyZWFkeSBydW4gZXZlcnkgcGVyLVBURSBzYWZldHkgY2hlY2sgKHByZXNlbnQsCiYjNDM7ICogd3JpdGUtZmF1bHQsIGd1cF9tdXN0X3Vuc2hhcmUoKSkgb24gdGhlIFBURSwgc28gdGhpcyBvbmx5IGRvZXMgdGhlCiYjNDM7ICogcGVyLWZvbGlvIHdvcms6IHRoZSByZWZjb3VudCBncmFiLCB0aGUgRk9MTF9QSU4gYWNjZXNzaWJpbGl0eSBmYXVsdC1pbiwKJiM0MzsgKiBkaXJ0eS9hY2Nlc3NlZCBtYXJraW5nLCBhbmQgdGhlIGFycmF5IGZpbGwgd2l0aCB0aGUgY2FjaGUgZmx1c2guCiYjNDM7ICovCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfcHRlX2NvbW1pdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UsCiYjNDM7CQlwdGVfdCBwdGUsIHVuc2lnbmVkIGxvbmcgbnIsIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCXN0cnVjdCBwYWdlICoqcGFnZXMpCiYjNDM7ewomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJLyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi8KJiM0MzsJcmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7CiYjNDM7CWlmICh1bmxpa2VseShyZXQpKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nCiYjNDM7CSAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZQomIzQzOwkgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy4KJiM0MzsJICovCiYjNDM7CWlmIChmbGFncyAmYW1wOyBGT0xMX1BJTikgewomIzQzOwkJcmV0ID0gYXJjaF9tYWtlX2ZvbGlvX2FjY2Vzc2libGUoZm9saW8pOwomIzQzOwkJaWYgKHJldCkgewomIzQzOwkJCWd1cF9wdXRfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7CiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlpZiAoZmxhZ3MgJmFtcDsgRk9MTF9UT1VDSCkgewomIzQzOwkJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIXB0ZV9kaXJ0eShwdGUpICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKQomIzQzOwkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwomIzQzOwkJLyoKJiM0MzsJCSAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZQomIzQzOwkJICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlCiYjNDM7CQkgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuCiYjNDM7CQkgKi8KJiM0MzsJCWZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pOwomIzQzOwl9CiYjNDM7CiYjNDM7CWd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZSwgbnIsIHBhZ2VzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVzb2x2ZSBvbmUgcHJlc2VudCBQVEUgdG8gdGhlIHBhZ2UgaXQgbWFwcy4gUmV0dXJucyBubyBwYWdlIGFuZCBubyBlcnJvcgomIzQzOyAqIHdoZW4gdGhlIFBURSBjYW5ub3QgYmUgZm9sbG93ZWQgYnV0IHRoZSBjYWxsZXIgbWF5IGZhdWx0IGl0IGluLCBhbmQgYQomIzQzOyAqIG5lZ2F0aXZlIGVycm5vIHdoZW4gdGhlIGNhbGxlciBtdXN0IHJlcG9ydCB0aGUgZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfb25lX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAomIzQzOwkJcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VwKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKLQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXNwaW5sb2NrX3QgKnB0bDsKLQlwdGVfdCAqcHRlcCwgcHRlOwotCWludCByZXQ7CiAKLQlwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmYW1wO3B0bCk7Ci0JaWYgKCFwdGVwKQotCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKLQlwdGUgPSBwdGVwX2dldChwdGVwKTsKJiM0MzsJKnBhZ2VwID0gTlVMTDsKJiM0MzsKIAlpZiAoIXB0ZV9wcmVzZW50KHB0ZSkpCi0JCWdvdG8gbm9fcGFnZTsKJiM0MzsJCXJldHVybiAwOwogCWlmIChwdGVfcHJvdG5vbmUocHRlKSAmYW1wOyZhbXA7ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSkKLQkJZ290byBub19wYWdlOwomIzQzOwkJcmV0dXJuIDA7CiAKIAlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyZXNzLCBwdGUpOwogCiAJLyoKIAkgKiBXZSBvbmx5IGNhcmUgYWJvdXQgYW5vbiBwYWdlcyBpbiBjYW5fZm9sbG93X3dyaXRlX3B0ZSgpLgogCSAqLwotCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOwotCSAgICAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSkgewotCQlwYWdlID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQomIzQzOwlpZiAoKGZsYWdzICZhbXA7IEZPTExfV1JJVEUpICZhbXA7JmFtcDsgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpCiYjNDM7CQlyZXR1cm4gMDsKIAogCWlmICh1bmxpa2VseSghcGFnZSkpIHsKIAkJaWYgKGZsYWdzICZhbXA7IEZPTExfRFVNUCkgewogCQkJLyogQXZvaWQgc3BlY2lhbCAobGlrZSB6ZXJvKSBwYWdlcyBpbiBjb3JlIGR1bXBzICovCi0JCQlwYWdlID0gRVJSX1BUUigtRUZBVUxUKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGlzX3plcm9fcGZuKHB0ZV9wZm4ocHRlKSkpIHsKLQkJCXBhZ2UgPSBwdGVfcGFnZShwdGUpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7Ci0JCQlwYWdlID0gRVJSX1BUUihyZXQpOwotCQkJZ290byBvdXQ7CiYjNDM7CQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KJiM0MzsJCWlmICghaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkKJiM0MzsJCQlyZXR1cm4gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7CiYjNDM7CQlwYWdlID0gcHRlX3BhZ2UocHRlKTsKIAl9Ci0JZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwogCi0JaWYgKCFwdGVfd3JpdGUocHRlKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpIHsKLQkJcGFnZSA9IEVSUl9QVFIoLUVNTElOSyk7Ci0JCWdvdG8gb3V0OwotCX0KJiM0MzsJaWYgKCFwdGVfd3JpdGUocHRlKSAmYW1wOyZhbXA7IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpCiYjNDM7CQlyZXR1cm4gLUVNTElOSzsKIAogCVZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyAmYW1wOyBGT0xMX1BJTikgJmFtcDsmYW1wOyBQYWdlQW5vbihwYWdlKSAmYW1wOyZhbXA7CiAJCQkgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7CiAKLQkvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqLwotCXJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCAxLCBmbGFncyk7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJcGFnZSA9IEVSUl9QVFIocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQomIzQzOwkqcGFnZXAgPSBwYWdlOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkvKgotCSAqIFdlIG5lZWQgdG8gbWFrZSB0aGUgcGFnZSBhY2Nlc3NpYmxlIGlmIGFuZCBvbmx5IGlmIHdlIGFyZSBnb2luZwotCSAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZQotCSAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLgotCSAqLwotCWlmIChmbGFncyAmYW1wOyBGT0xMX1BJTikgewotCQlyZXQgPSBhcmNoX21ha2VfZm9saW9fYWNjZXNzaWJsZShmb2xpbyk7Ci0JCWlmIChyZXQpIHsKLQkJCXVucGluX3VzZXJfcGFnZShwYWdlKTsKLQkJCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKJiM0MzsvKgomIzQzOyAqIFJldHVybiBob3cgbWFueSBQVEVzIG1hcCBjb25zZWN1dGl2ZSBwYWdlcyBvZiB0aGUgc2FtZSBmb2xpbyBhbmQgY2FuIGJlCiYjNDM7ICogY29tbWl0dGVkIGFzIG9uZSBydW4uIEFsd2F5cyBhdCBsZWFzdCAxLgomIzQzOyAqCiYjNDM7ICogVGhlIHdyaXRlLWZhdWx0IGFuZCB1bnNoYXJlIGNoZWNrcyBpbiBmb2xsb3dfb25lX3B0ZSgpIGFyZSBwZXIgUFRFLCBidXQgYQomIzQzOyAqIHdyaXRhYmxlIHJ1biBuZWVkcyBubyByZXBlYXQ6IGEgd3JpdGFibGUgYW5vbiBwYWdlIGlzIGV4Y2x1c2l2ZS4gQSByZWFkLW9ubHkKJiM0MzsgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5cwomIzQzOyAqIG9uZSBwYWdlIGF0IGEgdGltZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHdhbGtfZW5kLAomIzQzOwkJc3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgKnB0ZXAsIHB0ZV90ICpiYXRjaF9wdGUsIHVuc2lnbmVkIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbWF4OwomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmICghcHRlX3dyaXRlKCpiYXRjaF9wdGUpICZhbXA7JmFtcDsgKGZsYWdzICZhbXA7IChGT0xMX1dSSVRFIHwgRk9MTF9QSU4pKSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwltYXggPSAod2Fsa19lbmQgLSBhZGRyZXNzKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwlpZiAobWF4ICZsdDs9IDEpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogTWVyZ2UgeW91bmcvZGlydHkgYWNyb3NzIGJhdGNoIHNvIGZvbGlvX21hcmtfZGlydHkgc2VlcyBhbnkgZGlydHkuICovCiYjNDM7CXJldHVybiBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoZm9saW8sIHZtYSwgcHRlcCwgYmF0Y2hfcHRlLCBtYXgsCiYjNDM7CQkJCSAgICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfTUVSR0VfWU9VTkdfRElSVFkpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsCiYjNDM7ICogd2hpY2hldmVyIGNvbWVzIGZpcnN0LCBhbmQgY29tbWl0IGV2ZXJ5IHBhZ2UgZm91bmQuCiYjNDM7ICoKJiM0MzsgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdAomIzQzOyAqIGlzIGEgc2hvcnQgcmVhZDsgX19nZXRfdXNlcl9wYWdlcygpIHJldHJ5aW5nIHRoZSByZWFkIHdpbGwgZ2V0IHRoZSBlcnJvci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQomIzQzO3sKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwlib29sIG5lZWRfbm9fcGFnZV90YWJsZSA9IGZhbHNlOwomIzQzOwlwdGVfdCAqcHRlcCwgKm9yaWdfcHRlcDsKJiM0MzsJdW5zaWduZWQgbG9uZyB3YWxrX2VuZDsKJiM0MzsJdW5zaWduZWQgbG9uZyBuciA9IDA7CiYjNDM7CXNwaW5sb2NrX3QgKnB0bDsKJiM0MzsJbG9uZyByZXQgPSAwOwomIzQzOwomIzQzOwlvcmlnX3B0ZXAgPSBwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmYW1wO3B0bCk7CiYjNDM7CWlmICghcHRlcCkKJiM0MzsJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwomIzQzOwl3YWxrX2VuZCA9IG1pbihwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSwgdm1hLSZndDt2bV9lbmQpOwomIzQzOwomIzQzOwlmb3IgKDsgYWRkcmVzcyAmbHQ7IHdhbGtfZW5kOyBhZGRyZXNzICYjNDM7PSBQQUdFX1NJWkUsIHB0ZXAmIzQzOyYjNDM7KSB7CiYjNDM7CQlwdGVfdCBwdGUgPSBwdGVwX2dldChwdGVwKTsKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwomIzQzOwkJcmV0ID0gZm9sbG93X29uZV9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBwdGUsIGZsYWdzLCAmYW1wO3BhZ2UpOwomIzQzOwkJaWYgKCFyZXQgJmFtcDsmYW1wOyBwYWdlKSB7CiYjNDM7CQkJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBiYXRjaDsKJiM0MzsKJiM0MzsJCQlwdGVfdCBiYXRjaF9wdGUgPSBwdGU7CiYjNDM7CiYjNDM7CQkJYmF0Y2ggPSBmb2xsb3dfcHRlX2JhdGNoKHZtYSwgYWRkcmVzcywgd2Fsa19lbmQsIGZvbGlvLAomIzQzOwkJCQkJCSBwdGVwLCAmYW1wO2JhdGNoX3B0ZSwgZmxhZ3MpOwomIzQzOwkJCXJldCA9IGZvbGxvd19wYWdlX3B0ZV9jb21taXQodm1hLCBhZGRyZXNzLCBmb2xpbywgcGFnZSwKJiM0MzsJCQkJCQkgICAgIGJhdGNoX3B0ZSwgYmF0Y2gsIGZsYWdzLAomIzQzOwkJCQkJCSAgICAgcGFnZXMgPyBwYWdlcyAmIzQzOyBuciA6IE5VTEwpOwomIzQzOwkJCWlmICghcmV0KSB7CiYjNDM7CQkJCW5yICYjNDM7PSBiYXRjaDsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogVGhlIGxvb3AmIzM5O3Mgb3duIGluY3JlbWVudCBjb3ZlcnMgb25lIFBURTsgc2tpcAomIzQzOwkJCQkgKiB0aGUgcmVzdCBvZiB0aGUgYmF0Y2guCiYjNDM7CQkJCSAqLwomIzQzOwkJCQlwdGVwICYjNDM7PSBiYXRjaCAtIDE7CiYjNDM7CQkJCWFkZHJlc3MgJiM0Mzs9IChiYXRjaCAtIDEpICogUEFHRV9TSVpFOwomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQl9CiAJCX0KLQl9Ci0JaWYgKGZsYWdzICZhbXA7IEZPTExfVE9VQ0gpIHsKLQkJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7Ci0JCSAgICAhcHRlX2RpcnR5KHB0ZSkgJmFtcDsmYW1wOyAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpCi0JCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKJiM0MzsKIAkJLyoKLQkJICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlCi0JCSAqIGlzIG5lZWRlZCB0byBhdm9pZCBsb3NpbmcgdGhlIGRpcnR5IGJpdDogaXQgaXMgZWFzaWVyIHRvIHVzZQotCQkgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuCiYjNDM7CQkgKiBub19wYWdlX3RhYmxlKCkgbWF5IGxvb2sgdXAgdGhlIHBhZ2UgY2FjaGUsIHNvIGl0IGNhbm5vdCBydW4KJiM0MzsJCSAqIHVuZGVyIHRoZSBQVEUgbG9jay4KIAkJICovCi0JCWZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pOwomIzQzOwkJaWYgKCFyZXQgJmFtcDsmYW1wOyBwdGVfbm9uZShwdGUpKQomIzQzOwkJCW5lZWRfbm9fcGFnZV90YWJsZSA9IHRydWU7CiYjNDM7CQlicmVhazsKIAl9Ci1vdXQ6Ci0JcHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpOwotCXJldHVybiBwYWdlOwotbm9fcGFnZToKLQlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Ci0JaWYgKCFwdGVfbm9uZShwdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKJiM0MzsKJiM0MzsJcHRlX3VubWFwX3VubG9jayhvcmlnX3B0ZXAsIHB0bCk7CiYjNDM7CiYjNDM7CWlmIChucikKJiM0MzsJCXJldHVybiBucjsKJiM0MzsJaWYgKG5lZWRfbm9fcGFnZV90YWJsZSkKJiM0MzsJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcG1kX3QgKnBtZCwgcG1kdmFsOwogCXNwaW5sb2NrX3QgKnB0bDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJbG9uZyByZXQ7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwogCiAJcG1kID0gcG1kX29mZnNldChwdWRwLCBhZGRyZXNzKTsKQEAgLTkxMiw3ICYjNDM7MTAzMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCWlmICghcG1kX3ByZXNlbnQocG1kdmFsKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpCi0JCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTsKIAogCWlmIChwbWRfcHJvdG5vbmUocG1kdmFsKSAmYW1wOyZhbXA7ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CkBAIC05MjUsMjggJiM0MzsxMDQ2LDM1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCX0KIAlpZiAodW5saWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKSB7CiAJCXNwaW5fdW5sb2NrKHB0bCk7Ci0JCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTsKIAl9CiAJaWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgRk9MTF9TUExJVF9QTUQpKSB7CiAJCXNwaW5fdW5sb2NrKHB0bCk7CiAJCXNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTsKIAkJLyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqLwotCQlyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gRVJSX1BUUigtRU5PTUVNKSA6Ci0JCQlmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTsKJiM0MzsJCXJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyAtRU5PTUVNIDoKJiM0MzsJCQlmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTsKIAl9Ci0JcGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CXJldCA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCXNwaW5fdW5sb2NrKHB0bCk7Ci0JcmV0dXJuIHBhZ2U7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbCB0aGUKJiM0MzsJICogYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBwbWQgbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChyZXQgJmd0OyAwICZhbXA7JmFtcDsgcGFnZXMpCiYjNDM7CQlndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcDRkX3QgKnA0ZHAsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHA0ZF90ICpwNGRwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXB1ZF90ICpwdWRwLCBwdWQ7CiAJc3BpbmxvY2tfdCAqcHRsOwotCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlsb25nIHJldDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAKIAlwdWRwID0gcHVkX29mZnNldChwNGRwLCBhZGRyZXNzKTsKQEAgLTk1NSwyMiAmIzQzOzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwogCWlmIChwdWRfbGVhZihwdWQpKSB7CiAJCXB0bCA9IHB1ZF9sb2NrKG1tLCBwdWRwKTsKLQkJcGFnZSA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spOwomIzQzOwkJcmV0ID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpOwogCQlzcGluX3VubG9jayhwdGwpOwotCQlpZiAocGFnZSkKLQkJCXJldHVybiBwYWdlOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbAomIzQzOwkJICogdGhlIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgbG9jay4gQSAxIEdCIGZvbGlvCiYjNDM7CQkgKiBjYW4gYmUgdXAgdG8gSFBBR0VfUFVEX05SIHBhZ2VzLCB0b28gbG9uZyB0byBmbHVzaCB1bmRlciBhCiYjNDM7CQkgKiBzcGlubG9jay4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHJldCAmZ3Q7IDAgJmFtcDsmYW1wOyBwYWdlcykKJiM0MzsJCQlndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJfQogCWlmICh1bmxpa2VseShwdWRfYmFkKHB1ZCkpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAotCXJldHVybiBmb2xsb3dfcG1kX21hc2sodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywKLQkJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBnZF90ICpwZ2RwLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXA0ZF90ICpwNGRwLCBwNGQ7CiAKQEAgLTk4MSwxNSAmIzQzOzExMTYsMTggQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJaWYgKCFwNGRfcHJlc2VudChwNGQpIHx8IHA0ZF9iYWQocDRkKSkKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAKLQlyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgcDRkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CXJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBlbmQsIHA0ZHAsIGZsYWdzLCBwYWdlcyk7CiB9CiAKIC8qKgotICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzCiYjNDM7ICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgcGFnZXMgYXQgYSB1c2VyLXZpcnR1YWwgYWRkcmVzcwogICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzcwogICogQGFkZHJlc3M6IHZpcnR1YWwgYWRkcmVzcyB0byBsb29rIHVwCiYjNDM7ICogQGVuZDogdmlydHVhbCBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0b3AgYmF0Y2hpbmcgY29udGlndW91cyBwYWdlcwogICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91cgotICogQHBhZ2VfbWFzazogYSBwb2ludGVyIHRvIG91dHB1dCBwYWdlX21hc2sKJiM0MzsgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG8KJiM0MzsgKiAgICAgICAgIHdhbGsgdGhlIHBhZ2UgdGFibGVzIChlLmcuIHRvIGZhdWx0IHBhZ2VzIGluKSB3aXRob3V0IGNvbGxlY3RpbmcKJiM0MzsgKiAgICAgICAgIG9yIHJlZmNvdW50aW5nIHRoZW0KICAqCiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluICZsdDtsaW51eC9tbS5oJmd0OwogICoKQEAgLTk5OCwzMyAmIzQzOzExMzYsMzIgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAgKiB0cmlnZ2VyIGEgZmF1bHQgd2l0aCBGQVVMVF9GTEFHX1VOU0hBUkUgc2V0LiBOb3RlIHRoYXQgdW5zaGFyaW5nIGlzIG9ubHkKICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLgogICoKLSAqIE9uIG91dHB1dCwgQHBhZ2VfbWFzayBpcyBzZXQgYWNjb3JkaW5nIHRvIHRoZSBzaXplIG9mIHRoZSBwYWdlLgotICoKLSAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvcgotICogYW4gZXJyb3IgcG9pbnRlciBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZAotICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLgomIzQzOyAqIFJldHVybjogdGhlIG51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIHRoYXQgd2VyZQomIzQzOyAqIHBsYWNlZCBpbnRvIEBwYWdlcyAoaWYgbm9uLU5VTEwpLCB3aGljaCBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgcGFnZXMKJiM0MzsgKiByZXF1ZXN0ZWQgdmlhIEBlbmQ7IDAgaWYgbm8gbWFwcGluZyBleGlzdHMgYXQgQGFkZHJlc3M7IG9yIGEgbmVnYXRpdmUKJiM0MzsgKiBlcnJubyBmb3IgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWQgYnkgYSBwYWdlIGRlc2NyaXB0b3IKJiM0MzsgKiAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKQomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXBnZF90ICpwZ2Q7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwotCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlsb25nIHJldDsKIAogCXZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTsKIAotCSpwYWdlX21hc2sgPSAwOwogCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpOwogCiAJaWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKQotCQlwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKJiM0MzsJCXJldCA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJZWxzZQotCQlwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJCXJldCA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgcGFnZXMpOwogCiAJdm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTsKIAotCXJldHVybiBwYWdlOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKQEAgLTEzNTgsNyAmIzQzOzE0OTUsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogewogCWxvbmcgcmV0ID0gMCwgaSA9IDA7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDsKIAogCWlmICghbnJfcGFnZXMpCiAJCXJldHVybiAwOwpAQCAtMTM3Myw3ICYjNDM7MTUwOSw3IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAlkbyB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwotCQl1bnNpZ25lZCBpbnQgcGFnZV9pbmNyZW07CiYjNDM7CQlsb25nIG5yOwogCiAJCS8qIGZpcnN0IGl0ZXJhdGlvbiBvciBjcm9zcyB2bWEgYm91bmQgKi8KIAkJaWYgKCF2bWEgfHwgc3RhcnQgJmd0Oz0gdm1hLSZndDt2bV9lbmQpIHsKQEAgLTE0MDAsOCAmIzQzOzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJCXBhZ2VzID8gJmFtcDtwYWdlIDogTlVMTCk7CiAJCQkJaWYgKHJldCkKIAkJCQkJZ290byBvdXQ7Ci0JCQkJcGFnZV9tYXNrID0gMDsKLQkJCQlnb3RvIG5leHRfcGFnZTsKJiM0MzsJCQkJZ3VwX2ZpbGxfcGFnZXModm1hLCBzdGFydCwgcGFnZSwgMSwKJiM0MzsJCQkJCSAgICAgICBwYWdlcyA/IHBhZ2VzICYjNDM7IGkgOiBOVUxMKTsKJiM0MzsJCQkJaSYjNDM7JiM0Mzs7CiYjNDM7CQkJCXN0YXJ0ICYjNDM7PSBQQUdFX1NJWkU7CiYjNDM7CQkJCW5yX3BhZ2VzLS07CiYjNDM7CQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlpZiAoIXZtYSkgewpAQCAtMTQyMywxMCAmIzQzOzE1NjMsMTEgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJfQogCQljb25kX3Jlc2NoZWQoKTsKIAotCQlwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsICZhbXA7cGFnZV9tYXNrKTsKLQkJaWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykgewomIzQzOwkJbnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFLAomIzQzOwkJCQkgICAgICBndXBfZmxhZ3MsIHBhZ2VzID8gJmFtcDtwYWdlc1tpXSA6IE5VTEwpOwomIzQzOwkJaWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7CiAJCQlyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLAotCQkJCQkgICBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkssIGxvY2tlZCk7CiYjNDM7CQkJCQkgICBuciA9PSAtRU1MSU5LLCBsb2NrZWQpOwogCQkJc3dpdGNoIChyZXQpIHsKIAkJCWNhc2UgMDoKIAkJCQlnb3RvIHJldHJ5OwpAQCAtMTQ0MCw3MCAmIzQzOzE1ODEsMzAgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCUJVRygpOwotCQl9IGVsc2UgaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVFWElTVCkgewomIzQzOwkJfSBlbHNlIGlmIChuciA9PSAtRUVYSVNUKSB7CiAJCQkvKgogCQkJICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZwogCQkJICogc3RydWN0IHBhZ2UuIElmIHRoZSBjYWxsZXIgZXhwZWN0cyAqKnBhZ2VzIHRvIGJlCiAJCQkgKiBmaWxsZWQgaW4sIGJhaWwgb3V0IG5vdywgYmVjYXVzZSB0aGF0IGNhbiYjMzk7dCBiZSBkb25lCi0JCQkgKiBmb3IgdGhpcyBwYWdlLgomIzQzOwkJCSAqIGZvciB0aGlzIHBhZ2UuIE90aGVyd2lzZSBhZHZhbmNlIGJ5IHRoZSBvbmUgcGFnZQomIzQzOwkJCSAqIGZvbGxvd19wYWdlX21hc2soKSBsb29rZWQgYXQuCiAJCQkgKi8KIAkJCWlmIChwYWdlcykgewotCQkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiYjNDM7CQkJCXJldCA9IG5yOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKElTX0VSUihwYWdlKSkgewotCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKJiM0MzsJCQluciA9IDE7CiYjNDM7CQl9IGVsc2UgaWYgKG5yICZsdDsgMCkgewomIzQzOwkJCXJldCA9IG5yOwogCQkJZ290byBvdXQ7CiAJCX0KLW5leHRfcGFnZToKLQkJcGFnZV9pbmNyZW0gPSAxICYjNDM7ICh+KHN0YXJ0ICZndDsmZ3Q7IFBBR0VfU0hJRlQpICZhbXA7IHBhZ2VfbWFzayk7Ci0JCWlmIChwYWdlX2luY3JlbSAmZ3Q7IG5yX3BhZ2VzKQotCQkJcGFnZV9pbmNyZW0gPSBucl9wYWdlczsKLQotCQlpZiAocGFnZXMpIHsKLQkJCXN0cnVjdCBwYWdlICpzdWJwYWdlOwotCQkJdW5zaWduZWQgaW50IGo7CiAKLQkJCS8qCi0JCQkgKiBUaGlzIG11c3QgYmUgYSBsYXJnZSBmb2xpbyAoYW5kIGRvZXNuJiMzOTt0IG5lZWQgdG8KLQkJCSAqIGJlIHRoZSB3aG9sZSBmb2xpbzsgaXQgY2FuIGJlIHBhcnQgb2YgaXQpLCBkbwotCQkJICogdGhlIHJlZmNvdW50IHdvcmsgZm9yIGFsbCB0aGUgc3VicGFnZXMgdG9vLgotCQkJICoKLQkJCSAqIE5PVEU6IGhlcmUgdGhlIHBhZ2UgbWF5IG5vdCBiZSB0aGUgaGVhZCBwYWdlCi0JCQkgKiBlLmcuIHdoZW4gc3RhcnQgYWRkciBpcyBub3QgdGhwLXNpemUgYWxpZ25lZC4KLQkJCSAqIHRyeV9ncmFiX2ZvbGlvKCkgc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0YWlsCi0JCQkgKiBwYWdlcy4KLQkJCSAqLwotCQkJaWYgKHBhZ2VfaW5jcmVtICZndDsgMSkgewotCQkJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCi0JCQkJLyoKLQkJCQkgKiBTaW5jZSB3ZSBhbHJlYWR5IGhvbGQgcmVmY291bnQgb24gdGhlCi0JCQkJICogbGFyZ2UgZm9saW8sIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCi0JCQkJICovCi0JCQkJaWYgKHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCBwYWdlX2luY3JlbSAtIDEsCi0JCQkJCQkgICBndXBfZmxhZ3MpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFJlbGVhc2UgdGhlIDFzdCBwYWdlIHJlZiBpZiB0aGUKLQkJCQkJICogZm9saW8gaXMgcHJvYmxlbWF0aWMsIGZhaWwgaGFyZC4KLQkJCQkJICovCi0JCQkJCWd1cF9wdXRfZm9saW8oZm9saW8sIDEsIGd1cF9mbGFncyk7Ci0JCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChqID0gMDsgaiAmbHQ7IHBhZ2VfaW5jcmVtOyBqJiM0MzsmIzQzOykgewotCQkJCXN1YnBhZ2UgPSBwYWdlICYjNDM7IGo7Ci0JCQkJcGFnZXNbaSAmIzQzOyBqXSA9IHN1YnBhZ2U7Ci0JCQkJZmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgc3RhcnQgJiM0MzsgaiAqIFBBR0VfU0laRSk7Ci0JCQkJZmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7Ci0JCQl9Ci0JCX0KJiM0MzsJCS8qIENoZWNrIHRoYXQgd2UgZGlkbiYjMzk7dCBwaW4gbW9yZSBwYWdlcyB0aGFuIHRoZSBjYWxsZXIgd2lsbCBmcmVlLiAqLwomIzQzOwkJVk1fV0FSTl9PTl9PTkNFKG5yICZndDsgbnJfcGFnZXMpOwogCi0JCWkgJiM0Mzs9IHBhZ2VfaW5jcmVtOwotCQlzdGFydCAmIzQzOz0gcGFnZV9pbmNyZW0gKiBQQUdFX1NJWkU7Ci0JCW5yX3BhZ2VzIC09IHBhZ2VfaW5jcmVtOwomIzQzOwkJaSAmIzQzOz0gbnI7CiYjNDM7CQlzdGFydCAmIzQzOz0gbnIgKiBQQUdFX1NJWkU7CiYjNDM7CQlucl9wYWdlcyAtPSBucjsKIAl9IHdoaWxlIChucl9wYWdlcyk7CiBvdXQ6CiAJcmV0dXJuIGkgPyBpIDogcmV0Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4OQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDQ3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipHVVAgUmVmYWN0b3JpbmcgYW5kIEZ1enppbmcgQ29uc2lkZXJhdGlvbnMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7WWVzLCB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIHRob3JvdWdoIGxvb2sgZm9yIGZ1enppbmcgcG90ZW50aWFsLiYjMzQ7IFRoaXMgcGF0Y2ggaXMgY2xlYXJseSB0b3VjaGluZyB0aGUgR1VQIChHZXQgVXNlciBQYWdlcykgY29kZSwgc3BlY2lmaWNhbGx5IGBtbS9ndXAuY2AsIGFuZCB0aGF0JiMzOTtzIGEgcmVkIGZsYWcgaW4gYSBnb29kIHdheSwgbWVhbmluZyBpdOKAmXMgYSBoaWdoLWltcGFjdCBhcmVhLiBUaGlzIGlzbiYjMzk7dCBzb21lIG1pbm9yIHR3ZWFrOyBpdCYjMzk7cyBhIGZ1bmRhbWVudGFsIHJlZmFjdG9yaW5nIG9mIGhvdyBHVVAgd29ya3MuIFRoZXkmIzM5O3JlIGNoYW5naW5nIHRoZSByZXR1cm4gdmFsdWVzIGFuZCBwb3B1bGF0aW9uIG9mIHRoZSBgcGFnZXNgIGFycmF5LCB3aGljaCBpbiB0dXJuIG1lYW5zIHRoZSBjb3JlIGxvZ2ljIGZvciB0cmFuc2xhdGluZyB1c2VyIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHBoeXNpY2FsIHBhZ2VzIGlzIGJlaW5nIG1vZGlmaWVkLiBXZSBuZWVkIHRvIGFzc2VzcyB0aGUgZnV6emluZyBhdHRhY2sgc3VyZmFjZS4KClRoZXkmIzM5O3JlIHRha2luZyBgc3RydWN0IHBhZ2UgKmAgYW5kIGBwYWdlX21hc2tgIGFuZCBtb3ZpbmcgdG8gcmV0dXJuaW5nIGEgYGxvbmdgIHZhbHVlIChjb3VudCBvZiBwYWdlcyBvciBlcnJvcikgYW5kIGRpcmVjdGx5IGZpbGxpbmcgdGhlIGBwYWdlc2AgYXJyYXkuIEEgc2VyaW91cyBjaGFuZ2UgdG8gYSBmdW5kYW1lbnRhbCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gbGlrZSB0aGlzIGRlbWFuZHMgc2NydXRpbnkuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgc2hpZnQgaW4gdGhlICp3YXkqIHdlIGdldCB1c2VyIHBhZ2VzLgoKTG9va2luZyBhdCB0aGUgY2hhbmdlZCBmdW5jdGlvbnMuLi4geWVhaCwgdGhpcyBpcyBzaWduaWZpY2FudDogYG5vX3BhZ2VfdGFibGVgLCBgZ3VwX2ZpbGxfcGFnZXNgLCBgZm9sbG93X2h1Z2VfcHVkYCwgYGZvbGxvd19odWdlX3BtZGAsIHRoZSBuZXcgY29tbWl0IGZ1bmN0aW9ucywgYW5kIG9mIGNvdXJzZSwgdGhlIG1hc2sgZnVuY3Rpb25zLiBUaGlzIGlzIEdVUCBsb2dpYywgdG91Y2hpbmcgc2V2ZXJhbCBrZXkgY29tcG9uZW50cyBvZiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LgoKU28sIHRoZSBuZXh0IHN0ZXAgaXMgdG8gbmFpbCBkb3duIHRoZSBtb3N0IGNyaXRpY2FsIGZ1bmN0aW9ucyBmb3IgZnV6emluZy4gYF9fZ2V0X3VzZXJfcGFnZXNgIG1pZ2h0IGJlIHRvbyBnZW5lcmFsLCBidXQgYGZvbGxvd19wYWdlX21hc2tgLCBgZm9sbG93X3BhZ2VfcHRlYCwgYGZvbGxvd19wbWRfbWFza2AsIGBmb2xsb3dfcHVkX21hc2tgLCBhbmQgYGZvbGxvd19wNGRfbWFza2AgYWxsIGxvb2sgbGlrZSBwcmltZSB0YXJnZXRzLiBUaGUgbWFzayBmdW5jdGlvbnMgYXJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBiZWNhdXNlIHRoZXkgZGVhbCB3aXRoIHZhcmlvdXMgcGFnZSB0YWJsZSBsZXZlbHMsIGFuZCBzdWJ0bGUgZXJyb3JzIGluIHRob3NlIGNhbiBsZWFkIHRvIHNpZ25pZmljYW50IGlzc3Vlcy4KCkZpbmFsbHksIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gU2luY2UgdGhlIHBhdGNoIGlzIGluIGBtbS9ndXAuY2AsIHRoZSBjb2RlIHdpbGwgYWx3YXlzIGJlIGNvbXBpbGVkLCBob3dldmVyIHNvbWUgcGFydHMgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgYENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU2AgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIHNob3VsZCBwdWxsIHVwIHRoZSB0cmVlIGFuZCBjaGVjay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ndXAuYz02MzY9c3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi0tXG5tbS9ndXAuYy02NTItXG5tbS9ndXAuYzo2NTM6I2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xubW0vZ3VwLmMtNjU0LS8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQVURzIGluIENPVyBtYXBwaW5ncy4gKi9cbi0tXG5tbS9ndXAuYz03MjM9c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTc3Mi1cbm1tL2d1cC5jOjc3MzojZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXG5tbS9ndXAuYy03NzQtc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jPTc4MT1zdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtNzg2LX1cbm1tL2d1cC5jOjc4NzojZW5kaWZcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xubW0vZ3VwLmMtNzg4LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMzg4CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlcyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gRmlyc3Qgb3JkZXIgb2YgYnVzaW5lc3M6IEkgbmVlZCB0byB2ZXJpZnkgdGhlIHN0YXR1cyBvZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhpcyBpcyBmdW5kYW1lbnRhbC4gRGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQmIzM5O3MgZW5hYmxlZCBvciBub3QsIGl0IGRpY3RhdGVzIGEgaHVnZSBzd2F0aCBvZiB0aGUga2VybmVsJiMzOTtzIG1lbW9yeSBtYW5hZ2VtZW50IGJlaGF2aW9yLCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MsIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zIHdpdGggb3RoZXIgc3Vic3lzdGVtcy4gSSBuZWVkIHRvIGtub3cgd2hlcmUgd2Ugc3RhbmQuIEEgcXVpY2sgY2hlY2sgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgYWJzb2x1dGVseSBlc3NlbnRpYWwgYmVmb3JlIHByb2NlZWRpbmcuIEFyZSBUSFBzIGVuYWJsZWQgb3IgaXMgdGhlcmUgc29tZXRoaW5nIGVsc2UgZ29pbmcgb24/CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZ3VwLmM9NzIzPXN0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy03NTktXG5tbS9ndXAuYzo3NjA6I2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vZ3VwLmMtNzYxLVx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkpXG5tbS9ndXAuYy03NjItXHRcdHRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpO1xubW0vZ3VwLmM6NzYzOiNlbmRpZlx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXG5tbS9ndXAuYy03NjQtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3NTUKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgSHVnZSBQYWdlIENvbmZpZ3VyYXRpb24gZm9yIEdVUCBUZXN0aW5nKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBjb25maWd1cmF0aW9ucyBhbmQgdGhpbmtpbmcsICYjMzQ7WWVwLCB0aGVzZSBhcmUgZGVmaW5pdGVseSB0aGUgcmlnaHQgc2V0dGluZ3MgdG8gaGF2ZSBlbmFibGVkIHdoZW4gdGVzdGluZyBodWdlIHBhZ2VzIGluIEdVUC4mIzM0OyBJdCYjMzk7cyBnb29kIHRvIGJlIG1ldGljdWxvdXMgYWJvdXQgdGhpcyBzdHVmZi4gKlRSQU5TUEFSRU5UX0hVR0VQQUdFKiBpcyBhIGdpdmVuOyB0aGF0JiMzOTtzIHRoZSBicmVhZCBhbmQgYnV0dGVyIGZvciB0cmFuc3BhcmVudCBodWdlIHBhZ2Ugc3VwcG9ydCwgbm8gc3VycHJpc2VzIHRoZXJlLiBOb3csICpQR1RBQkxFX0hBU19IVUdFX0xFQVZFUyogaXMgdGhlIG1vcmUgaW50ZXJlc3Rpbmcgb25lLiBUaGF0JiMzOTtzIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQsIHNvIEkgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgY2FuIGVuYWJsZSB0aGlzIG9uZSBkaXJlY3RseSwgb3IgaWYgdGhlIGFyY2hpdGVjdHVyZSB3aWxsIHNlbGVjdCB0aGlzIGl0c2VsZi4gSSYjMzk7bSBnb2luZyB0byBkaWcgYSBsaXR0bGUgZGVlcGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBQR1RBQkxFX0hBU19IVUdFX0xFQVZFUyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTEwMDg9Y29uZmlnIFBBR0VfTUFQQ09VTlRcbi0tXG5tbS9LY29uZmlnLTEwMTMtI1xubW0vS2NvbmZpZzoxMDE0OmNvbmZpZyBQR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xubW0vS2NvbmZpZy0xMDE1LVx0ZGVmX2Jvb2wgVFJBTlNQQVJFTlRfSFVHRVBBR0UgfHwgSFVHRVRMQl9QQUdFXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMwOTgKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiA3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uIGZvciBIdWdlIFBhZ2VzKioKCk9rYXksIHNvIEkgc2VlIHRoYXQgYFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTYCBpcyBkZWZpbmVkIGFzIGVpdGhlciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIG9yIGBIVUdFVExCX1BBR0VgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGl0JiMzOTtzIGEgbG9naWNhbCBjb25uZWN0aW9uLiBDb25zaWRlcmluZyB0aGlzLCB0aGUgb2J2aW91cyBhcHByb2FjaCBpcyB0byBtYWtlIHN1cmUgKmJvdGgqIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCX1BBR0VgIGFyZSBlbmFibGVkLiBJdCYjMzk7cyB0aGUgbW9zdCByb2J1c3Qgc29sdXRpb24uIExldCYjMzk7cyBkaWcgaW50byB0aGUgYEhVR0VUTEJfUEFHRWAgb3B0aW9uIGluIHRoZSBLY29uZmlnIGZpbGUgYW5kIHZlcmlmeSBpdHMgc3RhdHVzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3MgaW4gcGxhY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBIVUdFVExCX1BBR0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9zaC9tbS9LY29uZmlnPTE1OD1jaG9pY2Vcbi0tXG5hcmNoL3NoL21tL0tjb25maWctMTYzLVxuYXJjaC9zaC9tbS9LY29uZmlnOjE2NDpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRLXG5hcmNoL3NoL21tL0tjb25maWctMTY1LVx0Ym9vbCBcJiMzNDs2NGtCXCYjMzQ7XG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE2Ny1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNjg6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzI1NktcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNjktXHRib29sIFwmIzM0OzI1NmtCXCYjMzQ7XG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE3MS1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzI6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzFNQlxuYXJjaC9zaC9tbS9LY29uZmlnLTE3My1cdGJvb2wgXCYjMzQ7MU1CXCYjMzQ7XG5hcmNoL3NoL21tL0tjb25maWctMTc0LVxuYXJjaC9zaC9tbS9LY29uZmlnOjE3NTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNE1CXG5hcmNoL3NoL21tL0tjb25maWctMTc2LVx0Ym9vbCBcJiMzNDs0TUJcJiMzNDtcbi0tXG5hcmNoL3NoL21tL0tjb25maWctMTc4LVxuYXJjaC9zaC9tbS9LY29uZmlnOjE3OTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRNQlxuYXJjaC9zaC9tbS9LY29uZmlnLTE4MC1cdGJvb2wgXCYjMzQ7NjRNQlwmIzM0O1xuLS1cbmZzL0tjb25maWc9MjYyPWlmIEhVR0VUTEJGU1xuZnMvS2NvbmZpZzoyNjM6Y29uZmlnIEhVR0VUTEJfUEFHRV9PUFRJTUlaRV9WTUVNTUFQX0RFRkFVTFRfT05cbmZzL0tjb25maWctMjY0LVx0Ym9vbCBcJiMzNDtIdWdlVExCIFZtZW1tYXAgT3B0aW1pemF0aW9uIChIVk8pIGRlZmF1bHRzIHRvIG9uXCYjMzQ7XG4tLVxuZnMvS2NvbmZpZz0yNzE9ZW5kaWYgIyBIVUdFVExCRlNcbmZzL0tjb25maWctMjcyLVxuZnMvS2NvbmZpZzoyNzM6Y29uZmlnIEhVR0VUTEJfUEFHRVxuZnMvS2NvbmZpZy0yNzQtXHRkZWZfYm9vbCBIVUdFVExCRlNcbi0tXG5mcy9LY29uZmlnLTI3Ni1cbmZzL0tjb25maWc6Mjc3OmNvbmZpZyBIVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUFxuZnMvS2NvbmZpZy0yNzgtXHRkZWZfYm9vbCBIVUdFVExCX1BBR0Vcbi0tXG5tbS9LY29uZmlnPTcwNj1jb25maWcgQVJDSF9FTkFCTEVfVEhQX01JR1JBVElPTlxuLS1cbm1tL0tjb25maWctNzA4LVxubW0vS2NvbmZpZzo3MDk6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFX1ZBUklBQkxFXG5tbS9LY29uZmlnLTcxMC1cdGRlZl9ib29sIG5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5MzAKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFbmFibGluZyBIdWdlIFBhZ2VzIGFuZCB0aGUgRmlsZXN5c3RlbSoqCgpPa2F5LCBzbyBgSFVHRVRMQl9QQUdFYCBpcyBkZWZpbmVkIGFzIGEgYm9vbGVhbiAoYGRlZl9ib29sYCkgYW5kIGxpbmtlZCBkaXJlY3RseSB0byBgSFVHRVRMQkZTYC4gVGhpcyBzZWVtcyBzdHJhaWdodGZvcndhcmQ6IElmIHdlIHdhbnQgdG8gdXNlIGh1Z2UgcGFnZXMsIHdlIGRlZmluaXRlbHkgbmVlZCB0aGUgaHVnZSBwYWdlIGZpbGVzeXN0ZW0gKGBIVUdFVExCRlNgKSBlbmFibGVkLiBJdCYjMzk7cyBhIGRlcGVuZGVuY3kuIE1ha2VzIHNlbnNlLgoKTm93LCBsZXQmIzM5O3MganVzdCBjb25maXJtIHNvbWV0aGluZyBhYm91dCBob3cgdHJhbnNwYXJlbnQgaHVnZSBwYWdlcyBhcmUgaGFuZGxlZC4gTGV0IG1lIGRvdWJsZS1jaGVjayB0aGUgY29uZmlndXJhdGlvbiAoYEtjb25maWdgKSBhbmQgc2VlIGhvdyBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHNldCB1cCBpbiByZWxhdGlvbiB0byBhbGwgdGhpcy4gSSYjMzk7bGwgbmVlZCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyYjMzk7cyBjb25zaXN0ZW50IGFuZCB0aGF0IHdlJiMzOTtyZSBjb3ZlcmluZyBhbGwgb3VyIGJhc2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04NDM9Y29uZmlnIE1NX0lEXG4tLVxubW0vS2NvbmZpZy04NDUtXG5tbS9LY29uZmlnOjg0NjptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTg0Ny1cdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODY0PWNob2ljZVxuLS1cbm1tL0tjb25maWctODY5LVxubW0vS2NvbmZpZzo4NzA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg3MS1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg3Ni1cbm1tL0tjb25maWc6ODc3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0Vcbm1tL0tjb25maWctODc4LVx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg4NS1cbm1tL0tjb25maWc6ODg2Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXG5tbS9LY29uZmlnLTg4Ny1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODkzPWNob2ljZVxuLS1cbm1tL0tjb25maWctOTAyLVxubW0vS2NvbmZpZzo5MDM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MDQtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkxMi1cbm1tL0tjb25maWc6OTEzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTkxNC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkyMC1cbm1tL0tjb25maWc6OTIxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTIyLVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MjgtXG5tbS9LY29uZmlnOjkyOTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05MzAtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05Mzg9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy05NDctXG5tbS9LY29uZmlnOjk0ODpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXG5tbS9LY29uZmlnLTk0OS1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTU2LVxubW0vS2NvbmZpZzo5NTc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTU4LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTY0LVxubW0vS2NvbmZpZzo5NjU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05NjYtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk3Mi1cbm1tL0tjb25maWc6OTczOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTk3NC1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ4NjEKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA1MDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBIYW5kbGluZyBmb3IgT3B0aW1pemF0aW9uKioKCk9rYXksIHNvIHRoZSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZW5hYmxlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCRlNgLiBUaGF0IHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIHN0YXJ0aW5nIHBvaW50LiBOb3csIGxldCYjMzk7cyBkcmlsbCBkb3duIGludG8gdGhlIGtlcm5lbCBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gaGFuZGxpbmcgdGhlc2UgcGFnZXMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUga2V5IGZ1bmN0aW9ucyB0aGF0IGFyZSByZWxldmFudCB0byB0aGlzIGFyZWEgZm9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24uCgpNeSBpbml0aWFsIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBsb29rIGF0IHRoZSB2YXJpb3VzIGBmb2xsb3dfKmAgZnVuY3Rpb25zIGFuZCBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy4KCkhvbGQgb24gYSBtb21lbnQsIGEgZGVlcGVyIGxvb2sgYXQgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZXMsIHJldmVhbHMgdGhhdCBgZm9sbG93X29uZV9wdGVgLCBgZm9sbG93X3B0ZV9iYXRjaGAsIGBmb2xsb3dfcGFnZV9wdGVfY29tbWl0YCwgYGd1cF9maWxsX3BhZ2VzYCwgYW5kIGBub19wYWdlX3RhYmxlYCBhcmUgYWxsICpzdGF0aWMqIGZ1bmN0aW9ucy4gVGhhdCBtYWtlcyBtZSB3b25kZXIgaWYgdGhleSYjMzk7cmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIuIExldCYjMzk7cyBjaGVjay4KCkl0IGxvb2tzIGxpa2UgdGhlIGNvbXBpbGVyIGlzbiYjMzk7dCBpbmxpbmluZyB0aGVtLiBUaGV5JiMzOTtyZSBhbGwgc3RhdGljLCBidXQgbm90IGlubGluZS4gTm93LCBJIHNlZSB0aGUgcHJvbXB0JiMzOTtzIGluc3RydWN0aW9uOiAmIzM0O1ByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucy4mIzM0OyBUaGlzIG1lYW5zIHRoZSBmb2N1cyBzaG91bGQgYmUgb24gdGhlICpub24tc3RhdGljKiBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoZXNlIGludGVybmFsIGhlbHBlcnMuIFRoaXMgaXMgYSBjcnVjaWFsIGRpc3RpbmN0aW9uLiBXZSB3YW50IHRoZSBzdGFibGUsIHdlbGwtZGVmaW5lZCBlbnRyeSBwb2ludHMsIG5vdCB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KClNpbmNlIGBfX2dldF91c2VyX3BhZ2VzYCBpcyBzdGF0aWMsIG15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHdoYXQgY2FsbHMgaXQuIFRoYXQmIzM5O3MgdGhlIGNvcnJlY3QgcGF0aCB0byBmaW5kaW5nIGEgbm9uLXN0YXRpYyBBUEkgZW50cnkgcG9pbnQuIFRoaXMgaXMgdGhlIHBhdGggdG8gcHVyc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX2dldF91c2VyX3BhZ2VzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZ3VwLmM9OTI5PXN0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtOTUzLSAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0XG5tbS9ndXAuYzo5NTQ6ICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLlxubW0vZ3VwLmMtOTU1LSAqL1xuLS1cbm1tL2d1cC5jPTE0MDI9c3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZ3VwX3ZtYV9sb29rdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vZ3VwLmMtMTQzNy0vKipcbm1tL2d1cC5jOjE0Mzg6ICogX19nZXRfdXNlcl9wYWdlcygpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5XG5tbS9ndXAuYy0xNDM5LSAqIEBtbTpcdFx0bW1fc3RydWN0IG9mIHRhcmdldCBtbVxuLS1cbm1tL2d1cC5jLTE0NjAtICpcbm1tL2d1cC5jOjE0NjE6ICogX19nZXRfdXNlcl9wYWdlcyB3YWxrcyBhIHByb2Nlc3MmIzM5O3MgcGFnZSB0YWJsZXMgYW5kIHRha2VzIGEgcmVmZXJlbmNlIHRvXG5tbS9ndXAuYy0xNDYyLSAqIGVhY2ggc3RydWN0IHBhZ2UgdGhhdCBlYWNoIHVzZXIgYWRkcmVzcyBjb3JyZXNwb25kcyB0byBhdCBhIGdpdmVuXG4tLVxubW0vZ3VwLmMtMTQ2Ni0gKiBUaGlzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBwYWdlIGV4aXN0cyBpbiB0aGUgdXNlciBtYXBwaW5ncyB3aGVuXG5tbS9ndXAuYzoxNDY3OiAqIF9fZ2V0X3VzZXJfcGFnZXMgcmV0dXJucywgYW5kIHRoZXJlIG1heSBldmVuIGJlIGEgY29tcGxldGVseSBkaWZmZXJlbnRcbm1tL2d1cC5jLTE0NjgtICogcGFnZSB0aGVyZSBpbiBzb21lIGNhc2VzIChlZy4gaWYgbW1hcHBlZCBwYWdlY2FjaGUgaGFzIGJlZW4gaW52YWxpZGF0ZWRcbi0tXG5tbS9ndXAuYy0xNDg3LSAqIEluIG1vc3QgY2FzZXMsIGdldF91c2VyX3BhZ2VzIG9yIGdldF91c2VyX3BhZ2VzX2Zhc3Qgc2hvdWxkIGJlIHVzZWRcbm1tL2d1cC5jOjE0ODg6ICogaW5zdGVhZCBvZiBfX2dldF91c2VyX3BhZ2VzLiBfX2dldF91c2VyX3BhZ2VzIHNob3VsZCBiZSB1c2VkIG9ubHkgaWZcbm1tL2d1cC5jLTE0ODktICogeW91IG5lZWQgc29tZSBzcGVjaWFsIEBndXBfZmxhZ3MuXG5tbS9ndXAuYy0xNDkwLSAqL1xubW0vZ3VwLmM6MTQ5MTpzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0vZ3VwLmMtMTQ5Mi1cdFx0dW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9ndXAuYz0xNzI2PXN0YXRpYyBib29sIGd1cF9zaWduYWxfcGVuZGluZyh1bnNpZ25lZCBpbnQgZmxhZ3MpXG4tLVxubW0vZ3VwLmMtMTc0Ni0gKlxubW0vZ3VwLmM6MTc0NzogKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24sIHVubGlrZSBfX2dldF91c2VyX3BhZ2VzKCksIHdpbGwgbm90IHJldHVybiAwXG5tbS9ndXAuYy0xNzQ4LSAqIGZvciBucl9wYWdlcyBcdTAwM2UgMCwgdW5sZXNzIEZPTExfTk9XQUlUIGlzIHVzZWQuXG5tbS9ndXAuYy0xNzQ5LSAqL1xubW0vZ3VwLmM6MTc1MDpzdGF0aWMgX19hbHdheXNfaW5saW5lIGxvbmcgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG5tbS9ndXAuYy0xNzUxLVx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0vZ3VwLmMtMTc5Mi1cdGZvciAoOzspIHtcbm1tL2d1cC5jOjE3OTM6XHRcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZmxhZ3MsIHBhZ2VzLFxubW0vZ3VwLmMtMTc5NC1cdFx0XHRcdCAgICAgICBsb2NrZWQpO1xuLS1cbm1tL2d1cC5jLTE4NTItXHRcdCpsb2NrZWQgPSAxO1xubW0vZ3VwLmM6MTg1MzpcdFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIDEsIGZsYWdzIHwgRk9MTF9UUklFRCxcbm1tL2d1cC5jLTE4NTQtXHRcdFx0XHQgICAgICAgcGFnZXMsIGxvY2tlZCk7XG4tLVxubW0vZ3VwLmM9MTkxND1sb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTE5NjAtXHQgKi9cbm1tL2d1cC5jOjE5NjE6XHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgbnJfcGFnZXMsIGd1cF9mbGFncyxcbm1tL2d1cC5jLTE5NjItXHRcdFx0ICAgICAgIE5VTEwsIGxvY2tlZCA/IGxvY2tlZCA6IFx1MDAyNmxvY2FsX2xvY2tlZCk7XG4tLVxubW0vZ3VwLmMtMTk3OS0gKiBSZXR1cm5zIGVpdGhlciBudW1iZXIgb2YgcHJvY2Vzc2VkIHBhZ2VzIGluIHRoZSBNTSwgb3IgYSBuZWdhdGl2ZSBlcnJvclxubW0vZ3VwLmM6MTk4MDogKiBjb2RlIG9uIGVycm9yIChzZWUgX19nZXRfdXNlcl9wYWdlcygpKS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVwb3J0c1xubW0vZ3VwLmMtMTk4MS0gKiBlcnJvcnMgcmVsYXRlZCB0byBWTUFzLCBzdWNoIGFzIGluY29tcGF0aWJsZSBtYXBwaW5ncywgYXMgZXhwZWN0ZWQgYnlcbi0tXG5tbS9ndXAuYz0xOTg4PWxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuLS1cbm1tL2d1cC5jLTIwMTItXG5tbS9ndXAuYzoyMDEzOlx0cmV0ID0gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgTlVMTCwgbG9ja2VkLFxubW0vZ3VwLmMtMjAxNC1cdFx0XHRcdCAgICAgIGd1cF9mbGFncyk7XG4tLVxubW0vZ3VwLmM9MjAyNj1pbnQgX19tbV9wb3B1bGF0ZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IGlnbm9yZV9lcnJvcnMpXG4tLVxubW0vZ3VwLmMtMjA3OS0jZWxzZSAvKiBDT05GSUdfTU1VICovXG5tbS9ndXAuYzoyMDgwOnN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXNfbG9ja2VkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0vZ3VwLmMtMjA4MS1cdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlcyxcbi0tXG5tbS9ndXAuYz0yMjg4PXN0cnVjdCBwYWdlICpnZXRfZHVtcF9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50ICpsb2NrZWQpXG4tLVxubW0vZ3VwLmMtMjI5Mi1cbm1tL2d1cC5jOjIyOTM6XHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChjdXJyZW50LVx1MDAzZW1tLCBhZGRyLCAxLCBcdTAwMjZwYWdlLCBsb2NrZWQsXG5tbS9ndXAuYy0yMjk0LVx0XHRcdFx0ICAgICAgRk9MTF9GT1JDRSB8IEZPTExfRFVNUCB8IEZPTExfR0VUKTtcbi0tXG5tbS9ndXAuYz0yNDIyPW1pZ3JhdGVfbG9uZ3Rlcm1fdW5waW5uYWJsZV9mb2xpb3Moc3RydWN0IGxpc3RfaGVhZCAqbW92YWJsZV9mb2xpb19saXN0LFxuLS1cbm1tL2d1cC5jLTI0NTAtXHRcdCAqIFdlIGNhbiYjMzk7dCBtaWdyYXRlIGZvbGlvcyB3aXRoIHVuZXhwZWN0ZWQgcmVmZXJlbmNlcywgc28gZHJvcFxubW0vZ3VwLmM6MjQ1MTpcdFx0ICogdGhlIHJlZmVyZW5jZSBvYnRhaW5lZCBieSBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZCgpLlxubW0vZ3VwLmMtMjQ1Mi1cdFx0ICogTWlncmF0aW5nIGZvbGlvcyBoYXZlIGJlZW4gYWRkZWQgdG8gbW92YWJsZV9mb2xpb19saXN0IGFmdGVyXG4tLVxubW0vZ3VwLmM9MjU1NT1zdGF0aWMgbG9uZyBjaGVja19hbmRfbWlncmF0ZV9tb3ZhYmxlX2ZvbGlvcyh1bnNpZ25lZCBsb25nIG5yX2ZvbGlvcyxcbi0tXG5tbS9ndXAuYy0yNTYyLS8qXG5tbS9ndXAuYzoyNTYzOiAqIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZCgpIGlzIGEgd3JhcHBlciBmb3IgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQgd2hpY2hcbm1tL2d1cC5jLTI1NjQtICogYWxsb3dzIHVzIHRvIHByb2Nlc3MgdGhlIEZPTExfTE9OR1RFUk0gZmxhZy5cbi0tXG5tbS9ndXAuYz0yNTY2PXN0YXRpYyBsb25nIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0yNTc2LVx0aWYgKCEoZ3VwX2ZsYWdzIFx1MDAyNiBGT0xMX0xPTkdURVJNKSlcbm1tL2d1cC5jOjI1Nzc6XHRcdHJldHVybiBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChtbSwgc3RhcnQsIG5yX3BhZ2VzLCBwYWdlcyxcbm1tL2d1cC5jLTI1NzgtXHRcdFx0XHRcdCAgICAgICBsb2NrZWQsIGd1cF9mbGFncyk7XG4tLVxubW0vZ3VwLmMtMjU4MS1cdGRvIHtcbm1tL2d1cC5jOjI1ODI6XHRcdG5yX3Bpbm5lZF9wYWdlcyA9IF9fZ2V0X3VzZXJfcGFnZXNfbG9ja2VkKG1tLCBzdGFydCwgbnJfcGFnZXMsXG5tbS9ndXAuYy0yNTgzLVx0XHRcdFx0XHRcdFx0ICBwYWdlcywgbG9ja2VkLFxuLS1cbm1tL2d1cC5jPTI3MDQ9bG9uZyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vZ3VwLmMtMjcxNC1cbm1tL2d1cC5jOjI3MTU6XHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgcGFnZXMsXG5tbS9ndXAuYy0yNzE2LVx0XHRcdFx0ICAgICAgIGxvY2tlZCA/IGxvY2tlZCA6IFx1MDAyNmxvY2FsX2xvY2tlZCxcbi0tXG5tbS9ndXAuYz0yNzQ1PWxvbmcgZ2V0X3VzZXJfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9ndXAuYy0yNzUyLVxubW0vZ3VwLmM6Mjc1MzpcdHJldHVybiBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChjdXJyZW50LVx1MDAzZW1tLCBzdGFydCwgbnJfcGFnZXMsIHBhZ2VzLFxubW0vZ3VwLmMtMjc1NC1cdFx0XHRcdCAgICAgICBcdTAwMjZsb2NrZWQsIGd1cF9mbGFncyk7XG4tLVxubW0vZ3VwLmM9Mjc3Mz1sb25nIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vZ3VwLmMtMjc4MS1cbm1tL2d1cC5jOjI3ODI6XHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoY3VycmVudC1cdTAwM2VtbSwgc3RhcnQsIG5yX3BhZ2VzLCBwYWdlcyxcbm1tL2d1cC5jLTI3ODMtXHRcdFx0XHQgICAgICAgXHUwMDI2bG9ja2VkLCBndXBfZmxhZ3MpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg5MgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDIzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgVXNlciBQYWdlIEZhdWx0cyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGVzZSB1c2VyIHBhZ2UgZnVuY3Rpb25zLiBNeSBwcmltYXJ5IGVudHJ5IHBvaW50cyBoZXJlIHNlZW0gdG8gYmUgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgLCBhbmQgYGdldF9kdW1wX3BhZ2VgLiBJJiMzOTttIHN0YXJ0aW5nIHRvIHRoaW5rIGBnZXRfdXNlcl9wYWdlc2AgaXMgYSAqdmVyeSogaG90IHBhdGgg4oCTIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGl0dGluZyB0aGF0LiBMZXQgbWUgbG9vayBhdCBzb21lIG9mIHRoZSBzeXNjYWxscyB0byB1bmRlcnN0YW5kIGhvdyB0aG9zZSBwYXRocyBhcmUgdG91Y2hlZC4KCkFscmlnaHQsIGBtbWFwYCB3aXRoIGBNQVBfUE9QVUxBVEVgIHdpbGwgY2xlYXJseSBoaXQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYC4gYG1sb2NrYCB0cmlnZ2VycyBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgbWFrZXMgc2Vuc2UgZm9yIHByZXZlbnRpbmcgc3dhcHBpbmcuIFRoZW4sIGBtYWR2aXNlYCB3aXRoIGBNQURWX1BPUFVMQVRFX1JFQURgIG9yIGBNQURWX1BPUFVMQVRFX1dSSVRFYCAqYWxzbyogY2FsbHMgYGZhdWx0aW5fcGFnZV9yYW5nZWAuIFRoYXQmIzM5O3MgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCwgYW5kIHRoYXQgaGFzIGltcGxpY2F0aW9ucyBmb3IgdGhlIGBtYWR2aXNlYCBzZW1hbnRpY3MuIGBwcm9jZXNzX3ZtX3JlYWR2YCBhbmQgYHByb2Nlc3Nfdm1fd3JpdGV2YCB3aWxsIG9idmlvdXNseSBpbnZva2UgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAgb3IgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAsIGFzIGRvZXMgYHB0cmFjZWAuCgpOb3csIGJlZm9yZSBJIGdvIGRlZXBlciBpbnRvIHRoZSBgZ2V0X3VzZXJfcGFnZXNgIGZhbWlseSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IGBwaW5fdXNlcl9wYWdlc2AgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIG1vcmUgY2xvc2VseS4gSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhpcyBsb2dpYyBwYXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwaW5fdXNlcl9wYWdlcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2d1cC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cC5jPTE0MD1pbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxuLS1cbm1tL2d1cC5jLTE3OS0gKlxubW0vZ3VwLmM6MTgwOiAqIFBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIHBpbl91c2VyX3BhZ2VzKigpIG11c3QgYmUgcmVsZWFzZWQgdmlhIGVpdGhlclxubW0vZ3VwLmM6MTgxOiAqIHVucGluX3VzZXJfcGFnZSgpLCBvciBvbmUgb2YgdGhlIHVucGluX3VzZXJfcGFnZXMqKCkgcm91dGluZXMuIFRoaXMgaXMgc29cbm1tL2d1cC5jLTE4Mi0gKiB0aGF0IHN1Y2ggcGFnZXMgY2FuIGJlIHNlcGFyYXRlbHkgdHJhY2tlZCBhbmQgdW5pcXVlbHkgaGFuZGxlZC4gSW5cbi0tXG5tbS9ndXAuYz0yNDc9c3RhdGljIGlubGluZSBzdHJ1Y3QgZm9saW8gKmd1cF9mb2xpb19uZXh0KHN0cnVjdCBwYWdlICoqbGlzdCxcbi0tXG5tbS9ndXAuYy0yNjItLyoqXG5tbS9ndXAuYzoyNjM6ICogdW5waW5fdXNlcl9wYWdlc19kaXJ0eV9sb2NrKCkgLSByZWxlYXNlIGFuZCBvcHRpb25hbGx5IGRpcnR5IGd1cC1waW5uZWQgcGFnZXNcbm1tL2d1cC5jLTI2NC0gKiBAcGFnZXM6ICBhcnJheSBvZiBwYWdlcyB0byBiZSBtYXliZSBtYXJrZWQgZGlydHksIGFuZCBkZWZpbml0ZWx5IHJlbGVhc2VkLlxuLS1cbm1tL2d1cC5jLTI3My0gKiBsaXN0ZWQgYXMgY2xlYW4uIEluIGFueSBjYXNlLCByZWxlYXNlcyBhbGwgcGFnZXMgdXNpbmcgdW5waW5fdXNlcl9wYWdlKCksXG5tbS9ndXAuYzoyNzQ6ICogcG9zc2libHkgdmlhIHVucGluX3VzZXJfcGFnZXMoKSwgZm9yIHRoZSBub24tZGlydHkgY2FzZS5cbm1tL2d1cC5jLTI3NS0gKlxuLS1cbm1tL2d1cC5jLTI4My0gKi9cbm1tL2d1cC5jOjI4NDp2b2lkIHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jayhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nIG5wYWdlcyxcbm1tL2d1cC5jLTI4NS1cdFx0XHRcdCBib29sIG1ha2VfZGlydHkpXG4tLVxubW0vZ3VwLmMtMjkxLVx0aWYgKCFtYWtlX2RpcnR5KSB7XG5tbS9ndXAuYzoyOTI6XHRcdHVucGluX3VzZXJfcGFnZXMocGFnZXMsIG5wYWdlcyk7XG5tbS9ndXAuYy0yOTMtXHRcdHJldHVybjtcbi0tXG5tbS9ndXAuYy0zMjYtfVxubW0vZ3VwLmM6MzI3OkVYUE9SVF9TWU1CT0wodW5waW5fdXNlcl9wYWdlc19kaXJ0eV9sb2NrKTtcbm1tL2d1cC5jLTMyOC1cbi0tXG5tbS9ndXAuYy0zMzctICogXCYjMzQ7Z3VwLXBpbm5lZCBwYWdlIHJhbmdlXCYjMzQ7IHJlZmVycyB0byBhIHJhbmdlIG9mIHBhZ2VzIHRoYXQgaGFzIGhhZCBvbmUgb2YgdGhlXG5tbS9ndXAuYzozMzg6ICogcGluX3VzZXJfcGFnZXMoKSB2YXJpYW50cyBjYWxsZWQgb24gdGhhdCBwYWdlLlxubW0vZ3VwLmMtMzM5LSAqXG4tLVxubW0vZ3VwLmM9MzczPUVYUE9SVF9TWU1CT0wodW5waW5fdXNlcl9wYWdlX3JhbmdlX2RpcnR5X2xvY2spO1xubW0vZ3VwLmMtMzc0LVxubW0vZ3VwLmM6Mzc1OnN0YXRpYyB2b2lkIGd1cF9mYXN0X3VucGluX3VzZXJfcGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyBucGFnZXMpXG5tbS9ndXAuYy0zNzYte1xuLS1cbm1tL2d1cC5jLTM5Mi0vKipcbm1tL2d1cC5jOjM5MzogKiB1bnBpbl91c2VyX3BhZ2VzKCkgLSByZWxlYXNlIGFuIGFycmF5IG9mIGd1cC1waW5uZWQgcGFnZXMuXG5tbS9ndXAuYy0zOTQtICogQHBhZ2VzOiAgYXJyYXkgb2YgcGFnZXMgdG8gYmUgbWFya2VkIGRpcnR5IGFuZCByZWxlYXNlZC5cbi0tXG5tbS9ndXAuYy00MDAtICovXG5tbS9ndXAuYzo0MDE6dm9pZCB1bnBpbl91c2VyX3BhZ2VzKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKVxubW0vZ3VwLmMtNDAyLXtcbi0tXG5tbS9ndXAuYy00MjQtfVxubW0vZ3VwLmM6NDI1OkVYUE9SVF9TWU1CT0wodW5waW5fdXNlcl9wYWdlcyk7XG5tbS9ndXAuYy00MjYtXG4tLVxubW0vZ3VwLmM9NDc5PXN0YXRpYyBpbmxpbmUgdm9pZCBtbV9zZXRfaGFzX3Bpbm5lZF9mbGFnKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuLS1cbm1tL2d1cC5jLTQ5OC0gKiBzYW1lIHRpbWUuIChUaGF0JiMzOTtzIHRydWUgdGhyb3VnaG91dCB0aGUgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kXG5tbS9ndXAuYzo0OTk6ICogcGluX3VzZXJfcGFnZXMqKCkgQVBJcy4pIENhc2VzOlxubW0vZ3VwLmMtNTAwLSAqXG4tLVxubW0vZ3VwLmM9ODM0PXN0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtODQ4LVx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXG5tbS9ndXAuYzo4NDk6XHQgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbm1tL2d1cC5jLTg1MC1cdCAqL1xuLS1cbm1tL2d1cC5jPTIzMzA9c3RhdGljIHZvaWQgcG9mc191bnBpbihzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKVxuLS1cbm1tL2d1cC5jLTIzMzQtXHRlbHNlXG5tbS9ndXAuYzoyMzM1Olx0XHR1bnBpbl91c2VyX3BhZ2VzKHBvZnMtXHUwMDNlcGFnZXMsIHBvZnMtXHUwMDNlbnJfZW50cmllcyk7XG5tbS9ndXAuYy0yMzM2LX1cbi0tXG5tbS9ndXAuYz0yOTMwPXN0YXRpYyBpbnQgZ3VwX2Zhc3RfcHRlX3JhbmdlKHBtZF90IHBtZCwgcG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9ndXAuYy0yOTg3LVx0XHQgKiBnb2luZyB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZVxubW0vZ3VwLmM6Mjk4ODpcdFx0ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvclxubW0vZ3VwLmMtMjk4OS1cdFx0ICogZGV0YWlscy5cbi0tXG5tbS9ndXAuYz0zMjMwPXN0YXRpYyB1bnNpZ25lZCBsb25nIGd1cF9mYXN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxuLS1cbm1tL2d1cC5jLTMyNjYtXHRcdGlmIChyZWFkX3NlcWNvdW50X3JldHJ5KFx1MDAyNmN1cnJlbnQtXHUwMDNlbW0tXHUwMDNld3JpdGVfcHJvdGVjdF9zZXEsIHNlcSkpIHtcbm1tL2d1cC5jOjMyNjc6XHRcdFx0Z3VwX2Zhc3RfdW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnJfcGlubmVkKTtcbm1tL2d1cC5jLTMyNjgtXHRcdFx0cmV0dXJuIDA7XG4tLVxubW0vZ3VwLmM9MzM5MD1FWFBPUlRfU1lNQk9MX0dQTChnZXRfdXNlcl9wYWdlc19mYXN0KTtcbi0tXG5tbS9ndXAuYy0zMzkyLS8qKlxubW0vZ3VwLmM6MzM5MzogKiBwaW5fdXNlcl9wYWdlc19mYXN0KCkgLSBwaW4gdXNlciBwYWdlcyBpbiBtZW1vcnkgd2l0aG91dCB0YWtpbmcgbG9ja3Ncbm1tL2d1cC5jLTMzOTQtICpcbi0tXG5tbS9ndXAuYy0zNDA1LSAqIEZPTExfUElOIG1lYW5zIHRoYXQgdGhlIHBhZ2VzIG11c3QgYmUgcmVsZWFzZWQgdmlhIHVucGluX3VzZXJfcGFnZSgpLiBQbGVhc2Vcbm1tL2d1cC5jOjM0MDY6ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBmdXJ0aGVyIGRldGFpbHMuXG5tbS9ndXAuYy0zNDA3LSAqXG4tLVxubW0vZ3VwLmMtMzQxMC0gKi9cbm1tL2d1cC5jOjM0MTE6aW50IHBpbl91c2VyX3BhZ2VzX2Zhc3QodW5zaWduZWQgbG9uZyBzdGFydCwgaW50IG5yX3BhZ2VzLFxubW0vZ3VwLmMtMzQxMi1cdFx0XHR1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuLS1cbm1tL2d1cC5jLTM0MTctfVxubW0vZ3VwLmM6MzQxODpFWFBPUlRfU1lNQk9MX0dQTChwaW5fdXNlcl9wYWdlc19mYXN0KTtcbm1tL2d1cC5jLTM0MTktXG5tbS9ndXAuYy0zNDIwLS8qKlxubW0vZ3VwLmM6MzQyMTogKiBwaW5fdXNlcl9wYWdlc19yZW1vdGUoKSAtIHBpbiBwYWdlcyBvZiBhIHJlbW90ZSBwcm9jZXNzXG5tbS9ndXAuYy0zNDIyLSAqXG4tLVxubW0vZ3VwLmMtMzQzNy0gKiBGT0xMX1BJTiBtZWFucyB0aGF0IHRoZSBwYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHZpYSB1bnBpbl91c2VyX3BhZ2UoKS4gUGxlYXNlXG5tbS9ndXAuYzozNDM4OiAqIHNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbm1tL2d1cC5jLTM0MzktICpcbi0tXG5tbS9ndXAuYy0zNDQyLSAqL1xubW0vZ3VwLmM6MzQ0Mzpsb25nIHBpbl91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2d1cC5jLTM0NDQtXHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9ndXAuYy0zNDU2LX1cbm1tL2d1cC5jOjM0NTc6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlc19yZW1vdGUpO1xubW0vZ3VwLmMtMzQ1OC1cbm1tL2d1cC5jLTM0NTktLyoqXG5tbS9ndXAuYzozNDYwOiAqIHBpbl91c2VyX3BhZ2VzKCkgLSBwaW4gdXNlciBwYWdlcyBpbiBtZW1vcnkgZm9yIHVzZSBieSBvdGhlciBkZXZpY2VzXG5tbS9ndXAuYy0zNDYxLSAqXG4tLVxubW0vZ3VwLmMtMzQ3MS0gKiBGT0xMX1BJTiBtZWFucyB0aGF0IHRoZSBwYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHZpYSB1bnBpbl91c2VyX3BhZ2UoKS4gUGxlYXNlXG5tbS9ndXAuYzozNDcyOiAqIHNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbm1tL2d1cC5jLTM0NzMtICpcbi0tXG5tbS9ndXAuYy0zNDc2LSAqL1xubW0vZ3VwLmM6MzQ3Nzpsb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG5tbS9ndXAuYy0zNDc4LVx0XHQgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbi0tXG5tbS9ndXAuYy0zNDg2LX1cbm1tL2d1cC5jOjM0ODc6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlcyk7XG5tbS9ndXAuYy0zNDg4LVxubW0vZ3VwLmMtMzQ4OS0vKlxubW0vZ3VwLmM6MzQ5MDogKiBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCgpIGlzIHRoZSBGT0xMX1BJTiB2YXJpYW50IG9mXG5tbS9ndXAuYy0zNDkxLSAqIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKCkuIEJlaGF2aW9yIGlzIHRoZSBzYW1lLCBleGNlcHQgdGhhdCB0aGlzIG9uZSBzZXRzXG4tLVxubW0vZ3VwLmMtMzQ5Ni0gKi9cbm1tL2d1cC5jOjM0OTc6bG9uZyBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxubW0vZ3VwLmMtMzQ5OC1cdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vZ3VwLmMtMzUwOC19XG5tbS9ndXAuYzozNTA5OkVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXNfdW5sb2NrZWQpO1xubW0vZ3VwLmMtMzUxMC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA5NDMKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA0MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEFQSSBFbnRyeSBQb2ludHMgZm9yIGEgQ29kZSBDaGFuZ2UqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoZXNlIGNoYW5nZXMgYW5kIG5lZWQgdG8gaWRlbnRpZnkgdGhlIHJlbGV2YW50IEFQSSBlbnRyeSBwb2ludHMgYWZmZWN0ZWQgYnkgdGhpcyBsb2dpYy4gSSBzZWUgd2UgaGF2ZTogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFJpZ2h0LCBhbmQgSSBzaG91bGQgbm90ZSB0aGF0IGBnZXRfdXNlcl9wYWdlc19mYXN0YCBhbmQgYHBpbl91c2VyX3BhZ2VzX2Zhc3RgIGhhdmUgdGhhdCBsb2NrbGVzcyBgZ3VwX2Zhc3RgIHBhdGgsIGJ1dCB1bHRpbWF0ZWx5IGZhbGwgYmFjayB0byBgX19nZXRfdXNlcl9wYWdlc2AgaWYgbmVlZGVkLCBzbyB0aGV5JiMzOTtyZSByZWxldmFudCwgdG9vLCB0aG91Z2ggbm90IHRoZSBwcmltYXJ5IHRhcmdldC4gVGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gYGZvbGxvd19wYWdlX21hc2tgIGFuZCBgX19nZXRfdXNlcl9wYWdlc2AsIHdoaWNoIEkgcmVjb2duaXplIGFzIHRoZSBzbG93ZXIgZmFsbGJhY2sgcGF0aHMuCgpJIG5lZWQgdG8gZm9jdXMgb24gdGhlIGV4dGVybmFsLCBub24tc3RhdGljIGVudHJ5IHBvaW50cywgc2luY2UgdGhhdCYjMzk7cyB3aGF0IHRoZSBwcm9tcHQgaXMgZW1waGFzaXppbmc6ICYjMzQ7UHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiYjMzQ7IFNvLCBgZ2V0X3VzZXJfcGFnZXNgIGlzIHF1aXRlIGdlbmVyaWMsIGFuZCBoZWF2aWx5IHVzZWQuIEhvd2V2ZXIsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgIGFuZCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGFyZSBhbHNvIHBvc3NpYmlsaXRpZXMuIEFjdHVhbGx5LCBgZm9sbG93X3BhZ2VfbWFza2AgKmlzKiBzdGF0aWMsIGJ1dCBpdCYjMzk7cyB0aGUgY2VudHJhbCBmdW5jdGlvbiBiZWluZyBtb2RpZmllZC4gU28gaXQgc2VlbXMgdGhlIGJlc3QgbGlzdCBvZiBwb3RlbnRpYWwgdGFyZ2V0cyBpbmNsdWRlczogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIE5vdyBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgYXJlIGluZGVlZCBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZ3VwLmM9MTkxND1sb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2d1cC5jLTE5NjctLypcbm1tL2d1cC5jOjE5Njg6ICogZmF1bHRpbl9wYWdlX3JhbmdlKCkgLSBwb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2UgdGFibGVzIGluc2lkZSB0aGVcbm1tL2d1cC5jLTE5NjktICpcdFx0XHQgIGdpdmVuIHJhbmdlIHJlYWRhYmxlL3dyaXRhYmxlXG4tLVxubW0vZ3VwLmMtMTk4Ny0gKi9cbm1tL2d1cC5jOjE5ODg6bG9uZyBmYXVsdGluX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG5tbS9ndXAuYy0xOTg5LVx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kLCBib29sIHdyaXRlLCBpbnQgKmxvY2tlZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIwMTYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemluZyB0aGVtIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlOgoKKipBbmFseXppbmcgUGFnZSBGYXVsdCBIYW5kbGluZyoqCgpBbHJpZ2h0LCBzbyBgZmF1bHRpbl9wYWdlX3JhbmdlYCBpcyBkZWZpbml0ZWx5IG5vbi1zdGF0aWMsIGdvb2QuIEFuZCwgc2ltaWxhcmx5LCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGlzbiYjMzk7dCBzdGF0aWMgZWl0aGVyLiBUaGF0JiMzOTtzIHdoYXQgSSBleHBlY3RlZCBiYXNlZCBvbiB0aGUgYnJvYWRlciBkZXNpZ24uIE5vdywgSSBzaG91bGQgc2hpZnQgbXkgZm9jdXMgdG8gZXhhbWluaW5nIGBmYXVsdGluX3ZtYV9wYWdlX3JhbmdlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb25zIHdlJiMzOTt2ZSBpZGVudGlmaWVkIGFzIG5vbi1zdGF0aWMsIHRvIGNvbnRpbnVlIGRldmVsb3BpbmcgdGhlIHN5c3RlbSBlZmZpY2llbnRseS4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgaG93IHRoZSB2YXJpYWJsZXMgaW50ZXJhY3QgYW5kIHdoZXRoZXIgdGhleSB3aWxsIGludGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIuIFRoaXMgaXMgbGlrZWx5IHRoZSBuZXh0IHBpZWNlIG9mIHRoZSBwdXp6bGUgdG8gdW5kZXJzdGFuZCBmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmYXVsdGluX3ZtYV9wYWdlX3JhbmdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vZ3VwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjI3NgoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDM2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBGdW5jdGlvbioqCgpPa2F5LCBzbyBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGlzbiYjMzk7dCBzdGF0aWMuIFRoYXQgaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZyBmb3IgbWUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgaW1wbGljYXRpb25zIG9mIHRoaXMgbm9uLXN0YXRpYyBkZWNsYXJhdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBjb2RlYmFzZSBhbmQgZmluZCBhbGwgdGhlIHBsYWNlcyB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGJlaW5nICp1c2VkKi4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBzaXRlcyBpcyBjcnVjaWFsIHRvIGdyYXNwaW5nIGl0cyBpbnRlbmRlZCBiZWhhdmlvciBhbmQgcG90ZW50aWFsIHNpZGUgZWZmZWN0cyB3aXRoaW4gdGhlIGxhcmdlciB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IGZyYW1ld29yay4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7RG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0PTQ3Nj10aGUgbW1hcCgpIGhhbmRsZXIgYW5kIHRhc2sgYWRkcmVzcyBzcGFjZSBleHBhbnNpb24gZnVuY3Rpb25zIGNhbGxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDo0Nzc6cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSBzcGVjaWZ5aW5nIHRoZSB2bWEgYW5kIHRoZSBhZGRyZXNzIHJhbmdlIHRvIG1sb2NrLlxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTQ3OC1cbi0tXG5tbS9ndXAuYz0xNzUwPXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0xODk0LS8qKlxubW0vZ3VwLmM6MTg5NTogKiBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpIC0gIHBvcHVsYXRlIGEgcmFuZ2Ugb2YgcGFnZXMgaW4gdGhlIHZtYS5cbm1tL2d1cC5jLTE4OTYtICogQHZtYTogICB0YXJnZXQgdm1hXG4tLVxubW0vZ3VwLmMtMTkxMy0gKi9cbm1tL2d1cC5jOjE5MTQ6bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL2d1cC5jLTE5MTUtXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgKmxvY2tlZClcbi0tXG5tbS9ndXAuYz0yMDI2PWludCBfX21tX3BvcHVsYXRlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgaWdub3JlX2Vycm9ycylcbi0tXG5tbS9ndXAuYy0yMDU5LVx0XHQvKlxubW0vZ3VwLmM6MjA2MDpcdFx0ICogTm93IGZhdWx0IGluIGEgcmFuZ2Ugb2YgcGFnZXMuIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKClcbm1tL2d1cC5jLTIwNjEtXHRcdCAqIGRvdWJsZSBjaGVja3MgdGhlIHZtYSBmbGFncywgc28gdGhhdCBpdCB3b24mIzM5O3QgbWxvY2sgcGFnZXNcbi0tXG5tbS9ndXAuYy0yMDYzLVx0XHQgKi9cbm1tL2d1cC5jOjIwNjQ6XHRcdHJldCA9IHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHZtYSwgbnN0YXJ0LCBuZW5kLCBcdTAwMjZsb2NrZWQpO1xubW0vZ3VwLmMtMjA2NS1cdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuLS1cbm1tL2ludGVybmFsLmg9MTExOT12b2lkIHVubWFwX21hcHBpbmdfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG5tbS9pbnRlcm5hbC5oOjExMjA6ZXh0ZXJuIGxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9pbnRlcm5hbC5oLTExMjEtXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgKmxvY2tlZCk7XG4tLVxubW0vbWxvY2suYz00Njc9c3RhdGljIGludCBtbG9ja19maXh1cChzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL21sb2NrLmMtNTA0LVx0ICogSXQmIzM5O3Mgb2theSBpZiB0cnlfdG9fdW5tYXBfb25lIHVubWFwcyBhIHBhZ2UganVzdCBhZnRlciB3ZVxubW0vbWxvY2suYzo1MDU6XHQgKiBzZXQgVk1fTE9DS0VELCBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSB3aWxsIGJyaW5nIGl0IGJhY2suXG5tbS9tbG9jay5jLTUwNi1cdCAqL1xuLS1cbm1tL21tYXAuYz05NjE9c3RydWN0IHZtX2FyZWFfc3RydWN0ICpmaW5kX2V4dGVuZF92bWFfbG9ja2VkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpXG4tLVxubW0vbW1hcC5jLTk3My1cdGlmIChwcmV2LVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG5tbS9tbWFwLmM6OTc0Olx0XHRwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShwcmV2LCBhZGRyLCBwcmV2LVx1MDAzZXZtX2VuZCwgTlVMTCk7XG5tbS9tbWFwLmMtOTc1LVx0cmV0dXJuIHByZXY7XG4tLVxubW0vbW1hcC5jPTk4Mz1zdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmZpbmRfZXh0ZW5kX3ZtYV9sb2NrZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcbi0tXG5tbS9tbWFwLmMtOTk3LVx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxubW0vbW1hcC5jOjk5ODpcdFx0cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uodm1hLCBhZGRyLCBzdGFydCwgTlVMTCk7XG5tbS9tbWFwLmMtOTk5LVx0cmV0dXJuIHZtYTtcbi0tXG5tbS9tcHJvdGVjdC5jPTcyNT1tcHJvdGVjdF9maXh1cChzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsXG4tLVxubW0vbXByb3RlY3QuYy04MTktXHQgICAgIXZtYV9mbGFnc190ZXN0X2FueShcdTAwMjZvbGRfdm1hX2ZsYWdzLCBWTUFfV1JJVEVfQklULCBWTUFfU0hBUkVEX0JJVCkpXG5tbS9tcHJvdGVjdC5jOjgyMDpcdFx0cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uodm1hLCBzdGFydCwgZW5kLCBOVUxMKTtcbm1tL21wcm90ZWN0LmMtODIxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzUwMQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIHNpdHVhdGlvbiwgZnJvbSBhbiBleHBlcnQmIzM5O3MgcGVyc3BlY3RpdmU6CgoqKk1lbW9yeSBQb3B1bGF0aW9uIFN0cmF0ZWdpZXMgYW5kIFRoZWlyIERyaXZlcnMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyBtZW1vcnkgaXMgcG9wdWxhdGVkIHdpdGhpbiB0aGUgdmlydHVhbCBtZW1vcnkgYXJlYSAoVk1BKSBtYW5hZ2VtZW50IGNvZGUuIEl0IGxvb2tzIGxpa2UgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBpcyBhIGtleSBmdW5jdGlvbi4gSSBzZWUgdGhhdCBpdCYjMzk7cyB0aGUgd29ya2hvcnNlIGNhbGxlZCBieSBzZXZlcmFsIGltcG9ydGFudCBmdW5jdGlvbnM6IGBfX21tX3BvcHVsYXRlYCwgd2hpY2ggaXMgdGhlIGNvcmUgaGFuZGxlciBmb3IgdGhlIGBNQVBfUE9QVUxBVEVgIGZsYWcgZHVyaW5nIGBtbWFwYCBjYWxscyBhbmQgYG1sb2NrYCBvcGVyYXRpb25zICh0aGF0JiMzOTtzIGNydWNpYWwgZm9yIHBpbm5pbmcgbWVtb3J5KSwgYW5kIHRoZW4gYWxzbyBgbXByb3RlY3RfZml4dXBgIHdoaWNoIGlzIHVzZWQgZHVyaW5nIHBhZ2UgcHJvdGVjdGlvbiBhZGp1c3RtZW50cy4gSXQmIzM5O3MgYWxzbyBjYWxsZWQgYnkgYGZpbmRfZXh0ZW5kX3ZtYV9sb2NrZWRgLCB3aGljaCBoYXMgdG8gZG8gd2l0aCBWTUEgZXhwYW5zaW9uIGFuZCBtZXJnaW5nLiBJbnRlcmVzdGluZy4gU28sIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgc2VlbXMgdG8gYmUgdGhlIGZ1bmN0aW9uIGhhbmRsaW5nIHRoZSAqZWFnZXIqIHBvcHVsYXRpb24gb2YgcGFnZXMuCgpPbiB0aGUgb3RoZXIgaGFuZCwgYGZhdWx0aW5fcGFnZV9yYW5nZWAgaXMgdXNlZCBpbiBhIG1vcmUgcmVhY3RpdmUgY29udGV4dC4gSXQmIzM5O3MgaW52b2tlZCBieSBgbWFkdmlzZWAgc3BlY2lmaWNhbGx5IHdoZW4gdXNpbmcgdGhlIGBNQURWX1BPUFVMQVRFX1JFQURgIGFuZCBgTUFEVl9QT1BVTEFURV9XUklURWAgZmxhZ3MuIFRoaXMgaW5kaWNhdGVzIGEgZGVtYW5kLXBhZ2luZyBzdHJhdGVneSwgYnV0IHdpdGggYSBoaW50IHRvIHByZS1mYXVsdCBwYWdlcy4gSXQmIzM5O3MgYSBuaWNlIGRpc3RpbmN0aW9uLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGRlYWxzIHdpdGggdXBmcm9udCwgZWFnZXIgcG9wdWxhdGlvbiB3aGlsZSBgZmF1bHRpbl9wYWdlX3JhbmdlYCBkZWFscyB3aXRoIGhpbnQtZHJpdmVuIGZhdWx0aW5nLiBJIGNhbiBzZWUgdGhlIHBvdGVudGlhbCBmb3Igc29tZSBpbnRlcmVzdGluZyBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIGhvdyB0aGVzZSBhcmUgdXNlZCBpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEkmIzM5O2xsIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBjb250ZXh0cyBhbmQgdXNhZ2UgcGF0dGVybnMgdG8gdW5kZXJzdGFuZCB0aGUgdHJhZGUtb2Zmcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy0xOTY3LS8qXG5tbS9ndXAuYzoxOTY4OiAqIGZhdWx0aW5fcGFnZV9yYW5nZSgpIC0gcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdlIHRhYmxlcyBpbnNpZGUgdGhlXG5tbS9ndXAuYy0xOTY5LSAqXHRcdFx0ICBnaXZlbiByYW5nZSByZWFkYWJsZS93cml0YWJsZVxuLS1cbm1tL2d1cC5jLTE5ODctICovXG5tbS9ndXAuYzoxOTg4OmxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0vZ3VwLmMtMTk4OS1cdFx0XHR1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCB3cml0ZSwgaW50ICpsb2NrZWQpXG4tLVxubW0vaW50ZXJuYWwuaD0xMTIwPWV4dGVybiBsb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0vaW50ZXJuYWwuaC0xMTIxLVx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50ICpsb2NrZWQpO1xubW0vaW50ZXJuYWwuaDoxMTIyOmV4dGVybiBsb25nIGZhdWx0aW5fcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2ludGVybmFsLmgtMTEyMy1cdFx0dW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgd3JpdGUsIGludCAqbG9ja2VkKTtcbi0tXG5tbS9tYWR2aXNlLmM9OTU3PXN0YXRpYyBsb25nIG1hZHZpc2VfcG9wdWxhdGUoc3RydWN0IG1hZHZpc2VfYmVoYXZpb3IgKm1hZHZfYmVoYXZpb3IpXG4tLVxubW0vbWFkdmlzZS5jLTk2Ny1cdFx0LyogUG9wdWxhdGUgKHByZWZhdWx0KSBwYWdlIHRhYmxlcyByZWFkYWJsZS93cml0YWJsZS4gKi9cbm1tL21hZHZpc2UuYzo5Njg6XHRcdHBhZ2VzID0gZmF1bHRpbl9wYWdlX3JhbmdlKG1tLCBzdGFydCwgZW5kLCB3cml0ZSwgXHUwMDI2bG9ja2VkKTtcbm1tL21hZHZpc2UuYy05NjktXHRcdGlmICghbG9ja2VkKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0MzkwCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKlBvdGVudGlhbCBQYWdlLUZhdWx0IEhhbmRsZXJzIGFuZCBQYWdlIFBpbm5pbmcgRnVuY3Rpb25zKioKClJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgcG90ZW50aWFsIHN0YXJ0aW5nIHBvaW50cyBmb3IgdGhpcywgYW5kIHR3byBuYW1lcyBpbW1lZGlhdGVseSBqdW1wIG91dDogYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgc2VlbSBsaWtlIHRoZXkmIzM5O2QgYmUgZGlyZWN0bHkgaW52b2x2ZWQgaW4gdGhlIHByb2Nlc3Mgb2YgZGVhbGluZyB3aXRoIHBhZ2UgZmF1bHRzIGFuZCBwb3B1bGF0aW5nIG1lbW9yeS4gUHJvbWlzaW5nLgoKQmV5b25kIHRob3NlLCBJJiMzOTt2ZSBnb3QgYSBtZW50YWwgbm90ZSB0byBjaGVjayBvdXQgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGFuZCBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYC4gVGhleSYjMzk7cmUgcmVsYXRlZCB0byB1c2VyLXNwYWNlIHBhZ2UgYWNjZXNzIGFuZCBwaW5uaW5nLCB3aGljaCBzZWVtcyByZWxldmFudC4gR2l2ZW4gdGhlaXIgZnVuY3Rpb25zLCB0aGV5IGxpa2VseSBhY3QgdXBvbiBzb21lIG9mIHRoZSBmdW5kYW1lbnRhbHMgb2YgYSBwYWdlIHRhYmxlLgoKTm93LCBiZWZvcmUgSSBkaWcgYW55IGRlZXBlciwgSSBzaG91bGQgYWxzbyB0YWtlIGEgbG9vayBhdCBgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRgLiBJdOKAmXMgcHJvYmFibHkgd29ydGggaW52ZXN0aWdhdGluZyB0aGF0IGZ1bmN0aW9uIGluIHBhcnRpY3VsYXIsIHNpbmNlIHRoZSAmIzM5O3VubG9ja2VkJiMzOTsgdmFyaWFudCBtaWdodCBvZmZlciBpbnNpZ2h0cyBpbnRvIGhvdyB0aGV5IGhhbmRsZSBsb2NraW5nIHdpdGhpbiB0aGF0IHBhcnRpY3VsYXIgcHJvY2Vzcy4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGlmIGl04oCZcyBoYW5kbGluZyBjb25jdXJyZW5jeSBhdCBhbGwsIGJ1dCBJ4oCZbSBnb2luZyB0byBjb25zaWRlciBpdCBhIGhpZ2gtcHJpb3JpdHkgY2FuZGlkYXRlIGFzIGEgc3RhcnRpbmcgcG9pbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2dldF91c2VyX3BhZ2VzX3VubG9ja2VkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmlydC9uaXRyb19lbmNsYXZlcy9uZV9taXNjX2Rldi5jPTkxND1zdGF0aWMgaW50IG5lX3NldF91c2VyX21lbW9yeV9yZWdpb25faW9jdGwoc3RydWN0IG5lX2VuY2xhdmUgKm5lX2VuY2xhdmUsXG4tLVxuZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmMtOTYyLVxuZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmM6OTYzOlx0XHRndXBfcmMgPSBnZXRfdXNlcl9wYWdlc191bmxvY2tlZChtZW1fcmVnaW9uLnVzZXJzcGFjZV9hZGRyICYjNDM7IG1lbW9yeV9zaXplLCAxLFxuZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmMtOTY0LVx0XHRcdFx0XHRcdCBuZV9tZW1fcmVnaW9uLVx1MDAzZXBhZ2VzICYjNDM7IGksIEZPTExfR0VUKTtcbi0tXG5pbmNsdWRlL2xpbnV4L21tLmg9MzI3MD1sb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzI3MS1cdFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xuaW5jbHVkZS9saW51eC9tbS5oOjMyNzI6bG9uZyBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNzMtXHRcdCAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzKTtcbi0tXG5tbS9ndXAuYz0yNzU2PUVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXMpO1xuLS1cbm1tL2d1cC5jLTI3NTgtLypcbm1tL2d1cC5jOjI3NTk6ICogZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoKSBpcyBzdWl0YWJsZSB0byByZXBsYWNlIHRoZSBmb3JtOlxubW0vZ3VwLmMtMjc2MC0gKlxuLS1cbm1tL2d1cC5jLTI3NjYtICpcbm1tL2d1cC5jOjI3Njc6ICogICAgICBnZXRfdXNlcl9wYWdlc191bmxvY2tlZChtbSwgLi4uLCBwYWdlcyk7XG5tbS9ndXAuYy0yNzY4LSAqXG4tLVxubW0vZ3VwLmMtMjc3Mi0gKi9cbm1tL2d1cC5jOjI3NzM6bG9uZyBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxubW0vZ3VwLmMtMjc3NC1cdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXG4tLVxubW0vZ3VwLmMtMjc4NC19XG5tbS9ndXAuYzoyNzg1OkVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQpO1xubW0vZ3VwLmMtMjc4Ni1cbi0tXG5tbS9ndXAuYz0zNDg3PUVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXMpO1xuLS1cbm1tL2d1cC5jLTM0OTAtICogcGluX3VzZXJfcGFnZXNfdW5sb2NrZWQoKSBpcyB0aGUgRk9MTF9QSU4gdmFyaWFudCBvZlxubW0vZ3VwLmM6MzQ5MTogKiBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCgpLiBCZWhhdmlvciBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhpcyBvbmUgc2V0c1xubW0vZ3VwLmMtMzQ5Mi0gKiBGT0xMX1BJTiBhbmQgcmVqZWN0cyBGT0xMX0dFVC5cbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTI4ODM9c3RhdGljIGludCBodmFfdG9fcGZuX3Nsb3coc3RydWN0IGt2bV9mb2xsb3dfcGZuICprZnAsIGt2bV9wZm5fdCAqcGZuKVxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMjkwMi1cdGVsc2VcbnZpcnQva3ZtL2t2bV9tYWluLmM6MjkwMzpcdFx0bnBhZ2VzID0gZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoa2ZwLVx1MDAzZWh2YSwgMSwgXHUwMDI2cGFnZSwgZmxhZ3MpO1xudmlydC9rdm0va3ZtX21haW4uYy0yOTA0LVx0aWYgKG5wYWdlcyAhPSAxKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTU4NwoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDkzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBHVVAgUGF0Y2ggZm9yIEZ1enppbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBpZGVudGlmeSB0aGUgbW9zdCBlZmZlY3RpdmUgdGFyZ2V0cyBmb3IgZnV6emluZyBhIHJlY2VudCBrZXJuZWwgcGF0Y2ggdGhhdCByZWZhY3RvcnMgdGhlIEdldCBVc2VyIFBhZ2VzIChHVVApIGxvZ2ljLiBJIG5lZWQgdG8gYmFsYW5jZSBjb3ZlcmFnZSB3aXRoIGF2b2lkaW5nIG92ZXJseSBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IHdpbGwgc2tldyByZXN1bHRzLgoKRmlyc3QsIEkgbmVlZCB0byBsaXN0IG91dCB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zLiBCYXNlZCBvbiB0aGUgcGF0Y2ggYW5hbHlzaXMgYW5kIGtub3dpbmcgdGhhdCBJIHNob3VsZCBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLCB0aGUgaW5pdGlhbCBjYW5kaWRhdGVzIGFyZTogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIEkga25vdyB0aGF0IGBfX2dldF91c2VyX3BhZ2VzYCBpcyB0aGUgc3RhdGljIGNvcmUsIHNvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgYXJlIHRoZSBjb3JyZWN0IGNob2ljZS4KCk5vdywgd2hpY2ggY29uZmlndXJhdGlvbnMgYXJlIHJlbGV2YW50PyBUaGUgcGF0Y2ggdXNlcyBgI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU2AgYW5kIGAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYW5kIGJhc2VkIG9uIHRoZSBjb25maWcgZGVwZW5kZW5jaWVzLCBJIGtub3cgdGhhdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgSFVHRVRMQkZTYCBhcmUgc3VmZmljaWVudCB0byBlbmFibGUgdGhpcywgc28gdGhvc2UgYXJlIHRoZSBrZXkgb25lcyB0byBlbmFibGUuIEl0JiMzOTtzIGEgZ2VuZXJpYyBgbW0vZ3VwLmNgIGZpbGUsIHNvIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb25jZXJucy4KClRoZSBpbml0aWFsIHN1bW1hcnkgd291bGQgYmU6CgoqICAgKipXb3J0aEZ1enppbmcqKjogYHRydWVgCiogICAqKkZvY3VzU3ltYm9scyoqOiBgZ2V0X3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYGdldF91c2VyX3BhZ2VzX3VubG9ja2VkYCwgYHBpbl91c2VyX3BhZ2VzYCwgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgCiogICAqKkVuYWJsZUNvbmZpZ3MqKjogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYEhVR0VUTEJGU2AKKiAgICoqUmVhc29uaW5nKio6IFNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlLgoKQnV0IEkgbmVlZCB0byBiZSBhIGJpdCBtb3JlIG51YW5jZWQuIEkgbmVlZCB0byBhdm9pZCB2ZXJ5IGhvdCBwYXRocy4gYGdldF91c2VyX3BhZ2VzYCBpcyAqdGhlKiBtYWluIGVudHJ5IHBvaW50IGZvciBHVVAsIHNvIEkgaGF2ZSB0byBpbmNsdWRlIGl0LiBBbmQgSSYjMzk7bGwgbGVhdmUgYHBpbl91c2VyX3BhZ2VzYCB0b28uIGBnZXRfdXNlcl9wYWdlc2AgaXRzZWxmIGhhcyBkcml2ZXIgY2FsbHMsIGJ1dCBpdCYjMzk7cyBub3QgbGlrZWx5IHRvIGJlIGFzIGdlbmVyaWMgYXMgYGttYWxsb2NgIG9yIGBzY2hlZHVsZWAuIFRoZSBwYXRjaCBwcmltYXJpbHkgZGVhbHMgd2l0aCBETUEgc2V0dXBzIGFuZCBtZW1vcnkgcGlubmluZy4KCmBmYXVsdGluX3BhZ2VfcmFuZ2VgIGFuZCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGFyZSBtb3JlIHNwZWNpZmljLCB0cmlnZ2VyZWQgYnkgYG1hZHZpc2VgIGFuZCBgbW1hcChNQVBfUE9QVUxBVEUpIC8gbWxvY2tgLCByZXNwZWN0aXZlbHkuIGBnZXRfdXNlcl9wYWdlc19yZW1vdGVgIGlzIGFsc28gaW1wb3J0YW50IGJlY2F1c2UgaXQgZGVhbHMgd2l0aCBgcHRyYWNlYCBhbmQgYHByb2Nlc3Nfdm1fcmVhZHZgLCB3aGljaCBhcmUgZGVmaW5pdGVseSBnb29kIGZ1enppbmcgdGFyZ2V0cy4KClNvLCB0YWtpbmcgdGhlIGhvdC1wYXRoIGNvbnNpZGVyYXRpb24gaW50byBhY2NvdW50LCB0aGUgZmluYWwgc2VsZWN0aW9uIGlzOgoKKiAgICoqV29ydGhGdXp6aW5nKio6IGB0cnVlYAoqICAgKipGb2N1c1N5bWJvbHMqKjogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYAoqICAgKipFbmFibGVDb25maWdzKio6IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBIVUdFVExCRlNgCiogICAqKlJlYXNvbmluZyoqOiBUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBjb3JlIEdldCBVc2VyIFBhZ2VzIChHVVApIGxvZ2ljIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MsIHRvdWNoaW5nIG11bHRpcGxlIGltcG9ydGFudCBzdWJzeXN0ZW1zLiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgZXhwb3J0ZWQgR1VQIEFQSSBlbnRyeSBwb2ludHMsIGJhbGFuY2luZyBjb3ZlcmFnZSB3aXRoIHRhcmdldGVkIGZ1bmN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Z2V0X3VzZXJfcGFnZXNcXCgmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7RG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0PTg0PWxhdHRlciBoYXBwZW5zIHdoZW46XG4tLVxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0LTkyLVxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0OjkzOiAtIGEgcGFnZSBpcyBhY2Nlc3NlZCBieSBhIGRldmljZSBkcml2ZXIgdXNpbmcgZ2V0X3VzZXJfcGFnZXMoKVxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0LTk0LVxuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvY2FjaGV0bGIucnN0PTI1Mz1tYXBzIHRoaXMgcGFnZSBhdCBpdHMgdmlydHVhbCBhZGRyZXNzLlxuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvY2FjaGV0bGIucnN0LTM1My1cdHBhZ2UsIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gKGN1cnJlbnRseSBvbmx5XG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2NhY2hldGxiLnJzdDozNTQ6XHRnZXRfdXNlcl9wYWdlcygpKS4gIE5vdGU6IGZsdXNoX2RjYWNoZV9mb2xpbygpIGRlbGliZXJhdGVseVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzU1LVx0ZG9lc24mIzM5O3Qgd29yayBmb3IgYW4gYW5vbnltb3VzIHBhZ2UuICBUaGUgZGVmYXVsdFxuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0PTExMz1jb3VudGVyIHRoYXQgaW5jcmVtZW50cyAxMCBiaXRzIGF0IGEgdGltZS5cbi0tXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdC0xMjEtKiBDYWxsZXJzIG11c3Qgc3BlY2lmaWNhbGx5IHJlcXVlc3QgXCYjMzQ7ZG1hLXBpbm5lZCB0cmFja2luZyBvZiBwYWdlc1wmIzM0Oy4gSW4gb3RoZXJcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjEyMjogIHdvcmRzLCBqdXN0IGNhbGxpbmcgZ2V0X3VzZXJfcGFnZXMoKSB3aWxsIG5vdCBzdWZmaWNlOyBhIG5ldyBzZXQgb2YgZnVuY3Rpb25zLFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMTIzLSAgcGluX3VzZXJfcGFnZSgpIGFuZCByZWxhdGVkLCBtdXN0IGJlIHVzZWQuXG4tLVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9MTk0PUlOQ09SUkVDVCAodXNlcyBGT0xMX0dFVCBjYWxscyk6XG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoxOTU6ICAgIGdldF91c2VyX3BhZ2VzKClcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTE5Ni0gICAgd3JpdGUgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBwYWdlc1xuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0PTI0NT1sb25nLXRlcm0gW1JdRE1BIHBpbnMgaW4gcGxhY2UsIG9yIGR1cmluZyBwaW4vdW5waW4gdHJhbnNpdGlvbnMuXG4tLVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjQ5LSAgcGlubmVkIG9uY2UgZm9yIGVhY2ggcGFnZSAoaGVhZCBwYWdlIGFuZCBlYWNoIHRhaWwgcGFnZSkgd2l0aGluIHRoZSBodWdlIHBhZ2UuXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyNTA6ICBUaGlzIGZvbGxvd3MgdGhlIHNhbWUgc29ydCBvZiBiZWhhdmlvciB0aGF0IGdldF91c2VyX3BhZ2VzKCkgdXNlcyBmb3IgaHVnZVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjUxLSAgcGFnZXM6IHRoZSBoZWFkIHBhZ2UgaXMgcmVmY291bnRlZCBvbmNlIGZvciBlYWNoIHRhaWwgb3IgaGVhZCBwYWdlIGluIHRoZSBodWdlXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyNTI6ICBwYWdlLCB3aGVuIGdldF91c2VyX3BhZ2VzKCkgaXMgYXBwbGllZCB0byBhIGh1Z2UgcGFnZS5cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI1My1cbi0tXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdD0yNzg9UmVmZXJlbmNlc1xuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI4MC1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI4MToqIGBTb21lIHNsb3cgcHJvZ3Jlc3Mgb24gZ2V0X3VzZXJfcGFnZXMoKSAoQXByIDIsIDIwMTkpIFx1MDAzY2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy83ODQ1NzQvXHUwMDNlYF9cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI4MjoqIGBETUEgYW5kIGdldF91c2VyX3BhZ2VzKCkgKExQQzogRGVjIDEyLCAyMDE4KSBcdTAwM2NodHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvNzc0NDExL1x1MDAzZWBfXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODM6KiBgVGhlIHRyb3VibGUgd2l0aCBnZXRfdXNlcl9wYWdlcygpIChBcHIgMzAsIDIwMTgpIFx1MDAzY2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy83NTMwMjcvXHUwMDNlYF9cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI4NDoqIGBMV04ga2VybmVsIGluZGV4OiBnZXRfdXNlcl9wYWdlcygpIFx1MDAzY2h0dHBzOi8vbHduLm5ldC9LZXJuZWwvSW5kZXgvI01lbW9yeV9tYW5hZ2VtZW50LWdldF91c2VyX3BhZ2VzXHUwMDNlYF9cbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI4NS1cbi0tXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC5yc3Q9Mjg5PW1hcHBlZCBjYWNoZXMgc3VjaCBhcyBBUk0sIE1JUFMgYW5kIFNQQVJDLlxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgucnN0LTI5MC1cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdDoyOTE6Q2FsbGluZyA6YzpmdW5jOmBnZXRfdXNlcl9wYWdlcygpYCBvbiBhIHJhbmdlIG9mIHVzZXIgbWVtb3J5IHRoYXQgaGFzIGJlZW5cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdC0yOTItbW1hcHBlZCBmcm9tIGEgYERBWGAgZmlsZSB3aWxsIGZhaWwgd2hlbiB0aGVyZSBhcmUgbm8gJiMzOTtzdHJ1Y3QgcGFnZSYjMzk7IHRvIGRlc2NyaWJlXG4tLVxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0PTQzOD13aGlsZSB0aGUgcGFnZShzKSBiZWxvbmdpbmcgdG8gdGhlIHdyaXRlIGJ1ZmZlciBhcmUgZmF1bHRlZCB3aXRoXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZS5yc3Q6NDM5OmdldF91c2VyX3BhZ2VzKCkuICBUaGUgJiMzOTtyZXEtXHUwMDNlbG9ja2VkJiMzOTsgZmxhZyBpbmRpY2F0ZXMgd2hlbiB0aGUgY29weSBpc1xuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0LTQ0MC10YWtpbmcgcGxhY2UsIGFuZCBhYm9ydCBpcyBkZWxheWVkIHVudGlsIHRoaXMgZmxhZyBpcyB1bnNldC5cbi0tXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0PTY0MT1hbiBlcnJvci5cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbG9ja2luZy5yc3QtNjQyLVxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9sb2NraW5nLnJzdDo2NDM6LVx1MDAzZWFjY2VzcygpIGlzIGNhbGxlZCB3aGVuIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMgaW5cbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbG9ja2luZy5yc3QtNjQ0LWFjY2Vzc19wcm9jZXNzX3ZtKCksIHR5cGljYWxseSB1c2VkIHRvIGRlYnVnIGEgcHJvY2VzcyB0aHJvdWdoXG4tLVxuRG9jdW1lbnRhdGlvbi9ncHUvZHJtLXZtLWJpbmQtbG9ja2luZy5yc3Q9NDE2PU5vdywgdGhlIG1ldGhvZCBvZiBvYnRhaW5pbmcgc3RydWN0IHBhZ2UgcmVmZXJlbmNlcyB1c2luZ1xuRG9jdW1lbnRhdGlvbi9ncHUvZHJtLXZtLWJpbmQtbG9ja2luZy5yc3Q6NDE3OmdldF91c2VyX3BhZ2VzKCkgdW5mb3J0dW5hdGVseSBjYW4mIzM5O3QgYmUgdXNlZCB1bmRlciBhIGRtYV9yZXN2IGxvY2tcbkRvY3VtZW50YXRpb24vZ3B1L2RybS12bS1iaW5kLWxvY2tpbmcucnN0LTQxOC1zaW5jZSB0aGF0IHdvdWxkIHZpb2xhdGUgdGhlIGxvY2tpbmcgb3JkZXIgb2YgdGhlIGRtYV9yZXN2IGxvY2sgdnMgdGhlXG4tLVxuRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0PTQ3PU1lbW9yeSBwaW5uaW5nXG4tLVxuRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0LTUyLSAgaWJfdXZlcmJzIG1vZHVsZSBtYW5hZ2VzIHBpbm5pbmcgYW5kIHVucGlubmluZyBtZW1vcnkgcmVnaW9ucyB2aWFcbkRvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1MzogIGdldF91c2VyX3BhZ2VzKCkgYW5kIHB1dF9wYWdlKCkgY2FsbHMuICBJdCBhbHNvIGFjY291bnRzIGZvciB0aGVcbkRvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdC01NC0gIGFtb3VudCBvZiBtZW1vcnkgcGlubmVkIGluIHRoZSBwcm9jZXNzJiMzOTtzIHBpbm5lZF92bSwgYW5kIGNoZWNrcyB0aGF0XG4tLVxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0PTMwND1CZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIHN5c3RlbSBjYWxsLCBkb19tbG9jaygpIG9yIG1sb2NrYWxsKCkgd2lsbCBjYWxsXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q6MzA1Ol9fbW1fcG9wdWxhdGUoKSB0byBmYXVsdCBpbiB0aGUgcmVtYWluaW5nIHBhZ2VzIHZpYSBnZXRfdXNlcl9wYWdlcygpIGFuZCB0b1xuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTMwNi1tYXJrIHRob3NlIHBhZ2VzIGFzIG1sb2NrZWQgYXMgdGhleSBhcmUgZmF1bHRlZC5cbi0tXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9MzA4PU5vdGUgdGhhdCB0aGUgVk1BIGJlaW5nIG1sb2NrZWQgbWlnaHQgYmUgbWFwcGVkIHdpdGggUFJPVF9OT05FLiAgSW4gdGhpcyBjYXNlLFxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0OjMwOTpnZXRfdXNlcl9wYWdlcygpIHdpbGwgYmUgdW5hYmxlIHRvIGZhdWx0IGluIHRoZSBwYWdlcy4gIFRoYXQmIzM5O3Mgb2theS4gIElmIHBhZ2VzXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3QtMzEwLWRvIGVuZCB1cCBnZXR0aW5nIGZhdWx0ZWQgaW50byB0aGlzIFZNX0xPQ0tFRCBWTUEsIHRoZXkgd2lsbCBiZSBoYW5kbGVkIGluIHRoZVxuLS1cbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdD0zNDA9bWxvY2tfZml4dXAoKSBmaWx0ZXJzIHNldmVyYWwgY2xhc3NlcyBvZiBcJiMzNDtzcGVjaWFsXCYjMzQ7IFZNQXM6XG4tLVxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTM0NC0gICBtbG9ja2VkLiAgSW4gYW55IGNhc2UsIG1vc3Qgb2YgdGhlIHBhZ2VzIGhhdmUgbm8gc3RydWN0IHBhZ2UgaW4gd2hpY2ggdG8gc29cbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDozNDU6ICAgbWFyayB0aGUgcGFnZS4gIEJlY2F1c2Ugb2YgdGhpcywgZ2V0X3VzZXJfcGFnZXMoKSB3aWxsIGZhaWwgZm9yIHRoZXNlIFZNQXMsXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3QtMzQ2LSAgIHNvIHRoZXJlIGlzIG5vIHNlbnNlIGluIGF0dGVtcHRpbmcgdG8gdmlzaXQgdGhlbS5cbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9jYWNoZXRsYi5yc3Q9MTA5PUh5cGVyU3BhcmMgY3B15bCx5piv6L+Z5qC35LiA5Liq5YW35pyJ6L+Z56eN5bGe5oCn55qEY3B144CCXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkvY2FjaGV0bGIucnN0LTMwMi1cdOW9k+WGheaguOmcgOimgeiuv+mXruS4gOS4quWMv+WQjemhteeahOWGheWuueaXtu+8jOWug+S8muiwg+eUqOi/meS4quWHveaVsO+8iOebruWJjeWPquaciVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkvY2FjaGV0bGIucnN0OjMwMzpcdGdldF91c2VyX3BhZ2VzKCnvvInjgILms6jmhI/vvJpmbHVzaF9kY2FjaGVfcGFnZSgp5pWF5oSP5a+55Yy/5ZCN6aG15LiN6LW35L2cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzA0LVx055So44CC6buY6K6k55qE5a6e546w5pivbm9w77yI5a+55LqO5omA5pyJ55u45bmy55qE5p625p6E5bqU6K+l5L+d5oyB6L+Z5qC377yJ44CC5a+55LqO5LiN5LiA6Ie05oCnXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdC01My0gIOebtOaOpeeahOeUqOaIt+epuumXtEkvT+imgeaxguS4juS9nOS4uua9nOWcqEkvT+ebruagh+eahOWGheWtmOWMuuWfn+S/neaMgeWcqOWQjOS4gOeJqeeQhuWcsOWdgOS4iuOAgmliX3V2ZXJic1xuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1NDogIOaooeWdl+mAmui/h2dldF91c2VyX3BhZ2VzKCnlkoxwdXRfcGFnZSgp6LCD55So5p2l566h55CG5YaF5a2Y5Yy65Z+f55qE5Zu65a6a5ZKM6Kej6Zmk5Zu65a6a44CC5a6D6L+Y5qC4XG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0LTU1LSAg566X6L+b56iL55qEcGlubmVkX3Zt5Lit6KKr5Zu65a6a55qE5YaF5a2Y6YeP77yM5bm25qOA5p+l6Z2e54m55p2D6L+b56iL5piv5ZCm6LaF6L+H5YW2UkxJTUlUX01FTUxPQ0vpmZDliLbjgIJcbi0tXG5hcmNoL2FybS9tbS9mbHVzaC5jPTM3Mz1FWFBPUlRfU1lNQk9MKGZsdXNoX2RjYWNoZV9wYWdlKTtcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc0LS8qXG5hcmNoL2FybS9tbS9mbHVzaC5jOjM3NTogKiBGbHVzaCBhbiBhbm9ueW1vdXMgcGFnZSBzbyB0aGF0IHVzZXJzIG9mIGdldF91c2VyX3BhZ2VzKClcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc2LSAqIGNhbiBzYWZlbHkgYWNjZXNzIHRoZSBkYXRhLiAgVGhlIGV4cGVjdGVkIHNlcXVlbmNlIGlzOlxuYXJjaC9hcm0vbW0vZmx1c2guYy0zNzctICpcbmFyY2gvYXJtL21tL2ZsdXNoLmM6Mzc4OiAqICBnZXRfdXNlcl9wYWdlcygpXG5hcmNoL2FybS9tbS9mbHVzaC5jLTM3OS0gKiAgICAtXHUwMDNlIGZsdXNoX2Fub25fcGFnZVxuLS1cbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYz03NzI9c3RhdGljIGludCBrdm1fbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdwYSwgYm9vbCB3cml0ZSlcbi0tXG5hcmNoL2xvb25nYXJjaC9rdm0vbW11LmMtODEwLVx0ICogRW5zdXJlIHRoZSByZWFkIG9mIG1tdV9pbnZhbGlkYXRlX3NlcSBpc24mIzM5O3QgcmVvcmRlcmVkIHdpdGggUFRFIHJlYWRzIGluXG5hcmNoL2xvb25nYXJjaC9rdm0vbW11LmM6ODExOlx0ICoga3ZtX2ZhdWx0aW5fcGZuKCkgKHdoaWNoIGNhbGxzIGdldF91c2VyX3BhZ2VzKCkpLCBzbyB0aGF0IHdlIGRvbiYjMzk7dFxuYXJjaC9sb29uZ2FyY2gva3ZtL21tdS5jLTgxMi1cdCAqIHJpc2sgdGhlIHBhZ2Ugd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIGdldHRpbmcgdW5tYXBwZWQgYmVmb3JlIHdlIGhhdmUgYVxuLS1cbmFyY2gvbWlwcy9rdm0vbW11LmM9NTQ3PXN0YXRpYyBpbnQga3ZtX21pcHNfbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdwYSxcbi0tXG5hcmNoL21pcHMva3ZtL21tdS5jLTU4MS1cdCAqIEVuc3VyZSB0aGUgcmVhZCBvZiBtbXVfaW52YWxpZGF0ZV9zZXEgaXNuJiMzOTt0IHJlb3JkZXJlZCB3aXRoIFBURSByZWFkc1xuYXJjaC9taXBzL2t2bS9tbXUuYzo1ODI6XHQgKiBpbiBrdm1fZmF1bHRpbl9wZm4oKSAod2hpY2ggY2FsbHMgZ2V0X3VzZXJfcGFnZXMoKSksIHNvIHRoYXQgd2UgZG9uJiMzOTt0XG5hcmNoL21pcHMva3ZtL21tdS5jLTU4My1cdCAqIHJpc2sgdGhlIHBhZ2Ugd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIGdldHRpbmcgdW5tYXBwZWQgYmVmb3JlIHdlIGhhdmUgYVxuLS1cbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmM9Njc4PXN0YXRpYyB2b2lkIGt2bXBwY191cGRhdGVfdnBhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bXBwY192cGEgKnZwYXAsXG4tLVxuYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYy02ODgtXHQgKiBidXQgd2UgY2FuJiMzOTt0IGNhbGwga3ZtcHBjX3Bpbl9ndWVzdF9wYWdlIHVuZGVyIHRoZSBsb2NrXG5hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jOjY4OTpcdCAqIGFzIGl0IGRvZXMgZ2V0X3VzZXJfcGFnZXMoKSBhbmQgZG93bl9yZWFkKCkuICBTbyB3ZVxuYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYy02OTAtXHQgKiBoYXZlIHRvIGRyb3AgdGhlIGxvY2ssIHBpbiB0aGUgcGFnZSwgdGhlbiBnZXQgdGhlIGxvY2tcbi0tXG5hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2VfNjQuYz05MT12b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpXG4tLVxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmMtOTYtLyogVG8gZ2V0IHRoZSBuZWNlc3NhcnkgcGFnZSBzdHJ1Y3QsIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZmlyc3QgY2FsbHNcbmFyY2gvc3BhcmMva2VybmVsL3B0cmFjZV82NC5jOjk3OiAqIGdldF91c2VyX3BhZ2VzKCkuICBUaGlzIGhhcyBkb25lIGEgZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGVcbmFyY2gvc3BhcmMva2VybmVsL3B0cmFjZV82NC5jLTk4LSAqIGFjY2Vzc2VkIHBhZ2UuICBUaGVuIG91ciBjYWxsZXIgKGNvcHlfe3RvLGZyb219X3VzZXJfcGFnZSgpKSBkaWRcbi0tXG5hcmNoL3g4Ni9rZXJuZWwvY3B1L3NneC9pb2N0bC5jPTIwNz1zdGF0aWMgaW50IF9fc2d4X2VuY2xfYWRkX3BhZ2Uoc3RydWN0IHNneF9lbmNsICplbmNsLFxuLS1cbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMtMjI0LVxuYXJjaC94ODYva2VybmVsL2NwdS9zZ3gvaW9jdGwuYzoyMjU6XHRyZXQgPSBnZXRfdXNlcl9wYWdlcyhzcmMsIDEsIDAsIFx1MDAyNnNyY19wYWdlKTtcbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMtMjI2LVx0aWYgKHJldCBcdTAwM2MgMSlcbi0tXG5hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jPTIxNj12b2lkIHVwZGF0ZV9tbXVfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbmFyY2gveHRlbnNhL21tL2NhY2hlLmMtMjY2LS8qXG5hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jOjI2NzogKiBhY2Nlc3NfcHJvY2Vzc192bSgpIGhhcyBjYWxsZWQgZ2V0X3VzZXJfcGFnZXMoKSwgd2hpY2ggaGFzIGRvbmUgYVxuYXJjaC94dGVuc2EvbW0vY2FjaGUuYy0yNjgtICogZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGUgcGFnZS5cbi0tXG5ibG9jay9iaW8uYz0xNjUwPUVYUE9SVF9TWU1CT0woYmlvX2ZyZWVfcGFnZXMpO1xuLS1cbmJsb2NrL2Jpby5jLTE2NjItICogTm90ZSB0aGF0IHRoaXMgY29kZSBpcyB2ZXJ5IGhhcmQgdG8gdGVzdCB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyBiZWNhdXNlXG5ibG9jay9iaW8uYzoxNjYzOiAqIGRpcmVjdC1pbyBwaW5zIHRoZSBwYWdlcyB3aXRoIGdldF91c2VyX3BhZ2VzKCkuICBUaGlzIG1ha2VzXG5ibG9jay9iaW8uYy0xNjY0LSAqIGlzX3BhZ2VfY2FjaGVfZnJlZWFibGUgcmV0dXJuIGZhbHNlLCBhbmQgdGhlIFZNIHdpbGwgbm90IGNsZWFuIHRoZSBwYWdlcy5cbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM9MTA2MT1zdGF0aWMgaW50IGluaXRfdXNlcl9wYWdlcyhzdHJ1Y3Qga2dkX21lbSAqbWVtLCB1aW50NjRfdCB1c2VyX2FkZHIsXG4tLVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2FtZGtmZF9ncHV2bS5jLTExMDQtXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM6MTEwNTpcdHJldCA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIHJhbmdlKTtcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0xMTA2LVx0aWYgKHJldCkge1xuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYz0yNTQyPXN0YXRpYyBpbnQgdXBkYXRlX2ludmFsaWRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1ka2ZkX3Byb2Nlc3NfaW5mbyAqcHJvY2Vzc19pbmZvLFxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0yNjAwLVx0XHQvKiBHZXQgdXBkYXRlZCB1c2VyIHBhZ2VzICovXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM6MjYwMTpcdFx0cmV0ID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgbWVtLVx1MDAzZXJhbmdlKTtcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0yNjAyLVx0XHRpZiAocmV0KSB7XG4tLVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2NzLmM9ODQ0PXN0YXRpYyBpbnQgYW1kZ3B1X2NzX3BhcnNlcl9ib3Moc3RydWN0IGFtZGdwdV9jc19wYXJzZXIgKnAsXG4tLVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2NzLmMtODg3LVxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2NzLmM6ODg4Olx0XHRyID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgZS1cdTAwM2VyYW5nZSk7XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYy04ODktXHRcdGlmIChyKVxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYz00OTU9aW50IGFtZGdwdV9nZW1fdXNlcnB0cl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLFxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYy01NTAtXHRcdFx0cmV0dXJuIC1FTk9NRU07XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2VtLmM6NTUxOlx0XHRyID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgcmFuZ2UpO1xuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dlbS5jLTU1Mi1cdFx0aWYgKHIpIHtcbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmM9NzIyPXN0cnVjdCBhbWRncHVfdHRtX3R0IHtcbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmMtNzQzLSAqL1xuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jOjc0NDppbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpibyxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYy03NDUtXHRcdFx0XHQgc3RydWN0IGFtZGdwdV9obW1fcmFuZ2UgKnJhbmdlKVxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaD0yMDc9dWludDY0X3QgYW1kZ3B1X3R0bV9kb21haW5fc3RhcnQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHVpbnQzMl90IHR5cGUpO1xuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaC0yMDktI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9BTURHUFVfVVNFUlBUUilcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaDoyMTA6aW50IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGFtZGdwdV9ibyAqYm8sXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjExLVx0XHRcdFx0IHN0cnVjdCBhbWRncHVfaG1tX3JhbmdlICpyYW5nZSk7XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjEyLSNlbHNlXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmg6MjEzOnN0YXRpYyBpbmxpbmUgaW50IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGFtZGdwdV9ibyAqYm8sXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjE0LVx0XHRcdFx0XHQgICAgICAgc3RydWN0IGFtZGdwdV9obW1fcmFuZ2UgKnJhbmdlKVxuLS1cbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jPTk1OD1hbWRncHVfdXNlcnFfdm1fdmFsaWRhdGUoc3RydWN0IGFtZGdwdV91c2VycV9tZ3IgKnVxX21ncilcbi0tXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdXNlcnEuYy0xMDU5LVx0XHRcdGJvID0gcmFuZ2UtXHUwMDNlYm87XG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdXNlcnEuYzoxMDYwOlx0XHRcdHJldCA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIHJhbmdlKTtcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jLTEwNjEtXHRcdFx0aWYgKHJldClcbi0tXG5kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90dG0uYz0zMjM9c3RhdGljIGludCByYWRlb25fdHRtX3R0X3Bpbl91c2VycHRyKHN0cnVjdCB0dG1fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX3R0ICp0dG0pXG4tLVxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMtMzUxLVxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmM6MzUyOlx0XHRyID0gZ2V0X3VzZXJfcGFnZXModXNlcnB0ciwgbnVtX3BhZ2VzLCB3cml0ZSA/IEZPTExfV1JJVEUgOiAwLFxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMtMzUzLVx0XHRcdFx0ICAgcGFnZXMpO1xuLS1cbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmM9MTc3PXN0YXRpYyBpbnQgbm9uX2F0b21pY19wdGVfbG9va3VwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMtMTg3LSNlbmRpZlxuZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmF1bHQuYzoxODg6XHRpZiAoZ2V0X3VzZXJfcGFnZXModmFkZHIsIDEsIHdyaXRlID8gRk9MTF9XUklURSA6IDAsIFx1MDAyNnBhZ2UpIFx1MDAzYz0gMClcbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMtMTg5LVx0XHRyZXR1cm4gLUVGQVVMVDtcbi0tXG5mcy9kYXguYz02ODc9c3RhdGljIHZvaWQgKmdyYWJfbWFwcGluZ19lbnRyeShzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbi0tXG5mcy9kYXguYy03ODMtICogYW55IHBhZ2UgaW4gdGhlIG1hcHBpbmcgaXMgYnVzeSwgaS5lLiBmb3IgRE1BLCBvciBvdGhlclxuZnMvZGF4LmM6Nzg0OiAqIGdldF91c2VyX3BhZ2VzKCkgdXNhZ2VzLlxuZnMvZGF4LmMtNzg1LSAqXG4tLVxuZnMvZGF4LmM9NzkxPXN0cnVjdCBwYWdlICpkYXhfbGF5b3V0X2J1c3lfcGFnZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9kYXguYy04MTMtXHQgKiBhZ2FpbnN0IGlzIG5vIGxvbmdlciBtYXBwZWQgaW4gdGhlIHBhZ2UgdGFibGVzIGFuZCBiYWlsIHRvIHRoZVxuZnMvZGF4LmM6ODE0Olx0ICogZ2V0X3VzZXJfcGFnZXMoKSBzbG93IHBhdGguICBUaGUgc2xvdyBwYXRoIGlzIHByb3RlY3RlZCBieVxuZnMvZGF4LmMtODE1LVx0ICogcHRlX2xvY2soKSBhbmQgcG1kX2xvY2soKS4gTmV3IHJlZmVyZW5jZXMgYXJlIG5vdCB0YWtlbiB3aXRob3V0XG4tLVxuZnMvZGlyZWN0LWlvLmM9MjQ0PXN0YXRpYyBzc2l6ZV90IGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIHNzaXplX3QgcmV0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4tLVxuZnMvZGlyZWN0LWlvLmMtMjg3LVx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxuZnMvZGlyZWN0LWlvLmM6Mjg4Olx0ICogbm9uLWRpcmVjdCByZWFkYWhlYWQsIG9yIGZhdWx0ZWQgaW4gYnkgZ2V0X3VzZXJfcGFnZXMoKSBpZiB0aGUgc291cmNlXG5mcy9kaXJlY3QtaW8uYy0yODktXHQgKiBvZiB0aGUgd3JpdGUgd2FzIGFuIG1tYXAmIzM5O2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSYjMzk7cmUgd3JpdGluZy4gIEVpdGhlclxuLS1cbmZzL2RpcmVjdC1pby5jPTg5OT1zdGF0aWMgaW50IGRvX2RpcmVjdF9JTyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLFxuLS1cbmZzL2RpcmVjdC1pby5jLTEwNDYtXG5mcy9kaXJlY3QtaW8uYzoxMDQ3Olx0XHQvKiBEcm9wIHRoZSBwaW4gd2hpY2ggd2FzIHRha2VuIGluIGdldF91c2VyX3BhZ2VzKCkgKi9cbmZzL2RpcmVjdC1pby5jLTEwNDgtXHRcdGRpb191bnBpbl9wYWdlKGRpbywgcGFnZSk7XG4tLVxuZnMvZXhlYy5jPTQwMj1zdGF0aWMgaW50IGJwcm1fc3RhY2tfbGltaXRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4tLVxuZnMvZXhlYy5jLTQ0OC0gKiAmIzM5O2NvcHlfc3RyaW5ncygpJiMzOTsgY29waWVzIGFyZ3VtZW50L2Vudmlyb25tZW50IHN0cmluZ3MgZnJvbSB0aGUgb2xkXG5mcy9leGVjLmM6NDQ5OiAqIHByb2Nlc3NlcyYjMzk7cyBtZW1vcnkgdG8gdGhlIG5ldyBwcm9jZXNzJiMzOTtzIHN0YWNrLiAgVGhlIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKVxuZnMvZXhlYy5jLTQ1MC0gKiBlbnN1cmVzIHRoZSBkZXN0aW5hdGlvbiBwYWdlIGlzIGNyZWF0ZWQgYW5kIG5vdCBzd2FwcGVkIG91dC5cbi0tXG5mcy9mdXNlL2RheC5jPTkxMj1pbm9kZV9pbmxpbmVfcmVjbGFpbV9vbmVfZG1hcChzdHJ1Y3QgZnVzZV9jb25uX2RheCAqZmNkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2Z1c2UvZGF4LmMtOTM3LVx0ICogTWFrZSBzdXJlIHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIGlub2RlIHBhZ2VzIHVzaW5nXG5mcy9mdXNlL2RheC5jOjkzODpcdCAqIGdldF91c2VyX3BhZ2VzKClcbmZzL2Z1c2UvZGF4LmMtOTM5LVx0ICovXG4tLVxuZnMvZnVzZS9maWxlLmM9MTU2MT1zdGF0aWMgaW5saW5lIHNpemVfdCBmdXNlX2dldF9mcmFnX3NpemUoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppaSxcbi0tXG5mcy9mdXNlL2ZpbGUuYy0xNTY2LVxuZnMvZnVzZS9maWxlLmM6MTU2NzpzdGF0aWMgaW50IGZ1c2VfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGZ1c2VfYXJnc19wYWdlcyAqYXAsIHN0cnVjdCBpb3ZfaXRlciAqaWksXG5mcy9mdXNlL2ZpbGUuYy0xNTY4LVx0XHRcdCAgICAgICBzaXplX3QgKm5ieXRlc3AsIGludCB3cml0ZSxcbi0tXG5mcy9mdXNlL2ZpbGUuYz0xNjY1PXNzaXplX3QgZnVzZV9kaXJlY3RfaW8oc3RydWN0IGZ1c2VfaW9fcHJpdiAqaW8sIHN0cnVjdCBpb3ZfaXRlciAqaXRlcixcbi0tXG5mcy9mdXNlL2ZpbGUuYy0xNzE5LVxuZnMvZnVzZS9maWxlLmM6MTcyMDpcdFx0ZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhcdTAwMjZpYS1cdTAwM2VhcCwgaXRlciwgXHUwMDI2bmJ5dGVzLCB3cml0ZSxcbmZzL2Z1c2UvZmlsZS5jLTE3MjEtXHRcdFx0XHRcdCAgbWF4X3BhZ2VzLCBmYy1cdTAwM2V1c2VfcGFnZXNfZm9yX2t2ZWNfaW8pO1xuLS1cbmZzL2lvbWFwL2RpcmVjdC1pby5jPTEwND1zc2l6ZV90IGlvbWFwX2Rpb19jb21wbGV0ZShzdHJ1Y3QgaW9tYXBfZGlvICpkaW8pXG4tLVxuZnMvaW9tYXAvZGlyZWN0LWlvLmMtMTI3LVx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxuZnMvaW9tYXAvZGlyZWN0LWlvLmM6MTI4Olx0ICogbm9uLWRpcmVjdCByZWFkYWhlYWQsIG9yIGZhdWx0ZWQgaW4gYnkgZ2V0X3VzZXJfcGFnZXMoKSBpZiB0aGUgc291cmNlXG5mcy9pb21hcC9kaXJlY3QtaW8uYy0xMjktXHQgKiBvZiB0aGUgd3JpdGUgd2FzIGFuIG1tYXAmIzM5O2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSYjMzk7cmUgd3JpdGluZy4gIEVpdGhlclxuLS1cbmZzL25mcy9kaXJlY3QuYz0zMjY9c3RhdGljIGNvbnN0IHN0cnVjdCBuZnNfcGdpb19jb21wbGV0aW9uX29wcyBuZnNfZGlyZWN0X3JlYWRfY29tcGxldGlvbl9vcHMgPSB7XG4tLVxuZnMvbmZzL2RpcmVjdC5jLTMzMy0gKiBGb3IgZWFjaCByc2l6ZSYjMzk7ZCBjaHVuayBvZiB0aGUgdXNlciYjMzk7cyBidWZmZXIsIGRpc3BhdGNoIGFuIE5GUyBSRUFEXG5mcy9uZnMvZGlyZWN0LmM6MzM0OiAqIG9wZXJhdGlvbi4gIElmIG5mc19yZWFkZGF0YV9hbGxvYygpIG9yIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsXG5mcy9uZnMvZGlyZWN0LmMtMzM1LSAqIGJhaWwgYW5kIHN0b3Agc2VuZGluZyBtb3JlIHJlYWRzLiAgUmVhZCBsZW5ndGggYWNjb3VudGluZyBpc1xuLS1cbmZzL25mcy9kaXJlY3QuYz04NTI9c3RhdGljIGNvbnN0IHN0cnVjdCBuZnNfcGdpb19jb21wbGV0aW9uX29wcyBuZnNfZGlyZWN0X3dyaXRlX2NvbXBsZXRpb25fb3BzID0ge1xuLS1cbmZzL25mcy9kaXJlY3QuYy04NjUtICogRm9yIGVhY2ggd3NpemUmIzM5O2QgY2h1bmsgb2YgdGhlIHVzZXImIzM5O3MgYnVmZmVyLCBkaXNwYXRjaCBhbiBORlMgV1JJVEVcbmZzL25mcy9kaXJlY3QuYzo4NjY6ICogb3BlcmF0aW9uLiAgSWYgbmZzX3dyaXRlZGF0YV9hbGxvYygpIG9yIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsXG5mcy9uZnMvZGlyZWN0LmMtODY3LSAqIGJhaWwgYW5kIHN0b3Agc2VuZGluZyBtb3JlIHdyaXRlcy4gIFdyaXRlIGxlbmd0aCBhY2NvdW50aW5nIGlzXG4tLVxuZnMveGZzL3hmc19pbm9kZS5jPTk2PXhmc19sb2NrX2ZsYWdzX2Fzc2VydChcbi0tXG5mcy94ZnMveGZzX2lub2RlLmMtMTI4LSAqIGNhbiBmYXVsdCBpbiBwYWdlcyBkdXJpbmcgY29weSBpbi9vdXQgKGZvciBidWZmZXJlZCBJTykgb3IgcmVxdWlyZSB0aGVcbmZzL3hmcy94ZnNfaW5vZGUuYzoxMjk6ICogbW1hcF9sb2NrIGluIGdldF91c2VyX3BhZ2VzKCkgdG8gbWFwIHRoZSB1c2VyIHBhZ2VzIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzXG5mcy94ZnMveGZzX2lub2RlLmMtMTMwLSAqIHNwYWNlIGZvciBkaXJlY3QgSU8uIFNpbWlsYXJseSB0aGUgaV9yd3NlbSBjYW5ub3QgYmUgdGFrZW4gaW5zaWRlIGEgcGFnZVxuLS1cbmluY2x1ZGUvbGludXgvbW0uaD03ODM9c3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHtcbi0tXG5pbmNsdWRlL2xpbnV4L21tLmgtODM0LVxuaW5jbHVkZS9saW51eC9tbS5oOjgzNTpcdC8qIGNhbGxlZCBieSBhY2Nlc3NfcHJvY2Vzc192bSB3aGVuIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsIHR5cGljYWxseVxuaW5jbHVkZS9saW51eC9tbS5oLTgzNi1cdCAqIGZvciB1c2UgYnkgc3BlY2lhbCBWTUFzLiBTZWUgYWxzbyBnZW5lcmljX2FjY2Vzc19waHlzKCkgZm9yIGEgZ2VuZXJpY1xuLS1cbmluY2x1ZGUvbGludXgvbW0uaD0yMTg2PXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbi0tXG5pbmNsdWRlL2xpbnV4L21tLmgtMjIyMi0gKiBMb2NraW5nOiB0aGUgbG9ja2xlc3MgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiBmb2xpb190cnlfZ2V0X3JjdSgpXG5pbmNsdWRlL2xpbnV4L21tLmg6MjIyMzogKiBwcm92aWRlcyBzYWZlIG9wZXJhdGlvbiBmb3IgZ2V0X3VzZXJfcGFnZXMoKSwgZm9saW9fbWtjbGVhbigpIGFuZFxuaW5jbHVkZS9saW51eC9tbS5oLTIyMjQtICogb3RoZXIgY2FsbHMgdGhhdCByYWNlIHRvIHNldCB1cCBwYWdlIHRhYmxlIGVudHJpZXMuXG4tLVxuaW5jbHVkZS9saW51eC9tbS5oPTMyNDE9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2V0X3VzZXJfcGFnZV92bWFfcmVtb3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbmluY2x1ZGUvbGludXgvbW0uaC0zMjY3LVxuaW5jbHVkZS9saW51eC9tbS5oOjMyNjg6bG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNjktXHRcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTtcbi0tXG5pbmNsdWRlL3VhcGkvbGludXgvbml0cm9fZW5jbGF2ZXMuaC0xNDYtICogKiBORV9FUlJfSU5WQUxJRF9GTEFHX1ZBTFVFXHRcdC0gVGhlIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBmbGFnIGlzIGludmFsaWQuXG5pbmNsdWRlL3VhcGkvbGludXgvbml0cm9fZW5jbGF2ZXMuaDoxNDc6ICogKiBFcnJvciBjb2RlcyBmcm9tIGdldF91c2VyX3BhZ2VzKCkuXG5pbmNsdWRlL3VhcGkvbGludXgvbml0cm9fZW5jbGF2ZXMuaC0xNDgtICogKiBFcnJvciBjb2RlcyBmcm9tIHRoZSBORSBQQ0kgZGV2aWNlIHJlcXVlc3QuXG4tLVxua2VybmVsL2V2ZW50cy91cHJvYmVzLmM9MjQwMD1zdGF0aWMgaW50IGlzX3RyYXBfYXRfYWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2YWRkcilcbi0tXG5rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYy0yNDE1LVxua2VybmVsL2V2ZW50cy91cHJvYmVzLmM6MjQxNjpcdHJlc3VsdCA9IGdldF91c2VyX3BhZ2VzKHZhZGRyLCAxLCBGT0xMX0ZPUkNFLCBcdTAwMjZwYWdlKTtcbmtlcm5lbC9ldmVudHMvdXByb2Jlcy5jLTI0MTctXHRpZiAocmVzdWx0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9mdXRleC9jb3JlLmM9NTAyPWludCBnZXRfZnV0ZXhfa2V5KHUzMiBfX3VzZXIgKnVhZGRyLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuaW9uIGZ1dGV4X2tleSAqa2V5LFxuLS1cbmtlcm5lbC9mdXRleC9jb3JlLmMtNzM1LSAqIGRpc2FibGVkIHNlY3Rpb24gc28gd2UgY2FuIGFzIHdlbGwgYXZvaWQgdGhlICNQRiBvdmVyaGVhZCBieVxua2VybmVsL2Z1dGV4L2NvcmUuYzo3MzY6ICogY2FsbGluZyBnZXRfdXNlcl9wYWdlcygpIHJpZ2h0IGF3YXkuXG5rZXJuZWwvZnV0ZXgvY29yZS5jLTczNy0gKi9cbi0tXG5saWIvaW92X2l0ZXIuYz0xMjk9RVhQT1JUX1NZTUJPTChmYXVsdF9pbl9pb3ZfaXRlcl9yZWFkYWJsZSk7XG4tLVxubGliL2lvdl9pdGVyLmMtMTM1LSAqXG5saWIvaW92X2l0ZXIuYzoxMzY6ICogRmF1bHRzIGluIHRoZSBpdGVyYXRvciB1c2luZyBnZXRfdXNlcl9wYWdlcygpLCBpLmUuLCB3aXRob3V0IHRyaWdnZXJpbmdcbmxpYi9pb3ZfaXRlci5jLTEzNy0gKiBoYXJkd2FyZSBwYWdlIGZhdWx0cy4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0XG4tLVxubW0vS2NvbmZpZz0xMzA2PWNvbmZpZyBHVVBfVEVTVFxubW0vS2NvbmZpZzoxMzA3Olx0Ym9vbCBcJiMzNDtFbmFibGUgaW5mcmFzdHJ1Y3R1cmUgZm9yIGdldF91c2VyX3BhZ2VzKCktcmVsYXRlZCB1bml0IHRlc3RzXCYjMzQ7XG5tbS9LY29uZmlnLTEzMDgtXHRkZXBlbmRzIG9uIERFQlVHX0ZTXG4tLVxubW0vZmlsZW1hcC5jPTE1MD1zdGF0aWMgdm9pZCBmaWxlbWFwX3VuYWNjb3VudF9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5tbS9maWxlbWFwLmMtMjAyLVx0ICogQnV0IGl0JiMzOTtzIGhhcm1sZXNzIG9uIGluLW1lbW9yeSBmaWxlc3lzdGVtcyBsaWtlIHRtcGZzOyBhbmQgY2FuXG5tbS9maWxlbWFwLmM6MjAzOlx0ICogb2NjdXIgd2hlbiBhIGRyaXZlciB3aGljaCBkaWQgZ2V0X3VzZXJfcGFnZXMoKSBzZXRzIHBhZ2UgZGlydHlcbm1tL2ZpbGVtYXAuYy0yMDQtXHQgKiBiZWZvcmUgcHV0dGluZyBpdCwgd2hpbGUgdGhlIGlub2RlIGlzIGJlaW5nIGZpbmFsbHkgZXZpY3RlZC5cbi0tXG5tbS9maWxlbWFwLmM9NDI4MT1nZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxuLS1cbm1tL2ZpbGVtYXAuYy00MzAxLVx0ICogRmluYWxseSwgdHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuXG5tbS9maWxlbWFwLmM6NDMwMjpcdCAqIGNhY2hlZCBieSBub24tZGlyZWN0IHJlYWRhaGVhZCwgb3IgZmF1bHRlZCBpbiBieSBnZXRfdXNlcl9wYWdlcygpXG5tbS9maWxlbWFwLmMtNDMwMy1cdCAqIGlmIHRoZSBzb3VyY2Ugb2YgdGhlIHdyaXRlIHdhcyBhbiBtbWFwJiMzOTtlZCByZWdpb24gb2YgdGhlIGZpbGVcbi0tXG5tbS9ndXAuYz0yNDc9c3RhdGljIGlubGluZSBzdHJ1Y3QgZm9saW8gKmd1cF9mb2xpb19uZXh0KHN0cnVjdCBwYWdlICoqbGlzdCxcbi0tXG5tbS9ndXAuYy0yNjctICpcbm1tL2d1cC5jOjI2ODogKiBcJiMzNDtndXAtcGlubmVkIHBhZ2VcJiMzNDsgcmVmZXJzIHRvIGEgcGFnZSB0aGF0IGhhcyBoYWQgb25lIG9mIHRoZSBnZXRfdXNlcl9wYWdlcygpXG5tbS9ndXAuYy0yNjktICogdmFyaWFudHMgY2FsbGVkIG9uIHRoYXQgcGFnZS5cbi0tXG5tbS9ndXAuYz05Mjk9c3RhdGljIHVuc2lnbmVkIGxvbmcgZm9sbG93X3B0ZV9iYXRjaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy05NTMtICogQSBmYWlsdXJlIG9uIHRoZSBmaXJzdCBQVEUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gQSBmYWlsdXJlIGFmdGVyIHRoYXRcbm1tL2d1cC5jOjk1NDogKiBpcyBhIHNob3J0IHJlYWQ7IF9fZ2V0X3VzZXJfcGFnZXMoKSByZXRyeWluZyB0aGUgcmVhZCB3aWxsIGdldCB0aGUgZXJyb3IuXG5tbS9ndXAuYy05NTUtICovXG4tLVxubW0vZ3VwLmM9MTQwMj1zdGF0aWMgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpndXBfdm1hX2xvb2t1cChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0xNDM3LS8qKlxubW0vZ3VwLmM6MTQzODogKiBfX2dldF91c2VyX3BhZ2VzKCkgLSBwaW4gdXNlciBwYWdlcyBpbiBtZW1vcnlcbm1tL2d1cC5jLTE0MzktICogQG1tOlx0XHRtbV9zdHJ1Y3Qgb2YgdGFyZ2V0IG1tXG4tLVxubW0vZ3VwLmMtMTQ5MC0gKi9cbm1tL2d1cC5jOjE0OTE6c3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2d1cC5jLTE0OTItXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vZ3VwLmM9MTYxMz1zdGF0aWMgYm9vbCB2bWFfcGVybWl0c19mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy0xNjUxLSAqXG5tbS9ndXAuYzoxNjUyOiAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBnZXRfdXNlcl9wYWdlcygpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsXG5tbS9ndXAuYy0xNjUzLSAqIHVuY29uZGl0aW9uYWxseSBjYWxsIGhhbmRsZV9tbV9mYXVsdCgpIHdoaWNoIHdpbGwgaW4gdHVybiBwZXJmb3JtIGFsbCB0aGVcbm1tL2d1cC5jLTE2NTQtICogbmVjZXNzYXJ5IFNXIGZpeHVwIG9mIHRoZSBkaXJ0eSBhbmQgeW91bmcgYml0cyBpbiB0aGUgUFRFLCB3aGlsZVxubW0vZ3VwLmM6MTY1NTogKiBnZXRfdXNlcl9wYWdlcygpIG9ubHkgZ3VhcmFudGVlcyB0byB1cGRhdGUgdGhlc2UgaW4gdGhlIHN0cnVjdCBwYWdlLlxubW0vZ3VwLmMtMTY1Ni0gKlxuLS1cbm1tL2d1cC5jPTE3MjY9c3RhdGljIGJvb2wgZ3VwX3NpZ25hbF9wZW5kaW5nKHVuc2lnbmVkIGludCBmbGFncylcbi0tXG5tbS9ndXAuYy0xNzQ2LSAqXG5tbS9ndXAuYzoxNzQ3OiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiwgdW5saWtlIF9fZ2V0X3VzZXJfcGFnZXMoKSwgd2lsbCBub3QgcmV0dXJuIDBcbm1tL2d1cC5jLTE3NDgtICogZm9yIG5yX3BhZ2VzIFx1MDAzZSAwLCB1bmxlc3MgRk9MTF9OT1dBSVQgaXMgdXNlZC5cbi0tXG5tbS9ndXAuYz0xNzUwPXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9ndXAuYy0xNzkyLVx0Zm9yICg7Oykge1xubW0vZ3VwLmM6MTc5MzpcdFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIG5yX3BhZ2VzLCBmbGFncywgcGFnZXMsXG5tbS9ndXAuYy0xNzk0LVx0XHRcdFx0ICAgICAgIGxvY2tlZCk7XG4tLVxubW0vZ3VwLmMtMTg1Mi1cdFx0KmxvY2tlZCA9IDE7XG5tbS9ndXAuYzoxODUzOlx0XHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgMSwgZmxhZ3MgfCBGT0xMX1RSSUVELFxubW0vZ3VwLmMtMTg1NC1cdFx0XHRcdCAgICAgICBwYWdlcywgbG9ja2VkKTtcbi0tXG5tbS9ndXAuYz0xOTE0PWxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vZ3VwLmMtMTk2MC1cdCAqL1xubW0vZ3VwLmM6MTk2MTpcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZ3VwX2ZsYWdzLFxubW0vZ3VwLmMtMTk2Mi1cdFx0XHQgICAgICAgTlVMTCwgbG9ja2VkID8gbG9ja2VkIDogXHUwMDI2bG9jYWxfbG9ja2VkKTtcbi0tXG5tbS9ndXAuYy0xOTc5LSAqIFJldHVybnMgZWl0aGVyIG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMgaW4gdGhlIE1NLCBvciBhIG5lZ2F0aXZlIGVycm9yXG5tbS9ndXAuYzoxOTgwOiAqIGNvZGUgb24gZXJyb3IgKHNlZSBfX2dldF91c2VyX3BhZ2VzKCkpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXBvcnRzXG5tbS9ndXAuYy0xOTgxLSAqIGVycm9ycyByZWxhdGVkIHRvIFZNQXMsIHN1Y2ggYXMgaW5jb21wYXRpYmxlIG1hcHBpbmdzLCBhcyBleHBlY3RlZCBieVxuLS1cbm1tL2d1cC5jPTI3MjI9bG9uZyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vZ3VwLmMtMjczMS0vKipcbm1tL2d1cC5jOjI3MzI6ICogZ2V0X3VzZXJfcGFnZXMoKSAtIHBpbiB1c2VyIHBhZ2VzIGluIG1lbW9yeVxubW0vZ3VwLmMtMjczMy0gKiBAc3RhcnQ6ICAgICAgc3RhcnRpbmcgdXNlciBhZGRyZXNzXG4tLVxubW0vZ3VwLmMtMjc0NC0gKi9cbm1tL2d1cC5jOjI3NDU6bG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxubW0vZ3VwLmMtMjc0Ni1cdFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4tLVxubW0vZ3VwLmM9Mjc1Nj1FWFBPUlRfU1lNQk9MKGdldF91c2VyX3BhZ2VzKTtcbi0tXG5tbS9ndXAuYy0yNzYxLSAqICAgICAgbW1hcF9yZWFkX2xvY2sobW0pO1xubW0vZ3VwLmM6Mjc2MjogKiAgICAgIGdldF91c2VyX3BhZ2VzKG1tLCAuLi4sIHBhZ2VzLCBOVUxMKTtcbm1tL2d1cC5jLTI3NjMtICogICAgICBtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbi0tXG5tbS9ndXAuYz0zMzU5PUVYUE9SVF9TWU1CT0xfR1BMKGdldF91c2VyX3BhZ2VzX2Zhc3Rfb25seSk7XG4tLVxubW0vZ3VwLmMtMzM3MC0gKiBJZiBub3Qgc3VjY2Vzc2Z1bCwgaXQgd2lsbCBmYWxsIGJhY2sgdG8gdGFraW5nIHRoZSBsb2NrIGFuZFxubW0vZ3VwLmM6MzM3MTogKiBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkuXG5tbS9ndXAuYy0zMzcyLSAqXG4tLVxubW0vZ3VwLmM9MzQ1Nz1FWFBPUlRfU1lNQk9MKHBpbl91c2VyX3BhZ2VzX3JlbW90ZSk7XG4tLVxubW0vZ3VwLmMtMzQ2Ny0gKlxubW0vZ3VwLmM6MzQ2ODogKiBOZWFybHkgdGhlIHNhbWUgYXMgZ2V0X3VzZXJfcGFnZXMoKSwgZXhjZXB0IHRoYXQgRk9MTF9UT1VDSCBpcyBub3Qgc2V0LCBhbmRcbm1tL2d1cC5jLTM0NjktICogRk9MTF9QSU4gaXMgc2V0LlxuLS1cbm1tL2d1cF90ZXN0LmM9MTAxPXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMTQ3LVx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxubW0vZ3VwX3Rlc3QuYzoxNDg6XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncywgcGFnZXMgJiM0MzsgaSk7XG5tbS9ndXBfdGVzdC5jLTE0OS1cdFx0XHRicmVhaztcbi0tXG5tbS9ndXBfdGVzdC5jLTE2Ni1cdFx0XHRlbHNlXG5tbS9ndXBfdGVzdC5jOjE2NzpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE2OC1cdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4tLVxubW0vaG1tLmM9NjMxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1fd2Fsa19vcHMgaG1tX3dhbGtfb3BzID0ge1xuLS1cbm1tL2htbS5jLTY1NS0gKlxubW0vaG1tLmM6NjU2OiAqIFRoaXMgaXMgc2ltaWxhciB0byBnZXRfdXNlcl9wYWdlcygpLCBleGNlcHQgdGhhdCBpdCBjYW4gcmVhZCB0aGUgcGFnZSB0YWJsZXNcbm1tL2htbS5jLTY1Ny0gKiB3aXRob3V0IG11dGF0aW5nIHRoZW0gKGllIGNhdXNpbmcgZmF1bHRzKS5cbi0tXG5tbS9tYWR2aXNlLmM9MTg4Nz1zdGF0aWMgaW50IG1hZHZpc2VfZG9fYmVoYXZpb3IodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbl9pbixcbi0tXG5tbS9tYWR2aXNlLmMtMTkzOC0gKiAgTUFEVl9ET05URk9SSyAtIG9taXQgdGhpcyBhcmVhIGZyb20gY2hpbGQmIzM5O3MgYWRkcmVzcyBzcGFjZSB3aGVuIGZvcmtpbmc6XG5tbS9tYWR2aXNlLmM6MTkzOTogKlx0XHR0eXBpY2FsbHksIHRvIGF2b2lkIENPV2luZyBwYWdlcyBwaW5uZWQgYnkgZ2V0X3VzZXJfcGFnZXMoKS5cbm1tL21hZHZpc2UuYy0xOTQwLSAqICBNQURWX0RPRk9SSyAtIGNhbmNlbCBNQURWX0RPTlRGT1JLOiBubyBsb25nZXIgb21pdCB0aGlzIGFyZWEgd2hlbiBmb3JraW5nLlxuLS1cbm1tL21lbWZkLmM9Njc9c3RydWN0IGZvbGlvICptZW1mZF9hbGxvY19mb2xpbyhzdHJ1Y3QgZmlsZSAqbWVtZmQsIHBnb2ZmX3QgaWR4KVxuLS1cbm1tL21lbWZkLmMtMTQ3LSAqIFNldHRpbmcgU0VBTF9XUklURSByZXF1aXJlcyB1cyB0byB2ZXJpZnkgdGhlcmUmIzM5O3Mgbm8gcGVuZGluZyB3cml0ZXIuIEhvd2V2ZXIsXG5tbS9tZW1mZC5jOjE0ODogKiB2aWEgZ2V0X3VzZXJfcGFnZXMoKSwgZHJpdmVycyBtaWdodCBoYXZlIHNvbWUgcGVuZGluZyBJL08gd2l0aG91dCBhbnkgYWN0aXZlXG5tbS9tZW1mZC5jLTE0OS0gKiB1c2VyLXNwYWNlIG1hcHBpbmdzIChlZy4sIGRpcmVjdC1JTywgQUlPKS4gVGhlcmVmb3JlLCB3ZSBsb29rIGF0IGFsbCBmb2xpb3Ncbi0tXG5tbS9tbG9jay5jPTU3Nz1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb3VudF9tbV9tbG9ja2VkX3BhZ2VfbnIoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0vbWxvY2suYy02MDYtLypcbm1tL21sb2NrLmM6NjA3OiAqIGNvbnZlcnQgZ2V0X3VzZXJfcGFnZXMoKSByZXR1cm4gdmFsdWUgdG8gcG9zaXggbWxvY2soKSBlcnJvclxubW0vbWxvY2suYy02MDgtICovXG4tLVxubW0vcGFnZXdhbGsuYz04MDA9aW50IHdhbGtfcGFnZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90IGZpcnN0X2luZGV4LFxuLS1cbm1tL3BhZ2V3YWxrLmMtODgxLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCAqbm90KiBiZSB1c2VkIGFzIGEgbmFpdmUgcmVwbGFjZW1lbnQgZm9yXG5tbS9wYWdld2Fsay5jOjg4MjogKiBnZXRfdXNlcl9wYWdlcygpIC8gcGluX3VzZXJfcGFnZXMoKSwgZXNwZWNpYWxseSBub3QgdG8gcGVyZm9ybSBETUEgb3Jcbm1tL3BhZ2V3YWxrLmMtODgzLSAqIHRvIGNhcmVsZXNzbHkgbW9kaWZ5IHBhZ2UgY29udGVudC4gVGhpcyBmdW5jdGlvbiBtYXkgKm9ubHkqIGJlIHVzZWQgdG8gZ3JhYlxuLS1cbm1tL3Ztc2Nhbi5jPTY3OT1zdGF0aWMgaW50IF9fcmVtb3ZlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4tLVxubW0vdm1zY2FuLmMtNzAzLVx0ICpcbm1tL3Ztc2Nhbi5jOjcwNDpcdCAqIGdldF91c2VyX3BhZ2VzKFx1MDAyNnBhZ2UpO1xubW0vdm1zY2FuLmMtNzA1LVx0ICogW3VzZXIgbWFwcGluZyBnb2VzIGF3YXldXG4tLVxubmV0L3Jkcy9pbmZvLmM9MTA1PXZvaWQgcmRzX2luZm9faXRlcl91bm1hcChzdHJ1Y3QgcmRzX2luZm9faXRlcmF0b3IgKml0ZXIpXG4tLVxubmV0L3Jkcy9pbmZvLmMtMTEzLS8qXG5uZXQvcmRzL2luZm8uYzoxMTQ6ICogZ2V0X3VzZXJfcGFnZXMoKSBjYWxsZWQgZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGUgcGFnZXMgZm9yIHVzLlxubmV0L3Jkcy9pbmZvLmMtMTE1LSAqL1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYz0xODEyPVRFU1RfRihpb21tdWZkX21vY2tfZG9tYWluLCByb191bnNoYXJlKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYy0xODI2LVx0ICogVGhlcmUgaGF2ZSBiZWVuIGxvdHMgb2YgY2hhbmdlcyB0byB0aGUgXCYjMzQ7dW5zaGFyZVwmIzM0OyBtZWNoYW5pc20gaW5cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYzoxODI3Olx0ICogZ2V0X3VzZXJfcGFnZXMoKSwgbWFrZSBzdXJlIGl0IHdvcmtzIHJpZ2h0LiBUaGUgd3JpdGUgdG8gdGhlIHBhZ2VcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lvbW11L2lvbW11ZmQuYy0xODI4LVx0ICogYWZ0ZXIgd2UgbWFwIGl0IGZvciByZWFkaW5nIHNob3VsZCBub3QgY2hhbmdlIHRoZSBhc3NpZ25lZCBQRk4uXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYy04LSAqIHBhZ2VzIGR1cmluZyByZWFkcygpLiBEdWUgdG8gdGhlIDFzIGRlbGF5IG9mIHRoaXMgZmlsZS1zeXN0ZW0sIHRoaXMgaXMgYVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYzo5OiAqIG5pY2Ugd2F5IHRvIHRlc3QgcmFjZS1jb25kaXRpb25zIGFnYWluc3QgZ2V0X3VzZXJfcGFnZXMoKSBpbiB0aGUga2VybmVsLlxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYy0xMC0gKlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfdGVzdC5jLTMtICogbWVtZmQgR1VQIHRlc3QtY2FzZVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmM6NDogKiBUaGlzIHRlc3RzIG1lbWZkIGludGVyYWN0aW9ucyB3aXRoIGdldF91c2VyX3BhZ2VzKCkuIFdlIHJlcXVpcmUgdGhlXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy01LSAqIGZ1c2VfbW50LmMgcHJvZ3JhbSB0byBwcm92aWRlIGEgZmFrZSBkaXJlY3QtSU8gRlVTRSBtb3VudC1wb2ludCBmb3IgdXMuIFRoaXNcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy03LSAqIHJlYWQoKSBvbiBmaWxlcyBpbiB0aGF0IGZpbGUtc3lzdGVtIHdpbGwgcGluIHRoZSByZWNlaXZlLWJ1ZmZlciBwYWdlcyBmb3IgYXRcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfdGVzdC5jOjg6ICogbGVhc3QgMXMgdmlhIGdldF91c2VyX3BhZ2VzKCkuXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy05LSAqXG4tLVxudG9vbHMvdGVzdGluZy92bWEvaW5jbHVkZS9kdXAuaD02MzI9c3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHtcbi0tXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4My1cbnRvb2xzL3Rlc3Rpbmcvdm1hL2luY2x1ZGUvZHVwLmg6Njg0Olx0LyogY2FsbGVkIGJ5IGFjY2Vzc19wcm9jZXNzX3ZtIHdoZW4gZ2V0X3VzZXJfcGFnZXMoKSBmYWlscywgdHlwaWNhbGx5XG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4NS1cdCAqIGZvciB1c2UgYnkgc3BlY2lhbCBWTUFzLiBTZWUgYWxzbyBnZW5lcmljX2FjY2Vzc19waHlzKCkgZm9yIGEgZ2VuZXJpY1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzODA1MwoJCQkJCQkJb3V0cHV0OiAyMTgKCQkJCQkJCXRob3VnaHRzOiAyNTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgR1VQIFJlZmFjdG9yKioKCk9rYXksIHNvIEkgc2VlIHRoaXMgcGF0Y2ggaXMgdGFja2xpbmcgdGhlIGNvcmUgJiMzNDtHZXQgVXNlciBQYWdlcyYjMzQ7IChHVVApIGxvZ2ljIHdpdGhpbiBgbW0vZ3VwLmNgLiBUaGlzIGlzIGEgKm1ham9yKiByZWZhY3RvciwgYW5kIGl0JiMzOTtzIGEgY3JpdGljYWwgYXJlYS4gYGdldF91c2VyX3BhZ2VzYCBpcyB0aGUgbGluY2hwaW47IGl0JiMzOTtzIHRoZSBwcmltYXJ5IEFQSSB1c2VkIGJ5IGEgaHVnZSBudW1iZXIgb2YgZHJpdmVycywgc28gaXQgaGFzIHRvIGJlIG9uIHRoZSBsaXN0LiBJJiMzOTtsbCBkZWZpbml0ZWx5IGJlIGluY2x1ZGluZyB0aGF0IG9uZS4KCkxvb2tpbmcgYXQgdGhlIG90aGVyIGZvY3VzIHN5bWJvbHMsIEkgc2VlIHRoZXJlJiMzOTtzIGEgZmFtaWx5IG9mIGZ1bmN0aW9uczogYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgYXJlIGFsbCByZWxhdGVkIHRvIHBpbm5pbmcgb3IgZmF1bHRpbmcgaW4gdXNlciBwYWdlcywgd2hpY2ggYXJlIHVzZWQgdG8gYWNjZXNzIHVzZXItc3BhY2UgbWVtb3J5IGZyb20gdGhlIGtlcm5lbC4gVGhpcyBhbHNvIHN1Z2dlc3RzIHRoYXQgdGhlcmUgYXJlIHNpbWlsYXIgY2hhbmdlcyB0aGF0IHdlcmUgZG9uZS4gVGhlc2UgYWxsIG5lZWQgdG8gYmUgY2FyZWZ1bGx5IGV4YW1pbmVkIGFzIHdlbGwuIFRoZSBpbXBsaWNhdGlvbnMgb2YgYmF0Y2hpbmcgcGFnZSB0YWJsZSB3YWxrcyBmb3IgdGhlc2UgYXJlIHNpZ25pZmljYW50LgoKQW5kIG9mIGNvdXJzZSwgY29uc2lkZXJpbmcgdGhlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCRlNgIGNvbmZpZyBvcHRpb25zIGFyZSBhbHNvIG1lbnRpb25lZCwgSSBuZWVkIHRvIGtlZXAgdGhvc2UgaW4gbWluZC4gQW55IGNoYW5nZXMgaGVyZSBjb3VsZCBoYXZlIGZhci1yZWFjaGluZyBlZmZlY3RzIHdoZW4gdGhvc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQuCgpUaGUgcmVhc29uaW5nIGhlcmUgaXMgc29saWQuIFRoZSBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIGhvdyBHVVAgd29ya3Mg4oCTIGJhdGNoaW5nIHBhZ2UgdGFibGUgd2Fsa3MgbWVhbnMgaW1wcm92ZWQgcGVyZm9ybWFuY2UsIGJ1dCBhbHNvIGEgcG90ZW50aWFsIGZvciBuZXcgZWRnZSBjYXNlcyBhbmQgdnVsbmVyYWJpbGl0aWVzIHRvIGFwcGVhci4gQmVjYXVzZSB0aGlzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpcyB0b3VjaGVkIGJ5IHNvIG1hbnkgc3lzdGVtIGNhbGxzIChtbWFwLCBtYWR2aXNlLCBwdHJhY2UsIHByb2Nlc3Nfdm1fcmVhZHYpLCB0aGUgYXR0YWNrIHN1cmZhY2UgaXMgc3Vic3RhbnRpYWwuIEZ1enppbmcgdGhlIEdVUCBBUEkgZW50cnkgcG9pbnRzIGlzIHRoZSByaWdodCBhcHByb2FjaC4KCkkmIzM5O2xsIHVzZSBgc2V0LXJlc3VsdHNgIHRvIHJlcG9ydCB0aGlzLiBNeSByZXBvcnQgd2lsbCBpZGVudGlmeSB0aGUgc2lnbmlmaWNhbnQgY2hhbmdlcyBhbmQgdGhlIGZvY3VzIG5lZWRlZCBmb3IgZW5zdXJpbmcgdGhlIGNvZGUgaXMgY29ycmVjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0hVR0VUTEJGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzJiMzNDssCiAgICAmIzM0O2dldF91c2VyX3BhZ2VzX3JlbW90ZSYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc191bmxvY2tlZCYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtwaW5fdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7ZmF1bHRpbl9wYWdlX3JhbmdlJiMzNDssCiAgICAmIzM0O3BvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgY29yZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYyBpbiBgbW0vZ3VwLmNgIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MgYW5kIHJldHVybiBtdWx0aXBsZSBwYWdlcyBhdCBvbmNlIGluc3RlYWQgb2Ygb25lIGJ5IG9uZS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSB0aGF0IGlzIHJlYWNoYWJsZSB2aWEgbWFueSBzeXNjYWxscyAoZS5nLiwgbW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KS4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIGV4cG9ydGVkIEdVUCBBUEkgZW50cnkgcG9pbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtIVUdFVExCRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdXNlcl9wYWdlcyYjMzQ7LAogICAgJiMzNDtnZXRfdXNlcl9wYWdlc19yZW1vdGUmIzM0OywKICAgICYjMzQ7Z2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXMmIzM0OywKICAgICYjMzQ7cGluX3VzZXJfcGFnZXNfcmVtb3RlJiMzNDssCiAgICAmIzM0O3Bpbl91c2VyX3BhZ2VzX3VubG9ja2VkJiMzNDssCiAgICAmIzM0O2ZhdWx0aW5fcGFnZV9yYW5nZSYjMzQ7LAogICAgJiMzNDtwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTY6NTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdlNjc2ZThiMDM4ZTAxY2NkYzYyNzg1NzY5MzZkNjBkOWI3YWI4NApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vZ3VwLmMgYi9tbS9ndXAuYwppbmRleCAwNjkyMTE5Yjc5MDQzLi4xMDY4MDY2MzRiM2M0IDEwMDY0NAotLS0gYS9tbS9ndXAuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9ndXAuYwpAQCAtNjA4LDE1ICYjNDM7NjA4LDE1IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihzdHJ1Y3QgcGFnZSAqcGFnZSwKIAlyZXR1cm4gcGFnZSAmYW1wOyZhbXA7IFBhZ2VBbm9uKHBhZ2UpICZhbXA7JmFtcDsgUGFnZUFub25FeGNsdXNpdmUocGFnZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQomIzQzO3N0YXRpYyBsb25nIG5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlpZiAoIShmbGFncyAmYW1wOyBGT0xMX0RVTVApKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJLyoKIAkgKiBXaGVuIGNvcmUgZHVtcGluZywgd2UgZG9uJiMzOTt0IHdhbnQgdG8gYWxsb2NhdGUgdW5uZWNlc3NhcnkgcGFnZXMgb3IKLQkgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIE5VTEwgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsCiYjNDM7CSAqIHBhZ2UgdGFibGVzLiAgUmV0dXJuIGVycm9yIGluc3RlYWQgb2YgMCB0byBza2lwIGhhbmRsZV9tbV9mYXVsdCwKIAkgKiB0aGVuIGdldF9kdW1wX3BhZ2UoKSB3aWxsIHJldHVybiBOVUxMIHRvIGxlYXZlIGEgaG9sZSBpbiB0aGUgZHVtcC4KIAkgKiBCdXQgd2UgY2FuIG9ubHkgbWFrZSB0aGlzIG9wdGltaXphdGlvbiB3aGVyZSBhIGhvbGUgd291bGQgc3VyZWx5CiAJICogYmUgemVyby1maWxsZWQgaWYgaGFuZGxlX21tX2ZhdWx0KCkgYWN0dWFsbHkgZGlkIGhhbmRsZSBpdC4KQEAgLTYyNSwxMiAmIzQzOzYyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKm5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7CiAKIAkJaWYgKCFodWdldGxiZnNfcGFnZWNhY2hlX3ByZXNlbnQoaCwgdm1hLCBhZGRyZXNzKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwomIzQzOwkJCXJldHVybiAtRUZBVUxUOwogCX0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLSZndDt2bV9vcHMtJmd0O2ZhdWx0KSkgewotCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKJiM0MzsJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlpZiAoIXBhZ2VzKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzdHJ1Y3QgcGFnZSAqc3VicGFnZSA9IHBhZ2UgJiM0MzsgaTsKJiM0MzsKJiM0MzsJCXBhZ2VzW2ldID0gc3VicGFnZTsKJiM0MzsJCWZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIGFkZHJlc3MgJiM0MzsgaSAqIFBBR0VfU0laRSk7CiYjNDM7CQlmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTsKJiM0MzsJfQogfQogCiAjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTCkBAIC02NDYsMzggJiM0Mzs2NjMsNDMgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZF90IHB1ZCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHBhZ2UsIHZtYSwgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXB1ZF90IHB1ZCA9ICpwdWRwOwogCXVuc2lnbmVkIGxvbmcgcGZuID0gcHVkX3BmbihwdWQpOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZiwgbnI7CiAJaW50IHJldDsKIAogCWFzc2VydF9zcGluX2xvY2tlZChwdWRfbG9ja3B0cihtbSwgcHVkcCkpOwogCiAJaWYgKCFwdWRfcHJlc2VudChwdWQpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7CiAJICAgICFjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWQsIHBmbl90b19wYWdlKHBmbiksIHZtYSwgZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCi0JcGZuICYjNDM7PSAoYWRkciAmYW1wOyB+UFVEX01BU0spICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CW9mZiA9IFBGTl9ET1dOKGFkZHIgJmFtcDsgflBVRF9NQVNLKTsKJiM0MzsJcGZuICYjNDM7PSBvZmY7CiAJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAKIAlpZiAoIXB1ZF93cml0ZShwdWQpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7CiYjNDM7CQlyZXR1cm4gLUVNTElOSzsKJiM0MzsKJiM0MzsJbnIgPSBtaW4oSFBBR0VfUFVEX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7CiAKLQlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7CiYjNDM7CXJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7CiAJaWYgKHJldCkKLQkJcGFnZSA9IEVSUl9QVFIocmV0KTsKLQllbHNlCi0JCSpwYWdlX21hc2sgPSBIUEFHRV9QVURfTlIgLSAxOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VzKQomIzQzOwkJcGFnZXNbMF0gPSBwYWdlOwogCi0JcmV0dXJuIHBhZ2U7CiYjNDM7CXJldHVybiBucjsKIH0KIAogLyogRk9MTF9GT1JDRSBjYW4gd3JpdGUgdG8gZXZlbiB1bndyaXRhYmxlIFBNRHMgaW4gQ09XIG1hcHBpbmdzLiAqLwpAQCAtNjk4LDE0ICYjNDM7NzIwLDE0IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3BtZChwbWRfdCBwbWQsIHN0cnVjdCBwYWdlICpwYWdlLAogCXJldHVybiAhdXNlcmZhdWx0ZmRfaHVnZV9wbWRfd3Aodm1hLCBwbWQpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCAqcG1kLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlwbWRfdCBwbWR2YWwgPSAqcG1kOwogCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwl1bnNpZ25lZCBsb25nIG9mZiwgbnI7CiAJaW50IHJldDsKIAogCWFzc2VydF9zcGluX2xvY2tlZChwbWRfbG9ja3B0cihtbSwgcG1kKSk7CkBAIC03MTMsNTAgJiM0Mzs3MzUsNTQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7CiAJaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7CiAJICAgICFjYW5fZm9sbG93X3dyaXRlX3BtZChwbWR2YWwsIHBhZ2UsIHZtYSwgZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKJiM0MzsJCXJldHVybiAwOwogCiAJLyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqLwogCWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9EVU1QKSAmYW1wOyZhbXA7IGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChwbWRfcHJvdG5vbmUoKnBtZCkgJmFtcDsmYW1wOyAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpCi0JCXJldHVybiBOVUxMOwomIzQzOwkJcmV0dXJuIDA7CiAKIAlpZiAoIXBtZF93cml0ZShwbWR2YWwpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7CiYjNDM7CQlyZXR1cm4gLUVNTElOSzsKIAogCVZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyAmYW1wOyBGT0xMX1BJTikgJmFtcDsmYW1wOyBQYWdlQW5vbihwYWdlKSAmYW1wOyZhbXA7CiAJCQkgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7CiAKLQlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7CiYjNDM7CW9mZiA9IFBGTl9ET1dOKGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKTsKJiM0MzsJbnIgPSBtaW4oSFBBR0VfUE1EX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7CiYjNDM7CiYjNDM7CXJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKJiM0MzsJCXJldHVybiByZXQ7CiAKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKIAlpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBGT0xMX1RPVUNIKSkKIAkJdG91Y2hfcG1kKHZtYSwgYWRkciwgcG1kLCBmbGFncyAmYW1wOyBGT0xMX1dSSVRFKTsKICNlbmRpZgkvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KIAotCXBhZ2UgJiM0Mzs9IChhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSykgJmd0OyZndDsgUEFHRV9TSElGVDsKLQkqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTsKJiM0MzsJcGFnZSAmIzQzOz0gb2ZmOwomIzQzOwomIzQzOwlpZiAocGFnZXMpCiYjNDM7CQlwYWdlc1swXSA9IHBhZ2U7CiAKLQlyZXR1cm4gcGFnZTsKJiM0MzsJcmV0dXJuIG5yOwogfQogCiAjZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCwKLQkJCQkgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7Ci0JcmV0dXJuIE5VTEw7CiYjNDM7CXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCAqcG1kLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLAomIzQzOwkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewotCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gMDsKIH0KICNlbmRpZgkvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi8KIApAQCAtNzk5LDExMCAmIzQzOzgyNSwyMDUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJcmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiYjNDM7LyoKJiM0MzsgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IHJ1biBldmVyeSBwZXItUFRFIHNhZmV0eSBjaGVjayAocHJlc2VudCwKJiM0MzsgKiB3cml0ZS1mYXVsdCwgZ3VwX211c3RfdW5zaGFyZSgpKSBvbiB0aGUgUFRFLCBzbyB0aGlzIG9ubHkgZG9lcyB0aGUKJiM0MzsgKiBwZXItZm9saW8gd29yazogdGhlIHJlZmNvdW50IGdyYWIsIHRoZSBGT0xMX1BJTiBhY2Nlc3NpYmlsaXR5IGZhdWx0LWluLAomIzQzOyAqIGRpcnR5L2FjY2Vzc2VkIG1hcmtpbmcsIGFuZCB0aGUgYXJyYXkgZmlsbCB3aXRoIHRoZSBjYWNoZSBmbHVzaC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGVfY29tbWl0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKJiM0MzsJCXB0ZV90IHB0ZSwgdW5zaWduZWQgbG9uZyBuciwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJc3RydWN0IHBhZ2UgKipwYWdlcykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwkvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqLwomIzQzOwlyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTsKJiM0MzsJaWYgKHVubGlrZWx5KHJldCkpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhZ2UgYWNjZXNzaWJsZSBpZiBhbmQgb25seSBpZiB3ZSBhcmUgZ29pbmcKJiM0MzsJICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlCiYjNDM7CSAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGZsYWdzICZhbXA7IEZPTExfUElOKSB7CiYjNDM7CQlyZXQgPSBhcmNoX21ha2VfZm9saW9fYWNjZXNzaWJsZShmb2xpbyk7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJZ3VwX3B1dF9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTsKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWlmIChmbGFncyAmYW1wOyBGT0xMX1RPVUNIKSB7CiYjNDM7CQlpZiAoKGZsYWdzICZhbXA7IEZPTExfV1JJVEUpICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhcHRlX2RpcnR5KHB0ZSkgJmFtcDsmYW1wOyAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQkvKgomIzQzOwkJICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlCiYjNDM7CQkgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2UKJiM0MzsJCSAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS4KJiM0MzsJCSAqLwomIzQzOwkJZm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZ3VwX2ZpbGxfcGFnZXModm1hLCBhZGRyZXNzLCBwYWdlLCBuciwgcGFnZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yCiYjNDM7ICogd2hlbiB0aGUgUFRFIGNhbm5vdCBiZSBmb2xsb3dlZCBidXQgdGhlIGNhbGxlciBtYXkgZmF1bHQgaXQgaW4sIGFuZCBhCiYjNDM7ICogbmVnYXRpdmUgZXJybm8gd2hlbiB0aGUgY2FsbGVyIG11c3QgcmVwb3J0IHRoZSBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19vbmVfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQlwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXApCiB7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwotCXN0cnVjdCBmb2xpbyAqZm9saW87CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3BpbmxvY2tfdCAqcHRsOwotCXB0ZV90ICpwdGVwLCBwdGU7Ci0JaW50IHJldDsKIAotCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsICZhbXA7cHRsKTsKLQlpZiAoIXB0ZXApCi0JCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwotCXB0ZSA9IHB0ZXBfZ2V0KHB0ZXApOwomIzQzOwkqcGFnZXAgPSBOVUxMOwomIzQzOwogCWlmICghcHRlX3ByZXNlbnQocHRlKSkKLQkJZ290byBub19wYWdlOwomIzQzOwkJcmV0dXJuIDA7CiAJaWYgKHB0ZV9wcm90bm9uZShwdGUpICZhbXA7JmFtcDsgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKQotCQlnb3RvIG5vX3BhZ2U7CiYjNDM7CQlyZXR1cm4gMDsKIAogCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZSk7CiAKIAkvKgogCSAqIFdlIG9ubHkgY2FyZSBhYm91dCBhbm9uIHBhZ2VzIGluIGNhbl9mb2xsb3dfd3JpdGVfcHRlKCkuCiAJICovCi0JaWYgKChmbGFncyAmYW1wOyBGT0xMX1dSSVRFKSAmYW1wOyZhbXA7Ci0JICAgICFjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGUsIHBhZ2UsIHZtYSwgZmxhZ3MpKSB7Ci0JCXBhZ2UgPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9CiYjNDM7CWlmICgoZmxhZ3MgJmFtcDsgRk9MTF9XUklURSkgJmFtcDsmYW1wOyAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSkKJiM0MzsJCXJldHVybiAwOwogCiAJaWYgKHVubGlrZWx5KCFwYWdlKSkgewogCQlpZiAoZmxhZ3MgJmFtcDsgRk9MTF9EVU1QKSB7CiAJCQkvKiBBdm9pZCBzcGVjaWFsIChsaWtlIHplcm8pIHBhZ2VzIGluIGNvcmUgZHVtcHMgKi8KLQkJCXBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkgewotCQkJcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBmb2xsb3dfcGZuX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIGZsYWdzKTsKLQkJCXBhZ2UgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKJiM0MzsJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQomIzQzOwkJaWYgKCFpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKQomIzQzOwkJCXJldHVybiBmb2xsb3dfcGZuX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIGZsYWdzKTsKJiM0MzsJCXBhZ2UgPSBwdGVfcGFnZShwdGUpOwogCX0KLQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiAKLQlpZiAoIXB0ZV93cml0ZShwdGUpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkgewotCQlwYWdlID0gRVJSX1BUUigtRU1MSU5LKTsKLQkJZ290byBvdXQ7Ci0JfQomIzQzOwlpZiAoIXB0ZV93cml0ZShwdGUpICZhbXA7JmFtcDsgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkKJiM0MzsJCXJldHVybiAtRU1MSU5LOwogCiAJVk1fV0FSTl9PTl9PTkNFX1BBR0UoKGZsYWdzICZhbXA7IEZPTExfUElOKSAmYW1wOyZhbXA7IFBhZ2VBbm9uKHBhZ2UpICZhbXA7JmFtcDsKIAkJCSAgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBwYWdlKTsKIAotCS8qIHRyeV9ncmFiX2ZvbGlvKCkgZG9lcyBub3RoaW5nIHVubGVzcyBGT0xMX0dFVCBvciBGT0xMX1BJTiBpcyBzZXQuICovCi0JcmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIDEsIGZsYWdzKTsKLQlpZiAodW5saWtlbHkocmV0KSkgewotCQlwYWdlID0gRVJSX1BUUihyZXQpOwotCQlnb3RvIG91dDsKLQl9CiYjNDM7CSpwYWdlcCA9IHBhZ2U7CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCS8qCi0JICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nCi0JICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlCi0JICogRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QgZm9yIGRldGFpbHMuCi0JICovCi0JaWYgKGZsYWdzICZhbXA7IEZPTExfUElOKSB7Ci0JCXJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTsKLQkJaWYgKHJldCkgewotCQkJdW5waW5fdXNlcl9wYWdlKHBhZ2UpOwotCQkJcGFnZSA9IEVSUl9QVFIocmV0KTsKLQkJCWdvdG8gb3V0OwomIzQzOy8qCiYjNDM7ICogUmV0dXJuIGhvdyBtYW55IFBURXMgbWFwIGNvbnNlY3V0aXZlIHBhZ2VzIG9mIHRoZSBzYW1lIGZvbGlvIGFuZCBjYW4gYmUKJiM0MzsgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuCiYjNDM7ICoKJiM0MzsgKiBUaGUgd3JpdGUtZmF1bHQgYW5kIHVuc2hhcmUgY2hlY2tzIGluIGZvbGxvd19vbmVfcHRlKCkgYXJlIHBlciBQVEUsIGJ1dCBhCiYjNDM7ICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seQomIzQzOyAqIHJ1biB1bmRlciBGT0xMX1dSSVRFIG9yIEZPTExfUElOIGRvZXMgbmVlZCB0aGUgcGVyLXBhZ2UgY2hlY2ssIHNvIGl0IHN0YXlzCiYjNDM7ICogb25lIHBhZ2UgYXQgYSB0aW1lLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCAqcHRlcCwgcHRlX3QgKmJhdGNoX3B0ZSwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBtYXg7CiYjNDM7CiYjNDM7CWlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgJmFtcDsmYW1wOyAoZmxhZ3MgJmFtcDsgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CW1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CWlmIChtYXggJmx0Oz0gMSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBNZXJnZSB5b3VuZy9kaXJ0eSBhY3Jvc3MgYmF0Y2ggc28gZm9saW9fbWFya19kaXJ0eSBzZWVzIGFueSBkaXJ0eS4gKi8KJiM0MzsJcmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBiYXRjaF9wdGUsIG1heCwKJiM0MzsJCQkJICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2FsayB0aGUgUFRFcyBmcm9tIHRoZSBzdGFydCBhZGRyZXNzIHRvIHRoZSBlbmQgb2YgdGhpcyBwYWdlIHRhYmxlIG9yIFZNQSwKJiM0MzsgKiB3aGljaGV2ZXIgY29tZXMgZmlyc3QsIGFuZCBjb21taXQgZXZlcnkgcGFnZSBmb3VuZC4KJiM0MzsgKgomIzQzOyAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0CiYjNDM7ICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLgomIzQzOyAqLwomIzQzO3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiYjNDM7CWJvb2wgbmVlZF9ub19wYWdlX3RhYmxlID0gZmFsc2U7CiYjNDM7CXB0ZV90ICpwdGVwLCAqb3JpZ19wdGVwOwomIzQzOwl1bnNpZ25lZCBsb25nIHdhbGtfZW5kOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yID0gMDsKJiM0MzsJc3BpbmxvY2tfdCAqcHRsOwomIzQzOwlsb25nIHJldCA9IDA7CiYjNDM7CiYjNDM7CW9yaWdfcHRlcCA9IHB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsICZhbXA7cHRsKTsKJiM0MzsJaWYgKCFwdGVwKQomIzQzOwkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiYjNDM7CiYjNDM7CXdhbGtfZW5kID0gbWluKHBtZF9hZGRyX2VuZChhZGRyZXNzLCBlbmQpLCB2bWEtJmd0O3ZtX2VuZCk7CiYjNDM7CiYjNDM7CWZvciAoOyBhZGRyZXNzICZsdDsgd2Fsa19lbmQ7IGFkZHJlc3MgJiM0Mzs9IFBBR0VfU0laRSwgcHRlcCYjNDM7JiM0MzspIHsKJiM0MzsJCXB0ZV90IHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApOwomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CiYjNDM7CQlyZXQgPSBmb2xsb3dfb25lX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIHB0ZSwgZmxhZ3MsICZhbXA7cGFnZSk7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7IHBhZ2UpIHsKJiM0MzsJCQlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKJiM0MzsJCQl1bnNpZ25lZCBsb25nIGJhdGNoOwomIzQzOwomIzQzOwkJCXB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTsKJiM0MzsKJiM0MzsJCQliYXRjaCA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCB3YWxrX2VuZCwgZm9saW8sCiYjNDM7CQkJCQkJIHB0ZXAsICZhbXA7YmF0Y2hfcHRlLCBmbGFncyk7CiYjNDM7CQkJcmV0ID0gZm9sbG93X3BhZ2VfcHRlX2NvbW1pdCh2bWEsIGFkZHJlc3MsIGZvbGlvLCBwYWdlLAomIzQzOwkJCQkJCSAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsCiYjNDM7CQkJCQkJICAgICBwYWdlcyA/IHBhZ2VzICYjNDM7IG5yIDogTlVMTCk7CiYjNDM7CQkJaWYgKCFyZXQpIHsKJiM0MzsJCQkJbnIgJiM0Mzs9IGJhdGNoOwomIzQzOwkJCQkvKgomIzQzOwkJCQkgKiBUaGUgbG9vcCYjMzk7cyBvd24gaW5jcmVtZW50IGNvdmVycyBvbmUgUFRFOyBza2lwCiYjNDM7CQkJCSAqIHRoZSByZXN0IG9mIHRoZSBiYXRjaC4KJiM0MzsJCQkJICovCiYjNDM7CQkJCXB0ZXAgJiM0Mzs9IGJhdGNoIC0gMTsKJiM0MzsJCQkJYWRkcmVzcyAmIzQzOz0gKGJhdGNoIC0gMSkgKiBQQUdFX1NJWkU7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KIAkJfQotCX0KLQlpZiAoZmxhZ3MgJmFtcDsgRk9MTF9UT1VDSCkgewotCQlpZiAoKGZsYWdzICZhbXA7IEZPTExfV1JJVEUpICZhbXA7JmFtcDsKLQkJICAgICFwdGVfZGlydHkocHRlKSAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSkKLQkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwomIzQzOwogCQkvKgotCQkgKiBwdGVfbWt5b3VuZygpIHdvdWxkIGJlIG1vcmUgY29ycmVjdCBoZXJlLCBidXQgYXRvbWljIGNhcmUKLQkJICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlCi0JCSAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS4KJiM0MzsJCSAqIG5vX3BhZ2VfdGFibGUoKSBtYXkgbG9vayB1cCB0aGUgcGFnZSBjYWNoZSwgc28gaXQgY2Fubm90IHJ1bgomIzQzOwkJICogdW5kZXIgdGhlIFBURSBsb2NrLgogCQkgKi8KLQkJZm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7IHB0ZV9ub25lKHB0ZSkpCiYjNDM7CQkJbmVlZF9ub19wYWdlX3RhYmxlID0gdHJ1ZTsKJiM0MzsJCWJyZWFrOwogCX0KLW91dDoKLQlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Ci0JcmV0dXJuIHBhZ2U7Ci1ub19wYWdlOgotCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsKLQlpZiAoIXB0ZV9ub25lKHB0ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwomIzQzOwlwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTsKJiM0MzsKJiM0MzsJaWYgKG5yKQomIzQzOwkJcmV0dXJuIG5yOwomIzQzOwlpZiAobmVlZF9ub19wYWdlX3RhYmxlKQomIzQzOwkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaykKJiM0MztzdGF0aWMgbG9uZyBmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwdWRfdCAqcHVkcCwKJiM0MzsJCXVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAlwbWRfdCAqcG1kLCBwbWR2YWw7CiAJc3BpbmxvY2tfdCAqcHRsOwotCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlsb25nIHJldDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07CiAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHJlc3MpOwpAQCAtOTEyLDcgJiM0MzsxMDMzLDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJaWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAlpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSkKLQkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCiAJaWYgKHBtZF9wcm90bm9uZShwbWR2YWwpICZhbXA7JmFtcDsgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKQEAgLTkyNSwyOCAmIzQzOzEwNDYsMzUgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJfQogCWlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKLQkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCX0KIAlpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBGT0xMX1NQTElUX1BNRCkpIHsKIAkJc3Bpbl91bmxvY2socHRsKTsKIAkJc3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpOwogCQkvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovCi0JCXJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDoKLQkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpOwomIzQzOwkJcmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IC1FTk9NRU0gOgomIzQzOwkJCWZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpOwogCX0KLQlwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0ID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7CiAJc3Bpbl91bmxvY2socHRsKTsKLQlyZXR1cm4gcGFnZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsIHRoZQomIzQzOwkgKiBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIHBtZCBsb2NrLgomIzQzOwkgKi8KJiM0MzsJaWYgKHJldCAmZ3Q7IDAgJmFtcDsmYW1wOyBwYWdlcykKJiM0MzsJCWd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwNGRfdCAqcDRkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcDRkX3QgKnA0ZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcHVkX3QgKnB1ZHAsIHB1ZDsKIAlzcGlubG9ja190ICpwdGw7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWxvbmcgcmV0OwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAogCXB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpOwpAQCAtOTU1LDIyICYjNDM7MTA4MywyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJcmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7CiAJaWYgKHB1ZF9sZWFmKHB1ZCkpIHsKIAkJcHRsID0gcHVkX2xvY2sobW0sIHB1ZHApOwotCQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CQlyZXQgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBwYWdlcyk7CiAJCXNwaW5fdW5sb2NrKHB0bCk7Ci0JCWlmIChwYWdlKQotCQkJcmV0dXJuIHBhZ2U7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsCiYjNDM7CQkgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW8KJiM0MzsJCSAqIGNhbiBiZSB1cCB0byBIUEFHRV9QVURfTlIgcGFnZXMsIHRvbyBsb25nIHRvIGZsdXNoIHVuZGVyIGEKJiM0MzsJCSAqIHNwaW5sb2NrLgomIzQzOwkJICovCiYjNDM7CQlpZiAocmV0ICZndDsgMCAmYW1wOyZhbXA7IHBhZ2VzKQomIzQzOwkJCWd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAl9CiAJaWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpCiAJCXJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwogCi0JcmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spOwomIzQzOwlyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcGdkX3QgKnBnZHAsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcDRkX3QgKnA0ZHAsIHA0ZDsKIApAQCAtOTgxLDE1ICYjNDM7MTExNiwxOCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKQogCQlyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAotCXJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTsKJiM0MzsJcmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIHBhZ2VzKTsKIH0KIAogLyoqCi0gKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3MKJiM0MzsgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBwYWdlcyBhdCBhIHVzZXItdmlydHVhbCBhZGRyZXNzCiAgKiBAdm1hOiB2bV9hcmVhX3N0cnVjdCBtYXBwaW5nIEBhZGRyZXNzCiAgKiBAYWRkcmVzczogdmlydHVhbCBhZGRyZXNzIHRvIGxvb2sgdXAKJiM0MzsgKiBAZW5kOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RvcCBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzCiAgKiBAZmxhZ3M6IGZsYWdzIG1vZGlmeWluZyBsb29rdXAgYmVoYXZpb3VyCi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFzawomIzQzOyAqIEBwYWdlczogYXJyYXkgdG8gcmVjZWl2ZSB0aGUgcGFnZXMsIHJlZmNvdW50ZWQgcGVyIEBmbGFncywgb3IgTlVMTCB0bwomIzQzOyAqICAgICAgICAgd2FsayB0aGUgcGFnZSB0YWJsZXMgKGUuZy4gdG8gZmF1bHQgcGFnZXMgaW4pIHdpdGhvdXQgY29sbGVjdGluZwomIzQzOyAqICAgICAgICAgb3IgcmVmY291bnRpbmcgdGhlbQogICoKICAqIEBmbGFncyBjYW4gaGF2ZSBGT0xMXyBmbGFncyBzZXQsIGRlZmluZWQgaW4gJmx0O2xpbnV4L21tLmgmZ3Q7CiAgKgpAQCAtOTk4LDMzICYjNDM7MTEzNiwzMiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seQogICogcmVsZXZhbnQgd2l0aCBGT0xMX1BJTiBhbmQgIUZPTExfV1JJVEUuCiAgKgotICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuCi0gKgotICogUmV0dXJuOiB0aGUgbWFwcGVkIChzdHJ1Y3QgcGFnZSAqKSwgJU5VTEwgaWYgbm8gbWFwcGluZyBleGlzdHMsIG9yCi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkCi0gKiBieSBhIHBhZ2UgZGVzY3JpcHRvciAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuCiYjNDM7ICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgc3RhcnRpbmcgYXQgQGFkZHJlc3MgdGhhdCB3ZXJlCiYjNDM7ICogcGxhY2VkIGludG8gQHBhZ2VzIChpZiBub24tTlVMTCksIHdoaWNoIG1heSBiZSBmZXdlciB0aGFuIHRoZSBwYWdlcwomIzQzOyAqIHJlcXVlc3RlZCB2aWEgQGVuZDsgMCBpZiBubyBtYXBwaW5nIGV4aXN0cyBhdCBAYWRkcmVzczsgb3IgYSBuZWdhdGl2ZQomIzQzOyAqIGVycm5vIGZvciBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZCBieSBhIHBhZ2UgZGVzY3JpcHRvcgomIzQzOyAqIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS4KICAqLwotc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spCiYjNDM7c3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CiAJcGdkX3QgKnBnZDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0mZ3Q7dm1fbW07Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWxvbmcgcmV0OwogCiAJdm1hX3BndGFibGVfd2Fsa19iZWdpbih2bWEpOwogCi0JKnBhZ2VfbWFzayA9IDA7CiAJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7CiAKIAlpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpCi0JCXBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpOwomIzQzOwkJcmV0ID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTsKIAllbHNlCi0JCXBhZ2UgPSBmb2xsb3dfcDRkX21hc2sodm1hLCBhZGRyZXNzLCBwZ2QsIGZsYWdzLCBwYWdlX21hc2spOwomIzQzOwkJcmV0ID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwZ2QsIGZsYWdzLCBwYWdlcyk7CiAKIAl2bWFfcGd0YWJsZV93YWxrX2VuZCh2bWEpOwogCi0JcmV0dXJuIHBhZ2U7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2dhdGVfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLApAQCAtMTM1OCw3ICYjNDM7MTQ5NSw2IEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiB7CiAJbG9uZyByZXQgPSAwLCBpID0gMDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwOwogCiAJaWYgKCFucl9wYWdlcykKIAkJcmV0dXJuIDA7CkBAIC0xMzczLDcgJiM0MzsxNTA5LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogCWRvIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIGludCBwYWdlX2luY3JlbTsKJiM0MzsJCWxvbmcgbnI7CiAKIAkJLyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqLwogCQlpZiAoIXZtYSB8fCBzdGFydCAmZ3Q7PSB2bWEtJmd0O3ZtX2VuZCkgewpAQCAtMTQwMCw4ICYjNDM7MTUzNiwxMiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQkJcGFnZXMgPyAmYW1wO3BhZ2UgOiBOVUxMKTsKIAkJCQlpZiAocmV0KQogCQkJCQlnb3RvIG91dDsKLQkJCQlwYWdlX21hc2sgPSAwOwotCQkJCWdvdG8gbmV4dF9wYWdlOwomIzQzOwkJCQlndXBfZmlsbF9wYWdlcyh2bWEsIHN0YXJ0LCBwYWdlLCAxLAomIzQzOwkJCQkJICAgICAgIHBhZ2VzID8gcGFnZXMgJiM0MzsgaSA6IE5VTEwpOwomIzQzOwkJCQlpJiM0MzsmIzQzOzsKJiM0MzsJCQkJc3RhcnQgJiM0Mzs9IFBBR0VfU0laRTsKJiM0MzsJCQkJbnJfcGFnZXMtLTsKJiM0MzsJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCWlmICghdm1hKSB7CkBAIC0xNDIzLDEwICYjNDM7MTU2MywxMSBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQl9CiAJCWNvbmRfcmVzY2hlZCgpOwogCi0JCXBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgJmFtcDtwYWdlX21hc2spOwotCQlpZiAoIXBhZ2UgfHwgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LKSB7CiYjNDM7CQluciA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsCiYjNDM7CQkJCSAgICAgIGd1cF9mbGFncywgcGFnZXMgPyAmYW1wO3BhZ2VzW2ldIDogTlVMTCk7CiYjNDM7CQlpZiAoIW5yIHx8IG5yID09IC1FTUxJTkspIHsKIAkJCXJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsCi0JCQkJCSAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTsKJiM0MzsJCQkJCSAgIG5yID09IC1FTUxJTkssIGxvY2tlZCk7CiAJCQlzd2l0Y2ggKHJldCkgewogCQkJY2FzZSAwOgogCQkJCWdvdG8gcmV0cnk7CkBAIC0xNDQwLDcwICYjNDM7MTU4MSwzMCBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJQlVHKCk7Ci0JCX0gZWxzZSBpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUVYSVNUKSB7CiYjNDM7CQl9IGVsc2UgaWYgKG5yID09IC1FRVhJU1QpIHsKIAkJCS8qCiAJCQkgKiBQcm9wZXIgcGFnZSB0YWJsZSBlbnRyeSBleGlzdHMsIGJ1dCBubyBjb3JyZXNwb25kaW5nCiAJCQkgKiBzdHJ1Y3QgcGFnZS4gSWYgdGhlIGNhbGxlciBleHBlY3RzICoqcGFnZXMgdG8gYmUKIAkJCSAqIGZpbGxlZCBpbiwgYmFpbCBvdXQgbm93LCBiZWNhdXNlIHRoYXQgY2FuJiMzOTt0IGJlIGRvbmUKLQkJCSAqIGZvciB0aGlzIHBhZ2UuCiYjNDM7CQkJICogZm9yIHRoaXMgcGFnZS4gT3RoZXJ3aXNlIGFkdmFuY2UgYnkgdGhlIG9uZSBwYWdlCiYjNDM7CQkJICogZm9sbG93X3BhZ2VfbWFzaygpIGxvb2tlZCBhdC4KIAkJCSAqLwogCQkJaWYgKHBhZ2VzKSB7Ci0JCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKJiM0MzsJCQkJcmV0ID0gbnI7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoSVNfRVJSKHBhZ2UpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwomIzQzOwkJCW5yID0gMTsKJiM0MzsJCX0gZWxzZSBpZiAobnIgJmx0OyAwKSB7CiYjNDM7CQkJcmV0ID0gbnI7CiAJCQlnb3RvIG91dDsKIAkJfQotbmV4dF9wYWdlOgotCQlwYWdlX2luY3JlbSA9IDEgJiM0MzsgKH4oc3RhcnQgJmd0OyZndDsgUEFHRV9TSElGVCkgJmFtcDsgcGFnZV9tYXNrKTsKLQkJaWYgKHBhZ2VfaW5jcmVtICZndDsgbnJfcGFnZXMpCi0JCQlwYWdlX2luY3JlbSA9IG5yX3BhZ2VzOwotCi0JCWlmIChwYWdlcykgewotCQkJc3RydWN0IHBhZ2UgKnN1YnBhZ2U7Ci0JCQl1bnNpZ25lZCBpbnQgajsKIAotCQkJLyoKLQkJCSAqIFRoaXMgbXVzdCBiZSBhIGxhcmdlIGZvbGlvIChhbmQgZG9lc24mIzM5O3QgbmVlZCB0bwotCQkJICogYmUgdGhlIHdob2xlIGZvbGlvOyBpdCBjYW4gYmUgcGFydCBvZiBpdCksIGRvCi0JCQkgKiB0aGUgcmVmY291bnQgd29yayBmb3IgYWxsIHRoZSBzdWJwYWdlcyB0b28uCi0JCQkgKgotCQkJICogTk9URTogaGVyZSB0aGUgcGFnZSBtYXkgbm90IGJlIHRoZSBoZWFkIHBhZ2UKLQkJCSAqIGUuZy4gd2hlbiBzdGFydCBhZGRyIGlzIG5vdCB0aHAtc2l6ZSBhbGlnbmVkLgotCQkJICogdHJ5X2dyYWJfZm9saW8oKSBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRhaWwKLQkJCSAqIHBhZ2VzLgotCQkJICovCi0JCQlpZiAocGFnZV9pbmNyZW0gJmd0OyAxKSB7Ci0JCQkJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0KLQkJCQkvKgotCQkJCSAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGUKLQkJCQkgKiBsYXJnZSBmb2xpbywgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbC4KLQkJCQkgKi8KLQkJCQlpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSwKLQkJCQkJCSAgIGd1cF9mbGFncykpIHsKLQkJCQkJLyoKLQkJCQkJICogUmVsZWFzZSB0aGUgMXN0IHBhZ2UgcmVmIGlmIHRoZQotCQkJCQkgKiBmb2xpbyBpcyBwcm9ibGVtYXRpYywgZmFpbCBoYXJkLgotCQkJCQkgKi8KLQkJCQkJZ3VwX3B1dF9mb2xpbyhmb2xpbywgMSwgZ3VwX2ZsYWdzKTsKLQkJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKGogPSAwOyBqICZsdDsgcGFnZV9pbmNyZW07IGomIzQzOyYjNDM7KSB7Ci0JCQkJc3VicGFnZSA9IHBhZ2UgJiM0MzsgajsKLQkJCQlwYWdlc1tpICYjNDM7IGpdID0gc3VicGFnZTsKLQkJCQlmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBzdGFydCAmIzQzOyBqICogUEFHRV9TSVpFKTsKLQkJCQlmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTsKLQkJCX0KLQkJfQomIzQzOwkJLyogQ2hlY2sgdGhhdCB3ZSBkaWRuJiMzOTt0IHBpbiBtb3JlIHBhZ2VzIHRoYW4gdGhlIGNhbGxlciB3aWxsIGZyZWUuICovCiYjNDM7CQlWTV9XQVJOX09OX09OQ0UobnIgJmd0OyBucl9wYWdlcyk7CiAKLQkJaSAmIzQzOz0gcGFnZV9pbmNyZW07Ci0JCXN0YXJ0ICYjNDM7PSBwYWdlX2luY3JlbSAqIFBBR0VfU0laRTsKLQkJbnJfcGFnZXMgLT0gcGFnZV9pbmNyZW07CiYjNDM7CQlpICYjNDM7PSBucjsKJiM0MzsJCXN0YXJ0ICYjNDM7PSBuciAqIFBBR0VfU0laRTsKJiM0MzsJCW5yX3BhZ2VzIC09IG5yOwogCX0gd2hpbGUgKG5yX3BhZ2VzKTsKIG91dDoKIAlyZXR1cm4gaSA/IGkgOiByZXQ7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4NgoJCQkJCQkJb3V0cHV0OiAxNTUKCQkJCQkJCXRob3VnaHRzOiAyMTYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQgb2YgR1VQIEJhdGNoaW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgZGl2aW5nIGludG8gYG1tL2d1cC5jYCwgdGhlIGhlYXJ0IG9mIEdldCBVc2VyIFBhZ2VzLCBhbmQgaXQmIzM5O3MgYWxsIGFib3V0IG9wdGltaXppbmcgaG93IHdlIHdhbGsgYW5kIGJhdGNoIHBhZ2UgdGFibGVzLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIHJlZmFjdG9yaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhhdCBwYWdlIHRhYmxlIHdhbGtpbmcgYW5kIGJhdGNoaW5nOiBgZm9sbG93X3BhZ2VfbWFza2AsIGBmb2xsb3dfaHVnZV9wdWRgLCBgZm9sbG93X2h1Z2VfcG1kYCwgYW5kIGBmb2xsb3dfcGFnZV9wdGVgLiBJdCYjMzk7cyBpbnRyb2R1Y2luZyBuZXcgZnVuY3Rpb25zIGxpa2UgYGZvbGxvd19wYWdlX3B0ZV9jb21taXRgLCBgZm9sbG93X29uZV9wdGVgLCBhbmQgYGZvbGxvd19wdGVfYmF0Y2hgIHRvIGhhbmRsZSBQVEUgcHJvY2Vzc2luZyBpbiBiYXRjaGVzLiBUaGUgcmV0dXJuIHR5cGVzIGFyZSBhbHNvIGNoYW5nZWQgZnJvbSBgc3RydWN0IHBhZ2UgKmAgdG8gYGxvbmdgIHRvIHJlZmxlY3QgZWl0aGVyIHRoZSBudW1iZXIgb2YgcGFnZXMgcHJvY2Vzc2VkIG9yIGFuIGVycm9yIGNvZGUuIGBfX2dldF91c2VyX3BhZ2VzYCBpcyB1cGRhdGVkIHRvIHV0aWxpemUgdGhlIG5ldyBiYXRjaGVkIGFwcHJvYWNoLgoKVGhlIGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeS4gQXJlIHdlIGNyZWF0aW5nIGFueSByaXNrcyBoZXJlPyBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBtYWlubHkgYWJvdXQgdGhlIG1lY2hhbmljcyBvZiAqcGlubmluZyogcGFnZXMgYW5kIHBvdGVudGlhbGx5IHJlZmNvdW50aW5nIHRoZW0gYW5kIGRvZXMgbm90IHNlbmQgYW55IG5ldyBzdHJ1Y3R1cmVzIHRvIHRoZSB1c2VyLiBUaGVyZSYjMzk7cyBubyBmYW5jeSBuZXcgZGF0YSBiZWluZyBhbGxvY2F0ZWQsIGZpbGxlZCwgYW5kIHRoZW4gaGFuZGVkIG92ZXIgdG8gdXNlciBzcGFjZSB3aGVyZSB1bmluaXRpYWxpemVkIHZhbHVlcyBtaWdodCBsZWFrLiBJIGFsc28gZG9uJiMzOTt0IHNlZSBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCAqZGVwZW5kcyogb24gdGhlIHZhbHVlIG9mIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGluIGFueSBuZXcgY29kZSBvciBicmFuY2hlcy4KCkhvd2V2ZXIsIEdVUCBpdHNlbGYgaXMgaW50ZXJlc3RpbmcuIEdVUCAqZG9lcyogcGluIHVzZXIgcGFnZXMuIElmIHRoZXJlIGlzIGEgYnVnLCBpbmNvcnJlY3QgcGlubmluZyAqY291bGQqIGxlYWQgdG8gY29ycnVwdGlvbiwgdXNlLWFmdGVyLWZyZWUsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiBUaG9zZSBjYW4gYWxsIGJlIGNhdWdodCBieSBLQVNBTi4gV2UgYXJlIGxvb2tpbmcgZm9yIHNvbWV0aGluZyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoICpiZXR0ZXIqIHRoYW4gS0FTQU4uIEl0JiMzOTtzIGEgY29yZSBNTSBtZWNoYW5pc20sIHNvIGJ1Z3MgaGVyZSBhcmUgbW9yZSBsaWtlbHkgdG8gY3Jhc2gsIHBhZ2UgZmF1bHQsIG9yIGNhdXNlIGRhdGEgY29ycnVwdGlvbi4gTm93LCBLTVNBTiBkZXRlY3RzIHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSwgcmlnaHQ/IExldCYjMzk7cyBjb25zaWRlci4KClRoZSBgcGFnZXNgIGFycmF5IHBhc3NlZCB0byBgZm9sbG93X3BhZ2VfbWFza2AgaXMgd2hlcmUgdGhlIHJldHVybmVkIHBhZ2VzIGVuZCB1cC4gSXQgZ2V0cyBmaWxsZWQgYnkgYGd1cF9maWxsX3BhZ2VzYC4gVGhlIHJpc2sgaXMgKmlmKiBgZ3VwX2ZpbGxfcGFnZXNgIGZhaWxzIHRvIGZpbGwgdGhlIHdob2xlIGFycmF5IGJ1dCByZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIChzdWNjZXNzKSwgdGhhdCB3b3VsZCBtZWFuIHRoYXQgdGhlIGNhbGxlciB3b3VsZCBoYXZlIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkuIExldCYjMzk7cyBsb29rIGF0IGBndXBfZmlsbF9wYWdlc2A6CgpgYGBjCiYjNDM7c3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlpZiAoIXBhZ2VzKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzdHJ1Y3QgcGFnZSAqc3VicGFnZSA9IHBhZ2UgJiM0MzsgaTsKJiM0MzsKJiM0MzsJCXBhZ2VzW2ldID0gc3VicGFnZTsKJiM0MzsJCWZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIGFkZHJlc3MgJiM0MzsgaSAqIFBBR0VfU0laRSk7CiYjNDM7CQlmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTsKJiM0MzsJfQomIzQzO30KYGBgCgpJdCBmaWxscyBgcGFnZXNbMF1gIHRocm91Z2ggYHBhZ2VzW25yIC0gMV1gLiBJZiBgZm9sbG93X3BhZ2VfbWFza2AgcmV0dXJucyBgbnJgLCBpdCAqc2hvdWxkKiBtZWFuIGBucmAgcGFnZXMgaGF2ZSBiZWVuIGZpbGxlZC4gSW4gYF9fZ2V0X3VzZXJfcGFnZXNgLCB3ZSYjMzk7cmUgaXRlcmF0aW5nIGFuZCBpbmNyZW1lbnRpbmcgdGhlIGFycmF5LCBgaSAmIzQzOz0gbnJgLiBUaGUgY2FsbGVyIGFsbG9jYXRlcyBgcGFnZXNgIGFuZCBleHBlY3RzIGBwYWdlc1swXWAgdGhyb3VnaCBgcGFnZXNbaS0xXWAgdG8gYmUgaW5pdGlhbGl6ZWQuIEJ1dCBpcyB0aGVyZSBhIHNjZW5hcmlvIHdoZXJlIGBmb2xsb3dfcGFnZV9tYXNrYCByZXR1cm5zIGBuciAmZ3Q7IDBgIGJ1dCBkb2VzbiYjMzk7dCBmaWxsIHRoZSBlbnRpcmUgYXJyYXk/CgpIZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIGBmb2xsb3dfaHVnZV9wdWRgOgoKYGBgYwomIzQzOwlpZiAocGFnZXMpCiYjNDM7CQlwYWdlc1swXSA9IHBhZ2U7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKYGBgCgpJdCBvbmx5IHNldHMgYHBhZ2VzWzBdID0gcGFnZWAhIFdoYXQgaWYgYG5yICZndDsgMWA/IEFuZCB0aGUgY2FsbHNpdGUgaXMgaW4gYGZvbGxvd19wdWRfbWFza2A6CgpgYGBjCiAJaWYgKHB1ZF9sZWFmKHB1ZCkpIHsKIAkJcHRsID0gcHVkX2xvY2sobW0sIHB1ZHApOwotCQlwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7CiYjNDM7CQlyZXQgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBlbmQsIHB1ZHAsIGZsYWdzLCBwYWdlcyk7CiAJCXNwaW5fdW5sb2NrKHB0bCk7Ci0JCWlmIChwYWdlKQotCQkJcmV0dXJuIHBhZ2U7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsCiYjNDM7CQkgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW8KJiM0MzsJCSAqIGNhbiBiZQoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE2OjU3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBHZXQgVXNlciBQYWdlcyAoR1VQKSB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtpbmcgYW5kIHJlZmNvdW50aW5nLiBJdCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzIGJ1dCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG9lcyBpdCBoYW5kbGUgY29tcGxleCBwYXJzaW5nIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGNvdWxkIGJlIGxlYWtlZC4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHJldHVybmluZyBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIHByb2Nlc3NlZCBwYWdlcywgbGVhZGluZyB0byB1bmluaXRpYWxpemVkIHBvaW50ZXJzIGluIHRoZSBgcGFnZXNgIGFycmF5KSB3b3VsZCByZXN1bHQgaW4gd2lsZCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgb3IgcGFnZSByZWZlcmVuY2UgaW1iYWxhbmNlcy4gVGhlc2UgdHlwZXMgb2YgZXJyb3JzIGFyZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgdG9vbHMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIEdldCBVc2VyIFBhZ2VzIChHVVApIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa2luZyBhbmQgcmVmY291bnRpbmcuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMgYnV0IGRvZXMgbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGhhbmRsZSBjb21wbGV4IHBhcnNpbmcgd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgY291bGQgYmUgbGVha2VkLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGluY29ycmVjdCBudW1iZXIgb2YgcHJvY2Vzc2VkIHBhZ2VzLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkpIHdvdWxkIHJlc3VsdCBpbiB3aWxkIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBwYWdlIHJlZmVyZW5jZSBpbWJhbGFuY2VzLiBUaGVzZSB0eXBlcyBvZiBlcnJvcnMgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU1OjEyLjc0NzIyOTQ0NFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExOTAxNzc5MjIxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiSFVHRVRMQkZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZXNcIixcbiAgICBcImdldF91c2VyX3BhZ2VzX3JlbW90ZVwiLFxuICAgIFwiZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc19yZW1vdGVcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzX3VubG9ja2VkXCIsXG4gICAgXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgICBcInBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MTIuNzQ3MjM1MTI0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNjc2ODE3MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2N2U2NzZlOGIwMzhlMDFjY2RjNjI3ODU3NjkzNmQ2MGQ5YjdhYjg0XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmNcXG5pbmRleCAwNjkyMTE5Yjc5MDQzLi4xMDY4MDY2MzRiM2M0IDEwMDY0NFxcbi0tLSBhL21tL2d1cC5jXFxuKysrIGIvbW0vZ3VwLmNcXG5AQCAtNjA4LDE1ICs2MDgsMTUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRyZXR1cm4gcGFnZSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbihwYWdlKSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzKVxcbitzdGF0aWMgbG9uZyBub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcXG4ge1xcbiBcXHRpZiAoIShmbGFncyBcXHUwMDI2IEZPTExfRFVNUCkpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFdoZW4gY29yZSBkdW1waW5nLCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHVubmVjZXNzYXJ5IHBhZ2VzIG9yXFxuLVxcdCAqIHBhZ2UgdGFibGVzLiAgUmV0dXJuIGVycm9yIGluc3RlYWQgb2YgTlVMTCB0byBza2lwIGhhbmRsZV9tbV9mYXVsdCxcXG4rXFx0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiAwIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxcbiBcXHQgKiB0aGVuIGdldF9kdW1wX3BhZ2UoKSB3aWxsIHJldHVybiBOVUxMIHRvIGxlYXZlIGEgaG9sZSBpbiB0aGUgZHVtcC5cXG4gXFx0ICogQnV0IHdlIGNhbiBvbmx5IG1ha2UgdGhpcyBvcHRpbWl6YXRpb24gd2hlcmUgYSBob2xlIHdvdWxkIHN1cmVseVxcbiBcXHQgKiBiZSB6ZXJvLWZpbGxlZCBpZiBoYW5kbGVfbW1fZmF1bHQoKSBhY3R1YWxseSBkaWQgaGFuZGxlIGl0LlxcbkBAIC02MjUsMTIgKzYyNSwyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKm5vX3BhZ2VfdGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7XFxuIFxcbiBcXHRcXHRpZiAoIWh1Z2V0bGJmc19wYWdlY2FjaGVfcHJlc2VudChoLCB2bWEsIGFkZHJlc3MpKVxcbi1cXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdH0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWZhdWx0KSkge1xcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdH1cXG4gXFxuLVxcdHJldHVybiBOVUxMO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnIsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXG4rXFx0aWYgKCFwYWdlcylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspIHtcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICsgaTtcXG4rXFxuK1xcdFxcdHBhZ2VzW2ldID0gc3VicGFnZTtcXG4rXFx0XFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgYWRkcmVzcyArIGkgKiBQQUdFX1NJWkUpO1xcbitcXHRcXHRmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTtcXG4rXFx0fVxcbiB9XFxuIFxcbiAjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxuQEAgLTY0NiwzOCArNjYzLDQzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRyZXR1cm4gY2FuX2ZvbGxvd193cml0ZV9jb21tb24ocGFnZSwgdm1hLCBmbGFncyk7XFxuIH1cXG4gXFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcXG4tXFx0XFx0XFx0XFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gXFx0cHVkX3QgcHVkID0gKnB1ZHA7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcGZuID0gcHVkX3BmbihwdWQpO1xcbitcXHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XFxuIFxcdGludCByZXQ7XFxuIFxcbiBcXHRhc3NlcnRfc3Bpbl9sb2NrZWQocHVkX2xvY2twdHIobW0sIHB1ZHApKTtcXG4gXFxuIFxcdGlmICghcHVkX3ByZXNlbnQocHVkKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0aWYgKChmbGFncyBcXHUwMDI2IEZPTExfV1JJVEUpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkLCBwZm5fdG9fcGFnZShwZm4pLCB2bWEsIGZsYWdzKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0cGZuICs9IChhZGRyIFxcdTAwMjYgflBVRF9NQVNLKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHRvZmYgPSBQRk5fRE9XTihhZGRyIFxcdTAwMjYgflBVRF9NQVNLKTtcXG4rXFx0cGZuICs9IG9mZjtcXG4gXFx0cGFnZSA9IHBmbl90b19wYWdlKHBmbik7XFxuIFxcbiBcXHRpZiAoIXB1ZF93cml0ZShwdWQpIFxcdTAwMjZcXHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xcbitcXHRcXHRyZXR1cm4gLUVNTElOSztcXG4rXFxuK1xcdG5yID0gbWluKEhQQUdFX1BVRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpO1xcbiBcXG4tXFx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xcbitcXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpO1xcbiBcXHRpZiAocmV0KVxcbi1cXHRcXHRwYWdlID0gRVJSX1BUUihyZXQpO1xcbi1cXHRlbHNlXFxuLVxcdFxcdCpwYWdlX21hc2sgPSBIUEFHRV9QVURfTlIgLSAxO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0aWYgKHBhZ2VzKVxcbitcXHRcXHRwYWdlc1swXSA9IHBhZ2U7XFxuIFxcbi1cXHRyZXR1cm4gcGFnZTtcXG4rXFx0cmV0dXJuIG5yO1xcbiB9XFxuIFxcbiAvKiBGT0xMX0ZPUkNFIGNhbiB3cml0ZSB0byBldmVuIHVud3JpdGFibGUgUE1EcyBpbiBDT1cgbWFwcGluZ3MuICovXFxuQEAgLTY5OCwxNCArNzIwLDE0IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3BtZChwbWRfdCBwbWQsIHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRyZXR1cm4gIXVzZXJmYXVsdGZkX2h1Z2VfcG1kX3dwKHZtYSwgcG1kKTtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcXG4rXFx0XFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxcbiB7XFxuIFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4gXFx0cG1kX3QgcG1kdmFsID0gKnBtZDtcXG4gXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb2ZmLCBucjtcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdGFzc2VydF9zcGluX2xvY2tlZChwbWRfbG9ja3B0cihtbSwgcG1kKSk7XFxuQEAgLTcxMyw1MCArNzM1LDU0IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRwYWdlID0gcG1kX3BhZ2UocG1kdmFsKTtcXG4gXFx0aWYgKChmbGFncyBcXHUwMDI2IEZPTExfV1JJVEUpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kdmFsLCBwYWdlLCB2bWEsIGZsYWdzKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0LyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqL1xcbiBcXHRpZiAoKGZsYWdzIFxcdTAwMjYgRk9MTF9EVU1QKSBcXHUwMDI2XFx1MDAyNiBpc19odWdlX3plcm9fcG1kKHBtZHZhbCkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xcbitcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFxuIFxcdGlmIChwbWRfcHJvdG5vbmUoKnBtZCkgXFx1MDAyNlxcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuIFxcbiBcXHRpZiAoIXBtZF93cml0ZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xcbitcXHRcXHRyZXR1cm4gLUVNTElOSztcXG4gXFxuIFxcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcXHUwMDI2IEZPTExfUElOKSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbihwYWdlKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XFxuIFxcbi1cXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XFxuK1xcdG9mZiA9IFBGTl9ET1dOKGFkZHIgXFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xcbitcXHRuciA9IG1pbihIUEFHRV9QTURfTlIgLSBvZmYsIFBGTl9ET1dOKGVuZCAtIGFkZHIpKTtcXG4rXFxuK1xcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKHJldCk7XFxuK1xcdFxcdHJldHVybiByZXQ7XFxuIFxcbiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXFxuIFxcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IChmbGFncyBcXHUwMDI2IEZPTExfVE9VQ0gpKVxcbiBcXHRcXHR0b3VjaF9wbWQodm1hLCBhZGRyLCBwbWQsIGZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSk7XFxuICNlbmRpZlxcdC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqL1xcbiBcXG4tXFx0cGFnZSArPSAoYWRkciBcXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4tXFx0KnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7XFxuK1xcdHBhZ2UgKz0gb2ZmO1xcbitcXG4rXFx0aWYgKHBhZ2VzKVxcbitcXHRcXHRwYWdlc1swXSA9IHBhZ2U7XFxuIFxcbi1cXHRyZXR1cm4gcGFnZTtcXG4rXFx0cmV0dXJuIG5yO1xcbiB9XFxuIFxcbiAjZWxzZSAgLyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcXG4tXFx0XFx0XFx0XFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4tXFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcXG4rc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4tXFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuICNlbmRpZlxcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xcbiBcXG5AQCAtNzk5LDExMCArODI1LDIwNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4gXFx0cmV0dXJuICF1c2VyZmF1bHRmZF9wdGVfd3Aodm1hLCBwdGUpO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuKy8qXFxuKyAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgcnVuIGV2ZXJ5IHBlci1QVEUgc2FmZXR5IGNoZWNrIChwcmVzZW50LFxcbisgKiB3cml0ZS1mYXVsdCwgZ3VwX211c3RfdW5zaGFyZSgpKSBvbiB0aGUgUFRFLCBzbyB0aGlzIG9ubHkgZG9lcyB0aGVcXG4rICogcGVyLWZvbGlvIHdvcms6IHRoZSByZWZjb3VudCBncmFiLCB0aGUgRk9MTF9QSU4gYWNjZXNzaWJpbGl0eSBmYXVsdC1pbixcXG4rICogZGlydHkvYWNjZXNzZWQgbWFya2luZywgYW5kIHRoZSBhcnJheSBmaWxsIHdpdGggdGhlIGNhY2hlIGZsdXNoLlxcbisgKi9cXG4rc3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfcHRlX2NvbW1pdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4rXFx0XFx0cHRlX3QgcHRlLCB1bnNpZ25lZCBsb25nIG5yLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuK1xcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuK3tcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHQvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqL1xcbitcXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTtcXG4rXFx0aWYgKHVubGlrZWx5KHJldCkpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhZ2UgYWNjZXNzaWJsZSBpZiBhbmQgb25seSBpZiB3ZSBhcmUgZ29pbmdcXG4rXFx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXFxuK1xcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGZsYWdzIFxcdTAwMjYgRk9MTF9QSU4pIHtcXG4rXFx0XFx0cmV0ID0gYXJjaF9tYWtlX2ZvbGlvX2FjY2Vzc2libGUoZm9saW8pO1xcbitcXHRcXHRpZiAocmV0KSB7XFxuK1xcdFxcdFxcdGd1cF9wdXRfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1RPVUNIKSB7XFxuK1xcdFxcdGlmICgoZmxhZ3MgXFx1MDAyNiBGT0xMX1dSSVRFKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXB0ZV9kaXJ0eShwdGUpIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcXG4rXFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZVxcbitcXHRcXHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2VcXG4rXFx0XFx0ICogZm9saW9fbWFya19hY2Nlc3NlZCgpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XFxuK1xcdH1cXG4rXFxuK1xcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZSwgbnIsIHBhZ2VzKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yXFxuKyAqIHdoZW4gdGhlIFBURSBjYW5ub3QgYmUgZm9sbG93ZWQgYnV0IHRoZSBjYWxsZXIgbWF5IGZhdWx0IGl0IGluLCBhbmQgYVxcbisgKiBuZWdhdGl2ZSBlcnJubyB3aGVuIHRoZSBjYWxsZXIgbXVzdCByZXBvcnQgdGhlIGZhaWx1cmUuXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBmb2xsb3dfb25lX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbitcXHRcXHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXApXFxuIHtcXG4tXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbi1cXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRwdGVfdCAqcHRlcCwgcHRlO1xcbi1cXHRpbnQgcmV0O1xcbiBcXG4tXFx0cHRlcCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgXFx1MDAyNnB0bCk7XFxuLVxcdGlmICghcHRlcClcXG4tXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuLVxcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xcbitcXHQqcGFnZXAgPSBOVUxMO1xcbitcXG4gXFx0aWYgKCFwdGVfcHJlc2VudChwdGUpKVxcbi1cXHRcXHRnb3RvIG5vX3BhZ2U7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXHRpZiAocHRlX3Byb3Rub25lKHB0ZSkgXFx1MDAyNlxcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIG5vX3BhZ2U7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkcmVzcywgcHRlKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFdlIG9ubHkgY2FyZSBhYm91dCBhbm9uIHBhZ2VzIGluIGNhbl9mb2xsb3dfd3JpdGVfcHRlKCkuXFxuIFxcdCAqL1xcbi1cXHRpZiAoKGZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0ICAgICFjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGUsIHBhZ2UsIHZtYSwgZmxhZ3MpKSB7XFxuLVxcdFxcdHBhZ2UgPSBOVUxMO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbitcXHRpZiAoKGZsYWdzIFxcdTAwMjYgRk9MTF9XUklURSkgXFx1MDAyNlxcdTAwMjYgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpXFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0aWYgKHVubGlrZWx5KCFwYWdlKSkge1xcbiBcXHRcXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX0RVTVApIHtcXG4gXFx0XFx0XFx0LyogQXZvaWQgc3BlY2lhbCAobGlrZSB6ZXJvKSBwYWdlcyBpbiBjb3JlIGR1bXBzICovXFxuLVxcdFxcdFxcdHBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0aWYgKGlzX3plcm9fcGZuKHB0ZV9wZm4ocHRlKSkpIHtcXG4tXFx0XFx0XFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHJldCA9IGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xcbi1cXHRcXHRcXHRwYWdlID0gRVJSX1BUUihyZXQpO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdFxcdH1cXG4rXFx0XFx0aWYgKCFpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKVxcbitcXHRcXHRcXHRyZXR1cm4gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7XFxuK1xcdFxcdHBhZ2UgPSBwdGVfcGFnZShwdGUpO1xcbiBcXHR9XFxuLVxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4gXFxuLVxcdGlmICghcHRlX3dyaXRlKHB0ZSkgXFx1MDAyNlxcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSkge1xcbi1cXHRcXHRwYWdlID0gRVJSX1BUUigtRU1MSU5LKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4rXFx0aWYgKCFwdGVfd3JpdGUocHRlKSBcXHUwMDI2XFx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxcbitcXHRcXHRyZXR1cm4gLUVNTElOSztcXG4gXFxuIFxcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcXHUwMDI2IEZPTExfUElOKSBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbihwYWdlKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XFxuIFxcbi1cXHQvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqL1xcbi1cXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgMSwgZmxhZ3MpO1xcbi1cXHRpZiAodW5saWtlbHkocmV0KSkge1xcbi1cXHRcXHRwYWdlID0gRVJSX1BUUihyZXQpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbitcXHQqcGFnZXAgPSBwYWdlO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbiBcXG4tXFx0LypcXG4tXFx0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXFxuLVxcdCAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZVxcbi1cXHQgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cXG4tXFx0ICovXFxuLVxcdGlmIChmbGFncyBcXHUwMDI2IEZPTExfUElOKSB7XFxuLVxcdFxcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcXG4tXFx0XFx0aWYgKHJldCkge1xcbi1cXHRcXHRcXHR1bnBpbl91c2VyX3BhZ2UocGFnZSk7XFxuLVxcdFxcdFxcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbisvKlxcbisgKiBSZXR1cm4gaG93IG1hbnkgUFRFcyBtYXAgY29uc2VjdXRpdmUgcGFnZXMgb2YgdGhlIHNhbWUgZm9saW8gYW5kIGNhbiBiZVxcbisgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuXFxuKyAqXFxuKyAqIFRoZSB3cml0ZS1mYXVsdCBhbmQgdW5zaGFyZSBjaGVja3MgaW4gZm9sbG93X29uZV9wdGUoKSBhcmUgcGVyIFBURSwgYnV0IGFcXG4rICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seVxcbisgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5c1xcbisgKiBvbmUgcGFnZSBhdCBhIHRpbWUuXFxuKyAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQsXFxuK1xcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHB0ZV90ICpwdGVwLCBwdGVfdCAqYmF0Y2hfcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBtYXg7XFxuK1xcbitcXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFx0aWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdG1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdGlmIChtYXggXFx1MDAzYz0gMSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBNZXJnZSB5b3VuZy9kaXJ0eSBhY3Jvc3MgYmF0Y2ggc28gZm9saW9fbWFya19kaXJ0eSBzZWVzIGFueSBkaXJ0eS4gKi9cXG4rXFx0cmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBiYXRjaF9wdGUsIG1heCxcXG4rXFx0XFx0XFx0XFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsXFxuKyAqIHdoaWNoZXZlciBjb21lcyBmaXJzdCwgYW5kIGNvbW1pdCBldmVyeSBwYWdlIGZvdW5kLlxcbisgKlxcbisgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdFxcbisgKiBpcyBhIHNob3J0IHJlYWQ7IF9fZ2V0X3VzZXJfcGFnZXMoKSByZXRyeWluZyB0aGUgcmVhZCB3aWxsIGdldCB0aGUgZXJyb3IuXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXFxuK1xcdFxcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4re1xcbitcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuK1xcdGJvb2wgbmVlZF9ub19wYWdlX3RhYmxlID0gZmFsc2U7XFxuK1xcdHB0ZV90ICpwdGVwLCAqb3JpZ19wdGVwO1xcbitcXHR1bnNpZ25lZCBsb25nIHdhbGtfZW5kO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yID0gMDtcXG4rXFx0c3BpbmxvY2tfdCAqcHRsO1xcbitcXHRsb25nIHJldCA9IDA7XFxuK1xcbitcXHRvcmlnX3B0ZXAgPSBwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCBcXHUwMDI2cHRsKTtcXG4rXFx0aWYgKCFwdGVwKVxcbitcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4rXFxuK1xcdHdhbGtfZW5kID0gbWluKHBtZF9hZGRyX2VuZChhZGRyZXNzLCBlbmQpLCB2bWEtXFx1MDAzZXZtX2VuZCk7XFxuK1xcbitcXHRmb3IgKDsgYWRkcmVzcyBcXHUwMDNjIHdhbGtfZW5kOyBhZGRyZXNzICs9IFBBR0VfU0laRSwgcHRlcCsrKSB7XFxuK1xcdFxcdHB0ZV90IHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xcbitcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4rXFxuK1xcdFxcdHJldCA9IGZvbGxvd19vbmVfcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgcHRlLCBmbGFncywgXFx1MDAyNnBhZ2UpO1xcbitcXHRcXHRpZiAoIXJldCBcXHUwMDI2XFx1MDAyNiBwYWdlKSB7XFxuK1xcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGJhdGNoO1xcbitcXG4rXFx0XFx0XFx0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xcbitcXG4rXFx0XFx0XFx0YmF0Y2ggPSBmb2xsb3dfcHRlX2JhdGNoKHZtYSwgYWRkcmVzcywgd2Fsa19lbmQsIGZvbGlvLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgcHRlcCwgXFx1MDAyNmJhdGNoX3B0ZSwgZmxhZ3MpO1xcbitcXHRcXHRcXHRyZXQgPSBmb2xsb3dfcGFnZV9wdGVfY29tbWl0KHZtYSwgYWRkcmVzcywgZm9saW8sIHBhZ2UsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZXMgPyBwYWdlcyArIG5yIDogTlVMTCk7XFxuK1xcdFxcdFxcdGlmICghcmV0KSB7XFxuK1xcdFxcdFxcdFxcdG5yICs9IGJhdGNoO1xcbitcXHRcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHRcXHQgKiBUaGUgbG9vcCdzIG93biBpbmNyZW1lbnQgY292ZXJzIG9uZSBQVEU7IHNraXBcXG4rXFx0XFx0XFx0XFx0ICogdGhlIHJlc3Qgb2YgdGhlIGJhdGNoLlxcbitcXHRcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0XFx0cHRlcCArPSBiYXRjaCAtIDE7XFxuK1xcdFxcdFxcdFxcdGFkZHJlc3MgKz0gKGJhdGNoIC0gMSkgKiBQQUdFX1NJWkU7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdH1cXG4tXFx0fVxcbi1cXHRpZiAoZmxhZ3MgXFx1MDAyNiBGT0xMX1RPVUNIKSB7XFxuLVxcdFxcdGlmICgoZmxhZ3MgXFx1MDAyNiBGT0xMX1dSSVRFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgIXB0ZV9kaXJ0eShwdGUpIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcXG4tXFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBwdGVfbWt5b3VuZygpIHdvdWxkIGJlIG1vcmUgY29ycmVjdCBoZXJlLCBidXQgYXRvbWljIGNhcmVcXG4tXFx0XFx0ICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlXFxuLVxcdFxcdCAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS5cXG4rXFx0XFx0ICogbm9fcGFnZV90YWJsZSgpIG1heSBsb29rIHVwIHRoZSBwYWdlIGNhY2hlLCBzbyBpdCBjYW5ub3QgcnVuXFxuK1xcdFxcdCAqIHVuZGVyIHRoZSBQVEUgbG9jay5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xcbitcXHRcXHRpZiAoIXJldCBcXHUwMDI2XFx1MDAyNiBwdGVfbm9uZShwdGUpKVxcbitcXHRcXHRcXHRuZWVkX25vX3BhZ2VfdGFibGUgPSB0cnVlO1xcbitcXHRcXHRicmVhaztcXG4gXFx0fVxcbi1vdXQ6XFxuLVxcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcXG4tXFx0cmV0dXJuIHBhZ2U7XFxuLW5vX3BhZ2U6XFxuLVxcdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcXG4tXFx0aWYgKCFwdGVfbm9uZShwdGUpKVxcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuK1xcbitcXHRwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTtcXG4rXFxuK1xcdGlmIChucilcXG4rXFx0XFx0cmV0dXJuIG5yO1xcbitcXHRpZiAobmVlZF9ub19wYWdlX3RhYmxlKVxcbitcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4gXFx0cG1kX3QgKnBtZCwgcG1kdmFsO1xcbiBcXHRzcGlubG9ja190ICpwdGw7XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRsb25nIHJldDtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbiBcXG4gXFx0cG1kID0gcG1kX29mZnNldChwdWRwLCBhZGRyZXNzKTtcXG5AQCAtOTEyLDcgKzEwMzMsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0aWYgKCFwbWRfcHJlc2VudChwbWR2YWwpKVxcbiBcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4gXFx0aWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpXFxuLVxcdFxcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcXG4rXFx0XFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xcbiBcXG4gXFx0aWYgKHBtZF9wcm90bm9uZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcXG4gXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuQEAgLTkyNSwyOCArMTA0NiwzNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0fVxcbiBcXHRpZiAodW5saWtlbHkoIXBtZF9sZWFmKHBtZHZhbCkpKSB7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuLVxcdFxcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcXG4rXFx0XFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xcbiBcXHR9XFxuIFxcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IChmbGFncyBcXHUwMDI2IEZPTExfU1BMSVRfUE1EKSkge1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbiBcXHRcXHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcyk7XFxuIFxcdFxcdC8qIElmIHBtZCB3YXMgbGVmdCBlbXB0eSwgc3R1ZmYgYSBwYWdlIHRhYmxlIGluIHRoZXJlIHF1aWNrbHkgKi9cXG4tXFx0XFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IEVSUl9QVFIoLUVOT01FTSkgOlxcbi1cXHRcXHRcXHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcXG4rXFx0XFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IC1FTk9NRU0gOlxcbitcXHRcXHRcXHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTtcXG4gXFx0fVxcbi1cXHRwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0cmV0ID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XFxuIFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuLVxcdHJldHVybiBwYWdlO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsIHRoZVxcbitcXHQgKiBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIHBtZCBsb2NrLlxcbitcXHQgKi9cXG4rXFx0aWYgKHJldCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgcGFnZXMpXFxuK1xcdFxcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxcbitzdGF0aWMgbG9uZyBmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHA0ZF90ICpwNGRwLFxcbitcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuIHtcXG4gXFx0cHVkX3QgKnB1ZHAsIHB1ZDtcXG4gXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4rXFx0bG9uZyByZXQ7XFxuIFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4gXFxuIFxcdHB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpO1xcbkBAIC05NTUsMjIgKzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXHRpZiAocHVkX2xlYWYocHVkKSkge1xcbiBcXHRcXHRwdGwgPSBwdWRfbG9jayhtbSwgcHVkcCk7XFxuLVxcdFxcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0XFx0cmV0ID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xcbiBcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbi1cXHRcXHRpZiAocGFnZSlcXG4tXFx0XFx0XFx0cmV0dXJuIHBhZ2U7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxcbitcXHRcXHQgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW9cXG4rXFx0XFx0ICogY2FuIGJlIHVwIHRvIEhQQUdFX1BVRF9OUiBwYWdlcywgdG9vIGxvbmcgdG8gZmx1c2ggdW5kZXIgYVxcbitcXHRcXHQgKiBzcGlubG9jay5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzZSAwIFxcdTAwMjZcXHUwMDI2IHBhZ2VzKVxcbitcXHRcXHRcXHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gXFx0XFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuIFxcdH1cXG4gXFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXFxuIFxcdFxcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xcbiBcXG4tXFx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xcbitcXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdkX3QgKnBnZHAsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK3N0YXRpYyBsb25nIGZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcGdkX3QgKnBnZHAsXFxuK1xcdFxcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4ge1xcbiBcXHRwNGRfdCAqcDRkcCwgcDRkO1xcbiBcXG5AQCAtOTgxLDE1ICsxMTE2LDE4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRpZiAoIXA0ZF9wcmVzZW50KHA0ZCkgfHwgcDRkX2JhZChwNGQpKVxcbiBcXHRcXHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcXG4gXFxuLVxcdHJldHVybiBmb2xsb3dfcHVkX21hc2sodm1hLCBhZGRyZXNzLCBwNGRwLCBmbGFncywgcGFnZV9tYXNrKTtcXG4rXFx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIHBhZ2VzKTtcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIGZvbGxvd19wYWdlX21hc2sgLSBsb29rIHVwIGEgcGFnZSBkZXNjcmlwdG9yIGZyb20gYSB1c2VyLXZpcnR1YWwgYWRkcmVzc1xcbisgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBwYWdlcyBhdCBhIHVzZXItdmlydHVhbCBhZGRyZXNzXFxuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcXG4gICogQGFkZHJlc3M6IHZpcnR1YWwgYWRkcmVzcyB0byBsb29rIHVwXFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxcbi0gKiBAcGFnZV9tYXNrOiBhIHBvaW50ZXIgdG8gb3V0cHV0IHBhZ2VfbWFza1xcbisgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG9cXG4rICogICAgICAgICB3YWxrIHRoZSBwYWdlIHRhYmxlcyAoZS5nLiB0byBmYXVsdCBwYWdlcyBpbikgd2l0aG91dCBjb2xsZWN0aW5nXFxuKyAqICAgICAgICAgb3IgcmVmY291bnRpbmcgdGhlbVxcbiAgKlxcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAgKlxcbkBAIC05OTgsMzMgKzExMzYsMzIgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxcbiAgKiByZWxldmFudCB3aXRoIEZPTExfUElOIGFuZCAhRk9MTF9XUklURS5cXG4gICpcXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXFxuLSAqXFxuLSAqIFJldHVybjogdGhlIG1hcHBlZCAoc3RydWN0IHBhZ2UgKiksICVOVUxMIGlmIG5vIG1hcHBpbmcgZXhpc3RzLCBvclxcbi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXFxuLSAqIGJ5IGEgcGFnZSBkZXNjcmlwdG9yIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cXG4rICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFnZXMgc3RhcnRpbmcgYXQgQGFkZHJlc3MgdGhhdCB3ZXJlXFxuKyAqIHBsYWNlZCBpbnRvIEBwYWdlcyAoaWYgbm9uLU5VTEwpLCB3aGljaCBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgcGFnZXNcXG4rICogcmVxdWVzdGVkIHZpYSBAZW5kOyAwIGlmIG5vIG1hcHBpbmcgZXhpc3RzIGF0IEBhZGRyZXNzOyBvciBhIG5lZ2F0aXZlXFxuKyAqIGVycm5vIGZvciBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZCBieSBhIHBhZ2UgZGVzY3JpcHRvclxcbisgKiAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXFxuICAqL1xcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxcbi1cXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXFxuK3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4ge1xcbiBcXHRwZ2RfdCAqcGdkO1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRsb25nIHJldDtcXG4gXFxuIFxcdHZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTtcXG4gXFxuLVxcdCpwYWdlX21hc2sgPSAwO1xcbiBcXHRwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTtcXG4gXFxuIFxcdGlmIChwZ2Rfbm9uZSgqcGdkKSB8fCB1bmxpa2VseShwZ2RfYmFkKCpwZ2QpKSlcXG4tXFx0XFx0cGFnZSA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuK1xcdFxcdHJldCA9IG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XFxuIFxcdGVsc2VcXG4tXFx0XFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XFxuK1xcdFxcdHJldCA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgcGFnZXMpO1xcbiBcXG4gXFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcXG4gXFxuLVxcdHJldHVybiBwYWdlO1xcbitcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG5AQCAtMTM1OCw3ICsxNDk1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4ge1xcbiBcXHRsb25nIHJldCA9IDAsIGkgPSAwO1xcbiBcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrID0gMDtcXG4gXFxuIFxcdGlmICghbnJfcGFnZXMpXFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC0xMzczLDcgKzE1MDksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXG4gXFx0ZG8ge1xcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4tXFx0XFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xcbitcXHRcXHRsb25nIG5yO1xcbiBcXG4gXFx0XFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xcbiBcXHRcXHRpZiAoIXZtYSB8fCBzdGFydCBcXHUwMDNlPSB2bWEtXFx1MDAzZXZtX2VuZCkge1xcbkBAIC0xNDAwLDggKzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0cGFnZXMgPyBcXHUwMDI2cGFnZSA6IE5VTEwpO1xcbiBcXHRcXHRcXHRcXHRpZiAocmV0KVxcbiBcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0XFx0cGFnZV9tYXNrID0gMDtcXG4tXFx0XFx0XFx0XFx0Z290byBuZXh0X3BhZ2U7XFxuK1xcdFxcdFxcdFxcdGd1cF9maWxsX3BhZ2VzKHZtYSwgc3RhcnQsIHBhZ2UsIDEsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBwYWdlcyA/IHBhZ2VzICsgaSA6IE5VTEwpO1xcbitcXHRcXHRcXHRcXHRpKys7XFxuK1xcdFxcdFxcdFxcdHN0YXJ0ICs9IFBBR0VfU0laRTtcXG4rXFx0XFx0XFx0XFx0bnJfcGFnZXMtLTtcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdFxcdH1cXG4gXFxuIFxcdFxcdFxcdGlmICghdm1hKSB7XFxuQEAgLTE0MjMsMTAgKzE1NjMsMTEgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0fVxcbiBcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4gXFxuLVxcdFxcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgXFx1MDAyNnBhZ2VfbWFzayk7XFxuLVxcdFxcdGlmICghcGFnZSB8fCBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkspIHtcXG4rXFx0XFx0bnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGd1cF9mbGFncywgcGFnZXMgPyBcXHUwMDI2cGFnZXNbaV0gOiBOVUxMKTtcXG4rXFx0XFx0aWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7XFxuIFxcdFxcdFxcdHJldCA9IGZhdWx0aW5fcGFnZSh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdFxcdCAgIFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSywgbG9ja2VkKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAgbnIgPT0gLUVNTElOSywgbG9ja2VkKTtcXG4gXFx0XFx0XFx0c3dpdGNoIChyZXQpIHtcXG4gXFx0XFx0XFx0Y2FzZSAwOlxcbiBcXHRcXHRcXHRcXHRnb3RvIHJldHJ5O1xcbkBAIC0xNDQwLDcwICsxNTgxLDMwIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdEJVRygpO1xcbi1cXHRcXHR9IGVsc2UgaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVFWElTVCkge1xcbitcXHRcXHR9IGVsc2UgaWYgKG5yID09IC1FRVhJU1QpIHtcXG4gXFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0ICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZ1xcbiBcXHRcXHRcXHQgKiBzdHJ1Y3QgcGFnZS4gSWYgdGhlIGNhbGxlciBleHBlY3RzICoqcGFnZXMgdG8gYmVcXG4gXFx0XFx0XFx0ICogZmlsbGVkIGluLCBiYWlsIG91dCBub3csIGJlY2F1c2UgdGhhdCBjYW4ndCBiZSBkb25lXFxuLVxcdFxcdFxcdCAqIGZvciB0aGlzIHBhZ2UuXFxuK1xcdFxcdFxcdCAqIGZvciB0aGlzIHBhZ2UuIE90aGVyd2lzZSBhZHZhbmNlIGJ5IHRoZSBvbmUgcGFnZVxcbitcXHRcXHRcXHQgKiBmb2xsb3dfcGFnZV9tYXNrKCkgbG9va2VkIGF0LlxcbiBcXHRcXHRcXHQgKi9cXG4gXFx0XFx0XFx0aWYgKHBhZ2VzKSB7XFxuLVxcdFxcdFxcdFxcdHJldCA9IFBUUl9FUlIocGFnZSk7XFxuK1xcdFxcdFxcdFxcdHJldCA9IG5yO1xcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0fVxcbi1cXHRcXHR9IGVsc2UgaWYgKElTX0VSUihwYWdlKSkge1xcbi1cXHRcXHRcXHRyZXQgPSBQVFJfRVJSKHBhZ2UpO1xcbitcXHRcXHRcXHRuciA9IDE7XFxuK1xcdFxcdH0gZWxzZSBpZiAobnIgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdHJldCA9IG5yO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbi1uZXh0X3BhZ2U6XFxuLVxcdFxcdHBhZ2VfaW5jcmVtID0gMSArICh+KHN0YXJ0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpIFxcdTAwMjYgcGFnZV9tYXNrKTtcXG4tXFx0XFx0aWYgKHBhZ2VfaW5jcmVtIFxcdTAwM2UgbnJfcGFnZXMpXFxuLVxcdFxcdFxcdHBhZ2VfaW5jcmVtID0gbnJfcGFnZXM7XFxuLVxcbi1cXHRcXHRpZiAocGFnZXMpIHtcXG4tXFx0XFx0XFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XFxuLVxcdFxcdFxcdHVuc2lnbmVkIGludCBqO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogVGhpcyBtdXN0IGJlIGEgbGFyZ2UgZm9saW8gKGFuZCBkb2Vzbid0IG5lZWQgdG9cXG4tXFx0XFx0XFx0ICogYmUgdGhlIHdob2xlIGZvbGlvOyBpdCBjYW4gYmUgcGFydCBvZiBpdCksIGRvXFxuLVxcdFxcdFxcdCAqIHRoZSByZWZjb3VudCB3b3JrIGZvciBhbGwgdGhlIHN1YnBhZ2VzIHRvby5cXG4tXFx0XFx0XFx0ICpcXG4tXFx0XFx0XFx0ICogTk9URTogaGVyZSB0aGUgcGFnZSBtYXkgbm90IGJlIHRoZSBoZWFkIHBhZ2VcXG4tXFx0XFx0XFx0ICogZS5nLiB3aGVuIHN0YXJ0IGFkZHIgaXMgbm90IHRocC1zaXplIGFsaWduZWQuXFxuLVxcdFxcdFxcdCAqIHRyeV9ncmFiX2ZvbGlvKCkgc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0YWlsXFxuLVxcdFxcdFxcdCAqIHBhZ2VzLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aWYgKHBhZ2VfaW5jcmVtIFxcdTAwM2UgMSkge1xcbi1cXHRcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFxuLVxcdFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdFxcdCAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGVcXG4tXFx0XFx0XFx0XFx0ICogbGFyZ2UgZm9saW8sIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuXFxuLVxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgZ3VwX2ZsYWdzKSkge1xcbi1cXHRcXHRcXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBSZWxlYXNlIHRoZSAxc3QgcGFnZSByZWYgaWYgdGhlXFxuLVxcdFxcdFxcdFxcdFxcdCAqIGZvbGlvIGlzIHByb2JsZW1hdGljLCBmYWlsIGhhcmQuXFxuLVxcdFxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRcXHRndXBfcHV0X2ZvbGlvKGZvbGlvLCAxLCBndXBfZmxhZ3MpO1xcbi1cXHRcXHRcXHRcXHRcXHRyZXQgPSAtRUZBVUxUO1xcbi1cXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHR9XFxuLVxcbi1cXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGFnZV9pbmNyZW07IGorKykge1xcbi1cXHRcXHRcXHRcXHRzdWJwYWdlID0gcGFnZSArIGo7XFxuLVxcdFxcdFxcdFxcdHBhZ2VzW2kgKyBqXSA9IHN1YnBhZ2U7XFxuLVxcdFxcdFxcdFxcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIHN0YXJ0ICsgaiAqIFBBR0VfU0laRSk7XFxuLVxcdFxcdFxcdFxcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4rXFx0XFx0LyogQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgcGluIG1vcmUgcGFnZXMgdGhhbiB0aGUgY2FsbGVyIHdpbGwgZnJlZS4gKi9cXG4rXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKG5yIFxcdTAwM2UgbnJfcGFnZXMpO1xcbiBcXG4tXFx0XFx0aSArPSBwYWdlX2luY3JlbTtcXG4tXFx0XFx0c3RhcnQgKz0gcGFnZV9pbmNyZW0gKiBQQUdFX1NJWkU7XFxuLVxcdFxcdG5yX3BhZ2VzIC09IHBhZ2VfaW5jcmVtO1xcbitcXHRcXHRpICs9IG5yO1xcbitcXHRcXHRzdGFydCArPSBuciAqIFBBR0VfU0laRTtcXG4rXFx0XFx0bnJfcGFnZXMgLT0gbnI7XFxuIFxcdH0gd2hpbGUgKG5yX3BhZ2VzKTtcXG4gb3V0OlxcbiBcXHRyZXR1cm4gaSA/IGkgOiByZXQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU1OjEzLjExNjI4MTUyNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjk1MjYwODEwOTA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJIVUdFVExCRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJnZXRfdXNlcl9wYWdlc1wiLFxuICAgIFwiZ2V0X3VzZXJfcGFnZXNfcmVtb3RlXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlc191bmxvY2tlZFwiLFxuICAgIFwicGluX3VzZXJfcGFnZXNcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzX3JlbW90ZVwiLFxuICAgIFwicGluX3VzZXJfcGFnZXNfdW5sb2NrZWRcIixcbiAgICBcImZhdWx0aW5fcGFnZV9yYW5nZVwiLFxuICAgIFwicG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgaW4gYG1tL2d1cC5jYCB0byBiYXRjaCBwYWdlIHRhYmxlIHdhbGtzIGFuZCByZXR1cm4gbXVsdGlwbGUgcGFnZXMgYXQgb25jZSBpbnN0ZWFkIG9mIG9uZSBieSBvbmUuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgdGhhdCBpcyByZWFjaGFibGUgdmlhIG1hbnkgc3lzY2FsbHMgKGUuZy4sIG1tYXAsIG1hZHZpc2UsIHB0cmFjZSwgcHJvY2Vzc192bV9yZWFkdikuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjdlNjc2ZThiMDM4ZTAxY2NkYzYyNzg1NzY5MzZkNjBkOWI3YWI4NFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDE2OjU1OjExIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vZ3VwLmMgYi9tbS9ndXAuY1xuaW5kZXggMDY5MjExOWI3OTA0My4uMTA2ODA2NjM0YjNjNCAxMDA2NDRcbi0tLSBhL21tL2d1cC5jXG4rKysgYi9tbS9ndXAuY1xuQEAgLTYwOCwxNSArNjA4LDE1IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiBwYWdlIFx1MDAyNlx1MDAyNiBQYWdlQW5vbihwYWdlKSBcdTAwMjZcdTAwMjYgUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXG4rc3RhdGljIGxvbmcgbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXG4ge1xuIFx0aWYgKCEoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdC8qXG4gXHQgKiBXaGVuIGNvcmUgZHVtcGluZywgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSB1bm5lY2Vzc2FyeSBwYWdlcyBvclxuLVx0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiBOVUxMIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxuK1x0ICogcGFnZSB0YWJsZXMuICBSZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiAwIHRvIHNraXAgaGFuZGxlX21tX2ZhdWx0LFxuIFx0ICogdGhlbiBnZXRfZHVtcF9wYWdlKCkgd2lsbCByZXR1cm4gTlVMTCB0byBsZWF2ZSBhIGhvbGUgaW4gdGhlIGR1bXAuXG4gXHQgKiBCdXQgd2UgY2FuIG9ubHkgbWFrZSB0aGlzIG9wdGltaXphdGlvbiB3aGVyZSBhIGhvbGUgd291bGQgc3VyZWx5XG4gXHQgKiBiZSB6ZXJvLWZpbGxlZCBpZiBoYW5kbGVfbW1fZmF1bHQoKSBhY3R1YWxseSBkaWQgaGFuZGxlIGl0LlxuQEAgLTYyNSwxMiArNjI1LDI5IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0c3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTtcbiBcbiBcdFx0aWYgKCFodWdldGxiZnNfcGFnZWNhY2hlX3ByZXNlbnQoaCwgdm1hLCBhZGRyZXNzKSlcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdH0gZWxzZSBpZiAoKHZtYV9pc19hbm9ueW1vdXModm1hKSB8fCAhdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VmYXVsdCkpIHtcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4rXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuLVx0cmV0dXJuIE5VTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgZ3VwX2ZpbGxfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbitcdFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnIsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0aWYgKCFwYWdlcylcbitcdFx0cmV0dXJuO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKykge1xuK1x0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZSA9IHBhZ2UgKyBpO1xuK1xuK1x0XHRwYWdlc1tpXSA9IHN1YnBhZ2U7XG4rXHRcdGZsdXNoX2Fub25fcGFnZSh2bWEsIHN1YnBhZ2UsIGFkZHJlc3MgKyBpICogUEFHRV9TSVpFKTtcbitcdFx0Zmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7XG4rXHR9XG4gfVxuIFxuICNpZmRlZiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVNcbkBAIC02NDYsMzggKzY2Myw0MyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdWQocHVkX3QgcHVkLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiBjYW5fZm9sbG93X3dyaXRlX2NvbW1vbihwYWdlLCB2bWEsIGZsYWdzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHB1ZF90ICpwdWRwLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHB1ZF90IHB1ZCA9ICpwdWRwO1xuIFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwdWRfcGZuKHB1ZCk7XG4rXHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XG4gXHRpbnQgcmV0O1xuIFxuIFx0YXNzZXJ0X3NwaW5fbG9ja2VkKHB1ZF9sb2NrcHRyKG1tLCBwdWRwKSk7XG4gXG4gXHRpZiAoIXB1ZF9wcmVzZW50KHB1ZCkpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICFjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWQsIHBmbl90b19wYWdlKHBmbiksIHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbitcdFx0cmV0dXJuIDA7XG4gXG4tXHRwZm4gKz0gKGFkZHIgXHUwMDI2IH5QVURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRvZmYgPSBQRk5fRE9XTihhZGRyIFx1MDAyNiB+UFVEX01BU0spO1xuK1x0cGZuICs9IG9mZjtcbiBcdHBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pO1xuIFxuIFx0aWYgKCFwdWRfd3JpdGUocHVkKSBcdTAwMjZcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVNTElOSyk7XG4rXHRcdHJldHVybiAtRU1MSU5LO1xuK1xuK1x0bnIgPSBtaW4oSFBBR0VfUFVEX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7XG4gXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4rXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpO1xuIFx0aWYgKHJldClcbi1cdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdGVsc2Vcbi1cdFx0KnBhZ2VfbWFzayA9IEhQQUdFX1BVRF9OUiAtIDE7XG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRpZiAocGFnZXMpXG4rXHRcdHBhZ2VzWzBdID0gcGFnZTtcbiBcbi1cdHJldHVybiBwYWdlO1xuK1x0cmV0dXJuIG5yO1xuIH1cbiBcbiAvKiBGT0xMX0ZPUkNFIGNhbiB3cml0ZSB0byBldmVuIHVud3JpdGFibGUgUE1EcyBpbiBDT1cgbWFwcGluZ3MuICovXG5AQCAtNjk4LDE0ICs3MjAsMTQgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZF90IHBtZCwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRyZXR1cm4gIXVzZXJmYXVsdGZkX2h1Z2VfcG1kX3dwKHZtYSwgcG1kKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCAqcG1kLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXHRwbWRfdCBwbWR2YWwgPSAqcG1kO1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHR1bnNpZ25lZCBsb25nIG9mZiwgbnI7XG4gXHRpbnQgcmV0O1xuIFxuIFx0YXNzZXJ0X3NwaW5fbG9ja2VkKHBtZF9sb2NrcHRyKG1tLCBwbWQpKTtcbkBAIC03MTMsNTAgKzczNSw1NCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpO1xuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4gXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcG1kKHBtZHZhbCwgcGFnZSwgdm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdC8qIEF2b2lkIGR1bXBpbmcgaHVnZSB6ZXJvIHBhZ2UgKi9cbiBcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkgXHUwMDI2XHUwMDI2IGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSlcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4rXHRcdHJldHVybiAtRUZBVUxUO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZSgqcG1kKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbitcdFx0cmV0dXJuIDA7XG4gXG4gXHRpZiAoIXBtZF93cml0ZShwbWR2YWwpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU1MSU5LKTtcbitcdFx0cmV0dXJuIC1FTUxJTks7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSBcdTAwMjZcdTAwMjYgUGFnZUFub24ocGFnZSkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpO1xuIFxuLVx0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgMSwgZmxhZ3MpO1xuK1x0b2ZmID0gUEZOX0RPV04oYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbitcdG5yID0gbWluKEhQQUdFX1BNRF9OUiAtIG9mZiwgUEZOX0RPV04oZW5kIC0gYWRkcikpO1xuK1xuK1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8ocGFnZV9mb2xpbyhwYWdlKSwgbnIsIGZsYWdzKTtcbiBcdGlmIChyZXQpXG4tXHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG4rXHRcdHJldHVybiByZXQ7XG4gXG4gI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRVxuIFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkpXG4gXHRcdHRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpO1xuICNlbmRpZlx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXG4gXG4tXHRwYWdlICs9IChhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuLVx0KnBhZ2VfbWFzayA9IEhQQUdFX1BNRF9OUiAtIDE7XG4rXHRwYWdlICs9IG9mZjtcbitcbitcdGlmIChwYWdlcylcbitcdFx0cGFnZXNbMF0gPSBwYWdlO1xuIFxuLVx0cmV0dXJuIHBhZ2U7XG4rXHRyZXR1cm4gbnI7XG4gfVxuIFxuICNlbHNlICAvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi9cbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4tXHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4tXHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAwO1xuIH1cbiAjZW5kaWZcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuIFxuQEAgLTc5OSwxMTAgKzgyNSwyMDUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRyZXR1cm4gIXVzZXJmYXVsdGZkX3B0ZV93cCh2bWEsIHB0ZSk7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncylcbisvKlxuKyAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgcnVuIGV2ZXJ5IHBlci1QVEUgc2FmZXR5IGNoZWNrIChwcmVzZW50LFxuKyAqIHdyaXRlLWZhdWx0LCBndXBfbXVzdF91bnNoYXJlKCkpIG9uIHRoZSBQVEUsIHNvIHRoaXMgb25seSBkb2VzIHRoZVxuKyAqIHBlci1mb2xpbyB3b3JrOiB0aGUgcmVmY291bnQgZ3JhYiwgdGhlIEZPTExfUElOIGFjY2Vzc2liaWxpdHkgZmF1bHQtaW4sXG4rICogZGlydHkvYWNjZXNzZWQgbWFya2luZywgYW5kIHRoZSBhcnJheSBmaWxsIHdpdGggdGhlIGNhY2hlIGZsdXNoLlxuKyAqL1xuK3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UsXG4rXHRcdHB0ZV90IHB0ZSwgdW5zaWduZWQgbG9uZyBuciwgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuK3tcbitcdGxvbmcgcmV0O1xuK1xuK1x0LyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi9cbitcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCBuciwgZmxhZ3MpO1xuK1x0aWYgKHVubGlrZWx5KHJldCkpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKlxuK1x0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXG4rXHQgKiB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZSBzZWVcbitcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuK1x0ICovXG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSB7XG4rXHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbitcdFx0aWYgKHJldCkge1xuK1x0XHRcdGd1cF9wdXRfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSB7XG4rXHRcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIXB0ZV9kaXJ0eShwdGUpIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpXG4rXHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4rXHRcdC8qXG4rXHRcdCAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZVxuK1x0XHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2VcbitcdFx0ICogZm9saW9fbWFya19hY2Nlc3NlZCgpLlxuK1x0XHQgKi9cbitcdFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XG4rXHR9XG4rXG4rXHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2UsIG5yLCBwYWdlcyk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBSZXNvbHZlIG9uZSBwcmVzZW50IFBURSB0byB0aGUgcGFnZSBpdCBtYXBzLiBSZXR1cm5zIG5vIHBhZ2UgYW5kIG5vIGVycm9yXG4rICogd2hlbiB0aGUgUFRFIGNhbm5vdCBiZSBmb2xsb3dlZCBidXQgdGhlIGNhbGxlciBtYXkgZmF1bHQgaXQgaW4sIGFuZCBhXG4rICogbmVnYXRpdmUgZXJybm8gd2hlbiB0aGUgY2FsbGVyIG11c3QgcmVwb3J0IHRoZSBmYWlsdXJlLlxuKyAqL1xuK3N0YXRpYyBsb25nIGZvbGxvd19vbmVfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4rXHRcdHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHB0ZV90ICpwdGVwLCBwdGU7XG4tXHRpbnQgcmV0O1xuIFxuLVx0cHRlcCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgXHUwMDI2cHRsKTtcbi1cdGlmICghcHRlcClcbi1cdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4tXHRwdGUgPSBwdGVwX2dldChwdGVwKTtcbitcdCpwYWdlcCA9IE5VTEw7XG4rXG4gXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZSkpXG4tXHRcdGdvdG8gbm9fcGFnZTtcbitcdFx0cmV0dXJuIDA7XG4gXHRpZiAocHRlX3Byb3Rub25lKHB0ZSkgXHUwMDI2XHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcbi1cdFx0Z290byBub19wYWdlO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZSk7XG4gXG4gXHQvKlxuIFx0ICogV2Ugb25seSBjYXJlIGFib3V0IGFub24gcGFnZXMgaW4gY2FuX2ZvbGxvd193cml0ZV9wdGUoKS5cbiBcdCAqL1xuLVx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpIHtcbi1cdFx0cGFnZSA9IE5VTEw7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuK1x0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2ICFjYW5fZm9sbG93X3dyaXRlX3B0ZShwdGUsIHBhZ2UsIHZtYSwgZmxhZ3MpKVxuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdGlmICh1bmxpa2VseSghcGFnZSkpIHtcbiBcdFx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX0RVTVApIHtcbiBcdFx0XHQvKiBBdm9pZCBzcGVjaWFsIChsaWtlIHplcm8pIHBhZ2VzIGluIGNvcmUgZHVtcHMgKi9cbi1cdFx0XHRwYWdlID0gRVJSX1BUUigtRUZBVUxUKTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRpZiAoaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkge1xuLVx0XHRcdHBhZ2UgPSBwdGVfcGFnZShwdGUpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHJldCA9IGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xuLVx0XHRcdHBhZ2UgPSBFUlJfUFRSKHJldCk7XG4tXHRcdFx0Z290byBvdXQ7XG4rXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdH1cbitcdFx0aWYgKCFpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKVxuK1x0XHRcdHJldHVybiBmb2xsb3dfcGZuX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIGZsYWdzKTtcbitcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4gXHR9XG4tXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG4tXHRpZiAoIXB0ZV93cml0ZShwdGUpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKSB7XG4tXHRcdHBhZ2UgPSBFUlJfUFRSKC1FTUxJTkspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbitcdGlmICghcHRlX3dyaXRlKHB0ZSkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXG4rXHRcdHJldHVybiAtRU1MSU5LO1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX1BBR0UoKGZsYWdzIFx1MDAyNiBGT0xMX1BJTikgXHUwMDI2XHUwMDI2IFBhZ2VBbm9uKHBhZ2UpIFx1MDAyNlx1MDAyNlxuIFx0XHRcdCAgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBwYWdlKTtcbiBcbi1cdC8qIHRyeV9ncmFiX2ZvbGlvKCkgZG9lcyBub3RoaW5nIHVubGVzcyBGT0xMX0dFVCBvciBGT0xMX1BJTiBpcyBzZXQuICovXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhmb2xpbywgMSwgZmxhZ3MpO1xuLVx0aWYgKHVubGlrZWx5KHJldCkpIHtcbi1cdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4rXHQqcGFnZXAgPSBwYWdlO1xuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0Lypcbi1cdCAqIFdlIG5lZWQgdG8gbWFrZSB0aGUgcGFnZSBhY2Nlc3NpYmxlIGlmIGFuZCBvbmx5IGlmIHdlIGFyZSBnb2luZ1xuLVx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXG4tXHQgKiBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdCBmb3IgZGV0YWlscy5cbi1cdCAqL1xuLVx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1BJTikge1xuLVx0XHRyZXQgPSBhcmNoX21ha2VfZm9saW9fYWNjZXNzaWJsZShmb2xpbyk7XG4tXHRcdGlmIChyZXQpIHtcbi1cdFx0XHR1bnBpbl91c2VyX3BhZ2UocGFnZSk7XG4tXHRcdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0XHRnb3RvIG91dDtcbisvKlxuKyAqIFJldHVybiBob3cgbWFueSBQVEVzIG1hcCBjb25zZWN1dGl2ZSBwYWdlcyBvZiB0aGUgc2FtZSBmb2xpbyBhbmQgY2FuIGJlXG4rICogY29tbWl0dGVkIGFzIG9uZSBydW4uIEFsd2F5cyBhdCBsZWFzdCAxLlxuKyAqXG4rICogVGhlIHdyaXRlLWZhdWx0IGFuZCB1bnNoYXJlIGNoZWNrcyBpbiBmb2xsb3dfb25lX3B0ZSgpIGFyZSBwZXIgUFRFLCBidXQgYVxuKyAqIHdyaXRhYmxlIHJ1biBuZWVkcyBubyByZXBlYXQ6IGEgd3JpdGFibGUgYW5vbiBwYWdlIGlzIGV4Y2x1c2l2ZS4gQSByZWFkLW9ubHlcbisgKiBydW4gdW5kZXIgRk9MTF9XUklURSBvciBGT0xMX1BJTiBkb2VzIG5lZWQgdGhlIHBlci1wYWdlIGNoZWNrLCBzbyBpdCBzdGF5c1xuKyAqIG9uZSBwYWdlIGF0IGEgdGltZS5cbisgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQsXG4rXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHB0ZV90ICpwdGVwLCBwdGVfdCAqYmF0Y2hfcHRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBtYXg7XG4rXG4rXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuK1x0XHRyZXR1cm4gMTtcbitcdGlmICghcHRlX3dyaXRlKCpiYXRjaF9wdGUpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IChGT0xMX1dSSVRFIHwgRk9MTF9QSU4pKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRtYXggPSAod2Fsa19lbmQgLSBhZGRyZXNzKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdGlmIChtYXggXHUwMDNjPSAxKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIE1lcmdlIHlvdW5nL2RpcnR5IGFjcm9zcyBiYXRjaCBzbyBmb2xpb19tYXJrX2RpcnR5IHNlZXMgYW55IGRpcnR5LiAqL1xuK1x0cmV0dXJuIGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdGVwLCBiYXRjaF9wdGUsIG1heCxcbitcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfTUVSR0VfWU9VTkdfRElSVFkpO1xuK31cbitcbisvKlxuKyAqIFdhbGsgdGhlIFBURXMgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSB0YWJsZSBvciBWTUEsXG4rICogd2hpY2hldmVyIGNvbWVzIGZpcnN0LCBhbmQgY29tbWl0IGV2ZXJ5IHBhZ2UgZm91bmQuXG4rICpcbisgKiBBIGZhaWx1cmUgb24gdGhlIGZpcnN0IFBURSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBBIGZhaWx1cmUgYWZ0ZXIgdGhhdFxuKyAqIGlzIGEgc2hvcnQgcmVhZDsgX19nZXRfdXNlcl9wYWdlcygpIHJldHJ5aW5nIHRoZSByZWFkIHdpbGwgZ2V0IHRoZSBlcnJvci5cbisgKi9cbitzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbit7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcdGJvb2wgbmVlZF9ub19wYWdlX3RhYmxlID0gZmFsc2U7XG4rXHRwdGVfdCAqcHRlcCwgKm9yaWdfcHRlcDtcbitcdHVuc2lnbmVkIGxvbmcgd2Fsa19lbmQ7XG4rXHR1bnNpZ25lZCBsb25nIG5yID0gMDtcbitcdHNwaW5sb2NrX3QgKnB0bDtcbitcdGxvbmcgcmV0ID0gMDtcbitcbitcdG9yaWdfcHRlcCA9IHB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsIFx1MDAyNnB0bCk7XG4rXHRpZiAoIXB0ZXApXG4rXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1xuK1x0d2Fsa19lbmQgPSBtaW4ocG1kX2FkZHJfZW5kKGFkZHJlc3MsIGVuZCksIHZtYS1cdTAwM2V2bV9lbmQpO1xuK1xuK1x0Zm9yICg7IGFkZHJlc3MgXHUwMDNjIHdhbGtfZW5kOyBhZGRyZXNzICs9IFBBR0VfU0laRSwgcHRlcCsrKSB7XG4rXHRcdHB0ZV90IHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcbitcdFx0cmV0ID0gZm9sbG93X29uZV9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBwdGUsIGZsYWdzLCBcdTAwMjZwYWdlKTtcbitcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHBhZ2UpIHtcbitcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbitcdFx0XHR1bnNpZ25lZCBsb25nIGJhdGNoO1xuK1xuK1x0XHRcdHB0ZV90IGJhdGNoX3B0ZSA9IHB0ZTtcbitcbitcdFx0XHRiYXRjaCA9IGZvbGxvd19wdGVfYmF0Y2godm1hLCBhZGRyZXNzLCB3YWxrX2VuZCwgZm9saW8sXG4rXHRcdFx0XHRcdFx0IHB0ZXAsIFx1MDAyNmJhdGNoX3B0ZSwgZmxhZ3MpO1xuK1x0XHRcdHJldCA9IGZvbGxvd19wYWdlX3B0ZV9jb21taXQodm1hLCBhZGRyZXNzLCBmb2xpbywgcGFnZSxcbitcdFx0XHRcdFx0XHQgICAgIGJhdGNoX3B0ZSwgYmF0Y2gsIGZsYWdzLFxuK1x0XHRcdFx0XHRcdCAgICAgcGFnZXMgPyBwYWdlcyArIG5yIDogTlVMTCk7XG4rXHRcdFx0aWYgKCFyZXQpIHtcbitcdFx0XHRcdG5yICs9IGJhdGNoO1xuK1x0XHRcdFx0LypcbitcdFx0XHRcdCAqIFRoZSBsb29wJ3Mgb3duIGluY3JlbWVudCBjb3ZlcnMgb25lIFBURTsgc2tpcFxuK1x0XHRcdFx0ICogdGhlIHJlc3Qgb2YgdGhlIGJhdGNoLlxuK1x0XHRcdFx0ICovXG4rXHRcdFx0XHRwdGVwICs9IGJhdGNoIC0gMTtcbitcdFx0XHRcdGFkZHJlc3MgKz0gKGJhdGNoIC0gMSkgKiBQQUdFX1NJWkU7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4gXHRcdH1cbi1cdH1cbi1cdGlmIChmbGFncyBcdTAwMjYgRk9MTF9UT1VDSCkge1xuLVx0XHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFwdGVfZGlydHkocHRlKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuLVx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuK1xuIFx0XHQvKlxuLVx0XHQgKiBwdGVfbWt5b3VuZygpIHdvdWxkIGJlIG1vcmUgY29ycmVjdCBoZXJlLCBidXQgYXRvbWljIGNhcmVcbi1cdFx0ICogaXMgbmVlZGVkIHRvIGF2b2lkIGxvc2luZyB0aGUgZGlydHkgYml0OiBpdCBpcyBlYXNpZXIgdG8gdXNlXG4tXHRcdCAqIGZvbGlvX21hcmtfYWNjZXNzZWQoKS5cbitcdFx0ICogbm9fcGFnZV90YWJsZSgpIG1heSBsb29rIHVwIHRoZSBwYWdlIGNhY2hlLCBzbyBpdCBjYW5ub3QgcnVuXG4rXHRcdCAqIHVuZGVyIHRoZSBQVEUgbG9jay5cbiBcdFx0ICovXG4tXHRcdGZvbGlvX21hcmtfYWNjZXNzZWQoZm9saW8pO1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgcHRlX25vbmUocHRlKSlcbitcdFx0XHRuZWVkX25vX3BhZ2VfdGFibGUgPSB0cnVlO1xuK1x0XHRicmVhaztcbiBcdH1cbi1vdXQ6XG4tXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7XG4tXHRyZXR1cm4gcGFnZTtcbi1ub19wYWdlOlxuLVx0cHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpO1xuLVx0aWYgKCFwdGVfbm9uZShwdGUpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1xuK1x0cHRlX3VubWFwX3VubG9jayhvcmlnX3B0ZXAsIHB0bCk7XG4rXG4rXHRpZiAobnIpXG4rXHRcdHJldHVybiBucjtcbitcdGlmIChuZWVkX25vX3BhZ2VfdGFibGUpXG4rXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwbWRfdCAqcG1kLCBwbWR2YWw7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdGxvbmcgcmV0O1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXG4gXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHJlc3MpO1xuQEAgLTkxMiw3ICsxMDMzLDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcG1kX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRpZiAoIXBtZF9wcmVzZW50KHBtZHZhbCkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKGxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpXG4tXHRcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcbitcdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFxuIFx0aWYgKHBtZF9wcm90bm9uZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuQEAgLTkyNSwyOCArMTA0NiwzNSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdH1cbiBcdGlmICh1bmxpa2VseSghcG1kX2xlYWYocG1kdmFsKSkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXHR9XG4gXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBGT0xMX1NQTElUX1BNRCkpIHtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbiBcdFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MpO1xuIFx0XHQvKiBJZiBwbWQgd2FzIGxlZnQgZW1wdHksIHN0dWZmIGEgcGFnZSB0YWJsZSBpbiB0aGVyZSBxdWlja2x5ICovXG4tXHRcdHJldHVybiBwdGVfYWxsb2MobW0sIHBtZCkgPyBFUlJfUFRSKC1FTk9NRU0pIDpcbi1cdFx0XHRmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBwbWQsIGZsYWdzKTtcbitcdFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IC1FTk9NRU0gOlxuK1x0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0fVxuLVx0cGFnZSA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRyZXQgPSBmb2xsb3dfaHVnZV9wbWQodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdHNwaW5fdW5sb2NrKHB0bCk7XG4tXHRyZXR1cm4gcGFnZTtcbitcbitcdC8qXG4rXHQgKiBUaGUgcmVmIGlzIGFscmVhZHkgaGVsZCwgc28gdGhlIHBhZ2UgY2Fubm90IGdvIGF3YXk6IGZpbGwgdGhlXG4rXHQgKiBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIHBtZCBsb2NrLlxuK1x0ICovXG4rXHRpZiAocmV0IFx1MDAzZSAwIFx1MDAyNlx1MDAyNiBwYWdlcylcbitcdFx0Z3VwX2ZpbGxfcGFnZXModm1hLCBhZGRyZXNzLCBwYWdlc1swXSwgcmV0LCBwYWdlcyk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwNGRfdCAqcDRkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHB1ZF90ICpwdWRwLCBwdWQ7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdGxvbmcgcmV0O1xuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4gXG4gXHRwdWRwID0gcHVkX29mZnNldChwNGRwLCBhZGRyZXNzKTtcbkBAIC05NTUsMjIgKzEwODMsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRcdHJldCA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0aWYgKHBhZ2UpXG4tXHRcdFx0cmV0dXJuIHBhZ2U7XG4rXHRcdC8qXG4rXHRcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxuK1x0XHQgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW9cbitcdFx0ICogY2FuIGJlIHVwIHRvIEhQQUdFX1BVRF9OUiBwYWdlcywgdG9vIGxvbmcgdG8gZmx1c2ggdW5kZXIgYVxuK1x0XHQgKiBzcGlubG9jay5cbitcdFx0ICovXG4rXHRcdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IHBhZ2VzKVxuK1x0XHRcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZXNbMF0sIHJldCwgcGFnZXMpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0fVxuIFx0aWYgKHVubGlrZWx5KHB1ZF9iYWQocHVkKSkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIHB1ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wbWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcDRkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdkcCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcGdkX3QgKnBnZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRwNGRfdCAqcDRkcCwgcDRkO1xuIFxuQEAgLTk4MSwxNSArMTExNiwxOCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcDRkX3ByZXNlbnQocDRkKSB8fCBwNGRfYmFkKHA0ZCkpXG4gXHRcdHJldHVybiBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFxuLVx0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIHA0ZHAsIGZsYWdzLCBwYWdlX21hc2spO1xuK1x0cmV0dXJuIGZvbGxvd19wdWRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcDRkcCwgZmxhZ3MsIHBhZ2VzKTtcbiB9XG4gXG4gLyoqXG4tICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgYSBwYWdlIGRlc2NyaXB0b3IgZnJvbSBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4rICogZm9sbG93X3BhZ2VfbWFzayAtIGxvb2sgdXAgcGFnZXMgYXQgYSB1c2VyLXZpcnR1YWwgYWRkcmVzc1xuICAqIEB2bWE6IHZtX2FyZWFfc3RydWN0IG1hcHBpbmcgQGFkZHJlc3NcbiAgKiBAYWRkcmVzczogdmlydHVhbCBhZGRyZXNzIHRvIGxvb2sgdXBcbisgKiBAZW5kOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RvcCBiYXRjaGluZyBjb250aWd1b3VzIHBhZ2VzXG4gICogQGZsYWdzOiBmbGFncyBtb2RpZnlpbmcgbG9va3VwIGJlaGF2aW91clxuLSAqIEBwYWdlX21hc2s6IGEgcG9pbnRlciB0byBvdXRwdXQgcGFnZV9tYXNrXG4rICogQHBhZ2VzOiBhcnJheSB0byByZWNlaXZlIHRoZSBwYWdlcywgcmVmY291bnRlZCBwZXIgQGZsYWdzLCBvciBOVUxMIHRvXG4rICogICAgICAgICB3YWxrIHRoZSBwYWdlIHRhYmxlcyAoZS5nLiB0byBmYXVsdCBwYWdlcyBpbikgd2l0aG91dCBjb2xsZWN0aW5nXG4rICogICAgICAgICBvciByZWZjb3VudGluZyB0aGVtXG4gICpcbiAgKiBAZmxhZ3MgY2FuIGhhdmUgRk9MTF8gZmxhZ3Mgc2V0LCBkZWZpbmVkIGluIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAgKlxuQEAgLTk5OCwzMyArMTEzNiwzMiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiAgKiB0cmlnZ2VyIGEgZmF1bHQgd2l0aCBGQVVMVF9GTEFHX1VOU0hBUkUgc2V0LiBOb3RlIHRoYXQgdW5zaGFyaW5nIGlzIG9ubHlcbiAgKiByZWxldmFudCB3aXRoIEZPTExfUElOIGFuZCAhRk9MTF9XUklURS5cbiAgKlxuLSAqIE9uIG91dHB1dCwgQHBhZ2VfbWFzayBpcyBzZXQgYWNjb3JkaW5nIHRvIHRoZSBzaXplIG9mIHRoZSBwYWdlLlxuLSAqXG4tICogUmV0dXJuOiB0aGUgbWFwcGVkIChzdHJ1Y3QgcGFnZSAqKSwgJU5VTEwgaWYgbm8gbWFwcGluZyBleGlzdHMsIG9yXG4tICogYW4gZXJyb3IgcG9pbnRlciBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgdG8gc29tZXRoaW5nIG5vdCByZXByZXNlbnRlZFxuLSAqIGJ5IGEgcGFnZSBkZXNjcmlwdG9yIChzZWUgYWxzbyB2bV9ub3JtYWxfcGFnZSgpKS5cbisgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgY29udGlndW91cyBwYWdlcyBzdGFydGluZyBhdCBAYWRkcmVzcyB0aGF0IHdlcmVcbisgKiBwbGFjZWQgaW50byBAcGFnZXMgKGlmIG5vbi1OVUxMKSwgd2hpY2ggbWF5IGJlIGZld2VyIHRoYW4gdGhlIHBhZ2VzXG4rICogcmVxdWVzdGVkIHZpYSBAZW5kOyAwIGlmIG5vIG1hcHBpbmcgZXhpc3RzIGF0IEBhZGRyZXNzOyBvciBhIG5lZ2F0aXZlXG4rICogZXJybm8gZm9yIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkIGJ5IGEgcGFnZSBkZXNjcmlwdG9yXG4rICogKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLlxuICAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHBnZF90ICpwZ2Q7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0bG9uZyByZXQ7XG4gXG4gXHR2bWFfcGd0YWJsZV93YWxrX2JlZ2luKHZtYSk7XG4gXG4tXHQqcGFnZV9tYXNrID0gMDtcbiBcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpO1xuIFxuIFx0aWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKVxuLVx0XHRwYWdlID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbitcdFx0cmV0ID0gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbiBcdGVsc2Vcbi1cdFx0cGFnZSA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIHBnZCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRcdHJldCA9IGZvbGxvd19wNGRfbWFzayh2bWEsIGFkZHJlc3MsIGVuZCwgcGdkLCBmbGFncywgcGFnZXMpO1xuIFxuIFx0dm1hX3BndGFibGVfd2Fsa19lbmQodm1hKTtcbiBcbi1cdHJldHVybiBwYWdlO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIGludCBnZXRfZ2F0ZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG5AQCAtMTM1OCw3ICsxNDk1LDYgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiB7XG4gXHRsb25nIHJldCA9IDAsIGkgPSAwO1xuIFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMO1xuLVx0dW5zaWduZWQgbG9uZyBwYWdlX21hc2sgPSAwO1xuIFxuIFx0aWYgKCFucl9wYWdlcylcbiBcdFx0cmV0dXJuIDA7XG5AQCAtMTM3Myw3ICsxNTA5LDcgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdGRvIHtcbiBcdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4tXHRcdHVuc2lnbmVkIGludCBwYWdlX2luY3JlbTtcbitcdFx0bG9uZyBucjtcbiBcbiBcdFx0LyogZmlyc3QgaXRlcmF0aW9uIG9yIGNyb3NzIHZtYSBib3VuZCAqL1xuIFx0XHRpZiAoIXZtYSB8fCBzdGFydCBcdTAwM2U9IHZtYS1cdTAwM2V2bV9lbmQpIHtcbkBAIC0xNDAwLDggKzE1MzYsMTIgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdFx0XHRwYWdlcyA/IFx1MDAyNnBhZ2UgOiBOVUxMKTtcbiBcdFx0XHRcdGlmIChyZXQpXG4gXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0cGFnZV9tYXNrID0gMDtcbi1cdFx0XHRcdGdvdG8gbmV4dF9wYWdlO1xuK1x0XHRcdFx0Z3VwX2ZpbGxfcGFnZXModm1hLCBzdGFydCwgcGFnZSwgMSxcbitcdFx0XHRcdFx0ICAgICAgIHBhZ2VzID8gcGFnZXMgKyBpIDogTlVMTCk7XG4rXHRcdFx0XHRpKys7XG4rXHRcdFx0XHRzdGFydCArPSBQQUdFX1NJWkU7XG4rXHRcdFx0XHRucl9wYWdlcy0tO1xuK1x0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0fVxuIFxuIFx0XHRcdGlmICghdm1hKSB7XG5AQCAtMTQyMywxMCArMTU2MywxMSBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHR9XG4gXHRcdGNvbmRfcmVzY2hlZCgpO1xuIFxuLVx0XHRwYWdlID0gZm9sbG93X3BhZ2VfbWFzayh2bWEsIHN0YXJ0LCBndXBfZmxhZ3MsIFx1MDAyNnBhZ2VfbWFzayk7XG4tXHRcdGlmICghcGFnZSB8fCBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkspIHtcbitcdFx0bnIgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIHN0YXJ0ICsgbnJfcGFnZXMgKiBQQUdFX1NJWkUsXG4rXHRcdFx0XHQgICAgICBndXBfZmxhZ3MsIHBhZ2VzID8gXHUwMDI2cGFnZXNbaV0gOiBOVUxMKTtcbitcdFx0aWYgKCFuciB8fCBuciA9PSAtRU1MSU5LKSB7XG4gXHRcdFx0cmV0ID0gZmF1bHRpbl9wYWdlKHZtYSwgc3RhcnQsIGd1cF9mbGFncyxcbi1cdFx0XHRcdFx0ICAgUFRSX0VSUihwYWdlKSA9PSAtRU1MSU5LLCBsb2NrZWQpO1xuK1x0XHRcdFx0XHQgICBuciA9PSAtRU1MSU5LLCBsb2NrZWQpO1xuIFx0XHRcdHN3aXRjaCAocmV0KSB7XG4gXHRcdFx0Y2FzZSAwOlxuIFx0XHRcdFx0Z290byByZXRyeTtcbkBAIC0xNDQwLDcwICsxNTgxLDMwIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4gXHRcdFx0QlVHKCk7XG4tXHRcdH0gZWxzZSBpZiAoUFRSX0VSUihwYWdlKSA9PSAtRUVYSVNUKSB7XG4rXHRcdH0gZWxzZSBpZiAobnIgPT0gLUVFWElTVCkge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogUHJvcGVyIHBhZ2UgdGFibGUgZW50cnkgZXhpc3RzLCBidXQgbm8gY29ycmVzcG9uZGluZ1xuIFx0XHRcdCAqIHN0cnVjdCBwYWdlLiBJZiB0aGUgY2FsbGVyIGV4cGVjdHMgKipwYWdlcyB0byBiZVxuIFx0XHRcdCAqIGZpbGxlZCBpbiwgYmFpbCBvdXQgbm93LCBiZWNhdXNlIHRoYXQgY2FuJ3QgYmUgZG9uZVxuLVx0XHRcdCAqIGZvciB0aGlzIHBhZ2UuXG4rXHRcdFx0ICogZm9yIHRoaXMgcGFnZS4gT3RoZXJ3aXNlIGFkdmFuY2UgYnkgdGhlIG9uZSBwYWdlXG4rXHRcdFx0ICogZm9sbG93X3BhZ2VfbWFzaygpIGxvb2tlZCBhdC5cbiBcdFx0XHQgKi9cbiBcdFx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4rXHRcdFx0XHRyZXQgPSBucjtcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbi1cdFx0fSBlbHNlIGlmIChJU19FUlIocGFnZSkpIHtcbi1cdFx0XHRyZXQgPSBQVFJfRVJSKHBhZ2UpO1xuK1x0XHRcdG5yID0gMTtcbitcdFx0fSBlbHNlIGlmIChuciBcdTAwM2MgMCkge1xuK1x0XHRcdHJldCA9IG5yO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4tbmV4dF9wYWdlOlxuLVx0XHRwYWdlX2luY3JlbSA9IDEgKyAofihzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IHBhZ2VfbWFzayk7XG4tXHRcdGlmIChwYWdlX2luY3JlbSBcdTAwM2UgbnJfcGFnZXMpXG4tXHRcdFx0cGFnZV9pbmNyZW0gPSBucl9wYWdlcztcbi1cbi1cdFx0aWYgKHBhZ2VzKSB7XG4tXHRcdFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4tXHRcdFx0dW5zaWduZWQgaW50IGo7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBUaGlzIG11c3QgYmUgYSBsYXJnZSBmb2xpbyAoYW5kIGRvZXNuJ3QgbmVlZCB0b1xuLVx0XHRcdCAqIGJlIHRoZSB3aG9sZSBmb2xpbzsgaXQgY2FuIGJlIHBhcnQgb2YgaXQpLCBkb1xuLVx0XHRcdCAqIHRoZSByZWZjb3VudCB3b3JrIGZvciBhbGwgdGhlIHN1YnBhZ2VzIHRvby5cbi1cdFx0XHQgKlxuLVx0XHRcdCAqIE5PVEU6IGhlcmUgdGhlIHBhZ2UgbWF5IG5vdCBiZSB0aGUgaGVhZCBwYWdlXG4tXHRcdFx0ICogZS5nLiB3aGVuIHN0YXJ0IGFkZHIgaXMgbm90IHRocC1zaXplIGFsaWduZWQuXG4tXHRcdFx0ICogdHJ5X2dyYWJfZm9saW8oKSBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRhaWxcbi1cdFx0XHQgKiBwYWdlcy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocGFnZV9pbmNyZW0gXHUwMDNlIDEpIHtcbi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHRcdFx0Lypcbi1cdFx0XHRcdCAqIFNpbmNlIHdlIGFscmVhZHkgaG9sZCByZWZjb3VudCBvbiB0aGVcbi1cdFx0XHRcdCAqIGxhcmdlIGZvbGlvLCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLlxuLVx0XHRcdFx0ICovXG4tXHRcdFx0XHRpZiAodHJ5X2dyYWJfZm9saW8oZm9saW8sIHBhZ2VfaW5jcmVtIC0gMSxcbi1cdFx0XHRcdFx0XHQgICBndXBfZmxhZ3MpKSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIFJlbGVhc2UgdGhlIDFzdCBwYWdlIHJlZiBpZiB0aGVcbi1cdFx0XHRcdFx0ICogZm9saW8gaXMgcHJvYmxlbWF0aWMsIGZhaWwgaGFyZC5cbi1cdFx0XHRcdFx0ICovXG4tXHRcdFx0XHRcdGd1cF9wdXRfZm9saW8oZm9saW8sIDEsIGd1cF9mbGFncyk7XG4tXHRcdFx0XHRcdHJldCA9IC1FRkFVTFQ7XG4tXHRcdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbi1cbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYWdlX2luY3JlbTsgaisrKSB7XG4tXHRcdFx0XHRzdWJwYWdlID0gcGFnZSArIGo7XG4tXHRcdFx0XHRwYWdlc1tpICsgal0gPSBzdWJwYWdlO1xuLVx0XHRcdFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgc3RhcnQgKyBqICogUEFHRV9TSVpFKTtcbi1cdFx0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xuLVx0XHRcdH1cbi1cdFx0fVxuK1x0XHQvKiBDaGVjayB0aGF0IHdlIGRpZG4ndCBwaW4gbW9yZSBwYWdlcyB0aGFuIHRoZSBjYWxsZXIgd2lsbCBmcmVlLiAqL1xuK1x0XHRWTV9XQVJOX09OX09OQ0UobnIgXHUwMDNlIG5yX3BhZ2VzKTtcbiBcbi1cdFx0aSArPSBwYWdlX2luY3JlbTtcbi1cdFx0c3RhcnQgKz0gcGFnZV9pbmNyZW0gKiBQQUdFX1NJWkU7XG4tXHRcdG5yX3BhZ2VzIC09IHBhZ2VfaW5jcmVtO1xuK1x0XHRpICs9IG5yO1xuK1x0XHRzdGFydCArPSBuciAqIFBBR0VfU0laRTtcbitcdFx0bnJfcGFnZXMgLT0gbnI7XG4gXHR9IHdoaWxlIChucl9wYWdlcyk7XG4gb3V0OlxuIFx0cmV0dXJuIGkgPyBpIDogcmV0O1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MTMuMTE2MjgzMDc2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzQ5ODY5MDA0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipHVVAgUmVmYWN0b3JpbmcgYW5kIEZ1enppbmcgQ29uc2lkZXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIlllcywgdGhpcyBwYXRjaCBzZXJpZXMgd2FycmFudHMgYSB0aG9yb3VnaCBsb29rIGZvciBmdXp6aW5nIHBvdGVudGlhbC5cIiBUaGlzIHBhdGNoIGlzIGNsZWFybHkgdG91Y2hpbmcgdGhlIEdVUCAoR2V0IFVzZXIgUGFnZXMpIGNvZGUsIHNwZWNpZmljYWxseSBgbW0vZ3VwLmNgLCBhbmQgdGhhdCdzIGEgcmVkIGZsYWcgaW4gYSBnb29kIHdheSwgbWVhbmluZyBpdOKAmXMgYSBoaWdoLWltcGFjdCBhcmVhLiBUaGlzIGlzbid0IHNvbWUgbWlub3IgdHdlYWs7IGl0J3MgYSBmdW5kYW1lbnRhbCByZWZhY3RvcmluZyBvZiBob3cgR1VQIHdvcmtzLiBUaGV5J3JlIGNoYW5naW5nIHRoZSByZXR1cm4gdmFsdWVzIGFuZCBwb3B1bGF0aW9uIG9mIHRoZSBgcGFnZXNgIGFycmF5LCB3aGljaCBpbiB0dXJuIG1lYW5zIHRoZSBjb3JlIGxvZ2ljIGZvciB0cmFuc2xhdGluZyB1c2VyIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHBoeXNpY2FsIHBhZ2VzIGlzIGJlaW5nIG1vZGlmaWVkLiBXZSBuZWVkIHRvIGFzc2VzcyB0aGUgZnV6emluZyBhdHRhY2sgc3VyZmFjZS5cblxuVGhleSdyZSB0YWtpbmcgYHN0cnVjdCBwYWdlICpgIGFuZCBgcGFnZV9tYXNrYCBhbmQgbW92aW5nIHRvIHJldHVybmluZyBhIGBsb25nYCB2YWx1ZSAoY291bnQgb2YgcGFnZXMgb3IgZXJyb3IpIGFuZCBkaXJlY3RseSBmaWxsaW5nIHRoZSBgcGFnZXNgIGFycmF5LiBBIHNlcmlvdXMgY2hhbmdlIHRvIGEgZnVuZGFtZW50YWwgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIGxpa2UgdGhpcyBkZW1hbmRzIHNjcnV0aW55LiBJdCdzIGEgZnVuZGFtZW50YWwgc2hpZnQgaW4gdGhlICp3YXkqIHdlIGdldCB1c2VyIHBhZ2VzLlxuXG5Mb29raW5nIGF0IHRoZSBjaGFuZ2VkIGZ1bmN0aW9ucy4uLiB5ZWFoLCB0aGlzIGlzIHNpZ25pZmljYW50OiBgbm9fcGFnZV90YWJsZWAsIGBndXBfZmlsbF9wYWdlc2AsIGBmb2xsb3dfaHVnZV9wdWRgLCBgZm9sbG93X2h1Z2VfcG1kYCwgdGhlIG5ldyBjb21taXQgZnVuY3Rpb25zLCBhbmQgb2YgY291cnNlLCB0aGUgbWFzayBmdW5jdGlvbnMuIFRoaXMgaXMgR1VQIGxvZ2ljLCB0b3VjaGluZyBzZXZlcmFsIGtleSBjb21wb25lbnRzIG9mIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQuXG5cblNvLCB0aGUgbmV4dCBzdGVwIGlzIHRvIG5haWwgZG93biB0aGUgbW9zdCBjcml0aWNhbCBmdW5jdGlvbnMgZm9yIGZ1enppbmcuIGBfX2dldF91c2VyX3BhZ2VzYCBtaWdodCBiZSB0b28gZ2VuZXJhbCwgYnV0IGBmb2xsb3dfcGFnZV9tYXNrYCwgYGZvbGxvd19wYWdlX3B0ZWAsIGBmb2xsb3dfcG1kX21hc2tgLCBgZm9sbG93X3B1ZF9tYXNrYCwgYW5kIGBmb2xsb3dfcDRkX21hc2tgIGFsbCBsb29rIGxpa2UgcHJpbWUgdGFyZ2V0cy4gVGhlIG1hc2sgZnVuY3Rpb25zIGFyZSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcgYmVjYXVzZSB0aGV5IGRlYWwgd2l0aCB2YXJpb3VzIHBhZ2UgdGFibGUgbGV2ZWxzLCBhbmQgc3VidGxlIGVycm9ycyBpbiB0aG9zZSBjYW4gbGVhZCB0byBzaWduaWZpY2FudCBpc3N1ZXMuXG5cbkZpbmFsbHksIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gU2luY2UgdGhlIHBhdGNoIGlzIGluIGBtbS9ndXAuY2AsIHRoZSBjb2RlIHdpbGwgYWx3YXlzIGJlIGNvbXBpbGVkLCBob3dldmVyIHNvbWUgcGFydHMgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdW5kZXIgYENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU2AgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIHNob3VsZCBwdWxsIHVwIHRoZSB0cmVlIGFuZCBjaGVjay5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEwODksIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NzYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NToyMC42MTQ5NzYzMjlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU2MDk4MTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTYzNj1zdGF0aWMgdm9pZCBndXBfZmlsbF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0vZ3VwLmMtNjUyLVxcbm1tL2d1cC5jOjY1MzojaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxubW0vZ3VwLmMtNjU0LS8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQVURzIGluIENPVyBtYXBwaW5ncy4gKi9cXG4tLVxcbm1tL2d1cC5jPTcyMz1zdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy03NzItXFxubW0vZ3VwLmM6NzczOiNlbHNlICAvKiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMgKi9cXG5tbS9ndXAuYy03NzQtc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vZ3VwLmM9NzgxPXN0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTc4Ni19XFxubW0vZ3VwLmM6Nzg3OiNlbmRpZlxcdC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xcbm1tL2d1cC5jLTc4OC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MjAuNjYwNTk5OTk1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUwMzU0MTgwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlcyoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW4uIEZpcnN0IG9yZGVyIG9mIGJ1c2luZXNzOiBJIG5lZWQgdG8gdmVyaWZ5IHRoZSBzdGF0dXMgb2YgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAuIFRoaXMgaXMgZnVuZGFtZW50YWwuIERlcGVuZGluZyBvbiB3aGV0aGVyIGl0J3MgZW5hYmxlZCBvciBub3QsIGl0IGRpY3RhdGVzIGEgaHVnZSBzd2F0aCBvZiB0aGUga2VybmVsJ3MgbWVtb3J5IG1hbmFnZW1lbnQgYmVoYXZpb3IsIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcywgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBzdWJzeXN0ZW1zLiBJIG5lZWQgdG8ga25vdyB3aGVyZSB3ZSBzdGFuZC4gQSBxdWljayBjaGVjayBvZiB0aGUgY29uZmlndXJhdGlvbiBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbCBiZWZvcmUgcHJvY2VlZGluZy4gQXJlIFRIUHMgZW5hYmxlZCBvciBpcyB0aGVyZSBzb21ldGhpbmcgZWxzZSBnb2luZyBvbj9cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzODgsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NToyNC4xNjQxNDM2NDJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ2MjYyMTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTcyMz1zdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy03NTktXFxubW0vZ3VwLmM6NzYwOiNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9ndXAuYy03NjEtXFx0aWYgKHBtZF90cmFuc19odWdlKHBtZHZhbCkgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgRk9MTF9UT1VDSCkpXFxubW0vZ3VwLmMtNzYyLVxcdFxcdHRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCwgZmxhZ3MgXFx1MDAyNiBGT0xMX1dSSVRFKTtcXG5tbS9ndXAuYzo3NjM6I2VuZGlmXFx0LyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXFxubW0vZ3VwLmMtNzY0LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NToyNC4yMDg3NzgzMjhaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTM5MjY2MzQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV4YW1pbmluZyBIdWdlIFBhZ2UgQ29uZmlndXJhdGlvbiBmb3IgR1VQIFRlc3RpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjb25maWd1cmF0aW9ucyBhbmQgdGhpbmtpbmcsIFwiWWVwLCB0aGVzZSBhcmUgZGVmaW5pdGVseSB0aGUgcmlnaHQgc2V0dGluZ3MgdG8gaGF2ZSBlbmFibGVkIHdoZW4gdGVzdGluZyBodWdlIHBhZ2VzIGluIEdVUC5cIiBJdCdzIGdvb2QgdG8gYmUgbWV0aWN1bG91cyBhYm91dCB0aGlzIHN0dWZmLiAqVFJBTlNQQVJFTlRfSFVHRVBBR0UqIGlzIGEgZ2l2ZW47IHRoYXQncyB0aGUgYnJlYWQgYW5kIGJ1dHRlciBmb3IgdHJhbnNwYXJlbnQgaHVnZSBwYWdlIHN1cHBvcnQsIG5vIHN1cnByaXNlcyB0aGVyZS4gTm93LCAqUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVMqIGlzIHRoZSBtb3JlIGludGVyZXN0aW5nIG9uZS4gVGhhdCdzIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQsIHNvIEkgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgY2FuIGVuYWJsZSB0aGlzIG9uZSBkaXJlY3RseSwgb3IgaWYgdGhlIGFyY2hpdGVjdHVyZSB3aWxsIHNlbGVjdCB0aGlzIGl0c2VsZi4gSSdtIGdvaW5nIHRvIGRpZyBhIGxpdHRsZSBkZWVwZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNzU1LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MjguNzQ4MDQ3MTE5WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2OTM2MDAyNzIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MTAwOD1jb25maWcgUEFHRV9NQVBDT1VOVFxcbi0tXFxubW0vS2NvbmZpZy0xMDEzLSNcXG5tbS9LY29uZmlnOjEwMTQ6Y29uZmlnIFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxubW0vS2NvbmZpZy0xMDE1LVxcdGRlZl9ib29sIFRSQU5TUEFSRU5UX0hVR0VQQUdFIHx8IEhVR0VUTEJfUEFHRVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTozMS40NDE2NTYzN1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MTk0MjQ0MDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgSHVnZSBQYWdlcyoqXG5cbk9rYXksIHNvIEkgc2VlIHRoYXQgYFBHVEFCTEVfSEFTX0hVR0VfTEVBVkVTYCBpcyBkZWZpbmVkIGFzIGVpdGhlciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIG9yIGBIVUdFVExCX1BBR0VgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IGl0J3MgYSBsb2dpY2FsIGNvbm5lY3Rpb24uIENvbnNpZGVyaW5nIHRoaXMsIHRoZSBvYnZpb3VzIGFwcHJvYWNoIGlzIHRvIG1ha2Ugc3VyZSAqYm90aCogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYEhVR0VUTEJfUEFHRWAgYXJlIGVuYWJsZWQuIEl0J3MgdGhlIG1vc3Qgcm9idXN0IHNvbHV0aW9uLiBMZXQncyBkaWcgaW50byB0aGUgYEhVR0VUTEJfUEFHRWAgb3B0aW9uIGluIHRoZSBLY29uZmlnIGZpbGUgYW5kIHZlcmlmeSBpdHMgc3RhdHVzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3MgaW4gcGxhY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMDk4LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MzQuOTYxMDgzMzE2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODI3NDQ5NjYxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBIVUdFVExCX1BBR0VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9zaC9tbS9LY29uZmlnPTE1OD1jaG9pY2VcXG4tLVxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNjMtXFxuYXJjaC9zaC9tbS9LY29uZmlnOjE2NDpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRLXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2NS1cXHRib29sIFxcXCI2NGtCXFxcIlxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2Ny1cXG5hcmNoL3NoL21tL0tjb25maWc6MTY4OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8yNTZLXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2OS1cXHRib29sIFxcXCIyNTZrQlxcXCJcXG4tLVxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzEtXFxuYXJjaC9zaC9tbS9LY29uZmlnOjE3Mjpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfMU1CXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3My1cXHRib29sIFxcXCIxTUJcXFwiXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3NC1cXG5hcmNoL3NoL21tL0tjb25maWc6MTc1OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV80TUJcXG5hcmNoL3NoL21tL0tjb25maWctMTc2LVxcdGJvb2wgXFxcIjRNQlxcXCJcXG4tLVxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzgtXFxuYXJjaC9zaC9tbS9LY29uZmlnOjE3OTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRNQlxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xODAtXFx0Ym9vbCBcXFwiNjRNQlxcXCJcXG4tLVxcbmZzL0tjb25maWc9MjYyPWlmIEhVR0VUTEJGU1xcbmZzL0tjb25maWc6MjYzOmNvbmZpZyBIVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUF9ERUZBVUxUX09OXFxuZnMvS2NvbmZpZy0yNjQtXFx0Ym9vbCBcXFwiSHVnZVRMQiBWbWVtbWFwIE9wdGltaXphdGlvbiAoSFZPKSBkZWZhdWx0cyB0byBvblxcXCJcXG4tLVxcbmZzL0tjb25maWc9MjcxPWVuZGlmICMgSFVHRVRMQkZTXFxuZnMvS2NvbmZpZy0yNzItXFxuZnMvS2NvbmZpZzoyNzM6Y29uZmlnIEhVR0VUTEJfUEFHRVxcbmZzL0tjb25maWctMjc0LVxcdGRlZl9ib29sIEhVR0VUTEJGU1xcbi0tXFxuZnMvS2NvbmZpZy0yNzYtXFxuZnMvS2NvbmZpZzoyNzc6Y29uZmlnIEhVR0VUTEJfUEFHRV9PUFRJTUlaRV9WTUVNTUFQXFxuZnMvS2NvbmZpZy0yNzgtXFx0ZGVmX2Jvb2wgSFVHRVRMQl9QQUdFXFxuLS1cXG5tbS9LY29uZmlnPTcwNj1jb25maWcgQVJDSF9FTkFCTEVfVEhQX01JR1JBVElPTlxcbi0tXFxubW0vS2NvbmZpZy03MDgtXFxubW0vS2NvbmZpZzo3MDk6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFX1ZBUklBQkxFXFxubW0vS2NvbmZpZy03MTAtXFx0ZGVmX2Jvb2wgblxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTozNi43ODg1Mzk3MDdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzE3Nzk3NjM2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFbmFibGluZyBIdWdlIFBhZ2VzIGFuZCB0aGUgRmlsZXN5c3RlbSoqXG5cbk9rYXksIHNvIGBIVUdFVExCX1BBR0VgIGlzIGRlZmluZWQgYXMgYSBib29sZWFuIChgZGVmX2Jvb2xgKSBhbmQgbGlua2VkIGRpcmVjdGx5IHRvIGBIVUdFVExCRlNgLiBUaGlzIHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZDogSWYgd2Ugd2FudCB0byB1c2UgaHVnZSBwYWdlcywgd2UgZGVmaW5pdGVseSBuZWVkIHRoZSBodWdlIHBhZ2UgZmlsZXN5c3RlbSAoYEhVR0VUTEJGU2ApIGVuYWJsZWQuIEl0J3MgYSBkZXBlbmRlbmN5LiBNYWtlcyBzZW5zZS5cblxuTm93LCBsZXQncyBqdXN0IGNvbmZpcm0gc29tZXRoaW5nIGFib3V0IGhvdyB0cmFuc3BhcmVudCBodWdlIHBhZ2VzIGFyZSBoYW5kbGVkLiBMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIChgS2NvbmZpZ2ApIGFuZCBzZWUgaG93IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgc2V0IHVwIGluIHJlbGF0aW9uIHRvIGFsbCB0aGlzLiBJJ2xsIG5lZWQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBjb25zaXN0ZW50IGFuZCB0aGF0IHdlJ3JlIGNvdmVyaW5nIGFsbCBvdXIgYmFzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzOTMwLCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6MzkuOTY2NTE4NzY5WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjIyMzQ4MzIyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTg0Mz1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODQ1LVxcbm1tL0tjb25maWc6ODQ2Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTg0Ny1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NjQ9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg2OS1cXG5tbS9LY29uZmlnOjg3MDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NzEtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzYtXFxubW0vS2NvbmZpZzo4Nzc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg3OC1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04ODUtXFxubW0vS2NvbmZpZzo4ODY6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04ODctXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg5Mz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTAyLVxcbm1tL0tjb25maWc6OTAzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05MDQtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkxMi1cXG5tbS9LY29uZmlnOjkxMzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkxNC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkyMC1cXG5tbS9LY29uZmlnOjkyMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTIyLVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MjgtXFxubW0vS2NvbmZpZzo5Mjk6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MzAtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05Mzg9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTk0Ny1cXG5tbS9LY29uZmlnOjk0ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTQ5LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTYtXFxubW0vS2NvbmZpZzo5NTc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NTgtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjQtXFxubW0vS2NvbmZpZzo5NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk2Ni1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTcyLVxcbm1tL0tjb25maWc6OTczOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTc0LVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6NDEuNTg4ODcxNTgxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwNTE3MDUyMTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBIYW5kbGluZyBmb3IgT3B0aW1pemF0aW9uKipcblxuT2theSwgc28gdGhlIGluaXRpYWwgdGhvdWdodCBpcyB0byBlbmFibGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYEhVR0VUTEJGU2AuIFRoYXQgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0J3MgZHJpbGwgZG93biBpbnRvIHRoZSBrZXJuZWwgZnVuY3Rpb25zIGludm9sdmVkIGluIGhhbmRsaW5nIHRoZXNlIHBhZ2VzLiBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhpcyBhcmVhIGZvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLlxuXG5NeSBpbml0aWFsIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBsb29rIGF0IHRoZSB2YXJpb3VzIGBmb2xsb3dfKmAgZnVuY3Rpb25zIGFuZCBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucy5cblxuSG9sZCBvbiBhIG1vbWVudCwgYSBkZWVwZXIgbG9vayBhdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlcywgcmV2ZWFscyB0aGF0IGBmb2xsb3dfb25lX3B0ZWAsIGBmb2xsb3dfcHRlX2JhdGNoYCwgYGZvbGxvd19wYWdlX3B0ZV9jb21taXRgLCBgZ3VwX2ZpbGxfcGFnZXNgLCBhbmQgYG5vX3BhZ2VfdGFibGVgIGFyZSBhbGwgKnN0YXRpYyogZnVuY3Rpb25zLiBUaGF0IG1ha2VzIG1lIHdvbmRlciBpZiB0aGV5J3JlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyLiBMZXQncyBjaGVjay5cblxuSXQgbG9va3MgbGlrZSB0aGUgY29tcGlsZXIgaXNuJ3QgaW5saW5pbmcgdGhlbS4gVGhleSdyZSBhbGwgc3RhdGljLCBidXQgbm90IGlubGluZS4gTm93LCBJIHNlZSB0aGUgcHJvbXB0J3MgaW5zdHJ1Y3Rpb246IFwiUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLlwiIFRoaXMgbWVhbnMgdGhlIGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgKm5vbi1zdGF0aWMqIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlc2UgaW50ZXJuYWwgaGVscGVycy4gVGhpcyBpcyBhIGNydWNpYWwgZGlzdGluY3Rpb24uIFdlIHdhbnQgdGhlIHN0YWJsZSwgd2VsbC1kZWZpbmVkIGVudHJ5IHBvaW50cywgbm90IHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuXG5TaW5jZSBgX19nZXRfdXNlcl9wYWdlc2AgaXMgc3RhdGljLCBteSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB3aGF0IGNhbGxzIGl0LiBUaGF0J3MgdGhlIGNvcnJlY3QgcGF0aCB0byBmaW5kaW5nIGEgbm9uLXN0YXRpYyBBUEkgZW50cnkgcG9pbnQuIFRoaXMgaXMgdGhlIHBhdGggdG8gcHVyc3VlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDg2MSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTo0OC42NDA1ODA3MTJaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4MjAxOTg5MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX2dldF91c2VyX3BhZ2VzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTkyOT1zdGF0aWMgdW5zaWduZWQgbG9uZyBmb2xsb3dfcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vZ3VwLmMtOTUzLSAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0XFxubW0vZ3VwLmM6OTU0OiAqIGlzIGEgc2hvcnQgcmVhZDsgX19nZXRfdXNlcl9wYWdlcygpIHJldHJ5aW5nIHRoZSByZWFkIHdpbGwgZ2V0IHRoZSBlcnJvci5cXG5tbS9ndXAuYy05NTUtICovXFxuLS1cXG5tbS9ndXAuYz0xNDAyPXN0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmd1cF92bWFfbG9va3VwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0vZ3VwLmMtMTQzNy0vKipcXG5tbS9ndXAuYzoxNDM4OiAqIF9fZ2V0X3VzZXJfcGFnZXMoKSAtIHBpbiB1c2VyIHBhZ2VzIGluIG1lbW9yeVxcbm1tL2d1cC5jLTE0MzktICogQG1tOlxcdFxcdG1tX3N0cnVjdCBvZiB0YXJnZXQgbW1cXG4tLVxcbm1tL2d1cC5jLTE0NjAtICpcXG5tbS9ndXAuYzoxNDYxOiAqIF9fZ2V0X3VzZXJfcGFnZXMgd2Fsa3MgYSBwcm9jZXNzJ3MgcGFnZSB0YWJsZXMgYW5kIHRha2VzIGEgcmVmZXJlbmNlIHRvXFxubW0vZ3VwLmMtMTQ2Mi0gKiBlYWNoIHN0cnVjdCBwYWdlIHRoYXQgZWFjaCB1c2VyIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gYXQgYSBnaXZlblxcbi0tXFxubW0vZ3VwLmMtMTQ2Ni0gKiBUaGlzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBwYWdlIGV4aXN0cyBpbiB0aGUgdXNlciBtYXBwaW5ncyB3aGVuXFxubW0vZ3VwLmM6MTQ2NzogKiBfX2dldF91c2VyX3BhZ2VzIHJldHVybnMsIGFuZCB0aGVyZSBtYXkgZXZlbiBiZSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50XFxubW0vZ3VwLmMtMTQ2OC0gKiBwYWdlIHRoZXJlIGluIHNvbWUgY2FzZXMgKGVnLiBpZiBtbWFwcGVkIHBhZ2VjYWNoZSBoYXMgYmVlbiBpbnZhbGlkYXRlZFxcbi0tXFxubW0vZ3VwLmMtMTQ4Ny0gKiBJbiBtb3N0IGNhc2VzLCBnZXRfdXNlcl9wYWdlcyBvciBnZXRfdXNlcl9wYWdlc19mYXN0IHNob3VsZCBiZSB1c2VkXFxubW0vZ3VwLmM6MTQ4ODogKiBpbnN0ZWFkIG9mIF9fZ2V0X3VzZXJfcGFnZXMuIF9fZ2V0X3VzZXJfcGFnZXMgc2hvdWxkIGJlIHVzZWQgb25seSBpZlxcbm1tL2d1cC5jLTE0ODktICogeW91IG5lZWQgc29tZSBzcGVjaWFsIEBndXBfZmxhZ3MuXFxubW0vZ3VwLmMtMTQ5MC0gKi9cXG5tbS9ndXAuYzoxNDkxOnN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0vZ3VwLmMtMTQ5Mi1cXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vZ3VwLmM9MTcyNj1zdGF0aWMgYm9vbCBndXBfc2lnbmFsX3BlbmRpbmcodW5zaWduZWQgaW50IGZsYWdzKVxcbi0tXFxubW0vZ3VwLmMtMTc0Ni0gKlxcbm1tL2d1cC5jOjE3NDc6ICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uLCB1bmxpa2UgX19nZXRfdXNlcl9wYWdlcygpLCB3aWxsIG5vdCByZXR1cm4gMFxcbm1tL2d1cC5jLTE3NDgtICogZm9yIG5yX3BhZ2VzIFxcdTAwM2UgMCwgdW5sZXNzIEZPTExfTk9XQUlUIGlzIHVzZWQuXFxubW0vZ3VwLmMtMTc0OS0gKi9cXG5tbS9ndXAuYzoxNzUwOnN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9ndXAuYy0xNzUxLVxcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuLS1cXG5tbS9ndXAuYy0xNzkyLVxcdGZvciAoOzspIHtcXG5tbS9ndXAuYzoxNzkzOlxcdFxcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZmxhZ3MsIHBhZ2VzLFxcbm1tL2d1cC5jLTE3OTQtXFx0XFx0XFx0XFx0ICAgICAgIGxvY2tlZCk7XFxuLS1cXG5tbS9ndXAuYy0xODUyLVxcdFxcdCpsb2NrZWQgPSAxO1xcbm1tL2d1cC5jOjE4NTM6XFx0XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIDEsIGZsYWdzIHwgRk9MTF9UUklFRCxcXG5tbS9ndXAuYy0xODU0LVxcdFxcdFxcdFxcdCAgICAgICBwYWdlcywgbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE5NjAtXFx0ICovXFxubW0vZ3VwLmM6MTk2MTpcXHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgbnJfcGFnZXMsIGd1cF9mbGFncyxcXG5tbS9ndXAuYy0xOTYyLVxcdFxcdFxcdCAgICAgICBOVUxMLCBsb2NrZWQgPyBsb2NrZWQgOiBcXHUwMDI2bG9jYWxfbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jLTE5NzktICogUmV0dXJucyBlaXRoZXIgbnVtYmVyIG9mIHByb2Nlc3NlZCBwYWdlcyBpbiB0aGUgTU0sIG9yIGEgbmVnYXRpdmUgZXJyb3JcXG5tbS9ndXAuYzoxOTgwOiAqIGNvZGUgb24gZXJyb3IgKHNlZSBfX2dldF91c2VyX3BhZ2VzKCkpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXBvcnRzXFxubW0vZ3VwLmMtMTk4MS0gKiBlcnJvcnMgcmVsYXRlZCB0byBWTUFzLCBzdWNoIGFzIGluY29tcGF0aWJsZSBtYXBwaW5ncywgYXMgZXhwZWN0ZWQgYnlcXG4tLVxcbm1tL2d1cC5jPTE5ODg9bG9uZyBmYXVsdGluX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuLS1cXG5tbS9ndXAuYy0yMDEyLVxcbm1tL2d1cC5jOjIwMTM6XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgTlVMTCwgbG9ja2VkLFxcbm1tL2d1cC5jLTIwMTQtXFx0XFx0XFx0XFx0ICAgICAgZ3VwX2ZsYWdzKTtcXG4tLVxcbm1tL2d1cC5jPTIwMjY9aW50IF9fbW1fcG9wdWxhdGUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sIGludCBpZ25vcmVfZXJyb3JzKVxcbi0tXFxubW0vZ3VwLmMtMjA3OS0jZWxzZSAvKiBDT05GSUdfTU1VICovXFxubW0vZ3VwLmM6MjA4MDpzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG5tbS9ndXAuYy0yMDgxLVxcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuLS1cXG5tbS9ndXAuYz0yMjg4PXN0cnVjdCBwYWdlICpnZXRfZHVtcF9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50ICpsb2NrZWQpXFxuLS1cXG5tbS9ndXAuYy0yMjkyLVxcbm1tL2d1cC5jOjIyOTM6XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoY3VycmVudC1cXHUwMDNlbW0sIGFkZHIsIDEsIFxcdTAwMjZwYWdlLCBsb2NrZWQsXFxubW0vZ3VwLmMtMjI5NC1cXHRcXHRcXHRcXHQgICAgICBGT0xMX0ZPUkNFIHwgRk9MTF9EVU1QIHwgRk9MTF9HRVQpO1xcbi0tXFxubW0vZ3VwLmM9MjQyMj1taWdyYXRlX2xvbmd0ZXJtX3VucGlubmFibGVfZm9saW9zKHN0cnVjdCBsaXN0X2hlYWQgKm1vdmFibGVfZm9saW9fbGlzdCxcXG4tLVxcbm1tL2d1cC5jLTI0NTAtXFx0XFx0ICogV2UgY2FuJ3QgbWlncmF0ZSBmb2xpb3Mgd2l0aCB1bmV4cGVjdGVkIHJlZmVyZW5jZXMsIHNvIGRyb3BcXG5tbS9ndXAuYzoyNDUxOlxcdFxcdCAqIHRoZSByZWZlcmVuY2Ugb2J0YWluZWQgYnkgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoKS5cXG5tbS9ndXAuYy0yNDUyLVxcdFxcdCAqIE1pZ3JhdGluZyBmb2xpb3MgaGF2ZSBiZWVuIGFkZGVkIHRvIG1vdmFibGVfZm9saW9fbGlzdCBhZnRlclxcbi0tXFxubW0vZ3VwLmM9MjU1NT1zdGF0aWMgbG9uZyBjaGVja19hbmRfbWlncmF0ZV9tb3ZhYmxlX2ZvbGlvcyh1bnNpZ25lZCBsb25nIG5yX2ZvbGlvcyxcXG4tLVxcbm1tL2d1cC5jLTI1NjItLypcXG5tbS9ndXAuYzoyNTYzOiAqIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZCgpIGlzIGEgd3JhcHBlciBmb3IgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQgd2hpY2hcXG5tbS9ndXAuYy0yNTY0LSAqIGFsbG93cyB1cyB0byBwcm9jZXNzIHRoZSBGT0xMX0xPTkdURVJNIGZsYWcuXFxuLS1cXG5tbS9ndXAuYz0yNTY2PXN0YXRpYyBsb25nIF9fZ3VwX2xvbmd0ZXJtX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2d1cC5jLTI1NzYtXFx0aWYgKCEoZ3VwX2ZsYWdzIFxcdTAwMjYgRk9MTF9MT05HVEVSTSkpXFxubW0vZ3VwLmM6MjU3NzpcXHRcXHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgcGFnZXMsXFxubW0vZ3VwLmMtMjU3OC1cXHRcXHRcXHRcXHRcXHQgICAgICAgbG9ja2VkLCBndXBfZmxhZ3MpO1xcbi0tXFxubW0vZ3VwLmMtMjU4MS1cXHRkbyB7XFxubW0vZ3VwLmM6MjU4MjpcXHRcXHRucl9waW5uZWRfcGFnZXMgPSBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChtbSwgc3RhcnQsIG5yX3BhZ2VzLFxcbm1tL2d1cC5jLTI1ODMtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBwYWdlcywgbG9ja2VkLFxcbi0tXFxubW0vZ3VwLmM9MjcwND1sb25nIGdldF91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2d1cC5jLTI3MTQtXFxubW0vZ3VwLmM6MjcxNTpcXHRyZXR1cm4gX19nZXRfdXNlcl9wYWdlc19sb2NrZWQobW0sIHN0YXJ0LCBucl9wYWdlcywgcGFnZXMsXFxubW0vZ3VwLmMtMjcxNi1cXHRcXHRcXHRcXHQgICAgICAgbG9ja2VkID8gbG9ja2VkIDogXFx1MDAyNmxvY2FsX2xvY2tlZCxcXG4tLVxcbm1tL2d1cC5jPTI3NDU9bG9uZyBnZXRfdXNlcl9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vZ3VwLmMtMjc1Mi1cXG5tbS9ndXAuYzoyNzUzOlxcdHJldHVybiBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChjdXJyZW50LVxcdTAwM2VtbSwgc3RhcnQsIG5yX3BhZ2VzLCBwYWdlcyxcXG5tbS9ndXAuYy0yNzU0LVxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2bG9ja2VkLCBndXBfZmxhZ3MpO1xcbi0tXFxubW0vZ3VwLmM9Mjc3Mz1sb25nIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9ndXAuYy0yNzgxLVxcbm1tL2d1cC5jOjI3ODI6XFx0cmV0dXJuIF9fZ2V0X3VzZXJfcGFnZXNfbG9ja2VkKGN1cnJlbnQtXFx1MDAzZW1tLCBzdGFydCwgbnJfcGFnZXMsIHBhZ2VzLFxcbm1tL2d1cC5jLTI3ODMtXFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZsb2NrZWQsIGd1cF9mbGFncyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU1OjQ4LjkyMjYwNTgzM1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NzA3NjkzOTM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBVc2VyIFBhZ2UgRmF1bHRzKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGVzZSB1c2VyIHBhZ2UgZnVuY3Rpb25zLiBNeSBwcmltYXJ5IGVudHJ5IHBvaW50cyBoZXJlIHNlZW0gdG8gYmUgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgLCBhbmQgYGdldF9kdW1wX3BhZ2VgLiBJJ20gc3RhcnRpbmcgdG8gdGhpbmsgYGdldF91c2VyX3BhZ2VzYCBpcyBhICp2ZXJ5KiBob3QgcGF0aCDigJMgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhpdHRpbmcgdGhhdC4gTGV0IG1lIGxvb2sgYXQgc29tZSBvZiB0aGUgc3lzY2FsbHMgdG8gdW5kZXJzdGFuZCBob3cgdGhvc2UgcGF0aHMgYXJlIHRvdWNoZWQuXG5cbkFscmlnaHQsIGBtbWFwYCB3aXRoIGBNQVBfUE9QVUxBVEVgIHdpbGwgY2xlYXJseSBoaXQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYC4gYG1sb2NrYCB0cmlnZ2VycyBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgbWFrZXMgc2Vuc2UgZm9yIHByZXZlbnRpbmcgc3dhcHBpbmcuIFRoZW4sIGBtYWR2aXNlYCB3aXRoIGBNQURWX1BPUFVMQVRFX1JFQURgIG9yIGBNQURWX1BPUFVMQVRFX1dSSVRFYCAqYWxzbyogY2FsbHMgYGZhdWx0aW5fcGFnZV9yYW5nZWAuIFRoYXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kLCBhbmQgdGhhdCBoYXMgaW1wbGljYXRpb25zIGZvciB0aGUgYG1hZHZpc2VgIHNlbWFudGljcy4gYHByb2Nlc3Nfdm1fcmVhZHZgIGFuZCBgcHJvY2Vzc192bV93cml0ZXZgIHdpbGwgb2J2aW91c2x5IGludm9rZSBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCBvciBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYCwgYXMgZG9lcyBgcHRyYWNlYC5cblxuTm93LCBiZWZvcmUgSSBnbyBkZWVwZXIgaW50byB0aGUgYGdldF91c2VyX3BhZ2VzYCBmYW1pbHksIGxldCdzIHRha2UgYSBsb29rIGF0IGBwaW5fdXNlcl9wYWdlc2AgYW5kIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgIG1vcmUgY2xvc2VseS4gSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhpcyBsb2dpYyBwYXRoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg5MiwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NTo1NC42MzAzMDI0MTJaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYwMjM4OTk0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInBpbl91c2VyX3BhZ2VzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTE0MD1pbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxcbi0tXFxubW0vZ3VwLmMtMTc5LSAqXFxubW0vZ3VwLmM6MTgwOiAqIFBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIHBpbl91c2VyX3BhZ2VzKigpIG11c3QgYmUgcmVsZWFzZWQgdmlhIGVpdGhlclxcbm1tL2d1cC5jOjE4MTogKiB1bnBpbl91c2VyX3BhZ2UoKSwgb3Igb25lIG9mIHRoZSB1bnBpbl91c2VyX3BhZ2VzKigpIHJvdXRpbmVzLiBUaGlzIGlzIHNvXFxubW0vZ3VwLmMtMTgyLSAqIHRoYXQgc3VjaCBwYWdlcyBjYW4gYmUgc2VwYXJhdGVseSB0cmFja2VkIGFuZCB1bmlxdWVseSBoYW5kbGVkLiBJblxcbi0tXFxubW0vZ3VwLmM9MjQ3PXN0YXRpYyBpbmxpbmUgc3RydWN0IGZvbGlvICpndXBfZm9saW9fbmV4dChzdHJ1Y3QgcGFnZSAqKmxpc3QsXFxuLS1cXG5tbS9ndXAuYy0yNjItLyoqXFxubW0vZ3VwLmM6MjYzOiAqIHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jaygpIC0gcmVsZWFzZSBhbmQgb3B0aW9uYWxseSBkaXJ0eSBndXAtcGlubmVkIHBhZ2VzXFxubW0vZ3VwLmMtMjY0LSAqIEBwYWdlczogIGFycmF5IG9mIHBhZ2VzIHRvIGJlIG1heWJlIG1hcmtlZCBkaXJ0eSwgYW5kIGRlZmluaXRlbHkgcmVsZWFzZWQuXFxuLS1cXG5tbS9ndXAuYy0yNzMtICogbGlzdGVkIGFzIGNsZWFuLiBJbiBhbnkgY2FzZSwgcmVsZWFzZXMgYWxsIHBhZ2VzIHVzaW5nIHVucGluX3VzZXJfcGFnZSgpLFxcbm1tL2d1cC5jOjI3NDogKiBwb3NzaWJseSB2aWEgdW5waW5fdXNlcl9wYWdlcygpLCBmb3IgdGhlIG5vbi1kaXJ0eSBjYXNlLlxcbm1tL2d1cC5jLTI3NS0gKlxcbi0tXFxubW0vZ3VwLmMtMjgzLSAqL1xcbm1tL2d1cC5jOjI4NDp2b2lkIHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jayhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nIG5wYWdlcyxcXG5tbS9ndXAuYy0yODUtXFx0XFx0XFx0XFx0IGJvb2wgbWFrZV9kaXJ0eSlcXG4tLVxcbm1tL2d1cC5jLTI5MS1cXHRpZiAoIW1ha2VfZGlydHkpIHtcXG5tbS9ndXAuYzoyOTI6XFx0XFx0dW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnBhZ2VzKTtcXG5tbS9ndXAuYy0yOTMtXFx0XFx0cmV0dXJuO1xcbi0tXFxubW0vZ3VwLmMtMzI2LX1cXG5tbS9ndXAuYzozMjc6RVhQT1JUX1NZTUJPTCh1bnBpbl91c2VyX3BhZ2VzX2RpcnR5X2xvY2spO1xcbm1tL2d1cC5jLTMyOC1cXG4tLVxcbm1tL2d1cC5jLTMzNy0gKiBcXFwiZ3VwLXBpbm5lZCBwYWdlIHJhbmdlXFxcIiByZWZlcnMgdG8gYSByYW5nZSBvZiBwYWdlcyB0aGF0IGhhcyBoYWQgb25lIG9mIHRoZVxcbm1tL2d1cC5jOjMzODogKiBwaW5fdXNlcl9wYWdlcygpIHZhcmlhbnRzIGNhbGxlZCBvbiB0aGF0IHBhZ2UuXFxubW0vZ3VwLmMtMzM5LSAqXFxuLS1cXG5tbS9ndXAuYz0zNzM9RVhQT1JUX1NZTUJPTCh1bnBpbl91c2VyX3BhZ2VfcmFuZ2VfZGlydHlfbG9jayk7XFxubW0vZ3VwLmMtMzc0LVxcbm1tL2d1cC5jOjM3NTpzdGF0aWMgdm9pZCBndXBfZmFzdF91bnBpbl91c2VyX3BhZ2VzKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKVxcbm1tL2d1cC5jLTM3Ni17XFxuLS1cXG5tbS9ndXAuYy0zOTItLyoqXFxubW0vZ3VwLmM6MzkzOiAqIHVucGluX3VzZXJfcGFnZXMoKSAtIHJlbGVhc2UgYW4gYXJyYXkgb2YgZ3VwLXBpbm5lZCBwYWdlcy5cXG5tbS9ndXAuYy0zOTQtICogQHBhZ2VzOiAgYXJyYXkgb2YgcGFnZXMgdG8gYmUgbWFya2VkIGRpcnR5IGFuZCByZWxlYXNlZC5cXG4tLVxcbm1tL2d1cC5jLTQwMC0gKi9cXG5tbS9ndXAuYzo0MDE6dm9pZCB1bnBpbl91c2VyX3BhZ2VzKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKVxcbm1tL2d1cC5jLTQwMi17XFxuLS1cXG5tbS9ndXAuYy00MjQtfVxcbm1tL2d1cC5jOjQyNTpFWFBPUlRfU1lNQk9MKHVucGluX3VzZXJfcGFnZXMpO1xcbm1tL2d1cC5jLTQyNi1cXG4tLVxcbm1tL2d1cC5jPTQ3OT1zdGF0aWMgaW5saW5lIHZvaWQgbW1fc2V0X2hhc19waW5uZWRfZmxhZyhzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4tLVxcbm1tL2d1cC5jLTQ5OC0gKiBzYW1lIHRpbWUuIChUaGF0J3MgdHJ1ZSB0aHJvdWdob3V0IHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmRcXG5tbS9ndXAuYzo0OTk6ICogcGluX3VzZXJfcGFnZXMqKCkgQVBJcy4pIENhc2VzOlxcbm1tL2d1cC5jLTUwMC0gKlxcbi0tXFxubW0vZ3VwLmM9ODM0PXN0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZV9jb21taXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy04NDgtXFx0ICogdG8gYWNjZXNzIGl0cyBjb250ZW50ICh0aGUgRk9MTF9QSU4gY2FzZSkuICBQbGVhc2Ugc2VlXFxubW0vZ3VwLmM6ODQ5OlxcdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbm1tL2d1cC5jLTg1MC1cXHQgKi9cXG4tLVxcbm1tL2d1cC5jPTIzMzA9c3RhdGljIHZvaWQgcG9mc191bnBpbihzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKVxcbi0tXFxubW0vZ3VwLmMtMjMzNC1cXHRlbHNlXFxubW0vZ3VwLmM6MjMzNTpcXHRcXHR1bnBpbl91c2VyX3BhZ2VzKHBvZnMtXFx1MDAzZXBhZ2VzLCBwb2ZzLVxcdTAwM2Vucl9lbnRyaWVzKTtcXG5tbS9ndXAuYy0yMzM2LX1cXG4tLVxcbm1tL2d1cC5jPTI5MzA9c3RhdGljIGludCBndXBfZmFzdF9wdGVfcmFuZ2UocG1kX3QgcG1kLCBwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vZ3VwLmMtMjk4Ny1cXHRcXHQgKiBnb2luZyB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZVxcbm1tL2d1cC5jOjI5ODg6XFx0XFx0ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvclxcbm1tL2d1cC5jLTI5ODktXFx0XFx0ICogZGV0YWlscy5cXG4tLVxcbm1tL2d1cC5jPTMyMzA9c3RhdGljIHVuc2lnbmVkIGxvbmcgZ3VwX2Zhc3QodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXFxuLS1cXG5tbS9ndXAuYy0zMjY2LVxcdFxcdGlmIChyZWFkX3NlcWNvdW50X3JldHJ5KFxcdTAwMjZjdXJyZW50LVxcdTAwM2VtbS1cXHUwMDNld3JpdGVfcHJvdGVjdF9zZXEsIHNlcSkpIHtcXG5tbS9ndXAuYzozMjY3OlxcdFxcdFxcdGd1cF9mYXN0X3VucGluX3VzZXJfcGFnZXMocGFnZXMsIG5yX3Bpbm5lZCk7XFxubW0vZ3VwLmMtMzI2OC1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tLVxcbm1tL2d1cC5jPTMzOTA9RVhQT1JUX1NZTUJPTF9HUEwoZ2V0X3VzZXJfcGFnZXNfZmFzdCk7XFxuLS1cXG5tbS9ndXAuYy0zMzkyLS8qKlxcbm1tL2d1cC5jOjMzOTM6ICogcGluX3VzZXJfcGFnZXNfZmFzdCgpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5IHdpdGhvdXQgdGFraW5nIGxvY2tzXFxubW0vZ3VwLmMtMzM5NC0gKlxcbi0tXFxubW0vZ3VwLmMtMzQwNS0gKiBGT0xMX1BJTiBtZWFucyB0aGF0IHRoZSBwYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHZpYSB1bnBpbl91c2VyX3BhZ2UoKS4gUGxlYXNlXFxubW0vZ3VwLmM6MzQwNjogKiBzZWUgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QgZm9yIGZ1cnRoZXIgZGV0YWlscy5cXG5tbS9ndXAuYy0zNDA3LSAqXFxuLS1cXG5tbS9ndXAuYy0zNDEwLSAqL1xcbm1tL2d1cC5jOjM0MTE6aW50IHBpbl91c2VyX3BhZ2VzX2Zhc3QodW5zaWduZWQgbG9uZyBzdGFydCwgaW50IG5yX3BhZ2VzLFxcbm1tL2d1cC5jLTM0MTItXFx0XFx0XFx0dW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4tLVxcbm1tL2d1cC5jLTM0MTctfVxcbm1tL2d1cC5jOjM0MTg6RVhQT1JUX1NZTUJPTF9HUEwocGluX3VzZXJfcGFnZXNfZmFzdCk7XFxubW0vZ3VwLmMtMzQxOS1cXG5tbS9ndXAuYy0zNDIwLS8qKlxcbm1tL2d1cC5jOjM0MjE6ICogcGluX3VzZXJfcGFnZXNfcmVtb3RlKCkgLSBwaW4gcGFnZXMgb2YgYSByZW1vdGUgcHJvY2Vzc1xcbm1tL2d1cC5jLTM0MjItICpcXG4tLVxcbm1tL2d1cC5jLTM0MzctICogRk9MTF9QSU4gbWVhbnMgdGhhdCB0aGUgcGFnZXMgbXVzdCBiZSByZWxlYXNlZCB2aWEgdW5waW5fdXNlcl9wYWdlKCkuIFBsZWFzZVxcbm1tL2d1cC5jOjM0Mzg6ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbm1tL2d1cC5jLTM0MzktICpcXG4tLVxcbm1tL2d1cC5jLTM0NDItICovXFxubW0vZ3VwLmM6MzQ0Mzpsb25nIHBpbl91c2VyX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9ndXAuYy0zNDQ0LVxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9ndXAuYy0zNDU2LX1cXG5tbS9ndXAuYzozNDU3OkVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXNfcmVtb3RlKTtcXG5tbS9ndXAuYy0zNDU4LVxcbm1tL2d1cC5jLTM0NTktLyoqXFxubW0vZ3VwLmM6MzQ2MDogKiBwaW5fdXNlcl9wYWdlcygpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5IGZvciB1c2UgYnkgb3RoZXIgZGV2aWNlc1xcbm1tL2d1cC5jLTM0NjEtICpcXG4tLVxcbm1tL2d1cC5jLTM0NzEtICogRk9MTF9QSU4gbWVhbnMgdGhhdCB0aGUgcGFnZXMgbXVzdCBiZSByZWxlYXNlZCB2aWEgdW5waW5fdXNlcl9wYWdlKCkuIFBsZWFzZVxcbm1tL2d1cC5jOjM0NzI6ICogc2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxcbm1tL2d1cC5jLTM0NzMtICpcXG4tLVxcbm1tL2d1cC5jLTM0NzYtICovXFxubW0vZ3VwLmM6MzQ3Nzpsb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxubW0vZ3VwLmMtMzQ3OC1cXHRcXHQgICAgdW5zaWduZWQgaW50IGd1cF9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcXG4tLVxcbm1tL2d1cC5jLTM0ODYtfVxcbm1tL2d1cC5jOjM0ODc6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlcyk7XFxubW0vZ3VwLmMtMzQ4OC1cXG5tbS9ndXAuYy0zNDg5LS8qXFxubW0vZ3VwLmM6MzQ5MDogKiBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCgpIGlzIHRoZSBGT0xMX1BJTiB2YXJpYW50IG9mXFxubW0vZ3VwLmMtMzQ5MS0gKiBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCgpLiBCZWhhdmlvciBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhpcyBvbmUgc2V0c1xcbi0tXFxubW0vZ3VwLmMtMzQ5Ni0gKi9cXG5tbS9ndXAuYzozNDk3OmxvbmcgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG5tbS9ndXAuYy0zNDk4LVxcdFxcdFxcdCAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IGd1cF9mbGFncylcXG4tLVxcbm1tL2d1cC5jLTM1MDgtfVxcbm1tL2d1cC5jOjM1MDk6RVhQT1JUX1NZTUJPTChwaW5fdXNlcl9wYWdlc191bmxvY2tlZCk7XFxubW0vZ3VwLmMtMzUxMC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTU6NTQuNjkwNTQ1Njg2WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc0NDY2OTM2MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEFQSSBFbnRyeSBQb2ludHMgZm9yIGEgQ29kZSBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzIGFuZCBuZWVkIHRvIGlkZW50aWZ5IHRoZSByZWxldmFudCBBUEkgZW50cnkgcG9pbnRzIGFmZmVjdGVkIGJ5IHRoaXMgbG9naWMuIEkgc2VlIHdlIGhhdmU6IGBnZXRfdXNlcl9wYWdlc2AsIGBnZXRfdXNlcl9wYWdlc19yZW1vdGVgLCBgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgcGluX3VzZXJfcGFnZXNgLCBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYCwgYHBpbl91c2VyX3BhZ2VzX3VubG9ja2VkYCwgYGZhdWx0aW5fcGFnZV9yYW5nZWAsIGFuZCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgLiBSaWdodCwgYW5kIEkgc2hvdWxkIG5vdGUgdGhhdCBgZ2V0X3VzZXJfcGFnZXNfZmFzdGAgYW5kIGBwaW5fdXNlcl9wYWdlc19mYXN0YCBoYXZlIHRoYXQgbG9ja2xlc3MgYGd1cF9mYXN0YCBwYXRoLCBidXQgdWx0aW1hdGVseSBmYWxsIGJhY2sgdG8gYF9fZ2V0X3VzZXJfcGFnZXNgIGlmIG5lZWRlZCwgc28gdGhleSdyZSByZWxldmFudCwgdG9vLCB0aG91Z2ggbm90IHRoZSBwcmltYXJ5IHRhcmdldC4gVGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gYGZvbGxvd19wYWdlX21hc2tgIGFuZCBgX19nZXRfdXNlcl9wYWdlc2AsIHdoaWNoIEkgcmVjb2duaXplIGFzIHRoZSBzbG93ZXIgZmFsbGJhY2sgcGF0aHMuXG5cbkkgbmVlZCB0byBmb2N1cyBvbiB0aGUgZXh0ZXJuYWwsIG5vbi1zdGF0aWMgZW50cnkgcG9pbnRzLCBzaW5jZSB0aGF0J3Mgd2hhdCB0aGUgcHJvbXB0IGlzIGVtcGhhc2l6aW5nOiBcIlByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucy5cIiBTbywgYGdldF91c2VyX3BhZ2VzYCBpcyBxdWl0ZSBnZW5lcmljLCBhbmQgaGVhdmlseSB1c2VkLiBIb3dldmVyLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCBhbmQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBhcmUgYWxzbyBwb3NzaWJpbGl0aWVzLiBBY3R1YWxseSwgYGZvbGxvd19wYWdlX21hc2tgICppcyogc3RhdGljLCBidXQgaXQncyB0aGUgY2VudHJhbCBmdW5jdGlvbiBiZWluZyBtb2RpZmllZC4gU28gaXQgc2VlbXMgdGhlIGJlc3QgbGlzdCBvZiBwb3RlbnRpYWwgdGFyZ2V0cyBpbmNsdWRlczogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIE5vdyBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgYXJlIGluZGVlZCBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA5NDMsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MDIuMTM3MjQ0MDM2WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjM0MTAzNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vZ3VwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vZ3VwLmM9MTkxND1sb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vZ3VwLmMtMTk2Ny0vKlxcbm1tL2d1cC5jOjE5Njg6ICogZmF1bHRpbl9wYWdlX3JhbmdlKCkgLSBwb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2UgdGFibGVzIGluc2lkZSB0aGVcXG5tbS9ndXAuYy0xOTY5LSAqXFx0XFx0XFx0ICBnaXZlbiByYW5nZSByZWFkYWJsZS93cml0YWJsZVxcbi0tXFxubW0vZ3VwLmMtMTk4Ny0gKi9cXG5tbS9ndXAuYzoxOTg4OmxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2d1cC5jLTE5ODktXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgd3JpdGUsIGludCAqbG9ja2VkKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NjowMi4xOTM1ODk5ODFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDcxMTI2Mzk1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6aW5nIHRoZW0gZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipBbmFseXppbmcgUGFnZSBGYXVsdCBIYW5kbGluZyoqXG5cbkFscmlnaHQsIHNvIGBmYXVsdGluX3BhZ2VfcmFuZ2VgIGlzIGRlZmluaXRlbHkgbm9uLXN0YXRpYywgZ29vZC4gQW5kLCBzaW1pbGFybHksIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgaXNuJ3Qgc3RhdGljIGVpdGhlci4gVGhhdCdzIHdoYXQgSSBleHBlY3RlZCBiYXNlZCBvbiB0aGUgYnJvYWRlciBkZXNpZ24uIE5vdywgSSBzaG91bGQgc2hpZnQgbXkgZm9jdXMgdG8gZXhhbWluaW5nIGBmYXVsdGluX3ZtYV9wYWdlX3JhbmdlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb25zIHdlJ3ZlIGlkZW50aWZpZWQgYXMgbm9uLXN0YXRpYywgdG8gY29udGludWUgZGV2ZWxvcGluZyB0aGUgc3lzdGVtIGVmZmljaWVudGx5LiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyB0aGUgdmFyaWFibGVzIGludGVyYWN0IGFuZCB3aGV0aGVyIHRoZXkgd2lsbCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLiBUaGlzIGlzIGxpa2VseSB0aGUgbmV4dCBwaWVjZSBvZiB0aGUgcHV6emxlIHRvIHVuZGVyc3RhbmQgZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMDE2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MDYuOTA0ODU3NDc0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTAzOTUwMywiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZmF1bHRpbl92bWFfcGFnZV9yYW5nZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9ndXAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MDYuOTczOTAzNDM3WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4MTA1OTk3MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIEZ1bmN0aW9uKipcblxuT2theSwgc28gYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBpc24ndCBzdGF0aWMuIFRoYXQgaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZyBmb3IgbWUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBhbmQgaW1wbGljYXRpb25zIG9mIHRoaXMgbm9uLXN0YXRpYyBkZWNsYXJhdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gTGV0J3MgZGlnIGludG8gdGhlIGNvZGViYXNlIGFuZCBmaW5kIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIHNpdGVzIGlzIGNydWNpYWwgdG8gZ3Jhc3BpbmcgaXRzIGludGVuZGVkIGJlaGF2aW9yIGFuZCBwb3RlbnRpYWwgc2lkZSBlZmZlY3RzIHdpdGhpbiB0aGUgbGFyZ2VyIHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQgZnJhbWV3b3JrLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMjc2LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MTAuNzg0NTA1MzI0WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTgzNzk2NzE0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJEb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9NDc2PXRoZSBtbWFwKCkgaGFuZGxlciBhbmQgdGFzayBhZGRyZXNzIHNwYWNlIGV4cGFuc2lvbiBmdW5jdGlvbnMgY2FsbFxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDo0Nzc6cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSBzcGVjaWZ5aW5nIHRoZSB2bWEgYW5kIHRoZSBhZGRyZXNzIHJhbmdlIHRvIG1sb2NrLlxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdC00NzgtXFxuLS1cXG5tbS9ndXAuYz0xNzUwPXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBfX2dldF91c2VyX3BhZ2VzX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2d1cC5jLTE4OTQtLyoqXFxubW0vZ3VwLmM6MTg5NTogKiBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpIC0gIHBvcHVsYXRlIGEgcmFuZ2Ugb2YgcGFnZXMgaW4gdGhlIHZtYS5cXG5tbS9ndXAuYy0xODk2LSAqIEB2bWE6ICAgdGFyZ2V0IHZtYVxcbi0tXFxubW0vZ3VwLmMtMTkxMy0gKi9cXG5tbS9ndXAuYzoxOTE0OmxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vZ3VwLmMtMTkxNS1cXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50ICpsb2NrZWQpXFxuLS1cXG5tbS9ndXAuYz0yMDI2PWludCBfX21tX3BvcHVsYXRlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgaWdub3JlX2Vycm9ycylcXG4tLVxcbm1tL2d1cC5jLTIwNTktXFx0XFx0LypcXG5tbS9ndXAuYzoyMDYwOlxcdFxcdCAqIE5vdyBmYXVsdCBpbiBhIHJhbmdlIG9mIHBhZ2VzLiBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpXFxubW0vZ3VwLmMtMjA2MS1cXHRcXHQgKiBkb3VibGUgY2hlY2tzIHRoZSB2bWEgZmxhZ3MsIHNvIHRoYXQgaXQgd29uJ3QgbWxvY2sgcGFnZXNcXG4tLVxcbm1tL2d1cC5jLTIwNjMtXFx0XFx0ICovXFxubW0vZ3VwLmM6MjA2NDpcXHRcXHRyZXQgPSBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSh2bWEsIG5zdGFydCwgbmVuZCwgXFx1MDAyNmxvY2tlZCk7XFxubW0vZ3VwLmMtMjA2NS1cXHRcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbi0tXFxubW0vaW50ZXJuYWwuaD0xMTE5PXZvaWQgdW5tYXBfbWFwcGluZ19mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG5tbS9pbnRlcm5hbC5oOjExMjA6ZXh0ZXJuIGxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vaW50ZXJuYWwuaC0xMTIxLVxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgKmxvY2tlZCk7XFxuLS1cXG5tbS9tbG9jay5jPTQ2Nz1zdGF0aWMgaW50IG1sb2NrX2ZpeHVwKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9tbG9jay5jLTUwNC1cXHQgKiBJdCdzIG9rYXkgaWYgdHJ5X3RvX3VubWFwX29uZSB1bm1hcHMgYSBwYWdlIGp1c3QgYWZ0ZXIgd2VcXG5tbS9tbG9jay5jOjUwNTpcXHQgKiBzZXQgVk1fTE9DS0VELCBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSB3aWxsIGJyaW5nIGl0IGJhY2suXFxubW0vbWxvY2suYy01MDYtXFx0ICovXFxuLS1cXG5tbS9tbWFwLmM9OTYxPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF9leHRlbmRfdm1hX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxcbi0tXFxubW0vbW1hcC5jLTk3My1cXHRpZiAocHJldi1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9MT0NLRUQpXFxubW0vbW1hcC5jOjk3NDpcXHRcXHRwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShwcmV2LCBhZGRyLCBwcmV2LVxcdTAwM2V2bV9lbmQsIE5VTEwpO1xcbm1tL21tYXAuYy05NzUtXFx0cmV0dXJuIHByZXY7XFxuLS1cXG5tbS9tbWFwLmM9OTgzPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF9leHRlbmRfdm1hX2xvY2tlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxcbi0tXFxubW0vbW1hcC5jLTk5Ny1cXHRpZiAodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0xPQ0tFRClcXG5tbS9tbWFwLmM6OTk4OlxcdFxcdHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHZtYSwgYWRkciwgc3RhcnQsIE5VTEwpO1xcbm1tL21tYXAuYy05OTktXFx0cmV0dXJuIHZtYTtcXG4tLVxcbm1tL21wcm90ZWN0LmM9NzI1PW1wcm90ZWN0X2ZpeHVwKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IG1tdV9nYXRoZXIgKnRsYixcXG4tLVxcbm1tL21wcm90ZWN0LmMtODE5LVxcdCAgICAhdm1hX2ZsYWdzX3Rlc3RfYW55KFxcdTAwMjZvbGRfdm1hX2ZsYWdzLCBWTUFfV1JJVEVfQklULCBWTUFfU0hBUkVEX0JJVCkpXFxubW0vbXByb3RlY3QuYzo4MjA6XFx0XFx0cG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uodm1hLCBzdGFydCwgZW5kLCBOVUxMKTtcXG5tbS9tcHJvdGVjdC5jLTgyMS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MTIuOTY4MzA4NjQ4WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMjMyMTI4MjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzaXR1YXRpb24sIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqTWVtb3J5IFBvcHVsYXRpb24gU3RyYXRlZ2llcyBhbmQgVGhlaXIgRHJpdmVycyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBtZW1vcnkgaXMgcG9wdWxhdGVkIHdpdGhpbiB0aGUgdmlydHVhbCBtZW1vcnkgYXJlYSAoVk1BKSBtYW5hZ2VtZW50IGNvZGUuIEl0IGxvb2tzIGxpa2UgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBpcyBhIGtleSBmdW5jdGlvbi4gSSBzZWUgdGhhdCBpdCdzIHRoZSB3b3JraG9yc2UgY2FsbGVkIGJ5IHNldmVyYWwgaW1wb3J0YW50IGZ1bmN0aW9uczogYF9fbW1fcG9wdWxhdGVgLCB3aGljaCBpcyB0aGUgY29yZSBoYW5kbGVyIGZvciB0aGUgYE1BUF9QT1BVTEFURWAgZmxhZyBkdXJpbmcgYG1tYXBgIGNhbGxzIGFuZCBgbWxvY2tgIG9wZXJhdGlvbnMgKHRoYXQncyBjcnVjaWFsIGZvciBwaW5uaW5nIG1lbW9yeSksIGFuZCB0aGVuIGFsc28gYG1wcm90ZWN0X2ZpeHVwYCB3aGljaCBpcyB1c2VkIGR1cmluZyBwYWdlIHByb3RlY3Rpb24gYWRqdXN0bWVudHMuIEl0J3MgYWxzbyBjYWxsZWQgYnkgYGZpbmRfZXh0ZW5kX3ZtYV9sb2NrZWRgLCB3aGljaCBoYXMgdG8gZG8gd2l0aCBWTUEgZXhwYW5zaW9uIGFuZCBtZXJnaW5nLiBJbnRlcmVzdGluZy4gU28sIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAgc2VlbXMgdG8gYmUgdGhlIGZ1bmN0aW9uIGhhbmRsaW5nIHRoZSAqZWFnZXIqIHBvcHVsYXRpb24gb2YgcGFnZXMuXG5cbk9uIHRoZSBvdGhlciBoYW5kLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCBpcyB1c2VkIGluIGEgbW9yZSByZWFjdGl2ZSBjb250ZXh0LiBJdCdzIGludm9rZWQgYnkgYG1hZHZpc2VgIHNwZWNpZmljYWxseSB3aGVuIHVzaW5nIHRoZSBgTUFEVl9QT1BVTEFURV9SRUFEYCBhbmQgYE1BRFZfUE9QVUxBVEVfV1JJVEVgIGZsYWdzLiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdpbmcgc3RyYXRlZ3ksIGJ1dCB3aXRoIGEgaGludCB0byBwcmUtZmF1bHQgcGFnZXMuIEl0J3MgYSBuaWNlIGRpc3RpbmN0aW9uLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgIGRlYWxzIHdpdGggdXBmcm9udCwgZWFnZXIgcG9wdWxhdGlvbiB3aGlsZSBgZmF1bHRpbl9wYWdlX3JhbmdlYCBkZWFscyB3aXRoIGhpbnQtZHJpdmVuIGZhdWx0aW5nLiBJIGNhbiBzZWUgdGhlIHBvdGVudGlhbCBmb3Igc29tZSBpbnRlcmVzdGluZyBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIGhvdyB0aGVzZSBhcmUgdXNlZCBpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEknbGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNvbnRleHRzIGFuZCB1c2FnZSBwYXR0ZXJucyB0byB1bmRlcnN0YW5kIHRoZSB0cmFkZS1vZmZzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzUwMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU2OjE3Ljk5MTUyMzkwOFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE1NDE0NTI2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE5NjctLypcXG5tbS9ndXAuYzoxOTY4OiAqIGZhdWx0aW5fcGFnZV9yYW5nZSgpIC0gcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdlIHRhYmxlcyBpbnNpZGUgdGhlXFxubW0vZ3VwLmMtMTk2OS0gKlxcdFxcdFxcdCAgZ2l2ZW4gcmFuZ2UgcmVhZGFibGUvd3JpdGFibGVcXG4tLVxcbm1tL2d1cC5jLTE5ODctICovXFxubW0vZ3VwLmM6MTk4ODpsb25nIGZhdWx0aW5fcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG5tbS9ndXAuYy0xOTg5LVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kLCBib29sIHdyaXRlLCBpbnQgKmxvY2tlZClcXG4tLVxcbm1tL2ludGVybmFsLmg9MTEyMD1leHRlcm4gbG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9pbnRlcm5hbC5oLTExMjEtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIGludCAqbG9ja2VkKTtcXG5tbS9pbnRlcm5hbC5oOjExMjI6ZXh0ZXJuIGxvbmcgZmF1bHRpbl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2ludGVybmFsLmgtMTEyMy1cXHRcXHR1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCB3cml0ZSwgaW50ICpsb2NrZWQpO1xcbi0tXFxubW0vbWFkdmlzZS5jPTk1Nz1zdGF0aWMgbG9uZyBtYWR2aXNlX3BvcHVsYXRlKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxcbi0tXFxubW0vbWFkdmlzZS5jLTk2Ny1cXHRcXHQvKiBQb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2UgdGFibGVzIHJlYWRhYmxlL3dyaXRhYmxlLiAqL1xcbm1tL21hZHZpc2UuYzo5Njg6XFx0XFx0cGFnZXMgPSBmYXVsdGluX3BhZ2VfcmFuZ2UobW0sIHN0YXJ0LCBlbmQsIHdyaXRlLCBcXHUwMDI2bG9ja2VkKTtcXG5tbS9tYWR2aXNlLmMtOTY5LVxcdFxcdGlmICghbG9ja2VkKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU2OjIwLjE0NTY3ODEyNloiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODEwNzE3OTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqUG90ZW50aWFsIFBhZ2UtRmF1bHQgSGFuZGxlcnMgYW5kIFBhZ2UgUGlubmluZyBGdW5jdGlvbnMqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgcG90ZW50aWFsIHN0YXJ0aW5nIHBvaW50cyBmb3IgdGhpcywgYW5kIHR3byBuYW1lcyBpbW1lZGlhdGVseSBqdW1wIG91dDogYGZhdWx0aW5fcGFnZV9yYW5nZWAgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgc2VlbSBsaWtlIHRoZXknZCBiZSBkaXJlY3RseSBpbnZvbHZlZCBpbiB0aGUgcHJvY2VzcyBvZiBkZWFsaW5nIHdpdGggcGFnZSBmYXVsdHMgYW5kIHBvcHVsYXRpbmcgbWVtb3J5LiBQcm9taXNpbmcuXG5cbkJleW9uZCB0aG9zZSwgSSd2ZSBnb3QgYSBtZW50YWwgbm90ZSB0byBjaGVjayBvdXQgYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGFuZCBgcGluX3VzZXJfcGFnZXNfcmVtb3RlYC4gVGhleSdyZSByZWxhdGVkIHRvIHVzZXItc3BhY2UgcGFnZSBhY2Nlc3MgYW5kIHBpbm5pbmcsIHdoaWNoIHNlZW1zIHJlbGV2YW50LiBHaXZlbiB0aGVpciBmdW5jdGlvbnMsIHRoZXkgbGlrZWx5IGFjdCB1cG9uIHNvbWUgb2YgdGhlIGZ1bmRhbWVudGFscyBvZiBhIHBhZ2UgdGFibGUuXG5cbk5vdywgYmVmb3JlIEkgZGlnIGFueSBkZWVwZXIsIEkgc2hvdWxkIGFsc28gdGFrZSBhIGxvb2sgYXQgYGdldF91c2VyX3BhZ2VzX3VubG9ja2VkYC4gSXTigJlzIHByb2JhYmx5IHdvcnRoIGludmVzdGlnYXRpbmcgdGhhdCBmdW5jdGlvbiBpbiBwYXJ0aWN1bGFyLCBzaW5jZSB0aGUgJ3VubG9ja2VkJyB2YXJpYW50IG1pZ2h0IG9mZmVyIGluc2lnaHRzIGludG8gaG93IHRoZXkgaGFuZGxlIGxvY2tpbmcgd2l0aGluIHRoYXQgcGFydGljdWxhciBwcm9jZXNzLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiBpdOKAmXMgaGFuZGxpbmcgY29uY3VycmVuY3kgYXQgYWxsLCBidXQgSeKAmW0gZ29pbmcgdG8gY29uc2lkZXIgaXQgYSBoaWdoLXByaW9yaXR5IGNhbmRpZGF0ZSBhcyBhIHN0YXJ0aW5nIHBvaW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDM5MCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjczLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE2OjU2OjIzLjk1NjM5OTM3MloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM0MzY0NDUxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJnZXRfdXNlcl9wYWdlc191bmxvY2tlZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy92aXJ0L25pdHJvX2VuY2xhdmVzL25lX21pc2NfZGV2LmM9OTE0PXN0YXRpYyBpbnQgbmVfc2V0X3VzZXJfbWVtb3J5X3JlZ2lvbl9pb2N0bChzdHJ1Y3QgbmVfZW5jbGF2ZSAqbmVfZW5jbGF2ZSxcXG4tLVxcbmRyaXZlcnMvdmlydC9uaXRyb19lbmNsYXZlcy9uZV9taXNjX2Rldi5jLTk2Mi1cXG5kcml2ZXJzL3ZpcnQvbml0cm9fZW5jbGF2ZXMvbmVfbWlzY19kZXYuYzo5NjM6XFx0XFx0Z3VwX3JjID0gZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQobWVtX3JlZ2lvbi51c2Vyc3BhY2VfYWRkciArIG1lbW9yeV9zaXplLCAxLFxcbmRyaXZlcnMvdmlydC9uaXRyb19lbmNsYXZlcy9uZV9taXNjX2Rldi5jLTk2NC1cXHRcXHRcXHRcXHRcXHRcXHQgbmVfbWVtX3JlZ2lvbi1cXHUwMDNlcGFnZXMgKyBpLCBGT0xMX0dFVCk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tLmg9MzI3MD1sb25nIHBpbl91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNzEtXFx0XFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xcbmluY2x1ZGUvbGludXgvbW0uaDozMjcyOmxvbmcgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzI3My1cXHRcXHQgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IGd1cF9mbGFncyk7XFxuLS1cXG5tbS9ndXAuYz0yNzU2PUVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXMpO1xcbi0tXFxubW0vZ3VwLmMtMjc1OC0vKlxcbm1tL2d1cC5jOjI3NTk6ICogZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoKSBpcyBzdWl0YWJsZSB0byByZXBsYWNlIHRoZSBmb3JtOlxcbm1tL2d1cC5jLTI3NjAtICpcXG4tLVxcbm1tL2d1cC5jLTI3NjYtICpcXG5tbS9ndXAuYzoyNzY3OiAqICAgICAgZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQobW0sIC4uLiwgcGFnZXMpO1xcbm1tL2d1cC5jLTI3NjgtICpcXG4tLVxcbm1tL2d1cC5jLTI3NzItICovXFxubW0vZ3VwLmM6Mjc3Mzpsb25nIGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxubW0vZ3VwLmMtMjc3NC1cXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBndXBfZmxhZ3MpXFxuLS1cXG5tbS9ndXAuYy0yNzg0LX1cXG5tbS9ndXAuYzoyNzg1OkVYUE9SVF9TWU1CT0woZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQpO1xcbm1tL2d1cC5jLTI3ODYtXFxuLS1cXG5tbS9ndXAuYz0zNDg3PUVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXMpO1xcbi0tXFxubW0vZ3VwLmMtMzQ5MC0gKiBwaW5fdXNlcl9wYWdlc191bmxvY2tlZCgpIGlzIHRoZSBGT0xMX1BJTiB2YXJpYW50IG9mXFxubW0vZ3VwLmM6MzQ5MTogKiBnZXRfdXNlcl9wYWdlc191bmxvY2tlZCgpLiBCZWhhdmlvciBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhpcyBvbmUgc2V0c1xcbm1tL2d1cC5jLTM0OTItICogRk9MTF9QSU4gYW5kIHJlamVjdHMgRk9MTF9HRVQuXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTI4ODM9c3RhdGljIGludCBodmFfdG9fcGZuX3Nsb3coc3RydWN0IGt2bV9mb2xsb3dfcGZuICprZnAsIGt2bV9wZm5fdCAqcGZuKVxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0yOTAyLVxcdGVsc2VcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjI5MDM6XFx0XFx0bnBhZ2VzID0gZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWQoa2ZwLVxcdTAwM2VodmEsIDEsIFxcdTAwMjZwYWdlLCBmbGFncyk7XFxudmlydC9rdm0va3ZtX21haW4uYy0yOTA0LVxcdGlmIChucGFnZXMgIT0gMSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6MjYuMzAwMDUzNloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTQ0MDM2NTY5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBHVVAgUGF0Y2ggZm9yIEZ1enppbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaXMgdG8gaWRlbnRpZnkgdGhlIG1vc3QgZWZmZWN0aXZlIHRhcmdldHMgZm9yIGZ1enppbmcgYSByZWNlbnQga2VybmVsIHBhdGNoIHRoYXQgcmVmYWN0b3JzIHRoZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYy4gSSBuZWVkIHRvIGJhbGFuY2UgY292ZXJhZ2Ugd2l0aCBhdm9pZGluZyBvdmVybHkgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCB3aWxsIHNrZXcgcmVzdWx0cy5cblxuRmlyc3QsIEkgbmVlZCB0byBsaXN0IG91dCB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zLiBCYXNlZCBvbiB0aGUgcGF0Y2ggYW5hbHlzaXMgYW5kIGtub3dpbmcgdGhhdCBJIHNob3VsZCBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLCB0aGUgaW5pdGlhbCBjYW5kaWRhdGVzIGFyZTogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIEkga25vdyB0aGF0IGBfX2dldF91c2VyX3BhZ2VzYCBpcyB0aGUgc3RhdGljIGNvcmUsIHNvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgYXJlIHRoZSBjb3JyZWN0IGNob2ljZS5cblxuTm93LCB3aGljaCBjb25maWd1cmF0aW9ucyBhcmUgcmVsZXZhbnQ/IFRoZSBwYXRjaCB1c2VzIGAjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTYCBhbmQgYCNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBhbmQgYmFzZWQgb24gdGhlIGNvbmZpZyBkZXBlbmRlbmNpZXMsIEkga25vdyB0aGF0IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBIVUdFVExCRlNgIGFyZSBzdWZmaWNpZW50IHRvIGVuYWJsZSB0aGlzLCBzbyB0aG9zZSBhcmUgdGhlIGtleSBvbmVzIHRvIGVuYWJsZS4gSXQncyBhIGdlbmVyaWMgYG1tL2d1cC5jYCBmaWxlLCBzbyBubyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29uY2VybnMuXG5cblRoZSBpbml0aWFsIHN1bW1hcnkgd291bGQgYmU6XG5cbiogICAqKldvcnRoRnV6emluZyoqOiBgdHJ1ZWBcbiogICAqKkZvY3VzU3ltYm9scyoqOiBgZ2V0X3VzZXJfcGFnZXNgLCBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCwgYGdldF91c2VyX3BhZ2VzX3VubG9ja2VkYCwgYHBpbl91c2VyX3BhZ2VzYCwgYHBpbl91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc191bmxvY2tlZGAsIGBmYXVsdGluX3BhZ2VfcmFuZ2VgLCBgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2VgXG4qICAgKipFbmFibGVDb25maWdzKio6IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBIVUdFVExCRlNgXG4qICAgKipSZWFzb25pbmcqKjogU2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UuXG5cbkJ1dCBJIG5lZWQgdG8gYmUgYSBiaXQgbW9yZSBudWFuY2VkLiBJIG5lZWQgdG8gYXZvaWQgdmVyeSBob3QgcGF0aHMuIGBnZXRfdXNlcl9wYWdlc2AgaXMgKnRoZSogbWFpbiBlbnRyeSBwb2ludCBmb3IgR1VQLCBzbyBJIGhhdmUgdG8gaW5jbHVkZSBpdC4gQW5kIEknbGwgbGVhdmUgYHBpbl91c2VyX3BhZ2VzYCB0b28uIGBnZXRfdXNlcl9wYWdlc2AgaXRzZWxmIGhhcyBkcml2ZXIgY2FsbHMsIGJ1dCBpdCdzIG5vdCBsaWtlbHkgdG8gYmUgYXMgZ2VuZXJpYyBhcyBga21hbGxvY2Agb3IgYHNjaGVkdWxlYC4gVGhlIHBhdGNoIHByaW1hcmlseSBkZWFscyB3aXRoIERNQSBzZXR1cHMgYW5kIG1lbW9yeSBwaW5uaW5nLlxuXG5gZmF1bHRpbl9wYWdlX3JhbmdlYCBhbmQgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYCBhcmUgbW9yZSBzcGVjaWZpYywgdHJpZ2dlcmVkIGJ5IGBtYWR2aXNlYCBhbmQgYG1tYXAoTUFQX1BPUFVMQVRFKSAvIG1sb2NrYCwgcmVzcGVjdGl2ZWx5LiBgZ2V0X3VzZXJfcGFnZXNfcmVtb3RlYCBpcyBhbHNvIGltcG9ydGFudCBiZWNhdXNlIGl0IGRlYWxzIHdpdGggYHB0cmFjZWAgYW5kIGBwcm9jZXNzX3ZtX3JlYWR2YCwgd2hpY2ggYXJlIGRlZmluaXRlbHkgZ29vZCBmdXp6aW5nIHRhcmdldHMuXG5cblNvLCB0YWtpbmcgdGhlIGhvdC1wYXRoIGNvbnNpZGVyYXRpb24gaW50byBhY2NvdW50LCB0aGUgZmluYWwgc2VsZWN0aW9uIGlzOlxuXG4qICAgKipXb3J0aEZ1enppbmcqKjogYHRydWVgXG4qICAgKipGb2N1c1N5bWJvbHMqKjogYGdldF91c2VyX3BhZ2VzYCwgYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlYFxuKiAgICoqRW5hYmxlQ29uZmlncyoqOiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgSFVHRVRMQkZTYFxuKiAgICoqUmVhc29uaW5nKio6IFRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNvcmUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgbG9naWMgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxrcywgdG91Y2hpbmcgbXVsdGlwbGUgaW1wb3J0YW50IHN1YnN5c3RlbXMuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBleHBvcnRlZCBHVVAgQVBJIGVudHJ5IHBvaW50cywgYmFsYW5jaW5nIGNvdmVyYWdlIHdpdGggdGFyZ2V0ZWQgZnVuY3Rpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTU4NywiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkzMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1NjozNy43NDA0MjQwMTZaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0MzQ1MTgxODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZ2V0X3VzZXJfcGFnZXNcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0PTg0PWxhdHRlciBoYXBwZW5zIHdoZW46XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL2lkbGVfcGFnZV90cmFja2luZy5yc3QtOTItXFxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS9pZGxlX3BhZ2VfdHJhY2tpbmcucnN0OjkzOiAtIGEgcGFnZSBpcyBhY2Nlc3NlZCBieSBhIGRldmljZSBkcml2ZXIgdXNpbmcgZ2V0X3VzZXJfcGFnZXMoKVxcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vaWRsZV9wYWdlX3RyYWNraW5nLnJzdC05NC1cXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvY2FjaGV0bGIucnN0PTI1Mz1tYXBzIHRoaXMgcGFnZSBhdCBpdHMgdmlydHVhbCBhZGRyZXNzLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzUzLVxcdHBhZ2UsIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gKGN1cnJlbnRseSBvbmx5XFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3Q6MzU0OlxcdGdldF91c2VyX3BhZ2VzKCkpLiAgTm90ZTogZmx1c2hfZGNhY2hlX2ZvbGlvKCkgZGVsaWJlcmF0ZWx5XFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9jYWNoZXRsYi5yc3QtMzU1LVxcdGRvZXNuJ3Qgd29yayBmb3IgYW4gYW5vbnltb3VzIHBhZ2UuICBUaGUgZGVmYXVsdFxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9MTEzPWNvdW50ZXIgdGhhdCBpbmNyZW1lbnRzIDEwIGJpdHMgYXQgYSB0aW1lLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMTIxLSogQ2FsbGVycyBtdXN0IHNwZWNpZmljYWxseSByZXF1ZXN0IFxcXCJkbWEtcGlubmVkIHRyYWNraW5nIG9mIHBhZ2VzXFxcIi4gSW4gb3RoZXJcXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoxMjI6ICB3b3JkcywganVzdCBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkgd2lsbCBub3Qgc3VmZmljZTsgYSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyxcXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdC0xMjMtICBwaW5fdXNlcl9wYWdlKCkgYW5kIHJlbGF0ZWQsIG11c3QgYmUgdXNlZC5cXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0PTE5ND1JTkNPUlJFQ1QgKHVzZXMgRk9MTF9HRVQgY2FsbHMpOlxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjE5NTogICAgZ2V0X3VzZXJfcGFnZXMoKVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTE5Ni0gICAgd3JpdGUgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBwYWdlc1xcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9MjQ1PWxvbmctdGVybSBbUl1ETUEgcGlucyBpbiBwbGFjZSwgb3IgZHVyaW5nIHBpbi91bnBpbiB0cmFuc2l0aW9ucy5cXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI0OS0gIHBpbm5lZCBvbmNlIGZvciBlYWNoIHBhZ2UgKGhlYWQgcGFnZSBhbmQgZWFjaCB0YWlsIHBhZ2UpIHdpdGhpbiB0aGUgaHVnZSBwYWdlLlxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0OjI1MDogIFRoaXMgZm9sbG93cyB0aGUgc2FtZSBzb3J0IG9mIGJlaGF2aW9yIHRoYXQgZ2V0X3VzZXJfcGFnZXMoKSB1c2VzIGZvciBodWdlXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjUxLSAgcGFnZXM6IHRoZSBoZWFkIHBhZ2UgaXMgcmVmY291bnRlZCBvbmNlIGZvciBlYWNoIHRhaWwgb3IgaGVhZCBwYWdlIGluIHRoZSBodWdlXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q6MjUyOiAgcGFnZSwgd2hlbiBnZXRfdXNlcl9wYWdlcygpIGlzIGFwcGxpZWQgdG8gYSBodWdlIHBhZ2UuXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QtMjUzLVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q9Mjc4PVJlZmVyZW5jZXNcXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0LTI4MC1cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODE6KiBgU29tZSBzbG93IHByb2dyZXNzIG9uIGdldF91c2VyX3BhZ2VzKCkgKEFwciAyLCAyMDE5KSBcXHUwMDNjaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzc4NDU3NC9cXHUwMDNlYF9cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODI6KiBgRE1BIGFuZCBnZXRfdXNlcl9wYWdlcygpIChMUEM6IERlYyAxMiwgMjAxOCkgXFx1MDAzY2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy83NzQ0MTEvXFx1MDAzZWBfXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3Q6MjgzOiogYFRoZSB0cm91YmxlIHdpdGggZ2V0X3VzZXJfcGFnZXMoKSAoQXByIDMwLCAyMDE4KSBcXHUwMDNjaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzc1MzAyNy9cXHUwMDNlYF9cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdDoyODQ6KiBgTFdOIGtlcm5lbCBpbmRleDogZ2V0X3VzZXJfcGFnZXMoKSBcXHUwMDNjaHR0cHM6Ly9sd24ubmV0L0tlcm5lbC9JbmRleC8jTWVtb3J5X21hbmFnZW1lbnQtZ2V0X3VzZXJfcGFnZXNcXHUwMDNlYF9cXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3Bpbl91c2VyX3BhZ2VzLnJzdC0yODUtXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC5yc3Q9Mjg5PW1hcHBlZCBjYWNoZXMgc3VjaCBhcyBBUk0sIE1JUFMgYW5kIFNQQVJDLlxcbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdC0yOTAtXFxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgucnN0OjI5MTpDYWxsaW5nIDpjOmZ1bmM6YGdldF91c2VyX3BhZ2VzKClgIG9uIGEgcmFuZ2Ugb2YgdXNlciBtZW1vcnkgdGhhdCBoYXMgYmVlblxcbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnJzdC0yOTItbW1hcHBlZCBmcm9tIGEgYERBWGAgZmlsZSB3aWxsIGZhaWwgd2hlbiB0aGVyZSBhcmUgbm8gJ3N0cnVjdCBwYWdlJyB0byBkZXNjcmliZVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0PTQzOD13aGlsZSB0aGUgcGFnZShzKSBiZWxvbmdpbmcgdG8gdGhlIHdyaXRlIGJ1ZmZlciBhcmUgZmF1bHRlZCB3aXRoXFxuRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0OjQzOTpnZXRfdXNlcl9wYWdlcygpLiAgVGhlICdyZXEtXFx1MDAzZWxvY2tlZCcgZmxhZyBpbmRpY2F0ZXMgd2hlbiB0aGUgY29weSBpc1xcbkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS9mdXNlLnJzdC00NDAtdGFraW5nIHBsYWNlLCBhbmQgYWJvcnQgaXMgZGVsYXllZCB1bnRpbCB0aGlzIGZsYWcgaXMgdW5zZXQuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0PTY0MT1hbiBlcnJvci5cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0LTY0Mi1cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0OjY0MzotXFx1MDAzZWFjY2VzcygpIGlzIGNhbGxlZCB3aGVuIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMgaW5cXG5Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2xvY2tpbmcucnN0LTY0NC1hY2Nlc3NfcHJvY2Vzc192bSgpLCB0eXBpY2FsbHkgdXNlZCB0byBkZWJ1ZyBhIHByb2Nlc3MgdGhyb3VnaFxcbi0tXFxuRG9jdW1lbnRhdGlvbi9ncHUvZHJtLXZtLWJpbmQtbG9ja2luZy5yc3Q9NDE2PU5vdywgdGhlIG1ldGhvZCBvZiBvYnRhaW5pbmcgc3RydWN0IHBhZ2UgcmVmZXJlbmNlcyB1c2luZ1xcbkRvY3VtZW50YXRpb24vZ3B1L2RybS12bS1iaW5kLWxvY2tpbmcucnN0OjQxNzpnZXRfdXNlcl9wYWdlcygpIHVuZm9ydHVuYXRlbHkgY2FuJ3QgYmUgdXNlZCB1bmRlciBhIGRtYV9yZXN2IGxvY2tcXG5Eb2N1bWVudGF0aW9uL2dwdS9kcm0tdm0tYmluZC1sb2NraW5nLnJzdC00MTgtc2luY2UgdGhhdCB3b3VsZCB2aW9sYXRlIHRoZSBsb2NraW5nIG9yZGVyIG9mIHRoZSBkbWFfcmVzdiBsb2NrIHZzIHRoZVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0PTQ3PU1lbW9yeSBwaW5uaW5nXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy5yc3QtNTItICBpYl91dmVyYnMgbW9kdWxlIG1hbmFnZXMgcGlubmluZyBhbmQgdW5waW5uaW5nIG1lbW9yeSByZWdpb25zIHZpYVxcbkRvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1MzogIGdldF91c2VyX3BhZ2VzKCkgYW5kIHB1dF9wYWdlKCkgY2FsbHMuICBJdCBhbHNvIGFjY291bnRzIGZvciB0aGVcXG5Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy5yc3QtNTQtICBhbW91bnQgb2YgbWVtb3J5IHBpbm5lZCBpbiB0aGUgcHJvY2VzcydzIHBpbm5lZF92bSwgYW5kIGNoZWNrcyB0aGF0XFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9MzA0PUJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgc3lzdGVtIGNhbGwsIGRvX21sb2NrKCkgb3IgbWxvY2thbGwoKSB3aWxsIGNhbGxcXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q6MzA1Ol9fbW1fcG9wdWxhdGUoKSB0byBmYXVsdCBpbiB0aGUgcmVtYWluaW5nIHBhZ2VzIHZpYSBnZXRfdXNlcl9wYWdlcygpIGFuZCB0b1xcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdC0zMDYtbWFyayB0aG9zZSBwYWdlcyBhcyBtbG9ja2VkIGFzIHRoZXkgYXJlIGZhdWx0ZWQuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3Q9MzA4PU5vdGUgdGhhdCB0aGUgVk1BIGJlaW5nIG1sb2NrZWQgbWlnaHQgYmUgbWFwcGVkIHdpdGggUFJPVF9OT05FLiAgSW4gdGhpcyBjYXNlLFxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdDozMDk6Z2V0X3VzZXJfcGFnZXMoKSB3aWxsIGJlIHVuYWJsZSB0byBmYXVsdCBpbiB0aGUgcGFnZXMuICBUaGF0J3Mgb2theS4gIElmIHBhZ2VzXFxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0LTMxMC1kbyBlbmQgdXAgZ2V0dGluZyBmYXVsdGVkIGludG8gdGhpcyBWTV9MT0NLRUQgVk1BLCB0aGV5IHdpbGwgYmUgaGFuZGxlZCBpbiB0aGVcXG4tLVxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdD0zNDA9bWxvY2tfZml4dXAoKSBmaWx0ZXJzIHNldmVyYWwgY2xhc3NlcyBvZiBcXFwic3BlY2lhbFxcXCIgVk1BczpcXG4tLVxcbkRvY3VtZW50YXRpb24vbW0vdW5ldmljdGFibGUtbHJ1LnJzdC0zNDQtICAgbWxvY2tlZC4gIEluIGFueSBjYXNlLCBtb3N0IG9mIHRoZSBwYWdlcyBoYXZlIG5vIHN0cnVjdCBwYWdlIGluIHdoaWNoIHRvIHNvXFxuRG9jdW1lbnRhdGlvbi9tbS91bmV2aWN0YWJsZS1scnUucnN0OjM0NTogICBtYXJrIHRoZSBwYWdlLiAgQmVjYXVzZSBvZiB0aGlzLCBnZXRfdXNlcl9wYWdlcygpIHdpbGwgZmFpbCBmb3IgdGhlc2UgVk1BcyxcXG5Eb2N1bWVudGF0aW9uL21tL3VuZXZpY3RhYmxlLWxydS5yc3QtMzQ2LSAgIHNvIHRoZXJlIGlzIG5vIHNlbnNlIGluIGF0dGVtcHRpbmcgdG8gdmlzaXQgdGhlbS5cXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2NhY2hldGxiLnJzdD0xMDk9SHlwZXJTcGFyYyBjcHXlsLHmmK/ov5nmoLfkuIDkuKrlhbfmnInov5nnp43lsZ7mgKfnmoRjcHXjgIJcXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2NhY2hldGxiLnJzdC0zMDItXFx05b2T5YaF5qC46ZyA6KaB6K6/6Zeu5LiA5Liq5Yy/5ZCN6aG155qE5YaF5a655pe277yM5a6D5Lya6LCD55So6L+Z5Liq5Ye95pWw77yI55uu5YmN5Y+q5pyJXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkvY2FjaGV0bGIucnN0OjMwMzpcXHRnZXRfdXNlcl9wYWdlcygp77yJ44CC5rOo5oSP77yaZmx1c2hfZGNhY2hlX3BhZ2UoKeaVheaEj+WvueWMv+WQjemhteS4jei1t+S9nFxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2NhY2hldGxiLnJzdC0zMDQtXFx055So44CC6buY6K6k55qE5a6e546w5pivbm9w77yI5a+55LqO5omA5pyJ55u45bmy55qE5p625p6E5bqU6K+l5L+d5oyB6L+Z5qC377yJ44CC5a+55LqO5LiN5LiA6Ie05oCnXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9pbmZpbmliYW5kL3VzZXJfdmVyYnMucnN0LTUzLSAg55u05o6l55qE55So5oi356m66Ze0SS9P6KaB5rGC5LiO5L2c5Li65r2c5ZyoSS9P55uu5qCH55qE5YaF5a2Y5Yy65Z+f5L+d5oyB5Zyo5ZCM5LiA54mp55CG5Zyw5Z2A5LiK44CCaWJfdXZlcmJzXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdDo1NDogIOaooeWdl+mAmui/h2dldF91c2VyX3BhZ2VzKCnlkoxwdXRfcGFnZSgp6LCD55So5p2l566h55CG5YaF5a2Y5Yy65Z+f55qE5Zu65a6a5ZKM6Kej6Zmk5Zu65a6a44CC5a6D6L+Y5qC4XFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnJzdC01NS0gIOeul+i/m+eoi+eahHBpbm5lZF92beS4reiiq+WbuuWumueahOWGheWtmOmHj++8jOW5tuajgOafpemdnueJueadg+i/m+eoi+aYr+WQpui2hei/h+WFtlJMSU1JVF9NRU1MT0NL6ZmQ5Yi244CCXFxuLS1cXG5hcmNoL2FybS9tbS9mbHVzaC5jPTM3Mz1FWFBPUlRfU1lNQk9MKGZsdXNoX2RjYWNoZV9wYWdlKTtcXG5hcmNoL2FybS9tbS9mbHVzaC5jLTM3NC0vKlxcbmFyY2gvYXJtL21tL2ZsdXNoLmM6Mzc1OiAqIEZsdXNoIGFuIGFub255bW91cyBwYWdlIHNvIHRoYXQgdXNlcnMgb2YgZ2V0X3VzZXJfcGFnZXMoKVxcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc2LSAqIGNhbiBzYWZlbHkgYWNjZXNzIHRoZSBkYXRhLiAgVGhlIGV4cGVjdGVkIHNlcXVlbmNlIGlzOlxcbmFyY2gvYXJtL21tL2ZsdXNoLmMtMzc3LSAqXFxuYXJjaC9hcm0vbW0vZmx1c2guYzozNzg6ICogIGdldF91c2VyX3BhZ2VzKClcXG5hcmNoL2FybS9tbS9mbHVzaC5jLTM3OS0gKiAgICAtXFx1MDAzZSBmbHVzaF9hbm9uX3BhZ2VcXG4tLVxcbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYz03NzI9c3RhdGljIGludCBrdm1fbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdwYSwgYm9vbCB3cml0ZSlcXG4tLVxcbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYy04MTAtXFx0ICogRW5zdXJlIHRoZSByZWFkIG9mIG1tdV9pbnZhbGlkYXRlX3NlcSBpc24ndCByZW9yZGVyZWQgd2l0aCBQVEUgcmVhZHMgaW5cXG5hcmNoL2xvb25nYXJjaC9rdm0vbW11LmM6ODExOlxcdCAqIGt2bV9mYXVsdGluX3BmbigpICh3aGljaCBjYWxscyBnZXRfdXNlcl9wYWdlcygpKSwgc28gdGhhdCB3ZSBkb24ndFxcbmFyY2gvbG9vbmdhcmNoL2t2bS9tbXUuYy04MTItXFx0ICogcmlzayB0aGUgcGFnZSB3ZSBnZXQgYSByZWZlcmVuY2UgdG8gZ2V0dGluZyB1bm1hcHBlZCBiZWZvcmUgd2UgaGF2ZSBhXFxuLS1cXG5hcmNoL21pcHMva3ZtL21tdS5jPTU0Nz1zdGF0aWMgaW50IGt2bV9taXBzX21hcF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBncGEsXFxuLS1cXG5hcmNoL21pcHMva3ZtL21tdS5jLTU4MS1cXHQgKiBFbnN1cmUgdGhlIHJlYWQgb2YgbW11X2ludmFsaWRhdGVfc2VxIGlzbid0IHJlb3JkZXJlZCB3aXRoIFBURSByZWFkc1xcbmFyY2gvbWlwcy9rdm0vbW11LmM6NTgyOlxcdCAqIGluIGt2bV9mYXVsdGluX3BmbigpICh3aGljaCBjYWxscyBnZXRfdXNlcl9wYWdlcygpKSwgc28gdGhhdCB3ZSBkb24ndFxcbmFyY2gvbWlwcy9rdm0vbW11LmMtNTgzLVxcdCAqIHJpc2sgdGhlIHBhZ2Ugd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIGdldHRpbmcgdW5tYXBwZWQgYmVmb3JlIHdlIGhhdmUgYVxcbi0tXFxuYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYz02Nzg9c3RhdGljIHZvaWQga3ZtcHBjX3VwZGF0ZV92cGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtcHBjX3ZwYSAqdnBhcCxcXG4tLVxcbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMtNjg4LVxcdCAqIGJ1dCB3ZSBjYW4ndCBjYWxsIGt2bXBwY19waW5fZ3Vlc3RfcGFnZSB1bmRlciB0aGUgbG9ja1xcbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmM6Njg5OlxcdCAqIGFzIGl0IGRvZXMgZ2V0X3VzZXJfcGFnZXMoKSBhbmQgZG93bl9yZWFkKCkuICBTbyB3ZVxcbmFyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMtNjkwLVxcdCAqIGhhdmUgdG8gZHJvcCB0aGUgbG9jaywgcGluIHRoZSBwYWdlLCB0aGVuIGdldCB0aGUgbG9ja1xcbi0tXFxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmM9OTE9dm9pZCBwdHJhY2VfZGlzYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKVxcbi0tXFxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmMtOTYtLyogVG8gZ2V0IHRoZSBuZWNlc3NhcnkgcGFnZSBzdHJ1Y3QsIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZmlyc3QgY2FsbHNcXG5hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2VfNjQuYzo5NzogKiBnZXRfdXNlcl9wYWdlcygpLiAgVGhpcyBoYXMgZG9uZSBhIGZsdXNoX2RjYWNoZV9wYWdlKCkgb24gdGhlXFxuYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmMtOTgtICogYWNjZXNzZWQgcGFnZS4gIFRoZW4gb3VyIGNhbGxlciAoY29weV97dG8sZnJvbX1fdXNlcl9wYWdlKCkpIGRpZFxcbi0tXFxuYXJjaC94ODYva2VybmVsL2NwdS9zZ3gvaW9jdGwuYz0yMDc9c3RhdGljIGludCBfX3NneF9lbmNsX2FkZF9wYWdlKHN0cnVjdCBzZ3hfZW5jbCAqZW5jbCxcXG4tLVxcbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMtMjI0LVxcbmFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmM6MjI1OlxcdHJldCA9IGdldF91c2VyX3BhZ2VzKHNyYywgMSwgMCwgXFx1MDAyNnNyY19wYWdlKTtcXG5hcmNoL3g4Ni9rZXJuZWwvY3B1L3NneC9pb2N0bC5jLTIyNi1cXHRpZiAocmV0IFxcdTAwM2MgMSlcXG4tLVxcbmFyY2gveHRlbnNhL21tL2NhY2hlLmM9MjE2PXZvaWQgdXBkYXRlX21tdV9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jLTI2Ni0vKlxcbmFyY2gveHRlbnNhL21tL2NhY2hlLmM6MjY3OiAqIGFjY2Vzc19wcm9jZXNzX3ZtKCkgaGFzIGNhbGxlZCBnZXRfdXNlcl9wYWdlcygpLCB3aGljaCBoYXMgZG9uZSBhXFxuYXJjaC94dGVuc2EvbW0vY2FjaGUuYy0yNjgtICogZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGUgcGFnZS5cXG4tLVxcbmJsb2NrL2Jpby5jPTE2NTA9RVhQT1JUX1NZTUJPTChiaW9fZnJlZV9wYWdlcyk7XFxuLS1cXG5ibG9jay9iaW8uYy0xNjYyLSAqIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgdmVyeSBoYXJkIHRvIHRlc3QgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgYmVjYXVzZVxcbmJsb2NrL2Jpby5jOjE2NjM6ICogZGlyZWN0LWlvIHBpbnMgdGhlIHBhZ2VzIHdpdGggZ2V0X3VzZXJfcGFnZXMoKS4gIFRoaXMgbWFrZXNcXG5ibG9jay9iaW8uYy0xNjY0LSAqIGlzX3BhZ2VfY2FjaGVfZnJlZWFibGUgcmV0dXJuIGZhbHNlLCBhbmQgdGhlIFZNIHdpbGwgbm90IGNsZWFuIHRoZSBwYWdlcy5cXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYz0xMDYxPXN0YXRpYyBpbnQgaW5pdF91c2VyX3BhZ2VzKHN0cnVjdCBrZ2RfbWVtICptZW0sIHVpbnQ2NF90IHVzZXJfYWRkcixcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0xMTA0LVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYzoxMTA1OlxcdHJldCA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIHJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmMtMTEwNi1cXHRpZiAocmV0KSB7XFxuLS1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM9MjU0Mj1zdGF0aWMgaW50IHVwZGF0ZV9pbnZhbGlkX3VzZXJfcGFnZXMoc3RydWN0IGFtZGtmZF9wcm9jZXNzX2luZm8gKnByb2Nlc3NfaW5mbyxcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hbWRrZmRfZ3B1dm0uYy0yNjAwLVxcdFxcdC8qIEdldCB1cGRhdGVkIHVzZXIgcGFnZXMgKi9cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmM6MjYwMTpcXHRcXHRyZXQgPSBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKGJvLCBtZW0tXFx1MDAzZXJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmMtMjYwMi1cXHRcXHRpZiAocmV0KSB7XFxuLS1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYz04NDQ9c3RhdGljIGludCBhbWRncHVfY3NfcGFyc2VyX2JvcyhzdHJ1Y3QgYW1kZ3B1X2NzX3BhcnNlciAqcCxcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9jcy5jLTg4Ny1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYzo4ODg6XFx0XFx0ciA9IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoYm8sIGUtXFx1MDAzZXJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYy04ODktXFx0XFx0aWYgKHIpXFxuLS1cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2VtLmM9NDk1PWludCBhbWRncHVfZ2VtX3VzZXJwdHJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSxcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYy01NTAtXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dlbS5jOjU1MTpcXHRcXHRyID0gYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhibywgcmFuZ2UpO1xcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nZW0uYy01NTItXFx0XFx0aWYgKHIpIHtcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYz03MjI9c3RydWN0IGFtZGdwdV90dG1fdHQge1xcbi0tXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jLTc0My0gKi9cXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmM6NzQ0OmludCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKHN0cnVjdCBhbWRncHVfYm8gKmJvLFxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYy03NDUtXFx0XFx0XFx0XFx0IHN0cnVjdCBhbWRncHVfaG1tX3JhbmdlICpyYW5nZSlcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaD0yMDc9dWludDY0X3QgYW1kZ3B1X3R0bV9kb21haW5fc3RhcnQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHVpbnQzMl90IHR5cGUpO1xcbi0tXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5oLTIwOS0jaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0FNREdQVV9VU0VSUFRSKVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaDoyMTA6aW50IGFtZGdwdV90dG1fdHRfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGFtZGdwdV9ibyAqYm8sXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5oLTIxMS1cXHRcXHRcXHRcXHQgc3RydWN0IGFtZGdwdV9obW1fcmFuZ2UgKnJhbmdlKTtcXG5kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmgtMjEyLSNlbHNlXFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5oOjIxMzpzdGF0aWMgaW5saW5lIGludCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKHN0cnVjdCBhbWRncHVfYm8gKmJvLFxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uaC0yMTQtXFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBhbWRncHVfaG1tX3JhbmdlICpyYW5nZSlcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jPTk1OD1hbWRncHVfdXNlcnFfdm1fdmFsaWRhdGUoc3RydWN0IGFtZGdwdV91c2VycV9tZ3IgKnVxX21ncilcXG4tLVxcbmRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91c2VycS5jLTEwNTktXFx0XFx0XFx0Ym8gPSByYW5nZS1cXHUwMDNlYm87XFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3VzZXJxLmM6MTA2MDpcXHRcXHRcXHRyZXQgPSBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzKGJvLCByYW5nZSk7XFxuZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3VzZXJxLmMtMTA2MS1cXHRcXHRcXHRpZiAocmV0KVxcbi0tXFxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmM9MzIzPXN0YXRpYyBpbnQgcmFkZW9uX3R0bV90dF9waW5fdXNlcnB0cihzdHJ1Y3QgdHRtX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV90dCAqdHRtKVxcbi0tXFxuZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMtMzUxLVxcbmRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jOjM1MjpcXHRcXHRyID0gZ2V0X3VzZXJfcGFnZXModXNlcnB0ciwgbnVtX3BhZ2VzLCB3cml0ZSA/IEZPTExfV1JJVEUgOiAwLFxcbmRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jLTM1My1cXHRcXHRcXHRcXHQgICBwYWdlcyk7XFxuLS1cXG5kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVmYXVsdC5jPTE3Nz1zdGF0aWMgaW50IG5vbl9hdG9taWNfcHRlX2xvb2t1cChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMtMTg3LSNlbmRpZlxcbmRyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmM6MTg4OlxcdGlmIChnZXRfdXNlcl9wYWdlcyh2YWRkciwgMSwgd3JpdGUgPyBGT0xMX1dSSVRFIDogMCwgXFx1MDAyNnBhZ2UpIFxcdTAwM2M9IDApXFxuZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmF1bHQuYy0xODktXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuLS1cXG5mcy9kYXguYz02ODc9c3RhdGljIHZvaWQgKmdyYWJfbWFwcGluZ19lbnRyeShzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcXG4tLVxcbmZzL2RheC5jLTc4My0gKiBhbnkgcGFnZSBpbiB0aGUgbWFwcGluZyBpcyBidXN5LCBpLmUuIGZvciBETUEsIG9yIG90aGVyXFxuZnMvZGF4LmM6Nzg0OiAqIGdldF91c2VyX3BhZ2VzKCkgdXNhZ2VzLlxcbmZzL2RheC5jLTc4NS0gKlxcbi0tXFxuZnMvZGF4LmM9NzkxPXN0cnVjdCBwYWdlICpkYXhfbGF5b3V0X2J1c3lfcGFnZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2RheC5jLTgxMy1cXHQgKiBhZ2FpbnN0IGlzIG5vIGxvbmdlciBtYXBwZWQgaW4gdGhlIHBhZ2UgdGFibGVzIGFuZCBiYWlsIHRvIHRoZVxcbmZzL2RheC5jOjgxNDpcXHQgKiBnZXRfdXNlcl9wYWdlcygpIHNsb3cgcGF0aC4gIFRoZSBzbG93IHBhdGggaXMgcHJvdGVjdGVkIGJ5XFxuZnMvZGF4LmMtODE1LVxcdCAqIHB0ZV9sb2NrKCkgYW5kIHBtZF9sb2NrKCkuIE5ldyByZWZlcmVuY2VzIGFyZSBub3QgdGFrZW4gd2l0aG91dFxcbi0tXFxuZnMvZGlyZWN0LWlvLmM9MjQ0PXN0YXRpYyBzc2l6ZV90IGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIHNzaXplX3QgcmV0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuLS1cXG5mcy9kaXJlY3QtaW8uYy0yODctXFx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxcbmZzL2RpcmVjdC1pby5jOjI4ODpcXHQgKiBub24tZGlyZWN0IHJlYWRhaGVhZCwgb3IgZmF1bHRlZCBpbiBieSBnZXRfdXNlcl9wYWdlcygpIGlmIHRoZSBzb3VyY2VcXG5mcy9kaXJlY3QtaW8uYy0yODktXFx0ICogb2YgdGhlIHdyaXRlIHdhcyBhbiBtbWFwJ2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSdyZSB3cml0aW5nLiAgRWl0aGVyXFxuLS1cXG5mcy9kaXJlY3QtaW8uYz04OTk9c3RhdGljIGludCBkb19kaXJlY3RfSU8oc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbyxcXG4tLVxcbmZzL2RpcmVjdC1pby5jLTEwNDYtXFxuZnMvZGlyZWN0LWlvLmM6MTA0NzpcXHRcXHQvKiBEcm9wIHRoZSBwaW4gd2hpY2ggd2FzIHRha2VuIGluIGdldF91c2VyX3BhZ2VzKCkgKi9cXG5mcy9kaXJlY3QtaW8uYy0xMDQ4LVxcdFxcdGRpb191bnBpbl9wYWdlKGRpbywgcGFnZSk7XFxuLS1cXG5mcy9leGVjLmM9NDAyPXN0YXRpYyBpbnQgYnBybV9zdGFja19saW1pdHMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4tLVxcbmZzL2V4ZWMuYy00NDgtICogJ2NvcHlfc3RyaW5ncygpJyBjb3BpZXMgYXJndW1lbnQvZW52aXJvbm1lbnQgc3RyaW5ncyBmcm9tIHRoZSBvbGRcXG5mcy9leGVjLmM6NDQ5OiAqIHByb2Nlc3NlcydzIG1lbW9yeSB0byB0aGUgbmV3IHByb2Nlc3MncyBzdGFjay4gIFRoZSBjYWxsIHRvIGdldF91c2VyX3BhZ2VzKClcXG5mcy9leGVjLmMtNDUwLSAqIGVuc3VyZXMgdGhlIGRlc3RpbmF0aW9uIHBhZ2UgaXMgY3JlYXRlZCBhbmQgbm90IHN3YXBwZWQgb3V0Llxcbi0tXFxuZnMvZnVzZS9kYXguYz05MTI9aW5vZGVfaW5saW5lX3JlY2xhaW1fb25lX2RtYXAoc3RydWN0IGZ1c2VfY29ubl9kYXggKmZjZCwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2Z1c2UvZGF4LmMtOTM3LVxcdCAqIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyB0byBpbm9kZSBwYWdlcyB1c2luZ1xcbmZzL2Z1c2UvZGF4LmM6OTM4OlxcdCAqIGdldF91c2VyX3BhZ2VzKClcXG5mcy9mdXNlL2RheC5jLTkzOS1cXHQgKi9cXG4tLVxcbmZzL2Z1c2UvZmlsZS5jPTE1NjE9c3RhdGljIGlubGluZSBzaXplX3QgZnVzZV9nZXRfZnJhZ19zaXplKGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaWksXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0xNTY2LVxcbmZzL2Z1c2UvZmlsZS5jOjE1Njc6c3RhdGljIGludCBmdXNlX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBmdXNlX2FyZ3NfcGFnZXMgKmFwLCBzdHJ1Y3QgaW92X2l0ZXIgKmlpLFxcbmZzL2Z1c2UvZmlsZS5jLTE1NjgtXFx0XFx0XFx0ICAgICAgIHNpemVfdCAqbmJ5dGVzcCwgaW50IHdyaXRlLFxcbi0tXFxuZnMvZnVzZS9maWxlLmM9MTY2NT1zc2l6ZV90IGZ1c2VfZGlyZWN0X2lvKHN0cnVjdCBmdXNlX2lvX3ByaXYgKmlvLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0xNzE5LVxcbmZzL2Z1c2UvZmlsZS5jOjE3MjA6XFx0XFx0ZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhcXHUwMDI2aWEtXFx1MDAzZWFwLCBpdGVyLCBcXHUwMDI2bmJ5dGVzLCB3cml0ZSxcXG5mcy9mdXNlL2ZpbGUuYy0xNzIxLVxcdFxcdFxcdFxcdFxcdCAgbWF4X3BhZ2VzLCBmYy1cXHUwMDNldXNlX3BhZ2VzX2Zvcl9rdmVjX2lvKTtcXG4tLVxcbmZzL2lvbWFwL2RpcmVjdC1pby5jPTEwND1zc2l6ZV90IGlvbWFwX2Rpb19jb21wbGV0ZShzdHJ1Y3QgaW9tYXBfZGlvICpkaW8pXFxuLS1cXG5mcy9pb21hcC9kaXJlY3QtaW8uYy0xMjctXFx0ICogVHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGNhY2hlZCBieVxcbmZzL2lvbWFwL2RpcmVjdC1pby5jOjEyODpcXHQgKiBub24tZGlyZWN0IHJlYWRhaGVhZCwgb3IgZmF1bHRlZCBpbiBieSBnZXRfdXNlcl9wYWdlcygpIGlmIHRoZSBzb3VyY2VcXG5mcy9pb21hcC9kaXJlY3QtaW8uYy0xMjktXFx0ICogb2YgdGhlIHdyaXRlIHdhcyBhbiBtbWFwJ2VkIHJlZ2lvbiBvZiB0aGUgZmlsZSB3ZSdyZSB3cml0aW5nLiAgRWl0aGVyXFxuLS1cXG5mcy9uZnMvZGlyZWN0LmM9MzI2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZzX3BnaW9fY29tcGxldGlvbl9vcHMgbmZzX2RpcmVjdF9yZWFkX2NvbXBsZXRpb25fb3BzID0ge1xcbi0tXFxuZnMvbmZzL2RpcmVjdC5jLTMzMy0gKiBGb3IgZWFjaCByc2l6ZSdkIGNodW5rIG9mIHRoZSB1c2VyJ3MgYnVmZmVyLCBkaXNwYXRjaCBhbiBORlMgUkVBRFxcbmZzL25mcy9kaXJlY3QuYzozMzQ6ICogb3BlcmF0aW9uLiAgSWYgbmZzX3JlYWRkYXRhX2FsbG9jKCkgb3IgZ2V0X3VzZXJfcGFnZXMoKSBmYWlscyxcXG5mcy9uZnMvZGlyZWN0LmMtMzM1LSAqIGJhaWwgYW5kIHN0b3Agc2VuZGluZyBtb3JlIHJlYWRzLiAgUmVhZCBsZW5ndGggYWNjb3VudGluZyBpc1xcbi0tXFxuZnMvbmZzL2RpcmVjdC5jPTg1Mj1zdGF0aWMgY29uc3Qgc3RydWN0IG5mc19wZ2lvX2NvbXBsZXRpb25fb3BzIG5mc19kaXJlY3Rfd3JpdGVfY29tcGxldGlvbl9vcHMgPSB7XFxuLS1cXG5mcy9uZnMvZGlyZWN0LmMtODY1LSAqIEZvciBlYWNoIHdzaXplJ2QgY2h1bmsgb2YgdGhlIHVzZXIncyBidWZmZXIsIGRpc3BhdGNoIGFuIE5GUyBXUklURVxcbmZzL25mcy9kaXJlY3QuYzo4NjY6ICogb3BlcmF0aW9uLiAgSWYgbmZzX3dyaXRlZGF0YV9hbGxvYygpIG9yIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsXFxuZnMvbmZzL2RpcmVjdC5jLTg2Ny0gKiBiYWlsIGFuZCBzdG9wIHNlbmRpbmcgbW9yZSB3cml0ZXMuICBXcml0ZSBsZW5ndGggYWNjb3VudGluZyBpc1xcbi0tXFxuZnMveGZzL3hmc19pbm9kZS5jPTk2PXhmc19sb2NrX2ZsYWdzX2Fzc2VydChcXG4tLVxcbmZzL3hmcy94ZnNfaW5vZGUuYy0xMjgtICogY2FuIGZhdWx0IGluIHBhZ2VzIGR1cmluZyBjb3B5IGluL291dCAoZm9yIGJ1ZmZlcmVkIElPKSBvciByZXF1aXJlIHRoZVxcbmZzL3hmcy94ZnNfaW5vZGUuYzoxMjk6ICogbW1hcF9sb2NrIGluIGdldF91c2VyX3BhZ2VzKCkgdG8gbWFwIHRoZSB1c2VyIHBhZ2VzIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzXFxuZnMveGZzL3hmc19pbm9kZS5jLTEzMC0gKiBzcGFjZSBmb3IgZGlyZWN0IElPLiBTaW1pbGFybHkgdGhlIGlfcndzZW0gY2Fubm90IGJlIHRha2VuIGluc2lkZSBhIHBhZ2VcXG4tLVxcbmluY2x1ZGUvbGludXgvbW0uaD03ODM9c3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHtcXG4tLVxcbmluY2x1ZGUvbGludXgvbW0uaC04MzQtXFxuaW5jbHVkZS9saW51eC9tbS5oOjgzNTpcXHQvKiBjYWxsZWQgYnkgYWNjZXNzX3Byb2Nlc3Nfdm0gd2hlbiBnZXRfdXNlcl9wYWdlcygpIGZhaWxzLCB0eXBpY2FsbHlcXG5pbmNsdWRlL2xpbnV4L21tLmgtODM2LVxcdCAqIGZvciB1c2UgYnkgc3BlY2lhbCBWTUFzLiBTZWUgYWxzbyBnZW5lcmljX2FjY2Vzc19waHlzKCkgZm9yIGEgZ2VuZXJpY1xcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTIxODY9c3RhdGljIGlubGluZSB2b2lkIHB1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oLTIyMjItICogTG9ja2luZzogdGhlIGxvY2tsZXNzIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gZm9saW9fdHJ5X2dldF9yY3UoKVxcbmluY2x1ZGUvbGludXgvbW0uaDoyMjIzOiAqIHByb3ZpZGVzIHNhZmUgb3BlcmF0aW9uIGZvciBnZXRfdXNlcl9wYWdlcygpLCBmb2xpb19ta2NsZWFuKCkgYW5kXFxuaW5jbHVkZS9saW51eC9tbS5oLTIyMjQtICogb3RoZXIgY2FsbHMgdGhhdCByYWNlIHRvIHNldCB1cCBwYWdlIHRhYmxlIGVudHJpZXMuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tLmg9MzI0MT1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpnZXRfdXNlcl9wYWdlX3ZtYV9yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tLmgtMzI2Ny1cXG5pbmNsdWRlL2xpbnV4L21tLmg6MzI2ODpsb25nIGdldF91c2VyX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMyNjktXFx0XFx0ICAgIHVuc2lnbmVkIGludCBndXBfZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L25pdHJvX2VuY2xhdmVzLmgtMTQ2LSAqICogTkVfRVJSX0lOVkFMSURfRkxBR19WQUxVRVxcdFxcdC0gVGhlIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBmbGFnIGlzIGludmFsaWQuXFxuaW5jbHVkZS91YXBpL2xpbnV4L25pdHJvX2VuY2xhdmVzLmg6MTQ3OiAqICogRXJyb3IgY29kZXMgZnJvbSBnZXRfdXNlcl9wYWdlcygpLlxcbmluY2x1ZGUvdWFwaS9saW51eC9uaXRyb19lbmNsYXZlcy5oLTE0OC0gKiAqIEVycm9yIGNvZGVzIGZyb20gdGhlIE5FIFBDSSBkZXZpY2UgcmVxdWVzdC5cXG4tLVxcbmtlcm5lbC9ldmVudHMvdXByb2Jlcy5jPTI0MDA9c3RhdGljIGludCBpc190cmFwX2F0X2FkZHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgdmFkZHIpXFxuLS1cXG5rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYy0yNDE1LVxcbmtlcm5lbC9ldmVudHMvdXByb2Jlcy5jOjI0MTY6XFx0cmVzdWx0ID0gZ2V0X3VzZXJfcGFnZXModmFkZHIsIDEsIEZPTExfRk9SQ0UsIFxcdTAwMjZwYWdlKTtcXG5rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYy0yNDE3LVxcdGlmIChyZXN1bHQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2Z1dGV4L2NvcmUuYz01MDI9aW50IGdldF9mdXRleF9rZXkodTMyIF9fdXNlciAqdWFkZHIsIHVuc2lnbmVkIGludCBmbGFncywgdW5pb24gZnV0ZXhfa2V5ICprZXksXFxuLS1cXG5rZXJuZWwvZnV0ZXgvY29yZS5jLTczNS0gKiBkaXNhYmxlZCBzZWN0aW9uIHNvIHdlIGNhbiBhcyB3ZWxsIGF2b2lkIHRoZSAjUEYgb3ZlcmhlYWQgYnlcXG5rZXJuZWwvZnV0ZXgvY29yZS5jOjczNjogKiBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkgcmlnaHQgYXdheS5cXG5rZXJuZWwvZnV0ZXgvY29yZS5jLTczNy0gKi9cXG4tLVxcbmxpYi9pb3ZfaXRlci5jPTEyOT1FWFBPUlRfU1lNQk9MKGZhdWx0X2luX2lvdl9pdGVyX3JlYWRhYmxlKTtcXG4tLVxcbmxpYi9pb3ZfaXRlci5jLTEzNS0gKlxcbmxpYi9pb3ZfaXRlci5jOjEzNjogKiBGYXVsdHMgaW4gdGhlIGl0ZXJhdG9yIHVzaW5nIGdldF91c2VyX3BhZ2VzKCksIGkuZS4sIHdpdGhvdXQgdHJpZ2dlcmluZ1xcbmxpYi9pb3ZfaXRlci5jLTEzNy0gKiBoYXJkd2FyZSBwYWdlIGZhdWx0cy4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0XFxuLS1cXG5tbS9LY29uZmlnPTEzMDY9Y29uZmlnIEdVUF9URVNUXFxubW0vS2NvbmZpZzoxMzA3OlxcdGJvb2wgXFxcIkVuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcXFwiXFxubW0vS2NvbmZpZy0xMzA4LVxcdGRlcGVuZHMgb24gREVCVUdfRlNcXG4tLVxcbm1tL2ZpbGVtYXAuYz0xNTA9c3RhdGljIHZvaWQgZmlsZW1hcF91bmFjY291bnRfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5tbS9maWxlbWFwLmMtMjAyLVxcdCAqIEJ1dCBpdCdzIGhhcm1sZXNzIG9uIGluLW1lbW9yeSBmaWxlc3lzdGVtcyBsaWtlIHRtcGZzOyBhbmQgY2FuXFxubW0vZmlsZW1hcC5jOjIwMzpcXHQgKiBvY2N1ciB3aGVuIGEgZHJpdmVyIHdoaWNoIGRpZCBnZXRfdXNlcl9wYWdlcygpIHNldHMgcGFnZSBkaXJ0eVxcbm1tL2ZpbGVtYXAuYy0yMDQtXFx0ICogYmVmb3JlIHB1dHRpbmcgaXQsIHdoaWxlIHRoZSBpbm9kZSBpcyBiZWluZyBmaW5hbGx5IGV2aWN0ZWQuXFxuLS1cXG5tbS9maWxlbWFwLmM9NDI4MT1nZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxcbi0tXFxubW0vZmlsZW1hcC5jLTQzMDEtXFx0ICogRmluYWxseSwgdHJ5IGFnYWluIHRvIGludmFsaWRhdGUgY2xlYW4gcGFnZXMgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuXFxubW0vZmlsZW1hcC5jOjQzMDI6XFx0ICogY2FjaGVkIGJ5IG5vbi1kaXJlY3QgcmVhZGFoZWFkLCBvciBmYXVsdGVkIGluIGJ5IGdldF91c2VyX3BhZ2VzKClcXG5tbS9maWxlbWFwLmMtNDMwMy1cXHQgKiBpZiB0aGUgc291cmNlIG9mIHRoZSB3cml0ZSB3YXMgYW4gbW1hcCdlZCByZWdpb24gb2YgdGhlIGZpbGVcXG4tLVxcbm1tL2d1cC5jPTI0Nz1zdGF0aWMgaW5saW5lIHN0cnVjdCBmb2xpbyAqZ3VwX2ZvbGlvX25leHQoc3RydWN0IHBhZ2UgKipsaXN0LFxcbi0tXFxubW0vZ3VwLmMtMjY3LSAqXFxubW0vZ3VwLmM6MjY4OiAqIFxcXCJndXAtcGlubmVkIHBhZ2VcXFwiIHJlZmVycyB0byBhIHBhZ2UgdGhhdCBoYXMgaGFkIG9uZSBvZiB0aGUgZ2V0X3VzZXJfcGFnZXMoKVxcbm1tL2d1cC5jLTI2OS0gKiB2YXJpYW50cyBjYWxsZWQgb24gdGhhdCBwYWdlLlxcbi0tXFxubW0vZ3VwLmM9OTI5PXN0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ndXAuYy05NTMtICogQSBmYWlsdXJlIG9uIHRoZSBmaXJzdCBQVEUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gQSBmYWlsdXJlIGFmdGVyIHRoYXRcXG5tbS9ndXAuYzo5NTQ6ICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLlxcbm1tL2d1cC5jLTk1NS0gKi9cXG4tLVxcbm1tL2d1cC5jPTE0MDI9c3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZ3VwX3ZtYV9sb29rdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9ndXAuYy0xNDM3LS8qKlxcbm1tL2d1cC5jOjE0Mzg6ICogX19nZXRfdXNlcl9wYWdlcygpIC0gcGluIHVzZXIgcGFnZXMgaW4gbWVtb3J5XFxubW0vZ3VwLmMtMTQzOS0gKiBAbW06XFx0XFx0bW1fc3RydWN0IG9mIHRhcmdldCBtbVxcbi0tXFxubW0vZ3VwLmMtMTQ5MC0gKi9cXG5tbS9ndXAuYzoxNDkxOnN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0vZ3VwLmMtMTQ5Mi1cXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vZ3VwLmM9MTYxMz1zdGF0aWMgYm9vbCB2bWFfcGVybWl0c19mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE2NTEtICpcXG5tbS9ndXAuYzoxNjUyOiAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBnZXRfdXNlcl9wYWdlcygpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsXFxubW0vZ3VwLmMtMTY1My0gKiB1bmNvbmRpdGlvbmFsbHkgY2FsbCBoYW5kbGVfbW1fZmF1bHQoKSB3aGljaCB3aWxsIGluIHR1cm4gcGVyZm9ybSBhbGwgdGhlXFxubW0vZ3VwLmMtMTY1NC0gKiBuZWNlc3NhcnkgU1cgZml4dXAgb2YgdGhlIGRpcnR5IGFuZCB5b3VuZyBiaXRzIGluIHRoZSBQVEUsIHdoaWxlXFxubW0vZ3VwLmM6MTY1NTogKiBnZXRfdXNlcl9wYWdlcygpIG9ubHkgZ3VhcmFudGVlcyB0byB1cGRhdGUgdGhlc2UgaW4gdGhlIHN0cnVjdCBwYWdlLlxcbm1tL2d1cC5jLTE2NTYtICpcXG4tLVxcbm1tL2d1cC5jPTE3MjY9c3RhdGljIGJvb2wgZ3VwX3NpZ25hbF9wZW5kaW5nKHVuc2lnbmVkIGludCBmbGFncylcXG4tLVxcbm1tL2d1cC5jLTE3NDYtICpcXG5tbS9ndXAuYzoxNzQ3OiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiwgdW5saWtlIF9fZ2V0X3VzZXJfcGFnZXMoKSwgd2lsbCBub3QgcmV0dXJuIDBcXG5tbS9ndXAuYy0xNzQ4LSAqIGZvciBucl9wYWdlcyBcXHUwMDNlIDAsIHVubGVzcyBGT0xMX05PV0FJVCBpcyB1c2VkLlxcbi0tXFxubW0vZ3VwLmM9MTc1MD1zdGF0aWMgX19hbHdheXNfaW5saW5lIGxvbmcgX19nZXRfdXNlcl9wYWdlc19sb2NrZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9ndXAuYy0xNzkyLVxcdGZvciAoOzspIHtcXG5tbS9ndXAuYzoxNzkzOlxcdFxcdHJldCA9IF9fZ2V0X3VzZXJfcGFnZXMobW0sIHN0YXJ0LCBucl9wYWdlcywgZmxhZ3MsIHBhZ2VzLFxcbm1tL2d1cC5jLTE3OTQtXFx0XFx0XFx0XFx0ICAgICAgIGxvY2tlZCk7XFxuLS1cXG5tbS9ndXAuYy0xODUyLVxcdFxcdCpsb2NrZWQgPSAxO1xcbm1tL2d1cC5jOjE4NTM6XFx0XFx0cmV0ID0gX19nZXRfdXNlcl9wYWdlcyhtbSwgc3RhcnQsIDEsIGZsYWdzIHwgRk9MTF9UUklFRCxcXG5tbS9ndXAuYy0xODU0LVxcdFxcdFxcdFxcdCAgICAgICBwYWdlcywgbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jPTE5MTQ9bG9uZyBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTE5NjAtXFx0ICovXFxubW0vZ3VwLmM6MTk2MTpcXHRyZXQgPSBfX2dldF91c2VyX3BhZ2VzKG1tLCBzdGFydCwgbnJfcGFnZXMsIGd1cF9mbGFncyxcXG5tbS9ndXAuYy0xOTYyLVxcdFxcdFxcdCAgICAgICBOVUxMLCBsb2NrZWQgPyBsb2NrZWQgOiBcXHUwMDI2bG9jYWxfbG9ja2VkKTtcXG4tLVxcbm1tL2d1cC5jLTE5NzktICogUmV0dXJucyBlaXRoZXIgbnVtYmVyIG9mIHByb2Nlc3NlZCBwYWdlcyBpbiB0aGUgTU0sIG9yIGEgbmVnYXRpdmUgZXJyb3JcXG5tbS9ndXAuYzoxOTgwOiAqIGNvZGUgb24gZXJyb3IgKHNlZSBfX2dldF91c2VyX3BhZ2VzKCkpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXBvcnRzXFxubW0vZ3VwLmMtMTk4MS0gKiBlcnJvcnMgcmVsYXRlZCB0byBWTUFzLCBzdWNoIGFzIGluY29tcGF0aWJsZSBtYXBwaW5ncywgYXMgZXhwZWN0ZWQgYnlcXG4tLVxcbm1tL2d1cC5jPTI3MjI9bG9uZyBnZXRfdXNlcl9wYWdlc19yZW1vdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9ndXAuYy0yNzMxLS8qKlxcbm1tL2d1cC5jOjI3MzI6ICogZ2V0X3VzZXJfcGFnZXMoKSAtIHBpbiB1c2VyIHBhZ2VzIGluIG1lbW9yeVxcbm1tL2d1cC5jLTI3MzMtICogQHN0YXJ0OiAgICAgIHN0YXJ0aW5nIHVzZXIgYWRkcmVzc1xcbi0tXFxubW0vZ3VwLmMtMjc0NC0gKi9cXG5tbS9ndXAuYzoyNzQ1OmxvbmcgZ2V0X3VzZXJfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG5tbS9ndXAuYy0yNzQ2LVxcdFxcdCAgICB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxcbi0tXFxubW0vZ3VwLmM9Mjc1Nj1FWFBPUlRfU1lNQk9MKGdldF91c2VyX3BhZ2VzKTtcXG4tLVxcbm1tL2d1cC5jLTI3NjEtICogICAgICBtbWFwX3JlYWRfbG9jayhtbSk7XFxubW0vZ3VwLmM6Mjc2MjogKiAgICAgIGdldF91c2VyX3BhZ2VzKG1tLCAuLi4sIHBhZ2VzLCBOVUxMKTtcXG5tbS9ndXAuYy0yNzYzLSAqICAgICAgbW1hcF9yZWFkX3VubG9jayhtbSk7XFxuLS1cXG5tbS9ndXAuYz0zMzU5PUVYUE9SVF9TWU1CT0xfR1BMKGdldF91c2VyX3BhZ2VzX2Zhc3Rfb25seSk7XFxuLS1cXG5tbS9ndXAuYy0zMzcwLSAqIElmIG5vdCBzdWNjZXNzZnVsLCBpdCB3aWxsIGZhbGwgYmFjayB0byB0YWtpbmcgdGhlIGxvY2sgYW5kXFxubW0vZ3VwLmM6MzM3MTogKiBjYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkuXFxubW0vZ3VwLmMtMzM3Mi0gKlxcbi0tXFxubW0vZ3VwLmM9MzQ1Nz1FWFBPUlRfU1lNQk9MKHBpbl91c2VyX3BhZ2VzX3JlbW90ZSk7XFxuLS1cXG5tbS9ndXAuYy0zNDY3LSAqXFxubW0vZ3VwLmM6MzQ2ODogKiBOZWFybHkgdGhlIHNhbWUgYXMgZ2V0X3VzZXJfcGFnZXMoKSwgZXhjZXB0IHRoYXQgRk9MTF9UT1VDSCBpcyBub3Qgc2V0LCBhbmRcXG5tbS9ndXAuYy0zNDY5LSAqIEZPTExfUElOIGlzIHNldC5cXG4tLVxcbm1tL2d1cF90ZXN0LmM9MTAxPXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0xNDctXFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG5tbS9ndXBfdGVzdC5jOjE0ODpcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncywgcGFnZXMgKyBpKTtcXG5tbS9ndXBfdGVzdC5jLTE0OS1cXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTY2LVxcdFxcdFxcdGVsc2VcXG5tbS9ndXBfdGVzdC5jOjE2NzpcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE2OC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4tLVxcbm1tL2htbS5jPTYzMT1zdGF0aWMgY29uc3Qgc3RydWN0IG1tX3dhbGtfb3BzIGhtbV93YWxrX29wcyA9IHtcXG4tLVxcbm1tL2htbS5jLTY1NS0gKlxcbm1tL2htbS5jOjY1NjogKiBUaGlzIGlzIHNpbWlsYXIgdG8gZ2V0X3VzZXJfcGFnZXMoKSwgZXhjZXB0IHRoYXQgaXQgY2FuIHJlYWQgdGhlIHBhZ2UgdGFibGVzXFxubW0vaG1tLmMtNjU3LSAqIHdpdGhvdXQgbXV0YXRpbmcgdGhlbSAoaWUgY2F1c2luZyBmYXVsdHMpLlxcbi0tXFxubW0vbWFkdmlzZS5jPTE4ODc9c3RhdGljIGludCBtYWR2aXNlX2RvX2JlaGF2aW9yKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW5faW4sXFxuLS1cXG5tbS9tYWR2aXNlLmMtMTkzOC0gKiAgTUFEVl9ET05URk9SSyAtIG9taXQgdGhpcyBhcmVhIGZyb20gY2hpbGQncyBhZGRyZXNzIHNwYWNlIHdoZW4gZm9ya2luZzpcXG5tbS9tYWR2aXNlLmM6MTkzOTogKlxcdFxcdHR5cGljYWxseSwgdG8gYXZvaWQgQ09XaW5nIHBhZ2VzIHBpbm5lZCBieSBnZXRfdXNlcl9wYWdlcygpLlxcbm1tL21hZHZpc2UuYy0xOTQwLSAqICBNQURWX0RPRk9SSyAtIGNhbmNlbCBNQURWX0RPTlRGT1JLOiBubyBsb25nZXIgb21pdCB0aGlzIGFyZWEgd2hlbiBmb3JraW5nLlxcbi0tXFxubW0vbWVtZmQuYz02Nz1zdHJ1Y3QgZm9saW8gKm1lbWZkX2FsbG9jX2ZvbGlvKHN0cnVjdCBmaWxlICptZW1mZCwgcGdvZmZfdCBpZHgpXFxuLS1cXG5tbS9tZW1mZC5jLTE0Ny0gKiBTZXR0aW5nIFNFQUxfV1JJVEUgcmVxdWlyZXMgdXMgdG8gdmVyaWZ5IHRoZXJlJ3Mgbm8gcGVuZGluZyB3cml0ZXIuIEhvd2V2ZXIsXFxubW0vbWVtZmQuYzoxNDg6ICogdmlhIGdldF91c2VyX3BhZ2VzKCksIGRyaXZlcnMgbWlnaHQgaGF2ZSBzb21lIHBlbmRpbmcgSS9PIHdpdGhvdXQgYW55IGFjdGl2ZVxcbm1tL21lbWZkLmMtMTQ5LSAqIHVzZXItc3BhY2UgbWFwcGluZ3MgKGVnLiwgZGlyZWN0LUlPLCBBSU8pLiBUaGVyZWZvcmUsIHdlIGxvb2sgYXQgYWxsIGZvbGlvc1xcbi0tXFxubW0vbWxvY2suYz01Nzc9c3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRfbW1fbWxvY2tlZF9wYWdlX25yKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0vbWxvY2suYy02MDYtLypcXG5tbS9tbG9jay5jOjYwNzogKiBjb252ZXJ0IGdldF91c2VyX3BhZ2VzKCkgcmV0dXJuIHZhbHVlIHRvIHBvc2l4IG1sb2NrKCkgZXJyb3JcXG5tbS9tbG9jay5jLTYwOC0gKi9cXG4tLVxcbm1tL3BhZ2V3YWxrLmM9ODAwPWludCB3YWxrX3BhZ2VfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBmaXJzdF9pbmRleCxcXG4tLVxcbm1tL3BhZ2V3YWxrLmMtODgxLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCAqbm90KiBiZSB1c2VkIGFzIGEgbmFpdmUgcmVwbGFjZW1lbnQgZm9yXFxubW0vcGFnZXdhbGsuYzo4ODI6ICogZ2V0X3VzZXJfcGFnZXMoKSAvIHBpbl91c2VyX3BhZ2VzKCksIGVzcGVjaWFsbHkgbm90IHRvIHBlcmZvcm0gRE1BIG9yXFxubW0vcGFnZXdhbGsuYy04ODMtICogdG8gY2FyZWxlc3NseSBtb2RpZnkgcGFnZSBjb250ZW50LiBUaGlzIGZ1bmN0aW9uIG1heSAqb25seSogYmUgdXNlZCB0byBncmFiXFxuLS1cXG5tbS92bXNjYW4uYz02Nzk9c3RhdGljIGludCBfX3JlbW92ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbi0tXFxubW0vdm1zY2FuLmMtNzAzLVxcdCAqXFxubW0vdm1zY2FuLmM6NzA0OlxcdCAqIGdldF91c2VyX3BhZ2VzKFxcdTAwMjZwYWdlKTtcXG5tbS92bXNjYW4uYy03MDUtXFx0ICogW3VzZXIgbWFwcGluZyBnb2VzIGF3YXldXFxuLS1cXG5uZXQvcmRzL2luZm8uYz0xMDU9dm9pZCByZHNfaW5mb19pdGVyX3VubWFwKHN0cnVjdCByZHNfaW5mb19pdGVyYXRvciAqaXRlcilcXG4tLVxcbm5ldC9yZHMvaW5mby5jLTExMy0vKlxcbm5ldC9yZHMvaW5mby5jOjExNDogKiBnZXRfdXNlcl9wYWdlcygpIGNhbGxlZCBmbHVzaF9kY2FjaGVfcGFnZSgpIG9uIHRoZSBwYWdlcyBmb3IgdXMuXFxubmV0L3Jkcy9pbmZvLmMtMTE1LSAqL1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvaW9tbXUvaW9tbXVmZC5jPTE4MTI9VEVTVF9GKGlvbW11ZmRfbW9ja19kb21haW4sIHJvX3Vuc2hhcmUpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9pb21tdS9pb21tdWZkLmMtMTgyNi1cXHQgKiBUaGVyZSBoYXZlIGJlZW4gbG90cyBvZiBjaGFuZ2VzIHRvIHRoZSBcXFwidW5zaGFyZVxcXCIgbWVjaGFuaXNtIGluXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvaW9tbXUvaW9tbXVmZC5jOjE4Mjc6XFx0ICogZ2V0X3VzZXJfcGFnZXMoKSwgbWFrZSBzdXJlIGl0IHdvcmtzIHJpZ2h0LiBUaGUgd3JpdGUgdG8gdGhlIHBhZ2VcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9pb21tdS9pb21tdWZkLmMtMTgyOC1cXHQgKiBhZnRlciB3ZSBtYXAgaXQgZm9yIHJlYWRpbmcgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGFzc2lnbmVkIFBGTi5cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfbW50LmMtOC0gKiBwYWdlcyBkdXJpbmcgcmVhZHMoKS4gRHVlIHRvIHRoZSAxcyBkZWxheSBvZiB0aGlzIGZpbGUtc3lzdGVtLCB0aGlzIGlzIGFcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX21udC5jOjk6ICogbmljZSB3YXkgdG8gdGVzdCByYWNlLWNvbmRpdGlvbnMgYWdhaW5zdCBnZXRfdXNlcl9wYWdlcygpIGluIHRoZSBrZXJuZWwuXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV9tbnQuYy0xMC0gKlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmMtMy0gKiBtZW1mZCBHVVAgdGVzdC1jYXNlXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmM6NDogKiBUaGlzIHRlc3RzIG1lbWZkIGludGVyYWN0aW9ucyB3aXRoIGdldF91c2VyX3BhZ2VzKCkuIFdlIHJlcXVpcmUgdGhlXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvZnVzZV90ZXN0LmMtNS0gKiBmdXNlX21udC5jIHByb2dyYW0gdG8gcHJvdmlkZSBhIGZha2UgZGlyZWN0LUlPIEZVU0UgbW91bnQtcG9pbnQgZm9yIHVzLiBUaGlzXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYy03LSAqIHJlYWQoKSBvbiBmaWxlcyBpbiB0aGF0IGZpbGUtc3lzdGVtIHdpbGwgcGluIHRoZSByZWNlaXZlLWJ1ZmZlciBwYWdlcyBmb3IgYXRcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1mZC9mdXNlX3Rlc3QuYzo4OiAqIGxlYXN0IDFzIHZpYSBnZXRfdXNlcl9wYWdlcygpLlxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL2Z1c2VfdGVzdC5jLTktICpcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvdm1hL2luY2x1ZGUvZHVwLmg9NjMyPXN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB7XFxuLS1cXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4My1cXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oOjY4NDpcXHQvKiBjYWxsZWQgYnkgYWNjZXNzX3Byb2Nlc3Nfdm0gd2hlbiBnZXRfdXNlcl9wYWdlcygpIGZhaWxzLCB0eXBpY2FsbHlcXG50b29scy90ZXN0aW5nL3ZtYS9pbmNsdWRlL2R1cC5oLTY4NS1cXHQgKiBmb3IgdXNlIGJ5IHNwZWNpYWwgVk1Bcy4gU2VlIGFsc28gZ2VuZXJpY19hY2Nlc3NfcGh5cygpIGZvciBhIGdlbmVyaWNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6NDAuMTc0OTQ2MTY0WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgwODM0NDM5MzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgR1VQIFJlZmFjdG9yKipcblxuT2theSwgc28gSSBzZWUgdGhpcyBwYXRjaCBpcyB0YWNrbGluZyB0aGUgY29yZSBcIkdldCBVc2VyIFBhZ2VzXCIgKEdVUCkgbG9naWMgd2l0aGluIGBtbS9ndXAuY2AuIFRoaXMgaXMgYSAqbWFqb3IqIHJlZmFjdG9yLCBhbmQgaXQncyBhIGNyaXRpY2FsIGFyZWEuIGBnZXRfdXNlcl9wYWdlc2AgaXMgdGhlIGxpbmNocGluOyBpdCdzIHRoZSBwcmltYXJ5IEFQSSB1c2VkIGJ5IGEgaHVnZSBudW1iZXIgb2YgZHJpdmVycywgc28gaXQgaGFzIHRvIGJlIG9uIHRoZSBsaXN0LiBJJ2xsIGRlZmluaXRlbHkgYmUgaW5jbHVkaW5nIHRoYXQgb25lLlxuXG5Mb29raW5nIGF0IHRoZSBvdGhlciBmb2N1cyBzeW1ib2xzLCBJIHNlZSB0aGVyZSdzIGEgZmFtaWx5IG9mIGZ1bmN0aW9uczogYGdldF91c2VyX3BhZ2VzX3JlbW90ZWAsIGBnZXRfdXNlcl9wYWdlc191bmxvY2tlZGAsIGBwaW5fdXNlcl9wYWdlc2AsIGBwaW5fdXNlcl9wYWdlc19yZW1vdGVgLCBgcGluX3VzZXJfcGFnZXNfdW5sb2NrZWRgLCBgZmF1bHRpbl9wYWdlX3JhbmdlYCwgYW5kIGBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZWAuIFRoZXkgYXJlIGFsbCByZWxhdGVkIHRvIHBpbm5pbmcgb3IgZmF1bHRpbmcgaW4gdXNlciBwYWdlcywgd2hpY2ggYXJlIHVzZWQgdG8gYWNjZXNzIHVzZXItc3BhY2UgbWVtb3J5IGZyb20gdGhlIGtlcm5lbC4gVGhpcyBhbHNvIHN1Z2dlc3RzIHRoYXQgdGhlcmUgYXJlIHNpbWlsYXIgY2hhbmdlcyB0aGF0IHdlcmUgZG9uZS4gVGhlc2UgYWxsIG5lZWQgdG8gYmUgY2FyZWZ1bGx5IGV4YW1pbmVkIGFzIHdlbGwuIFRoZSBpbXBsaWNhdGlvbnMgb2YgYmF0Y2hpbmcgcGFnZSB0YWJsZSB3YWxrcyBmb3IgdGhlc2UgYXJlIHNpZ25pZmljYW50LlxuXG5BbmQgb2YgY291cnNlLCBjb25zaWRlcmluZyB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYEhVR0VUTEJGU2AgY29uZmlnIG9wdGlvbnMgYXJlIGFsc28gbWVudGlvbmVkLCBJIG5lZWQgdG8ga2VlcCB0aG9zZSBpbiBtaW5kLiBBbnkgY2hhbmdlcyBoZXJlIGNvdWxkIGhhdmUgZmFyLXJlYWNoaW5nIGVmZmVjdHMgd2hlbiB0aG9zZSBmZWF0dXJlcyBhcmUgZW5hYmxlZC5cblxuVGhlIHJlYXNvbmluZyBoZXJlIGlzIHNvbGlkLiBUaGUgcGF0Y2ggaXMgZnVuZGFtZW50YWxseSBjaGFuZ2luZyBob3cgR1VQIHdvcmtzIOKAkyBiYXRjaGluZyBwYWdlIHRhYmxlIHdhbGtzIG1lYW5zIGltcHJvdmVkIHBlcmZvcm1hbmNlLCBidXQgYWxzbyBhIHBvdGVudGlhbCBmb3IgbmV3IGVkZ2UgY2FzZXMgYW5kIHZ1bG5lcmFiaWxpdGllcyB0byBhcHBlYXIuIEJlY2F1c2UgdGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaXMgdG91Y2hlZCBieSBzbyBtYW55IHN5c3RlbSBjYWxscyAobW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KSwgdGhlIGF0dGFjayBzdXJmYWNlIGlzIHN1YnN0YW50aWFsLiBGdXp6aW5nIHRoZSBHVVAgQVBJIGVudHJ5IHBvaW50cyBpcyB0aGUgcmlnaHQgYXBwcm9hY2guXG5cbkknbGwgdXNlIGBzZXQtcmVzdWx0c2AgdG8gcmVwb3J0IHRoaXMuIE15IHJlcG9ydCB3aWxsIGlkZW50aWZ5IHRoZSBzaWduaWZpY2FudCBjaGFuZ2VzIGFuZCB0aGUgZm9jdXMgbmVlZGVkIGZvciBlbnN1cmluZyB0aGUgY29kZSBpcyBjb3JyZWN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjozODA1MywiT3V0cHV0VG9rZW5zIjoyMTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6NDguMjU4MzkzMTk4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE4Njk2MTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiSFVHRVRMQkZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3VzZXJfcGFnZXNcIixcbiAgICBcImdldF91c2VyX3BhZ2VzX3JlbW90ZVwiLFxuICAgIFwiZ2V0X3VzZXJfcGFnZXNfdW5sb2NrZWRcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc19yZW1vdGVcIixcbiAgICBcInBpbl91c2VyX3BhZ2VzX3VubG9ja2VkXCIsXG4gICAgXCJmYXVsdGluX3BhZ2VfcmFuZ2VcIixcbiAgICBcInBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBjb3JlIEdldCBVc2VyIFBhZ2VzIChHVVApIGxvZ2ljIGluIGBtbS9ndXAuY2AgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxrcyBhbmQgcmV0dXJuIG11bHRpcGxlIHBhZ2VzIGF0IG9uY2UgaW5zdGVhZCBvZiBvbmUgYnkgb25lLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIHRoYXQgaXMgcmVhY2hhYmxlIHZpYSBtYW55IHN5c2NhbGxzIChlLmcuLCBtbWFwLCBtYWR2aXNlLCBwdHJhY2UsIHByb2Nlc3Nfdm1fcmVhZHYpLiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgZXhwb3J0ZWQgR1VQIEFQSSBlbnRyeSBwb2ludHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkhVR0VUTEJGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF91c2VyX3BhZ2VzXCIsXG4gICAgXCJnZXRfdXNlcl9wYWdlc19yZW1vdGVcIixcbiAgICBcImdldF91c2VyX3BhZ2VzX3VubG9ja2VkXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc1wiLFxuICAgIFwicGluX3VzZXJfcGFnZXNfcmVtb3RlXCIsXG4gICAgXCJwaW5fdXNlcl9wYWdlc191bmxvY2tlZFwiLFxuICAgIFwiZmF1bHRpbl9wYWdlX3JhbmdlXCIsXG4gICAgXCJwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgY29yZSBHZXQgVXNlciBQYWdlcyAoR1VQKSBsb2dpYyBpbiBgbW0vZ3VwLmNgIHRvIGJhdGNoIHBhZ2UgdGFibGUgd2Fsa3MgYW5kIHJldHVybiBtdWx0aXBsZSBwYWdlcyBhdCBvbmNlIGluc3RlYWQgb2Ygb25lIGJ5IG9uZS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSB0aGF0IGlzIHJlYWNoYWJsZSB2aWEgbWFueSBzeXNjYWxscyAoZS5nLiwgbW1hcCwgbWFkdmlzZSwgcHRyYWNlLCBwcm9jZXNzX3ZtX3JlYWR2KS4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIGV4cG9ydGVkIEdVUCBBUEkgZW50cnkgcG9pbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1Njo0OC4zNzcwOTY4NjVaIiwiU2VxIjozMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzg3OTE2NDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTY6NDguMzc3NjE4NDM1WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjIzMzg3MzkwODAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2N2U2NzZlOGIwMzhlMDFjY2RjNjI3ODU3NjkzNmQ2MGQ5YjdhYjg0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgMTIgMTY6NTU6MTEgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jXG5pbmRleCAwNjkyMTE5Yjc5MDQzLi4xMDY4MDY2MzRiM2M0IDEwMDY0NFxuLS0tIGEvbW0vZ3VwLmNcbisrKyBiL21tL2d1cC5jXG5AQCAtNjA4LDE1ICs2MDgsMTUgQEAgc3RhdGljIGlubGluZSBib29sIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0cmV0dXJuIHBhZ2UgXHUwMDI2XHUwMDI2IFBhZ2VBbm9uKHBhZ2UpIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbitzdGF0aWMgbG9uZyBub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbiB7XG4gXHRpZiAoIShmbGFncyBcdTAwMjYgRk9MTF9EVU1QKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0LypcbiBcdCAqIFdoZW4gY29yZSBkdW1waW5nLCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHVubmVjZXNzYXJ5IHBhZ2VzIG9yXG4tXHQgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIE5VTEwgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsXG4rXHQgKiBwYWdlIHRhYmxlcy4gIFJldHVybiBlcnJvciBpbnN0ZWFkIG9mIDAgdG8gc2tpcCBoYW5kbGVfbW1fZmF1bHQsXG4gXHQgKiB0aGVuIGdldF9kdW1wX3BhZ2UoKSB3aWxsIHJldHVybiBOVUxMIHRvIGxlYXZlIGEgaG9sZSBpbiB0aGUgZHVtcC5cbiBcdCAqIEJ1dCB3ZSBjYW4gb25seSBtYWtlIHRoaXMgb3B0aW1pemF0aW9uIHdoZXJlIGEgaG9sZSB3b3VsZCBzdXJlbHlcbiBcdCAqIGJlIHplcm8tZmlsbGVkIGlmIGhhbmRsZV9tbV9mYXVsdCgpIGFjdHVhbGx5IGRpZCBoYW5kbGUgaXQuXG5AQCAtNjI1LDEyICs2MjUsMjkgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpub19wYWdlX3RhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xuIFxuIFx0XHRpZiAoIWh1Z2V0bGJmc19wYWdlY2FjaGVfcHJlc2VudChoLCB2bWEsIGFkZHJlc3MpKVxuLVx0XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuK1x0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fSBlbHNlIGlmICgodm1hX2lzX2Fub255bW91cyh2bWEpIHx8ICF2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWZhdWx0KSkge1xuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHR9XG4gXG4tXHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBndXBfZmlsbF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBuciwgc3RydWN0IHBhZ2UgKipwYWdlcylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRpZiAoIXBhZ2VzKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKSB7XG4rXHRcdHN0cnVjdCBwYWdlICpzdWJwYWdlID0gcGFnZSArIGk7XG4rXG4rXHRcdHBhZ2VzW2ldID0gc3VicGFnZTtcbitcdFx0Zmx1c2hfYW5vbl9wYWdlKHZtYSwgc3VicGFnZSwgYWRkcmVzcyArIGkgKiBQQUdFX1NJWkUpO1xuK1x0XHRmbHVzaF9kY2FjaGVfcGFnZShzdWJwYWdlKTtcbitcdH1cbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFU1xuQEAgLTY0NiwzOCArNjYzLDQzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZm9sbG93X3dyaXRlX3B1ZChwdWRfdCBwdWQsIHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0cmV0dXJuIGNhbl9mb2xsb3dfd3JpdGVfY29tbW9uKHBhZ2UsIHZtYSwgZmxhZ3MpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcHVkX3QgKnB1ZHAsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuIFx0cHVkX3QgcHVkID0gKnB1ZHA7XG4gXHR1bnNpZ25lZCBsb25nIHBmbiA9IHB1ZF9wZm4ocHVkKTtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmLCBucjtcbiBcdGludCByZXQ7XG4gXG4gXHRhc3NlcnRfc3Bpbl9sb2NrZWQocHVkX2xvY2twdHIobW0sIHB1ZHApKTtcbiBcbiBcdGlmICghcHVkX3ByZXNlbnQocHVkKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4gXHQgICAgIWNhbl9mb2xsb3dfd3JpdGVfcHVkKHB1ZCwgcGZuX3RvX3BhZ2UocGZuKSwgdm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbi1cdHBmbiArPSAoYWRkciBcdTAwMjYgflBVRF9NQVNLKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdG9mZiA9IFBGTl9ET1dOKGFkZHIgXHUwMDI2IH5QVURfTUFTSyk7XG4rXHRwZm4gKz0gb2ZmO1xuIFx0cGFnZSA9IHBmbl90b19wYWdlKHBmbik7XG4gXG4gXHRpZiAoIXB1ZF93cml0ZShwdWQpIFx1MDAyNlx1MDAyNiBndXBfbXVzdF91bnNoYXJlKHZtYSwgZmxhZ3MsIHBhZ2UpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU1MSU5LKTtcbitcdFx0cmV0dXJuIC1FTUxJTks7XG4rXG4rXHRuciA9IG1pbihIUEFHRV9QVURfTlIgLSBvZmYsIFBGTl9ET1dOKGVuZCAtIGFkZHIpKTtcbiBcbi1cdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIDEsIGZsYWdzKTtcbitcdHJldCA9IHRyeV9ncmFiX2ZvbGlvKHBhZ2VfZm9saW8ocGFnZSksIG5yLCBmbGFncyk7XG4gXHRpZiAocmV0KVxuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0ZWxzZVxuLVx0XHQqcGFnZV9tYXNrID0gSFBBR0VfUFVEX05SIC0gMTtcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGlmIChwYWdlcylcbitcdFx0cGFnZXNbMF0gPSBwYWdlO1xuIFxuLVx0cmV0dXJuIHBhZ2U7XG4rXHRyZXR1cm4gbnI7XG4gfVxuIFxuIC8qIEZPTExfRk9SQ0UgY2FuIHdyaXRlIHRvIGV2ZW4gdW53cml0YWJsZSBQTURzIGluIENPVyBtYXBwaW5ncy4gKi9cbkBAIC02OTgsMTQgKzcyMCwxNCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kX3QgcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfaHVnZV9wbWRfd3Aodm1hLCBwbWQpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWQsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHBtZF90ICpwbWQsXG4rXHRcdHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcylcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdHBtZF90IHBtZHZhbCA9ICpwbWQ7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdHVuc2lnbmVkIGxvbmcgb2ZmLCBucjtcbiBcdGludCByZXQ7XG4gXG4gXHRhc3NlcnRfc3Bpbl9sb2NrZWQocG1kX2xvY2twdHIobW0sIHBtZCkpO1xuQEAgLTcxMyw1MCArNzM1LDU0IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0cGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XG4gXHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbiBcdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wbWQocG1kdmFsLCBwYWdlLCB2bWEsIGZsYWdzKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0LyogQXZvaWQgZHVtcGluZyBodWdlIHplcm8gcGFnZSAqL1xuIFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9EVU1QKSBcdTAwMjZcdTAwMjYgaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4gXHRpZiAocG1kX3Byb3Rub25lKCpwbWQpIFx1MDAyNlx1MDAyNiAhZ3VwX2Nhbl9mb2xsb3dfcHJvdG5vbmUodm1hLCBmbGFncykpXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRyZXR1cm4gMDtcbiBcbiBcdGlmICghcG1kX3dyaXRlKHBtZHZhbCkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTUxJTkspO1xuK1x0XHRyZXR1cm4gLUVNTElOSztcbiBcbiBcdFZNX1dBUk5fT05fT05DRV9QQUdFKChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIFx1MDAyNlx1MDAyNiBQYWdlQW5vbihwYWdlKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgICFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgcGFnZSk7XG4gXG4tXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCAxLCBmbGFncyk7XG4rXHRvZmYgPSBQRk5fRE9XTihhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuK1x0bnIgPSBtaW4oSFBBR0VfUE1EX05SIC0gb2ZmLCBQRk5fRE9XTihlbmQgLSBhZGRyKSk7XG4rXG4rXHRyZXQgPSB0cnlfZ3JhYl9mb2xpbyhwYWdlX2ZvbGlvKHBhZ2UpLCBuciwgZmxhZ3MpO1xuIFx0aWYgKHJldClcbi1cdFx0cmV0dXJuIEVSUl9QVFIocmV0KTtcbitcdFx0cmV0dXJuIHJldDtcbiBcbiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXG4gXHRpZiAocG1kX3RyYW5zX2h1Z2UocG1kdmFsKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSlcbiBcdFx0dG91Y2hfcG1kKHZtYSwgYWRkciwgcG1kLCBmbGFncyBcdTAwMjYgRk9MTF9XUklURSk7XG4gI2VuZGlmXHQvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi9cbiBcbi1cdHBhZ2UgKz0gKGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tXHQqcGFnZV9tYXNrID0gSFBBR0VfUE1EX05SIC0gMTtcbitcdHBhZ2UgKz0gb2ZmO1xuK1xuK1x0aWYgKHBhZ2VzKVxuK1x0XHRwYWdlc1swXSA9IHBhZ2U7XG4gXG4tXHRyZXR1cm4gcGFnZTtcbitcdHJldHVybiBucjtcbiB9XG4gXG4gI2Vsc2UgIC8qIENPTkZJR19QR1RBQkxFX0hBU19IVUdFX0xFQVZFUyAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZHAsXG4tXHRcdFx0XHQgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X2h1Z2VfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwdWRfdCAqcHVkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbi1cdHJldHVybiBOVUxMO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgKnBtZCxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqcGFnZV9tYXNrKVxuK3N0YXRpYyBsb25nIGZvbGxvd19odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbi1cdHJldHVybiBOVUxMO1xuK1x0cmV0dXJuIDA7XG4gfVxuICNlbmRpZlx0LyogQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTICovXG4gXG5AQCAtNzk5LDExMCArODI1LDIwNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdHJldHVybiAhdXNlcmZhdWx0ZmRfcHRlX3dwKHZtYSwgcHRlKTtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwgdW5zaWduZWQgaW50IGZsYWdzKVxuKy8qXG4rICogVGhlIGNhbGxlciBoYXMgYWxyZWFkeSBydW4gZXZlcnkgcGVyLVBURSBzYWZldHkgY2hlY2sgKHByZXNlbnQsXG4rICogd3JpdGUtZmF1bHQsIGd1cF9tdXN0X3Vuc2hhcmUoKSkgb24gdGhlIFBURSwgc28gdGhpcyBvbmx5IGRvZXMgdGhlXG4rICogcGVyLWZvbGlvIHdvcms6IHRoZSByZWZjb3VudCBncmFiLCB0aGUgRk9MTF9QSU4gYWNjZXNzaWJpbGl0eSBmYXVsdC1pbixcbisgKiBkaXJ0eS9hY2Nlc3NlZCBtYXJraW5nLCBhbmQgdGhlIGFycmF5IGZpbGwgd2l0aCB0aGUgY2FjaGUgZmx1c2guXG4rICovXG4rc3RhdGljIGxvbmcgZm9sbG93X3BhZ2VfcHRlX2NvbW1pdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSxcbitcdFx0cHRlX3QgcHRlLCB1bnNpZ25lZCBsb25nIG5yLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4rXHRcdHN0cnVjdCBwYWdlICoqcGFnZXMpXG4re1xuK1x0bG9uZyByZXQ7XG4rXG4rXHQvKiB0cnlfZ3JhYl9mb2xpbygpIGRvZXMgbm90aGluZyB1bmxlc3MgRk9MTF9HRVQgb3IgRk9MTF9QSU4gaXMgc2V0LiAqL1xuK1x0cmV0ID0gdHJ5X2dyYWJfZm9saW8oZm9saW8sIG5yLCBmbGFncyk7XG4rXHRpZiAodW5saWtlbHkocmV0KSlcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qXG4rXHQgKiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhZ2UgYWNjZXNzaWJsZSBpZiBhbmQgb25seSBpZiB3ZSBhcmUgZ29pbmdcbitcdCAqIHRvIGFjY2VzcyBpdHMgY29udGVudCAodGhlIEZPTExfUElOIGNhc2UpLiAgUGxlYXNlIHNlZVxuK1x0ICogRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9waW5fdXNlcl9wYWdlcy5yc3QgZm9yIGRldGFpbHMuXG4rXHQgKi9cbitcdGlmIChmbGFncyBcdTAwMjYgRk9MTF9QSU4pIHtcbitcdFx0cmV0ID0gYXJjaF9tYWtlX2ZvbGlvX2FjY2Vzc2libGUoZm9saW8pO1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0Z3VwX3B1dF9mb2xpbyhmb2xpbywgbnIsIGZsYWdzKTtcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHR9XG4rXHR9XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfVE9VQ0gpIHtcbitcdFx0aWYgKChmbGFncyBcdTAwMjYgRk9MTF9XUklURSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhcHRlX2RpcnR5KHB0ZSkgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0LypcbitcdFx0ICogcHRlX21reW91bmcoKSB3b3VsZCBiZSBtb3JlIGNvcnJlY3QgaGVyZSwgYnV0IGF0b21pYyBjYXJlXG4rXHRcdCAqIGlzIG5lZWRlZCB0byBhdm9pZCBsb3NpbmcgdGhlIGRpcnR5IGJpdDogaXQgaXMgZWFzaWVyIHRvIHVzZVxuK1x0XHQgKiBmb2xpb19tYXJrX2FjY2Vzc2VkKCkuXG4rXHRcdCAqL1xuK1x0XHRmb2xpb19tYXJrX2FjY2Vzc2VkKGZvbGlvKTtcbitcdH1cbitcbitcdGd1cF9maWxsX3BhZ2VzKHZtYSwgYWRkcmVzcywgcGFnZSwgbnIsIHBhZ2VzKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFJlc29sdmUgb25lIHByZXNlbnQgUFRFIHRvIHRoZSBwYWdlIGl0IG1hcHMuIFJldHVybnMgbm8gcGFnZSBhbmQgbm8gZXJyb3JcbisgKiB3aGVuIHRoZSBQVEUgY2Fubm90IGJlIGZvbGxvd2VkIGJ1dCB0aGUgY2FsbGVyIG1heSBmYXVsdCBpdCBpbiwgYW5kIGFcbisgKiBuZWdhdGl2ZSBlcnJubyB3aGVuIHRoZSBjYWxsZXIgbXVzdCByZXBvcnQgdGhlIGZhaWx1cmUuXG4rICovXG4rc3RhdGljIGxvbmcgZm9sbG93X29uZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbitcdFx0cHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VwKVxuIHtcbi1cdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuLVx0c3RydWN0IGZvbGlvICpmb2xpbztcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuLVx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0cHRlX3QgKnB0ZXAsIHB0ZTtcbi1cdGludCByZXQ7XG4gXG4tXHRwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCBcdTAwMjZwdGwpO1xuLVx0aWYgKCFwdGVwKVxuLVx0XHRyZXR1cm4gbm9fcGFnZV90YWJsZSh2bWEsIGZsYWdzLCBhZGRyZXNzKTtcbi1cdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuK1x0KnBhZ2VwID0gTlVMTDtcbitcbiBcdGlmICghcHRlX3ByZXNlbnQocHRlKSlcbi1cdFx0Z290byBub19wYWdlO1xuK1x0XHRyZXR1cm4gMDtcbiBcdGlmIChwdGVfcHJvdG5vbmUocHRlKSBcdTAwMjZcdTAwMjYgIWd1cF9jYW5fZm9sbG93X3Byb3Rub25lKHZtYSwgZmxhZ3MpKVxuLVx0XHRnb3RvIG5vX3BhZ2U7XG4rXHRcdHJldHVybiAwO1xuIFxuIFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkcmVzcywgcHRlKTtcbiBcbiBcdC8qXG4gXHQgKiBXZSBvbmx5IGNhcmUgYWJvdXQgYW5vbiBwYWdlcyBpbiBjYW5fZm9sbG93X3dyaXRlX3B0ZSgpLlxuIFx0ICovXG4tXHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjZcbi1cdCAgICAhY2FuX2ZvbGxvd193cml0ZV9wdGUocHRlLCBwYWdlLCB2bWEsIGZsYWdzKSkge1xuLVx0XHRwYWdlID0gTlVMTDtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4rXHRpZiAoKGZsYWdzIFx1MDAyNiBGT0xMX1dSSVRFKSBcdTAwMjZcdTAwMjYgIWNhbl9mb2xsb3dfd3JpdGVfcHRlKHB0ZSwgcGFnZSwgdm1hLCBmbGFncykpXG4rXHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKHVubGlrZWx5KCFwYWdlKSkge1xuIFx0XHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfRFVNUCkge1xuIFx0XHRcdC8qIEF2b2lkIHNwZWNpYWwgKGxpa2UgemVybykgcGFnZXMgaW4gY29yZSBkdW1wcyAqL1xuLVx0XHRcdHBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGlmIChpc196ZXJvX3BmbihwdGVfcGZuKHB0ZSkpKSB7XG4tXHRcdFx0cGFnZSA9IHB0ZV9wYWdlKHB0ZSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0cmV0ID0gZm9sbG93X3Bmbl9wdGUodm1hLCBhZGRyZXNzLCBwdGVwLCBmbGFncyk7XG4tXHRcdFx0cGFnZSA9IEVSUl9QVFIocmV0KTtcbi1cdFx0XHRnb3RvIG91dDtcbitcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0fVxuK1x0XHRpZiAoIWlzX3plcm9fcGZuKHB0ZV9wZm4ocHRlKSkpXG4rXHRcdFx0cmV0dXJuIGZvbGxvd19wZm5fcHRlKHZtYSwgYWRkcmVzcywgcHRlcCwgZmxhZ3MpO1xuK1x0XHRwYWdlID0gcHRlX3BhZ2UocHRlKTtcbiBcdH1cbi1cdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiBcbi1cdGlmICghcHRlX3dyaXRlKHB0ZSkgXHUwMDI2XHUwMDI2IGd1cF9tdXN0X3Vuc2hhcmUodm1hLCBmbGFncywgcGFnZSkpIHtcbi1cdFx0cGFnZSA9IEVSUl9QVFIoLUVNTElOSyk7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuK1x0aWYgKCFwdGVfd3JpdGUocHRlKSBcdTAwMjZcdTAwMjYgZ3VwX211c3RfdW5zaGFyZSh2bWEsIGZsYWdzLCBwYWdlKSlcbitcdFx0cmV0dXJuIC1FTUxJTks7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfUEFHRSgoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSBcdTAwMjZcdTAwMjYgUGFnZUFub24ocGFnZSkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgICAhUGFnZUFub25FeGNsdXNpdmUocGFnZSksIHBhZ2UpO1xuIFxuLVx0LyogdHJ5X2dyYWJfZm9saW8oKSBkb2VzIG5vdGhpbmcgdW5sZXNzIEZPTExfR0VUIG9yIEZPTExfUElOIGlzIHNldC4gKi9cbi1cdHJldCA9IHRyeV9ncmFiX2ZvbGlvKGZvbGlvLCAxLCBmbGFncyk7XG4tXHRpZiAodW5saWtlbHkocmV0KSkge1xuLVx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbitcdCpwYWdlcCA9IHBhZ2U7XG4rXHRyZXR1cm4gMDtcbit9XG4gXG4tXHQvKlxuLVx0ICogV2UgbmVlZCB0byBtYWtlIHRoZSBwYWdlIGFjY2Vzc2libGUgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIGdvaW5nXG4tXHQgKiB0byBhY2Nlc3MgaXRzIGNvbnRlbnQgKHRoZSBGT0xMX1BJTiBjYXNlKS4gIFBsZWFzZSBzZWVcbi1cdCAqIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGluX3VzZXJfcGFnZXMucnN0IGZvciBkZXRhaWxzLlxuLVx0ICovXG4tXHRpZiAoZmxhZ3MgXHUwMDI2IEZPTExfUElOKSB7XG4tXHRcdHJldCA9IGFyY2hfbWFrZV9mb2xpb19hY2Nlc3NpYmxlKGZvbGlvKTtcbi1cdFx0aWYgKHJldCkge1xuLVx0XHRcdHVucGluX3VzZXJfcGFnZShwYWdlKTtcbi1cdFx0XHRwYWdlID0gRVJSX1BUUihyZXQpO1xuLVx0XHRcdGdvdG8gb3V0O1xuKy8qXG4rICogUmV0dXJuIGhvdyBtYW55IFBURXMgbWFwIGNvbnNlY3V0aXZlIHBhZ2VzIG9mIHRoZSBzYW1lIGZvbGlvIGFuZCBjYW4gYmVcbisgKiBjb21taXR0ZWQgYXMgb25lIHJ1bi4gQWx3YXlzIGF0IGxlYXN0IDEuXG4rICpcbisgKiBUaGUgd3JpdGUtZmF1bHQgYW5kIHVuc2hhcmUgY2hlY2tzIGluIGZvbGxvd19vbmVfcHRlKCkgYXJlIHBlciBQVEUsIGJ1dCBhXG4rICogd3JpdGFibGUgcnVuIG5lZWRzIG5vIHJlcGVhdDogYSB3cml0YWJsZSBhbm9uIHBhZ2UgaXMgZXhjbHVzaXZlLiBBIHJlYWQtb25seVxuKyAqIHJ1biB1bmRlciBGT0xMX1dSSVRFIG9yIEZPTExfUElOIGRvZXMgbmVlZCB0aGUgcGVyLXBhZ2UgY2hlY2ssIHNvIGl0IHN0YXlzXG4rICogb25lIHBhZ2UgYXQgYSB0aW1lLlxuKyAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvbGxvd19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyB3YWxrX2VuZCxcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgKnB0ZXAsIHB0ZV90ICpiYXRjaF9wdGUsIHVuc2lnbmVkIGludCBmbGFncylcbit7XG4rXHR1bnNpZ25lZCBsb25nIG1heDtcbitcbitcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4rXHRcdHJldHVybiAxO1xuK1x0aWYgKCFwdGVfd3JpdGUoKmJhdGNoX3B0ZSkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgKEZPTExfV1JJVEUgfCBGT0xMX1BJTikpKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdG1heCA9ICh3YWxrX2VuZCAtIGFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0aWYgKG1heCBcdTAwM2M9IDEpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0LyogTWVyZ2UgeW91bmcvZGlydHkgYWNyb3NzIGJhdGNoIHNvIGZvbGlvX21hcmtfZGlydHkgc2VlcyBhbnkgZGlydHkuICovXG4rXHRyZXR1cm4gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB0ZXAsIGJhdGNoX3B0ZSwgbWF4LFxuK1x0XHRcdFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9NRVJHRV9ZT1VOR19ESVJUWSk7XG4rfVxuK1xuKy8qXG4rICogV2FsayB0aGUgUFRFcyBmcm9tIHRoZSBzdGFydCBhZGRyZXNzIHRvIHRoZSBlbmQgb2YgdGhpcyBwYWdlIHRhYmxlIG9yIFZNQSxcbisgKiB3aGljaGV2ZXIgY29tZXMgZmlyc3QsIGFuZCBjb21taXQgZXZlcnkgcGFnZSBmb3VuZC5cbisgKlxuKyAqIEEgZmFpbHVyZSBvbiB0aGUgZmlyc3QgUFRFIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIEEgZmFpbHVyZSBhZnRlciB0aGF0XG4rICogaXMgYSBzaG9ydCByZWFkOyBfX2dldF91c2VyX3BhZ2VzKCkgcmV0cnlpbmcgdGhlIHJlYWQgd2lsbCBnZXQgdGhlIGVycm9yLlxuKyAqL1xuK3N0YXRpYyBsb25nIGZvbGxvd19wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuK3tcbitcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuK1x0Ym9vbCBuZWVkX25vX3BhZ2VfdGFibGUgPSBmYWxzZTtcbitcdHB0ZV90ICpwdGVwLCAqb3JpZ19wdGVwO1xuK1x0dW5zaWduZWQgbG9uZyB3YWxrX2VuZDtcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSAwO1xuK1x0c3BpbmxvY2tfdCAqcHRsO1xuK1x0bG9uZyByZXQgPSAwO1xuK1xuK1x0b3JpZ19wdGVwID0gcHRlcCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgXHUwMDI2cHRsKTtcbitcdGlmICghcHRlcClcbitcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4rXG4rXHR3YWxrX2VuZCA9IG1pbihwbWRfYWRkcl9lbmQoYWRkcmVzcywgZW5kKSwgdm1hLVx1MDAzZXZtX2VuZCk7XG4rXG4rXHRmb3IgKDsgYWRkcmVzcyBcdTAwM2Mgd2Fsa19lbmQ7IGFkZHJlc3MgKz0gUEFHRV9TSVpFLCBwdGVwKyspIHtcbitcdFx0cHRlX3QgcHRlID0gcHRlcF9nZXQocHRlcCk7XG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlO1xuK1xuK1x0XHRyZXQgPSBmb2xsb3dfb25lX3B0ZSh2bWEsIGFkZHJlc3MsIHB0ZXAsIHB0ZSwgZmxhZ3MsIFx1MDAyNnBhZ2UpO1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgcGFnZSkge1xuK1x0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuK1x0XHRcdHVuc2lnbmVkIGxvbmcgYmF0Y2g7XG4rXG4rXHRcdFx0cHRlX3QgYmF0Y2hfcHRlID0gcHRlO1xuK1xuK1x0XHRcdGJhdGNoID0gZm9sbG93X3B0ZV9iYXRjaCh2bWEsIGFkZHJlc3MsIHdhbGtfZW5kLCBmb2xpbyxcbitcdFx0XHRcdFx0XHQgcHRlcCwgXHUwMDI2YmF0Y2hfcHRlLCBmbGFncyk7XG4rXHRcdFx0cmV0ID0gZm9sbG93X3BhZ2VfcHRlX2NvbW1pdCh2bWEsIGFkZHJlc3MsIGZvbGlvLCBwYWdlLFxuK1x0XHRcdFx0XHRcdCAgICAgYmF0Y2hfcHRlLCBiYXRjaCwgZmxhZ3MsXG4rXHRcdFx0XHRcdFx0ICAgICBwYWdlcyA/IHBhZ2VzICsgbnIgOiBOVUxMKTtcbitcdFx0XHRpZiAoIXJldCkge1xuK1x0XHRcdFx0bnIgKz0gYmF0Y2g7XG4rXHRcdFx0XHQvKlxuK1x0XHRcdFx0ICogVGhlIGxvb3AncyBvd24gaW5jcmVtZW50IGNvdmVycyBvbmUgUFRFOyBza2lwXG4rXHRcdFx0XHQgKiB0aGUgcmVzdCBvZiB0aGUgYmF0Y2guXG4rXHRcdFx0XHQgKi9cbitcdFx0XHRcdHB0ZXAgKz0gYmF0Y2ggLSAxO1xuK1x0XHRcdFx0YWRkcmVzcyArPSAoYmF0Y2ggLSAxKSAqIFBBR0VfU0laRTtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbiBcdFx0fVxuLVx0fVxuLVx0aWYgKGZsYWdzIFx1MDAyNiBGT0xMX1RPVUNIKSB7XG4tXHRcdGlmICgoZmxhZ3MgXHUwMDI2IEZPTExfV1JJVEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgIXB0ZV9kaXJ0eShwdGUpIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpXG4tXHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4rXG4gXHRcdC8qXG4tXHRcdCAqIHB0ZV9ta3lvdW5nKCkgd291bGQgYmUgbW9yZSBjb3JyZWN0IGhlcmUsIGJ1dCBhdG9taWMgY2FyZVxuLVx0XHQgKiBpcyBuZWVkZWQgdG8gYXZvaWQgbG9zaW5nIHRoZSBkaXJ0eSBiaXQ6IGl0IGlzIGVhc2llciB0byB1c2Vcbi1cdFx0ICogZm9saW9fbWFya19hY2Nlc3NlZCgpLlxuK1x0XHQgKiBub19wYWdlX3RhYmxlKCkgbWF5IGxvb2sgdXAgdGhlIHBhZ2UgY2FjaGUsIHNvIGl0IGNhbm5vdCBydW5cbitcdFx0ICogdW5kZXIgdGhlIFBURSBsb2NrLlxuIFx0XHQgKi9cbi1cdFx0Zm9saW9fbWFya19hY2Nlc3NlZChmb2xpbyk7XG4rXHRcdGlmICghcmV0IFx1MDAyNlx1MDAyNiBwdGVfbm9uZShwdGUpKVxuK1x0XHRcdG5lZWRfbm9fcGFnZV90YWJsZSA9IHRydWU7XG4rXHRcdGJyZWFrO1xuIFx0fVxuLW91dDpcbi1cdHB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTtcbi1cdHJldHVybiBwYWdlO1xuLW5vX3BhZ2U6XG4tXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7XG4tXHRpZiAoIXB0ZV9ub25lKHB0ZSkpXG4tXHRcdHJldHVybiBOVUxMO1xuLVx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4rXG4rXHRwdGVfdW5tYXBfdW5sb2NrKG9yaWdfcHRlcCwgcHRsKTtcbitcbitcdGlmIChucilcbitcdFx0cmV0dXJuIG5yO1xuK1x0aWYgKG5lZWRfbm9fcGFnZV90YWJsZSlcbitcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwdWRfdCAqcHVkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHBtZF90ICpwbWQsIHBtZHZhbDtcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0bG9uZyByZXQ7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcbiBcdHBtZCA9IHBtZF9vZmZzZXQocHVkcCwgYWRkcmVzcyk7XG5AQCAtOTEyLDcgKzEwMzMsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdGlmICghcG1kX3ByZXNlbnQocG1kdmFsKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAobGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSlcbi1cdFx0cmV0dXJuIGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXG4gXHRpZiAocG1kX3Byb3Rub25lKHBtZHZhbCkgXHUwMDI2XHUwMDI2ICFndXBfY2FuX2ZvbGxvd19wcm90bm9uZSh2bWEsIGZsYWdzKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG5AQCAtOTI1LDI4ICsxMDQ2LDM1IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3BtZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0fVxuIFx0aWYgKHVubGlrZWx5KCFwbWRfbGVhZihwbWR2YWwpKSkge1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuLVx0XHRyZXR1cm4gZm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncyk7XG4rXHRcdHJldHVybiBmb2xsb3dfcGFnZV9wdGUodm1hLCBhZGRyZXNzLCBlbmQsIHBtZCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdH1cbiBcdGlmIChwbWRfdHJhbnNfaHVnZShwbWR2YWwpIFx1MDAyNlx1MDAyNiAoZmxhZ3MgXHUwMDI2IEZPTExfU1BMSVRfUE1EKSkge1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuIFx0XHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcyk7XG4gXHRcdC8qIElmIHBtZCB3YXMgbGVmdCBlbXB0eSwgc3R1ZmYgYSBwYWdlIHRhYmxlIGluIHRoZXJlIHF1aWNrbHkgKi9cbi1cdFx0cmV0dXJuIHB0ZV9hbGxvYyhtbSwgcG1kKSA/IEVSUl9QVFIoLUVOT01FTSkgOlxuLVx0XHRcdGZvbGxvd19wYWdlX3B0ZSh2bWEsIGFkZHJlc3MsIHBtZCwgZmxhZ3MpO1xuK1x0XHRyZXR1cm4gcHRlX2FsbG9jKG1tLCBwbWQpID8gLUVOT01FTSA6XG4rXHRcdFx0Zm9sbG93X3BhZ2VfcHRlKHZtYSwgYWRkcmVzcywgZW5kLCBwbWQsIGZsYWdzLCBwYWdlcyk7XG4gXHR9XG4tXHRwYWdlID0gZm9sbG93X2h1Z2VfcG1kKHZtYSwgYWRkcmVzcywgcG1kLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdHJldCA9IGZvbGxvd19odWdlX3BtZCh2bWEsIGFkZHJlc3MsIGVuZCwgcG1kLCBmbGFncywgcGFnZXMpO1xuIFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdHJldHVybiBwYWdlO1xuK1xuK1x0LypcbitcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbCB0aGVcbitcdCAqIGFycmF5IGFuZCBmbHVzaCBjYWNoZXMgd2l0aG91dCB0aGUgcG1kIGxvY2suXG4rXHQgKi9cbitcdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IHBhZ2VzKVxuK1x0XHRndXBfZmlsbF9wYWdlcyh2bWEsIGFkZHJlc3MsIHBhZ2VzWzBdLCByZXQsIHBhZ2VzKTtcbitcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3B1ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcDRkX3QgKnA0ZHAsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfcHVkX21hc2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQsIHA0ZF90ICpwNGRwLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0cHVkX3QgKnB1ZHAsIHB1ZDtcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlO1xuK1x0bG9uZyByZXQ7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcbiBcdHB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIGFkZHJlc3MpO1xuQEAgLTk1NSwyMiArMTA4MywyOSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wdWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHRpZiAocHVkX2xlYWYocHVkKSkge1xuIFx0XHRwdGwgPSBwdWRfbG9jayhtbSwgcHVkcCk7XG4tXHRcdHBhZ2UgPSBmb2xsb3dfaHVnZV9wdWQodm1hLCBhZGRyZXNzLCBwdWRwLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cmV0ID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xuIFx0XHRzcGluX3VubG9jayhwdGwpO1xuLVx0XHRpZiAocGFnZSlcbi1cdFx0XHRyZXR1cm4gcGFnZTtcbitcdFx0LypcbitcdFx0ICogVGhlIHJlZiBpcyBhbHJlYWR5IGhlbGQsIHNvIHRoZSBwYWdlIGNhbm5vdCBnbyBhd2F5OiBmaWxsXG4rXHRcdCAqIHRoZSBhcnJheSBhbmQgZmx1c2ggY2FjaGVzIHdpdGhvdXQgdGhlIGxvY2suIEEgMSBHQiBmb2xpb1xuK1x0XHQgKiBjYW4gYmUgdXAgdG8gSFBBR0VfUFVEX05SIHBhZ2VzLCB0b28gbG9uZyB0byBmbHVzaCB1bmRlciBhXG4rXHRcdCAqIHNwaW5sb2NrLlxuK1x0XHQgKi9cbitcdFx0aWYgKHJldCBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgcGFnZXMpXG4rXHRcdFx0Z3VwX2ZpbGxfcGFnZXModm1hLCBhZGRyZXNzLCBwYWdlc1swXSwgcmV0LCBwYWdlcyk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXHR9XG4gXHRpZiAodW5saWtlbHkocHVkX2JhZChwdWQpKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRyZXR1cm4gZm9sbG93X3BtZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwdWRwLCBmbGFncywgcGFnZXMpO1xuIH1cbiBcbi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wNGRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBnZF90ICpwZ2RwLFxuLVx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBmbGFncyxcbi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpwYWdlX21hc2spXG4rc3RhdGljIGxvbmcgZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ2RfdCAqcGdkcCxcbitcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuIHtcbiBcdHA0ZF90ICpwNGRwLCBwNGQ7XG4gXG5AQCAtOTgxLDE1ICsxMTE2LDE4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0aWYgKCFwNGRfcHJlc2VudChwNGQpIHx8IHA0ZF9iYWQocDRkKSlcbiBcdFx0cmV0dXJuIG5vX3BhZ2VfdGFibGUodm1hLCBmbGFncywgYWRkcmVzcyk7XG4gXG4tXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgcDRkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRyZXR1cm4gZm9sbG93X3B1ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwNGRwLCBmbGFncywgcGFnZXMpO1xuIH1cbiBcbiAvKipcbi0gKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBhIHBhZ2UgZGVzY3JpcHRvciBmcm9tIGEgdXNlci12aXJ0dWFsIGFkZHJlc3NcbisgKiBmb2xsb3dfcGFnZV9tYXNrIC0gbG9vayB1cCBwYWdlcyBhdCBhIHVzZXItdmlydHVhbCBhZGRyZXNzXG4gICogQHZtYTogdm1fYXJlYV9zdHJ1Y3QgbWFwcGluZyBAYWRkcmVzc1xuICAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gbG9vayB1cFxuKyAqIEBlbmQ6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9wIGJhdGNoaW5nIGNvbnRpZ3VvdXMgcGFnZXNcbiAgKiBAZmxhZ3M6IGZsYWdzIG1vZGlmeWluZyBsb29rdXAgYmVoYXZpb3VyXG4tICogQHBhZ2VfbWFzazogYSBwb2ludGVyIHRvIG91dHB1dCBwYWdlX21hc2tcbisgKiBAcGFnZXM6IGFycmF5IHRvIHJlY2VpdmUgdGhlIHBhZ2VzLCByZWZjb3VudGVkIHBlciBAZmxhZ3MsIG9yIE5VTEwgdG9cbisgKiAgICAgICAgIHdhbGsgdGhlIHBhZ2UgdGFibGVzIChlLmcuIHRvIGZhdWx0IHBhZ2VzIGluKSB3aXRob3V0IGNvbGxlY3RpbmdcbisgKiAgICAgICAgIG9yIHJlZmNvdW50aW5nIHRoZW1cbiAgKlxuICAqIEBmbGFncyBjYW4gaGF2ZSBGT0xMXyBmbGFncyBzZXQsIGRlZmluZWQgaW4gXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICAqXG5AQCAtOTk4LDMzICsxMTM2LDMyIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZm9sbG93X3A0ZF9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuICAqIHRyaWdnZXIgYSBmYXVsdCB3aXRoIEZBVUxUX0ZMQUdfVU5TSEFSRSBzZXQuIE5vdGUgdGhhdCB1bnNoYXJpbmcgaXMgb25seVxuICAqIHJlbGV2YW50IHdpdGggRk9MTF9QSU4gYW5kICFGT0xMX1dSSVRFLlxuICAqXG4tICogT24gb3V0cHV0LCBAcGFnZV9tYXNrIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBhZ2UuXG4tICpcbi0gKiBSZXR1cm46IHRoZSBtYXBwZWQgKHN0cnVjdCBwYWdlICopLCAlTlVMTCBpZiBubyBtYXBwaW5nIGV4aXN0cywgb3Jcbi0gKiBhbiBlcnJvciBwb2ludGVyIGlmIHRoZXJlIGlzIGEgbWFwcGluZyB0byBzb21ldGhpbmcgbm90IHJlcHJlc2VudGVkXG4tICogYnkgYSBwYWdlIGRlc2NyaXB0b3IgKHNlZSBhbHNvIHZtX25vcm1hbF9wYWdlKCkpLlxuKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHN0YXJ0aW5nIGF0IEBhZGRyZXNzIHRoYXQgd2VyZVxuKyAqIHBsYWNlZCBpbnRvIEBwYWdlcyAoaWYgbm9uLU5VTEwpLCB3aGljaCBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgcGFnZXNcbisgKiByZXF1ZXN0ZWQgdmlhIEBlbmQ7IDAgaWYgbm8gbWFwcGluZyBleGlzdHMgYXQgQGFkZHJlc3M7IG9yIGEgbmVnYXRpdmVcbisgKiBlcnJubyBmb3IgYSBtYXBwaW5nIHRvIHNvbWV0aGluZyBub3QgcmVwcmVzZW50ZWQgYnkgYSBwYWdlIGRlc2NyaXB0b3JcbisgKiAoc2VlIGFsc28gdm1fbm9ybWFsX3BhZ2UoKSkuXG4gICovXG4tc3RhdGljIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IGZsYWdzLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2VfbWFzaylcbitzdGF0aWMgbG9uZyBmb2xsb3dfcGFnZV9tYXNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4ge1xuIFx0cGdkX3QgKnBnZDtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRsb25nIHJldDtcbiBcbiBcdHZtYV9wZ3RhYmxlX3dhbGtfYmVnaW4odm1hKTtcbiBcbi1cdCpwYWdlX21hc2sgPSAwO1xuIFx0cGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7XG4gXG4gXHRpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpXG4tXHRcdHBhZ2UgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuK1x0XHRyZXQgPSBub19wYWdlX3RhYmxlKHZtYSwgZmxhZ3MsIGFkZHJlc3MpO1xuIFx0ZWxzZVxuLVx0XHRwYWdlID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgcGdkLCBmbGFncywgcGFnZV9tYXNrKTtcbitcdFx0cmV0ID0gZm9sbG93X3A0ZF9tYXNrKHZtYSwgYWRkcmVzcywgZW5kLCBwZ2QsIGZsYWdzLCBwYWdlcyk7XG4gXG4gXHR2bWFfcGd0YWJsZV93YWxrX2VuZCh2bWEpO1xuIFxuLVx0cmV0dXJuIHBhZ2U7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgaW50IGdldF9nYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbkBAIC0xMzU4LDcgKzE0OTUsNiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIHtcbiBcdGxvbmcgcmV0ID0gMCwgaSA9IDA7XG4gXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7XG4tXHR1bnNpZ25lZCBsb25nIHBhZ2VfbWFzayA9IDA7XG4gXG4gXHRpZiAoIW5yX3BhZ2VzKVxuIFx0XHRyZXR1cm4gMDtcbkBAIC0xMzczLDcgKzE1MDksNyBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0ZG8ge1xuIFx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdFx0dW5zaWduZWQgaW50IHBhZ2VfaW5jcmVtO1xuK1x0XHRsb25nIG5yO1xuIFxuIFx0XHQvKiBmaXJzdCBpdGVyYXRpb24gb3IgY3Jvc3Mgdm1hIGJvdW5kICovXG4gXHRcdGlmICghdm1hIHx8IHN0YXJ0IFx1MDAzZT0gdm1hLVx1MDAzZXZtX2VuZCkge1xuQEAgLTE0MDAsOCArMTUzNiwxMiBAQCBzdGF0aWMgbG9uZyBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRcdFx0XHRcdHBhZ2VzID8gXHUwMDI2cGFnZSA6IE5VTEwpO1xuIFx0XHRcdFx0aWYgKHJldClcbiBcdFx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0XHRwYWdlX21hc2sgPSAwO1xuLVx0XHRcdFx0Z290byBuZXh0X3BhZ2U7XG4rXHRcdFx0XHRndXBfZmlsbF9wYWdlcyh2bWEsIHN0YXJ0LCBwYWdlLCAxLFxuK1x0XHRcdFx0XHQgICAgICAgcGFnZXMgPyBwYWdlcyArIGkgOiBOVUxMKTtcbitcdFx0XHRcdGkrKztcbitcdFx0XHRcdHN0YXJ0ICs9IFBBR0VfU0laRTtcbitcdFx0XHRcdG5yX3BhZ2VzLS07XG4rXHRcdFx0XHRjb250aW51ZTtcbiBcdFx0XHR9XG4gXG4gXHRcdFx0aWYgKCF2bWEpIHtcbkBAIC0xNDIzLDEwICsxNTYzLDExIEBAIHN0YXRpYyBsb25nIF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXG4tXHRcdHBhZ2UgPSBmb2xsb3dfcGFnZV9tYXNrKHZtYSwgc3RhcnQsIGd1cF9mbGFncywgXHUwMDI2cGFnZV9tYXNrKTtcbi1cdFx0aWYgKCFwYWdlIHx8IFBUUl9FUlIocGFnZSkgPT0gLUVNTElOSykge1xuK1x0XHRuciA9IGZvbGxvd19wYWdlX21hc2sodm1hLCBzdGFydCwgc3RhcnQgKyBucl9wYWdlcyAqIFBBR0VfU0laRSxcbitcdFx0XHRcdCAgICAgIGd1cF9mbGFncywgcGFnZXMgPyBcdTAwMjZwYWdlc1tpXSA6IE5VTEwpO1xuK1x0XHRpZiAoIW5yIHx8IG5yID09IC1FTUxJTkspIHtcbiBcdFx0XHRyZXQgPSBmYXVsdGluX3BhZ2Uodm1hLCBzdGFydCwgZ3VwX2ZsYWdzLFxuLVx0XHRcdFx0XHQgICBQVFJfRVJSKHBhZ2UpID09IC1FTUxJTkssIGxvY2tlZCk7XG4rXHRcdFx0XHRcdCAgIG5yID09IC1FTUxJTkssIGxvY2tlZCk7XG4gXHRcdFx0c3dpdGNoIChyZXQpIHtcbiBcdFx0XHRjYXNlIDA6XG4gXHRcdFx0XHRnb3RvIHJldHJ5O1xuQEAgLTE0NDAsNzAgKzE1ODEsMzAgQEAgc3RhdGljIGxvbmcgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbiBcdFx0XHRCVUcoKTtcbi1cdFx0fSBlbHNlIGlmIChQVFJfRVJSKHBhZ2UpID09IC1FRVhJU1QpIHtcbitcdFx0fSBlbHNlIGlmIChuciA9PSAtRUVYSVNUKSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiBQcm9wZXIgcGFnZSB0YWJsZSBlbnRyeSBleGlzdHMsIGJ1dCBubyBjb3JyZXNwb25kaW5nXG4gXHRcdFx0ICogc3RydWN0IHBhZ2UuIElmIHRoZSBjYWxsZXIgZXhwZWN0cyAqKnBhZ2VzIHRvIGJlXG4gXHRcdFx0ICogZmlsbGVkIGluLCBiYWlsIG91dCBub3csIGJlY2F1c2UgdGhhdCBjYW4ndCBiZSBkb25lXG4tXHRcdFx0ICogZm9yIHRoaXMgcGFnZS5cbitcdFx0XHQgKiBmb3IgdGhpcyBwYWdlLiBPdGhlcndpc2UgYWR2YW5jZSBieSB0aGUgb25lIHBhZ2VcbitcdFx0XHQgKiBmb2xsb3dfcGFnZV9tYXNrKCkgbG9va2VkIGF0LlxuIFx0XHRcdCAqL1xuIFx0XHRcdGlmIChwYWdlcykge1xuLVx0XHRcdFx0cmV0ID0gUFRSX0VSUihwYWdlKTtcbitcdFx0XHRcdHJldCA9IG5yO1xuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuLVx0XHR9IGVsc2UgaWYgKElTX0VSUihwYWdlKSkge1xuLVx0XHRcdHJldCA9IFBUUl9FUlIocGFnZSk7XG4rXHRcdFx0bnIgPSAxO1xuK1x0XHR9IGVsc2UgaWYgKG5yIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gbnI7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbi1uZXh0X3BhZ2U6XG4tXHRcdHBhZ2VfaW5jcmVtID0gMSArICh+KHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgcGFnZV9tYXNrKTtcbi1cdFx0aWYgKHBhZ2VfaW5jcmVtIFx1MDAzZSBucl9wYWdlcylcbi1cdFx0XHRwYWdlX2luY3JlbSA9IG5yX3BhZ2VzO1xuLVxuLVx0XHRpZiAocGFnZXMpIHtcbi1cdFx0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZTtcbi1cdFx0XHR1bnNpZ25lZCBpbnQgajtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRoaXMgbXVzdCBiZSBhIGxhcmdlIGZvbGlvIChhbmQgZG9lc24ndCBuZWVkIHRvXG4tXHRcdFx0ICogYmUgdGhlIHdob2xlIGZvbGlvOyBpdCBjYW4gYmUgcGFydCBvZiBpdCksIGRvXG4tXHRcdFx0ICogdGhlIHJlZmNvdW50IHdvcmsgZm9yIGFsbCB0aGUgc3VicGFnZXMgdG9vLlxuLVx0XHRcdCAqXG4tXHRcdFx0ICogTk9URTogaGVyZSB0aGUgcGFnZSBtYXkgbm90IGJlIHRoZSBoZWFkIHBhZ2Vcbi1cdFx0XHQgKiBlLmcuIHdoZW4gc3RhcnQgYWRkciBpcyBub3QgdGhwLXNpemUgYWxpZ25lZC5cbi1cdFx0XHQgKiB0cnlfZ3JhYl9mb2xpbygpIHNob3VsZCBoYXZlIHRha2VuIGNhcmUgb2YgdGFpbFxuLVx0XHRcdCAqIHBhZ2VzLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChwYWdlX2luY3JlbSBcdTAwM2UgMSkge1xuLVx0XHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXG4tXHRcdFx0XHQvKlxuLVx0XHRcdFx0ICogU2luY2Ugd2UgYWxyZWFkeSBob2xkIHJlZmNvdW50IG9uIHRoZVxuLVx0XHRcdFx0ICogbGFyZ2UgZm9saW8sIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuXG4tXHRcdFx0XHQgKi9cbi1cdFx0XHRcdGlmICh0cnlfZ3JhYl9mb2xpbyhmb2xpbywgcGFnZV9pbmNyZW0gLSAxLFxuLVx0XHRcdFx0XHRcdCAgIGd1cF9mbGFncykpIHtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogUmVsZWFzZSB0aGUgMXN0IHBhZ2UgcmVmIGlmIHRoZVxuLVx0XHRcdFx0XHQgKiBmb2xpbyBpcyBwcm9ibGVtYXRpYywgZmFpbCBoYXJkLlxuLVx0XHRcdFx0XHQgKi9cbi1cdFx0XHRcdFx0Z3VwX3B1dF9mb2xpbyhmb2xpbywgMSwgZ3VwX2ZsYWdzKTtcbi1cdFx0XHRcdFx0cmV0ID0gLUVGQVVMVDtcbi1cdFx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuLVxuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhZ2VfaW5jcmVtOyBqKyspIHtcbi1cdFx0XHRcdHN1YnBhZ2UgPSBwYWdlICsgajtcbi1cdFx0XHRcdHBhZ2VzW2kgKyBqXSA9IHN1YnBhZ2U7XG4tXHRcdFx0XHRmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBzdGFydCArIGogKiBQQUdFX1NJWkUpO1xuLVx0XHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2Uoc3VicGFnZSk7XG4tXHRcdFx0fVxuLVx0XHR9XG4rXHRcdC8qIENoZWNrIHRoYXQgd2UgZGlkbid0IHBpbiBtb3JlIHBhZ2VzIHRoYW4gdGhlIGNhbGxlciB3aWxsIGZyZWUuICovXG4rXHRcdFZNX1dBUk5fT05fT05DRShuciBcdTAwM2UgbnJfcGFnZXMpO1xuIFxuLVx0XHRpICs9IHBhZ2VfaW5jcmVtO1xuLVx0XHRzdGFydCArPSBwYWdlX2luY3JlbSAqIFBBR0VfU0laRTtcbi1cdFx0bnJfcGFnZXMgLT0gcGFnZV9pbmNyZW07XG4rXHRcdGkgKz0gbnI7XG4rXHRcdHN0YXJ0ICs9IG5yICogUEFHRV9TSVpFO1xuK1x0XHRucl9wYWdlcyAtPSBucjtcbiBcdH0gd2hpbGUgKG5yX3BhZ2VzKTtcbiBvdXQ6XG4gXHRyZXR1cm4gaSA/IGkgOiByZXQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNjo1Njo0OC4zNzc2MTk2MzVaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjMzODczNzAyNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudCBvZiBHVVAgQmF0Y2hpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgZGl2aW5nIGludG8gYG1tL2d1cC5jYCwgdGhlIGhlYXJ0IG9mIEdldCBVc2VyIFBhZ2VzLCBhbmQgaXQncyBhbGwgYWJvdXQgb3B0aW1pemluZyBob3cgd2Ugd2FsayBhbmQgYmF0Y2ggcGFnZSB0YWJsZXMuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgdG8gYmUgcmVmYWN0b3JpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGF0IHBhZ2UgdGFibGUgd2Fsa2luZyBhbmQgYmF0Y2hpbmc6IGBmb2xsb3dfcGFnZV9tYXNrYCwgYGZvbGxvd19odWdlX3B1ZGAsIGBmb2xsb3dfaHVnZV9wbWRgLCBhbmQgYGZvbGxvd19wYWdlX3B0ZWAuIEl0J3MgaW50cm9kdWNpbmcgbmV3IGZ1bmN0aW9ucyBsaWtlIGBmb2xsb3dfcGFnZV9wdGVfY29tbWl0YCwgYGZvbGxvd19vbmVfcHRlYCwgYW5kIGBmb2xsb3dfcHRlX2JhdGNoYCB0byBoYW5kbGUgUFRFIHByb2Nlc3NpbmcgaW4gYmF0Y2hlcy4gVGhlIHJldHVybiB0eXBlcyBhcmUgYWxzbyBjaGFuZ2VkIGZyb20gYHN0cnVjdCBwYWdlICpgIHRvIGBsb25nYCB0byByZWZsZWN0IGVpdGhlciB0aGUgbnVtYmVyIG9mIHBhZ2VzIHByb2Nlc3NlZCBvciBhbiBlcnJvciBjb2RlLiBgX19nZXRfdXNlcl9wYWdlc2AgaXMgdXBkYXRlZCB0byB1dGlsaXplIHRoZSBuZXcgYmF0Y2hlZCBhcHByb2FjaC5cblxuVGhlIGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeS4gQXJlIHdlIGNyZWF0aW5nIGFueSByaXNrcyBoZXJlPyBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBtYWlubHkgYWJvdXQgdGhlIG1lY2hhbmljcyBvZiAqcGlubmluZyogcGFnZXMgYW5kIHBvdGVudGlhbGx5IHJlZmNvdW50aW5nIHRoZW0gYW5kIGRvZXMgbm90IHNlbmQgYW55IG5ldyBzdHJ1Y3R1cmVzIHRvIHRoZSB1c2VyLiBUaGVyZSdzIG5vIGZhbmN5IG5ldyBkYXRhIGJlaW5nIGFsbG9jYXRlZCwgZmlsbGVkLCBhbmQgdGhlbiBoYW5kZWQgb3ZlciB0byB1c2VyIHNwYWNlIHdoZXJlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIG1pZ2h0IGxlYWsuIEkgYWxzbyBkb24ndCBzZWUgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgKmRlcGVuZHMqIG9uIHRoZSB2YWx1ZSBvZiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBhbnkgbmV3IGNvZGUgb3IgYnJhbmNoZXMuXG5cbkhvd2V2ZXIsIEdVUCBpdHNlbGYgaXMgaW50ZXJlc3RpbmcuIEdVUCAqZG9lcyogcGluIHVzZXIgcGFnZXMuIElmIHRoZXJlIGlzIGEgYnVnLCBpbmNvcnJlY3QgcGlubmluZyAqY291bGQqIGxlYWQgdG8gY29ycnVwdGlvbiwgdXNlLWFmdGVyLWZyZWUsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiBUaG9zZSBjYW4gYWxsIGJlIGNhdWdodCBieSBLQVNBTi4gV2UgYXJlIGxvb2tpbmcgZm9yIHNvbWV0aGluZyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoICpiZXR0ZXIqIHRoYW4gS0FTQU4uIEl0J3MgYSBjb3JlIE1NIG1lY2hhbmlzbSwgc28gYnVncyBoZXJlIGFyZSBtb3JlIGxpa2VseSB0byBjcmFzaCwgcGFnZSBmYXVsdCwgb3IgY2F1c2UgZGF0YSBjb3JydXB0aW9uLiBOb3csIEtNU0FOIGRldGVjdHMgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCByaWdodD8gTGV0J3MgY29uc2lkZXIuXG5cblRoZSBgcGFnZXNgIGFycmF5IHBhc3NlZCB0byBgZm9sbG93X3BhZ2VfbWFza2AgaXMgd2hlcmUgdGhlIHJldHVybmVkIHBhZ2VzIGVuZCB1cC4gSXQgZ2V0cyBmaWxsZWQgYnkgYGd1cF9maWxsX3BhZ2VzYC4gVGhlIHJpc2sgaXMgKmlmKiBgZ3VwX2ZpbGxfcGFnZXNgIGZhaWxzIHRvIGZpbGwgdGhlIHdob2xlIGFycmF5IGJ1dCByZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIChzdWNjZXNzKSwgdGhhdCB3b3VsZCBtZWFuIHRoYXQgdGhlIGNhbGxlciB3b3VsZCBoYXZlIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gdGhlIGBwYWdlc2AgYXJyYXkuIExldCdzIGxvb2sgYXQgYGd1cF9maWxsX3BhZ2VzYDpcblxuYGBgY1xuK3N0YXRpYyB2b2lkIGd1cF9maWxsX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdGlmICghcGFnZXMpXG4rXHRcdHJldHVybjtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspIHtcbitcdFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2UgPSBwYWdlICsgaTtcbitcbitcdFx0cGFnZXNbaV0gPSBzdWJwYWdlO1xuK1x0XHRmbHVzaF9hbm9uX3BhZ2Uodm1hLCBzdWJwYWdlLCBhZGRyZXNzICsgaSAqIFBBR0VfU0laRSk7XG4rXHRcdGZsdXNoX2RjYWNoZV9wYWdlKHN1YnBhZ2UpO1xuK1x0fVxuK31cbmBgYFxuXG5JdCBmaWxscyBgcGFnZXNbMF1gIHRocm91Z2ggYHBhZ2VzW25yIC0gMV1gLiBJZiBgZm9sbG93X3BhZ2VfbWFza2AgcmV0dXJucyBgbnJgLCBpdCAqc2hvdWxkKiBtZWFuIGBucmAgcGFnZXMgaGF2ZSBiZWVuIGZpbGxlZC4gSW4gYF9fZ2V0X3VzZXJfcGFnZXNgLCB3ZSdyZSBpdGVyYXRpbmcgYW5kIGluY3JlbWVudGluZyB0aGUgYXJyYXksIGBpICs9IG5yYC4gVGhlIGNhbGxlciBhbGxvY2F0ZXMgYHBhZ2VzYCBhbmQgZXhwZWN0cyBgcGFnZXNbMF1gIHRocm91Z2ggYHBhZ2VzW2ktMV1gIHRvIGJlIGluaXRpYWxpemVkLiBCdXQgaXMgdGhlcmUgYSBzY2VuYXJpbyB3aGVyZSBgZm9sbG93X3BhZ2VfbWFza2AgcmV0dXJucyBgbnIgXHUwMDNlIDBgIGJ1dCBkb2Vzbid0IGZpbGwgdGhlIGVudGlyZSBhcnJheT9cblxuSGVyZSdzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIGBmb2xsb3dfaHVnZV9wdWRgOlxuXG5gYGBjXG4rXHRpZiAocGFnZXMpXG4rXHRcdHBhZ2VzWzBdID0gcGFnZTtcbitcbitcdHJldHVybiBucjtcbmBgYFxuXG5JdCBvbmx5IHNldHMgYHBhZ2VzWzBdID0gcGFnZWAhIFdoYXQgaWYgYG5yIFx1MDAzZSAxYD8gQW5kIHRoZSBjYWxsc2l0ZSBpcyBpbiBgZm9sbG93X3B1ZF9tYXNrYDpcblxuYGBgY1xuIFx0aWYgKHB1ZF9sZWFmKHB1ZCkpIHtcbiBcdFx0cHRsID0gcHVkX2xvY2sobW0sIHB1ZHApO1xuLVx0XHRwYWdlID0gZm9sbG93X2h1Z2VfcHVkKHZtYSwgYWRkcmVzcywgcHVkcCwgZmxhZ3MsIHBhZ2VfbWFzayk7XG4rXHRcdHJldCA9IGZvbGxvd19odWdlX3B1ZCh2bWEsIGFkZHJlc3MsIGVuZCwgcHVkcCwgZmxhZ3MsIHBhZ2VzKTtcbiBcdFx0c3Bpbl91bmxvY2socHRsKTtcbi1cdFx0aWYgKHBhZ2UpXG4tXHRcdFx0cmV0dXJuIHBhZ2U7XG4rXHRcdC8qXG4rXHRcdCAqIFRoZSByZWYgaXMgYWxyZWFkeSBoZWxkLCBzbyB0aGUgcGFnZSBjYW5ub3QgZ28gYXdheTogZmlsbFxuK1x0XHQgKiB0aGUgYXJyYXkgYW5kIGZsdXNoIGNhY2hlcyB3aXRob3V0IHRoZSBsb2NrLiBBIDEgR0IgZm9saW9cbitcdFx0ICogY2FuIGJlXG5cbiIsIklucHV0VG9rZW5zIjoxMTA4NiwiT3V0cHV0VG9rZW5zIjoxNTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMTYyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTY6NTc6MTEuNzY0OTkyOTc2WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ1OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgR2V0IFVzZXIgUGFnZXMgKEdVUCkgdG8gYmF0Y2ggcGFnZSB0YWJsZSB3YWxraW5nIGFuZCByZWZjb3VudGluZy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcyBidXQgZG9lcyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgaGFuZGxlIGNvbXBsZXggcGFyc2luZyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBjb3VsZCBiZSBsZWFrZWQuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyByZXR1cm5pbmcgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBwcm9jZXNzZWQgcGFnZXMsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBwb2ludGVycyBpbiB0aGUgYHBhZ2VzYCBhcnJheSkgd291bGQgcmVzdWx0IGluIHdpbGQgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHBhZ2UgcmVmZXJlbmNlIGltYmFsYW5jZXMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[1] Phase: Succeeded StartedAt: 2026-08-12 16:57:23 +0000 UTC FinishedAt: 2026-08-12 16:57:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-12 16:57:23 +0000 UTC FinishedAt: 2026-08-12 16:57:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2] Phase: Succeeded StartedAt: 2026-08-12 16:57:23 +0000 UTC FinishedAt: 2026-08-12 20:40:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-12 16:57:23 +0000 UTC FinishedAt: 2026-08-12 20:40:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-12 16:57:23 +0000 UTC FinishedAt: 2026-08-12 16:57:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-12 16:57:23 +0000 UTC FinishedAt: 2026-08-12 16:57:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowvlwgv/series-workflowvlwgv-convert-artifact-1619427832/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-12 16:57:33 +0000 UTC FinishedAt: 2026-08-12 17:14:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-12 16:57:33 +0000 UTC FinishedAt: 2026-08-12 17:14:29 +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:*61664dcf-1ac3-43dd-830a-b52f67888e4b,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-workflowvlwgv/series-workflowvlwgv-convert-artifact-1619427832/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": "641fc5b3-d38b-4722-95ca-095236bcd59c", "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-workflowvlwgv/series-workflowvlwgv-build-action-956057262/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-12 16:57:33 +0000 UTC FinishedAt: 2026-08-12 17:14:19 +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:*61664dcf-1ac3-43dd-830a-b52f67888e4b,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-workflowvlwgv/series-workflowvlwgv-convert-artifact-1619427832/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": "641fc5b3-d38b-4722-95ca-095236bcd59c", "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-workflowvlwgv/series-workflowvlwgv-build-action-956057262/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-12 17:14:29 +0000 UTC FinishedAt: 2026-08-12 17:14:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-12 17:14:29 +0000 UTC FinishedAt: 2026-08-12 17:14:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-12 17:14:29 +0000 UTC FinishedAt: 2026-08-12 17:14:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-12 17:14:29 +0000 UTC FinishedAt: 2026-08-12 17:14:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowvlwgv/series-workflowvlwgv-convert-artifact-3497294943/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-12 17:14:39 +0000 UTC FinishedAt: 2026-08-12 17:16:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-12 17:14:39 +0000 UTC FinishedAt: 2026-08-12 17:16:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*641fc5b3-d38b-4722-95ca-095236bcd59c,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-workflowvlwgv/series-workflowvlwgv-build-action-956057262/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-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-12 17:16:46 +0000 UTC FinishedAt: 2026-08-12 17:16:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-12 17:16:46 +0000 UTC FinishedAt: 2026-08-12 17:16:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-12 17:16:46 +0000 UTC FinishedAt: 2026-08-12 17:32:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-12 17:16:46 +0000 UTC FinishedAt: 2026-08-12 17:32: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:*61664dcf-1ac3-43dd-830a-b52f67888e4b,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-workflowvlwgv/series-workflowvlwgv-convert-artifact-3497294943/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": "b9577a7f-c051-428c-98e8-9cb21430d31d", "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-workflowvlwgv/series-workflowvlwgv-build-action-541395443/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-12 17:16:46 +0000 UTC FinishedAt: 2026-08-12 17:32: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:*61664dcf-1ac3-43dd-830a-b52f67888e4b,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-workflowvlwgv/series-workflowvlwgv-convert-artifact-3497294943/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": "b9577a7f-c051-428c-98e8-9cb21430d31d", "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-workflowvlwgv/series-workflowvlwgv-build-action-541395443/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-12 17:32:56 +0000 UTC FinishedAt: 2026-08-12 17:32:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-12 17:32:56 +0000 UTC FinishedAt: 2026-08-12 17:32:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-12 17:32:56 +0000 UTC FinishedAt: 2026-08-12 17:34:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-12 17:32:56 +0000 UTC FinishedAt: 2026-08-12 17:34:49 +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:*b9577a7f-c051-428c-98e8-9cb21430d31d,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-workflowvlwgv/series-workflowvlwgv-build-action-541395443/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-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-12 17:34:54 +0000 UTC FinishedAt: 2026-08-12 20:40:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-12 17:34:54 +0000 UTC FinishedAt: 2026-08-12 20:40:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*641fc5b3-d38b-4722-95ca-095236bcd59c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*b9577a7f-c051-428c-98e8-9cb21430d31d,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-workflowvlwgv/series-workflowvlwgv-build-action-956057262/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-workflowvlwgv/series-workflowvlwgv-build-action-541395443/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-12 17:34:54 +0000 UTC FinishedAt: 2026-08-12 17:35:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-12 17:34:54 +0000 UTC FinishedAt: 2026-08-12 17:34:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowvlwgv/series-workflowvlwgv-convert-artifact-2789521528/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-12 17:34:54 +0000 UTC FinishedAt: 2026-08-12 17:34:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-12 17:34:54 +0000 UTC FinishedAt: 2026-08-12 17:34:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-12 17:34:54 +0000 UTC FinishedAt: 2026-08-12 17:34:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-12 17:35:04 +0000 UTC FinishedAt: 2026-08-12 20:40:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvlwgv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["get_user_pages","get_user_pages_remote","get_user_pages_unlocked","pin_user_pages","pin_user_pages_remote","pin_user_pages_unlocked","faultin_page_range","populate_vma_page_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0bb66bbef5a6c2cd4101bb8fa91b9c9c32eae88d","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","HUGETLBFS"],"series_id":"1a350144-2334-47f4-b57e-ffb039f7a32f","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-12 17:35:04 +0000 UTC FinishedAt: 2026-08-12 20:40:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*641fc5b3-d38b-4722-95ca-095236bcd59c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*b9577a7f-c051-428c-98e8-9cb21430d31d,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-workflowvlwgv/series-workflowvlwgv-build-action-956057262/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-workflowvlwgv/series-workflowvlwgv-build-action-541395443/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-workflowvlwgv/series-workflowvlwgv-convert-artifact-2789521528/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,}