Name: series-workflowdz4cl Phase: Succeeded StartedAt: 2026-08-16 15:14:57 +0000 UTC FinishedAt: 2026-08-16 19:47:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[0] Phase: Succeeded StartedAt: 2026-08-16 15:14:57 +0000 UTC FinishedAt: 2026-08-16 16:04:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[0].run-triage Phase: Succeeded StartedAt: 2026-08-16 15:14:57 +0000 UTC FinishedAt: 2026-08-16 16:04:22 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1351c159c59b04195647917c5a5f0e5467f44bb0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1351c159c59b04195647917c5a5f0e5467f44bb0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "74cf3860-255d-49bb-b3df-51f8ee44a69f" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_convert_inline_data", "ext4_try_add_inline_entry" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE1OjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0OywKICAgICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgYmxvY2sgYWxsb2NhdGlvbiBvcmRlciBpbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgdG8gcHJldmVudCBwb3RlbnRpYWwgZGF0YSBsb3NzIHdoZW4gY29udmVydGluZyBpbmxpbmUgZGF0YSB0byBhIGJsb2NrLiBQcmV2aW91c2x5LCBpZiBibG9jayBhbGxvY2F0aW9uIGZhaWxlZCwgaXQgYXR0ZW1wdGVkIHRvIHJlc3RvcmUgdGhlIGlubGluZSBkYXRhLCB3aGljaCBjb3VsZCBmYWlsIGFuZCBjYXVzZSBkYXRhIGxvc3MuIFRoZSBuZXcgbG9naWMgYWxsb2NhdGVzIHRoZSBibG9jayBmaXJzdCBhbmQgb25seSByZW1vdmVzIHRoZSBpbmxpbmUgZGF0YSB1cG9uIHN1Y2Nlc3MuXG5cbkFsbCBzdHJ1Y3R1cmVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgYnkgdGhlIHBhdGNoIChgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCwgYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBvciBleHBsaWNpdGx5IHplcm9lZCAodmlhIGBtZW1zZXRgIG9yIHBhcnRpYWwgaW5pdGlhbGl6YXRpb24gd2hpY2ggemVyb2VzIHRoZSByZXN0KS4gVGhlIGJ1ZmZlciBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJlZm9yZSBjb3B5aW5nIHRoZSBpbmxpbmUgZGF0YS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBwYWRkaW5nIGxlYWtzLCBvciBpbmZvLWxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gQW55IHBvdGVudGlhbCBjcmFzaGVzIChlLmcuLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBhbiBlcnJvciBwb2ludGVyKSB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gb3Iga2VybmVsIG9vcHMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE1OjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jXG5pbmRleCA4MDQ1ZTRmZjI3MGM3Li4yYTkyOTllYTQxNDZjIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuY1xuQEAgLTE0LDYgJiM0MzsxNCw3IEBAXG4gI2luY2x1ZGUgXCYjMzQ7ZXh0NC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7eGF0dHIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O3RydW5jYXRlLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7ZXh0NF9leHRlbnRzLmhcJiMzNDtcbiBcbiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEFcdFwmIzM0O2RhdGFcJiMzNDtcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcdCgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSlcbkBAIC0xMDcwLDIxICYjNDM7MTA3MSw2NyBAQCBzdGF0aWMgaW50IGV4dDRfdXBkYXRlX2lubGluZV9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tXHRcdFx0XHQgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsXG4tXHRcdFx0XHQgICAgIHZvaWQgKmJ1ZiwgaW50IGlubGluZV9zaXplKVxuJiM0MztzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4mIzQzO1x0XHRcdFx0ICAgICAgZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBpbnQgbGVuKVxuIHtcbi1cdGludCByZXQ7XG4mIzQzO1x0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuJiM0MztcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4mIzQzO1x0XHQucyA9IHsgLm5vdF9mb3VuZCA9IDAsIH0sXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4mIzQzO1x0XHQubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLFxuJiM0MztcdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuJiM0MztcdFx0LnZhbHVlID0gTlVMTCxcbiYjNDM7XHRcdC52YWx1ZV9sZW4gPSAwLFxuJiM0MztcdH07XG4mIzQzO1x0aW50IGVycm9yO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwmIzM0O2Vycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKVwmIzM0Oyxcbi1cdFx0XHRpbm9kZS1cdTAwM2VpX2lubywgcmV0KTtcbi1cdFx0cmV0dXJuO1xuJiM0MztcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuJiM0MztcdGlmIChlcnJvcikge1xuJiM0MztcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0XHRyZXR1cm4gZXJyb3I7XG4gXHR9XG4tXHRleHQ0X3dyaXRlX2lubGluZV9kYXRhKGlub2RlLCBpbG9jLCBidWYsIDAsIGlubGluZV9zaXplKTtcbi1cdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbiYjNDM7XHRpZiAoZXJyb3IpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRCVUZGRVJfVFJBQ0UoaXMuaWxvYy5iaCwgXCYjMzQ7Z2V0X3dyaXRlX2FjY2Vzc1wmIzM0Oyk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLVx1MDAzZWlfc2IsIGlzLmlsb2MuYmgsIEVYVDRfSlRSX05PTkUpO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgXHUwMDI2aSwgXHUwMDI2aXMpO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG1lbXNldCgodm9pZCAqKWV4dDRfcmF3X2lub2RlKFx1MDAyNmlzLmlsb2MpLVx1MDAzZWlfYmxvY2ssXG4mIzQzO1x0XHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XHRtZW1zZXQoZWktXHUwMDNlaV9kYXRhLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtXHUwMDNlaV9tb2RlKSkpIHtcbiYjNDM7XHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG4mIzQzO1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4mIzQzO1x0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApO1xuJiM0MztcdFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xuJiM0MztcbiYjNDM7XHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XG4mIzQzO1x0XHRuZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4pO1xuJiM0MztcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4mIzQzO1x0XHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4mIzQzO1x0fVxuJiM0MztcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7XG4mIzQzO1x0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuJiM0MztcdGVycm9yID0gZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4mIzQzO1x0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuJiM0MztcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4mIzQzO1x0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuJiM0MztvdXQ6XG4mIzQzO1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuJiM0MztcdGlmIChlcnJvciA9PSAtRU5PREFUQSlcbiYjNDM7XHRcdGVycm9yID0gMDtcbiYjNDM7XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbiYjNDM7XHRyZXR1cm4gZXJyb3I7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuQEAgLTEwOTQsOCAmIzQzOzExNDEsOSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdGludCBlcnJvcjtcbiBcdHZvaWQgKmJ1ZiA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xuLVx0c3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7XG4gXHRpbnQgaW5saW5lX3NpemU7XG4mIzQzO1x0ZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMDtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XG4gXG4gXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiBcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbkBAIC0xMTIwLDI1ICYjNDM7MTE2OCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRtYXAubV9sYmxrID0gMDtcbi1cdG1hcC5tX2xlbiA9IDE7XG4tXHRtYXAubV9mbGFncyA9IDA7XG4tXHRlcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBcdTAwMjZtYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpO1xuJiM0MztcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4mIzQzO1x0YXIuaW5vZGUgPSBpbm9kZTtcbiYjNDM7XHRhci5sb2dpY2FsID0gMDtcbiYjNDM7XHRhci5sZW4gPSAxO1xuJiM0MztcdGlmIChTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkpXG4mIzQzO1x0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGFyLmZsYWdzID0gMDtcbiYjNDM7XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4gXHRpZiAoZXJyb3IgXHUwMDNjIDApXG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHRpZiAoIShtYXAubV9mbGFncyBcdTAwMjYgRVhUNF9NQVBfTUFQUEVEKSkge1xuLVx0XHRlcnJvciA9IC1FSU87XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHR9XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4mIzQzO1x0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4gXHRpZiAoIWRhdGFfYmgpIHtcbiBcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuJiM0MztcdFx0Z290byBvdXRfYmg7XG4gXHR9XG4gXG4gXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcbkBAIC0xMTQ3LDcgJiM0MzsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuJiM0MztcdFx0Z290byBvdXRfYmg7XG4gXHR9XG4gXHRtZW1zZXQoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIDAsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuIFxuQEAgLTExNzEsMTIgJiM0MzsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0XHRcdGVycm9yID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpO1xuIFx0fVxuIFxuLW91dF9yZXN0b3JlOlxuIFx0aWYgKGVycm9yKVxuLVx0XHRleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaWxvYywgYnVmLCBpbmxpbmVfc2l6ZSk7XG4tXG4tb3V0OlxuJiM0MztcdFx0Z290byBvdXRfYmg7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBuZXdibG9jaywgYXIubGVuKTtcbiYjNDM7b3V0X2JoOlxuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFyLmxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuIFx0YnJlbHNlKGRhdGFfYmgpO1xuJiM0MztvdXQ6XG4gXHRrZnJlZShidWYpO1xuIFx0cmV0dXJuIGVycm9yO1xuIH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNTo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmMKaW5kZXggODA0NWU0ZmYyNzBjNy4uMmE5Mjk5ZWE0MTQ2YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbmxpbmUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2lubGluZS5jCkBAIC0xNCw2ICYjNDM7MTQsNyBAQAogI2luY2x1ZGUgJiMzNDtleHQ0LmgmIzM0OwogI2luY2x1ZGUgJiMzNDt4YXR0ci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7dHJ1bmNhdGUuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtleHQ0X2V4dGVudHMuaCYjMzQ7CiAKICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQQkmIzM0O2RhdGEmIzM0OwogI2RlZmluZSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFCSgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSkKQEAgLTEwNzAsMjEgJiM0MzsxMDcxLDY3IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLAotCQkJCSAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpCiYjNDM7c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAomIzQzOwkJCQkgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiAKLQlyZXQgPSBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbmxpbmVfc2l6ZSk7Ci0JaWYgKHJldCkgewotCQlleHQ0X21zZyhpbm9kZS0mZ3Q7aV9zYiwgS0VSTl9FTUVSRywKLQkJCSYjMzQ7ZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpJiMzNDssCi0JCQlpbm9kZS0mZ3Q7aV9pbm8sIHJldCk7Ci0JCXJldHVybjsKJiM0MzsJZG93bl93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCAmYW1wO2ksICZhbXA7aXMpOwomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgJmFtcDtpLCAmYW1wO2lzKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW1lbXNldCgodm9pZCAqKWV4dDRfcmF3X2lub2RlKCZhbXA7aXMuaWxvYyktJmd0O2lfYmxvY2ssCiYjNDM7CQkwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJbWVtc2V0KGVpLSZndDtpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwomIzQzOwlpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLSZndDtpX3NiKSAmYW1wOyZhbXA7CiYjNDM7CQkoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtJmd0O2lfbW9kZSkpKSB7CiYjNDM7CQlleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpOwomIzQzOwkJZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpOwomIzQzOwkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTsKJiM0MzsJCXN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDsKJiM0MzsKJiM0MzsJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CiYjNDM7CQluZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJmFtcDtuZXdleCwgMCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTsKJiM0MzsJZ2V0X2JoKGlzLmlsb2MuYmgpOwomIzQzOwllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX29mZiA9IDA7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX3NpemUgPSAwOwomIzQzOwlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7b3V0OgomIzQzOwlicmVsc2UoaXMuaWxvYy5iaCk7CiYjNDM7CWlmIChlcnJvciA9PSAtRU5PREFUQSkKJiM0MzsJCWVycm9yID0gMDsKJiM0MzsJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCkBAIC0xMDk0LDggJiM0MzsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAogCWlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpOwogCWJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTsKQEAgLTExMjAsMjUgJiM0MzsxMTY4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0KLQltYXAubV9sYmxrID0gMDsKLQltYXAubV9sZW4gPSAxOwotCW1hcC5tX2ZsYWdzID0gMDsKLQllcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmYW1wO21hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7CiYjNDM7CW1lbXNldCgmYW1wO2FyLCAwLCBzaXplb2YoYXIpKTsKJiM0MzsJYXIuaW5vZGUgPSBpbm9kZTsKJiM0MzsJYXIubG9naWNhbCA9IDA7CiYjNDM7CWFyLmxlbiA9IDE7CiYjNDM7CWlmIChTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpKQomIzQzOwkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKJiM0MzsJZWxzZQomIzQzOwkJYXIuZmxhZ3MgPSAwOwomIzQzOwluZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhbXA7YXIsICZhbXA7ZXJyb3IpOwogCWlmIChlcnJvciAmbHQ7IDApCi0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JaWYgKCEobWFwLm1fZmxhZ3MgJmFtcDsgRVhUNF9NQVBfTUFQUEVEKSkgewotCQllcnJvciA9IC1FSU87Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JfQomIzQzOwkJZ290byBvdXQ7CiAKLQlkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLSZndDtpX3NiLCBtYXAubV9wYmxrKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzExOTIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNzEsMTIgJiM0MzsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQogCi1vdXRfcmVzdG9yZToKIAlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKLQotb3V0OgomIzQzOwkJZ290byBvdXRfYmg7CiYjNDM7CWVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgbmV3YmxvY2ssIGFyLmxlbik7CiYjNDM7b3V0X2JoOgomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhci5sZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAlicmVsc2UoZGF0YV9iaCk7CiYjNDM7b3V0OgogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNTo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDY2CgkJCQkJCQlvdXRwdXQ6IDI1CgkJCQkJCQl0aG91Z2h0czogMjA2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQmIzM5O3Mgc2hha2luZyB1cCB0aGUgYGZzL2V4dDQvaW5saW5lLmNgIGNvZGUuIEl0IGxvb2tzIGxpa2UgdGhleSYjMzk7cmUgZG9pbmcgYSBiaXQgb2YgYSByZWZhY3RvciBpbiBob3cgaW5saW5lIGRhdGEgZ2V0cyBjb252ZXJ0ZWQgdG8gcmVndWxhciBibG9ja3MuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgbGlrZSB0aGV5JiMzOTtyZSByZW1vdmluZyBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgaW50cm9kdWNpbmcgdGhpcyBuZXcgZnVuY3Rpb24sIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGNoYW5nZSwgdGhvdWdoLCBpcyBob3cgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGJlaW5nIHJld29ya2VkLiBJbnN0ZWFkIG9mIHRoYXQgYGV4dDRfbWFwX2Jsb2Nrc2AgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCBkYW5jZSwgdGhleSYjMzk7cmUgbm93IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGRpcmVjdGx5LgoKVGhpcyBpcyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGUgZmlsZXN5c3RlbSBoYW5kbGVzIHRoaXMgaW5saW5lLXRvLWJsb2NrIGNvbnZlcnNpb24sIGFuZCB0aGF0IGFsd2F5cyBnZXRzIG15IGF0dGVudGlvbi4gU28sIGxldCYjMzk7cyB0YWtlIGEgY2xvc2VyIGxvb2suCgpJIG5lZWQgdG8gZm9jdXMgb24gdGhlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG9mIGNvdXJzZSwgdGhlIG1haW4gc3ViamVjdCBvZiBjaGFuZ2U6IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gR2l2ZW4gdGhhdCBpdCYjMzk7cyBhIGNvcmUgY29tcG9uZW50LCBJJiMzOTttIHRoaW5raW5nIHdlIHNob3VsZCBkZWZpbml0ZWx5IGJlIGZ1enppbmcgdGhhdCwgb3IgYXQgbGVhc3QgaXRzIGNhbGxlcnMuIFRoYXQgc2VlbXMgbGlrZSB0aGUgbG9naWNhbCBzcG90IGZvciBzb21lIHRob3JvdWdoIHRlc3RpbmcuIExldCYjMzk7cyBkaWcgaW50byB0aGUgY29kZSBhbmQgZmluZCBvdXQgZXhhY3RseSAqd2hvKiBpcyBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMTM2LVxuZnMvZXh0NC9pbmxpbmUuYzoxMTM3OnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM4LVx0XHRcdFx0XHQgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTIzNj1pbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMjg4LVx0ICovXG5mcy9leHQ0L2lubGluZS5jOjEyODk6XHRyZXQgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgZGlyLCBcdTAwMjZpbG9jKTtcbmZzL2V4dDQvaW5saW5lLmMtMTI5MC1cbi0tXG5mcy9leHQ0L2lubGluZS5jPTIwMDM9aW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMjA0MC1cdGlmIChleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXG5mcy9leHQ0L2lubGluZS5jOjIwNDE6XHRcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlLCBcdTAwMjZpbG9jKTtcbmZzL2V4dDQvaW5saW5lLmMtMjA0Mi1cdGV4dDRfd3JpdGVfdW5sb2NrX3hhdHRyKGlub2RlLCBcdTAwMjZub19leHBhbmQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ5ODkKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIG9uIG15IG1pbmQgcmVnYXJkaW5nIHRoZXNlIGZ1bmN0aW9ucy4KCioqSW52ZXN0aWdhdGluZyBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIGluIGV4dDQqKgoKUmlnaHQsIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSXQgbG9va3MgbGlrZSB0aGVzZSBhcmUga2V5IHBsYXllcnMgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgYW4gaW1wb3J0YW50IG9wdGltaXphdGlvbi4gTXkgZm9jdXMgbmVlZHMgdG8gYmUgb24gaG93IHRoZXkgcmVsYXRlIHRvIGVhY2ggb3RoZXIuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgdHJhY2luZyB0aGUgY2FsbCBjaGFpbi4gSSYjMzk7bGwgY2hlY2sgd2hvIGlzIGNhbGxpbmcgdGhvc2UgZnVuY3Rpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NlbmFyaW9zIHRoYXQgbGVhZCB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGJlaW5nIGludm9rZWQuIEdldHRpbmcgYSBjbGVhciBwaWN0dXJlIG9mIHRoZWlyIGNhbGxlcnMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgZGF0YSBmbG93IGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtIG1ha2VzIGRlY2lzaW9ucyBhYm91dCBpbmxpbmUgZGF0YS4gVGhpcyB3aWxsIGhlbHAgbWUgaW1tZW5zZWx5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0Lmg9Mzc0Nz1leHRlcm4gaW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2V4dDQuaC0zNzUxLVx0XHRcdFx0XHQgIHZvaWQgKipmc2RhdGEsIGJvb2wgZGEpO1xuZnMvZXh0NC9leHQ0Lmg6Mzc1MjpleHRlcm4gaW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSxcbmZzL2V4dDQvZXh0NC5oLTM3NTMtXHRcdFx0XHQgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMjM1LSAqL1xuZnMvZXh0NC9pbmxpbmUuYzoxMjM2OmludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbmZzL2V4dDQvaW5saW5lLmMtMTIzNy1cdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L25hbWVpLmM9MjM1Nj1zdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTIzODMtXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoZGlyKSkge1xuZnMvZXh0NC9uYW1laS5jOjIzODQ6XHRcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcdTAwMjZmbmFtZSwgZGlyLCBpbm9kZSk7XG5mcy9leHQ0L25hbWVpLmMtMjM4NS1cdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NjU4CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc2l0dWF0aW9uLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZSwgc3VtbWFyaXplZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipJbmxpbmUgRGF0YSBIYW5kbGluZyBpbiBleHQ0KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgaW5saW5lIGRhdGEgaXMgbWFuYWdlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS4gSXQmIzM5O3MgY2xlYXIgdGhhdCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgaXMsIGFzIGV4cGVjdGVkLCBhIGhlbHBlciBmdW5jdGlvbiBpbnZva2VkIGJ5IGBfX2V4dDRfYWRkX2VudHJ5YC4gTWFrZXMgc2Vuc2UsIHRoYXQmIzM5O3Mgd2hlcmUgdGhlICphdHRlbXB0KiB0byBhZGQgYW4gaW5saW5lIGVudHJ5IGdldHMgaGFuZGxlZCBkdXJpbmcgZGlyZWN0b3J5IGVudHJ5IGNyZWF0aW9uIG9yIG1vZGlmaWNhdGlvbiwgcHJvYmFibHkgd2hlbiBhIHNtYWxsIGZpbGUgZml0cyB3aXRoaW4gdGhlIGlub2RlJiMzOTtzIGRhdGEgYXJlYS4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQgdGhlIGFkZGl0aW9uIG9mIHRoZSAqZGF0YSogaXRzZWxmIGZvciB0aGlzIGlubGluZSBmaWxlIGhhcHBlbnMgd2l0aGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLiBTbywgdGhhdCB0ZWxscyBtZSB0aGUgZGF0YSBjb252ZXJzaW9uIHRha2VzIHBsYWNlIGFmdGVyIHNvbWUgY2hlY2sgLSBwcmVzdW1hYmx5IGFmdGVyIHRoZSBhdHRlbXB0IHRvIG1ha2UgaXQgaW5saW5lLiBJIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBjYWxsIHN0YWNrIHRvIHNlZSAqd2hhdCogaW5pdGlhdGVzIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBmdW5jdGlvbi4gSXMgaXQgYWx3YXlzIGZyb20gYF9fZXh0NF9hZGRfZW50cnlgLCBvciBhcmUgdGhlcmUgb3RoZXIgZW50cnkgcG9pbnRzLCBsaWtlIHdoZW4gY29udmVydGluZyBhIHJlZ3VsYXIgZmlsZSAqdG8qIGFuIGlubGluZSBmaWxlIGxhdGVyPyBJIGFsc28gbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBlcnJvciBjb25kaXRpb25zIGhlcmUgYW5kIGhvdyBmYWlsdXJlcyBpbiBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgaW5mbHVlbmNlIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAg4oCTIGhvdyBhcmUgdGhleSBjb29yZGluYXRlZD8gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpbXByb3BlciBkYXRhIHBsYWNlbWVudCBjb3VsZCBlYXNpbHkgY29ycnVwdCB0aGUgZmlsZSBzdHJ1Y3R1cmUuIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgdGhlIGNvbnRyb2wgZmxvdyB0byBmdWxseSBncmFzcCB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcbi0tXG5mcy9leHQ0L2NyeXB0by5jLTE1Mi1cbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlx0cmVzID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcbmZzL2V4dDQvY3J5cHRvLmMtMTU0LVx0aWYgKHJlcylcbi0tXG5mcy9leHQ0L2V4dDQuaD0zNzg0PWV4dGVybiBpbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpO1xuZnMvZXh0NC9leHQ0LmgtMzc4NS1cbmZzL2V4dDQvZXh0NC5oOjM3ODY6ZXh0ZXJuIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSk7XG5mcy9leHQ0L2V4dDQuaC0zNzg3LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQ4NTQ9bG9uZyBleHQ0X2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cdGlub2RlX2xvY2soaW5vZGUpO1xuZnMvZXh0NC9leHRlbnRzLmM6NDg4NDpcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L2V4dGVudHMuYy00ODg1LVx0aWYgKHJldClcbi0tXG5mcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbmZzL2V4dDQvaW5saW5lLmMtNTc0LVx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy03MjgtXHRcdFx0LyogUmV0cnkgaW5zaWRlICovXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcdFx0XHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTczMC1cdFx0fVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Nzg0PWludCBleHQ0X3RyeV90b193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cdGlmIChwb3MgJiM0MzsgbGVuIFx1MDAzZSBleHQ0X2dldF9tYXhfaW5saW5lX3NpemUoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMzYtXG5mcy9leHQ0L2lubGluZS5jOjExMzc6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5mcy9leHQ0L2lubGluZS5jLTExMzgtXHRcdFx0XHRcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMjM2PWludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTEyODgtXHQgKi9cbmZzL2V4dDQvaW5saW5lLmM6MTI4OTpcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBkaXIsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xMjkwLVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0yMDAyLVxuZnMvZXh0NC9pbmxpbmUuYzoyMDAzOmludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2V4dDQvaW5saW5lLmMtMjAwNC17XG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0yMDQwLVx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcbmZzL2V4dDQvaW5saW5lLmM6MjA0MTpcdFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0yMDQyLVx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFx1MDAyNm5vX2V4cGFuZCk7XG4tLVxuZnMvZXh0NC9pbm9kZS5jPTU5MzQ9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuLS1cbmZzL2V4dDQvaW5vZGUuYy02MDMxLVx0XHQgICAgYXR0ci1cdTAwM2VpYV9zaXplIFx1MDAzZSBFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUpIHtcbmZzL2V4dDQvaW5vZGUuYzo2MDMyOlx0XHRcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcbmZzL2V4dDQvaW5vZGUuYy02MDMzLVx0XHRcdGlmIChlcnJvcilcbi0tXG5mcy9leHQ0L2lub2RlLmM9Njc4Nz12bV9mYXVsdF90IGV4dDRfcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbmZzL2V4dDQvaW5vZGUuYy02ODA4LVxuZnMvZXh0NC9pbm9kZS5jOjY4MDk6XHRlcnIgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xuZnMvZXh0NC9pbm9kZS5jLTY4MTAtXHRpZiAoZXJyKVxuLS1cbmZzL2V4dDQvdmVyaXR5LmM9MTAyPXN0YXRpYyBpbnQgZXh0NF9iZWdpbl9lbmFibGVfdmVyaXR5KHN0cnVjdCBmaWxlICpmaWxwKVxuLS1cbmZzL2V4dDQvdmVyaXR5LmMtMTI4LVxuZnMvZXh0NC92ZXJpdHkuYzoxMjk6XHRlcnIgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xuZnMvZXh0NC92ZXJpdHkuYy0xMzAtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc0OTIKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAyMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEqKgoKT2theSwgc28gbG9va2luZyBhdCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgaXQgc2VlbXMgbGlrZSB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGFuZCB0aGVyZWZvcmUgd29ydGggY29uc2lkZXJpbmcgZm9yIGZ1enppbmcuIEl0JiMzOTtzIGNhbGxlZCBmcm9tIGEgZmV3IGRpZmZlcmVudCBwbGFjZXMsIHdoaWNoIGlzIGdvb2QgZm9yIGNvdmVyYWdlOiBgZXh0NF9zZXRfY29udGV4dGAgKHdoaWNoIGlzIGNyeXB0by1yZWxhdGVkLCBpbnRlcmVzdGluZyksIGBleHQ0X2ZhbGxvY2F0ZWAsIGBleHQ0X3NldGF0dHJgIChzcGVjaWZpY2FsbHkgZm9yIHRydW5jYXRpbmcgZmlsZXMpLCBgZXh0NF9wYWdlX21rd3JpdGVgLCBhbmQgYGV4dDRfYmVnaW5fZW5hYmxlX3Zlcml0eWAuIFRoYXQmIzM5O3MgYSBkZWNlbnQgc3ByZWFkLgoKVGhlIG9idmlvdXMgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGFyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBpdHNlbGYsIG9mIGNvdXJzZSwgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSSYjMzk7bSBnb2luZyB0byBub3RlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbmQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBhcyB3ZWxsLCBldmVuIHRob3VnaCB0aGV5JiMzOTtyZSBzdGF0aWMg4oCTIHNvbWV0aW1lcyBzdGF0aWMgZnVuY3Rpb25zIHN0aWxsIGV4cG9zZSBpbnRlcmVzdGluZyB2dWxuZXJhYmlsaXRpZXMgaWYgdGhlIGNvcmUgZnVuY3Rpb24gaXMgdHJpZ2dlcmVkLiBUaG91Z2gsIGxpc3RpbmcgdGhlIGNhbGxlcnMgdG8gdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGlzIHByb2JhYmx5IGEgbW9yZSBlZmZlY3RpdmUgYXBwcm9hY2guCgpTbywgbGV0JiMzOTtzIG1ha2UgYSBub3RlIHRvIGRlZmluaXRlbHkgdGFyZ2V0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgSSBuZWVkIHRvIGtlZXAgaW4gbWluZD8gQWgsIHJpZ2h0LCBFWFQ0X0ZTIGlzIG9idmlvdXNseSByZXF1aXJlZC4gR29vZCB0byBrbm93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVhUNF9GUyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmZzL2V4dDQvS2NvbmZpZzoyOmNvbmZpZyBFWFQ0X0ZTXG5mcy9leHQ0L0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O1RoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnPTM1PWNvbmZpZyBFWFQ0X1VTRV9GT1JfRVhUMlxuLS1cbmZzL2V4dDQvS2NvbmZpZy00NS1cbmZzL2V4dDQvS2NvbmZpZzo0Njpjb25maWcgRVhUNF9GU19QT1NJWF9BQ0xcbmZzL2V4dDQvS2NvbmZpZy00Ny1cdGJvb2wgXCYjMzQ7RXh0NCBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0c1wmIzM0O1xuLS1cbmZzL2V4dDQvS2NvbmZpZy01NS1cbmZzL2V4dDQvS2NvbmZpZzo1Njpjb25maWcgRVhUNF9GU19TRUNVUklUWVxuZnMvZXh0NC9LY29uZmlnLTU3LVx0Ym9vbCBcJiMzNDtFeHQ0IFNlY3VyaXR5IExhYmVsc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MjM5CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjcyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBFWFQ0IElubGluZSBEYXRhIENvbnZlcnNpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoZSBgRVhUNF9GU2AgY29uZmlndXJhdGlvbiBhbmQgZGl2aW5nIGludG8gdGhlIGlubGluZSBkYXRhIGNvbnZlcnNpb24gcm91dGluZXMuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSB3YW50IHRvIGNoZWNrIHRoZSB2aXNpYmlsaXR5IG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLiBBaCwgeWVzLCBpdCYjMzk7cyBleHBvcnRlZCBhbmQgZGVjbGFyZWQgaW4gYGZzL2V4dDQvZXh0NC5oYCBhcyBgZXh0ZXJuIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSk7YC4gRXhjZWxsZW50LiBBbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGlzIGFsc28gcmlnaHQgdGhlcmUgaW4gdGhlIGhlYWRlci4KCk5vdywganVzdCB0byBiZSBzdXJlLCBsZXQmIzM5O3MgdGFrZSBhIHF1aWNrIGxvb2sgYXQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gWWVwLCB0aGF0JiMzOTtzIHN0YXRpYywgYXMgaXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBSaWdodCwgc28gdGhhdCBtZWFucyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGFyZSBwcm9iYWJseSB0aGUga2V5IGZ1bmN0aW9ucyB0byBmb2N1cyBvbi4KCldhaXQgYSBzZWNvbmTigKYgaXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGFsc28gYSBjYWxsZXIgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgPyBObywgdGhhdCBkb2VzbiYjMzk7dCBzZWVtIHRvIGJlIHRoZSBjYXNlLiBBaCwgSSBzZWUhIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgYnkgYm90aCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLiBPa2F5LCB0aGF0IGNsYXJpZmllcyB0aGUgY2FsbCBncmFwaC4gTGV0IG1lIG5vdyBzZWUgd2hhdCYjMzk7cyBnb2luZyBvbiB3aXRoIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YC4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmM9NTQ2PWludCBleHQ0X3JlYWRwYWdlX2lubGluZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNTcyLVxuZnMvZXh0NC9pbmxpbmUuYzo1NzM6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuZnMvZXh0NC9pbmxpbmUuYy01NzQtXHRcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz02OTc9aW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTcyOC1cdFx0XHQvKiBSZXRyeSBpbnNpZGUgKi9cbmZzL2V4dDQvaW5saW5lLmM6NzI5Olx0XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzMwLVx0XHR9XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz03ODQ9aW50IGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNzg5LVx0aWYgKHBvcyAmIzQzOyBsZW4gXHUwMDNlIGV4dDRfZ2V0X21heF9pbmxpbmVfc2l6ZShpbm9kZSkpXG5mcy9leHQ0L2lubGluZS5jOjc5MDpcdFx0cmV0dXJuIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQobWFwcGluZywgaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy03OTEtXHRyZXR1cm4gZXh0NF9nZW5lcmljX3dyaXRlX2lubGluZV9kYXRhKG1hcHBpbmcsIGlub2RlLCBwb3MsIGxlbixcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTIzNgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqRGl2aW5nIGludG8gdGhlIGV4dDQgSW5saW5lIERhdGEgQ29udmVyc2lvbioqCgpSaWdodCwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgZnVuY3Rpb24sIGFuZCBpdCBzZWVtcyBsaWtlIGEgY3J1Y2lhbCBwaWVjZSBpbiBob3cgZXh0NCBoYW5kbGVzIGZpbGUgZGF0YS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7V2FpdCBhIG1pbnV0ZSwgSSB0aG91Z2h0IEkgcmVtZW1iZXJlZCBpdCBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBkaXJlY3RseSwgYnV0IHRoYXQgZG9lc24mIzM5O3Qgc2VlbSB0byBiZSB0aGUgY2FzZS4mIzM0OyBQZXJoYXBzIEkgbWlzcmVhZCBzb21ldGhpbmcgb3IgdGhlcmUmIzM5O3Mgc29tZSBpbmRpcmVjdCBjYWxsIHBhdGggSSYjMzk7bSBub3QgaW1tZWRpYXRlbHkgY29uc2lkZXJpbmcuCgpUaGVyZWZvcmUsIGl0IGxvb2tzIGxpa2UgaXQmIzM5O3MgdGltZSB0byB0aG9yb3VnaGx5IGV4YW1pbmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBhbmQgc2VlIGV4YWN0bHkgd2hhdCBpdCYjMzk7cyBkb2luZy4gR290dGEgcmVmcmVzaCBteSBtZW1vcnkgb2YgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhpcyBjb252ZXJzaW9uIGlzIGtleSBmb3IgZGVhbGluZyB3aXRoIHNtYWxsZXIgZmlsZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU3MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTczOlx0c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuIDU3NDpcdFx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDU3NTpcdHtcbiA1NzY6XHRcdGludCByZXQsIG5lZWRlZF9ibG9ja3MsIG5vX2V4cGFuZDtcbiA1Nzc6XHRcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xuIDU3ODpcdFx0aW50IHJldHJpZXMgPSAwLCBzZW1faGVsZCA9IDA7XG4gNTc5Olx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiA1ODA6XHRcdHVuc2lnbmVkIGZyb20sIHRvO1xuIDU4MTpcdFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xuIDU4MjpcdFxuIDU4MzpcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcbiA1ODQ6XHRcdFx0LypcbiA1ODU6XHRcdFx0ICogY2xlYXIgdGhlIGZsYWcgc28gdGhhdCBubyBuZXcgd3JpdGVcbiA1ODY6XHRcdFx0ICogd2lsbCB0cmFwIGhlcmUgYWdhaW4uXG4gNTg3Olx0XHRcdCAqL1xuIDU4ODpcdFx0XHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4gNTg5Olx0XHRcdHJldHVybiAwO1xuIDU5MDpcdFx0fVxuIDU5MTpcdFxuIDU5MjpcdFx0bmVlZGVkX2Jsb2NrcyA9IGV4dDRfY2h1bmtfdHJhbnNfZXh0ZW50KGlub2RlLCAxKTtcbiA1OTM6XHRcbiA1OTQ6XHRcdHJldCA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aWxvYyk7XG4gNTk1Olx0XHRpZiAocmV0KVxuIDU5NjpcdFx0XHRyZXR1cm4gcmV0O1xuIDU5NzpcdFxuIDU5ODpcdHJldHJ5OlxuIDU5OTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX1dSSVRFX1BBR0UsIG5lZWRlZF9ibG9ja3MpO1xuIDYwMDpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNjAxOlx0XHRcdHJldCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA2MDI6XHRcdFx0aGFuZGxlID0gTlVMTDtcbiA2MDM6XHRcdFx0Z290byBvdXQ7XG4gNjA0Olx0XHR9XG4gNjA1Olx0XG4gNjA2Olx0XHQvKiBXZSBjYW5ub3QgcmVjdXJzZSBpbnRvIHRoZSBmaWxlc3lzdGVtIGFzIHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5XG4gNjA3Olx0XHQgKiBzdGFydGVkICovXG4gNjA4Olx0XHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgMCwgRkdQX1dSSVRFQkVHSU4gfCBGR1BfTk9GUyxcbiA2MDk6XHRcdFx0XHRtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTtcbiA2MTA6XHRcdGlmIChJU19FUlIoZm9saW8pKSB7XG4gNjExOlx0XHRcdHJldCA9IFBUUl9FUlIoZm9saW8pO1xuIDYxMjpcdFx0XHRnb3RvIG91dF9ub2ZvbGlvO1xuIDYxMzpcdFx0fVxuIDYxNDpcdFxuIDYxNTpcdFx0ZXh0NF93cml0ZV9sb2NrX3hhdHRyKGlub2RlLCBcdTAwMjZub19leHBhbmQpO1xuIDYxNjpcdFx0c2VtX2hlbGQgPSAxO1xuIDYxNzpcdFx0LyogSWYgc29tZSBvbmUgaGFzIGFscmVhZHkgZG9uZSB0aGlzIGZvciB1cywganVzdCBleGl0LiAqL1xuIDYxODpcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcbiA2MTk6XHRcdFx0cmV0ID0gMDtcbiA2MjA6XHRcdFx0Z290byBvdXQ7XG4gNjIxOlx0XHR9XG4gNjIyOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMjU3CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCoqCgpPa2F5LCBob2xkIG9uIGEgbWludXRlLiBJIHdhcyBwcmV0dHkgc3VyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgd2FzIGp1c3QgYSB3cmFwcGVyIGZvciBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEJ1dCwgcmVyZWFkaW5nIHRoZSBjb2RlLCBpdCBzZWVtcy4uLiB3YWl0LCBpcyB0aGF0IHJpZ2h0PyBJdCAqZG9lc24mIzM5O3QqIGFjdHVhbGx5IGNhbGwgdGhlIGBub2xvY2tgIHZlcnNpb24gZGlyZWN0bHk/IFRoYXQgc2VlbXMgb2RkLCBnaXZlbiB0aGUgdXN1YWwgbG9ja2luZyBzdHJhdGVnaWVzIGluIHRoZSBleHQ0IGNvZGUuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoZSBjYWxsaW5nIGNvbnRleHQgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgLCBhbmQgdmVyaWZ5IHRoYXQgdGhlIG5lY2Vzc2FyeSBsb2NraW5nIGlzIGFjdHVhbGx5ICpiZWluZyogaGFuZGxlZCBleHRlcm5hbGx5LiBUaGlzIGNvdWxkIGJlIGEgY3JpdGljYWwgZmxhdyBpZiBpdCYjMzk7cyBub3QgbG9ja2VkIHByb3Blcmx5LCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGRhdGEgY29ycnVwdGlvbiwgb3IgYXQgbGVhc3Qgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB0cmFjZSB0aGlzIGNhbGwsIHNlZSB3aGVyZSBpdCYjMzk7cyBiZWluZyB1c2VkLCBhbmQgdW5kZXJzdGFuZCBob3cgdGhlIGxvY2sgaXMgYmVpbmcgYWNxdWlyZWQsIGlmIGF0IGFsbC4gSXQgbWlnaHQgdXNlIGFub3RoZXIsIGludGVybmFsIGxvY2tpbmcgbWVjaGFuaXNtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MjMsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYyMzpcdFx0ZnJvbSA9IDA7XG4gNjI0Olx0XHR0byA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiA2MjU6XHRcdGlmICghZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbykpIHtcbiA2MjY6XHRcdFx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9mb2xpbyhpbm9kZSwgZm9saW8pO1xuIDYyNzpcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuIDYyODpcdFx0XHRcdGdvdG8gb3V0O1xuIDYyOTpcdFx0fVxuIDYzMDpcdFxuIDYzMTpcdFx0ZXh0NF9mY190cmFja19pbm9kZShoYW5kbGUsIGlub2RlKTtcbiA2MzI6XHRcdHJldCA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4gNjMzOlx0XHRpZiAocmV0KVxuIDYzNDpcdFx0XHRnb3RvIG91dDtcbiA2MzU6XHRcbiA2MzY6XHRcdGlmIChleHQ0X3Nob3VsZF9kaW9yZWFkX25vbG9jayhpbm9kZSkpIHtcbiA2Mzc6XHRcdFx0cmV0ID0gZXh0NF9ibG9ja193cml0ZV9iZWdpbihoYW5kbGUsIGZvbGlvLCBmcm9tLCB0byxcbiA2Mzg6XHRcdFx0XHRcdFx0ICAgICBleHQ0X2dldF9ibG9ja191bndyaXR0ZW4pO1xuIDYzOTpcdFx0fSBlbHNlXG4gNjQwOlx0XHRcdHJldCA9IGV4dDRfYmxvY2tfd3JpdGVfYmVnaW4oaGFuZGxlLCBmb2xpbywgZnJvbSwgdG8sXG4gNjQxOlx0XHRcdFx0XHRcdCAgICAgZXh0NF9nZXRfYmxvY2spO1xuIDY0MjpcdFx0Y2xlYXJfYnVmZmVyX25ldyhmb2xpb19idWZmZXJzKGZvbGlvKSk7XG4gNjQzOlx0XG4gNjQ0Olx0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkge1xuIDY0NTpcdFx0XHRyZXQgPSBleHQ0X3dhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgaW5vZGUsXG4gNjQ2Olx0XHRcdFx0XHRcdCAgICAgZm9saW9fYnVmZmVycyhmb2xpbyksIGZyb20sIHRvLFxuIDY0NzpcdFx0XHRcdFx0XHQgICAgIE5VTEwsIGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7XG4gNjQ4Olx0XHR9XG4gNjQ5Olx0XG4gNjUwOlx0XHRpZiAocmV0KSB7XG4gNjUxOlx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gNjUyOlx0XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gNjUzOlx0XHRcdGZvbGlvID0gTlVMTDtcbiA2NTQ6XHRcdFx0ZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpO1xuIDY1NTpcdFx0XHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXHUwMDI2bm9fZXhwYW5kKTtcbiA2NTY6XHRcdFx0c2VtX2hlbGQgPSAwO1xuIDY1NzpcdFx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDY1ODpcdFx0XHRoYW5kbGUgPSBOVUxMO1xuIDY1OTpcdFx0XHRleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7XG4gNjYwOlx0XHRcdC8qXG4gNjYxOlx0XHRcdCAqIElmIHRydW5jYXRlIGZhaWxlZCBlYXJseSB0aGUgaW5vZGUgbWlnaHRcbiA2NjI6XHRcdFx0ICogc3RpbGwgYmUgb24gdGhlIG9ycGhhbiBsaXN0OyB3ZSBuZWVkIHRvXG4gNjYzOlx0XHRcdCAqIG1ha2Ugc3VyZSB0aGUgaW5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZVxuIDY2NDpcdFx0XHQgKiBvcnBoYW4gbGlzdCBpbiB0aGF0IGNhc2UuXG4gNjY1Olx0XHRcdCAqL1xuIDY2NjpcdFx0XHRpZiAoaW5vZGUtXHUwMDNlaV9ubGluaylcbiA2Njc6XHRcdFx0XHRleHQ0X29ycGhhbl9kZWwoTlVMTCwgaW5vZGUpO1xuIDY2ODpcdFx0fVxuIDY2OTpcdFxuIDY3MDpcdFx0aWYgKHJldCA9PSAtRU5PU1BDIFx1MDAyNlx1MDAyNiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS1cdTAwM2VpX3NiLCBcdTAwMjZyZXRyaWVzKSlcbiA2NzE6XHRcdFx0Z290byByZXRyeTtcbiA2NzI6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEzMzkKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA5MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBxdWljayBydW5kb3duIG9mIHdoYXQgSSYjMzk7bSBsb29raW5nIGF0LCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZToKCioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgSW50ZXJhY3Rpb25zIEFmdGVyIGEgUmVjZW50IFBhdGNoKioKCkFscmlnaHQsIHNvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBpcyBjYWxsaW5nIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYC4gSW50ZXJlc3RpbmcuIEl0JiMzOTtzIGEga2V5IGZ1bmN0aW9uIGluIHRoaXMgYXJlYSwgYW5kIEkgc2VlIHRoYXQgKnRoYXQqIGZ1bmN0aW9uLCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIHdhc24mIzM5O3QgdG91Y2hlZCBpbiB0aGlzIHNwZWNpZmljIHBhdGNoLiBUaGF0JiMzOTtzIGEgZ29vZCBmaXJzdCBjaGVjaywgbWVhbnMgdGhlcmUmIzM5O3MgbGVzcyBpbW1lZGlhdGUgcmlzayB0aGVyZS4KCkhvd2V2ZXIsIHRoZSBwYXRjaCAqZGlkKiBtb2RpZnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGFuZCBhZGRlZCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBTbywgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBnaXZlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbm90aGVyLCBjbG9zZXIgbG9vay4gTGV0IG1lIGRvdWJsZS1jaGVjayBob3cgKml0KiBoYW5kbGVzIHRoaW5ncyBub3csIGdpdmVuIHRoZXNlIGFkZGl0aW9ucyBhbmQgY2hhbmdlcy4gSnVzdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgaW50ZXJhY3Rpb25zIGFyZSBzb3VuZCwgZXNwZWNpYWxseSBzaW5jZSB3ZSYjMzk7dmUgZ290IGEgbmV3IHBpZWNlIHRvIHRoZSBwdXp6bGUgd2l0aCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTM3LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExMzc6XHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbjExMzg6XHRcdFx0XHRcdFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcbjExMzk6XHRcdFx0XHRcdFx0ICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYylcbjExNDA6XHR7XG4xMTQxOlx0XHRpbnQgZXJyb3I7XG4xMTQyOlx0XHR2b2lkICpidWYgPSBOVUxMO1xuMTE0MzpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDtcbjExNDQ6XHRcdGludCBpbmxpbmVfc2l6ZTtcbjExNDU6XHRcdGV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7XG4xMTQ2Olx0XHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XG4xMTQ3Olx0XG4xMTQ4Olx0XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbjExNDk6XHRcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbjExNTA6XHRcdGlmICghYnVmKSB7XG4xMTUxOlx0XHRcdGVycm9yID0gLUVOT01FTTtcbjExNTI6XHRcdFx0Z290byBvdXQ7XG4xMTUzOlx0XHR9XG4xMTU0Olx0XG4xMTU1Olx0XHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XG4xMTU2Olx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTU3Olx0XHRcdGdvdG8gb3V0O1xuMTE1ODpcdFxuMTE1OTpcdFx0LypcbjExNjA6XHRcdCAqIE1ha2Ugc3VyZSB0aGUgaW5saW5lIGRpcmVjdG9yeSBlbnRyaWVzIHBhc3MgY2hlY2tzIGJlZm9yZSB3ZSB0cnkgdG9cbjExNjE6XHRcdCAqIGNvbnZlcnQgdGhlbSwgc28gdGhhdCB3ZSBhdm9pZCB0b3VjaGluZyBzdHVmZiB0aGF0IG5lZWRzIGZzY2suXG4xMTYyOlx0XHQgKi9cbjExNjM6XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbjExNjQ6XHRcdFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cdTAwM2ViaCxcbjExNjU6XHRcdFx0XHRcdFx0YnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTE2NjpcdFx0XHRcdFx0XHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbjExNjc6XHRcdFx0aWYgKGVycm9yKVxuMTE2ODpcdFx0XHRcdGdvdG8gb3V0O1xuMTE2OTpcdFx0fVxuMTE3MDpcdFxuMTE3MTpcdFx0bWVtc2V0KFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcbjExNzI6XHRcdGFyLmlub2RlID0gaW5vZGU7XG4xMTczOlx0XHRhci5sb2dpY2FsID0gMDtcbjExNzQ6XHRcdGFyLmxlbiA9IDE7XG4xMTc1Olx0XHRpZiAoU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpKVxuMTE3NjpcdFx0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuMTE3NzpcdFx0ZWxzZVxuMTE3ODpcdFx0XHRhci5mbGFncyA9IDA7XG4xMTc5Olx0XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4xMTgwOlx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTgxOlx0XHRcdGdvdG8gb3V0O1xuMTE4MjpcdFxuMTE4MzpcdFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4xMTg0Olx0XHRpZiAoIWRhdGFfYmgpIHtcbjExODU6XHRcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuMTE4NjpcdFx0XHRnb3RvIG91dF9iaDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI0NjMKCQkJCQkJCW91dHB1dDogMjA3CgkJCQkJCQl0aG91Z2h0czogNTgxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBFeHQ0IElubGluZSBEYXRhIENvbnZlcnNpb24gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSB3aGF0IEkmIzM5O20gc2VlaW5nLCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIGNydWNpYWwgZnVuY3Rpb24gaGVyZS4gVGhpcyBpcyB0aGUgb25lIHRoYXQgYWN0dWFsbHkgYWxsb2NhdGVzIGEgbmV3IGJsb2NrIGFuZCBjYWxscyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBJdCYjMzk7cyBjYWxsZWQgYnkgdHdvIHByaW1hcnkgZnVuY3Rpb25zOiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgLiBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGlzIGRpc3RpbmN0IGFuZCBoYW5kbGVzIGNvbnZlcnNpb25zIGZvciAqcmVndWxhciogZmlsZXMgZHVyaW5nIHdyaXRlcy4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgc3BlY2lmaWNhbGx5IHVzZWQgZm9yIGRpcmVjdG9yaWVzICh0aHJvdWdoIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCkgYW5kIGZvciByZWd1bGFyIGZpbGVzIHZpYSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgd2hpY2ggaXRzZWxmIGlzIGludm9rZWQgYnkgb3BlcmF0aW9ucyBsaWtlIGBmYWxsb2NhdGVgLCBgc2V0YXR0cmAsIGNyeXB0byBhbmQgdmVyaXR5LgoKU28sIG15IHByaW1hcnkgZm9jdXMgZm9yIGZ1enppbmcgbmVlZHMgdG8gYmUgb246CgoqICAgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAKKiAgIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YAoKSSYjMzk7dmUgYWxyZWFkeSBkb3VibGUtY2hlY2tlZCBmb3IgYW55IG90aGVyIGNhbGxlcnMgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCBhbmQgdGhlIGdyZXAgcmVzdWx0cyBjb25maXJtIHRoYXQgSSYjMzk7dmUgZ290IHRoZSBjb3JyZWN0IGVudHJ5IHBvaW50cy4gSnVzdCB0aG9zZSB0d28uCgpSZWdhcmRpbmcgY29uZmlndXJhdGlvbnMsIGl0JiMzOTtzIGp1c3QgYEVYVDRfRlNgLCBub3RoaW5nIGVsc2UgdG8gd29ycnkgYWJvdXQgb24gdGhhdCBmcm9udC4KCkkmIzM5O3ZlIHJldmlld2VkIHRoZSBwYXRjaCBjbG9zZWx5LiBJdCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIHRoZSBuZXcgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlIGlzIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgd2hlcmUgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgaXMgbm93IHVzZWQgaW5zdGVhZCBvZiBgZXh0NF9tYXBfYmxvY2tzYC4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgZGVmaW5pdGVseSB3b3J0aCBhIGZ1enppbmcgY2FtcGFpZ24gdG8gaWRlbnRpZnkgYW55IGx1cmtpbmcgaXNzdWVzLiBJdCBoYXMgY2hhbmdlZCB0aGUgY29yZSBvZiBleHQ0IGlubGluZSBkYXRhIGhhbmRsaW5nLgoKSW4gZXNzZW5jZSwgdGhlIHBhdGNoIGFsdGVycyB0aGUgY29yZSBtZWNoYW5pc20gb2YgY29udmVydGluZyBpbmxpbmUgZGF0YSB0byByZWd1bGFyIGJsb2Nrcy4gSXQmIzM5O3MgdG91Y2hpbmcgdGhlIGhlYXJ0IG9mIGV4dDQuIFRoZSBjaGFuZ2VzIGluIHRoZSBpbnRlcm5hbHMsIGxpa2UgcmVwbGFjaW5nIGBleHQ0X21hcF9ibG9ja3NgIHdpdGggYGV4dDRfbWJfbmV3X2Jsb2Nrc2AsIGFuZCB0aGUgaW50cm9kdWN0aW9uIG9mIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGNvdXBsZWQgd2l0aCB0aGUgY2FsbGVycyBvZiB0aGUgbW9kaWZpZWQgZnVuY3Rpb24sIG1ha2UgdGhpcyBhIGhpZ2gtcHJpb3JpdHkgZnV6emluZyB0YXJnZXQuCgpUaW1lIHRvIGxvZyB0aGlzLiBMZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhJiMzNDssCiAgICAmIzM0O2V4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHdheSBleHQ0IGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gb2YgaW5saW5lIGRhdGEgdG8gcmVndWxhciBibG9ja3MuIEl0IHJlcGxhY2VzIGBleHQ0X21hcF9ibG9ja3NgIHdpdGggYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgYW5kIGludHJvZHVjZXMgYSBuZXcgaGVscGVyIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgdG8gZGlyZWN0bHkgc2V0IHRoZSBibG9jayB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGlubGluZSBkYXRhIGZpcnN0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXh0NCBsb2dpYy4gVGhlIG1vZGlmaWVkIGZ1bmN0aW9uIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgYnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCwgd2hpY2ggYXJlIHJlYWNoYWJsZSB2aWEgdmFyaW91cyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBkaXJlY3RvcnkgZW50cnkgYWRkaXRpb25zLiBUaGVyZWZvcmUsIGl0IGlzIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjNtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cblxuQWxsIHN0cnVjdHVyZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGUgcGF0Y2ggKGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLCBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG9yIGV4cGxpY2l0bHkgemVyb2VkICh2aWEgYG1lbXNldGAgb3IgcGFydGlhbCBpbml0aWFsaXphdGlvbiB3aGljaCB6ZXJvZXMgdGhlIHJlc3QpLiBUaGUgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmMKaW5kZXggODA0NWU0ZmYyNzBjNy4uMmE5Mjk5ZWE0MTQ2YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbmxpbmUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2lubGluZS5jCkBAIC0xNCw2ICYjNDM7MTQsNyBAQAogI2luY2x1ZGUgJiMzNDtleHQ0LmgmIzM0OwogI2luY2x1ZGUgJiMzNDt4YXR0ci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7dHJ1bmNhdGUuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtleHQ0X2V4dGVudHMuaCYjMzQ7CiAKICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQQkmIzM0O2RhdGEmIzM0OwogI2RlZmluZSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFCSgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSkKQEAgLTEwNzAsMjEgJiM0MzsxMDcxLDY3IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLAotCQkJCSAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpCiYjNDM7c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAomIzQzOwkJCQkgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiAKLQlyZXQgPSBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbmxpbmVfc2l6ZSk7Ci0JaWYgKHJldCkgewotCQlleHQ0X21zZyhpbm9kZS0mZ3Q7aV9zYiwgS0VSTl9FTUVSRywKLQkJCSYjMzQ7ZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpJiMzNDssCi0JCQlpbm9kZS0mZ3Q7aV9pbm8sIHJldCk7Ci0JCXJldHVybjsKJiM0MzsJZG93bl93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCAmYW1wO2ksICZhbXA7aXMpOwomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgJmFtcDtpLCAmYW1wO2lzKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW1lbXNldCgodm9pZCAqKWV4dDRfcmF3X2lub2RlKCZhbXA7aXMuaWxvYyktJmd0O2lfYmxvY2ssCiYjNDM7CQkwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJbWVtc2V0KGVpLSZndDtpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwomIzQzOwlpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLSZndDtpX3NiKSAmYW1wOyZhbXA7CiYjNDM7CQkoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtJmd0O2lfbW9kZSkpKSB7CiYjNDM7CQlleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpOwomIzQzOwkJZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpOwomIzQzOwkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTsKJiM0MzsJCXN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDsKJiM0MzsKJiM0MzsJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CiYjNDM7CQluZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJmFtcDtuZXdleCwgMCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTsKJiM0MzsJZ2V0X2JoKGlzLmlsb2MuYmgpOwomIzQzOwllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX29mZiA9IDA7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX3NpemUgPSAwOwomIzQzOwlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7b3V0OgomIzQzOwlicmVsc2UoaXMuaWxvYy5iaCk7CiYjNDM7CWlmIChlcnJvciA9PSAtRU5PREFUQSkKJiM0MzsJCWVycm9yID0gMDsKJiM0MzsJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCkBAIC0xMDk0LDggJiM0MzsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAogCWlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpOwogCWJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTsKQEAgLTExMjAsMjUgJiM0MzsxMTY4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0KLQltYXAubV9sYmxrID0gMDsKLQltYXAubV9sZW4gPSAxOwotCW1hcC5tX2ZsYWdzID0gMDsKLQllcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmYW1wO21hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7CiYjNDM7CW1lbXNldCgmYW1wO2FyLCAwLCBzaXplb2YoYXIpKTsKJiM0MzsJYXIuaW5vZGUgPSBpbm9kZTsKJiM0MzsJYXIubG9naWNhbCA9IDA7CiYjNDM7CWFyLmxlbiA9IDE7CiYjNDM7CWlmIChTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpKQomIzQzOwkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKJiM0MzsJZWxzZQomIzQzOwkJYXIuZmxhZ3MgPSAwOwomIzQzOwluZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhbXA7YXIsICZhbXA7ZXJyb3IpOwogCWlmIChlcnJvciAmbHQ7IDApCi0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JaWYgKCEobWFwLm1fZmxhZ3MgJmFtcDsgRVhUNF9NQVBfTUFQUEVEKSkgewotCQllcnJvciA9IC1FSU87Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JfQomIzQzOwkJZ290byBvdXQ7CiAKLQlkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLSZndDtpX3NiLCBtYXAubV9wYmxrKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzExOTIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNzEsMTIgJiM0MzsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQogCi1vdXRfcmVzdG9yZToKIAlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKLQotb3V0OgomIzQzOwkJZ290byBvdXRfYmg7CiYjNDM7CWVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgbmV3YmxvY2ssIGFyLmxlbik7CiYjNDM7b3V0X2JoOgomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhci5sZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAlicmVsc2UoZGF0YV9iaCk7CiYjNDM7b3V0OgogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2MwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDkyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBGdXp6aW5nIFNlc3Npb24gSnVzdGlmaWNhdGlvbjogZXh0NC9pbmxpbmUuYyBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7dmUgZ290IGEgcGF0Y2ggaW4gYGZzL2V4dDQvaW5saW5lLmNgLCBhbmQgdGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQgd2FycmFudHMgZmlyaW5nIHVwIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gVGhlIHBhdGNoIGZvY3VzZXMgb24gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgd2l0aCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBSaWdodCwgbGV0JiMzOTtzIHNlZS4uLgoKU28sIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgemVyb3Mgb3V0IHRoZSBpbmxpbmUgZGF0YSBibG9jayB1c2luZyBgbWVtc2V0YCwgYm90aCBpbiB0aGUgcmF3IGlub2RlIGFuZCB0aGUgYGVpLSZndDtpX2RhdGFgIHN0cnVjdHVyZXMsIHdoaWNoIGlzIGdvb2QuIFRoZW4sIGl0IHNldHMgdXAgZXh0ZW50cyBvciBkaXJlY3QgYmxvY2tzLCBkZXBlbmRpbmcgb24gdGhlIGZpbGUgc3lzdGVtIGZlYXR1cmVzIGFuZCBpbm9kZSB0eXBlLCB3aGljaCBpcyBub3JtYWwuCgpOb3csIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSXQgdXNlcyBgZXh0NF9tYl9uZXdfYmxvY2tzYCB0byBhbGxvY2F0ZSBuZXcgYmxvY2tzLCB3aGljaCBpcyBhIGtleSBjaGFuZ2UuIFdlIG1lbXNldCB0aGUgYGFyYCBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGltcG9ydGFudCwgYW5kIGFsbG9jYXRlIGEgYnVmZmVyIGhlYWQgYGRhdGFfYmhgLiBUaGVuIHplcm8gdGhlIGJ1ZmZlciBoZWFkJiMzOTtzIGRhdGEgYGRhdGFfYmgtJmd0O2JfZGF0YWAgZXhwbGljaXRseSwgYWdhaW4sIGdvb2QuICBUaGUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gdGhlIGJsb2NrLCBhbmQgZmluYWxseSwgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBpcyBjYWxsZWQuCgpUaGUgY3JpdGljYWwgcXVlc3Rpb24gaGVyZSBpcyBhcm91bmQgdW5pbml0aWFsaXplZCBtZW1vcnkuIEluaXRpYWxpemluZyBgYXJgIHdpdGggYG1lbXNldGAsIHplcm9pbmcgYGRhdGFfYmgtJmd0O2JfZGF0YWAgYW5kIHRoZSBgaV9ibG9ja2AgYW5kIGBpX2RhdGFgIHdpdGggYG1lbXNldGAgc2VlbXMgcHJldHR5IHNvbGlkLiBUaGVuIHRoZXJlJiMzOTtzIHRoZSBgbmV3ZXhgIHN0cnVjdCwgd2hpY2ggaXMgcGFydGlhbGx5IGluaXRpYWxpemVkLCBgZWVfYmxvY2tgIGFuZCBgZWVfbGVuYCBhcmUgc2V0LiBCdXQgd2hhdCBhYm91dCB0aGUgb3RoZXIgZmllbGRzIG9mIGBzdHJ1Y3QgZXh0NF9leHRlbnRgPyBXZSBoYXZlIHRvIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIHRvIHNlZSBpZiB0aGVyZSYjMzk7cyBhbnkgcmlzayBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJZiBhbnkgb2YgdGhlIG90aGVyIGZpZWxkcyBhcmUgcmVhZCBiZWZvcmUgYmVpbmcgd3JpdHRlbiB0bywgdGhhdCAqY291bGQqIGJlIGEgS01TQU4gaXNzdWUsIHJpZ2h0PyBTbywgdGhpcyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gYmVmb3JlIHdlIGRlY2lkZSBpZiBhIGZ1enppbmcgc2Vzc2lvbiBpcyByZXF1aXJlZC4gSSBuZWVkIHRvIGxvb2sgYXQgdGhhdCBzdHJ1Y3QgZGVmaW5pdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3RydWN0IGV4dDRfZXh0ZW50IFxceyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTQ4PXN0cnVjdCBleHQ0X2V4dGVudF90YWlsIHtcbi0tXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTU1LSAqL1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDo1NjpzdHJ1Y3QgZXh0NF9leHRlbnQge1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC01Ny1cdF9fbGUzMlx0ZWVfYmxvY2s7XHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTU5NQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gRXh0ZW50cyBpbiBleHQ0KioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgZXh0ZW50cyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5LiBUaGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gc3RhcnQgaXMgdGhlIGhlYWRlciBmaWxlLCB3aGljaCB1c3VhbGx5IGRlZmluZXMgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4gSSYjMzk7bSBnb2luZyB0byBqdW1wIGludG8gYGZzL2V4dDQvZXh0NF9leHRlbnRzLmhgIGFuZCB0YWtlIGEgbG9vayBhcm91bmQgbGluZSA1Ni4gSSYjMzk7bSBob3BpbmcgdG8gZmluZCB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCB0byByZXByZXNlbnQgYW4gZXh0ZW50LCB3aGljaCB3aWxsIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlJiMzOTt2ZSBnb3QhIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSB0aGluZ3MgbGlrZSB0aGUgYGV4dDRfZXh0ZW50X2hlYWRlcmAsIGBleHQ0X2V4dGVudGAsIGFuZCBwb3NzaWJseSBzb21lIHJlbGF0ZWQgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgdGhlIGV4dGVudCB0cmVlLCBpZiB0aGV5JiMzOTtyZSB1c2luZyBvbmUuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBvbi1kaXNrIGZvcm1hdCBhbmQgaG93IHRoZSBsb2dpY2FsLXRvLXBoeXNpY2FsIG1hcHBpbmcgaXMgaGFuZGxlZC4gS25vd2luZyB0aGlzIHNob3VsZCBwcm92aWRlIGtleSBpbnNpZ2h0IGludG8gdW5kZXJzdGFuZGluZyBmaWxlIGFsbG9jYXRpb24gaW4gdGhpcyBmaWxlc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDUwOlx0fTtcbiAgNTE6XHRcbiAgNTI6XHQvKlxuICA1MzpcdCAqIFRoaXMgaXMgdGhlIGV4dGVudCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNTQ6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUuXG4gIDU1Olx0ICovXG4gIDU2Olx0c3RydWN0IGV4dDRfZXh0ZW50IHtcbiAgNTc6XHRcdF9fbGUzMlx0ZWVfYmxvY2s7XHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cbiAgNTg6XHRcdF9fbGUxNlx0ZWVfbGVuO1x0XHQvKiBudW1iZXIgb2YgYmxvY2tzIGNvdmVyZWQgYnkgZXh0ZW50ICovXG4gIDU5Olx0XHRfX2xlMTZcdGVlX3N0YXJ0X2hpO1x0LyogaGlnaCAxNiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXG4gIDYwOlx0XHRfX2xlMzJcdGVlX3N0YXJ0X2xvO1x0LyogbG93IDMyIGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cbiAgNjE6XHR9O1xuICA2MjpcdFxuICA2MzpcdC8qXG4gIDY0Olx0ICogVGhpcyBpcyBpbmRleCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNjU6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IGFsbCB0aGUgbGV2ZWxzIGV4Y2VwdCB0aGUgYm90dG9tLlxuICA2NjpcdCAqL1xuICA2NzpcdHN0cnVjdCBleHQ0X2V4dGVudF9pZHgge1xuICA2ODpcdFx0X19sZTMyXHRlaV9ibG9jaztcdC8qIGluZGV4IGNvdmVycyBsb2dpY2FsIGJsb2NrcyBmcm9tICYjMzk7YmxvY2smIzM5OyAqL1xuICA2OTpcdFx0X19sZTMyXHRlaV9sZWFmX2xvO1x0LyogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgYmxvY2sgb2YgdGhlIG5leHQgKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MjAxCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMTI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBFeHRlbnQgSW5pdGlhbGl6YXRpb24gaW4gRXh0NCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBjb2RlIGFuZCBpbW1lZGlhdGVseSBteSBmb2N1cyBpcyBkcmF3biB0byB0aGUgYHN0cnVjdCBleHQ0X2V4dGVudGAuIFJpZ2h0LCBJIHJlbWVtYmVyIHRoYXQgc3RydWN0dXJlOiBgZWVfYmxvY2tgLCBgZWVfbGVuYCwgYGVlX3N0YXJ0X2hpYCwgYGVlX3N0YXJ0X2xvYC4gQ2xhc3NpYy4gTm93LCB3aXRoaW4gdGhpcyBwYXRjaCwgSSBzZWUgdGhleSYjMzk7cmUgaW5pdGlhbGl6aW5nIGEgbmV3IGV4dGVudCwgYG5ld2V4YC4gVGhlIGNvZGUgc25pcHBldCBzaG93czoKCmBgYGMKCQlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7CgoJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CgkJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTsKCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJmFtcDtuZXdleCwgYmxvY2spOwpgYGAKClRoZSBmaXJzdCB0d28gaW5pdGlhbGl6YXRpb25zIGFyZSBzdHJhaWdodGZvcndhcmQ6IHNldHRpbmcgYGVlX2Jsb2NrYCB0byB6ZXJvIChsaWtlbHkgcmVwcmVzZW50aW5nIGFuIHVuYWxsb2NhdGVkIG9yIGVtcHR5IGJsb2NrKSBhbmQgYGVlX2xlbmAgdG8gYGxlbmAgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIFRoZSBjcml0aWNhbCBwYXJ0IGhlcmUgaXMgdGhpcyBjYWxsIHRvIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgLiBJIG5lZWQgdG8gZGlnIGludG8gdGhhdCBmdW5jdGlvbi4gQ2xlYXJseSwgdGhhdCYjMzk7cyB3aGVyZSB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGlzIGJlaW5nIHN0b3JlZCwgcHJvYmFibHkgc3ByZWFkaW5nIGl0IGFjcm9zcyB0aGUgYGVlX3N0YXJ0X2hpYCBhbmQgYGVlX3N0YXJ0X2xvYCBmaWVsZHMsIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUuIEkmIzM5O2xsIG5lZWQgdG8gdmVyaWZ5IHRoYXQgaXQgY29ycmVjdGx5IGhhbmRsZXMgdGhlIDY0LWJpdCBibG9jayBudW1iZXJzLiBJJiMzOTtsbCBnbyBjaGVjayB0aGF0IG5leHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZXh0X3N0b3JlX3BibG9jayYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTIzMj1zdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2lkeF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgpXG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDEtLypcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6MjQyOiAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQzLSAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsXG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDUtICovXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0NjpzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0Ny1cdFx0XHRcdFx0IGV4dDRfZnNibGtfdCBwYilcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTIyNz1zdGF0aWMgaW50IGV4dGVudHNfa3VuaXRfaW5pdChzdHJ1Y3Qga3VuaXQgKnRlc3QpXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy0zMTktXHRFWFRfRklSU1RfRVhURU5UKGVoKS1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihFWFRfREFUQV9MRU4pO1xuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzozMjA6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soRVhUX0ZJUlNUX0VYVEVOVChlaCksIEVYVF9EQVRBX1BCTEspO1xuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy0zMjEtXHRpZiAoIXBhcmFtIHx8IHBhcmFtLVx1MDAzZWlzX3Vud3JpdF9hdF9zdGFydClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMDg1LVx0XHRcdGV4LVx1MDAzZWVlX2Jsb2NrID0gbmV3ZXh0LVx1MDAzZWVlX2Jsb2NrO1xuZnMvZXh0NC9leHRlbnRzLmM6MjA4NjpcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIGV4dDRfZXh0X3BibG9jayhuZXdleHQpKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTIwODctXHRcdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjE5Ni1cdG5lYXJleC1cdTAwM2VlZV9ibG9jayA9IG5ld2V4dC1cdTAwM2VlZV9ibG9jaztcbmZzL2V4dDQvZXh0ZW50cy5jOjIxOTc6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2sobmVhcmV4LCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSk7XG5mcy9leHQ0L2V4dGVudHMuYy0yMTk4LVx0bmVhcmV4LVx1MDAzZWVlX2xlbiA9IG5ld2V4dC1cdTAwM2VlZV9sZW47XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MjYxND1leHQ0X2V4dF9ybV9sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjczOS1cdFx0XHQvKiB0aGlzIGV4dGVudCBpcyByZW1vdmVkOyBtYXJrIHNsb3QgZW50aXJlbHkgdW51c2VkICovXG5mcy9leHQ0L2V4dGVudHMuYzoyNzQwOlx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy0yNzQxLVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTMxOTE9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudF9hdChoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDYtXHRleDItXHUwMDNlZWVfbGVuICAgPSBjcHVfdG9fbGUxNihlZV9sZW4gLSAoc3BsaXQgLSBlZV9ibG9jaykpO1xuZnMvZXh0NC9leHRlbnRzLmM6MzI0NzpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleDIsIG5ld2Jsb2NrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDgtXHRpZiAoaXNfdW53cml0KVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTM1NTc9ZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTM2NDUtXHRcdFx0ZXgtXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihlZV9ibG9jayAmIzQzOyBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjM2NDY6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBlZV9wYmxrICYjNDM7IG1hcF9sZW4pO1xuZnMvZXh0NC9leHRlbnRzLmMtMzY0Ny1cdFx0XHRleC1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNjkxLVx0XHRcdGFidXRfZXgtXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihuZXh0X2xibGsgLSBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjM2OTI6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGFidXRfZXgsIG5leHRfcGJsayAtIG1hcF9sZW4pO1xuZnMvZXh0NC9leHRlbnRzLmMtMzY5My1cdFx0XHRleC1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ1LVx0XHRcdFx0Y3B1X3RvX2xlMTYoKmFsbG9jYXRlZCAtIHNwbGl0X21hcC5tX2xlbik7XG5mcy9leHQ0L2V4dGVudHMuYzozNzQ2Olx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZ6ZXJvX2V4MSxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NDctXHRcdFx0XHRleHQ0X2V4dF9wYmxvY2soZXgpICYjNDM7IHNwbGl0X21hcC5tX2xibGsgJiM0Mztcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNzYwLVx0XHRcdFx0XHRcdFx0ZWVfYmxvY2spO1xuZnMvZXh0NC9leHRlbnRzLmM6Mzc2MTpcdFx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZ6ZXJvX2V4MixcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NjItXHRcdFx0XHRcdFx0ICAgICAgZXh0NF9leHRfcGJsb2NrKGV4KSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTQ0NzMtXHRwYmxrID0gbmV3YmxvY2sgJiM0Mzsgb2Zmc2V0O1xuZnMvZXh0NC9leHRlbnRzLmM6NDQ3NDpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleCwgcGJsayk7XG5mcy9leHQ0L2V4dGVudHMuYy00NDc1LVx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYXIubGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NzYzPWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU4OTctXHRcdHRtcF9leCA9ICpleDE7XG5mcy9leHQ0L2V4dGVudHMuYzo1ODk4Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgxLCBleHQ0X2V4dF9wYmxvY2soZXgyKSk7XG5mcy9leHQ0L2V4dGVudHMuYzo1ODk5Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBleHQ0X2V4dF9wYmxvY2soXHUwMDI2dG1wX2V4KSk7XG5mcy9leHQ0L2V4dGVudHMuYy01OTAwLVx0XHRleDEtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZTJfbGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MDI3PWludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYwODAtXHRcdGV4dDRfZXh0X21hcmtfaW5pdGlhbGl6ZWQoZXgpO1xuZnMvZXh0NC9leHRlbnRzLmM6NjA4MTpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgcGJsayk7XG5mcy9leHQ0L2V4dGVudHMuYy02MDgyLVx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz05MzE9c3RhdGljIGludCBleHQ0X2ZjX3dyaXRlX2lub2RlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgdTMyICpjcmMpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2MS1cdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYocmFuZ2UtXHUwMDNlbGVuKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo5NjI6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgcmFuZ2UtXHUwMDNlcGJsayk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtOTYzLVx0XHRpZiAocmFuZ2UtXHUwMDNldW53cml0dGVuKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMDItXHRcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihjdXIpO1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIyMDM6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMDQtXHRcdFx0XHRcdTAwMjZuZXdleCwgc3RhcnRfcGJsayAmIzQzOyBjdXIgLSBzdGFydCk7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMTctXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XG5mcy9leHQ0L2lubGluZS5jOjExMTg6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleCwgYmxvY2spO1xuZnMvZXh0NC9pbmxpbmUuYy0xMTE5LVx0XHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTMzLVx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEpO1xuZnMvZXh0NC9taWdyYXRlLmM6MzQ6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXh0LCBsYi1cdTAwM2VmaXJzdF9wYmxvY2spO1xuZnMvZXh0NC9taWdyYXRlLmMtMzUtXHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MDUxCgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyBhbmQgdGhpbmtpbmcgYWJvdXQgdGhlIGNvZGU6CgoqKkRpdmluZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqCgpPa2F5LCB0aW1lIHRvIGdldCBhIGdvb2QgbG9vayBhdCBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYC4gTGV0JiMzOTtzIHB1bGwgdXAgdGhlIGRlZmluaXRpb24sIHJpZ2h0IGhlcmUgaW4gYGZzL2V4dDQvZXh0NF9leHRlbnRzLmhgLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBmdW5jdGlvbiBwbGF5cyB3aXRoIHRoZSBleHRlbnQgc3RydWN0dXJlIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBzb2xpZCBncmFzcCBvZiB0aGUgb3ZlcmFsbCBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCByZWxhdGVzIHRvIGJsb2NrIGFsbG9jYXRpb24sIHNvIGxldCYjMzk7cyBzZWUgaG93IHRoaXMgcGllY2UgZml0cyBpbi4gTXkgdW5kZXJzdGFuZGluZyBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gbGlrZWx5IGRlYWxzIHdpdGggdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciwgb3IgYHBibG9ja2AsIHdpdGhpbiBhIGdpdmVuIGV4dGVudCwgYnV0IGxldCYjMzk7cyBjb25maXJtIHRoYXQuIEkmIzM5O20gZ3Vlc3NpbmcgaXQgaGFuZGxlcyBzdG9yaW5nIG9yIHJldHJpZXZpbmcgdGhhdCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gSXQmIzM5O3MgbGlrZWx5IGludm9sdmVkIGluIHVwZGF0aW5nIGFuIGV4dGVudCYjMzk7cyBtZXRhZGF0YSB3aGVuIGEgZmlsZSBibG9jayBnZXRzIGFsbG9jYXRlZCBvciBkZWFsbG9jYXRlZCwgb3IgbWF5YmUgd2hlbiBoYW5kbGluZyBmaWxlIGV4dGVuc2lvbiBvciB0cnVuY2F0aW9uLiBMZXQmIzM5O3Mgc2VlIGhvdyBpdCBoYW5kbGVzIHRob3NlIGVkZ2UgY2FzZXMuIEkgaG9wZSB0aGUgaW5saW5lIGNvbW1lbnRzIGFyZSBnb29kLCB0aGF0IHdvdWxkIG1ha2UgdGhpcyBlYXNpZXIuIEFscmlnaHQsIGxldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSBleGFjdGx5IHdoYXQmIzM5O3MgaGFwcGVuaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNDIsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI0MjpcdCAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcbiAyNDM6XHQgKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBleHRlbnQgc3RydWN0LFxuIDI0NDpcdCAqIGJyZWFraW5nIGl0IGludG8gcGFydHNcbiAyNDU6XHQgKi9cbiAyNDY6XHRzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXG4gMjQ3Olx0XHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4gMjQ4Olx0e1xuIDI0OTpcdFx0ZXgtXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFx1MDAyNiAweGZmZmZmZmZmKSk7XG4gMjUwOlx0XHRleC1cdTAwM2VlZV9zdGFydF9oaSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBsb25nKSAoKHBiIFx1MDAzZVx1MDAzZSAzMSkgXHUwMDNlXHUwMDNlIDEpIFx1MDAyNlxuIDI1MTpcdFx0XHRcdFx0ICAgICAgMHhmZmZmKTtcbiAyNTI6XHR9XG4gMjUzOlx0XG4gMjU0Olx0LypcbiAyNTU6XHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XG4gMjU2Olx0ICogc3RvcmVzIGEgbGFyZ2UgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gYW4gaW5kZXggc3RydWN0LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjMzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNzgxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBEYXRhIEluaXRpYWxpemF0aW9uIGluIGV4dDQqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyBzb21lIHN0cnVjdHVyZXMgYXJlIGJlaW5nIGluaXRpYWxpemVkIGhlcmUsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBGaXJzdCwgSSBzZWUgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyBgZWVfc3RhcnRfbG9gIGFuZCBgZWVfc3RhcnRfaGlgIHdpdGhpbiB0aGUgYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAuIEJlZm9yZSB0aGF0LCBgZWVfYmxvY2tgIGFuZCBgZWVfbGVuYCBhcmUgc2V0LCBzbyBhbGwgZmllbGRzIG9mIGBuZXdleGAgYXJlIHNldDoKCmBgYGMKCQluZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApOwoJCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7CgkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKYGBgCgpJIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBzaXplIG9mIGBleHQ0X2V4dGVudGAuIEl0JiMzOTtzIGBlZV9ibG9ja2AgKDQgYnl0ZXMpLCBgZWVfbGVuYCAoMiBieXRlcyksIGBlZV9zdGFydF9oaWAgKDIgYnl0ZXMpLCBhbmQgYGVlX3N0YXJ0X2xvYCAoNCBieXRlcyksIHRvdGFsaW5nIDEyIGJ5dGVzLiBBbmQsIG5vIHBhZGRpbmcgaXMgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLCBzbyBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhcyBleHBlY3RlZC4KClRoZW4gSSBsb29rIGF0IGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgd2hpY2ggYXBwZWFycyB0byBiZSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQ6CgpgYGBjCglzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewoJCS5zID0geyAubm90X2ZvdW5kID0gMCwgfSwKCX07CmBgYAoKVGhlIGNvbXBpbGVyIHdpbGwgemVybyBvdXQgdGhlIHJlbWFpbmluZyBmaWVsZHMuIFNhbWUgZ29lcyBmb3IgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAsIHBhcnRpYWxseSBpbml0aWFsaXplZCBhbmQgdGhlIHJlc3Qgd2lsbCBiZSB6ZXJvZWQgb3V0LgoKYGBgYwoJc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpID0gewoJCS5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sCgkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAoJCS52YWx1ZSA9IE5VTEwsCgkJLnZhbHVlX2xlbiA9IDAsCgl9OwpgYGAKCmBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCwgdGhhdCYjMzk7cyBjbGVhciBlbm91Z2guCgpgYGBjCgltZW1zZXQoJmFtcDthciwgMCwgc2l6ZW9mKGFyKSk7CmBgYAoKTm93LCByZWdhcmRpbmcgYGJ1ZmAsIEkgc2VlIGl0JiMzOTtzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCwgYnV0IHdpdGhvdXQgYF9fR0ZQX1pFUk9gLiBUaGUgY29kZSB0aGVuIHJlYWRzIGlubGluZSBkYXRhIGludG8gYGJ1ZmA6CgpgYGBjCglpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTsKCWJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTsKCWVycm9yID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBidWYsICZhbXA7aW5saW5lX3NpemUsICZhbXA7aWxvYyk7CmBgYAoKSWYgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZmFpbHMsIGBidWZgIGdldHMgZnJlZWQuIElmIGl0IHN1Y2NlZWRzLCBgYnVmYCBjb250YWlucyB0aGUgaW5saW5lIGRhdGEuIEFmdGVyIHRoYXQsIGEgbmV3IGJsb2NrIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkIHVzaW5nIGBtZW1zZXRgLiBUaGUgY29udGVudHMgb2YgYGJ1ZmAgYXJlIHRoZW4gY29waWVkIGludG8gdGhhdCBuZXdseSBhbGxvY2F0ZWQgYmxvY2ssIGJ1dCBvbmx5IGlmIHRoZSBpbm9kZSBpc24mIzM5O3QgYSBkaXJlY3RvcnkuCgpgYGBjCgltZW1zZXQoZGF0YV9iaC0mZ3Q7Yl9kYXRhLCAwLCBpbm9kZS0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemUpOwoJaWYgKCFTX0lTRElSKGlub2RlLSZndDtpX21vZGUpKQoJCW1lbWNweShkYXRhX2JoLSZndDtiX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpOwpgYGAKClRoaXMgcmFpc2VzIHRoZSBxdWVzdGlvbjogSXMgYGJ1ZmAgKmd1YXJhbnRlZWQqIHRvIGJlIGZ1bGx5IGluaXRpYWxpemVkIGJ5IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgPyBJJiMzOTtsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayBob3cgdGhhdCBmdW5jdGlvbiB3b3JrcyB0byBiZSBjZXJ0YWluLiBUaGF0JiMzOTtzIHRoZSBrZXkgcXVlc3Rpb24gaGVyZSwgdGhhdCBmdW5jdGlvbiBpcyBjcml0aWNhbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9yZWFkX2lubGluZV9kYXRhJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmM9MTQ1PWludCBleHQ0X2ZpbmRfaW5saW5lX2RhdGFfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xODMtXG5mcy9leHQ0L2lubGluZS5jOjE4NDpzdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsXG5mcy9leHQ0L2lubGluZS5jLTE4NS1cdFx0XHRcdCB1bnNpZ25lZCBpbnQgbGVuLFxuLS1cbmZzL2V4dDQvaW5saW5lLmM9NTA0PXN0YXRpYyBpbnQgZXh0NF9yZWFkX2lubGluZV9mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNTM1LVx0a2FkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCAwKTtcbmZzL2V4dDQvaW5saW5lLmM6NTM2Olx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBrYWRkciwgbGVuLCBcdTAwMjZpbG9jKTtcbmZzL2V4dDQvaW5saW5lLmMtNTM3LVx0a2FkZHIgPSBmb2xpb196ZXJvX3RhaWwoZm9saW8sIGxlbiwga2FkZHIgJiM0MzsgbGVuKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMTU0LVxuZnMvZXh0NC9pbmxpbmUuYzoxMTU1Olx0ZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xMTU2LVx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTMwNT1pbnQgZXh0NF9pbmxpbmVkaXJfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMzQwLVxuZnMvZXh0NC9pbmxpbmUuYzoxMzQxOlx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBkaXJfYnVmLCBpbmxpbmVfc2l6ZSwgXHUwMDI2aWxvYyk7XG5mcy9leHQ0L2lubGluZS5jLTEzNDItXHR1cF9yZWFkKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNleGF0dHJfc2VtKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE0MjY9aW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTQ1OS1cbmZzL2V4dDQvaW5saW5lLmM6MTQ2MDpcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgZGlyX2J1ZiwgaW5saW5lX3NpemUsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNDYxLVx0dXBfcmVhZChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZXhhdHRyX3NlbSk7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xNTU3PXZvaWQgKmV4dDRfcmVhZF9pbmxpbmVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6MTU3MzpcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgbGluaywgaW5saW5lX3NpemUsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNTc0LVx0aWYgKHJldCBcdTAwM2MgMCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTkyMQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byBgZXh0NF9yZWFkX2lubGluZV9kYXRhYC4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBmdW5jdGlvbiBpdCBzZXJ2ZXMgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gYXJjaGl0ZWN0dXJlLiBJJiMzOTttIGltbWVkaWF0ZWx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGRldmlhdGVzIGZyb20gdGhlIHN0YW5kYXJkIGJsb2NrLWJhc2VkIHJlYWQgb3BlcmF0aW9ucy4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBoYW5kbGVzIGRhdGEgdGhhdCYjMzk7cyAqaW5saW5lKiB3aXRoaW4gdGhlIGlub2RlIGl0c2VsZiwgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBzZXBhcmF0ZSBkYXRhIGJsb2Nrcy4gVGhpcyBpbXBsaWVzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJlbmVmaXRzLCBhc3N1bWluZyB0aGUgZGF0YSBzaXplIGlzIGFwcHJvcHJpYXRlIGZvciBpbmxpbmUgc3RvcmFnZS4KCkkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHNldmVyYWwga2V5IHRoaW5nczogdGhlIGNvbmRpdGlvbnMgdGhhdCB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24gKGkuZS4sIHdoZW4gZG9lcyBleHQ0IGRlY2lkZSB0byB1c2UgaW5saW5lIGRhdGE/KSwgaG93IGl0IHZlcmlmaWVzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGlubGluZSBkYXRhIChjaGVja3N1bXMsIGxlbmd0aCBjaGVja3MsIGV0Yy4pLCB0aGUgbWVjaGFuaXNtcyB1c2VkIHRvIGNvcHkgdGhlIGRhdGEgb3V0IHRvIHRoZSByZXF1ZXN0aW5nIGJ1ZmZlciwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgb3B0aW1pemF0aW9ucyBzcGVjaWZpYyB0byBpbmxpbmUgcmVhZHMuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhlcmUgYXJlIHVzdWFsbHkgY29uc2lkZXJhdGlvbnMgcmVsYXRlZCB0byBwYXJ0aWFsIHJlYWRzIGFuZCBob3cgdGhleSBhcmUgaGFuZGxlZCwgYWxvbmcgd2l0aCBwb3RlbnRpYWwgYWxpZ25tZW50IGlzc3Vlcy4KCkkmIzM5O2xsIGFsc28ga2VlcCBhbiBleWUgb3V0IGZvciBwb3RlbnRpYWwgY29uY3VycmVuY3kgY29uY2VybnMuIElmIHRoaXMgZnVuY3Rpb24gaXMgaGVhdmlseSB1c2VkIGFuZCBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLCB0aGVyZSBtaWdodCBiZSBsb2NraW5nIG1lY2hhbmlzbXMgdG8gZW5zdXJlIGRhdGEgY29uc2lzdGVuY3kuCgpVbHRpbWF0ZWx5LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBwYXRoIG9mIGV4ZWN1dGlvbjogZnJvbSB0aGUgVkZTIGxheWVyIG1ha2luZyB0aGUgcmVhZCByZXF1ZXN0IGFsbCB0aGUgd2F5IGRvd24gdG8gaG93IHRoZSBpbmxpbmUgZGF0YSBpcyByZXRyaWV2ZWQgYW5kIHBhc3NlZCBiYWNrIHRvIHRoZSB1c2VyIHNwYWNlIGJ1ZmZlci4gSSYjMzk7bSBhc3N1bWluZyB0aGVyZSYjMzk7cyBsaWtlbHkgc29tZSBjbGV2ZXIgYml0IG1hbmlwdWxhdGlvbiBvciBkYXRhIHN0cnVjdHVyZSB1bmRlcnN0YW5kaW5nIGluIHBsYXkgaGVyZSB0byBtYWtlIHRoaXMgZWZmaWNpZW50LiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGNvZGUgcmV2ZWFscyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2lubGluZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxODA6XHRcdGJyZWxzZShpcy5pbG9jLmJoKTtcbiAxODE6XHRcdHJldHVybiBlcnJvcjtcbiAxODI6XHR9XG4gMTgzOlx0XG4gMTg0Olx0c3RhdGljIGludCBleHQ0X3JlYWRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqYnVmZmVyLFxuIDE4NTpcdFx0XHRcdFx0IHVuc2lnbmVkIGludCBsZW4sXG4gMTg2Olx0XHRcdFx0XHQgc3RydWN0IGV4dDRfaWxvYyAqaWxvYylcbiAxODc6XHR7XG4gMTg4Olx0XHRzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnk7XG4gMTg5Olx0XHRzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9oZWFkZXIgKmhlYWRlcjtcbiAxOTA6XHRcdGludCBjcF9sZW4gPSAwO1xuIDE5MTpcdFx0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtcbiAxOTI6XHRcbiAxOTM6XHRcdGlmICghbGVuKVxuIDE5NDpcdFx0XHRyZXR1cm4gMDtcbiAxOTU6XHRcbiAxOTY6XHRcdEJVR19PTihsZW4gXHUwMDNlIEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSk7XG4gMTk3Olx0XG4gMTk4Olx0XHRjcF9sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4gMTk5Olx0XG4gMjAwOlx0XHRyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZShpbG9jKTtcbiAyMDE6XHRcdG1lbWNweShidWZmZXIsICh2b2lkICopKHJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrKSwgY3BfbGVuKTtcbiAyMDI6XHRcbiAyMDM6XHRcdGxlbiAtPSBjcF9sZW47XG4gMjA0Olx0XHRidWZmZXIgJiM0Mzs9IGNwX2xlbjtcbiAyMDU6XHRcbiAyMDY6XHRcdGlmICghbGVuKVxuIDIwNzpcdFx0XHRnb3RvIG91dDtcbiAyMDg6XHRcbiAyMDk6XHRcdGhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7XG4gMjEwOlx0XHRlbnRyeSA9IChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqKSgodm9pZCAqKXJhd19pbm9kZSAmIzQzO1xuIDIxMTpcdFx0XHRcdFx0XHQgICAgRVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYpO1xuIDIxMjpcdFx0bGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sXG4gMjEzOlx0XHRcdCAgICAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZSkpO1xuIDIxNDpcdFxuIDIxNTpcdFx0bWVtY3B5KGJ1ZmZlcixcbiAyMTY6XHRcdCAgICAgICAodm9pZCAqKUlGSVJTVChoZWFkZXIpICYjNDM7IGxlMTZfdG9fY3B1KGVudHJ5LVx1MDAzZWVfdmFsdWVfb2ZmcyksIGxlbik7XG4gMjE3Olx0XHRjcF9sZW4gJiM0Mzs9IGxlbjtcbiAyMTg6XHRcbiAyMTk6XHRvdXQ6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyOTE5CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNTM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBhbmQgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFNvLCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBzdXBwb3NlZCB0byBjb3B5IGlubGluZSBkYXRhIGZyb20gYW4gaW5vZGUgaW50byBhIGJ1ZmZlci4gTXkgaW5pdGlhbCB1bmRlcnN0YW5kaW5nLCBiYXNlZCBvbiB0aGUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGNvZGUsIGlzIHRoYXQgaXQgY29waWVzIGV4YWN0bHkgYGlubGluZV9zaXplYCBieXRlcy4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBzaXplIG9mIHRoZSBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvY2AuCgpIb3dldmVyLCBsb29raW5nIGNsb3NlciwgdGhlcmUmIzM5O3MgYSBjcnVjaWFsIGRldGFpbC4gVGhlIGBsZW5gIHBhcmFtZXRlciBwYXNzZWQgdG8gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMsIGluIGZhY3QsIGBpbmxpbmVfc2l6ZWAuIFRoZSBmdW5jdGlvbiBjb3BpZXMgdXAgdG8gdGhlIHByb3ZpZGVkIGBsZW5gIGJ5dGVzLCBidXQgKkJVR19PTnMqIGlmIGBsZW5gIGV4Y2VlZHMgdGhlIGFjdHVhbCBpbmxpbmUgZGF0YSBzaXplLiBUaGlzIG1ha2VzIHNlbnNlLgoKVGhlbiBJIHNlZSB0aGlzIHNuaXBwZXQ6CgpgYGBjCmxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLAoJCSAgICAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LSZndDtlX3ZhbHVlX3NpemUpKTsKYGBgCgpBaGEhIGBsZW5gICh3aGljaCBzdGFydGVkIGFzIGBpbmxpbmVfc2l6ZWApIGlzIHBvdGVudGlhbGx5IHJlZHVjZWQgYnkgdGhlIHNpemUgb2YgdGhlICp2YWx1ZSogb2YgdGhlIGlubGluZSBkYXRhIGVudHJ5LiBUaGlzIHJlZHVjdGlvbiBvZiBgbGVuYCBpbnRyb2R1Y2VzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBmdW5jdGlvbiBkb2VzbiYjMzk7dCBjb3B5IHRoZSBmdWxsIGBpbmxpbmVfc2l6ZWAgYnl0ZXMuIEFuZCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB0aGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsIGFzIGBlcnJvcmAsIHdoaWNoIGlzIHRoZW4gbGF0ZXIgdXNlZCBhcyBzdWNoOgoKYGBgYwoJZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpOwoJaWYgKGVycm9yICZsdDsgMCkKCQlnb3RvIG91dDsKYGBgCgpIZXJlJiMzOTtzIHRoZSBwcm9ibGVtOiBUaGUgY29kZSAqZG9lc24mIzM5O3QqIGNoZWNrIGlmIGBlcnJvcmAgaXMgbGVzcyB0aGFuIGBpbmxpbmVfc2l6ZWAuIEl0IHByb2NlZWRzIHRvIGBtZW1jcHlgIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtJmd0O2JfZGF0YWAgdXNpbmcgYGlubGluZV9zaXplYCBhcyB0aGUgY29weSBzaXplLiBJZiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBjb3BpZWQgZmV3ZXIgdGhhbiBgaW5saW5lX3NpemVgIGJ5dGVzLCB0aGVuIHRoZSBgYnVmYCBidWZmZXIgd2lsbCBjb250YWluIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgYGttYWxsb2NgIGFsbG9jYXRpb24uIFRob3NlIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgd2lsbCB0aGVuIGJlIGNvcGllZCBpbnRvIGBkYXRhX2JoLSZndDtiX2RhdGFgLiBUaGlzIGNvdWxkIGxlYWQgdG8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBzaW5jZSB0aGVzZSB1bmluaXRpYWxpemVkIGJ5dGVzIGFyZSBlZmZlY3RpdmVseSBkYXRhIGxlYWthZ2UgZnJvbSBtZW1vcnkuIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvcGllcyBsZXNzIHRoYW4gdGhlIGBpbmxpbmVfc2l6ZWAsIGluIHRoZSBjYWxsZXJzLiBJIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBhY3R1YWwgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgY29kZSBhbmQgaG93IGBlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplYCBpcyBkZXRlcm1pbmVkLiBJdCYjMzk7cyB0aW1lIHRvIHRlc3QgYW5kIHJlcHJvZHVjZSB0aGUgaXNzdWUgYW5kIHRoZW4gcGF0Y2ggdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9nZXRfaW5saW5lX3NpemUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYz0yNT1zdGF0aWMgaW50IGV4dDRfZGFfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0yOC1cbmZzL2V4dDQvaW5saW5lLmM6Mjk6c3RhdGljIGludCBleHQ0X2dldF9pbmxpbmVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9pbmxpbmUuYy0zMC17XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz01MDQ9c3RhdGljIGludCBleHQ0X3JlYWRfaW5saW5lX2ZvbGlvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy01MjQtXG5mcy9leHQ0L2lubGluZS5jOjUyNTpcdGxlbiA9IG1pbl90KHNpemVfdCwgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpLCBpX3NpemVfcmVhZChpbm9kZSkpO1xuZnMvZXh0NC9pbmxpbmUuYy01MjYtXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz01NzM9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNjIzLVx0ZnJvbSA9IDA7XG5mcy9leHQ0L2lubGluZS5jOjYyNDpcdHRvID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy02MjUtXHRpZiAoIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pKSB7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz04ODY9c3RhdGljIGludCBleHQ0X2RhX2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtOTAzLVxuZnMvZXh0NC9pbmxpbmUuYzo5MDQ6XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtOTA1LVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTEzNz1zdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExNDctXG5mcy9leHQ0L2lubGluZS5jOjExNDg6XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtMTE0OS1cdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTEzMDU9aW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTMzMi1cbmZzL2V4dDQvaW5saW5lLmM6MTMzMzpcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy0xMzM0LVx0ZGlyX2J1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE0MjY9aW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTQ1MS1cbmZzL2V4dDQvaW5saW5lLmM6MTQ1MjpcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNDUzLVx0ZGlyX2J1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE1NTc9dm9pZCAqZXh0NF9yZWFkX2lubGluZV9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNTY3LVx0cmV0ID0gLUVOT01FTTtcbmZzL2V4dDQvaW5saW5lLmM6MTU2ODpcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNTY5LVx0bGluayA9IGttYWxsb2MoaW5saW5lX3NpemUgJiM0MzsgMSwgR0ZQX05PRlMpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTYzOT1zdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfZmluZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNjc5LVxuZnMvZXh0NC9pbmxpbmUuYzoxNjgwOlx0aWYgKGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcikgPT0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSlcbmZzL2V4dDQvaW5saW5lLmMtMTY4MS1cdFx0Z290byBvdXQ7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNjgzLVx0aW5saW5lX3N0YXJ0ID0gZXh0NF9nZXRfaW5saW5lX3hhdHRyX3BvcyhkaXIsIFx1MDAyNmlzLmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYzoxNjg0Olx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShkaXIpIC0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbmZzL2V4dDQvaW5saW5lLmMtMTY4NS1cbi0tXG5mcy9leHQ0L2lubGluZS5jPTE3MDI9aW50IGV4dDRfZGVsZXRlX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTcyOS1cdFx0aW5saW5lX3N0YXJ0ID0gZXh0NF9nZXRfaW5saW5lX3hhdHRyX3BvcyhkaXIsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYzoxNzMwOlx0XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcikgLVxuZnMvZXh0NC9pbmxpbmUuYy0xNzMxLVx0XHRcdFx0RVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE3NjA9ZXh0NF9nZXRfaW5saW5lX2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNzY3LVxuZnMvZXh0NC9pbmxpbmUuYzoxNzY4Olx0QlVHX09OKG9mZnNldCBcdTAwM2UgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpKTtcbmZzL2V4dDQvaW5saW5lLmMtMTc2OS1cbi0tXG5mcy9leHQ0L2lubGluZS5jLTE3NzUtXHRcdG9mZnNldCAtPSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xuZnMvZXh0NC9pbmxpbmUuYzoxNzc2Olx0XHQqaW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSkgLVxuZnMvZXh0NC9pbmxpbmUuYy0xNzc3LVx0XHRcdFx0RVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE3ODU9Ym9vbCBlbXB0eV9pbmxpbmVfZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgKmhhc19pbmxpbmVfZGF0YSlcbi0tXG5mcy9leHQ0L2lubGluZS5jLTE4MTctXG5mcy9leHQ0L2lubGluZS5jOjE4MTg6XHRpbmxpbmVfbGVuID0gZXh0NF9nZXRfaW5saW5lX3NpemUoZGlyKTtcbmZzL2V4dDQvaW5saW5lLmMtMTgxOS1cdG9mZnNldCA9IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg1OT1pbnQgZXh0NF9pbmxpbmVfZGF0YV9pb21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW9tYXAgKmlvbWFwKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTg4MC1cdGlvbWFwLVx1MDAzZW9mZnNldCA9IDA7XG5mcy9leHQ0L2lubGluZS5jOjE4ODE6XHRpb21hcC1cdTAwM2VsZW5ndGggPSBtaW5fdChsb2ZmX3QsIGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKSxcbmZzL2V4dDQvaW5saW5lLmMtMTg4Mi1cdFx0XHQgICAgICBpX3NpemVfcmVhZChpbm9kZSkpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xOTI2LVx0aV9zaXplID0gaW5vZGUtXHUwMDNlaV9zaXplO1xuZnMvZXh0NC9pbmxpbmUuYzoxOTI3Olx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTE5MjgtXHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpX3NpemU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1ODY2CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYGV4dDRfZ2V0X2lubGluZV9zaXplYCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgZXh0NF9nZXRfaW5saW5lX3NpemVgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBmb2N1c2VzIG9uIGl0cyBwdXJwb3NlOiBjbGVhcmx5LCB0aGlzIHJvdXRpbmUgaXMgZGVzaWduZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGRhdGEgdGhhdCBjYW4gYmUgaW5saW5lZCB3aXRoaW4gYW4gZXh0NCBpbm9kZSBpdHNlbGYuIEkgbmVlZCB0byBpbW1lZGlhdGVseSB1bmRlcnN0YW5kIHdoYXQgaW5wdXRzIGl0IHRha2VzLiBMaWtlbHksIHRoZXJlIHdpbGwgYmUgYXJndW1lbnRzIHBlcnRhaW5pbmcgdG8gdGhlIGlub2RlIGl0c2VsZiwgYW5kIHBlcmhhcHMgc29tZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGZpbGVzeXN0ZW3igJlzIGJsb2NrIHNpemUgb3IgZmVhdHVyZXMgZW5hYmxlZC4gTXkgbmV4dCBsaW5lIG9mIHRob3VnaHQgY29uY2VybnMgd2hhdCBhc3BlY3RzIG9mIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgYXJlIHJlbGV2YW50IHRvIGRldGVybWluaW5nIHRoZSBpbmxpbmUgc2l6ZSBsaW1pdDsgSSBpbW1lZGlhdGVseSB0aGluayBvZiB0aGUgZmlsZSYjMzk7cyB0eXBlLCB0aGUgaW5vZGUgZmxhZ3MgKGVzcGVjaWFsbHkgdGhvc2UgdGhhdCBtaWdodCBhZmZlY3QgdGhlIGxheW91dCksIGFuZCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgdGhpcyBpbm9kZS4gVGhlIHJldHVybiB2YWx1ZSwgb2J2aW91c2x5LCB3aWxsIGJlIHRoZSBzaXplIG9mIGRhdGEsIGluIGJ5dGVzLCB0aGF0IGlzIGxlZ2FsbHkgYWxsb3dlZCB0byBiZSBkaXJlY3RseSBzdG9yZWQgaW4gdGhlIGlub2RlLiBJIHdpbGwgZm9jdXMgb24gdW5kZXJzdGFuZGluZyB0aGUgKmxvZ2ljKiBvZiB0aGUgY2FsY3VsYXRpb24uIEkgd2lsbCBjaGVjayBmb3IgY29ybmVyIGNhc2VzIGFuZCBlcnJvciBjb25kaXRpb25zLiBJIHdhbnQgdG8ga25vdyB3aGVuIGl0IHNheXMg4oCcbm8gaW5saW5lIHNpemXigJ0gYW5kIHdoYXQgaXRzIG1lYW5pbmcgaXMuIEkmIzM5O20gZ29pbmcgdG8gbG9vayBmb3IgYW55IHJlZmVyZW5jZXMgdG8gYmxvY2sgZ3JvdXAgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBvciBvdGhlciBvbi1kaXNrIG1ldGFkYXRhIHRoYXQgbWlnaHQgaW5mbHVlbmNlIHRoZSBzaXplIGxpbWl0cy4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgcG9zc2libGUgdnVsbmVyYWJpbGl0aWVzLCBzdWNoIGFzIGludGVnZXIgb3ZlcmZsb3dzLCB0aGF0IGNvdWxkIGFsbG93IGV4Y2VlZGluZyB0aGUgaW50ZW5kZWQgc2l6ZSBsaW1pdCBvciB0aGF0IG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLiBGdXJ0aGVybW9yZSwgSSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgZGlmZmVyZW50IGV4dDQgZmVhdHVyZSBmbGFncyBjb3JyZWN0bHkgKGUuZy4gZXh0ZW50IHZzIGluZGlyZWN0IGJsb2NrIGhhbmRsaW5nKS4gRmluYWxseSwgSSB3aWxsIHZlcmlmeSBob3cgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhIGltcGFjdHMgdGhlIGJsb2NrIGFsbG9jYXRpb24gc3RyYXRlZ3kgd2hlbiB0aGUgZGF0YSBpcyBiaWdnZXIgdGhhbiBpbmxpbmUgbGltaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMjk6XHRzdGF0aWMgaW50IGV4dDRfZ2V0X2lubGluZV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gIDMwOlx0e1xuICAzMTpcdFx0aWYgKEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfb2ZmKVxuICAzMjpcdFx0XHRyZXR1cm4gRVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9zaXplO1xuICAzMzpcdFxuICAzNDpcdFx0cmV0dXJuIDA7XG4gIDM1Olx0fVxuICAzNjpcdFxuICAzNzpcdHN0YXRpYyBpbnQgZ2V0X21heF9pbmxpbmVfeGF0dHJfdmFsdWVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuICAzODpcdFx0XHRcdFx0XHQgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjQyOAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDgzOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipWdWxuZXJhYmlsaXR5IERldGVjdGVkOiBVbmluaXRpYWxpemVkIE1lbW9yeSBMZWFrIGluIGV4dDQgSW5saW5lIERhdGEgQ29udmVyc2lvbioqCgpPa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBgZXh0NF9nZXRfaW5saW5lX3NpemVgIGp1c3QgZ3JhYnMgYEVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX3NpemVgLCB0aGF0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZC4gTm93LCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBJIHNlZSBhIGBCVUdfT05gIGNoZWNrIGVuc3VyaW5nIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIChgbGVuYCkgZG9lc24mIzM5O3QgZXhjZWVkIGBpX2lubGluZV9zaXplYCwgd2hpY2ggaXMgZ29vZC4gVGhlbiB0aGVyZSYjMzk7cyB0aGlzIGBjcF9sZW5gIGNhbGN1bGF0aW9uLCBpbml0aWFsbHkgbGltaXRlZCBieSBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWAuIFRoZSBpbml0aWFsIGRhdGEgaXMgY29waWVkIHVzaW5nIGBtZW1jcHlgLgoKVGhlIGNydWNpYWwgYml0LCB0aG91Z2gsIGlzIHRoZSBjb25kaXRpb25hbC4gVGhlIGNvZGUgY2FsY3VsYXRlcyBhIHJlbWFpbmluZyBsZW5ndGggKGBsZW5gKSBhbmQgdGhlbiwgd2l0aGluIHRoZSBgaWYgKCFsZW4pYCBjaGVjaywgdGhlIGtleSBsaW5lIGlzIGBsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgKHVuc2lnbmVkIGludClsZTMyX3RvX2NwdShlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplKSk7YC4gSWYgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluaW5nIGBsZW5gLCB0aGVuIGBsZW5gIGdldHMgcmVkdWNlZC4gQW5kIHRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgYGNwX2xlbiAmIzQzOyBsZW5gLCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gdGhlIGluaXRpYWwgYGlubGluZV9zaXplYC4KClRoaXMgaXMgd2hlcmUgdGhlIHByb2JsZW0gYXJpc2VzLiBXaGVuIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBjYWxscyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgaXQgb25seSBjaGVja3MgZm9yIG5lZ2F0aXZlIHJldHVybiB2YWx1ZXMsIGJ1dCBkb2VzbiYjMzk7dCBjaGVjayBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byB0aGUgaW5pdGlhbGx5IHJlcXVlc3RlZCBzaXplIChgaW5saW5lX3NpemVgKS4gVGhlbiwgaXQgcHJvY2VlZHMgdG8gY29weSBgaW5saW5lX3NpemVgIGJ5dGVzIGZyb20gYSBidWZmZXIgYGJ1ZmAgdG8gdGhlIGJsb2NrJiMzOTtzIGJ1ZmZlciBoZWFkIGBkYXRhX2JoLSZndDtiX2RhdGFgICp3aXRob3V0IGNoZWNraW5nIHRoZSByZXR1cm4gdmFsdWUqLgoKSGVyZSYjMzk7cyB0aGUga2lja2VyOiBgYnVmYCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgY29udGVudHMgb2YgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAsIHdoaWNoIGNvdWxkIGJlIHNtYWxsZXIgdGhhbiBgaW5saW5lX3NpemVgLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBiZWluZyB3cml0dGVuIHRvIGBidWZgLiBCZWNhdXNlIHRoZXJlIGlzIG5vIGNoZWNrIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBlbnN1cmUgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMgZXF1aXZhbGVudCB0byB0aGUgYGlubGluZV9zaXplYCwgdGhlIHN1YnNlcXVlbnQgYG1lbWNweWAgY291bGQgYmUgd3JpdGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSAoZnJvbSBga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpYCkgaW50byBgZGF0YV9iaC0mZ3Q7Yl9kYXRhYC4gYGRhdGFfYmgtJmd0O2JfZGF0YWAgaXMgdGhlbiB3cml0dGVuIHRvIGRpc2shCgpUaGlzIG1lYW5zIHVuaW5pdGlhbGl6ZWQga2VybmVsIGhlYXAgbWVtb3J5IGlzIHdyaXR0ZW4gdG8gZGlzaywgd2hpY2ggaXMgYSB0ZXh0Ym9vayBpbmZvcm1hdGlvbiBsZWFrISBUaGF0JiMzOTtzIGEgc2VyaW91cyBzZWN1cml0eSBmbGF3LiBUaGUgYXR0YWNrIHZlY3RvciBjb3VsZCBiZSByZWFkaW5nIHRoZSBkaXNrIGNvbnRlbnRzIGFmdGVyIGEgZmlsZSB3aXRoIGlubGluZSBkYXRhIGhhcyBiZWVuIGNvbnZlcnRlZC4KCldhaXQgYSBzZWNvbmTigKYgaXMgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgICphbHdheXMqIGVxdWFsIHRvIGBFWFQ0X0koaW5vZGUpLSZndDtpX2lubGluZV9zaXplIC0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWA/IElmIGl0IGlzLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgd291bGQgYWx3YXlzIG1hdGNoIGBpbmxpbmVfc2l6ZWAsIGFuZCB0aGUgbGVhayB3b3VsZCBub3Qgb2NjdXIuIEkgbmVlZCB0byB2ZXJpZnkgaG93IGBpX2lubGluZV9zaXplYCBpcyBzZXQgdG8gZW5zdXJlIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lfaW5saW5lX3NpemUgPSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2lubGluZS5jPTE0NT1pbnQgZXh0NF9maW5kX2lubGluZV9kYXRhX25vbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTc1LVx0XHRcdFx0XHQodm9pZCAqKWV4dDRfcmF3X2lub2RlKFx1MDAyNmlzLmlsb2MpKTtcbmZzL2V4dDQvaW5saW5lLmM6MTc2Olx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFICYjNDM7XG5mcy9leHQ0L2lubGluZS5jLTE3Ny1cdFx0XHRcdGxlMzJfdG9fY3B1KGlzLnMuaGVyZS1cdTAwM2VlX3ZhbHVlX3NpemUpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MjY4PXN0YXRpYyBpbnQgZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTMyNS1cdFx0XHRcdCAgICAgICh2b2lkICopZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYykpO1xuZnMvZXh0NC9pbmxpbmUuYzozMjY6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBsZW4gJiM0MzsgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbmZzL2V4dDQvaW5saW5lLmMtMzI3LVx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MzM3PXN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTM5NS1cdFx0XHRcdCAgICAgICh2b2lkICopZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYykpO1xuZnMvZXh0NC9pbmxpbmUuYzozOTY6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFICYjNDM7XG5mcy9leHQ0L2lubGluZS5jLTM5Ny1cdFx0XHRcdGxlMzJfdG9fY3B1KGlzLnMuaGVyZS1cdTAwM2VlX3ZhbHVlX3NpemUpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9NDM3PXN0YXRpYyBpbnQgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNDkzLVx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuZnMvZXh0NC9pbmxpbmUuYzo0OTQ6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xuZnMvZXh0NC9pbmxpbmUuYy00OTUtXHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMjYtXHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX29mZiA9IDA7XG5mcy9leHQ0L2lubGluZS5jOjExMjc6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xuZnMvZXh0NC9pbmxpbmUuYy0xMTI4LVx0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xOTc4LVxuZnMvZXh0NC9pbmxpbmUuYzoxOTc5Olx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBpX3NpemUgXHUwMDNjXG5mcy9leHQ0L2lubGluZS5jLTE5ODAtXHRcdFx0XHRcdEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUgP1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODc3NwoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDE3MzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIElubGluZSBEYXRhIENvbnZlcnNpb24gYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93biBzdGVwIGJ5IHN0ZXAuIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGV4dDRfZmluZF9pbmxpbmVfZGF0YV9ub2xvY2tgIGZ1bmN0aW9uIGFuZCBob3cgaXQgY2FsY3VsYXRlcyBgaV9pbmxpbmVfc2l6ZWAuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBpdCYjMzk7cyBjYWxjdWxhdGVkIHByZWNpc2VseSBhcyBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWAgcGx1cyB0aGUgdmFsdWUgb2YgYGVfdmFsdWVfc2l6ZWAuIFRoaXMgYGVfdmFsdWVfc2l6ZWAgY29tZXMgaW50byBwbGF5IGFnYWluIGluIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgLiBIZXJlLCBpZiB0aGUgY2FsY3VsYXRlZCBgaW5saW5lX3NpemVgIGlzIGJpZ2dlciB0aGFuIGBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFYCwgdGhlIGNvZGUgaXMgZGVzaWduZWQgdG8gY29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSB2YWx1ZSBwb2ludGVkIGF0IGJ5IGBlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplYC4gIFRoZSBzdWJzZXF1ZW50IGBtaW5fdGAgY2FsbCB3b24mIzM5O3QgcmVkdWNlIGBsZW5gIHNvIGVmZmVjdGl2ZWx5IGl0IGlzIGRvaW5nIGEgZnVsbCBjb3B5IG9mIGV4YWN0bHkgYGlubGluZV9zaXplYCBieXRlcy4gVGhlIHF1ZXN0aW9uIGFyaXNlczogaXMgdGhlcmUgYSByaXNrIG9mIHJlYWRpbmcgYmV5b25kIHdoYXQmIzM5O3MgaW50ZW5kZWQ/CgpJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBwb3RlbnRpYWwgZm9yIG9uLWRpc2sgY29ycnVwdGlvbiwgd2hlcmUgYGlzLnMuaGVyZS0mZ3Q7ZV92YWx1ZV9zaXplYCBtaWdodCBiZSBjb3JydXB0ZWQuIElmIHRoaXMgdmFsdWUgaXMgY29ycnVwdGVkIHRvIGJlIGxhcmdlLCB0aGUgYGlfaW5saW5lX3NpemVgIG1pZ2h0IGJlIGxhcmdlLiBCdXQgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgb25seSByZWFkcyB0aGUgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgLiBCZWNhdXNlIGBpcy5zLmhlcmVgIGluIGBleHQ0X2ZpbmRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyB0aGUgc2FtZSBhcyB0aGUgYGVudHJ5YCBpbiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgdGhlIHZhbHVlcyBhcmUgbGlua2VkLiBIb3dldmVyLCB0aGVyZSYjMzk7cyBhbHNvIHRoZSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBwb3NzaWJpbGl0eS4gSWYgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgIGlzIG1vZGlmaWVkIGNvbmN1cnJlbnRseSwgb3IgaWYgYGlfaW5saW5lX3NpemVgIGlzIGNhbGN1bGF0ZWQsIGttYWxsb2MgaXMgY2FsbGVkLCBhbmQgdGhlbiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBjb3BpZXMgYGlubGluZV9zaXplYCBieXRlcywgaXMgdGhlcmUgYSByYWNlIGNvbmRpdGlvbj8gSXMgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIHBvaW50ZWQgdG8gYnkgYGlubGluZV9zaXplYD8gIElmIHRoZSBvcmlnaW5hbCBgbGVuYCB0byBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBgaW5saW5lX3NpemVgIGFuZCAgYGlfaW5saW5lX3NpemVgIGlzIGJhc2VkIG9uICBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSAmIzQzOyBsZTMyX3RvX2NwdShlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplKWAsIHRoZW4sIEkgdGhpbmssIGl0JiMzOTtzIGNvcHlpbmcgYGlubGluZV9zaXplYCBieXRlcyBhbmQgdGhlIGJ1ZmZlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkLgoKTW92aW5nIHRvIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgZnVuY3Rpb24sIEkgc2VlIHRoYXQgYGlubGluZV9zaXplYCBpcyBjYWxjdWxhdGVkIGFuZCB1c2VkIHRvIGBrbWFsbG9jYCBhIGJ1ZmZlci4gVGhlIG9yaWdpbmFsIGNvZGUgd2FzIHVzaW5nIGEgcG9pbnRlciB0byBgaW5saW5lX3NpemVgIGluIHRoZSBjYWxsIHRvIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIHdoaWNoIEkmIzM5O3ZlIGp1c3QgZGV0ZXJtaW5lZCBpc24mIzM5O3QgdGhlIGNhc2UgYW5kIG5vdyB0YWtlcyBgaW5saW5lX3NpemVgIGJ5IHZhbHVlLiBTbywgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMgdGFraW5nIHRoZSBsZW5ndGggYnkgdmFsdWUsIHNvIHRoZSB2YWx1ZSBpcyBub3QgYmVpbmcgbW9kaWZpZWQuCgpOb3csIGxldCYjMzk7cyBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYuIFRoZSBwYXRjaCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEluIHRoZSBvcmlnaW5hbCBhcHByb2FjaCwgdGhlIGlubGluZSBkYXRhIHdhcyBmaXJzdCBkZXN0cm95ZWQgd2l0aCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIGFuZCB0aGVuIGEgYmxvY2sgd2FzIGFsbG9jYXRlZC4gSWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCB0aGUgaW5saW5lIGRhdGEgd2FzIHJlc3RvcmVkLiBUaGUgdXBkYXRlZCBjb2RlLCBob3dldmVyLCBhbGxvY2F0ZXMgYSBibG9jayB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgLiBUaGVuIGl0IGxvY2tzLCB6ZXJvcyBhbmQgY29waWVzIGludG8gdGhlIGJ1ZmZlci4gVGhlbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGlzIGNhbGxlZCB3aGljaCByZXBsYWNlcyB0aGUgaW5saW5lIGRhdGEgd2l0aCB0aGUgbmV3IGJsb2NrIGluIHRoZSBpbm9kZS4gTm93LCBpZiBhbnl0aGluZyBmYWlscyBiZWZvcmUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgdGhlIG5ldyBibG9jayBpcyBqdXN0IGZyZWVkLgoKTXkgbWFpbiBjb25jZXJuIG5vdyBpcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gSXMgaXQgcG9zc2libGUgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlIHRvIG9jY3VyPyBJJiMzOTttIGNoZWNraW5nIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2A6IEkgc2VlIGl0IHplcm9lcyB0aGUgaW5saW5lIGRhdGEgYXJlYSB3aXRoIGBtZW1zZXRgLCBib3RoIGluIHRoZSBpbm9kZSBpdHNlbGYgYW5kIHRoZSBidWZmZXIuIFRoZXJlJiMzOTtzIHRoZW4gYSBjaGVjayBmb3IgZXh0ZW50cy4gIEZvciBkaXJlY3RvcnksIHJlZ3VsYXIgb3Igc3ltbGluayBpbm9kZXMsIGBleHQ0X2V4dF90cmVlX2luaXRgIGlzIGNhbGxlZCwgYW5kIGl0JiMzOTtzIGluc2VydGluZyBleHRlbnRzLgoKTXkgbWFpbiBxdWVzdGlvbiBpczogZG9lcyBgZXh0NF9leHRfdHJlZV9pbml0YCBwb3RlbnRpYWxseSB3cml0ZSB0byBgaV9kYXRhYCwgb3ZlcndyaXRpbmcgdGhlIGBtZW1zZXRgPyBUaGlzIHdvdWxkIGJlIHRoZSBtb3N0IGxpa2VseSBzb3VyY2Ugb2YgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUuIEkgbmVlZCB0byBzdHVkeSBob3cgYGV4dDRfZXh0X3RyZWVfaW5pdGAgYW5kIHRoZSBleHRlbnQgaW5zZXJ0aW9uIHdvcmsgdG8gYmUgY29tcGxldGVseSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2V4dF90cmVlX2luaXQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0Lmg9Mzg2Mz1zdHJ1Y3QgZXh0NF9leHRlbnQ7XG4tLVxuZnMvZXh0NC9leHQ0LmgtMzg3MC1cbmZzL2V4dDQvZXh0NC5oOjM4NzE6ZXh0ZXJuIHZvaWQgZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuZnMvZXh0NC9leHQ0LmgtMzg3Mi1leHRlcm4gaW50IGV4dDRfZXh0X2luZGV4X3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZXh0ZW50cyk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9ODE1PWV4dDRfZXh0X2JpbnNlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTg3MS1cbmZzL2V4dDQvZXh0ZW50cy5jOjg3Mjp2b2lkIGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9leHRlbnRzLmMtODczLXtcbi0tXG5mcy9leHQ0L2lhbGxvYy5jPTkzMz1zdHJ1Y3QgaW5vZGUgKl9fZXh0NF9uZXdfaW5vZGUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsXG4tLVxuZnMvZXh0NC9pYWxsb2MuYy0xMzQwLVx0XHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG5mcy9leHQ0L2lhbGxvYy5jOjEzNDE6XHRcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpO1xuZnMvZXh0NC9pYWxsb2MuYy0xMzQyLVx0XHR9XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz00Mzc9c3RhdGljIGludCBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy00ODQtXHRcdFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbmZzL2V4dDQvaW5saW5lLmM6NDg1Olx0XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNDg2LVx0XHR9XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMTEtXHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG5mcy9leHQ0L2lubGluZS5jOjExMTI6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtMTExMy1cdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcbi0tXG5mcy9leHQ0L2lvY3RsLmM9Mzc1PXN0YXRpYyBsb25nIHN3YXBfaW5vZGVfYm9vdF9sb2FkZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbi0tXG5mcy9leHQ0L2lvY3RsLmMtNDUwLVx0XHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGVfYmwsIEVYVDRfSU5PREVfRVhURU5UUyk7XG5mcy9leHQ0L2lvY3RsLmM6NDUxOlx0XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlX2JsKTtcbmZzL2V4dDQvaW9jdGwuYy00NTItXHRcdH0gZWxzZVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTQxMD1pbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTQ4My1cbmZzL2V4dDQvbWlncmF0ZS5jOjQ4NDpcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG5mcy9leHQ0L21pZ3JhdGUuYy00ODUtXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTU2Ny1cbmZzL2V4dDQvbWlncmF0ZS5jOjU2ODpcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xuZnMvZXh0NC9taWdyYXRlLmMtNTY5LVx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgMSwgMCk7XG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNTg4LVx0LyogUmVzZXQgdGhlIGV4dGVudCBkZXRhaWxzICovXG5mcy9leHQ0L21pZ3JhdGUuYzo1ODk6XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCB0bXBfaW5vZGUpO1xuZnMvZXh0NC9taWdyYXRlLmMtNTkwLW91dF9zdG9wOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjQ5MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHdoYXQmIzM5O3MgZ29pbmcgb24sIHdyaXR0ZW4gYXMgdGhvdWdoIGl0JiMzOTtzIG15IG93biB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIGV4dDRfZXh0X3RyZWVfaW5pdCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGlzc2VjdCBgZXh0NF9leHRfdHJlZV9pbml0YC4gVGhlIG5hbWUgaXRzZWxmIGhpbnRzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlIG9mIHRoZSBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgd2l0aGluIGFuIGV4dDQgZmlsZXN5c3RlbS4gSSYjMzk7bSBhbHJlYWR5IGZhbWlsaWFyIHdpdGggdGhlIGNvbmNlcHQgb2YgZXh0ZW50IHRyZWVzLCBJIHVuZGVyc3RhbmQgdGhhdCB0aGV5IGFyZSB0aGUgYmFzaXMgZm9yIHN0b3JpbmcgZmlsZSBibG9ja3MgaW4gYSB3YXkgdGhhdCBtaW5pbWl6ZXMgZnJhZ21lbnRhdGlvbiBhbmQgbWF4aW1pemVzIHRoZSBlZmZpY2llbnQgdXNlIG9mIGRpc2sgc3BhY2UsIGNvbXBhcmVkIHRvIHRoZSBvbGRlciBibG9jay1iYXNlZCBpbm9kZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB0aGUgY3J1Y2lhbCBmaXJzdCBzdGVwIGluIHByZXBhcmluZyBhIGZpbGUmIzM5O3MgbWV0YWRhdGEgZm9yIGV4dGVudC1iYXNlZCBzdG9yYWdlLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzdGF0ZXMgY2FuIGV4aXN0IGF0IHRoaXMgcG9pbnQsIGFuZCB3aGF0IHRoZSBpbml0aWFsIHN0YXRlIGlzLiBJIHNob3VsZCBsb29rIGZvciB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIGluaXRpYWxpemVkLCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaW52b2x2ZWQgKGJlY2F1c2UgdGhpcyBpcyBjcml0aWNhbCBpbiBhIGtlcm5lbCBjb250ZXh0KSwgYW5kIGFueSBzYW5pdHkgY2hlY2tzIGJlaW5nIHBlcmZvcm1lZC4gSSYjMzk7bGwgYmUgbG9va2luZyB0byB1bmRlcnN0YW5kIHRoZSBtZWNoYW5pY3Mgb2YgaG93IHRoZSBleHRlbnQgaGVhZGVyIGlzIHNldCB1cCwgd2hhdCB2YWx1ZXMgYXJlIHBsYWNlZCBpbnRvIHRoZSBgZXh0X3RyZWVgIHN0cnVjdHVyZSwgYW5kIGlmIGl0JiMzOTtzIGJhc2VkIG9uIGFuIGV4aXN0aW5nIGlub2RlLCBvciBiZWluZyBpbml0aWFsaXplZCBmcm9tIHNjcmF0Y2guIEl0IG11c3QgYmUgc2V0dGluZyB1cCB0aGUgaW5pdGlhbCBleHRlbnQgbm9kZSwgbGlrZWx5IGEgc2luZ2xlIGV4dGVudCwgYW5kIGFueSBhc3NvY2lhdGVkIG1ldGEtZGF0YS4KCkkgc2hvdWxkIGFsc28gcGF5IGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgY29uZGl0aW9ucyB0aGlzIGZ1bmN0aW9uIGFudGljaXBhdGVzLiBXaGF0IGhhcHBlbnMgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHM/IEFyZSB0aGVyZSBzcGVjaWZpYyBlcnJvciBjb2RlcyByZXR1cm5lZD8gQW5kLCBtb3N0IGltcG9ydGFudGx5LCBJIG5lZWQgdG8gbG9vayBvdXQgZm9yIHdoZXJlIHRoaXMgaXMgdWx0aW1hdGVseSBjYWxsZWQgYW5kIGluIHdoYXQgY2lyY3Vtc3RhbmNlcyBpdCBpcyB1c2VkLiBJcyBpdCBjYWxsZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBmaWxlLCBvciB3aGVuIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgZmlsZSB0byBleHRlbnQtYmFzZWQgc3RvcmFnZT8gUGVyaGFwcyBib3RoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0ZW50cy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogODcyLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA4NzI6XHR2b2lkIGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDg3MzpcdHtcbiA4NzQ6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xuIDg3NTpcdFxuIDg3NjpcdFx0ZWggPSBleHRfaW5vZGVfaGRyKGlub2RlKTtcbiA4Nzc6XHRcdGVoLVx1MDAzZWVoX2RlcHRoID0gMDtcbiA4Nzg6XHRcdGVoLVx1MDAzZWVoX2VudHJpZXMgPSAwO1xuIDg3OTpcdFx0ZWgtXHUwMDNlZWhfbWFnaWMgPSBFWFQ0X0VYVF9NQUdJQztcbiA4ODA6XHRcdGVoLVx1MDAzZWVoX21heCA9IGNwdV90b19sZTE2KGV4dDRfZXh0X3NwYWNlX3Jvb3QoaW5vZGUsIDApKTtcbiA4ODE6XHRcdGVoLVx1MDAzZWVoX2dlbmVyYXRpb24gPSAwO1xuIDg4MjpcdFx0ZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpO1xuIDg4MzpcdH1cbiA4ODQ6XHRcbiA4ODU6XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqXG4gODg2Olx0ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjMxNjAKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA1MDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBpbiBleHQ0IENvZGUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9leHRfdHJlZV9pbml0YCBmdW5jdGlvbi4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBpbml0aWFsaXppbmcgYGVoX2RlcHRoYCwgYGVoX2VudHJpZXNgLCBgZWhfbWFnaWNgLCBgZWhfbWF4YCwgYW5kIGBlaF9nZW5lcmF0aW9uYC4gVGhlIGBlaGAgdmFyaWFibGUgaXMgcG9pbnRpbmcgdG8gYEVYVDRfSShpbm9kZSktJmd0O2lfZGF0YWAsIHdoaWNoIG1ha2VzIHNlbnNlLiBJIHJlbWVtYmVyIHRoYXQgYGlfZGF0YWAgd2FzIGp1c3QgemVyb2VkIG91dCB3aXRoIGBtZW1zZXRgLiBTbywgYXQgdGhpcyBwb2ludCwgdGhlIGVudGlyZSBgaV9kYXRhYCBhcmVhIHNob3VsZCBiZSBjbGVhbiwgd2l0aCBubyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhhdCYjMzk7cyBnb29kLgoKQnV0IGhhbmcgb27igKYgSSBuZWVkIHRvIGNvbnNpZGVyIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHRoaXMgZGF0YSBpcyB1c2VkLiBXaGF0IGFib3V0IHRob3NlIHhhdHRyIGZ1bmN0aW9ucywgYGV4dDRfeGF0dHJfaWJvZHlfZmluZGAgYW5kIGBleHQ0X3hhdHRyX2lib2R5X3NldGA/IEkgc2VlIHRoZXNlIGxvY2FsIHN0cnVjdHMsIGBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgIGFuZCBgZXh0NF94YXR0cl9pbmZvIGlgLiBUaGV5JiMzOTtyZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLiBOb3csIGluIEMsIHdoZW4geW91IHBhcnRpYWxseSBpbml0aWFsaXplIGEgc3RydWN0IGxpa2UgdGhhdCwgdGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIGF1dG9tYXRpY2FsbHkgemVyb2VkLiBTbywgZXZlbiB0aG91Z2ggdGhleSAqbG9vayogbGlrZSB0aGV5JiMzOTtyZSBvbmx5IHBhcnRpYWxseSBpbml0aWFsaXplZCwgdGhleSYjMzk7cmUgYWN0dWFsbHkgZnVsbHkgaW5pdGlhbGl6ZWQgZHVlIHRvIHRoZSBDIGxhbmd1YWdlJiMzOTtzIGJlaGF2aW9yLiBUaGF0JiMzOTtzIGEgcG9pbnQgaW4gZmF2b3Igb2Ygc2FmZXR5LgoKTm93LCB0aGVyZSYjMzk7cyBhbm90aGVyIHBvaW50IHRvIGNvbnNpZGVyLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZXJyb3IgcGF0aHMuIFdoYXQgaGFwcGVucyBpZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBhbiBlcnJvciBwb2ludGVyPyBJbiB0aGUgY29kZSBJJiMzOTttIGxvb2tpbmcgYXQsIHRoZXJlJiMzOTtzIGEgY2FsbCB0byBgZXh0NF9maW5kX2V4dGVudGAgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSWYgYGV4dDRfZmluZF9leHRlbnRgIGZhaWxzLCBgcGF0aGAgd2lsbCBiZSBhbiBlcnJvciBwb2ludGVyLCBwb3NzaWJseSBgLUVOT01FTWAuIElmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCB0cmllcyB0byBkZXJlZmVyZW5jZSB0aGF0IGVycm9yIHBvaW50ZXIsIGl0IHdvdWxkIGJlIGEgcHJvYmxlbS4gSSYjMzk7bGwgbmVlZCB0byBnbyBhbmQgY2hlY2sgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIHRvIG1ha2Ugc3VyZSBpdCBoYW5kbGVzIHRoZSBwb3NzaWJpbGl0eSBvZiBhIGBOVUxMYCBvciBlcnJvciBwb2ludGVyIGNvcnJlY3RseS4gVGhpcyB3YXJyYW50cyBhIGRlZXBlciBsb29rIGludG8gdGhlIGNvZGUgcGF0aCB0byBlbnN1cmUgd2UmIzM5O3JlIG5vdCBydW5uaW5nIGludG8gYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UsIHdoaWNoIHdvdWxkIGJlIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfaW5zZXJ0X2V4dGVudCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD02ODQ9ZW51bSB7XG4tLVxuZnMvZXh0NC9leHQ0LmgtNzQzLSAqIHJlYWRfZXh0ZW50X3RyZWVfYmxvY2soKSwgZXh0NF9zcGxpdF9leHRlbnRfYXQoKSxcbmZzL2V4dDQvZXh0NC5oOjc0NDogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KCksIGFuZCBleHQ0X2V4dF9jcmVhdGVfbmV3X2xlYWYoKS5cbmZzL2V4dDQvZXh0NC5oLTc0NS0gKiBFWFQ0X0VYX05PQ0FDSEUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3ZSBzaG91bGRuJiMzOTt0IGJlXG4tLVxuZnMvZXh0NC9leHQ0Lmg9Mzg5ND1leHRlcm4gaW50IGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3Jfc2luZ2xlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0NC5oLTM4OTYtXHRcdFx0XHRcdFx0ICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpO1xuZnMvZXh0NC9leHQ0Lmg6Mzg5NzpleHRlcm4gc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfZXh0X2luc2VydF9leHRlbnQoXG5mcy9leHQ0L2V4dDQuaC0zODk4LVx0XHRcdFx0aGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMyLSAqIHRvIGluc3RlYWQgd3JpdGUgemVyb2VzIHRvIG91ciBidWZmZXIuIFRoZW4sIHdlIG92ZXJyaWRlXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjMzOiAqIGV4dDRfZXh0X2luc2VydF9leHRlbnQoKSB0byByZXR1cm4gLUVOT1NQQywgd2hpY2ggdHJpZ2dlcnMgdGhlIHplcm9vdXQuXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTM0LSAqIEZpbmFsbHksIHdlIGNoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgZXh0ZW50IHRyZWUgYW5kIHplcm9vdXQgYnVmZmVyIHRvIGNvbmZpcm1cbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTE3Mj1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKlxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzoxNzM6ZXh0NF9leHRfaW5zZXJ0X2V4dGVudF9zdHViKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTE3NC1cdFx0XHQgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0zOTY9c3RhdGljIHZvaWQgdGVzdF9zcGxpdF9jb252ZXJ0KHN0cnVjdCBrdW5pdCAqdGVzdClcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQwNy1cdFx0LypcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDA4Olx0XHQgKiBGb3JjZSB6ZXJvb3V0IGJ5IG1ha2luZyBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50IHJldHVybiBFTk9TUENcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtNDA5LVx0XHQgKi9cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDEwOlx0XHRrdW5pdF9hY3RpdmF0ZV9zdGF0aWNfc3R1Yih0ZXN0LCBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50LFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzo0MTE6XHRcdFx0XHRcdCAgIGV4dDRfZXh0X2luc2VydF9leHRlbnRfc3R1Yik7XG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQxMi1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTQyPXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTk4NS0vKlxuZnMvZXh0NC9leHRlbnRzLmM6MTk4NjogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50OlxuZnMvZXh0NC9leHRlbnRzLmMtMTk4Ny0gKiB0cmllcyB0byBtZXJnZSByZXF1ZXN0ZWQgZXh0ZW50IGludG8gdGhlIGV4aXN0aW5nIGV4dGVudCBvclxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTE9c3RydWN0IGV4dDRfZXh0X3BhdGggKlxuZnMvZXh0NC9leHRlbnRzLmM6MTk5MjpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L2V4dGVudHMuYy0xOTkzLVx0XHQgICAgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjAwMi1cbmZzL2V4dDQvZXh0ZW50cy5jOjIwMDM6XHRLVU5JVF9TVEFUSUNfU1RVQl9SRURJUkVDVChleHQ0X2V4dF9pbnNlcnRfZXh0ZW50LCBoYW5kbGUsIGlub2RlLCBwYXRoLFxuZnMvZXh0NC9leHRlbnRzLmMtMjAwNC1cdFx0XHRcdCAgIG5ld2V4dCwgZ2JfZmxhZ3MpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTMxOTE9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudF9hdChoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTMyMzctXHQgKiBwYXRoIG1heSBsZWFkIHRvIG5ldyBsZWFmLCBub3QgdG8gb3JpZ2luYWwgbGVhZiBhbnkgbW9yZVxuZnMvZXh0NC9leHRlbnRzLmM6MzIzODpcdCAqIGFmdGVyIGV4dDRfZXh0X2luc2VydF9leHRlbnQoKSByZXR1cm5zLFxuZnMvZXh0NC9leHRlbnRzLmMtMzIzOS1cdCAqL1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTMyNTAtXG5mcy9leHQ0L2V4dGVudHMuYzozMjUxOlx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNTItXHRpZiAoIUlTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz00MjY5PWludCBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDQ4MS1cbmZzL2V4dDQvZXh0ZW50cy5jOjQ0ODI6XHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcdTAwMjZuZXdleCwgZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtNDQ4My1cdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MzAzPUVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2VzX2luc2VydF9leHRlbnQpO1xuZnMvZXh0NC9leHRlbnRzLmM6NjMwNDpFWFBPUlRfU1lNQk9MX0ZPUl9FWFQ0X1RFU1QoZXh0NF9leHRfaW5zZXJ0X2V4dGVudCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MzA1LUVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2ZpbmRfZXh0ZW50KTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjE0OD1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2FkZF9yYW5nZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1OCAqdmFsKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjA4LVx0XHRcdGRvd25fd3JpdGUoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMjA5Olx0XHRcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KE5VTEwsIGlub2RlLFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMTAtXHRcdFx0XHRcdFx0ICAgICAgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMTE4LVx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcbmZzL2V4dDQvaW5saW5lLmM6MTExOTpcdFx0ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcdTAwMjZuZXdleCwgMCk7XG5mcy9leHQ0L2lubGluZS5jLTExMjAtXHR9IGVsc2Uge1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNTQtXHRcdGdvdG8gZXJyX291dDtcbmZzL2V4dDQvbWlncmF0ZS5jOjU1Olx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbmZzL2V4dDQvbWlncmF0ZS5jLTU2LVx0aWYgKElTX0VSUihwYXRoKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU5NDUKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIGZpcnN0LXBlcnNvbiBzdW1tYXJ5LCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCB0aGUgY3JpdGljYWwgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIGhhbmRsaW5nIGV4dGVudCBpbnNlcnRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IHRoZSBjb3JlIG9mIGV4dGVudC1iYXNlZCBmaWxlIHN0b3JhZ2UgaGVyZSDigJMgdGhlIHZlcnkgbWVjaGFuaXNtIHRoYXQgbWFrZXMgbW9kZXJuIGV4dDQgcGVyZm9ybWFuY2Ugd2hhdCBpdCBpcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiYjMzk7cyBsb2dpYyBpbnRpbWF0ZWx5LiBXaGF0IGFyZSB0aGUga2V5IGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZD8gT2J2aW91c2x5LCBgc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlcmAgYW5kIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIGFyZSBjZW50cmFsLCBidXQgaG93IGFyZSB0aGV5IGJlaW5nIG1hbmlwdWxhdGVkIGluIHRoaXMgc3BlY2lmaWMgaW5zZXJ0aW9uIHNjZW5hcmlvPwoKRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdHJpZ2dlcnMgdGhpcyBjYWxsLCBsaWtlbHkgZHVyaW5nIGZpbGUgY3JlYXRpb24sIGV4dGVuc2lvbiwgb3IgbW9kaWZpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBuZXcgZXh0ZW50LiBXaGF0IGFyZSB0aGUgcHJlLWNvbmRpdGlvbnM/IERvZXMgaXQgZXhwZWN0IHRoZSBuZXcgZXh0ZW50IHRvIGZpdCBpbiB0aGUgY3VycmVudCBibG9jayBncm91cCwgb3IgZG9lcyBpdCBoYW5kbGUgY3Jvc3MtYmxvY2stZ3JvdXAgaW5zZXJ0aW9ucz8gSWYgdGhlIGZvcm1lciwgd2hhdCYjMzk7cyB0aGUgb3ZlcmZsb3cgbG9naWMgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZT8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgYmxvY2sgYWxsb2NhdG9yPyBJcyB0aGVyZSBhIHNlcGFyYXRlIGxvY2tpbmcgbWVjaGFuaXNtIHJlcXVpcmVkIGJleW9uZCB3aGF0JiMzOTtzIGhhbmRsZWQgYXQgYSBoaWdoZXIgbGV2ZWw/CgpJJiMzOTttIGFsc28gY3VyaW91cyBhYm91dCB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4gRXh0ZW50IG1hbmlwdWxhdGlvbiwgZXNwZWNpYWxseSBpbnNlcnRpb25zLCBjYW4gYmUgY29tcGxleC4gV2hhdCBhcmUgdGhlIHRpbWUgY29tcGxleGl0aWVzIGZvciBzZWFyY2hpbmcgZm9yIHRoZSByaWdodCBwbGFjZSB0byBpbnNlcnQsIHNoaWZ0aW5nIGV4aXN0aW5nIGV4dGVudHMgaWYgbmVjZXNzYXJ5LCBhbmQgZmluYWxseSwgd3JpdGluZyB0aGUgY2hhbmdlcyB0byBkaXNrPyBBbnkgb2J2aW91cyBvcHRpbWl6YXRpb25zIGltcGxlbWVudGVkIHRvIG1pbmltaXplIGZyYWdtZW50YXRpb24gYW5kIG1heGltaXplIHBlcmZvcm1hbmNlPyBBcmUgdGhlcmUgYW55IHNwZWNpZmljIGVycm9yIGhhbmRsaW5nIHN0cmF0ZWdpZXMgdGhhdCBhcmUgcGFydGljdWxhcmx5IGNsZXZlciBvciByb2J1c3Q/IEkmIzM5O2xsIGJlIGxvb2tpbmcgY2xvc2VseSBhdCBob3cgaXQgaGFuZGxlcyBtZXRhZGF0YSB1cGRhdGVzLCBzcGVjaWZpY2FsbHkgdGhlIGlub2RlIGFuZCBncm91cCBkZXNjcmlwdG9yIGJsb2NrIGNoYW5nZXMuCgpUaGUgY3JpdGljYWwgcGF0aCBpcyB0aGUgcGFydCBJIHdhbnQgdG8gZm9jdXMgb24uIFdoYXQmIzM5O3MgdGhlIGNvcmUgbG9naWMgZm9yIHRoZSBpbnNlcnRpb24sIGFuZCB3aGF0IGVkZ2UgY2FzZXMgYXJlIGhhbmRsZWQgKGUuZy4sIGluc2VydGlvbiBhdCB0aGUgYmVnaW5uaW5nLCBtaWRkbGUsIG9yIGVuZCBvZiBhbiBleHRlbnQgbGlzdCwgb3IgZXZlbiBzcGxpdHRpbmcgZXh0ZW50cyB0byBtYWtlIHNwYWNlKS4gQW55IGNoYW5jZSBvZiBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGhlcmU/IEkmIzM5O2xsIHByb2JhYmx5IHNwZW5kIGEgZ29vZCB3aGlsZSBqdXN0IHRyYWNpbmcgdGhlIGNvZGUgZmxvdywgbG9va2luZyBvdXQgZm9yIHRoZSBjb21tb24gcHJvYmxlbXMgSSBrbm93IGNhbiBvY2N1ciBpbiB0aGVzZSB0eXBlIG9mIGZpbGUgc3lzdGVtIGZ1bmN0aW9ucy4gTm93LCBsZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIHNvdXJjZSBjb2RlIGFjdHVhbGx5IHRlbGxzIHVzLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTkxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5OTE6XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqXG4xOTkyOlx0ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuMTk5MzpcdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXG4xOTk0Olx0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKVxuMTk5NTpcdHtcbjE5OTY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xuMTk5NzpcdFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleCwgKmZleDtcbjE5OTg6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCAqbmVhcmV4OyAvKiBuZWFyZXN0IGV4dGVudCAqL1xuMTk5OTpcdFx0aW50IGRlcHRoLCBsZW4sIGVyciA9IDA7XG4yMDAwOlx0XHRleHQ0X2xibGtfdCBuZXh0O1xuMjAwMTpcdFx0aW50IG1iX2ZsYWdzID0gMCwgdW53cml0dGVuO1xuMjAwMjpcdFxuMjAwMzpcdFx0S1VOSVRfU1RBVElDX1NUVUJfUkVESVJFQ1QoZXh0NF9leHRfaW5zZXJ0X2V4dGVudCwgaGFuZGxlLCBpbm9kZSwgcGF0aCxcbjIwMDQ6XHRcdFx0XHRcdCAgIG5ld2V4dCwgZ2JfZmxhZ3MpO1xuMjAwNTpcdFxuMjAwNjpcdFx0aWYgKGdiX2ZsYWdzIFx1MDAyNiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSlcbjIwMDc6XHRcdFx0bWJfZmxhZ3MgfD0gRVhUNF9NQl9ERUxBTExPQ19SRVNFUlZFRDtcbjIwMDg6XHRcdGlmICh1bmxpa2VseShleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpID09IDApKSB7XG4yMDA5Olx0XHRcdEVYVDRfRVJST1JfSU5PREUoaW5vZGUsIFwmIzM0O2V4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCkgPT0gMFwmIzM0Oyk7XG4yMDEwOlx0XHRcdGVyciA9IC1FRlNDT1JSVVBURUQ7XG4yMDExOlx0XHRcdGdvdG8gZXJyb3V0O1xuMjAxMjpcdFx0fVxuMjAxMzpcdFx0ZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpO1xuMjAxNDpcdFx0ZXggPSBwYXRoW2RlcHRoXS5wX2V4dDtcbjIwMTU6XHRcdGVoID0gcGF0aFtkZXB0aF0ucF9oZHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2OTM5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcqKgoKSG1tLCBzbyBpZiBJJiMzOTttIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlIGNvcnJlY3RseSwgdGhlcmUmIzM5O3MgYSBzZXJpb3VzIHJpc2sgaGVyZS4gSWYgdGhlIHZhcmlhYmxlIGBwYXRoYCBpcyBhbiBlcnJvciBwb2ludGVyLCB0aGVuIGFjY2Vzc2luZyBgcGF0aFtkZXB0aF1gIGlzIGdvaW5nIHRvIGxlYWQgdG8gYSBkZXJlZmVyZW5jZSBvZiB0aGF0IGVycm9yIHBvaW50ZXIuIEFuZCB0aGF0JiMzOTtzIGdvaW5nIHRvIGNyYXNoIHRoZSBrZXJuZWwsIG5vIHF1ZXN0aW9uLiBIYW5nIG9uIGEgc2VjLi4uIHdhaXQgYSBtaW51dGUsIEkgdGhpbmsgSSBzZWUgYSBwb3RlbnRpYWwgZ290Y2hhLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBgRVJSX1BUUmAgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLCB3ZSBtaWdodCBoYXZlIGEgcHJvYmxlbS4gTG9va3MgbGlrZSBhIHByZXR0eSBzdGFuZGFyZCB0aGluZyB0byBkbyB3aXRoIGVycm9yIHBhdGhzIGluIHRoZSBrZXJuZWwuIFNvLCB0aGUga2V5IHRvIGFsbCB0aGlzIGlzIGhvdyBgZXh0NF9maW5kX2V4dGVudGAgaGFuZGxlcyBlcnJvcnMuIFdlIGhhdmUgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgY29kZSBleHBsaWNpdGx5IGNoZWNrcyB0aGUgcmV0dXJuIG9mIGBleHQ0X2ZpbmRfZXh0ZW50YCBhbmQgaGFuZGxlcyB0aGUgYEVSUl9QVFJgIGFwcHJvcHJpYXRlbHkuIFRoYXQmIzM5O3MgdGhlIG9ubHkgd2F5IHRvIGF2b2lkIGEgbmFzdHkgY3Jhc2guIFJpZ2h0LCBsZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZG9lcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9maW5kX2V4dGVudCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtEb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3Q9NT1Eb2N1bWVudGF0aW9uIHdyaXR0ZW4gYnkgVG9tIFphbnVzc2lcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3QtNDA0LSAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmYTA0YzRhM2NdIGludGVsX3BsYW5lX2R1cGxpY2F0ZV9zdGF0ZSBbaTkxNV0gICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAxNDAyICBieXRlc19yZXE6ICAgICAxOTA2NzJcbkRvY3VtZW50YXRpb24vdHJhY2UvaGlzdG9ncmFtLnJzdDo0MDU6ICAgIHsgY2FsbF9zaXRlOiBbZmZmZmZmZmY4MTI4OTFjYV0gZXh0NF9maW5kX2V4dGVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gaGl0Y291bnQ6ICAgICAgIDE1MTggIGJ5dGVzX3JlcTogICAgIDE0NjIwOFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQwNi0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwMjkwNzBlXSBkcm1fdm1hX25vZGVfYWxsb3cgW2RybV0gICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTc0NiAgYnl0ZXNfcmVxOiAgICAgIDY5ODQwXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQzOS0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwNDg5YTY2XSBpbnRlbF9yaW5nX2JlZ2luIFtpOTE1XSAgICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMjE4NiAgYnl0ZXNfcmVxOiAgICAgMzE0Nzg0XG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3Q6NDQwOiAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmODEyODkxY2FdIGV4dDRfZmluZF9leHRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAyMTc0ICBieXRlc19yZXE6ICAgICAyMDg5OTJcbkRvY3VtZW50YXRpb24vdHJhY2UvaGlzdG9ncmFtLnJzdC00NDEtICAgIHsgY2FsbF9zaXRlOiBbZmZmZmZmZmY4MTFhZThlMV0gX19rbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gaGl0Y291bnQ6ICAgICAgICAgIDggIGJ5dGVzX3JlcTogICAgIDEzMTA3MlxuLS1cbmZzL2V4dDQvZXh0NC5oPTY4ND1lbnVtIHtcbi0tXG5mcy9leHQ0L2V4dDQuaC03NDEtICogVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGVzZSBmbGFncyBtdXN0IG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZVxuZnMvZXh0NC9leHQ0Lmg6NzQyOiAqIEVYVDRfR0VUX0JMT0NLU18qLiAgVGhleSBhcmUgdXNlZCBieSBleHQ0X2ZpbmRfZXh0ZW50KCksXG5mcy9leHQ0L2V4dDQuaC03NDMtICogcmVhZF9leHRlbnRfdHJlZV9ibG9jaygpLCBleHQ0X3NwbGl0X2V4dGVudF9hdCgpLFxuLS1cbmZzL2V4dDQvZXh0NC5oPTM4OTc9ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KFxuLS1cbmZzL2V4dDQvZXh0NC5oLTM5MDAtXHRcdFx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKTtcbmZzL2V4dDQvZXh0NC5oOjM5MDE6ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2ZpbmRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqLCBleHQ0X2xibGtfdCxcbmZzL2V4dDQvZXh0NC5oLTM5MDItXHRcdFx0XHRcdCAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICosXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0zOTY9c3RhdGljIHZvaWQgdGVzdF9zcGxpdF9jb252ZXJ0KHN0cnVjdCBrdW5pdCAqdGVzdClcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQxMi1cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDEzOlx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9EQVRBX0xCTEssIE5VTEwsIEVYVDRfRVhfTk9DQUNIRSk7XG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQxNC1cdGV4ID0gcGF0aC1cdTAwM2VwX2V4dDtcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQzOC1cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDM5Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9EQVRBX0xCTEssIE5VTEwsIEVYVDRfRVhfTk9DQUNIRSk7XG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQ0MC1cdGV4ID0gcGF0aC1cdTAwM2VwX2V4dDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz04ODU9c3RydWN0IGV4dDRfZXh0X3BhdGggKlxuZnMvZXh0NC9leHRlbnRzLmM6ODg2OmV4dDRfZmluZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgYmxvY2ssXG5mcy9leHQ0L2V4dGVudHMuYy04ODctXHRcdCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwgaW50IGZsYWdzKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTg5NC1cbmZzL2V4dDQvZXh0ZW50cy5jOjg5NTpcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZmluZF9leHRlbnQsIGlub2RlLCBibG9jaywgcGF0aCwgZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtODk2LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE0MDA9ZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTQyOC1cdFx0LyogcmVmaWxsIHBhdGggKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjE0Mjk6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlZV9ibG9jaywgcGF0aCwgZ2JfZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtMTQzMC1cdFx0cmV0dXJuIHBhdGg7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTQzOC1cdC8qIHJlZmlsbCBwYXRoICovXG5mcy9leHQ0L2V4dGVudHMuYzoxNDM5Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGVlX2Jsb2NrLCBwYXRoLCBnYl9mbGFncyk7XG5mcy9leHQ0L2V4dGVudHMuYy0xNDQwLVx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI3LVx0XHQgKiByaWdodCBmcm9tIGV4LCBvciBmcm9tIHRoZSBsZWZ0IG9mIGV4LiBUaGlzIGlzIGJlY2F1c2VcbmZzL2V4dDQvZXh0ZW50cy5jOjIwMjg6XHRcdCAqIGV4dDRfZmluZF9leHRlbnQoKSBjYW4gcmV0dXJuIGVpdGhlciBleHRlbnQgb24gdGhlXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI5LVx0XHQgKiBsZWZ0LCBvciBvbiB0aGUgcmlnaHQgZnJvbSB0aGUgc2VhcmNoZWQgcG9zaXRpb24uIFRoaXNcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA5LVx0XHRleHRfZGVidWcoaW5vZGUsIFwmIzM0O25leHQgbGVhZiBibG9jayAtICV1XFxuXCYjMzQ7LCBuZXh0KTtcbmZzL2V4dDQvZXh0ZW50cy5jOjIxMTA6XHRcdG5wYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbmV4dCwgTlVMTCwgZ2JfZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtMjExMS1cdFx0aWYgKElTX0VSUihucGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yODM3PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjg3Ni1cdFx0LyogZmluZCBleHRlbnQgZm9yIG9yIGNsb3Nlc3QgZXh0ZW50IHRvIHRoaXMgYmxvY2sgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjI4Nzc6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlbmQsIE5VTEwsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTI4NzgtXHRcdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zMjYyLVx0ICogR2V0IGEgbmV3IHBhdGggdG8gdHJ5IHRvIHplcm9vdXQgb3IgZml4IHRoZSBleHRlbnQgbGVuZ3RoLlxuZnMvZXh0NC9leHRlbnRzLmM6MzI2MzpcdCAqIFVzaW5nIEVYVDRfRVhfTk9GQUlMIGd1YXJhbnRlZXMgdGhhdCBleHQ0X2ZpbmRfZXh0ZW50KClcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNjQtXHQgKiB3aWxsIG5vdCByZXR1cm4gLUVOT01FTSwgb3RoZXJ3aXNlIC1FTk9NRU0gd2lsbCBjYXVzZSBhXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzI2OC1cdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6MzI2OTpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlZV9ibG9jaywgTlVMTCwgZmxhZ3MgfCBFWFQ0X0VYX05PRkFJTCk7XG5mcy9leHQ0L2V4dGVudHMuYy0zMjcwLVx0aWYgKElTX0VSUihwYXRoKSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTM0MDk9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTM0NDQtXHRcdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6MzQ0NTpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cdTAwM2VtX2xibGssIHBhdGgsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTM0NDYtXHRcdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzQ5Ni1cbmZzL2V4dDQvZXh0ZW50cy5jOjM0OTc6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLVx1MDAzZW1fbGJsaywgTlVMTCwgZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtMzQ5OC1cdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MzgxNj1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzg2MS1jb252ZXJ0OlxuZnMvZXh0NC9leHRlbnRzLmM6Mzg2MjpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAtXHUwMDNlbV9sYmxrLCBwYXRoLCBmbGFncyk7XG5mcy9leHQ0L2V4dGVudHMuYy0zODYzLVx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zOTM2PWNvbnZlcnRfaW5pdGlhbGl6ZWRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzk3My1cdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6Mzk3NDpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAtXHUwMDNlbV9sYmxrLCBwYXRoLCBmbGFncyk7XG5mcy9leHQ0L2V4dGVudHMuYy0zOTc1LVx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz00MjY5PWludCBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDI4NS1cdC8qIGZpbmQgZXh0ZW50IGZvciB0aGlzIGJsb2NrICovXG5mcy9leHQ0L2V4dGVudHMuYzo0Mjg2Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cdTAwM2VtX2xibGssIE5VTEwsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTQyODctXHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDI5Ni1cdCAqIHRoaXMgc2l0dWF0aW9uIGlzIHBvc3NpYmxlLCB0aG91Z2gsIF9kdXJpbmdfIHRyZWUgbW9kaWZpY2F0aW9uO1xuZnMvZXh0NC9leHRlbnRzLmM6NDI5NzpcdCAqIHRoaXMgaXMgd2h5IGFzc2VydCBjYW4mIzM5O3QgYmUgcHV0IGluIGV4dDRfZmluZF9leHRlbnQoKVxuZnMvZXh0NC9leHRlbnRzLmMtNDI5OC1cdCAqL1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTQzODItXHQgKiBJZiB3ZSBhcmUgZG9pbmcgYmlnYWxsb2MsIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXh0ZW50IHJldHVybmVkXG5mcy9leHQ0L2V4dGVudHMuYzo0MzgzOlx0ICogYnkgZXh0NF9maW5kX2V4dGVudCgpIGltcGxpZXMgYSBjbHVzdGVyIHdlIGNhbiB1c2UuXG5mcy9leHQ0L2V4dGVudHMuYy00Mzg0LVx0ICovXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTM4Mj1leHQ0X2V4dF9zaGlmdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTM5Mi1cdC8qIExldCBwYXRoIHBvaW50IHRvIHRoZSBsYXN0IGV4dGVudCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTM5MzpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG5mcy9leHQ0L2V4dGVudHMuYy01Mzk0LVx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NDEwLVx0aWYgKFNISUZUID09IFNISUZUX0xFRlQpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjU0MTE6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydCAtIDEsIHBhdGgsXG5mcy9leHQ0L2V4dGVudHMuYy01NDEyLVx0XHRcdFx0XHRFWFQ0X0VYX05PQ0FDSEUpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU0NTktXHR3aGlsZSAoaXRlcmF0b3IgXHUwMDI2XHUwMDI2IHN0YXJ0IFx1MDAzYz0gc3RvcCkge1xuZnMvZXh0NC9leHRlbnRzLmM6NTQ2MDpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsICppdGVyYXRvciwgcGF0aCxcbmZzL2V4dDQvZXh0ZW50cy5jLTU0NjEtXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTYyNj1zdGF0aWMgaW50IGV4dDRfaW5zZXJ0X3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU2ODctXG5mcy9leHQ0L2V4dGVudHMuYzo1Njg4Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0X2xibGssIE5VTEwsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNTY4OS1cdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NzYzPWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODQtXG5mcy9leHQ0L2V4dGVudHMuYzo1Nzg1Olx0XHRwYXRoMSA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUxLCBsYmxrMSwgcGF0aDEsIEVYVDRfRVhfTk9DQUNIRSk7XG5mcy9leHQ0L2V4dGVudHMuYy01Nzg2LVx0XHRpZiAoSVNfRVJSKHBhdGgxKSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODktXHRcdH1cbmZzL2V4dDQvZXh0ZW50cy5jOjU3OTA6XHRcdHBhdGgyID0gZXh0NF9maW5kX2V4dGVudChpbm9kZTIsIGxibGsyLCBwYXRoMiwgRVhUNF9FWF9OT0NBQ0hFKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU3OTEtXHRcdGlmIChJU19FUlIocGF0aDIpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTk0OD1pbnQgZXh0NF9jbHVfbWFwcGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxjbHUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTk2NS1cdC8qIHNlYXJjaCBmb3IgdGhlIGV4dGVudCBjbG9zZXN0IHRvIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgY2x1c3RlciAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTk2NjpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFQ0X0MyQihzYmksIGxjbHUpLCBOVUxMLCAwKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU5NjctXHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU5NzQtXHQgKiB0aG91Z2gsIF9kdXJpbmdfIHRyZWUgbW9kaWZpY2F0aW9uLCBhbmQgaXQmIzM5O3Mgd2h5IGFuIGFzc2VydCBjYW4mIzM5O3RcbmZzL2V4dDQvZXh0ZW50cy5jOjU5NzU6XHQgKiBiZSBwdXQgaW4gZXh0NF9maW5kX2V4dGVudCgpLlxuZnMvZXh0NC9leHRlbnRzLmMtNTk3Ni1cdCAqL1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYwMjc9aW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjAzMy1cbmZzL2V4dDQvZXh0ZW50cy5jOjYwMzQ6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgc3RhcnQsIE5VTEwsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNjAzNS1cdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjA1My1cbmZzL2V4dDQvZXh0ZW50cy5jOjYwNTQ6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydCwgcGF0aCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MDU1LVx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYwNzAtXG5mcy9leHQ0L2V4dGVudHMuYzo2MDcxOlx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydCwgcGF0aCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MDcyLVx0XHRcdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjA5Mj12b2lkIGV4dDRfZXh0X3JlcGxheV9zaHJpbmtfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgZW5kKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYwOTgtXHR3aGlsZSAoY3VyIFx1MDAzYyBlbmQpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjYwOTk6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIE5VTEwsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNjEwMC1cdFx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MTQwPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MTQ5LVx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjYxNTA6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuZnMvZXh0NC9leHRlbnRzLmMtNjE1MS1cdFx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MTgyLVx0XHRnb3RvIG91dDtcbmZzL2V4dDQvZXh0ZW50cy5jOjYxODM6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgY3VyLCBwYXRoLCAwKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTYxODQtXHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYxODctXHR3aGlsZSAoY3VyIFx1MDAzYyBlbmQpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjYxODg6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIHBhdGgsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNjE4OS1cdFx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MjAwLVxuZnMvZXh0NC9leHRlbnRzLmM6NjIwMTpcdFx0cGF0aDIgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIHBhdGgyLCAwKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTYyMDItXHRcdGlmIChJU19FUlIocGF0aDIpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYyMjc9aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjIzOC1cdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG5mcy9leHQ0L2V4dGVudHMuYzo2MjM5Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNDAtXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjI1NS1cdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuZnMvZXh0NC9leHRlbnRzLmM6NjI1NjpcdFx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MjU3LVx0XHRcdGlmICghSVNfRVJSKHBhdGgpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjMwND1FWFBPUlRfU1lNQk9MX0ZPUl9FWFQ0X1RFU1QoZXh0NF9leHRfaW5zZXJ0X2V4dGVudCk7XG5mcy9leHQ0L2V4dGVudHMuYzo2MzA1OkVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2ZpbmRfZXh0ZW50KTtcbmZzL2V4dDQvZXh0ZW50cy5jLTYzMDYtRVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfaXNzdWVfemVyb291dCk7XG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTY3Mz1zdGF0aWMgdm9pZCBleHQ0X2VzX2luc2VydF9leHRlbnRfZXh0X2NoZWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTY4Mi1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo2ODM6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZXMtXHUwMDNlZXNfbGJsaywgTlVMTCwgRVhUNF9FWF9OT0NBQ0hFKTtcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02ODQtXHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIxOTctXHRcdFx0LyogUmFuZ2UgaXMgbm90IG1hcHBlZCAqL1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIxOTg6XHRcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGN1ciwgcGF0aCwgMCk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjE5OS1cdFx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMzI4PXN0YXRpYyB2b2lkIGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIzNjAtXHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIzNjE6XHRcdFx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjM2Mi1cdFx0XHRcdGlmICghSVNfRVJSKHBhdGgpKSB7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMTItXHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmM6MTExMzpcdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcbmZzL2V4dDQvaW5saW5lLmMtMTExNC1cdFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtMzYtXHRkb3duX3dyaXRlKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSk7XG5mcy9leHQ0L21pZ3JhdGUuYzozNzpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XG5mcy9leHQ0L21pZ3JhdGUuYy0zOC1cdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L3Zlcml0eS5jPTI3MT1zdGF0aWMgaW50IGV4dDRfZ2V0X3Zlcml0eV9kZXNjcmlwdG9yX2xvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC92ZXJpdHkuYy0yOTMtXG5mcy9leHQ0L3Zlcml0eS5jOjI5NDpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsIDApO1xuZnMvZXh0NC92ZXJpdHkuYy0yOTUtXHRpZiAoSVNfRVJSKHBhdGgpKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMjYzOAoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDUxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2VybmVsIEJ1ZyBpbiBleHQ0IElubGluZSBEYXRhIEhhbmRsaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgZnVuY3Rpb24uIFRoZSBjb2RlIGZpcnN0IGNhbGxzIGBleHQ0X2ZpbmRfZXh0ZW50YCB3aGljaCBjYW4gcmV0dXJuIGFuIGVycm9yLCBzcGVjaWZpY2FsbHkgYEVSUl9QVFIoLUVOT01FTSlgLiBJZiB0aGF0IGhhcHBlbnMsIGBwYXRoYCBiZWNvbWVzIGFuIGVycm9yIHBvaW50ZXIuIFRoZW4sIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBpcyBjYWxsZWQsIGFuZCAqdGhhdCogaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LgoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcywgJiMzNDtBaGEhIERlcmVmZXJlbmNpbmcgYW4gZXJyb3IgcG9pbnRlciEgVGhhdCYjMzk7cyBhIGNsYXNzaWMuJiMzNDsgU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB0aGVuIHRyaWVzIHRvIGFjY2VzcyBgcGF0aFtkZXB0aF1gLiBUaGlzIHdvdWxkIGF0dGVtcHQgdG8gcmVhZCBmcm9tIG1lbW9yeSBsb2NhdGlvbnMgcmVsYXRlZCB0byBgRVJSX1BUUigtRU5PTUVNKWAsIHdoaWNoIGlzIGVzc2VudGlhbGx5IGFuIGludmFsaWQgbWVtb3J5IGFkZHJlc3Mg4oCTIGEgY3Jhc2ggd2FpdGluZyB0byBoYXBwZW4uIEl0JiMzOTtzIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLCBvciBhdCBsZWFzdCBhbiBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgY2xvc2UgdG8gdGhlIHRvcCBvZiBtZW1vcnkuIFRoaXMgd2lsbCBkZWZpbml0ZWx5IGJlIGNhdWdodCBieSBLQVNBTiBvciBjYXVzZSBhIHN0YW5kYXJkIGtlcm5lbCBvb3BzLCBub3QgYSBzdWJ0bGUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoLgoKQnV0IHdhaXQsIEkgbmVlZCB0byBjb25zaWRlciBhIGRpZmZlcmVudCBzY2VuYXJpby4gV2hhdCBpZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgKml0c2VsZiogcmV0dXJucyBhbiBlcnJvcj8gSSBzZWUgdGhlIGNvZGUgaXMgd3JpdHRlbiBpbiBhIHdheSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGlzICppZ25vcmVkKi4gTWVhbmluZyB0aGF0IGlmIGl0IGZhaWxzLCB0aGVuIHRoZSBvbGQgYHBhdGhgIGlzIHN0aWxsIGluIHVzZSEKCkFuZCBhIGZ1cnRoZXIgdGhvdWdodCEgQ2FuIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmcmVlIGBwYXRoYCBpbnRlcm5hbGx5PyBJZiBpdCBkb2VzLCBhbmQgcmV0dXJucyBhbiBlcnJvciwgdGhlbiB0aGUgb3JpZ2luYWwgYHBhdGhgIHBvaW50ZXIgd291bGQgYmUgZGFuZ2xpbmcuIE5vdyB0aGF0JiMzOTtzIGEgcHJvYmxlbS4gVGhhdCBjb3VsZCBsZWFkIHRvIGEgdXNlLWFmdGVyLWZyZWUsIG9yIGEgZG91YmxlLWZyZWUsIGRlcGVuZGluZyBvbiBob3cgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGlzIGltcGxlbWVudGVkLiBJIG5lZWQgdG8gZGl2ZSBkZWVwZXIgYW5kIGV4YW1pbmUgdGhlIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmdW5jdGlvbiBpdHNlbGYgdG8gc2VlIGlmIGl0IGRvZXMgaW5kZWVkIGZyZWUgdGhlIGBwYXRoYCB1bmRlciBhbnkgZXJyb3IgY29uZGl0aW9ucy4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgcmVhbCB2dWxuZXJhYmlsaXR5IGxpZXMuIFRoaXMgaXMgYSBjcml0aWNhbCBjb2RlIHBhdGgsIGFuZCBJJiMzOTttIGdvaW5nIHRvIHRyYWNrIHRoYXQgZnVuY3Rpb24gY2FsbCBkb3duIHRvIGVuc3VyZSBJJiMzOTttIGdldHRpbmcgdGhlIHdob2xlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZXh0X2Ryb3BfcmVmcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dGVudHMuYz0xMDU9c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3BhdGhfYnJlbHNlKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTExMC1cbmZzL2V4dDQvZXh0ZW50cy5jOjExMTpzdGF0aWMgdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG5mcy9leHQ0L2V4dGVudHMuYy0xMTIte1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTEyMj12b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xMjUtXHRcdHJldHVybjtcbmZzL2V4dDQvZXh0ZW50cy5jOjEyNjpcdGV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTEyNy1cdGtmcmVlKHBhdGgpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTg4Nj1leHQ0X2ZpbmRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGJsb2NrLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTkwOS1cdGlmIChwYXRoKSB7XG5mcy9leHQ0L2V4dGVudHMuYzo5MTA6XHRcdGV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTkxMS1cdFx0aWYgKGRlcHRoIFx1MDAzZSBwYXRoWzBdLnBfbWF4ZGVwdGgpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM5ODYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBNZW1vcnkgTGVha3MgaW4gRXh0NCBFeHRlbnQgSW5zZXJ0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmdW5jdGlvbiBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBgc3RydWN0IGV4dDRfZXh0X3BhdGggKmAgaXQgd29ya3Mgd2l0aC4gTXkgaW5pdGlhbCBjb25jZXJuIGlzIG1lbW9yeSBsZWFrcywgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYHBhdGhgIHBvaW50ZXIuIElmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmYWlscywgdGhlcmUmIzM5O3MgYSBwb3NzaWJpbGl0eSBpdCBjYWxscyBgZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpYC4gVGhlIHRyaWNreSBwYXJ0IGlzLCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgKnJldHVybnMqIGEgYHN0cnVjdCBleHQ0X2V4dF9wYXRoICpgLgoKU28sIHRoZSBxdWVzdGlvbiBpcywgZG9lcyBhIGNhbGxlciB3aG8gKmRvZXNuJiMzOTt0KiB1c2UgdGhlIHJldHVybiB2YWx1ZSBhbmQgKmRvZXMqIGhhdmUgYHBhdGhgIGZyZWVkIGJ5IGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBsZWFrIG1lbW9yeT8gTm8sIHRoYXQmIzM5O3Mgbm90IHJpZ2h0LCBpZiBpdCBmcmVlcyBgcGF0aGAsIGl0JiMzOTtzIGZyZWVkLgoKSG93ZXZlciwgdGhlIGNvZGUgaW4gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBpcyB3aGF0IHRyaWdnZXJlZCB0aGlzIHRob3VnaHQgcHJvY2VzcywgYmVjYXVzZSBpdCBjYWxscyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgYW5kICpjb21wbGV0ZWx5IGlnbm9yZXMqIHRoZSByZXR1cm4gdmFsdWUhIEkmIzM5O20gc2VlaW5nIHRoaXM6CgpgYGBjCgkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTsKCQlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7CgoJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CgkJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTsKCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJmFtcDtuZXdleCwgYmxvY2spOwoJCWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJmFtcDtuZXdleCwgMCk7CmBgYAoKT2theSwgYGV4dDRfZmluZF9leHRlbnRgIHdpbGwgYWxsb2NhdGUgYHBhdGhgIGJlY2F1c2UgdGhlIGNhbGxlciBpcyBwYXNzaW5nIGBOVUxMYC4gU28sIGBwYXRoYCBpcyBpbml0aWFsbHkgYWxsb2NhdGVkLiBUaGVuLCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgaXMgY2FsbGVkLiBJdCAqbWlnaHQqIGZyZWUgYW5kIHJldHVybiBhIG5ldyBwYXRoLCBpdCBtaWdodCByZXR1cm4gdGhlIHNhbWUgcGF0aCwgb3IgaXQgbWlnaHQgcmV0dXJuIGFuIGVycm9yLgoKVGhlIHByb2JsZW0gaXMsIGlmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBzdWNjZWVkcywgaXQgKnJldHVybnMqIGBwYXRoYCwgd2hpY2ggY291bGQgYmUgcmVhbGxvY2F0ZWQgb3IgdGhlIG9yaWdpbmFsIHBhdGguIEJ1dCB0aGUgY29kZSAqY29tcGxldGVseSogaWdub3JlcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgISBBbmQsIGNydWNpYWxseSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGZyZWVzIGBwYXRoYCBpbiAqYW55KiBjYXNlIHdoZW4gaXQgcmV0dXJucyBzdWNjZXNzZnVsbHkhIFRoaXMgbG9va3MgbGlrZSBhIGRlZmluaXRlIHBvdGVudGlhbCBsZWFrLiBJIG5lZWQgdG8gZGlnIGludG8gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIHRvIGJlIHN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIxMDA6XHRcbjIxMDE6XHRcdC8qIHByb2JhYmx5IG5leHQgbGVhZiBoYXMgc3BhY2UgZm9yIHVzPyAqL1xuMjEwMjpcdFx0ZmV4ID0gRVhUX0xBU1RfRVhURU5UKGVoKTtcbjIxMDM6XHRcdG5leHQgPSBFWFRfTUFYX0JMT0NLUztcbjIxMDQ6XHRcdGlmIChsZTMyX3RvX2NwdShuZXdleHQtXHUwMDNlZWVfYmxvY2spIFx1MDAzZSBsZTMyX3RvX2NwdShmZXgtXHUwMDNlZWVfYmxvY2spKVxuMjEwNTpcdFx0XHRuZXh0ID0gZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHBhdGgpO1xuMjEwNjpcdFx0aWYgKG5leHQgIT0gRVhUX01BWF9CTE9DS1MpIHtcbjIxMDc6XHRcdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKm5wYXRoO1xuMjEwODpcdFxuMjEwOTpcdFx0XHRleHRfZGVidWcoaW5vZGUsIFwmIzM0O25leHQgbGVhZiBibG9jayAtICV1XFxuXCYjMzQ7LCBuZXh0KTtcbjIxMTA6XHRcdFx0bnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMLCBnYl9mbGFncyk7XG4yMTExOlx0XHRcdGlmIChJU19FUlIobnBhdGgpKSB7XG4yMTEyOlx0XHRcdFx0ZXJyID0gUFRSX0VSUihucGF0aCk7XG4yMTEzOlx0XHRcdFx0Z290byBlcnJvdXQ7XG4yMTE0Olx0XHRcdH1cbjIxMTU6XHRcdFx0QlVHX09OKG5wYXRoLVx1MDAzZXBfZGVwdGggIT0gcGF0aC1cdTAwM2VwX2RlcHRoKTtcbjIxMTY6XHRcdFx0ZWggPSBucGF0aFtkZXB0aF0ucF9oZHI7XG4yMTE3Olx0XHRcdGlmIChsZTE2X3RvX2NwdShlaC1cdTAwM2VlaF9lbnRyaWVzKSBcdTAwM2MgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfbWF4KSkge1xuMjExODpcdFx0XHRcdGV4dF9kZWJ1Zyhpbm9kZSwgXCYjMzQ7bmV4dCBsZWFmIGlzbiYjMzk7dCBmdWxsKCVkKVxcblwmIzM0OyxcbjIxMTk6XHRcdFx0XHRcdCAgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfZW50cmllcykpO1xuMjEyMDpcdFx0XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbjIxMjE6XHRcdFx0XHRwYXRoID0gbnBhdGg7XG4yMTIyOlx0XHRcdFx0Z290byBoYXNfc3BhY2U7XG4yMTIzOlx0XHRcdH1cbjIxMjQ6XHRcdFx0ZXh0X2RlYnVnKGlub2RlLCBcJiMzNDtuZXh0IGxlYWYgaGFzIG5vIGZyZWUgc3BhY2UoJWQsJWQpXFxuXCYjMzQ7LFxuMjEyNTpcdFx0XHRcdCAgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfZW50cmllcyksIGxlMTZfdG9fY3B1KGVoLVx1MDAzZWVoX21heCkpO1xuMjEyNjpcdFx0XHRleHQ0X2ZyZWVfZXh0X3BhdGgobnBhdGgpO1xuMjEyNzpcdFx0fVxuMjEyODpcdFxuMjEyOTpcdFx0LypcbjIxMzA6XHRcdCAqIFRoZXJlIGlzIG5vIGZyZWUgc3BhY2UgaW4gdGhlIGZvdW5kIGxlYWYuXG4yMTMxOlx0XHQgKiBXZSYjMzk7cmUgZ29ubmEgYWRkIGEgbmV3IGxlYWYgaW4gdGhlIHRyZWUuXG4yMTMyOlx0XHQgKi9cbjIxMzM6XHRcdGlmIChnYl9mbGFncyBcdTAwMjYgRVhUNF9HRVRfQkxPQ0tTX01FVEFEQVRBX05PRkFJTClcbjIxMzQ6XHRcdFx0bWJfZmxhZ3MgfD0gRVhUNF9NQl9VU0VfUkVTRVJWRUQ7XG4yMTM1Olx0XHRwYXRoID0gZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZSwgaW5vZGUsIG1iX2ZsYWdzLCBnYl9mbGFncyxcbjIxMzY6XHRcdFx0XHRcdFx0cGF0aCwgbmV3ZXh0KTtcbjIxMzc6XHRcdGlmIChJU19FUlIocGF0aCkpXG4yMTM4Olx0XHRcdHJldHVybiBwYXRoO1xuMjEzOTpcdFx0ZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpO1xuMjE0MDpcdFx0ZWggPSBwYXRoW2RlcHRoXS5wX2hkcjtcbjIxNDE6XHRcbjIxNDI6XHRoYXNfc3BhY2U6XG4yMTQzOlx0XHRuZWFyZXggPSBwYXRoW2RlcHRoXS5wX2V4dDtcbjIxNDQ6XHRcbjIxNDU6XHRcdGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCAmIzQzOyBkZXB0aCk7XG4yMTQ2Olx0XHRpZiAoZXJyKVxuMjE0NzpcdFx0XHRnb3RvIGVycm91dDtcbjIxNDg6XHRcbjIxNDk6XHRcdGlmICghbmVhcmV4KSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1ODUxCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgUGF0aCBIYW5kbGluZyoqCgpSaWdodCwgbGV0IG1lIHNlZS4uLiBJJiMzOTttIGxvb2tpbmcgYXQgaG93IGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBtYW5hZ2VzIHRoZSBgcGF0aGAgdmFyaWFibGUuIEl0JiMzOTtzIGJlY29taW5nIGNsZWFyIHRoYXQgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBpbnRlcmVzdGluZyBtZW1vcnkgbWFuYWdlbWVudCBiZWhhdmlvcnMsIHNwZWNpZmljYWxseSBzdXJyb3VuZGluZyB0aGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIG9mIGBwYXRoYCBhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byBgbnBhdGhgLiAgSSYjMzk7bSBub3RpbmcgdGhhdCB0aGVyZSBhcmUgdHdvIHByaW1hcnkgcGF0aHMsIG9yIG91dGNvbWVzLCBmb3IgYHBhdGhgLiBFaXRoZXIgYHBhdGhgIGdldHMgZnJlZWQgYW5kIGBucGF0aGAgKHdoaWNoIGlzIGEgbmV3IGFsbG9jYXRpb24pIGlzIHJldHVybmVkLCBvciB0aGUgb3JpZ2luYWwgYHBhdGhgIGdldHMgcmV0dXJuZWQgYWZ0ZXIgY3JlYXRpb24gb2YgYSBuZXcgbGVhZiB0aHJvdWdoIGBleHQ0X2V4dF9jcmVhdGVfbmV3X2xlYWZgLiBJIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBlYWNoIHNjZW5hcmlvIHBsYXlzIG91dCwgYXMgdGhpcyBpcyBhIHBvdGVudGlhbCBzb3VyY2UgZm9yIHN1YnRsZSBtZW1vcnkgZXJyb3JzIGlmIG5vdCBoYW5kbGVkIHByZWNpc2VseS4gSW4gcGFydGljdWxhciwgSSBtdXN0IGludmVzdGlnYXRlIHRoZSBpbXBsaWNhdGlvbnMgdGhpcyBoYXMgZm9yIGV4dGVybmFsIGNhbGxlcnMgb2YgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgLiBOb3csIHRvIGNvbnNpZGVyIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMgb2YgdGhpcyBiZWhhdmlvci4gSSYjMzk7bGwgbmVlZCB0byBleGFtaW5lIHRoZSBmdW5jdGlvbiYjMzk7cyBpbnRlcm5hbCBsb2dpYywgZXNwZWNpYWxseSBhcm91bmQgdGhlIHJldHVybiB2YWx1ZXMsIHRvIGVuc3VyZSB0aGUgY29kZSYjMzk7cyBpbnRlZ3JpdHkgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQgcmVtYWluIHNwb3Qtb24uIEkgc2hvdWxkIG5vdGUgdGhlIGZpbmFsIHN0YXRlcyBvZiB0aGUgYHBhdGhgIGFuZCBgbnBhdGhgIHZhcmlhYmxlcyBhZnRlciB0aGUgZnVuY3Rpb24gY29tcGxldGVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0ZW50cy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjIwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjAwOlx0bWVyZ2U6XG4yMjAxOlx0XHQvKiB0cnkgdG8gbWVyZ2UgZXh0ZW50cyAqL1xuMjIwMjpcdFx0aWYgKCEoZ2JfZmxhZ3MgXHUwMDI2IEVYVDRfR0VUX0JMT0NLU19TUExJVF9OT01FUkdFKSlcbjIyMDM6XHRcdFx0ZXh0NF9leHRfdHJ5X3RvX21lcmdlKGhhbmRsZSwgaW5vZGUsIHBhdGgsIG5lYXJleCk7XG4yMjA0Olx0XG4yMjA1Olx0XHQvKiB0aW1lIHRvIGNvcnJlY3QgYWxsIGluZGV4ZXMgYWJvdmUgKi9cbjIyMDY6XHRcdGVyciA9IGV4dDRfZXh0X2NvcnJlY3RfaW5kZXhlcyhoYW5kbGUsIGlub2RlLCBwYXRoKTtcbjIyMDc6XHRcdGlmIChlcnIpXG4yMjA4Olx0XHRcdGdvdG8gZXJyb3V0O1xuMjIwOTpcdFxuMjIxMDpcdFx0ZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCAmIzQzOyBwYXRoLVx1MDAzZXBfZGVwdGgpO1xuMjIxMTpcdFx0aWYgKGVycilcbjIyMTI6XHRcdFx0Z290byBlcnJvdXQ7XG4yMjEzOlx0XG4yMjE0Olx0XHRyZXR1cm4gcGF0aDtcbjIyMTU6XHRcbjIyMTY6XHRlcnJvdXQ6XG4yMjE3Olx0XHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XG4yMjE4Olx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuMjIxOTpcdH1cbjIyMjA6XHRcbjIyMjE6XHRzdGF0aWMgaW50IGV4dDRfZmlsbF9lc19jYWNoZV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4yMjIyOlx0XHRcdFx0XHQgICBleHQ0X2xibGtfdCBibG9jaywgZXh0NF9sYmxrX3QgbnVtLFxuMjIyMzpcdFx0XHRcdFx0ICAgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbylcbjIyMjQ6XHR7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM2NjE4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjIwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBFeHQ0IElubGluZSBEYXRhIENvbnZlcnNpb24gYW5kIEV4dGVudCBIYW5kbGluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgaGFzIGEgbWVtb3J5IGxlYWsuIEl0IHJldHVybnMgYSBwYXRoIG9uIHN1Y2Nlc3MgYW5kIGZyZWVzIHRoZSBwYXRoLCB3aGljaCBtZWFucyB0aGUgY2FsbGVyIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4gSG93ZXZlciwgdGhlIGNhbGxlciBpbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGRvZXNuJiMzOTt0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGFuZCAqZG9lc24mIzM5O3QqIGZyZWUgYHBhdGhgIGFmdGVyIGEgc3VjY2Vzc2Z1bCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgY2FsbC4gVGhpcyBjcmVhdGVzIGEgbWVtb3J5IGxlYWsgYmVjYXVzZSBwYXRoIHdpbGwgbmV2ZXIgYmUgZnJlZWQuIFRoZSBxdWVzdGlvbiBpcywgd291bGQgS01TQU4gY2F0Y2ggdGhpcz8gTm8sIGl0IGNhdGNoZXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtNRU1MRUFLLCBob3dldmVyLCB3aWxsIGNhdGNoIG1lbW9yeSBsZWFrcy4KCkJ1dCwgYSBzZWNvbmQgdGhvdWdodCBpcyB0aGUgY29kZS4gTGV0JiMzOTtzIHRyYWNlIGl0IGNhcmVmdWxseS4gV2FpdCwgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlciwgdGhlIGNvZGUgd291bGQgZGVyZWZlcmVuY2UgaXQgaW4gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgLiBUaGF0IHdvdWxkIGJlIGEgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlLCB3aGljaCBpcyBhbiBpbW1lZGlhdGUgY3Jhc2ggdGhhdCBLQVNBTiBvciB0aGUga2VybmVsJiMzOTtzIG9vcHMgZGV0ZWN0aW9uIHNob3VsZCBjYXRjaC4KCk1vdmluZyBvbiB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIEkgbmVlZCB0byBzY3J1dGluaXplIGl0IGZvciBwb3NzaWJsZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gRmlyc3QsIGl0IGFsbG9jYXRlcyBhIGJ1ZmZlciBgYnVmYCBhbmQgcmVhZHMgaW5saW5lIGRhdGEgaW50byBpdC4gVGhlIHBvdGVudGlhbCBpc3N1ZSBJIHNlZSBpcyB0aGF0IGlmIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIHJldHVybnMgZmV3ZXIgYnl0ZXMgdGhhbiBleHBlY3RlZCwgdGhlbiBwYXJ0cyBvZiBgYnVmYCBhcmUgbGVmdCB1bmluaXRpYWxpemVkLiBIb3dldmVyLCB0aGUgY29kZSYjMzk7cyBsb2dpYyBpcyB0aGF0IHRoZSBgaW5saW5lX3NpemVgIGlzIGJhc2VkIG9uIHRoZSBkYXRhIHRvIGJlIGNvcGllZCwgc28gaXQgc2hvdWxkIGJlIGltcG9zc2libGUgdG8gcmVhZCBsZXNzIHRoYW4gdGhlIGV4cGVjdGVkIHNpemUuCgpCdXQgd2FpdCwgd2hhdCBpZiB0aGUgaW5vZGUgaXMgYSBkaXJlY3Rvcnk/IFRoZSBwYXRjaCBpcyBpbXBvcnRhbnQgaW4gY29udGV4dCwgYmVjYXVzZSB0aGUgb3JpZ2luYWwgY29kZSAqZG9lcyBub3QqIGNvcHkgZGF0YSBpbnRvIGBkYXRhX2JoLSZndDtiX2RhdGFgIGlmIGBTX0lTRElSKGlub2RlLSZndDtpX21vZGUpYCBpcyB0cnVlLiBJbnN0ZWFkLCBpdCBjYWxscyBgZXh0NF91cGRhdGVfaW5saW5lX2RpcmAuIEkgc2hvdWxkIGNoZWNrIGlmIHRoZSBtb2RpZmljYXRpb24gdG8gdGhhdCBzZWN0aW9uIG9mIGNvZGUgaXMgaW1wb3J0YW50LiBUaGUgcGF0Y2ggZG9lc24mIzM5O3Qgc2hvdyBtb2RpZmljYXRpb24gdG8gaXQsIGJ1dCBpdCYjMzk7cyBjYWxsZWQgYW55d2F5LgoKT2theSwgbGV0IG1lIGdvIGNoZWNrIHRoZSBvcmlnaW5hbCBjb2RlIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNTA6XHRcdGlmICghYnVmKSB7XG4xMTUxOlx0XHRcdGVycm9yID0gLUVOT01FTTtcbjExNTI6XHRcdFx0Z290byBvdXQ7XG4xMTUzOlx0XHR9XG4xMTU0Olx0XG4xMTU1Olx0XHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XG4xMTU2Olx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTU3Olx0XHRcdGdvdG8gb3V0O1xuMTE1ODpcdFxuMTE1OTpcdFx0LypcbjExNjA6XHRcdCAqIE1ha2Ugc3VyZSB0aGUgaW5saW5lIGRpcmVjdG9yeSBlbnRyaWVzIHBhc3MgY2hlY2tzIGJlZm9yZSB3ZSB0cnkgdG9cbjExNjE6XHRcdCAqIGNvbnZlcnQgdGhlbSwgc28gdGhhdCB3ZSBhdm9pZCB0b3VjaGluZyBzdHVmZiB0aGF0IG5lZWRzIGZzY2suXG4xMTYyOlx0XHQgKi9cbjExNjM6XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbjExNjQ6XHRcdFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cdTAwM2ViaCxcbjExNjU6XHRcdFx0XHRcdFx0YnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTE2NjpcdFx0XHRcdFx0XHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbjExNjc6XHRcdFx0aWYgKGVycm9yKVxuMTE2ODpcdFx0XHRcdGdvdG8gb3V0O1xuMTE2OTpcdFx0fVxuMTE3MDpcdFxuMTE3MTpcdFx0bWVtc2V0KFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcbjExNzI6XHRcdGFyLmlub2RlID0gaW5vZGU7XG4xMTczOlx0XHRhci5sb2dpY2FsID0gMDtcbjExNzQ6XHRcdGFyLmxlbiA9IDE7XG4xMTc1Olx0XHRpZiAoU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpKVxuMTE3NjpcdFx0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuMTE3NzpcdFx0ZWxzZVxuMTE3ODpcdFx0XHRhci5mbGFncyA9IDA7XG4xMTc5Olx0XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4xMTgwOlx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTgxOlx0XHRcdGdvdG8gb3V0O1xuMTE4MjpcdFxuMTE4MzpcdFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4xMTg0Olx0XHRpZiAoIWRhdGFfYmgpIHtcbjExODU6XHRcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuMTE4NjpcdFx0XHRnb3RvIG91dF9iaDtcbjExODc6XHRcdH1cbjExODg6XHRcbjExODk6XHRcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTE5MDpcdFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBkYXRhX2JoLFxuMTE5MTpcdFx0XHRcdFx0XHQgICAgICAgRVhUNF9KVFJfTk9ORSk7XG4xMTkyOlx0XHRpZiAoZXJyb3IpIHtcbjExOTM6XHRcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbjExOTQ6XHRcdFx0ZXJyb3IgPSAtRUlPO1xuMTE5NTpcdFx0XHRnb3RvIG91dF9iaDtcbjExOTY6XHRcdH1cbjExOTc6XHRcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4xMTk4Olx0XG4xMTk5Olx0XHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDA3OAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHByb2Nlc3NpbmcgdGhlIGNvZGU6CgoqKkRpdmluZyBpbnRvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24mIzM5O3Mgcm9sZSBpbiB0aGUgbGFyZ2VyIHBpY3R1cmUgb2YgdGhlIGV4dDQgZmlsZXN5c3RlbS4gSSYjMzk7bSBhc3N1bWluZyB0aGlzIGlzIGFib3V0IGhhbmRsaW5nIGlubGluZSBkYXRhLCB3aGljaCBpcyBlc3NlbnRpYWxseSBzdG9yaW5nIGZpbGUgY29udGVudCBkaXJlY3RseSB3aXRoaW4gdGhlIGlub2RlIGl0c2VsZiwgcmlnaHQ/IFRoYXQmIzM5O3MgYW4gb3B0aW1pemF0aW9uIHRvIHJlZHVjZSBkaXNrIEkvTywgc28gaXQmIzM5O3MgaW50ZXJlc3RpbmcuIFRoZSBgX25vbG9ja2Agc3VmZml4IHN1Z2dlc3RzIHRoaXMgaXMgbGlrZWx5IGJlaW5nIGNhbGxlZCBmcm9tIGNvZGUgdGhhdCBhbHJlYWR5IGhhcyB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcgZG9uZS4gR29vZCwgdGhhdCBzaW1wbGlmaWVzIHRoaW5ncyBhIGJpdC4gSSBjYW4gZm9jdXMgb24gdGhlIGNvcmUgbG9naWMgdGhlbi4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdHJpZ2dlcnMgdGhpcyBjb252ZXJzaW9uLCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCBoYXBwZW5zLCBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKmRvaW5nKiB0byBtYWtlIHRoYXQgY29udmVyc2lvbi4gSSBuZWVkIHRvIHRyYWNlIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIHNlZSBob3cgdGhlIGlub2RlIGFuZCB0aGUgb24tZGlzayBmb3JtYXQgYXJlIGNoYW5nZWQsIGFuZCBvZiBjb3Vyc2UsIGVuc3VyZSBjb25zaXN0ZW5jeSB0aHJvdWdob3V0IHRoZSBwcm9jZXNzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGhhbmRsZXMgZXJyb3JzIGFuZCBwYXJ0aWFsIGNvbnZlcnNpb25zLCBwYXJ0aWN1bGFybHkgZm9yIHBvd2VyLWZhaWwgc2NlbmFyaW9zLiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBmYWlscyBoYWxmd2F5IHRocm91Z2g/IEhvdyBkb2VzIGl0IG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGVzeXN0ZW0/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBob3cgZG8gdGhleSBlbnN1cmUgdGhhdCB0aGUgY29udmVyc2lvbiBpcyBhdG9taWMgZnJvbSB0aGUgdXNlciYjMzk7cyBwZXJzcGVjdGl2ZSwgZXZlbiBpZiB1bmRlciB0aGUgaG9vZCwgdGhlcmUgYXJlIGEgc2VyaWVzIG9mIHN0ZXBzIHRvIGFjaGlldmUgdGhpcy4gTm93LCBsZXQmIzM5O3Mgc2VlIHdoZXJlIHRvIGJlZ2luLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTIwMDpcdFx0XHRtZW1jcHkoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpO1xuMTIwMTpcdFx0XHRzZXRfYnVmZmVyX3VwdG9kYXRlKGRhdGFfYmgpO1xuMTIwMjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTIwMzpcdFx0XHRlcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSxcbjEyMDQ6XHRcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4xMjA1Olx0XHR9IGVsc2Uge1xuMTIwNjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTIwNzpcdFx0XHRpbm9kZS1cdTAwM2VpX3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuMTIwODpcdFx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuMTIwOTpcdFx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuMTIxMDpcdFxuMTIxMTpcdFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuMTIxMjpcdFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuMTIxMzpcdFx0XHRcdCAgYnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTIxNDpcdFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4xMjE1Olx0XHRcdGlmICghZXJyb3IpXG4xMjE2Olx0XHRcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XG4xMjE3Olx0XHR9XG4xMjE4Olx0XG4xMjE5Olx0XHRpZiAoZXJyb3IpXG4xMjIwOlx0XHRcdGdvdG8gb3V0X2JoO1xuMTIyMTpcdFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBuZXdibG9jaywgYXIubGVuKTtcbjEyMjI6XHRvdXRfYmg6XG4xMjIzOlx0XHRpZiAoZXJyb3IpXG4xMjI0Olx0XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFyLmxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuMTIyNTpcdFx0YnJlbHNlKGRhdGFfYmgpO1xuMTIyNjpcdG91dDpcbjEyMjc6XHRcdGtmcmVlKGJ1Zik7XG4xMjI4Olx0XHRyZXR1cm4gZXJyb3I7XG4xMjI5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDk4MQoJCQkJCQkJb3V0cHV0OiAyNjIKCQkJCQkJCXRob3VnaHRzOiAyNjQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoKioKCk9rYXksIGxldCBtZSB3YWxrIHRocm91Z2ggdGhpcy4gSSBzZWUgdGhhdCBpZiBpdCYjMzk7cyBhIGRpcmVjdG9yeSwgYGV4dDRfaW5pdF9kaXJibG9ja2AgaXMgY2FsbGVkIHdpdGggYGJ1ZmAuIEJ1dCBgYnVmYCBpcyBpbml0aWFsaXplZCBieSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgc28gdGhhdCYjMzk7cyBmaW5lOyBpdCYjMzk7cyBmdWxseSBpbml0aWFsaXplZC4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLgoKV2FpdCwgd2hhdCBhYm91dCBwb3RlbnRpYWwgZXJyb3JzIGluIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgPyBJZiBpdCBmYWlscywgaXQgZ29lcyB0byBgb3V0YCwgd2hpY2ggZnJlZXMgYGJ1ZmAuIE9rYXksIHN0aWxsIHNhZmUuCgpXaGF0IGlmIGl0IHJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSwgbGVzcyB0aGFuIHRoZSBgaW5saW5lX3NpemVgPyBJIHJlbWVtYmVyIG15IHByZXZpb3VzIGFuYWx5c2lzLCB0aGF0IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIGdvaW5nIHRvIHJldHVybiB0aGUgcmlnaHQgc2l6ZS4gYGlubGluZV9zaXplYCBpcyBjYWxjdWxhdGVkIHdpdGggYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgLiBTbywgSSYjMzk7bSBzdXJlIGl0JiMzOTtsbCByZXR1cm4gdGhlIGV4cGVjdGVkIHNpemUuIEV2ZW4gaWYgdGhlIHNpemUgb2YgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgIGlzIGNvcnJ1cHQsIGBpbmxpbmVfc2l6ZWAgaXMgYWx3YXlzIGNvbnNpc3RlbnQgYmVjYXVzZSBpdCYjMzk7cyBjYWxjdWxhdGVkIGZyb20gdGhlIGBlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplYC4gQnV0LCB3aGF0IGlmIHRoZXJlJiMzOTtzIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24gdG8gYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgPyBOb3BlLCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIHdpdGggYSBsb2NrIGhlbGQuIEkmIzM5O20gY2VydGFpbiB0aGF0IHRoZSBpbmxpbmUgZGF0YSBpcyBub3QgY29uY3VycmVudGx5IG1vZGlmaWVkLiBBbmQgZXZlbiBpZiBpdCB3ZXJlLCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB3b3VsZCBqdXN0IGNvcHkgZmV3ZXIgYnl0ZXMsIGxlYXZpbmcgdGhlIHJlc3Qgb2YgYGJ1ZmAgdW5pbml0aWFsaXplZC4gQnV0LCBpcyB0aGlzIGEgS01TQU4tc3BlY2lmaWMgaXNzdWU/IElmIGl0JiMzOTtzIHBhcnRpYWxseSB1bmluaXRpYWxpemVkIGFuZCB3cml0dGVuIHRvIGRpc2ssIGl0JiMzOTtzIGFuIGluZm8tbGVhayB0byBkaXNrLiBCdXQgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AsIHdoaWNoIGRvZXNuJiMzOTt0IHplcm8gd2l0aG91dCB0aGUgYF9fR0ZQX1pFUk9gIGZsYWcuIEJ1dCwgaGVyZSwgSSYjMzk7bSBzdXJlIHRoYXQgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgc2hvdWxkIHJldHVybiBmZXdlciBieXRlcywgYmVjYXVzZSBgaW5saW5lX3NpemVgIGlzIGV4YWN0bHkgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhLgoKQWxyaWdodCwgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIHBhdGNoIGl0c2VsZiBhZ2Fpbi4gVGhlIHBhdGNoIGlzIGNoYW5naW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBhbGxvY2F0ZSB0aGUgYmxvY2sgZmlyc3QsIHRoZW4gY29weSB0aGUgZGF0YSwgdGhlbiBzZXQgdGhlIGlubGluZSBkYXRhIGJsb2NrLiBJdCB1c2VkIHRvIGNhbGwgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLCB0aGVuIGBleHQ0X21hcF9ibG9ja3NgLiBUaGUgY3JpdGljYWwgcG9pbnQgaXMgaWYgYGV4dDRfbWFwX2Jsb2Nrc2AgZmFpbGVkLCBpdCBjYWxsZWQgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIHByb2JsZW0gbGF5OiBpZiBgZXh0NF9jcmVhdGVfaW5saW5lX2RhdGFgIGZhaWxlZCwgaXQgcHJpbnRlZCBhbiBlcnJvciBhbmQgcmV0dXJuZWQhIERhdGEgbG9zcyEgVGhlIG5ldyBjb2RlIGFsbG9jYXRlcyB0aGUgYmxvY2ssIGFuZCBvbmx5IGlmIHRoYXQgc3VjY2VlZHMsIGl0IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhLiBUaGlzIGlzIGFib3V0IHByZXZlbnRpbmcgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24sIG5vdCB1bmluaXRpYWxpemVkIG1lbW9yeS4KCklzIHRoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2A/IE5vLiBUaGUgY29kZSB1c2VzIGBtZW1zZXRgIHRvIHplcm8gYGlfYmxvY2tgIGFuZCBgaV9kYXRhYC4gVGhlbiBpdCBpbml0aWFsaXplcyBgbmV3ZXhgIGFuZCBjYWxscyBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYC4gQXMgSSB2ZXJpZmllZCwgdGhhdCBpbml0aWFsaXplcyBpdC4KCkFyZSB0aGVyZSBhbnkgb3RoZXIgc3RydWN0cz8gTGV0IG1lIHNlZS4gYGV4dDRfeGF0dHJfaWJvZHlfZmluZGAgYW5kIGBleHQ0X3hhdHRyX2luZm9gLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBleHBsaWNpdCB6ZXJvaW5nLiBPa2F5LCBhbGwgZ29vZC4gV2hhdCBhYm91dCBgYXJgPyBgbWVtc2V0YCBpcyBjYWxsZWQgb24gdGhhdDsgaXQmIzM5O3MgZnVsbHkgemVyb2VkLiBTbywgdGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZC4gSXQgZml4ZXMgdGhlIGRhdGEgbG9zcyBieSBhbGxvY2F0aW5nIHRoZSBibG9jayBmaXJzdC4KCklzIHRoZXJlIGFuIGluZm8tbGVhaz8gTm8sIGBkYXRhX2JoLSZndDtiX2RhdGFgIGlzIHplcm9lZCBiZWZvcmUgdGhlIGNvcHksIGFuZCBgYnVmYCBpcyBmdWxseSBpbml0aWFsaXplZC4KClNvLCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIEl0IGZpeGVzIGEgbG9naWMgLyBlcnJvciBoYW5kbGluZyBidWcgdGhhdCBjb3VsZCBsZWFkIHRvIGRhdGEgbG9zcyBvciBjb3JydXB0aW9uLiBTdGFuZGFyZCB0ZXN0aW5nLCBLQVNBTiwgb3Igc3l6a2FsbGVyIHdvdWxkIGNhdGNoIHRoaXMuIE5vIG5lZWQgZm9yIEtNU0FOLgoKSG9sZCBvbiwgbGV0IG1lIGRvdWJsZS1jaGVjayBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgYW5kIGBuZXdleGAuIGBuZXdleGAgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgYW5kIGhhcyA0IGZpZWxkczogYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2AuIEFsbCBvZiB0aGVtIGFyZSBpbml0aWFsaXplZCwgYW5kIHRoZXJlJiMzOTtzIG5vIHBhZGRpbmcuIE9rYXksIHRoYXQmIzM5O3MgY2xlYXIuCgpPa2F5LCBsZXQgbWUgZG91YmxlIGNoZWNrIHRoZSBzdHJ1Y3R1cmVzIGFnYWluLCBgZXh0NF94YXR0cl9pYm9keV9maW5kYCBhbmQgYGV4dDRfeGF0dHJfaW5mb2AuIGBleHQ0X3hhdHRyX2lib2R5X2ZpbmRgIGluaXRpYWxpemVkIGBpcy5zLm5vdF9mb3VuZGAgdG8gMCwgd2hpY2ggemVyb2VzIHRoZSBzdHJ1Y3QuIGBleHQ0X3hhdHRyX2luZm9gIGZ1bGx5IGluaXRpYWxpemVzIGFsbCBmaWVsZHMuCgpZdXAsIHRoZXJlJiMzOTtzIGFic29sdXRlbHkgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaGVyZS4KCkkmIzM5O20gc2V0dGluZyBOZWVkc0tNU0FOIHRvIGZhbHNlIGFuZCBnaXZpbmcgdGhlIHJlYXNvbmluZy4KClJlYXNvbmluZzogVGhpcyBwYXRjaCBtb2RpZmllcyB0aGUKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIGJsb2NrIGFsbG9jYXRpb24gb3JkZXIgaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIHRvIHByZXZlbnQgcG90ZW50aWFsIGRhdGEgbG9zcyB3aGVuIGNvbnZlcnRpbmcgaW5saW5lIGRhdGEgdG8gYSBibG9jay4gUHJldmlvdXNseSwgaWYgYmxvY2sgYWxsb2NhdGlvbiBmYWlsZWQsIGl0IGF0dGVtcHRlZCB0byByZXN0b3JlIHRoZSBpbmxpbmUgZGF0YSwgd2hpY2ggY291bGQgZmFpbCBhbmQgY2F1c2UgZGF0YSBsb3NzLiBUaGUgbmV3IGxvZ2ljIGFsbG9jYXRlcyB0aGUgYmxvY2sgZmlyc3QgYW5kIG9ubHkgcmVtb3ZlcyB0aGUgaW5saW5lIGRhdGEgdXBvbiBzdWNjZXNzLlxuXG5BbGwgc3RydWN0dXJlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoZSBwYXRjaCAoYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgb3IgZXhwbGljaXRseSB6ZXJvZWQgKHZpYSBgbWVtc2V0YCBvciBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHdoaWNoIHplcm9lcyB0aGUgcmVzdCkuIFRoZSBidWZmZXIgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBpcyBleHBsaWNpdGx5IHplcm9lZCBiZWZvcmUgY29weWluZyB0aGUgaW5saW5lIGRhdGEuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgcGFkZGluZyBsZWFrcywgb3IgaW5mby1sZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgY3Jhc2hlcyAoZS5nLiwgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlcikgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIG9yIGtlcm5lbCBvb3BzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cblxuQWxsIHN0cnVjdHVyZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGUgcGF0Y2ggKGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLCBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG9yIGV4cGxpY2l0bHkgemVyb2VkICh2aWEgYG1lbXNldGAgb3IgcGFydGlhbCBpbml0aWFsaXphdGlvbiB3aGljaCB6ZXJvZXMgdGhlIHJlc3QpLiBUaGUgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTU6NTk6NTUuMTc4NjU4MzRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTU5NzA5OTU3MTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cXG5cXG5BbGwgc3RydWN0dXJlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoZSBwYXRjaCAoYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgb3IgZXhwbGljaXRseSB6ZXJvZWQgKHZpYSBgbWVtc2V0YCBvciBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHdoaWNoIHplcm9lcyB0aGUgcmVzdCkuIFRoZSBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgd2F5IGV4dDQgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBvZiBpbmxpbmUgZGF0YSB0byByZWd1bGFyIGJsb2Nrcy4gSXQgcmVwbGFjZXMgYGV4dDRfbWFwX2Jsb2Nrc2Agd2l0aCBgZXh0NF9tYl9uZXdfYmxvY2tzYCBhbmQgaW50cm9kdWNlcyBhIG5ldyBoZWxwZXIgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCB0byBkaXJlY3RseSBzZXQgdGhlIGJsb2NrIHdpdGhvdXQgZGVzdHJveWluZyB0aGUgaW5saW5lIGRhdGEgZmlyc3QuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBleHQ0IGxvZ2ljLiBUaGUgbW9kaWZpZWQgZnVuY3Rpb24gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgLCB3aGljaCBhcmUgcmVhY2hhYmxlIHZpYSB2YXJpb3VzIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGRpcmVjdG9yeSBlbnRyeSBhZGRpdGlvbnMuIFRoZXJlZm9yZSwgaXQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTU6NTk6NTUuMTc4NjY0NjQ5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI4MzY1MjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU3VuIEF1ZyAxNiAxNTo1OTo1MyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuY1xcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjJhOTI5OWVhNDE0NmMgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xcbisrKyBiL2ZzL2V4dDQvaW5saW5lLmNcXG5AQCAtMTQsNiArMTQsNyBAQFxcbiAjaW5jbHVkZSBcXFwiZXh0NC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwieGF0dHIuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInRydW5jYXRlLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gXFxuICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQVxcdFxcXCJkYXRhXFxcIlxcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcXHQoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpXFxuQEAgLTEwNzAsMjEgKzEwNzEsNjcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLVxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYyxcXG4tXFx0XFx0XFx0XFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcXG4rc3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbitcXHRcXHRcXHRcXHQgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pXFxuIHtcXG4tXFx0aW50IHJldDtcXG4rXFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xcbitcXHRzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0ge1xcbitcXHRcXHQucyA9IHsgLm5vdF9mb3VuZCA9IDAsIH0sXFxuK1xcdH07XFxuK1xcdHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaSA9IHtcXG4rXFx0XFx0Lm5hbWVfaW5kZXggPSBFWFQ0X1hBVFRSX0lOREVYX1NZU1RFTSxcXG4rXFx0XFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxcbitcXHRcXHQudmFsdWUgPSBOVUxMLFxcbitcXHRcXHQudmFsdWVfbGVuID0gMCxcXG4rXFx0fTtcXG4rXFx0aW50IGVycm9yO1xcbiBcXG4tXFx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xcbi1cXHRpZiAocmV0KSB7XFxuLVxcdFxcdGV4dDRfbXNnKGlub2RlLVxcdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxcbi1cXHRcXHRcXHRcXFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXFxcIixcXG4tXFx0XFx0XFx0aW5vZGUtXFx1MDAzZWlfaW5vLCByZXQpO1xcbi1cXHRcXHRyZXR1cm47XFxuK1xcdGRvd25fd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0aWYgKGVycm9yKSB7XFxuK1xcdFxcdHVwX3dyaXRlKFxcdTAwMjZlaS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuK1xcdFxcdHJldHVybiBlcnJvcjtcXG4gXFx0fVxcbi1cXHRleHQ0X3dyaXRlX2lubGluZV9kYXRhKGlub2RlLCBpbG9jLCBidWYsIDAsIGlubGluZV9zaXplKTtcXG4tXFx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFxcdTAwMjZpLCBcXHUwMDI2aXMpO1xcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRCVUZGRVJfVFJBQ0UoaXMuaWxvYy5iaCwgXFxcImdldF93cml0ZV9hY2Nlc3NcXFwiKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLVxcdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcXG4rXFx0aWYgKGVycm9yKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCBcXHUwMDI2aSwgXFx1MDAyNmlzKTtcXG4rXFx0aWYgKGVycm9yKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bWVtc2V0KCh2b2lkICopZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlzLmlsb2MpLVxcdTAwM2VpX2Jsb2NrLFxcbitcXHRcXHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcXG4rXFx0bWVtc2V0KGVpLVxcdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xcbitcXG4rXFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cXHUwMDNlaV9zYikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0KFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkgfHwgU19JU1JFRyhpbm9kZS1cXHUwMDNlaV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLVxcdTAwM2VpX21vZGUpKSkge1xcbitcXHRcXHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xcbitcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcXG4rXFxuK1xcdFxcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XFxuK1xcdFxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XFxuK1xcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXgsIGJsb2NrKTtcXG4rXFx0XFx0ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXgsIDApO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XFxuK1xcdH1cXG4rXFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTtcXG4rXFx0Z2V0X2JoKGlzLmlsb2MuYmgpO1xcbitcXHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcXG4rXFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XFxuK1xcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4rb3V0OlxcbitcXHRicmVsc2UoaXMuaWxvYy5iaCk7XFxuK1xcdGlmIChlcnJvciA9PSAtRU5PREFUQSlcXG4rXFx0XFx0ZXJyb3IgPSAwO1xcbitcXHR1cF93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbitcXHRyZXR1cm4gZXJyb3I7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbkBAIC0xMDk0LDggKzExNDEsOSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4gXFx0aW50IGVycm9yO1xcbiBcXHR2b2lkICpidWYgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcXG4gXFx0aW50IGlubGluZV9zaXplO1xcbitcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbitcXHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XFxuIFxcbiBcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4gXFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xcbkBAIC0xMTIwLDI1ICsxMTY4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0ZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xcbi1cXHRpZiAoZXJyb3IpXFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXG4tXFx0bWFwLm1fbGJsayA9IDA7XFxuLVxcdG1hcC5tX2xlbiA9IDE7XFxuLVxcdG1hcC5tX2ZsYWdzID0gMDtcXG4tXFx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXFx1MDAyNm1hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7XFxuK1xcdG1lbXNldChcXHUwMDI2YXIsIDAsIHNpemVvZihhcikpO1xcbitcXHRhci5pbm9kZSA9IGlub2RlO1xcbitcXHRhci5sb2dpY2FsID0gMDtcXG4rXFx0YXIubGVuID0gMTtcXG4rXFx0aWYgKFNfSVNSRUcoaW5vZGUtXFx1MDAzZWlfbW9kZSkpXFxuK1xcdFxcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XFxuK1xcdGVsc2VcXG4rXFx0XFx0YXIuZmxhZ3MgPSAwO1xcbitcXHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFxcdTAwMjZhciwgXFx1MDAyNmVycm9yKTtcXG4gXFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4tXFx0XFx0Z290byBvdXRfcmVzdG9yZTtcXG4tXFx0aWYgKCEobWFwLm1fZmxhZ3MgXFx1MDAyNiBFWFQ0X01BUF9NQVBQRUQpKSB7XFxuLVxcdFxcdGVycm9yID0gLUVJTztcXG4tXFx0XFx0Z290byBvdXRfcmVzdG9yZTtcXG4tXFx0fVxcbitcXHRcXHRnb3RvIG91dDtcXG4gXFxuLVxcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXFx1MDAzZWlfc2IsIG1hcC5tX3BibGspO1xcbitcXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVxcdTAwM2VpX3NiLCBuZXdibG9jayk7XFxuIFxcdGlmICghZGF0YV9iaCkge1xcbiBcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcbiBcXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG5AQCAtMTE0Nyw3ICsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuIFxcdGlmIChlcnJvcikge1xcbiBcXHRcXHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbiBcXHRcXHRlcnJvciA9IC1FSU87XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcdG1lbXNldChkYXRhX2JoLVxcdTAwM2ViX2RhdGEsIDAsIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuIFxcbkBAIC0xMTcxLDEyICsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbiBcXHRcXHRcXHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcXG4gXFx0fVxcbiBcXG4tb3V0X3Jlc3RvcmU6XFxuIFxcdGlmIChlcnJvcilcXG4tXFx0XFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xcbi1cXG4tb3V0OlxcbitcXHRcXHRnb3RvIG91dF9iaDtcXG4rXFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBuZXdibG9jaywgYXIubGVuKTtcXG4rb3V0X2JoOlxcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFyLmxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbiBcXHRicmVsc2UoZGF0YV9iaCk7XFxuK291dDpcXG4gXFx0a2ZyZWUoYnVmKTtcXG4gXFx0cmV0dXJuIGVycm9yO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE1OjU5OjU2LjYwNzk5MjExNloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjUxNzcyNTQ0NDU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFcIixcbiAgICBcImV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgd2F5IGV4dDQgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBvZiBpbmxpbmUgZGF0YSB0byByZWd1bGFyIGJsb2Nrcy4gSXQgcmVwbGFjZXMgYGV4dDRfbWFwX2Jsb2Nrc2Agd2l0aCBgZXh0NF9tYl9uZXdfYmxvY2tzYCBhbmQgaW50cm9kdWNlcyBhIG5ldyBoZWxwZXIgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCB0byBkaXJlY3RseSBzZXQgdGhlIGJsb2NrIHdpdGhvdXQgZGVzdHJveWluZyB0aGUgaW5saW5lIGRhdGEgZmlyc3QuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBleHQ0IGxvZ2ljLiBUaGUgbW9kaWZpZWQgZnVuY3Rpb24gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgLCB3aGljaCBhcmUgcmVhY2hhYmxlIHZpYSB2YXJpb3VzIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGRpcmVjdG9yeSBlbnRyeSBhZGRpdGlvbnMuIFRoZXJlZm9yZSwgaXQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmNcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjJhOTI5OWVhNDE0NmMgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2lubGluZS5jXG4rKysgYi9mcy9leHQ0L2lubGluZS5jXG5AQCAtMTQsNiArMTQsNyBAQFxuICNpbmNsdWRlIFwiZXh0NC5oXCJcbiAjaW5jbHVkZSBcInhhdHRyLmhcIlxuICNpbmNsdWRlIFwidHJ1bmNhdGUuaFwiXG4rI2luY2x1ZGUgXCJleHQ0X2V4dGVudHMuaFwiXG4gXG4gI2RlZmluZSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBXHRcImRhdGFcIlxuICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRVx0KChzaXplb2YoX19sZTMyKSAqIEVYVDRfTl9CTE9DS1MpKVxuQEAgLTEwNzAsMjEgKzEwNzEsNjcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbitzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4rXHRcdFx0XHQgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pXG4ge1xuLVx0aW50IHJldDtcbitcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4rXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcbitcdH07XG4rXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4rXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG4rXHRcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcbitcdFx0LnZhbHVlID0gTlVMTCxcbitcdFx0LnZhbHVlX2xlbiA9IDAsXG4rXHR9O1xuK1x0aW50IGVycm9yO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXCIsXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbitcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdHJldHVybiBlcnJvcjtcbiBcdH1cbi1cdGV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpO1xuLVx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rXHRpZiAoZXJyb3IpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFwiZ2V0X3dyaXRlX2FjY2Vzc1wiKTtcbitcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRtZW1zZXQoKHZvaWQgKilleHQ0X3Jhd19pbm9kZShcdTAwMjZpcy5pbG9jKS1cdTAwM2VpX2Jsb2NrLFxuK1x0XHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdG1lbXNldChlaS1cdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xuK1xuK1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbitcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuK1x0XHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcbitcbitcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTtcbitcdFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcbitcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4rXHRcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuK1x0fSBlbHNlIHtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4rXHR9XG4rXHRleHQ0X2NsZWFyX2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpO1xuK1x0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuK1x0ZXJyb3IgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4rXHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4rb3V0OlxuK1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuK1x0aWYgKGVycm9yID09IC1FTk9EQVRBKVxuK1x0XHRlcnJvciA9IDA7XG4rXHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdHJldHVybiBlcnJvcjtcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5AQCAtMTA5NCw4ICsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpbnQgZXJyb3I7XG4gXHR2b2lkICpidWYgPSBOVUxMO1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDtcbi1cdHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwO1xuIFx0aW50IGlubGluZV9zaXplO1xuK1x0ZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMDtcbitcdHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjtcbiBcbiBcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuIFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuQEAgLTExMjAsMjUgKzExNjgsMjIgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRlcnJvciA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFwLm1fbGJsayA9IDA7XG4tXHRtYXAubV9sZW4gPSAxO1xuLVx0bWFwLm1fZmxhZ3MgPSAwO1xuLVx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXHUwMDI2bWFwLCBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKTtcbitcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4rXHRhci5pbm9kZSA9IGlub2RlO1xuK1x0YXIubG9naWNhbCA9IDA7XG4rXHRhci5sZW4gPSAxO1xuK1x0aWYgKFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKSlcbitcdFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcbitcdGVsc2VcbitcdFx0YXIuZmxhZ3MgPSAwO1xuK1x0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcdTAwMjZhciwgXHUwMDI2ZXJyb3IpO1xuIFx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0aWYgKCEobWFwLm1fZmxhZ3MgXHUwMDI2IEVYVDRfTUFQX01BUFBFRCkpIHtcbi1cdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0fVxuK1x0XHRnb3RvIG91dDtcbiBcbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4rXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcbiBcdGlmICghZGF0YV9iaCkge1xuIFx0XHRlcnJvciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4rXHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4gXG5AQCAtMTE3MSwxMiArMTIxNiwxNCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdH1cbiBcbi1vdXRfcmVzdG9yZTpcbiBcdGlmIChlcnJvcilcbi1cdFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xuLVxuLW91dDpcbitcdFx0Z290byBvdXRfYmg7XG4rXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsIG5ld2Jsb2NrLCBhci5sZW4pO1xuK291dF9iaDpcbitcdGlmIChlcnJvcilcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYXIubGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4gXHRicmVsc2UoZGF0YV9iaCk7XG4rb3V0OlxuIFx0a2ZyZWUoYnVmKTtcbiBcdHJldHVybiBlcnJvcjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNTo1OTo1Ni42MDc5OTM1MDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzUyMzQwNTkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0J3Mgc2hha2luZyB1cCB0aGUgYGZzL2V4dDQvaW5saW5lLmNgIGNvZGUuIEl0IGxvb2tzIGxpa2UgdGhleSdyZSBkb2luZyBhIGJpdCBvZiBhIHJlZmFjdG9yIGluIGhvdyBpbmxpbmUgZGF0YSBnZXRzIGNvbnZlcnRlZCB0byByZWd1bGFyIGJsb2Nrcy4gU3BlY2lmaWNhbGx5LCBpdCBzZWVtcyBsaWtlIHRoZXkncmUgcmVtb3ZpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGludHJvZHVjaW5nIHRoaXMgbmV3IGZ1bmN0aW9uLCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBUaGUgcmVhbCBtZWF0IG9mIHRoZSBjaGFuZ2UsIHRob3VnaCwgaXMgaG93IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBiZWluZyByZXdvcmtlZC4gSW5zdGVhZCBvZiB0aGF0IGBleHQ0X21hcF9ibG9ja3NgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AgZGFuY2UsIHRoZXkncmUgbm93IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGRpcmVjdGx5LlxuXG5UaGlzIGlzIGEgZnVuZGFtZW50YWwgc2hpZnQgaW4gaG93IHRoZSBmaWxlc3lzdGVtIGhhbmRsZXMgdGhpcyBpbmxpbmUtdG8tYmxvY2sgY29udmVyc2lvbiwgYW5kIHRoYXQgYWx3YXlzIGdldHMgbXkgYXR0ZW50aW9uLiBTbywgbGV0J3MgdGFrZSBhIGNsb3NlciBsb29rLlxuXG5JIG5lZWQgdG8gZm9jdXMgb24gdGhlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG9mIGNvdXJzZSwgdGhlIG1haW4gc3ViamVjdCBvZiBjaGFuZ2U6IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gR2l2ZW4gdGhhdCBpdCdzIGEgY29yZSBjb21wb25lbnQsIEknbSB0aGlua2luZyB3ZSBzaG91bGQgZGVmaW5pdGVseSBiZSBmdXp6aW5nIHRoYXQsIG9yIGF0IGxlYXN0IGl0cyBjYWxsZXJzLiBUaGF0IHNlZW1zIGxpa2UgdGhlIGxvZ2ljYWwgc3BvdCBmb3Igc29tZSB0aG9yb3VnaCB0ZXN0aW5nLiBMZXQncyBkaWcgaW50byB0aGUgY29kZSBhbmQgZmluZCBvdXQgZXhhY3RseSAqd2hvKiBpcyBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2NiwiT3V0cHV0VG9rZW5zIjoyNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjAxLjM2MDM0MTgzOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzQ3NzE0OTEyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTEzNi1cXG5mcy9leHQ0L2lubGluZS5jOjExMzc6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM4LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEyMzY9aW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMjg4LVxcdCAqL1xcbmZzL2V4dDQvaW5saW5lLmM6MTI4OTpcXHRyZXQgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgZGlyLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMjkwLVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0yMDAzPWludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjA0MC1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbmZzL2V4dDQvaW5saW5lLmM6MjA0MTpcXHRcXHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSwgXFx1MDAyNmlsb2MpO1xcbmZzL2V4dDQvaW5saW5lLmMtMjA0Mi1cXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXFx1MDAyNm5vX2V4cGFuZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjAzLjEwODA2NDMyOVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MzcxOTQ0MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSB3aGF0J3Mgb24gbXkgbWluZCByZWdhcmRpbmcgdGhlc2UgZnVuY3Rpb25zLlxuXG4qKkludmVzdGlnYXRpbmcgSW5saW5lIERhdGEgQ29udmVyc2lvbiBpbiBleHQ0KipcblxuUmlnaHQsIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSXQgbG9va3MgbGlrZSB0aGVzZSBhcmUga2V5IHBsYXllcnMgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgYW4gaW1wb3J0YW50IG9wdGltaXphdGlvbi4gTXkgZm9jdXMgbmVlZHMgdG8gYmUgb24gaG93IHRoZXkgcmVsYXRlIHRvIGVhY2ggb3RoZXIuIEknbSBnb2luZyB0byBzdGFydCBieSB0cmFjaW5nIHRoZSBjYWxsIGNoYWluLiBJJ2xsIGNoZWNrIHdobyBpcyBjYWxsaW5nIHRob3NlIGZ1bmN0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjZW5hcmlvcyB0aGF0IGxlYWQgdG8gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBiZWluZyBpbnZva2VkLiBHZXR0aW5nIGEgY2xlYXIgcGljdHVyZSBvZiB0aGVpciBjYWxsZXJzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGRhdGEgZmxvdyBhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSBtYWtlcyBkZWNpc2lvbnMgYWJvdXQgaW5saW5lIGRhdGEuIFRoaXMgd2lsbCBoZWxwIG1lIGltbWVuc2VseS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDk4OSwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjA2LjU0NTI2MTExNloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODE4NTQ0MzIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0Lmg9Mzc0Nz1leHRlcm4gaW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM3NTEtXFx0XFx0XFx0XFx0XFx0ICB2b2lkICoqZnNkYXRhLCBib29sIGRhKTtcXG5mcy9leHQ0L2V4dDQuaDozNzUyOmV4dGVybiBpbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLFxcbmZzL2V4dDQvZXh0NC5oLTM3NTMtXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEyMzUtICovXFxuZnMvZXh0NC9pbmxpbmUuYzoxMjM2OmludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG5mcy9leHQ0L2lubGluZS5jLTEyMzctXFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9MjM1Nj1zdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtMjM4My1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoZGlyKSkge1xcbmZzL2V4dDQvbmFtZWkuYzoyMzg0OlxcdFxcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xcbmZzL2V4dDQvbmFtZWkuYy0yMzg1LVxcdFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDowOC4zNjM4MTQyNzZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzY0OTM4OTIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc2l0dWF0aW9uLCBmcm9tIGFuIGV4cGVydCdzIHBlcnNwZWN0aXZlLCBzdW1tYXJpemVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqSW5saW5lIERhdGEgSGFuZGxpbmcgaW4gZXh0NCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBpbmxpbmUgZGF0YSBpcyBtYW5hZ2VkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJdCdzIGNsZWFyIHRoYXQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGlzLCBhcyBleHBlY3RlZCwgYSBoZWxwZXIgZnVuY3Rpb24gaW52b2tlZCBieSBgX19leHQ0X2FkZF9lbnRyeWAuIE1ha2VzIHNlbnNlLCB0aGF0J3Mgd2hlcmUgdGhlICphdHRlbXB0KiB0byBhZGQgYW4gaW5saW5lIGVudHJ5IGdldHMgaGFuZGxlZCBkdXJpbmcgZGlyZWN0b3J5IGVudHJ5IGNyZWF0aW9uIG9yIG1vZGlmaWNhdGlvbiwgcHJvYmFibHkgd2hlbiBhIHNtYWxsIGZpbGUgZml0cyB3aXRoaW4gdGhlIGlub2RlJ3MgZGF0YSBhcmVhLiBUaGUgY3JpdGljYWwgcG9pbnQgaXMgdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlICpkYXRhKiBpdHNlbGYgZm9yIHRoaXMgaW5saW5lIGZpbGUgaGFwcGVucyB3aXRoaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAuIFNvLCB0aGF0IHRlbGxzIG1lIHRoZSBkYXRhIGNvbnZlcnNpb24gdGFrZXMgcGxhY2UgYWZ0ZXIgc29tZSBjaGVjayAtIHByZXN1bWFibHkgYWZ0ZXIgdGhlIGF0dGVtcHQgdG8gbWFrZSBpdCBpbmxpbmUuIEkgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNhbGwgc3RhY2sgdG8gc2VlICp3aGF0KiBpbml0aWF0ZXMgdGhlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGZ1bmN0aW9uLiBJcyBpdCBhbHdheXMgZnJvbSBgX19leHQ0X2FkZF9lbnRyeWAsIG9yIGFyZSB0aGVyZSBvdGhlciBlbnRyeSBwb2ludHMsIGxpa2Ugd2hlbiBjb252ZXJ0aW5nIGEgcmVndWxhciBmaWxlICp0byogYW4gaW5saW5lIGZpbGUgbGF0ZXI/IEkgYWxzbyBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVycm9yIGNvbmRpdGlvbnMgaGVyZSBhbmQgaG93IGZhaWx1cmVzIGluIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpbmZsdWVuY2UgdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCDigJMgaG93IGFyZSB0aGV5IGNvb3JkaW5hdGVkPyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGltcHJvcGVyIGRhdGEgcGxhY2VtZW50IGNvdWxkIGVhc2lseSBjb3JydXB0IHRoZSBmaWxlIHN0cnVjdHVyZS4gSSdsbCBuZWVkIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgdG8gZnVsbHkgZ3Jhc3AgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU2NTgsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDoxMi4xMjg3NTc3NzlaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU2ODc2OTk1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcXG4tLVxcbmZzL2V4dDQvY3J5cHRvLmMtMTUyLVxcbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlxcdHJlcyA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9jcnlwdG8uYy0xNTQtXFx0aWYgKHJlcylcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTM3ODQ9ZXh0ZXJuIGludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSk7XFxuZnMvZXh0NC9leHQ0LmgtMzc4NS1cXG5mcy9leHQ0L2V4dDQuaDozNzg2OmV4dGVybiBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbmZzL2V4dDQvZXh0NC5oLTM3ODctXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00ODU0PWxvbmcgZXh0NF9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cXHRpbm9kZV9sb2NrKGlub2RlKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo0ODg0OlxcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4NS1cXHRpZiAocmV0KVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz01NDY9aW50IGV4dDRfcmVhZHBhZ2VfaW5saW5lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cXG5mcy9leHQ0L2lubGluZS5jOjU3MzpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuZnMvZXh0NC9pbmxpbmUuYy01NzQtXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTcyOC1cXHRcXHRcXHQvKiBSZXRyeSBpbnNpZGUgKi9cXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcXHRcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03MzAtXFx0XFx0fVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz03ODQ9aW50IGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy03ODktXFx0aWYgKHBvcyArIGxlbiBcXHUwMDNlIGV4dDRfZ2V0X21heF9pbmxpbmVfc2l6ZShpbm9kZSkpXFxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XFx0XFx0cmV0dXJuIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQobWFwcGluZywgaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVxcdHJldHVybiBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEobWFwcGluZywgaW5vZGUsIHBvcywgbGVuLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTEzNi1cXG5mcy9leHQ0L2lubGluZS5jOjExMzc6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM4LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEyMzY9aW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMjg4LVxcdCAqL1xcbmZzL2V4dDQvaW5saW5lLmM6MTI4OTpcXHRyZXQgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgZGlyLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMjkwLVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xODkxPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjAwMi1cXG5mcy9leHQ0L2lubGluZS5jOjIwMDM6aW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL2V4dDQvaW5saW5lLmMtMjAwNC17XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTIwNDAtXFx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG5mcy9leHQ0L2lubGluZS5jOjIwNDE6XFx0XFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZpbG9jKTtcXG5mcy9leHQ0L2lubGluZS5jLTIwNDItXFx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTU5MzQ9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTYwMzEtXFx0XFx0ICAgIGF0dHItXFx1MDAzZWlhX3NpemUgXFx1MDAzZSBFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplKSB7XFxuZnMvZXh0NC9pbm9kZS5jOjYwMzI6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xcbmZzL2V4dDQvaW5vZGUuYy02MDMzLVxcdFxcdFxcdGlmIChlcnJvcilcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYz02Nzg3PXZtX2ZhdWx0X3QgZXh0NF9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtNjgwOC1cXG5mcy9leHQ0L2lub2RlLmM6NjgwOTpcXHRlcnIgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xcbmZzL2V4dDQvaW5vZGUuYy02ODEwLVxcdGlmIChlcnIpXFxuLS1cXG5mcy9leHQ0L3Zlcml0eS5jPTEwMj1zdGF0aWMgaW50IGV4dDRfYmVnaW5fZW5hYmxlX3Zlcml0eShzdHJ1Y3QgZmlsZSAqZmlscClcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmMtMTI4LVxcbmZzL2V4dDQvdmVyaXR5LmM6MTI5OlxcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC92ZXJpdHkuYy0xMzAtXFx0aWYgKGVycilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDA6MTMuNjk3NTMyNjQxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ0NzY0MDM2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YSoqXG5cbk9rYXksIHNvIGxvb2tpbmcgYXQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAsIGl0IHNlZW1zIGxpa2UgdGhpcyBmdW5jdGlvbiBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBhbmQgdGhlcmVmb3JlIHdvcnRoIGNvbnNpZGVyaW5nIGZvciBmdXp6aW5nLiBJdCdzIGNhbGxlZCBmcm9tIGEgZmV3IGRpZmZlcmVudCBwbGFjZXMsIHdoaWNoIGlzIGdvb2QgZm9yIGNvdmVyYWdlOiBgZXh0NF9zZXRfY29udGV4dGAgKHdoaWNoIGlzIGNyeXB0by1yZWxhdGVkLCBpbnRlcmVzdGluZyksIGBleHQ0X2ZhbGxvY2F0ZWAsIGBleHQ0X3NldGF0dHJgIChzcGVjaWZpY2FsbHkgZm9yIHRydW5jYXRpbmcgZmlsZXMpLCBgZXh0NF9wYWdlX21rd3JpdGVgLCBhbmQgYGV4dDRfYmVnaW5fZW5hYmxlX3Zlcml0eWAuIFRoYXQncyBhIGRlY2VudCBzcHJlYWQuXG5cblRoZSBvYnZpb3VzIGZ1bmN0aW9ucyB0byBmb2N1cyBvbiBhcmUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXRzZWxmLCBvZiBjb3Vyc2UsIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEknbSBnb2luZyB0byBub3RlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbmQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBhcyB3ZWxsLCBldmVuIHRob3VnaCB0aGV5J3JlIHN0YXRpYyDigJMgc29tZXRpbWVzIHN0YXRpYyBmdW5jdGlvbnMgc3RpbGwgZXhwb3NlIGludGVyZXN0aW5nIHZ1bG5lcmFiaWxpdGllcyBpZiB0aGUgY29yZSBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQuIFRob3VnaCwgbGlzdGluZyB0aGUgY2FsbGVycyB0byB0aGUgbm9uLXN0YXRpYyBmdW5jdGlvbnMgaXMgcHJvYmFibHkgYSBtb3JlIGVmZmVjdGl2ZSBhcHByb2FjaC5cblxuU28sIGxldCdzIG1ha2UgYSBub3RlIHRvIGRlZmluaXRlbHkgdGFyZ2V0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgSSBuZWVkIHRvIGtlZXAgaW4gbWluZD8gQWgsIHJpZ2h0LCBFWFQ0X0ZTIGlzIG9idmlvdXNseSByZXF1aXJlZC4gR29vZCB0byBrbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NDkyLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjE4LjE0NTE3NjU4OFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYyOTc0NzEwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgRVhUNF9GU1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9leHQ0L0tjb25maWc6Mjpjb25maWcgRVhUNF9GU1xcbmZzL2V4dDQvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVxcXCJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZz0zNT1jb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZy00NS1cXG5mcy9leHQ0L0tjb25maWc6NDY6Y29uZmlnIEVYVDRfRlNfUE9TSVhfQUNMXFxuZnMvZXh0NC9LY29uZmlnLTQ3LVxcdGJvb2wgXFxcIkV4dDQgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHNcXFwiXFxuLS1cXG5mcy9leHQ0L0tjb25maWctNTUtXFxuZnMvZXh0NC9LY29uZmlnOjU2OmNvbmZpZyBFWFQ0X0ZTX1NFQ1VSSVRZXFxuZnMvZXh0NC9LY29uZmlnLTU3LVxcdGJvb2wgXFxcIkV4dDQgU2VjdXJpdHkgTGFiZWxzXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDoxOS43NzQ5MzI5MjdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTYwMjIwMjU4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRVhUNCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIGBFWFQ0X0ZTYCBjb25maWd1cmF0aW9uIGFuZCBkaXZpbmcgaW50byB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiByb3V0aW5lcy4gRmlyc3QgdGhpbmdzIGZpcnN0LCBJIHdhbnQgdG8gY2hlY2sgdGhlIHZpc2liaWxpdHkgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAuIEFoLCB5ZXMsIGl0J3MgZXhwb3J0ZWQgYW5kIGRlY2xhcmVkIGluIGBmcy9leHQ0L2V4dDQuaGAgYXMgYGV4dGVybiBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpO2AuIEV4Y2VsbGVudC4gQW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpcyBhbHNvIHJpZ2h0IHRoZXJlIGluIHRoZSBoZWFkZXIuXG5cbk5vdywganVzdCB0byBiZSBzdXJlLCBsZXQncyB0YWtlIGEgcXVpY2sgbG9vayBhdCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBZZXAsIHRoYXQncyBzdGF0aWMsIGFzIGlzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gUmlnaHQsIHNvIHRoYXQgbWVhbnMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBhcmUgcHJvYmFibHkgdGhlIGtleSBmdW5jdGlvbnMgdG8gZm9jdXMgb24uXG5cbldhaXQgYSBzZWNvbmTigKYgaXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGFsc28gYSBjYWxsZXIgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgPyBObywgdGhhdCBkb2Vzbid0IHNlZW0gdG8gYmUgdGhlIGNhc2UuIEFoLCBJIHNlZSEgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBib3RoIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBhbmQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAuIE9rYXksIHRoYXQgY2xhcmlmaWVzIHRoZSBjYWxsIGdyYXBoLiBMZXQgbWUgbm93IHNlZSB3aGF0J3MgZ29pbmcgb24gd2l0aCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODIzOSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDoyNS4zNzcxMzkwNzJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MjY2NzUyODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTcyLVxcbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG5mcy9leHQ0L2lubGluZS5jLTU3NC1cXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz02OTc9aW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNzI4LVxcdFxcdFxcdC8qIFJldHJ5IGluc2lkZSAqL1xcbmZzL2V4dDQvaW5saW5lLmM6NzI5OlxcdFxcdFxcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jLTczMC1cXHRcXHR9XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTc4ND1pbnQgZXh0NF90cnlfdG9fd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cXHRpZiAocG9zICsgbGVuIFxcdTAwM2UgZXh0NF9nZXRfbWF4X2lubGluZV9zaXplKGlub2RlKSlcXG5mcy9leHQ0L2lubGluZS5jOjc5MDpcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03OTEtXFx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjI3LjAwMzgyMTY2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MDM4NDI5OTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipEaXZpbmcgaW50byB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uKipcblxuUmlnaHQsIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgZnVuY3Rpb24sIGFuZCBpdCBzZWVtcyBsaWtlIGEgY3J1Y2lhbCBwaWVjZSBpbiBob3cgZXh0NCBoYW5kbGVzIGZpbGUgZGF0YS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiV2FpdCBhIG1pbnV0ZSwgSSB0aG91Z2h0IEkgcmVtZW1iZXJlZCBpdCBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBkaXJlY3RseSwgYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIGJlIHRoZSBjYXNlLlwiIFBlcmhhcHMgSSBtaXNyZWFkIHNvbWV0aGluZyBvciB0aGVyZSdzIHNvbWUgaW5kaXJlY3QgY2FsbCBwYXRoIEknbSBub3QgaW1tZWRpYXRlbHkgY29uc2lkZXJpbmcuXG5cblRoZXJlZm9yZSwgaXQgbG9va3MgbGlrZSBpdCdzIHRpbWUgdG8gdGhvcm91Z2hseSBleGFtaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgYW5kIHNlZSBleGFjdGx5IHdoYXQgaXQncyBkb2luZy4gR290dGEgcmVmcmVzaCBteSBtZW1vcnkgb2YgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhpcyBjb252ZXJzaW9uIGlzIGtleSBmb3IgZGVhbGluZyB3aXRoIHNtYWxsZXIgZmlsZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyMzYsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozMC41MDc2NjcxMzRaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc4MDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW5saW5lLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTczLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTczOlxcdHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4gNTc0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIDU3NTpcXHR7XFxuIDU3NjpcXHRcXHRpbnQgcmV0LCBuZWVkZWRfYmxvY2tzLCBub19leHBhbmQ7XFxuIDU3NzpcXHRcXHRoYW5kbGVfdCAqaGFuZGxlID0gTlVMTDtcXG4gNTc4OlxcdFxcdGludCByZXRyaWVzID0gMCwgc2VtX2hlbGQgPSAwO1xcbiA1Nzk6XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuIDU4MDpcXHRcXHR1bnNpZ25lZCBmcm9tLCB0bztcXG4gNTgxOlxcdFxcdHN0cnVjdCBleHQ0X2lsb2MgaWxvYztcXG4gNTgyOlxcdFxcbiA1ODM6XFx0XFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcXG4gNTg0OlxcdFxcdFxcdC8qXFxuIDU4NTpcXHRcXHRcXHQgKiBjbGVhciB0aGUgZmxhZyBzbyB0aGF0IG5vIG5ldyB3cml0ZVxcbiA1ODY6XFx0XFx0XFx0ICogd2lsbCB0cmFwIGhlcmUgYWdhaW4uXFxuIDU4NzpcXHRcXHRcXHQgKi9cXG4gNTg4OlxcdFxcdFxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4gNTg5OlxcdFxcdFxcdHJldHVybiAwO1xcbiA1OTA6XFx0XFx0fVxcbiA1OTE6XFx0XFxuIDU5MjpcXHRcXHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xcbiA1OTM6XFx0XFxuIDU5NDpcXHRcXHRyZXQgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFxcdTAwMjZpbG9jKTtcXG4gNTk1OlxcdFxcdGlmIChyZXQpXFxuIDU5NjpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA1OTc6XFx0XFxuIDU5ODpcXHRyZXRyeTpcXG4gNTk5OlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9XUklURV9QQUdFLCBuZWVkZWRfYmxvY2tzKTtcXG4gNjAwOlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbiA2MDE6XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihoYW5kbGUpO1xcbiA2MDI6XFx0XFx0XFx0aGFuZGxlID0gTlVMTDtcXG4gNjAzOlxcdFxcdFxcdGdvdG8gb3V0O1xcbiA2MDQ6XFx0XFx0fVxcbiA2MDU6XFx0XFxuIDYwNjpcXHRcXHQvKiBXZSBjYW5ub3QgcmVjdXJzZSBpbnRvIHRoZSBmaWxlc3lzdGVtIGFzIHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5XFxuIDYwNzpcXHRcXHQgKiBzdGFydGVkICovXFxuIDYwODpcXHRcXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgMCwgRkdQX1dSSVRFQkVHSU4gfCBGR1BfTk9GUyxcXG4gNjA5OlxcdFxcdFxcdFxcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xcbiA2MTA6XFx0XFx0aWYgKElTX0VSUihmb2xpbykpIHtcXG4gNjExOlxcdFxcdFxcdHJldCA9IFBUUl9FUlIoZm9saW8pO1xcbiA2MTI6XFx0XFx0XFx0Z290byBvdXRfbm9mb2xpbztcXG4gNjEzOlxcdFxcdH1cXG4gNjE0OlxcdFxcbiA2MTU6XFx0XFx0ZXh0NF93cml0ZV9sb2NrX3hhdHRyKGlub2RlLCBcXHUwMDI2bm9fZXhwYW5kKTtcXG4gNjE2OlxcdFxcdHNlbV9oZWxkID0gMTtcXG4gNjE3OlxcdFxcdC8qIElmIHNvbWUgb25lIGhhcyBhbHJlYWR5IGRvbmUgdGhpcyBmb3IgdXMsIGp1c3QgZXhpdC4gKi9cXG4gNjE4OlxcdFxcdGlmICghZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKSB7XFxuIDYxOTpcXHRcXHRcXHRyZXQgPSAwO1xcbiA2MjA6XFx0XFx0XFx0Z290byBvdXQ7XFxuIDYyMTpcXHRcXHR9XFxuIDYyMjpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDA6MzAuNTA3ODQ3MjU0WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1OTI1MTA0ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAqKlxuXG5Pa2F5LCBob2xkIG9uIGEgbWludXRlLiBJIHdhcyBwcmV0dHkgc3VyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgd2FzIGp1c3QgYSB3cmFwcGVyIGZvciBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEJ1dCwgcmVyZWFkaW5nIHRoZSBjb2RlLCBpdCBzZWVtcy4uLiB3YWl0LCBpcyB0aGF0IHJpZ2h0PyBJdCAqZG9lc24ndCogYWN0dWFsbHkgY2FsbCB0aGUgYG5vbG9ja2AgdmVyc2lvbiBkaXJlY3RseT8gVGhhdCBzZWVtcyBvZGQsIGdpdmVuIHRoZSB1c3VhbCBsb2NraW5nIHN0cmF0ZWdpZXMgaW4gdGhlIGV4dDQgY29kZS4gSSdsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayB0aGUgY2FsbGluZyBjb250ZXh0IG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCwgYW5kIHZlcmlmeSB0aGF0IHRoZSBuZWNlc3NhcnkgbG9ja2luZyBpcyBhY3R1YWxseSAqYmVpbmcqIGhhbmRsZWQgZXh0ZXJuYWxseS4gVGhpcyBjb3VsZCBiZSBhIGNyaXRpY2FsIGZsYXcgaWYgaXQncyBub3QgbG9ja2VkIHByb3Blcmx5LCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGRhdGEgY29ycnVwdGlvbiwgb3IgYXQgbGVhc3Qgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB0cmFjZSB0aGlzIGNhbGwsIHNlZSB3aGVyZSBpdCdzIGJlaW5nIHVzZWQsIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGUgbG9jayBpcyBiZWluZyBhY3F1aXJlZCwgaWYgYXQgYWxsLiBJdCBtaWdodCB1c2UgYW5vdGhlciwgaW50ZXJuYWwgbG9ja2luZyBtZWNoYW5pc20uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMjU3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozNC4xMDAzNjI0MDhaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc4MDUxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW5saW5lLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjIzLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjIzOlxcdFxcdGZyb20gPSAwO1xcbiA2MjQ6XFx0XFx0dG8gPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuIDYyNTpcXHRcXHRpZiAoIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pKSB7XFxuIDYyNjpcXHRcXHRcXHRyZXQgPSBleHQ0X3JlYWRfaW5saW5lX2ZvbGlvKGlub2RlLCBmb2xpbyk7XFxuIDYyNzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4gNjI4OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiA2Mjk6XFx0XFx0fVxcbiA2MzA6XFx0XFxuIDYzMTpcXHRcXHRleHQ0X2ZjX3RyYWNrX2lub2RlKGhhbmRsZSwgaW5vZGUpO1xcbiA2MzI6XFx0XFx0cmV0ID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcXG4gNjMzOlxcdFxcdGlmIChyZXQpXFxuIDYzNDpcXHRcXHRcXHRnb3RvIG91dDtcXG4gNjM1OlxcdFxcbiA2MzY6XFx0XFx0aWYgKGV4dDRfc2hvdWxkX2Rpb3JlYWRfbm9sb2NrKGlub2RlKSkge1xcbiA2Mzc6XFx0XFx0XFx0cmV0ID0gZXh0NF9ibG9ja193cml0ZV9iZWdpbihoYW5kbGUsIGZvbGlvLCBmcm9tLCB0byxcXG4gNjM4OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgZXh0NF9nZXRfYmxvY2tfdW53cml0dGVuKTtcXG4gNjM5OlxcdFxcdH0gZWxzZVxcbiA2NDA6XFx0XFx0XFx0cmV0ID0gZXh0NF9ibG9ja193cml0ZV9iZWdpbihoYW5kbGUsIGZvbGlvLCBmcm9tLCB0byxcXG4gNjQxOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgZXh0NF9nZXRfYmxvY2spO1xcbiA2NDI6XFx0XFx0Y2xlYXJfYnVmZmVyX25ldyhmb2xpb19idWZmZXJzKGZvbGlvKSk7XFxuIDY0MzpcXHRcXG4gNjQ0OlxcdFxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHtcXG4gNjQ1OlxcdFxcdFxcdHJldCA9IGV4dDRfd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBpbm9kZSxcXG4gNjQ2OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgZm9saW9fYnVmZmVycyhmb2xpbyksIGZyb20sIHRvLFxcbiA2NDc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpO1xcbiA2NDg6XFx0XFx0fVxcbiA2NDk6XFx0XFxuIDY1MDpcXHRcXHRpZiAocmV0KSB7XFxuIDY1MTpcXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbiA2NTI6XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4gNjUzOlxcdFxcdFxcdGZvbGlvID0gTlVMTDtcXG4gNjU0OlxcdFxcdFxcdGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTtcXG4gNjU1OlxcdFxcdFxcdGV4dDRfd3JpdGVfdW5sb2NrX3hhdHRyKGlub2RlLCBcXHUwMDI2bm9fZXhwYW5kKTtcXG4gNjU2OlxcdFxcdFxcdHNlbV9oZWxkID0gMDtcXG4gNjU3OlxcdFxcdFxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuIDY1ODpcXHRcXHRcXHRoYW5kbGUgPSBOVUxMO1xcbiA2NTk6XFx0XFx0XFx0ZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpO1xcbiA2NjA6XFx0XFx0XFx0LypcXG4gNjYxOlxcdFxcdFxcdCAqIElmIHRydW5jYXRlIGZhaWxlZCBlYXJseSB0aGUgaW5vZGUgbWlnaHRcXG4gNjYyOlxcdFxcdFxcdCAqIHN0aWxsIGJlIG9uIHRoZSBvcnBoYW4gbGlzdDsgd2UgbmVlZCB0b1xcbiA2NjM6XFx0XFx0XFx0ICogbWFrZSBzdXJlIHRoZSBpbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlXFxuIDY2NDpcXHRcXHRcXHQgKiBvcnBoYW4gbGlzdCBpbiB0aGF0IGNhc2UuXFxuIDY2NTpcXHRcXHRcXHQgKi9cXG4gNjY2OlxcdFxcdFxcdGlmIChpbm9kZS1cXHUwMDNlaV9ubGluaylcXG4gNjY3OlxcdFxcdFxcdFxcdGV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7XFxuIDY2ODpcXHRcXHR9XFxuIDY2OTpcXHRcXG4gNjcwOlxcdFxcdGlmIChyZXQgPT0gLUVOT1NQQyBcXHUwMDI2XFx1MDAyNiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS1cXHUwMDNlaV9zYiwgXFx1MDAyNnJldHJpZXMpKVxcbiA2NzE6XFx0XFx0XFx0Z290byByZXRyeTtcXG4gNjcyOlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozNC4xMDA1NDI1NjlaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEwNzU1MDc1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHF1aWNrIHJ1bmRvd24gb2Ygd2hhdCBJJ20gbG9va2luZyBhdCwgZnJvbSBteSBleHBlcnQgcGVyc3BlY3RpdmU6XG5cbioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgSW50ZXJhY3Rpb25zIEFmdGVyIGEgUmVjZW50IFBhdGNoKipcblxuQWxyaWdodCwgc28gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGlzIGNhbGxpbmcgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLiBJbnRlcmVzdGluZy4gSXQncyBhIGtleSBmdW5jdGlvbiBpbiB0aGlzIGFyZWEsIGFuZCBJIHNlZSB0aGF0ICp0aGF0KiBmdW5jdGlvbiwgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3YXNuJ3QgdG91Y2hlZCBpbiB0aGlzIHNwZWNpZmljIHBhdGNoLiBUaGF0J3MgYSBnb29kIGZpcnN0IGNoZWNrLCBtZWFucyB0aGVyZSdzIGxlc3MgaW1tZWRpYXRlIHJpc2sgdGhlcmUuXG5cbkhvd2V2ZXIsIHRoZSBwYXRjaCAqZGlkKiBtb2RpZnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGFuZCBhZGRlZCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBTbywgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBnaXZlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbm90aGVyLCBjbG9zZXIgbG9vay4gTGV0IG1lIGRvdWJsZS1jaGVjayBob3cgKml0KiBoYW5kbGVzIHRoaW5ncyBub3csIGdpdmVuIHRoZXNlIGFkZGl0aW9ucyBhbmQgY2hhbmdlcy4gSnVzdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgaW50ZXJhY3Rpb25zIGFyZSBzb3VuZCwgZXNwZWNpYWxseSBzaW5jZSB3ZSd2ZSBnb3QgYSBuZXcgcGllY2UgdG8gdGhlIHB1enpsZSB3aXRoIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzM5LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozOC4yMDgwOTY1NDlaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY2MzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW5saW5lLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTEzNyxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTEzNzpcXHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4xMTM4OlxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuMTEzOTpcXHRcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxcbjExNDA6XFx0e1xcbjExNDE6XFx0XFx0aW50IGVycm9yO1xcbjExNDI6XFx0XFx0dm9pZCAqYnVmID0gTlVMTDtcXG4xMTQzOlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XFxuMTE0NDpcXHRcXHRpbnQgaW5saW5lX3NpemU7XFxuMTE0NTpcXHRcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbjExNDY6XFx0XFx0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xcbjExNDc6XFx0XFxuMTE0ODpcXHRcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4xMTQ5OlxcdFxcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG4xMTUwOlxcdFxcdGlmICghYnVmKSB7XFxuMTE1MTpcXHRcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuMTE1MjpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMTUzOlxcdFxcdH1cXG4xMTU0OlxcdFxcbjExNTU6XFx0XFx0ZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpO1xcbjExNTY6XFx0XFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4xMTU3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExNTg6XFx0XFxuMTE1OTpcXHRcXHQvKlxcbjExNjA6XFx0XFx0ICogTWFrZSBzdXJlIHRoZSBpbmxpbmUgZGlyZWN0b3J5IGVudHJpZXMgcGFzcyBjaGVja3MgYmVmb3JlIHdlIHRyeSB0b1xcbjExNjE6XFx0XFx0ICogY29udmVydCB0aGVtLCBzbyB0aGF0IHdlIGF2b2lkIHRvdWNoaW5nIHN0dWZmIHRoYXQgbmVlZHMgZnNjay5cXG4xMTYyOlxcdFxcdCAqL1xcbjExNjM6XFx0XFx0aWYgKFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkpIHtcXG4xMTY0OlxcdFxcdFxcdGVycm9yID0gZXh0NF9jaGVja19hbGxfZGUoaW5vZGUsIGlsb2MtXFx1MDAzZWJoLFxcbjExNjU6XFx0XFx0XFx0XFx0XFx0XFx0YnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXFxuMTE2NjpcXHRcXHRcXHRcXHRcXHRcXHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4xMTY3OlxcdFxcdFxcdGlmIChlcnJvcilcXG4xMTY4OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjExNjk6XFx0XFx0fVxcbjExNzA6XFx0XFxuMTE3MTpcXHRcXHRtZW1zZXQoXFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcXG4xMTcyOlxcdFxcdGFyLmlub2RlID0gaW5vZGU7XFxuMTE3MzpcXHRcXHRhci5sb2dpY2FsID0gMDtcXG4xMTc0OlxcdFxcdGFyLmxlbiA9IDE7XFxuMTE3NTpcXHRcXHRpZiAoU19JU1JFRyhpbm9kZS1cXHUwMDNlaV9tb2RlKSlcXG4xMTc2OlxcdFxcdFxcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XFxuMTE3NzpcXHRcXHRlbHNlXFxuMTE3ODpcXHRcXHRcXHRhci5mbGFncyA9IDA7XFxuMTE3OTpcXHRcXHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFxcdTAwMjZhciwgXFx1MDAyNmVycm9yKTtcXG4xMTgwOlxcdFxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuMTE4MTpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMTgyOlxcdFxcbjExODM6XFx0XFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cXHUwMDNlaV9zYiwgbmV3YmxvY2spO1xcbjExODQ6XFx0XFx0aWYgKCFkYXRhX2JoKSB7XFxuMTE4NTpcXHRcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuMTE4NjpcXHRcXHRcXHRnb3RvIG91dF9iaDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDA6MzguMjA4MjY2NjQ5WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDkxNTQ4MjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBFeHQ0IElubGluZSBEYXRhIENvbnZlcnNpb24gUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJJ20gc2VlaW5nLCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIGNydWNpYWwgZnVuY3Rpb24gaGVyZS4gVGhpcyBpcyB0aGUgb25lIHRoYXQgYWN0dWFsbHkgYWxsb2NhdGVzIGEgbmV3IGJsb2NrIGFuZCBjYWxscyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBJdCdzIGNhbGxlZCBieSB0d28gcHJpbWFyeSBmdW5jdGlvbnM6IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEkgbmVlZCB0byBrZWVwIGluIG1pbmQgdGhhdCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgaXMgZGlzdGluY3QgYW5kIGhhbmRsZXMgY29udmVyc2lvbnMgZm9yICpyZWd1bGFyKiBmaWxlcyBkdXJpbmcgd3JpdGVzLiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyBzcGVjaWZpY2FsbHkgdXNlZCBmb3IgZGlyZWN0b3JpZXMgKHRocm91Z2ggYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgKSBhbmQgZm9yIHJlZ3VsYXIgZmlsZXMgdmlhIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLCB3aGljaCBpdHNlbGYgaXMgaW52b2tlZCBieSBvcGVyYXRpb25zIGxpa2UgYGZhbGxvY2F0ZWAsIGBzZXRhdHRyYCwgY3J5cHRvIGFuZCB2ZXJpdHkuXG5cblNvLCBteSBwcmltYXJ5IGZvY3VzIGZvciBmdXp6aW5nIG5lZWRzIHRvIGJlIG9uOlxuXG4qICAgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWBcbiogICBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWBcblxuSSd2ZSBhbHJlYWR5IGRvdWJsZS1jaGVja2VkIGZvciBhbnkgb3RoZXIgY2FsbGVycyBvZiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIGFuZCB0aGUgZ3JlcCByZXN1bHRzIGNvbmZpcm0gdGhhdCBJJ3ZlIGdvdCB0aGUgY29ycmVjdCBlbnRyeSBwb2ludHMuIEp1c3QgdGhvc2UgdHdvLlxuXG5SZWdhcmRpbmcgY29uZmlndXJhdGlvbnMsIGl0J3MganVzdCBgRVhUNF9GU2AsIG5vdGhpbmcgZWxzZSB0byB3b3JyeSBhYm91dCBvbiB0aGF0IGZyb250LlxuXG5JJ3ZlIHJldmlld2VkIHRoZSBwYXRjaCBjbG9zZWx5LiBJdCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIHRoZSBuZXcgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlIGlzIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgd2hlcmUgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgaXMgbm93IHVzZWQgaW5zdGVhZCBvZiBgZXh0NF9tYXBfYmxvY2tzYC4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgZGVmaW5pdGVseSB3b3J0aCBhIGZ1enppbmcgY2FtcGFpZ24gdG8gaWRlbnRpZnkgYW55IGx1cmtpbmcgaXNzdWVzLiBJdCBoYXMgY2hhbmdlZCB0aGUgY29yZSBvZiBleHQ0IGlubGluZSBkYXRhIGhhbmRsaW5nLlxuXG5JbiBlc3NlbmNlLCB0aGUgcGF0Y2ggYWx0ZXJzIHRoZSBjb3JlIG1lY2hhbmlzbSBvZiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCdzIHRvdWNoaW5nIHRoZSBoZWFydCBvZiBleHQ0LiBUaGUgY2hhbmdlcyBpbiB0aGUgaW50ZXJuYWxzLCBsaWtlIHJlcGxhY2luZyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgLCBhbmQgdGhlIGludHJvZHVjdGlvbiBvZiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBjb3VwbGVkIHdpdGggdGhlIGNhbGxlcnMgb2YgdGhlIG1vZGlmaWVkIGZ1bmN0aW9uLCBtYWtlIHRoaXMgYSBoaWdoLXByaW9yaXR5IGZ1enppbmcgdGFyZ2V0LlxuXG5UaW1lIHRvIGxvZyB0aGlzLiBMZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNDYzLCJPdXRwdXRUb2tlbnMiOjIwNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjQ4LjI5OTgyMTIxNloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwNzEyMTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFWFQ0X0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhXCIsXG4gICAgXCJleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHdheSBleHQ0IGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gb2YgaW5saW5lIGRhdGEgdG8gcmVndWxhciBibG9ja3MuIEl0IHJlcGxhY2VzIGBleHQ0X21hcF9ibG9ja3NgIHdpdGggYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgYW5kIGludHJvZHVjZXMgYSBuZXcgaGVscGVyIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgdG8gZGlyZWN0bHkgc2V0IHRoZSBibG9jayB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGlubGluZSBkYXRhIGZpcnN0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXh0NCBsb2dpYy4gVGhlIG1vZGlmaWVkIGZ1bmN0aW9uIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgYnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCwgd2hpY2ggYXJlIHJlYWNoYWJsZSB2aWEgdmFyaW91cyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBkaXJlY3RvcnkgZW50cnkgYWRkaXRpb25zLiBUaGVyZWZvcmUsIGl0IGlzIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDo0OC4zODA1NDAyMTVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMjc2OTEwMzM2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjQ4LjM4MTE0MzU5NVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyMDI3Njg0OTUwMzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgYmxvY2sgYWxsb2NhdGlvbiBvcmRlciBpbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgdG8gcHJldmVudCBwb3RlbnRpYWwgZGF0YSBsb3NzIHdoZW4gY29udmVydGluZyBpbmxpbmUgZGF0YSB0byBhIGJsb2NrLiBQcmV2aW91c2x5LCBpZiBibG9jayBhbGxvY2F0aW9uIGZhaWxlZCwgaXQgYXR0ZW1wdGVkIHRvIHJlc3RvcmUgdGhlIGlubGluZSBkYXRhLCB3aGljaCBjb3VsZCBmYWlsIGFuZCBjYXVzZSBkYXRhIGxvc3MuIFRoZSBuZXcgbG9naWMgYWxsb2NhdGVzIHRoZSBibG9jayBmaXJzdCBhbmQgb25seSByZW1vdmVzIHRoZSBpbmxpbmUgZGF0YSB1cG9uIHN1Y2Nlc3MuXFxuXFxuQWxsIHN0cnVjdHVyZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGUgcGF0Y2ggKGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLCBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG9yIGV4cGxpY2l0bHkgemVyb2VkICh2aWEgYG1lbXNldGAgb3IgcGFydGlhbCBpbml0aWFsaXphdGlvbiB3aGljaCB6ZXJvZXMgdGhlIHJlc3QpLiBUaGUgYnVmZmVyIGBkYXRhX2JoLVxcdTAwM2ViX2RhdGFgIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJlZm9yZSBjb3B5aW5nIHRoZSBpbmxpbmUgZGF0YS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBwYWRkaW5nIGxlYWtzLCBvciBpbmZvLWxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gQW55IHBvdGVudGlhbCBjcmFzaGVzIChlLmcuLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBhbiBlcnJvciBwb2ludGVyKSB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gb3Iga2VybmVsIG9vcHMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmNcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjJhOTI5OWVhNDE0NmMgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2lubGluZS5jXG4rKysgYi9mcy9leHQ0L2lubGluZS5jXG5AQCAtMTQsNiArMTQsNyBAQFxuICNpbmNsdWRlIFwiZXh0NC5oXCJcbiAjaW5jbHVkZSBcInhhdHRyLmhcIlxuICNpbmNsdWRlIFwidHJ1bmNhdGUuaFwiXG4rI2luY2x1ZGUgXCJleHQ0X2V4dGVudHMuaFwiXG4gXG4gI2RlZmluZSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBXHRcImRhdGFcIlxuICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRVx0KChzaXplb2YoX19sZTMyKSAqIEVYVDRfTl9CTE9DS1MpKVxuQEAgLTEwNzAsMjEgKzEwNzEsNjcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbitzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4rXHRcdFx0XHQgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pXG4ge1xuLVx0aW50IHJldDtcbitcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4rXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcbitcdH07XG4rXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4rXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG4rXHRcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcbitcdFx0LnZhbHVlID0gTlVMTCxcbitcdFx0LnZhbHVlX2xlbiA9IDAsXG4rXHR9O1xuK1x0aW50IGVycm9yO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXCIsXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbitcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdHJldHVybiBlcnJvcjtcbiBcdH1cbi1cdGV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpO1xuLVx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rXHRpZiAoZXJyb3IpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFwiZ2V0X3dyaXRlX2FjY2Vzc1wiKTtcbitcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRtZW1zZXQoKHZvaWQgKilleHQ0X3Jhd19pbm9kZShcdTAwMjZpcy5pbG9jKS1cdTAwM2VpX2Jsb2NrLFxuK1x0XHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdG1lbXNldChlaS1cdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xuK1xuK1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbitcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuK1x0XHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcbitcbitcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTtcbitcdFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcbitcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4rXHRcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuK1x0fSBlbHNlIHtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4rXHR9XG4rXHRleHQ0X2NsZWFyX2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpO1xuK1x0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuK1x0ZXJyb3IgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4rXHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4rb3V0OlxuK1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuK1x0aWYgKGVycm9yID09IC1FTk9EQVRBKVxuK1x0XHRlcnJvciA9IDA7XG4rXHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdHJldHVybiBlcnJvcjtcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5AQCAtMTA5NCw4ICsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpbnQgZXJyb3I7XG4gXHR2b2lkICpidWYgPSBOVUxMO1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDtcbi1cdHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwO1xuIFx0aW50IGlubGluZV9zaXplO1xuK1x0ZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMDtcbitcdHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjtcbiBcbiBcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuIFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuQEAgLTExMjAsMjUgKzExNjgsMjIgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRlcnJvciA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFwLm1fbGJsayA9IDA7XG4tXHRtYXAubV9sZW4gPSAxO1xuLVx0bWFwLm1fZmxhZ3MgPSAwO1xuLVx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXHUwMDI2bWFwLCBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKTtcbitcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4rXHRhci5pbm9kZSA9IGlub2RlO1xuK1x0YXIubG9naWNhbCA9IDA7XG4rXHRhci5sZW4gPSAxO1xuK1x0aWYgKFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKSlcbitcdFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcbitcdGVsc2VcbitcdFx0YXIuZmxhZ3MgPSAwO1xuK1x0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcdTAwMjZhciwgXHUwMDI2ZXJyb3IpO1xuIFx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0aWYgKCEobWFwLm1fZmxhZ3MgXHUwMDI2IEVYVDRfTUFQX01BUFBFRCkpIHtcbi1cdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0fVxuK1x0XHRnb3RvIG91dDtcbiBcbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4rXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcbiBcdGlmICghZGF0YV9iaCkge1xuIFx0XHRlcnJvciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4rXHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4gXG5AQCAtMTE3MSwxMiArMTIxNiwxNCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdH1cbiBcbi1vdXRfcmVzdG9yZTpcbiBcdGlmIChlcnJvcilcbi1cdFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xuLVxuLW91dDpcbitcdFx0Z290byBvdXRfYmg7XG4rXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsIG5ld2Jsb2NrLCBhci5sZW4pO1xuK291dF9iaDpcbitcdGlmIChlcnJvcilcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYXIubGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4gXHRicmVsc2UoZGF0YV9iaCk7XG4rb3V0OlxuIFx0a2ZyZWUoYnVmKTtcbiBcdHJldHVybiBlcnJvcjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDo0OC4zODExNDUwMDVaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAyNjI0Nzk1ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gRnV6emluZyBTZXNzaW9uIEp1c3RpZmljYXRpb246IGV4dDQvaW5saW5lLmMgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlJ3ZlIGdvdCBhIHBhdGNoIGluIGBmcy9leHQ0L2lubGluZS5jYCwgYW5kIHRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGl0IHdhcnJhbnRzIGZpcmluZyB1cCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIFRoZSBwYXRjaCBmb2N1c2VzIG9uIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIHdpdGggYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gUmlnaHQsIGxldCdzIHNlZS4uLlxuXG5TbywgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCB6ZXJvcyBvdXQgdGhlIGlubGluZSBkYXRhIGJsb2NrIHVzaW5nIGBtZW1zZXRgLCBib3RoIGluIHRoZSByYXcgaW5vZGUgYW5kIHRoZSBgZWktXHUwMDNlaV9kYXRhYCBzdHJ1Y3R1cmVzLCB3aGljaCBpcyBnb29kLiBUaGVuLCBpdCBzZXRzIHVwIGV4dGVudHMgb3IgZGlyZWN0IGJsb2NrcywgZGVwZW5kaW5nIG9uIHRoZSBmaWxlIHN5c3RlbSBmZWF0dXJlcyBhbmQgaW5vZGUgdHlwZSwgd2hpY2ggaXMgbm9ybWFsLlxuXG5Ob3csIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSXQgdXNlcyBgZXh0NF9tYl9uZXdfYmxvY2tzYCB0byBhbGxvY2F0ZSBuZXcgYmxvY2tzLCB3aGljaCBpcyBhIGtleSBjaGFuZ2UuIFdlIG1lbXNldCB0aGUgYGFyYCBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGltcG9ydGFudCwgYW5kIGFsbG9jYXRlIGEgYnVmZmVyIGhlYWQgYGRhdGFfYmhgLiBUaGVuIHplcm8gdGhlIGJ1ZmZlciBoZWFkJ3MgZGF0YSBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGV4cGxpY2l0bHksIGFnYWluLCBnb29kLiAgVGhlIGlubGluZSBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBibG9jaywgYW5kIGZpbmFsbHksIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgaXMgY2FsbGVkLlxuXG5UaGUgY3JpdGljYWwgcXVlc3Rpb24gaGVyZSBpcyBhcm91bmQgdW5pbml0aWFsaXplZCBtZW1vcnkuIEluaXRpYWxpemluZyBgYXJgIHdpdGggYG1lbXNldGAsIHplcm9pbmcgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBhbmQgdGhlIGBpX2Jsb2NrYCBhbmQgYGlfZGF0YWAgd2l0aCBgbWVtc2V0YCBzZWVtcyBwcmV0dHkgc29saWQuIFRoZW4gdGhlcmUncyB0aGUgYG5ld2V4YCBzdHJ1Y3QsIHdoaWNoIGlzIHBhcnRpYWxseSBpbml0aWFsaXplZCwgYGVlX2Jsb2NrYCBhbmQgYGVlX2xlbmAgYXJlIHNldC4gQnV0IHdoYXQgYWJvdXQgdGhlIG90aGVyIGZpZWxkcyBvZiBgc3RydWN0IGV4dDRfZXh0ZW50YD8gV2UgaGF2ZSB0byBjaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBgc3RydWN0IGV4dDRfZXh0ZW50YCB0byBzZWUgaWYgdGhlcmUncyBhbnkgcmlzayBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJZiBhbnkgb2YgdGhlIG90aGVyIGZpZWxkcyBhcmUgcmVhZCBiZWZvcmUgYmVpbmcgd3JpdHRlbiB0bywgdGhhdCAqY291bGQqIGJlIGEgS01TQU4gaXNzdWUsIHJpZ2h0PyBTbywgdGhpcyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gYmVmb3JlIHdlIGRlY2lkZSBpZiBhIGZ1enppbmcgc2Vzc2lvbiBpcyByZXF1aXJlZC4gSSBuZWVkIHRvIGxvb2sgYXQgdGhhdCBzdHJ1Y3QgZGVmaW5pdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2MywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkyOCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjU4LjY0MzYyODg3WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTMxMzkxOTQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBleHQ0X2V4dGVudCBcXFxce1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTQ4PXN0cnVjdCBleHQ0X2V4dGVudF90YWlsIHtcXG4tLVxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTUtICovXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDo1NjpzdHJ1Y3QgZXh0NF9leHRlbnQge1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXFx0X19sZTMyXFx0ZWVfYmxvY2s7XFx0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjAxLjE3NTAyNjU1OFoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNDQzNzI5MDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIEV4dGVudHMgaW4gZXh0NCoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgZXh0ZW50cyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5LiBUaGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gc3RhcnQgaXMgdGhlIGhlYWRlciBmaWxlLCB3aGljaCB1c3VhbGx5IGRlZmluZXMgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4gSSdtIGdvaW5nIHRvIGp1bXAgaW50byBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAgYW5kIHRha2UgYSBsb29rIGFyb3VuZCBsaW5lIDU2LiBJJ20gaG9waW5nIHRvIGZpbmQgdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgdG8gcmVwcmVzZW50IGFuIGV4dGVudCwgd2hpY2ggd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24uIExldCdzIHNlZSB3aGF0IHdlJ3ZlIGdvdCEgSSdtIGV4cGVjdGluZyB0byBzZWUgdGhpbmdzIGxpa2UgdGhlIGBleHQ0X2V4dGVudF9oZWFkZXJgLCBgZXh0NF9leHRlbnRgLCBhbmQgcG9zc2libHkgc29tZSByZWxhdGVkIHN0cnVjdHVyZXMgZm9yIG1hbmFnaW5nIHRoZSBleHRlbnQgdHJlZSwgaWYgdGhleSdyZSB1c2luZyBvbmUuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBvbi1kaXNrIGZvcm1hdCBhbmQgaG93IHRoZSBsb2dpY2FsLXRvLXBoeXNpY2FsIG1hcHBpbmcgaXMgaGFuZGxlZC4gS25vd2luZyB0aGlzIHNob3VsZCBwcm92aWRlIGtleSBpbnNpZ2h0IGludG8gdW5kZXJzdGFuZGluZyBmaWxlIGFsbG9jYXRpb24gaW4gdGhpcyBmaWxlc3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTk1LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6MDQuNjE4NzU5NTU2WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExODQ0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDUwOlxcdH07XFxuICA1MTpcXHRcXG4gIDUyOlxcdC8qXFxuICA1MzpcXHQgKiBUaGlzIGlzIHRoZSBleHRlbnQgb24tZGlzayBzdHJ1Y3R1cmUuXFxuICA1NDpcXHQgKiBJdCdzIHVzZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZS5cXG4gIDU1OlxcdCAqL1xcbiAgNTY6XFx0c3RydWN0IGV4dDRfZXh0ZW50IHtcXG4gIDU3OlxcdFxcdF9fbGUzMlxcdGVlX2Jsb2NrO1xcdC8qIGZpcnN0IGxvZ2ljYWwgYmxvY2sgZXh0ZW50IGNvdmVycyAqL1xcbiAgNTg6XFx0XFx0X19sZTE2XFx0ZWVfbGVuO1xcdFxcdC8qIG51bWJlciBvZiBibG9ja3MgY292ZXJlZCBieSBleHRlbnQgKi9cXG4gIDU5OlxcdFxcdF9fbGUxNlxcdGVlX3N0YXJ0X2hpO1xcdC8qIGhpZ2ggMTYgYml0cyBvZiBwaHlzaWNhbCBibG9jayAqL1xcbiAgNjA6XFx0XFx0X19sZTMyXFx0ZWVfc3RhcnRfbG87XFx0LyogbG93IDMyIGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cXG4gIDYxOlxcdH07XFxuICA2MjpcXHRcXG4gIDYzOlxcdC8qXFxuICA2NDpcXHQgKiBUaGlzIGlzIGluZGV4IG9uLWRpc2sgc3RydWN0dXJlLlxcbiAgNjU6XFx0ICogSXQncyB1c2VkIGF0IGFsbCB0aGUgbGV2ZWxzIGV4Y2VwdCB0aGUgYm90dG9tLlxcbiAgNjY6XFx0ICovXFxuICA2NzpcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4IHtcXG4gIDY4OlxcdFxcdF9fbGUzMlxcdGVpX2Jsb2NrO1xcdC8qIGluZGV4IGNvdmVycyBsb2dpY2FsIGJsb2NrcyBmcm9tICdibG9jaycgKi9cXG4gIDY5OlxcdFxcdF9fbGUzMlxcdGVpX2xlYWZfbG87XFx0LyogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgYmxvY2sgb2YgdGhlIG5leHQgKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMTowNC42MTg4ODAwMDVaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI5NDczOTE1MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRXh0ZW50IEluaXRpYWxpemF0aW9uIGluIEV4dDQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIGltbWVkaWF0ZWx5IG15IGZvY3VzIGlzIGRyYXduIHRvIHRoZSBgc3RydWN0IGV4dDRfZXh0ZW50YC4gUmlnaHQsIEkgcmVtZW1iZXIgdGhhdCBzdHJ1Y3R1cmU6IGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gLiBDbGFzc2ljLiBOb3csIHdpdGhpbiB0aGlzIHBhdGNoLCBJIHNlZSB0aGV5J3JlIGluaXRpYWxpemluZyBhIG5ldyBleHRlbnQsIGBuZXdleGAuIFRoZSBjb2RlIHNuaXBwZXQgc2hvd3M6XG5cbmBgYGNcblx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7XG5cblx0XHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApO1xuXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XG5cdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG5gYGBcblxuVGhlIGZpcnN0IHR3byBpbml0aWFsaXphdGlvbnMgYXJlIHN0cmFpZ2h0Zm9yd2FyZDogc2V0dGluZyBgZWVfYmxvY2tgIHRvIHplcm8gKGxpa2VseSByZXByZXNlbnRpbmcgYW4gdW5hbGxvY2F0ZWQgb3IgZW1wdHkgYmxvY2spIGFuZCBgZWVfbGVuYCB0byBgbGVuYCBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gVGhlIGNyaXRpY2FsIHBhcnQgaGVyZSBpcyB0aGlzIGNhbGwgdG8gYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AuIEkgbmVlZCB0byBkaWcgaW50byB0aGF0IGZ1bmN0aW9uLiBDbGVhcmx5LCB0aGF0J3Mgd2hlcmUgdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpcyBiZWluZyBzdG9yZWQsIHByb2JhYmx5IHNwcmVhZGluZyBpdCBhY3Jvc3MgdGhlIGBlZV9zdGFydF9oaWAgYW5kIGBlZV9zdGFydF9sb2AgZmllbGRzLCB3aGljaCBpcyB0aGUgc3RhbmRhcmQgcHJvY2VkdXJlLiBJJ2xsIG5lZWQgdG8gdmVyaWZ5IHRoYXQgaXQgY29ycmVjdGx5IGhhbmRsZXMgdGhlIDY0LWJpdCBibG9jayBudW1iZXJzLiBJJ2xsIGdvIGNoZWNrIHRoYXQgbmV4dC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjIwMSwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjA4LjkxMzYyMjI3NloiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwODMxNTQwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2V4dF9zdG9yZV9wYmxvY2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yMzI9c3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9pZHhfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKml4KVxcbi0tXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDEtLypcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0MjogKiBleHQ0X2V4dF9zdG9yZV9wYmxvY2s6XFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDMtICogc3RvcmVzIGEgbGFyZ2UgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gYW4gZXh0ZW50IHN0cnVjdCxcXG4tLVxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ1LSAqL1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6MjQ2OnN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0Ny1cXHRcXHRcXHRcXHRcXHQgZXh0NF9mc2Jsa190IHBiKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0yMjc9c3RhdGljIGludCBleHRlbnRzX2t1bml0X2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy0zMTktXFx0RVhUX0ZJUlNUX0VYVEVOVChlaCktXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KEVYVF9EQVRBX0xFTik7XFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzozMjA6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKEVYVF9GSVJTVF9FWFRFTlQoZWgpLCBFWFRfREFUQV9QQkxLKTtcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMyMS1cXHRpZiAoIXBhcmFtIHx8IHBhcmFtLVxcdTAwM2Vpc191bndyaXRfYXRfc3RhcnQpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIwODUtXFx0XFx0XFx0ZXgtXFx1MDAzZWVlX2Jsb2NrID0gbmV3ZXh0LVxcdTAwM2VlZV9ibG9jaztcXG5mcy9leHQ0L2V4dGVudHMuYzoyMDg2OlxcdFxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIwODctXFx0XFx0XFx0ZXgtXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjE5Ni1cXHRuZWFyZXgtXFx1MDAzZWVlX2Jsb2NrID0gbmV3ZXh0LVxcdTAwM2VlZV9ibG9jaztcXG5mcy9leHQ0L2V4dGVudHMuYzoyMTk3OlxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhuZWFyZXgsIGV4dDRfZXh0X3BibG9jayhuZXdleHQpKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTk4LVxcdG5lYXJleC1cXHUwMDNlZWVfbGVuID0gbmV3ZXh0LVxcdTAwM2VlZV9sZW47XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yNjE0PWV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTI3MzktXFx0XFx0XFx0LyogdGhpcyBleHRlbnQgaXMgcmVtb3ZlZDsgbWFyayBzbG90IGVudGlyZWx5IHVudXNlZCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjI3NDA6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0yNzQxLVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MzE5MT1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfZXh0ZW50X2F0KGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zMjQ2LVxcdGV4Mi1cXHUwMDNlZWVfbGVuICAgPSBjcHVfdG9fbGUxNihlZV9sZW4gLSAoc3BsaXQgLSBlZV9ibG9jaykpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjMyNDc6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MiwgbmV3YmxvY2spO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDgtXFx0aWYgKGlzX3Vud3JpdClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTM1NTc9ZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzY0NS1cXHRcXHRcXHRleC1cXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihlZV9ibG9jayArIG1hcF9sZW4pO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM2NDY6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBlZV9wYmxrICsgbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzY0Ny1cXHRcXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNjkxLVxcdFxcdFxcdGFidXRfZXgtXFx1MDAzZWVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobmV4dF9sYmxrIC0gbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmM6MzY5MjpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soYWJ1dF9leCwgbmV4dF9wYmxrIC0gbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzY5My1cXHRcXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ1LVxcdFxcdFxcdFxcdGNwdV90b19sZTE2KCphbGxvY2F0ZWQgLSBzcGxpdF9tYXAubV9sZW4pO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM3NDY6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZ6ZXJvX2V4MSxcXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ3LVxcdFxcdFxcdFxcdGV4dDRfZXh0X3BibG9jayhleCkgKyBzcGxpdF9tYXAubV9sYmxrICtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NjAtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ZWVfYmxvY2spO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM3NjE6XFx0XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZ6ZXJvX2V4MixcXG5mcy9leHQ0L2V4dGVudHMuYy0zNzYyLVxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIGV4dDRfZXh0X3BibG9jayhleCkpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDQ3My1cXHRwYmxrID0gbmV3YmxvY2sgKyBvZmZzZXQ7XFxuZnMvZXh0NC9leHRlbnRzLmM6NDQ3NDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBwYmxrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy00NDc1LVxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGFyLmxlbik7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01NzYzPWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTg5Ny1cXHRcXHR0bXBfZXggPSAqZXgxO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU4OTg6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MSwgZXh0NF9leHRfcGJsb2NrKGV4MikpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU4OTk6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MiwgZXh0NF9leHRfcGJsb2NrKFxcdTAwMjZ0bXBfZXgpKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01OTAwLVxcdFxcdGV4MS1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZTJfbGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYwMjc9aW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDgwLVxcdFxcdGV4dDRfZXh0X21hcmtfaW5pdGlhbGl6ZWQoZXgpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYwODE6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBwYmxrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDgyLVxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTkzMT1zdGF0aWMgaW50IGV4dDRfZmNfd3JpdGVfaW5vZGVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKmNyYylcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy05NjEtXFx0XFx0ZXgtXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KHJhbmdlLVxcdTAwM2VsZW4pO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo5NjI6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCByYW5nZS1cXHUwMDNlcGJsayk7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2My1cXHRcXHRpZiAocmFuZ2UtXFx1MDAzZXVud3JpdHRlbilcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjIwMi1cXHRcXHRcXHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGN1cik7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIyMDM6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjA0LVxcdFxcdFxcdFxcdFxcdTAwMjZuZXdleCwgc3RhcnRfcGJsayArIGN1ciAtIHN0YXJ0KTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTExMTctXFx0XFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcXG5mcy9leHQ0L2lubGluZS5jOjExMTg6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZuZXdleCwgYmxvY2spO1xcbmZzL2V4dDQvaW5saW5lLmMtMTExOS1cXHRcXHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgMCk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmMtMzMtXFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG5mcy9leHQ0L21pZ3JhdGUuYzozNDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4dCwgbGItXFx1MDAzZWZpcnN0X3BibG9jayk7XFxuZnMvZXh0NC9taWdyYXRlLmMtMzUtXFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6MTAuNTIxOTQyMjIzWiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNjk4MzM4NjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHJlYWRpbmcgYW5kIHRoaW5raW5nIGFib3V0IHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IGEgZ29vZCBsb29rIGF0IGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgLiBMZXQncyBwdWxsIHVwIHRoZSBkZWZpbml0aW9uLCByaWdodCBoZXJlIGluIGBmcy9leHQ0L2V4dDRfZXh0ZW50cy5oYC4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBmdW5jdGlvbiBwbGF5cyB3aXRoIHRoZSBleHRlbnQgc3RydWN0dXJlIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBzb2xpZCBncmFzcCBvZiB0aGUgb3ZlcmFsbCBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCByZWxhdGVzIHRvIGJsb2NrIGFsbG9jYXRpb24sIHNvIGxldCdzIHNlZSBob3cgdGhpcyBwaWVjZSBmaXRzIGluLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgZGVhbHMgd2l0aCB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyLCBvciBgcGJsb2NrYCwgd2l0aGluIGEgZ2l2ZW4gZXh0ZW50LCBidXQgbGV0J3MgY29uZmlybSB0aGF0LiBJJ20gZ3Vlc3NpbmcgaXQgaGFuZGxlcyBzdG9yaW5nIG9yIHJldHJpZXZpbmcgdGhhdCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gSXQncyBsaWtlbHkgaW52b2x2ZWQgaW4gdXBkYXRpbmcgYW4gZXh0ZW50J3MgbWV0YWRhdGEgd2hlbiBhIGZpbGUgYmxvY2sgZ2V0cyBhbGxvY2F0ZWQgb3IgZGVhbGxvY2F0ZWQsIG9yIG1heWJlIHdoZW4gaGFuZGxpbmcgZmlsZSBleHRlbnNpb24gb3IgdHJ1bmNhdGlvbi4gTGV0J3Mgc2VlIGhvdyBpdCBoYW5kbGVzIHRob3NlIGVkZ2UgY2FzZXMuIEkgaG9wZSB0aGUgaW5saW5lIGNvbW1lbnRzIGFyZSBnb29kLCB0aGF0IHdvdWxkIG1ha2UgdGhpcyBlYXNpZXIuIEFscmlnaHQsIGxldCdzIGRpZyBpbiBhbmQgc2VlIGV4YWN0bHkgd2hhdCdzIGhhcHBlbmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTA1MSwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjE0LjY5MTc3ODEyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk4NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0NF9leHRlbnRzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjQyLFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjQyOlxcdCAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcXG4gMjQzOlxcdCAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsXFxuIDI0NDpcXHQgKiBicmVha2luZyBpdCBpbnRvIHBhcnRzXFxuIDI0NTpcXHQgKi9cXG4gMjQ2OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcXG4gMjQ3OlxcdFxcdFxcdFxcdFxcdFxcdCBleHQ0X2ZzYmxrX3QgcGIpXFxuIDI0ODpcXHR7XFxuIDI0OTpcXHRcXHRleC1cXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFxcdTAwMjYgMHhmZmZmZmZmZikpO1xcbiAyNTA6XFx0XFx0ZXgtXFx1MDAzZWVlX3N0YXJ0X2hpID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIGxvbmcpICgocGIgXFx1MDAzZVxcdTAwM2UgMzEpIFxcdTAwM2VcXHUwMDNlIDEpIFxcdTAwMjZcXG4gMjUxOlxcdFxcdFxcdFxcdFxcdCAgICAgIDB4ZmZmZik7XFxuIDI1MjpcXHR9XFxuIDI1MzpcXHRcXG4gMjU0OlxcdC8qXFxuIDI1NTpcXHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XFxuIDI1NjpcXHQgKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBpbmRleCBzdHJ1Y3QsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjE0LjY5MTg3ODQ5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExODQxNjMwNTE5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBEYXRhIEluaXRpYWxpemF0aW9uIGluIGV4dDQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBob3cgc29tZSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBpbml0aWFsaXplZCBoZXJlLCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gY29kZS4gRmlyc3QsIEkgc2VlIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgYGVlX3N0YXJ0X2xvYCBhbmQgYGVlX3N0YXJ0X2hpYCB3aXRoaW4gdGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLiBCZWZvcmUgdGhhdCwgYGVlX2Jsb2NrYCBhbmQgYGVlX2xlbmAgYXJlIHNldCwgc28gYWxsIGZpZWxkcyBvZiBgbmV3ZXhgIGFyZSBzZXQ6XG5cbmBgYGNcblx0XHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApO1xuXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XG5cdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG5gYGBcblxuSSBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGUgc2l6ZSBvZiBgZXh0NF9leHRlbnRgLiBJdCdzIGBlZV9ibG9ja2AgKDQgYnl0ZXMpLCBgZWVfbGVuYCAoMiBieXRlcyksIGBlZV9zdGFydF9oaWAgKDIgYnl0ZXMpLCBhbmQgYGVlX3N0YXJ0X2xvYCAoNCBieXRlcyksIHRvdGFsaW5nIDEyIGJ5dGVzLiBBbmQsIG5vIHBhZGRpbmcgaXMgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLCBzbyBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhcyBleHBlY3RlZC5cblxuVGhlbiBJIGxvb2sgYXQgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCB3aGljaCBhcHBlYXJzIHRvIGJlIHBhcnRpYWxseSBpbml0aWFsaXplZDpcblxuYGBgY1xuXHRzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0ge1xuXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcblx0fTtcbmBgYFxuXG5UaGUgY29tcGlsZXIgd2lsbCB6ZXJvIG91dCB0aGUgcmVtYWluaW5nIGZpZWxkcy4gU2FtZSBnb2VzIGZvciBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCwgcGFydGlhbGx5IGluaXRpYWxpemVkIGFuZCB0aGUgcmVzdCB3aWxsIGJlIHplcm9lZCBvdXQuXG5cbmBgYGNcblx0c3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpID0ge1xuXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG5cdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuXHRcdC52YWx1ZSA9IE5VTEwsXG5cdFx0LnZhbHVlX2xlbiA9IDAsXG5cdH07XG5gYGBcblxuYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLCB0aGF0J3MgY2xlYXIgZW5vdWdoLlxuXG5gYGBjXG5cdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG5gYGBcblxuTm93LCByZWdhcmRpbmcgYGJ1ZmAsIEkgc2VlIGl0J3MgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgLCBidXQgd2l0aG91dCBgX19HRlBfWkVST2AuIFRoZSBjb2RlIHRoZW4gcmVhZHMgaW5saW5lIGRhdGEgaW50byBgYnVmYDpcblxuYGBgY1xuXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcblx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuXHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBcdTAwMjZpbmxpbmVfc2l6ZSwgXHUwMDI2aWxvYyk7XG5gYGBcblxuSWYgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZmFpbHMsIGBidWZgIGdldHMgZnJlZWQuIElmIGl0IHN1Y2NlZWRzLCBgYnVmYCBjb250YWlucyB0aGUgaW5saW5lIGRhdGEuIEFmdGVyIHRoYXQsIGEgbmV3IGJsb2NrIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkIHVzaW5nIGBtZW1zZXRgLiBUaGUgY29udGVudHMgb2YgYGJ1ZmAgYXJlIHRoZW4gY29waWVkIGludG8gdGhhdCBuZXdseSBhbGxvY2F0ZWQgYmxvY2ssIGJ1dCBvbmx5IGlmIHRoZSBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeS5cblxuYGBgY1xuXHRtZW1zZXQoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIDAsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuXHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSlcblx0XHRtZW1jcHkoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpO1xuYGBgXG5cblRoaXMgcmFpc2VzIHRoZSBxdWVzdGlvbjogSXMgYGJ1ZmAgKmd1YXJhbnRlZWQqIHRvIGJlIGZ1bGx5IGluaXRpYWxpemVkIGJ5IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgPyBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyB0aGF0IGZ1bmN0aW9uIHdvcmtzIHRvIGJlIGNlcnRhaW4uIFRoYXQncyB0aGUga2V5IHF1ZXN0aW9uIGhlcmUsIHRoYXQgZnVuY3Rpb24gaXMgY3JpdGljYWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2MzMsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3ODEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMToyNi41MzM1MTIxNzlaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1OTg2NjM4MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9yZWFkX2lubGluZV9kYXRhXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvaW5saW5lLmM9MTQ1PWludCBleHQ0X2ZpbmRfaW5saW5lX2RhdGFfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE4My1cXG5mcy9leHQ0L2lubGluZS5jOjE4NDpzdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsXFxuZnMvZXh0NC9pbmxpbmUuYy0xODUtXFx0XFx0XFx0XFx0IHVuc2lnbmVkIGludCBsZW4sXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTUwND1zdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTM1LVxcdGthZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgMCk7XFxuZnMvZXh0NC9pbmxpbmUuYzo1MzY6XFx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBrYWRkciwgbGVuLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy01MzctXFx0a2FkZHIgPSBmb2xpb196ZXJvX3RhaWwoZm9saW8sIGxlbiwga2FkZHIgKyBsZW4pO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMTM3PXN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTU0LVxcbmZzL2V4dDQvaW5saW5lLmM6MTE1NTpcXHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTU2LVxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEzMDU9aW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMzQwLVxcbmZzL2V4dDQvaW5saW5lLmM6MTM0MTpcXHRyZXQgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGRpcl9idWYsIGlubGluZV9zaXplLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMzQyLVxcdHVwX3JlYWQoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZXhhdHRyX3NlbSk7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE0MjY9aW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNDU5LVxcbmZzL2V4dDQvaW5saW5lLmM6MTQ2MDpcXHRyZXQgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGRpcl9idWYsIGlubGluZV9zaXplLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xNDYxLVxcdHVwX3JlYWQoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZXhhdHRyX3NlbSk7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE1NTc9dm9pZCAqZXh0NF9yZWFkX2lubGluZV9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE1NzItXFxuZnMvZXh0NC9pbmxpbmUuYzoxNTczOlxcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgbGluaywgaW5saW5lX3NpemUsIFxcdTAwMjZpbG9jKTtcXG5mcy9leHQ0L2lubGluZS5jLTE1NzQtXFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6MjguMTMyMTg4NDc0WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc0OTQzNDU1MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvcmUgZnVuY3Rpb24gaXQgc2VydmVzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIGFyY2hpdGVjdHVyZS4gSSdtIGltbWVkaWF0ZWx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGRldmlhdGVzIGZyb20gdGhlIHN0YW5kYXJkIGJsb2NrLWJhc2VkIHJlYWQgb3BlcmF0aW9ucy4gSSdtIGV4cGVjdGluZyB0aGlzIGhhbmRsZXMgZGF0YSB0aGF0J3MgKmlubGluZSogd2l0aGluIHRoZSBpbm9kZSBpdHNlbGYsIGJ5cGFzc2luZyB0aGUgbmVlZCBmb3Igc2VwYXJhdGUgZGF0YSBibG9ja3MuIFRoaXMgaW1wbGllcyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBiZW5lZml0cywgYXNzdW1pbmcgdGhlIGRhdGEgc2l6ZSBpcyBhcHByb3ByaWF0ZSBmb3IgaW5saW5lIHN0b3JhZ2UuXG5cbkknbGwgYmUgbG9va2luZyBmb3Igc2V2ZXJhbCBrZXkgdGhpbmdzOiB0aGUgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgdGhpcyBmdW5jdGlvbiAoaS5lLiwgd2hlbiBkb2VzIGV4dDQgZGVjaWRlIHRvIHVzZSBpbmxpbmUgZGF0YT8pLCBob3cgaXQgdmVyaWZpZXMgdGhlIGludGVncml0eSBvZiB0aGUgaW5saW5lIGRhdGEgKGNoZWNrc3VtcywgbGVuZ3RoIGNoZWNrcywgZXRjLiksIHRoZSBtZWNoYW5pc21zIHVzZWQgdG8gY29weSB0aGUgZGF0YSBvdXQgdG8gdGhlIHJlcXVlc3RpbmcgYnVmZmVyLCBhbmQgaWYgdGhlcmUgYXJlIGFueSBvcHRpbWl6YXRpb25zIHNwZWNpZmljIHRvIGlubGluZSByZWFkcy4gTXkgZXhwZXJpZW5jZSB0ZWxscyBtZSB0aGVyZSBhcmUgdXN1YWxseSBjb25zaWRlcmF0aW9ucyByZWxhdGVkIHRvIHBhcnRpYWwgcmVhZHMgYW5kIGhvdyB0aGV5IGFyZSBoYW5kbGVkLCBhbG9uZyB3aXRoIHBvdGVudGlhbCBhbGlnbm1lbnQgaXNzdWVzLlxuXG5JJ2xsIGFsc28ga2VlcCBhbiBleWUgb3V0IGZvciBwb3RlbnRpYWwgY29uY3VycmVuY3kgY29uY2VybnMuIElmIHRoaXMgZnVuY3Rpb24gaXMgaGVhdmlseSB1c2VkIGFuZCBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLCB0aGVyZSBtaWdodCBiZSBsb2NraW5nIG1lY2hhbmlzbXMgdG8gZW5zdXJlIGRhdGEgY29uc2lzdGVuY3kuXG5cblVsdGltYXRlbHksIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHBhdGggb2YgZXhlY3V0aW9uOiBmcm9tIHRoZSBWRlMgbGF5ZXIgbWFraW5nIHRoZSByZWFkIHJlcXVlc3QgYWxsIHRoZSB3YXkgZG93biB0byBob3cgdGhlIGlubGluZSBkYXRhIGlzIHJldHJpZXZlZCBhbmQgcGFzc2VkIGJhY2sgdG8gdGhlIHVzZXIgc3BhY2UgYnVmZmVyLiBJJ20gYXNzdW1pbmcgdGhlcmUncyBsaWtlbHkgc29tZSBjbGV2ZXIgYml0IG1hbmlwdWxhdGlvbiBvciBkYXRhIHN0cnVjdHVyZSB1bmRlcnN0YW5kaW5nIGluIHBsYXkgaGVyZSB0byBtYWtlIHRoaXMgZWZmaWNpZW50LiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTkyMSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjM1LjYyNjUzOTY1NloiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTI0MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pbmxpbmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxODA6XFx0XFx0YnJlbHNlKGlzLmlsb2MuYmgpO1xcbiAxODE6XFx0XFx0cmV0dXJuIGVycm9yO1xcbiAxODI6XFx0fVxcbiAxODM6XFx0XFxuIDE4NDpcXHRzdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IGxlbixcXG4gMTg2OlxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxcbiAxODc6XFx0e1xcbiAxODg6XFx0XFx0c3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmVudHJ5O1xcbiAxODk6XFx0XFx0c3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7XFxuIDE5MDpcXHRcXHRpbnQgY3BfbGVuID0gMDtcXG4gMTkxOlxcdFxcdHN0cnVjdCBleHQ0X2lub2RlICpyYXdfaW5vZGU7XFxuIDE5MjpcXHRcXG4gMTkzOlxcdFxcdGlmICghbGVuKVxcbiAxOTQ6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDE5NTpcXHRcXG4gMTk2OlxcdFxcdEJVR19PTihsZW4gXFx1MDAzZSBFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplKTtcXG4gMTk3OlxcdFxcbiAxOTg6XFx0XFx0Y3BfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xcbiAxOTk6XFx0XFxuIDIwMDpcXHRcXHRyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZShpbG9jKTtcXG4gMjAxOlxcdFxcdG1lbWNweShidWZmZXIsICh2b2lkICopKHJhd19pbm9kZS1cXHUwMDNlaV9ibG9jayksIGNwX2xlbik7XFxuIDIwMjpcXHRcXG4gMjAzOlxcdFxcdGxlbiAtPSBjcF9sZW47XFxuIDIwNDpcXHRcXHRidWZmZXIgKz0gY3BfbGVuO1xcbiAyMDU6XFx0XFxuIDIwNjpcXHRcXHRpZiAoIWxlbilcXG4gMjA3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbiAyMDg6XFx0XFxuIDIwOTpcXHRcXHRoZWFkZXIgPSBJSERSKGlub2RlLCByYXdfaW5vZGUpO1xcbiAyMTA6XFx0XFx0ZW50cnkgPSAoc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKikoKHZvaWQgKilyYXdfaW5vZGUgK1xcbiAyMTE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX29mZik7XFxuIDIxMjpcXHRcXHRsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbixcXG4gMjEzOlxcdFxcdFxcdCAgICAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LVxcdTAwM2VlX3ZhbHVlX3NpemUpKTtcXG4gMjE0OlxcdFxcbiAyMTU6XFx0XFx0bWVtY3B5KGJ1ZmZlcixcXG4gMjE2OlxcdFxcdCAgICAgICAodm9pZCAqKUlGSVJTVChoZWFkZXIpICsgbGUxNl90b19jcHUoZW50cnktXFx1MDAzZWVfdmFsdWVfb2ZmcyksIGxlbik7XFxuIDIxNzpcXHRcXHRjcF9sZW4gKz0gbGVuO1xcbiAyMTg6XFx0XFxuIDIxOTpcXHRvdXQ6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjM1LjYyNjc5NDc4NloiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTA1NzI1MTIwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gU28sIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIHN1cHBvc2VkIHRvIGNvcHkgaW5saW5lIGRhdGEgZnJvbSBhbiBpbm9kZSBpbnRvIGEgYnVmZmVyLiBNeSBpbml0aWFsIHVuZGVyc3RhbmRpbmcsIGJhc2VkIG9uIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgY29kZSwgaXMgdGhhdCBpdCBjb3BpZXMgZXhhY3RseSBgaW5saW5lX3NpemVgIGJ5dGVzLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhLCB3aGljaCBpcyBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jYC5cblxuSG93ZXZlciwgbG9va2luZyBjbG9zZXIsIHRoZXJlJ3MgYSBjcnVjaWFsIGRldGFpbC4gVGhlIGBsZW5gIHBhcmFtZXRlciBwYXNzZWQgdG8gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMsIGluIGZhY3QsIGBpbmxpbmVfc2l6ZWAuIFRoZSBmdW5jdGlvbiBjb3BpZXMgdXAgdG8gdGhlIHByb3ZpZGVkIGBsZW5gIGJ5dGVzLCBidXQgKkJVR19PTnMqIGlmIGBsZW5gIGV4Y2VlZHMgdGhlIGFjdHVhbCBpbmxpbmUgZGF0YSBzaXplLiBUaGlzIG1ha2VzIHNlbnNlLlxuXG5UaGVuIEkgc2VlIHRoaXMgc25pcHBldDpcblxuYGBgY1xubGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sXG5cdFx0ICAgICh1bnNpZ25lZCBpbnQpbGUzMl90b19jcHUoZW50cnktXHUwMDNlZV92YWx1ZV9zaXplKSk7XG5gYGBcblxuQWhhISBgbGVuYCAod2hpY2ggc3RhcnRlZCBhcyBgaW5saW5lX3NpemVgKSBpcyBwb3RlbnRpYWxseSByZWR1Y2VkIGJ5IHRoZSBzaXplIG9mIHRoZSAqdmFsdWUqIG9mIHRoZSBpbmxpbmUgZGF0YSBlbnRyeS4gVGhpcyByZWR1Y3Rpb24gb2YgYGxlbmAgaW50cm9kdWNlcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgZnVuY3Rpb24gZG9lc24ndCBjb3B5IHRoZSBmdWxsIGBpbmxpbmVfc2l6ZWAgYnl0ZXMuIEFuZCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB0aGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsIGFzIGBlcnJvcmAsIHdoaWNoIGlzIHRoZW4gbGF0ZXIgdXNlZCBhcyBzdWNoOlxuXG5gYGBjXG5cdGVycm9yID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBidWYsIGlubGluZV9zaXplLCBpbG9jKTtcblx0aWYgKGVycm9yIFx1MDAzYyAwKVxuXHRcdGdvdG8gb3V0O1xuYGBgXG5cbkhlcmUncyB0aGUgcHJvYmxlbTogVGhlIGNvZGUgKmRvZXNuJ3QqIGNoZWNrIGlmIGBlcnJvcmAgaXMgbGVzcyB0aGFuIGBpbmxpbmVfc2l6ZWAuIEl0IHByb2NlZWRzIHRvIGBtZW1jcHlgIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCB1c2luZyBgaW5saW5lX3NpemVgIGFzIHRoZSBjb3B5IHNpemUuIElmIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvcGllZCBmZXdlciB0aGFuIGBpbmxpbmVfc2l6ZWAgYnl0ZXMsIHRoZW4gdGhlIGBidWZgIGJ1ZmZlciB3aWxsIGNvbnRhaW4gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSBga21hbGxvY2AgYWxsb2NhdGlvbi4gVGhvc2UgdW5pbml0aWFsaXplZCBieXRlcyB3aWxsIHRoZW4gYmUgY29waWVkIGludG8gYGRhdGFfYmgtXHUwMDNlYl9kYXRhYC4gVGhpcyBjb3VsZCBsZWFkIHRvIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcywgc2luY2UgdGhlc2UgdW5pbml0aWFsaXplZCBieXRlcyBhcmUgZWZmZWN0aXZlbHkgZGF0YSBsZWFrYWdlIGZyb20gbWVtb3J5LiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBjb3BpZXMgbGVzcyB0aGFuIHRoZSBgaW5saW5lX3NpemVgLCBpbiB0aGUgY2FsbGVycy4gSSBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYWN0dWFsIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvZGUgYW5kIGhvdyBgZW50cnktXHUwMDNlZV92YWx1ZV9zaXplYCBpcyBkZXRlcm1pbmVkLiBJdCdzIHRpbWUgdG8gdGVzdCBhbmQgcmVwcm9kdWNlIHRoZSBpc3N1ZSBhbmQgdGhlbiBwYXRjaCB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjkxOSwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjQ2LjY4NDA0OTUyOVoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYxMzI2ODE2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2dldF9pbmxpbmVfc2l6ZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2lubGluZS5jPTI1PXN0YXRpYyBpbnQgZXh0NF9kYV9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjgtXFxuZnMvZXh0NC9pbmxpbmUuYzoyOTpzdGF0aWMgaW50IGV4dDRfZ2V0X2lubGluZV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9pbmxpbmUuYy0zMC17XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTUwND1zdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTI0LVxcbmZzL2V4dDQvaW5saW5lLmM6NTI1OlxcdGxlbiA9IG1pbl90KHNpemVfdCwgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpLCBpX3NpemVfcmVhZChpbm9kZSkpO1xcbmZzL2V4dDQvaW5saW5lLmMtNTI2LVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz01NzM9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy02MjMtXFx0ZnJvbSA9IDA7XFxuZnMvZXh0NC9pbmxpbmUuYzo2MjQ6XFx0dG8gPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy02MjUtXFx0aWYgKCFmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSkge1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz04ODY9c3RhdGljIGludCBleHQ0X2RhX2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy05MDMtXFxuZnMvZXh0NC9pbmxpbmUuYzo5MDQ6XFx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy05MDUtXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTExNDctXFxuZnMvZXh0NC9pbmxpbmUuYzoxMTQ4OlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtMTE0OS1cXHRidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEzMDU9aW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMzMyLVxcbmZzL2V4dDQvaW5saW5lLmM6MTMzMzpcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jLTEzMzQtXFx0ZGlyX2J1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTQyNj1pbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE0NTEtXFxuZnMvZXh0NC9pbmxpbmUuYzoxNDUyOlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtMTQ1My1cXHRkaXJfYnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xNTU3PXZvaWQgKmV4dDRfcmVhZF9pbmxpbmVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNTY3LVxcdHJldCA9IC1FTk9NRU07XFxuZnMvZXh0NC9pbmxpbmUuYzoxNTY4OlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtMTU2OS1cXHRsaW5rID0ga21hbGxvYyhpbmxpbmVfc2l6ZSArIDEsIEdGUF9OT0ZTKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTYzOT1zdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfZmluZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICpkaXIsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE2NzktXFxuZnMvZXh0NC9pbmxpbmUuYzoxNjgwOlxcdGlmIChleHQ0X2dldF9pbmxpbmVfc2l6ZShkaXIpID09IEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpXFxuZnMvZXh0NC9pbmxpbmUuYy0xNjgxLVxcdFxcdGdvdG8gb3V0O1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNjgzLVxcdGlubGluZV9zdGFydCA9IGV4dDRfZ2V0X2lubGluZV94YXR0cl9wb3MoZGlyLCBcXHUwMDI2aXMuaWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYzoxNjg0OlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoZGlyKSAtIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkU7XFxuZnMvZXh0NC9pbmxpbmUuYy0xNjg1LVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xNzAyPWludCBleHQ0X2RlbGV0ZV9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTcyOS1cXHRcXHRpbmxpbmVfc3RhcnQgPSBleHQ0X2dldF9pbmxpbmVfeGF0dHJfcG9zKGRpciwgXFx1MDAyNmlsb2MpO1xcbmZzL2V4dDQvaW5saW5lLmM6MTczMDpcXHRcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcikgLVxcbmZzL2V4dDQvaW5saW5lLmMtMTczMS1cXHRcXHRcXHRcXHRFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xNzYwPWV4dDRfZ2V0X2lubGluZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNzY3LVxcbmZzL2V4dDQvaW5saW5lLmM6MTc2ODpcXHRCVUdfT04ob2Zmc2V0IFxcdTAwM2UgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpKTtcXG5mcy9leHQ0L2lubGluZS5jLTE3NjktXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE3NzUtXFx0XFx0b2Zmc2V0IC09IEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkU7XFxuZnMvZXh0NC9pbmxpbmUuYzoxNzc2OlxcdFxcdCppbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKSAtXFxuZnMvZXh0NC9pbmxpbmUuYy0xNzc3LVxcdFxcdFxcdFxcdEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkU7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE3ODU9Ym9vbCBlbXB0eV9pbmxpbmVfZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgKmhhc19pbmxpbmVfZGF0YSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTgxNy1cXG5mcy9leHQ0L2lubGluZS5jOjE4MTg6XFx0aW5saW5lX2xlbiA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcik7XFxuZnMvZXh0NC9pbmxpbmUuYy0xODE5LVxcdG9mZnNldCA9IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xODU5PWludCBleHQ0X2lubGluZV9kYXRhX2lvbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpb21hcCAqaW9tYXApXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE4ODAtXFx0aW9tYXAtXFx1MDAzZW9mZnNldCA9IDA7XFxuZnMvZXh0NC9pbmxpbmUuYzoxODgxOlxcdGlvbWFwLVxcdTAwM2VsZW5ndGggPSBtaW5fdChsb2ZmX3QsIGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKSxcXG5mcy9leHQ0L2lubGluZS5jLTE4ODItXFx0XFx0XFx0ICAgICAgaV9zaXplX3JlYWQoaW5vZGUpKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE5MjYtXFx0aV9zaXplID0gaW5vZGUtXFx1MDAzZWlfc2l6ZTtcXG5mcy9leHQ0L2lubGluZS5jOjE5Mjc6XFx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xOTI4LVxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGlza3NpemUgPSBpX3NpemU7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjQ4LjI5NzM0NDMwNloiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTk0MjY3NTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBgZXh0NF9nZXRfaW5saW5lX3NpemVgKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBgZXh0NF9nZXRfaW5saW5lX3NpemVgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBmb2N1c2VzIG9uIGl0cyBwdXJwb3NlOiBjbGVhcmx5LCB0aGlzIHJvdXRpbmUgaXMgZGVzaWduZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGRhdGEgdGhhdCBjYW4gYmUgaW5saW5lZCB3aXRoaW4gYW4gZXh0NCBpbm9kZSBpdHNlbGYuIEkgbmVlZCB0byBpbW1lZGlhdGVseSB1bmRlcnN0YW5kIHdoYXQgaW5wdXRzIGl0IHRha2VzLiBMaWtlbHksIHRoZXJlIHdpbGwgYmUgYXJndW1lbnRzIHBlcnRhaW5pbmcgdG8gdGhlIGlub2RlIGl0c2VsZiwgYW5kIHBlcmhhcHMgc29tZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGZpbGVzeXN0ZW3igJlzIGJsb2NrIHNpemUgb3IgZmVhdHVyZXMgZW5hYmxlZC4gTXkgbmV4dCBsaW5lIG9mIHRob3VnaHQgY29uY2VybnMgd2hhdCBhc3BlY3RzIG9mIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgYXJlIHJlbGV2YW50IHRvIGRldGVybWluaW5nIHRoZSBpbmxpbmUgc2l6ZSBsaW1pdDsgSSBpbW1lZGlhdGVseSB0aGluayBvZiB0aGUgZmlsZSdzIHR5cGUsIHRoZSBpbm9kZSBmbGFncyAoZXNwZWNpYWxseSB0aG9zZSB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgbGF5b3V0KSwgYW5kIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFscmVhZHkgYWxsb2NhdGVkIGZvciB0aGlzIGlub2RlLiBUaGUgcmV0dXJuIHZhbHVlLCBvYnZpb3VzbHksIHdpbGwgYmUgdGhlIHNpemUgb2YgZGF0YSwgaW4gYnl0ZXMsIHRoYXQgaXMgbGVnYWxseSBhbGxvd2VkIHRvIGJlIGRpcmVjdGx5IHN0b3JlZCBpbiB0aGUgaW5vZGUuIEkgd2lsbCBmb2N1cyBvbiB1bmRlcnN0YW5kaW5nIHRoZSAqbG9naWMqIG9mIHRoZSBjYWxjdWxhdGlvbi4gSSB3aWxsIGNoZWNrIGZvciBjb3JuZXIgY2FzZXMgYW5kIGVycm9yIGNvbmRpdGlvbnMuIEkgd2FudCB0byBrbm93IHdoZW4gaXQgc2F5cyDigJxubyBpbmxpbmUgc2l6ZeKAnSBhbmQgd2hhdCBpdHMgbWVhbmluZyBpcy4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSByZWZlcmVuY2VzIHRvIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gb3Igb3RoZXIgb24tZGlzayBtZXRhZGF0YSB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGUgc2l6ZSBsaW1pdHMuIEknbGwgYmUgbG9va2luZyBmb3IgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgcG9zc2libGUgdnVsbmVyYWJpbGl0aWVzLCBzdWNoIGFzIGludGVnZXIgb3ZlcmZsb3dzLCB0aGF0IGNvdWxkIGFsbG93IGV4Y2VlZGluZyB0aGUgaW50ZW5kZWQgc2l6ZSBsaW1pdCBvciB0aGF0IG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLiBGdXJ0aGVybW9yZSwgSSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgZGlmZmVyZW50IGV4dDQgZmVhdHVyZSBmbGFncyBjb3JyZWN0bHkgKGUuZy4gZXh0ZW50IHZzIGluZGlyZWN0IGJsb2NrIGhhbmRsaW5nKS4gRmluYWxseSwgSSB3aWxsIHZlcmlmeSBob3cgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhIGltcGFjdHMgdGhlIGJsb2NrIGFsbG9jYXRpb24gc3RyYXRlZ3kgd2hlbiB0aGUgZGF0YSBpcyBiaWdnZXIgdGhhbiBpbmxpbmUgbGltaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1ODY2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6NTMuNDkxNjE0MjI2WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExOTEyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI5LFxuICBcIkxpbmVDb3VudFwiOiAxMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDI5OlxcdHN0YXRpYyBpbnQgZXh0NF9nZXRfaW5saW5lX3NpemUoc3RydWN0IGlub2RlICppbm9kZSlcXG4gIDMwOlxcdHtcXG4gIDMxOlxcdFxcdGlmIChFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9vZmYpXFxuICAzMjpcXHRcXHRcXHRyZXR1cm4gRVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZTtcXG4gIDMzOlxcdFxcbiAgMzQ6XFx0XFx0cmV0dXJuIDA7XFxuICAzNTpcXHR9XFxuICAzNjpcXHRcXG4gIDM3OlxcdHN0YXRpYyBpbnQgZ2V0X21heF9pbmxpbmVfeGF0dHJfdmFsdWVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgMzg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6NTMuNDkxNzM1MzU2WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwOTMzMjIzNjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlZ1bG5lcmFiaWxpdHkgRGV0ZWN0ZWQ6IFVuaW5pdGlhbGl6ZWQgTWVtb3J5IExlYWsgaW4gZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uKipcblxuT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi4gYGV4dDRfZ2V0X2lubGluZV9zaXplYCBqdXN0IGdyYWJzIGBFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemVgLCB0aGF0J3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3csIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIEkgc2VlIGEgYEJVR19PTmAgY2hlY2sgZW5zdXJpbmcgdGhlIHJlcXVlc3RlZCBsZW5ndGggKGBsZW5gKSBkb2Vzbid0IGV4Y2VlZCBgaV9pbmxpbmVfc2l6ZWAsIHdoaWNoIGlzIGdvb2QuIFRoZW4gdGhlcmUncyB0aGlzIGBjcF9sZW5gIGNhbGN1bGF0aW9uLCBpbml0aWFsbHkgbGltaXRlZCBieSBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWAuIFRoZSBpbml0aWFsIGRhdGEgaXMgY29waWVkIHVzaW5nIGBtZW1jcHlgLlxuXG5UaGUgY3J1Y2lhbCBiaXQsIHRob3VnaCwgaXMgdGhlIGNvbmRpdGlvbmFsLiBUaGUgY29kZSBjYWxjdWxhdGVzIGEgcmVtYWluaW5nIGxlbmd0aCAoYGxlbmApIGFuZCB0aGVuLCB3aXRoaW4gdGhlIGBpZiAoIWxlbilgIGNoZWNrLCB0aGUga2V5IGxpbmUgaXMgYGxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZSkpO2AuIElmIGBlbnRyeS1cdTAwM2VlX3ZhbHVlX3NpemVgIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluaW5nIGBsZW5gLCB0aGVuIGBsZW5gIGdldHMgcmVkdWNlZC4gQW5kIHRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgYGNwX2xlbiArIGxlbmAsIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiB0aGUgaW5pdGlhbCBgaW5saW5lX3NpemVgLlxuXG5UaGlzIGlzIHdoZXJlIHRoZSBwcm9ibGVtIGFyaXNlcy4gV2hlbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgY2FsbHMgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAsIGl0IG9ubHkgY2hlY2tzIGZvciBuZWdhdGl2ZSByZXR1cm4gdmFsdWVzLCBidXQgZG9lc24ndCBjaGVjayBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byB0aGUgaW5pdGlhbGx5IHJlcXVlc3RlZCBzaXplIChgaW5saW5lX3NpemVgKS4gVGhlbiwgaXQgcHJvY2VlZHMgdG8gY29weSBgaW5saW5lX3NpemVgIGJ5dGVzIGZyb20gYSBidWZmZXIgYGJ1ZmAgdG8gdGhlIGJsb2NrJ3MgYnVmZmVyIGhlYWQgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCAqd2l0aG91dCBjaGVja2luZyB0aGUgcmV0dXJuIHZhbHVlKi5cblxuSGVyZSdzIHRoZSBraWNrZXI6IGBidWZgIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgd2hpY2ggY291bGQgYmUgc21hbGxlciB0aGFuIGBpbmxpbmVfc2l6ZWAsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IGJlaW5nIHdyaXR0ZW4gdG8gYGJ1ZmAuIEJlY2F1c2UgdGhlcmUgaXMgbm8gY2hlY2sgaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIHRvIGVuc3VyZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBlcXVpdmFsZW50IHRvIHRoZSBgaW5saW5lX3NpemVgLCB0aGUgc3Vic2VxdWVudCBgbWVtY3B5YCBjb3VsZCBiZSB3cml0aW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChmcm9tIGBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUylgKSBpbnRvIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAuIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgdGhlbiB3cml0dGVuIHRvIGRpc2shXG5cblRoaXMgbWVhbnMgdW5pbml0aWFsaXplZCBrZXJuZWwgaGVhcCBtZW1vcnkgaXMgd3JpdHRlbiB0byBkaXNrLCB3aGljaCBpcyBhIHRleHRib29rIGluZm9ybWF0aW9uIGxlYWshIFRoYXQncyBhIHNlcmlvdXMgc2VjdXJpdHkgZmxhdy4gVGhlIGF0dGFjayB2ZWN0b3IgY291bGQgYmUgcmVhZGluZyB0aGUgZGlzayBjb250ZW50cyBhZnRlciBhIGZpbGUgd2l0aCBpbmxpbmUgZGF0YSBoYXMgYmVlbiBjb252ZXJ0ZWQuXG5cbldhaXQgYSBzZWNvbmTigKYgaXMgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAgKmFsd2F5cyogZXF1YWwgdG8gYEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSAtIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVgPyBJZiBpdCBpcywgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIHdvdWxkIGFsd2F5cyBtYXRjaCBgaW5saW5lX3NpemVgLCBhbmQgdGhlIGxlYWsgd291bGQgbm90IG9jY3VyLiBJIG5lZWQgdG8gdmVyaWZ5IGhvdyBgaV9pbmxpbmVfc2l6ZWAgaXMgc2V0IHRvIGVuc3VyZSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjQyOCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgzOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjA0LjQyNDk2MTY0NVoiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5NDU0OTM0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpX2lubGluZV9zaXplID1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9pbmxpbmUuYz0xNDU9aW50IGV4dDRfZmluZF9pbmxpbmVfZGF0YV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTc1LVxcdFxcdFxcdFxcdFxcdCh2b2lkICopZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlzLmlsb2MpKTtcXG5mcy9leHQ0L2lubGluZS5jOjE3NjpcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplID0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSArXFxuZnMvZXh0NC9pbmxpbmUuYy0xNzctXFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaXMucy5oZXJlLVxcdTAwM2VlX3ZhbHVlX3NpemUpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0yNjg9c3RhdGljIGludCBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0zMjUtXFx0XFx0XFx0XFx0ICAgICAgKHZvaWQgKilleHQ0X3Jhd19pbm9kZShcXHUwMDI2aXMuaWxvYykpO1xcbmZzL2V4dDQvaW5saW5lLmM6MzI2OlxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUgPSBsZW4gKyBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xcbmZzL2V4dDQvaW5saW5lLmMtMzI3LVxcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MzM3PXN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMzk1LVxcdFxcdFxcdFxcdCAgICAgICh2b2lkICopZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlzLmlsb2MpKTtcXG5mcy9leHQ0L2lubGluZS5jOjM5NjpcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplID0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSArXFxuZnMvZXh0NC9pbmxpbmUuYy0zOTctXFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaXMucy5oZXJlLVxcdTAwM2VlX3ZhbHVlX3NpemUpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz00Mzc9c3RhdGljIGludCBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTQ5My1cXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9vZmYgPSAwO1xcbmZzL2V4dDQvaW5saW5lLmM6NDk0OlxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xcbmZzL2V4dDQvaW5saW5lLmMtNDk1LVxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTExMjYtXFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcXG5mcy9leHQ0L2lubGluZS5jOjExMjc6XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTI4LVxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE5NzgtXFxuZnMvZXh0NC9pbmxpbmUuYzoxOTc5OlxcdFxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUgPSBpX3NpemUgXFx1MDAzY1xcbmZzL2V4dDQvaW5saW5lLmMtMTk4MC1cXHRcXHRcXHRcXHRcXHRFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFID9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6MDYuMDE5NTE4MDZaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTgzMzAxNzAzNTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIElubGluZSBEYXRhIENvbnZlcnNpb24gYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24gc3RlcCBieSBzdGVwLiBJJ20gbG9va2luZyBhdCB0aGUgYGV4dDRfZmluZF9pbmxpbmVfZGF0YV9ub2xvY2tgIGZ1bmN0aW9uIGFuZCBob3cgaXQgY2FsY3VsYXRlcyBgaV9pbmxpbmVfc2l6ZWAuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBpdCdzIGNhbGN1bGF0ZWQgcHJlY2lzZWx5IGFzIGBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFYCBwbHVzIHRoZSB2YWx1ZSBvZiBgZV92YWx1ZV9zaXplYC4gVGhpcyBgZV92YWx1ZV9zaXplYCBjb21lcyBpbnRvIHBsYXkgYWdhaW4gaW4gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAuIEhlcmUsIGlmIHRoZSBjYWxjdWxhdGVkIGBpbmxpbmVfc2l6ZWAgaXMgYmlnZ2VyIHRoYW4gYEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVgLCB0aGUgY29kZSBpcyBkZXNpZ25lZCB0byBjb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHZhbHVlIHBvaW50ZWQgYXQgYnkgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAuICBUaGUgc3Vic2VxdWVudCBgbWluX3RgIGNhbGwgd29uJ3QgcmVkdWNlIGBsZW5gIHNvIGVmZmVjdGl2ZWx5IGl0IGlzIGRvaW5nIGEgZnVsbCBjb3B5IG9mIGV4YWN0bHkgYGlubGluZV9zaXplYCBieXRlcy4gVGhlIHF1ZXN0aW9uIGFyaXNlczogaXMgdGhlcmUgYSByaXNrIG9mIHJlYWRpbmcgYmV5b25kIHdoYXQncyBpbnRlbmRlZD9cblxuSSdtIHRoaW5raW5nIGFib3V0IHRoZSBwb3RlbnRpYWwgZm9yIG9uLWRpc2sgY29ycnVwdGlvbiwgd2hlcmUgYGlzLnMuaGVyZS1cdTAwM2VlX3ZhbHVlX3NpemVgIG1pZ2h0IGJlIGNvcnJ1cHRlZC4gSWYgdGhpcyB2YWx1ZSBpcyBjb3JydXB0ZWQgdG8gYmUgbGFyZ2UsIHRoZSBgaV9pbmxpbmVfc2l6ZWAgbWlnaHQgYmUgbGFyZ2UuIEJ1dCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBvbmx5IHJlYWRzIHRoZSBgZW50cnktXHUwMDNlZV92YWx1ZV9zaXplYC4gQmVjYXVzZSBgaXMucy5oZXJlYCBpbiBgZXh0NF9maW5kX2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIHNhbWUgYXMgdGhlIGBlbnRyeWAgaW4gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAsIHRoZSB2YWx1ZXMgYXJlIGxpbmtlZC4gSG93ZXZlciwgdGhlcmUncyBhbHNvIHRoZSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBwb3NzaWJpbGl0eS4gSWYgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAgaXMgbW9kaWZpZWQgY29uY3VycmVudGx5LCBvciBpZiBgaV9pbmxpbmVfc2l6ZWAgaXMgY2FsY3VsYXRlZCwga21hbGxvYyBpcyBjYWxsZWQsIGFuZCB0aGVuIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvcGllcyBgaW5saW5lX3NpemVgIGJ5dGVzLCBpcyB0aGVyZSBhIHJhY2UgY29uZGl0aW9uPyBJcyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgcG9pbnRlZCB0byBieSBgaW5saW5lX3NpemVgPyAgSWYgdGhlIG9yaWdpbmFsIGBsZW5gIHRvIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIGBpbmxpbmVfc2l6ZWAgYW5kICBgaV9pbmxpbmVfc2l6ZWAgaXMgYmFzZWQgb24gIGBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFICsgbGUzMl90b19jcHUoZW50cnktXHUwMDNlZV92YWx1ZV9zaXplKWAsIHRoZW4sIEkgdGhpbmssIGl0J3MgY29weWluZyBgaW5saW5lX3NpemVgIGJ5dGVzIGFuZCB0aGUgYnVmZmVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQuXG5cbk1vdmluZyB0byB0aGUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGZ1bmN0aW9uLCBJIHNlZSB0aGF0IGBpbmxpbmVfc2l6ZWAgaXMgY2FsY3VsYXRlZCBhbmQgdXNlZCB0byBga21hbGxvY2AgYSBidWZmZXIuIFRoZSBvcmlnaW5hbCBjb2RlIHdhcyB1c2luZyBhIHBvaW50ZXIgdG8gYGlubGluZV9zaXplYCBpbiB0aGUgY2FsbCB0byBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB3aGljaCBJJ3ZlIGp1c3QgZGV0ZXJtaW5lZCBpc24ndCB0aGUgY2FzZSBhbmQgbm93IHRha2VzIGBpbmxpbmVfc2l6ZWAgYnkgdmFsdWUuIFNvLCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyB0YWtpbmcgdGhlIGxlbmd0aCBieSB2YWx1ZSwgc28gdGhlIHZhbHVlIGlzIG5vdCBiZWluZyBtb2RpZmllZC5cblxuTm93LCBsZXQncyBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYuIFRoZSBwYXRjaCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEluIHRoZSBvcmlnaW5hbCBhcHByb2FjaCwgdGhlIGlubGluZSBkYXRhIHdhcyBmaXJzdCBkZXN0cm95ZWQgd2l0aCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIGFuZCB0aGVuIGEgYmxvY2sgd2FzIGFsbG9jYXRlZC4gSWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCB0aGUgaW5saW5lIGRhdGEgd2FzIHJlc3RvcmVkLiBUaGUgdXBkYXRlZCBjb2RlLCBob3dldmVyLCBhbGxvY2F0ZXMgYSBibG9jayB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgLiBUaGVuIGl0IGxvY2tzLCB6ZXJvcyBhbmQgY29waWVzIGludG8gdGhlIGJ1ZmZlci4gVGhlbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGlzIGNhbGxlZCB3aGljaCByZXBsYWNlcyB0aGUgaW5saW5lIGRhdGEgd2l0aCB0aGUgbmV3IGJsb2NrIGluIHRoZSBpbm9kZS4gTm93LCBpZiBhbnl0aGluZyBmYWlscyBiZWZvcmUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgdGhlIG5ldyBibG9jayBpcyBqdXN0IGZyZWVkLlxuXG5NeSBtYWluIGNvbmNlcm4gbm93IGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJcyBpdCBwb3NzaWJsZSBmb3IgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUgdG8gb2NjdXI/IEknbSBjaGVja2luZyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgOiBJIHNlZSBpdCB6ZXJvZXMgdGhlIGlubGluZSBkYXRhIGFyZWEgd2l0aCBgbWVtc2V0YCwgYm90aCBpbiB0aGUgaW5vZGUgaXRzZWxmIGFuZCB0aGUgYnVmZmVyLiBUaGVyZSdzIHRoZW4gYSBjaGVjayBmb3IgZXh0ZW50cy4gIEZvciBkaXJlY3RvcnksIHJlZ3VsYXIgb3Igc3ltbGluayBpbm9kZXMsIGBleHQ0X2V4dF90cmVlX2luaXRgIGlzIGNhbGxlZCwgYW5kIGl0J3MgaW5zZXJ0aW5nIGV4dGVudHMuXG5cbk15IG1haW4gcXVlc3Rpb24gaXM6IGRvZXMgYGV4dDRfZXh0X3RyZWVfaW5pdGAgcG90ZW50aWFsbHkgd3JpdGUgdG8gYGlfZGF0YWAsIG92ZXJ3cml0aW5nIHRoZSBgbWVtc2V0YD8gVGhpcyB3b3VsZCBiZSB0aGUgbW9zdCBsaWtlbHkgc291cmNlIG9mIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLiBJIG5lZWQgdG8gc3R1ZHkgaG93IGBleHQ0X2V4dF90cmVlX2luaXRgIGFuZCB0aGUgZXh0ZW50IGluc2VydGlvbiB3b3JrIHRvIGJlIGNvbXBsZXRlbHkgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg3NzcsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjI0LjM0OTY5MDQzWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg0NzUyNzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X3RyZWVfaW5pdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD0zODYzPXN0cnVjdCBleHQ0X2V4dGVudDtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM4NzAtXFxuZnMvZXh0NC9leHQ0Lmg6Mzg3MTpleHRlcm4gdm9pZCBleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XFxuZnMvZXh0NC9leHQ0LmgtMzg3Mi1leHRlcm4gaW50IGV4dDRfZXh0X2luZGV4X3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZXh0ZW50cyk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz04MTU9ZXh0NF9leHRfYmluc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy04NzEtXFxuZnMvZXh0NC9leHRlbnRzLmM6ODcyOnZvaWQgZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9leHRlbnRzLmMtODczLXtcXG4tLVxcbmZzL2V4dDQvaWFsbG9jLmM9OTMzPXN0cnVjdCBpbm9kZSAqX19leHQ0X25ld19pbm9kZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcXG4tLVxcbmZzL2V4dDQvaWFsbG9jLmMtMTM0MC1cXHRcXHRcXHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xcbmZzL2V4dDQvaWFsbG9jLmM6MTM0MTpcXHRcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuZnMvZXh0NC9pYWxsb2MuYy0xMzQyLVxcdFxcdH1cXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9NDM3PXN0YXRpYyBpbnQgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy00ODQtXFx0XFx0XFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG5mcy9leHQ0L2lubGluZS5jOjQ4NTpcXHRcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy00ODYtXFx0XFx0fVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTExMS1cXHRcXHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xcbmZzL2V4dDQvaW5saW5lLmM6MTExMjpcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTEzLVxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XFxuLS1cXG5mcy9leHQ0L2lvY3RsLmM9Mzc1PXN0YXRpYyBsb25nIHN3YXBfaW5vZGVfYm9vdF9sb2FkZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYy00NTAtXFx0XFx0XFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZV9ibCwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG5mcy9leHQ0L2lvY3RsLmM6NDUxOlxcdFxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlX2JsKTtcXG5mcy9leHQ0L2lvY3RsLmMtNDUyLVxcdFxcdH0gZWxzZVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NDEwPWludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy00ODMtXFxuZnMvZXh0NC9taWdyYXRlLmM6NDg0OlxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XFxuZnMvZXh0NC9taWdyYXRlLmMtNDg1LVxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy01NjctXFxuZnMvZXh0NC9taWdyYXRlLmM6NTY4OlxcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xcbmZzL2V4dDQvbWlncmF0ZS5jLTU2OS1cXHRyZXR2YWwgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCAxLCAwKTtcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTU4OC1cXHQvKiBSZXNldCB0aGUgZXh0ZW50IGRldGFpbHMgKi9cXG5mcy9leHQ0L21pZ3JhdGUuYzo1ODk6XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG5mcy9leHQ0L21pZ3JhdGUuYy01OTAtb3V0X3N0b3A6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjI1LjkzNDQ1MTY5NFoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDcwMjc5MTQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2Ygd2hhdCdzIGdvaW5nIG9uLCB3cml0dGVuIGFzIHRob3VnaCBpdCdzIG15IG93biB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gZXh0NF9leHRfdHJlZV9pbml0KipcblxuQWxyaWdodCwgbGV0J3MgZGlzc2VjdCBgZXh0NF9leHRfdHJlZV9pbml0YC4gVGhlIG5hbWUgaXRzZWxmIGhpbnRzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlIG9mIHRoZSBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgd2l0aGluIGFuIGV4dDQgZmlsZXN5c3RlbS4gSSdtIGFscmVhZHkgZmFtaWxpYXIgd2l0aCB0aGUgY29uY2VwdCBvZiBleHRlbnQgdHJlZXMsIEkgdW5kZXJzdGFuZCB0aGF0IHRoZXkgYXJlIHRoZSBiYXNpcyBmb3Igc3RvcmluZyBmaWxlIGJsb2NrcyBpbiBhIHdheSB0aGF0IG1pbmltaXplcyBmcmFnbWVudGF0aW9uIGFuZCBtYXhpbWl6ZXMgdGhlIGVmZmljaWVudCB1c2Ugb2YgZGlzayBzcGFjZSwgY29tcGFyZWQgdG8gdGhlIG9sZGVyIGJsb2NrLWJhc2VkIGlub2RlIHN5c3RlbS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHRoZSBjcnVjaWFsIGZpcnN0IHN0ZXAgaW4gcHJlcGFyaW5nIGEgZmlsZSdzIG1ldGFkYXRhIGZvciBleHRlbnQtYmFzZWQgc3RvcmFnZS5cblxuSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzdGF0ZXMgY2FuIGV4aXN0IGF0IHRoaXMgcG9pbnQsIGFuZCB3aGF0IHRoZSBpbml0aWFsIHN0YXRlIGlzLiBJIHNob3VsZCBsb29rIGZvciB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIGluaXRpYWxpemVkLCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaW52b2x2ZWQgKGJlY2F1c2UgdGhpcyBpcyBjcml0aWNhbCBpbiBhIGtlcm5lbCBjb250ZXh0KSwgYW5kIGFueSBzYW5pdHkgY2hlY2tzIGJlaW5nIHBlcmZvcm1lZC4gSSdsbCBiZSBsb29raW5nIHRvIHVuZGVyc3RhbmQgdGhlIG1lY2hhbmljcyBvZiBob3cgdGhlIGV4dGVudCBoZWFkZXIgaXMgc2V0IHVwLCB3aGF0IHZhbHVlcyBhcmUgcGxhY2VkIGludG8gdGhlIGBleHRfdHJlZWAgc3RydWN0dXJlLCBhbmQgaWYgaXQncyBiYXNlZCBvbiBhbiBleGlzdGluZyBpbm9kZSwgb3IgYmVpbmcgaW5pdGlhbGl6ZWQgZnJvbSBzY3JhdGNoLiBJdCBtdXN0IGJlIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgZXh0ZW50IG5vZGUsIGxpa2VseSBhIHNpbmdsZSBleHRlbnQsIGFuZCBhbnkgYXNzb2NpYXRlZCBtZXRhLWRhdGEuXG5cbkkgc2hvdWxkIGFsc28gcGF5IGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgY29uZGl0aW9ucyB0aGlzIGZ1bmN0aW9uIGFudGljaXBhdGVzLiBXaGF0IGhhcHBlbnMgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHM/IEFyZSB0aGVyZSBzcGVjaWZpYyBlcnJvciBjb2RlcyByZXR1cm5lZD8gQW5kLCBtb3N0IGltcG9ydGFudGx5LCBJIG5lZWQgdG8gbG9vayBvdXQgZm9yIHdoZXJlIHRoaXMgaXMgdWx0aW1hdGVseSBjYWxsZWQgYW5kIGluIHdoYXQgY2lyY3Vtc3RhbmNlcyBpdCBpcyB1c2VkLiBJcyBpdCBjYWxsZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBmaWxlLCBvciB3aGVuIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgZmlsZSB0byBleHRlbnQtYmFzZWQgc3RvcmFnZT8gUGVyaGFwcyBib3RoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjQ5MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjMwLjAwNDczMzk2WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzM2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dGVudHMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA4NzIsXG4gIFwiTGluZUNvdW50XCI6IDE1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA4NzI6XFx0dm9pZCBleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4gODczOlxcdHtcXG4gODc0OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xcbiA4NzU6XFx0XFxuIDg3NjpcXHRcXHRlaCA9IGV4dF9pbm9kZV9oZHIoaW5vZGUpO1xcbiA4Nzc6XFx0XFx0ZWgtXFx1MDAzZWVoX2RlcHRoID0gMDtcXG4gODc4OlxcdFxcdGVoLVxcdTAwM2VlaF9lbnRyaWVzID0gMDtcXG4gODc5OlxcdFxcdGVoLVxcdTAwM2VlaF9tYWdpYyA9IEVYVDRfRVhUX01BR0lDO1xcbiA4ODA6XFx0XFx0ZWgtXFx1MDAzZWVoX21heCA9IGNwdV90b19sZTE2KGV4dDRfZXh0X3NwYWNlX3Jvb3QoaW5vZGUsIDApKTtcXG4gODgxOlxcdFxcdGVoLVxcdTAwM2VlaF9nZW5lcmF0aW9uID0gMDtcXG4gODgyOlxcdFxcdGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcXG4gODgzOlxcdH1cXG4gODg0OlxcdFxcbiA4ODU6XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKlxcbiA4ODY6XFx0ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6MzAuMDA0OTY5NDhaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTgzMjY3NTgxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IGluIGV4dDQgQ29kZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9leHRfdHJlZV9pbml0YCBmdW5jdGlvbi4gSXQgbG9va3MgbGlrZSBpdCdzIGluaXRpYWxpemluZyBgZWhfZGVwdGhgLCBgZWhfZW50cmllc2AsIGBlaF9tYWdpY2AsIGBlaF9tYXhgLCBhbmQgYGVoX2dlbmVyYXRpb25gLiBUaGUgYGVoYCB2YXJpYWJsZSBpcyBwb2ludGluZyB0byBgRVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFgLCB3aGljaCBtYWtlcyBzZW5zZS4gSSByZW1lbWJlciB0aGF0IGBpX2RhdGFgIHdhcyBqdXN0IHplcm9lZCBvdXQgd2l0aCBgbWVtc2V0YC4gU28sIGF0IHRoaXMgcG9pbnQsIHRoZSBlbnRpcmUgYGlfZGF0YWAgYXJlYSBzaG91bGQgYmUgY2xlYW4sIHdpdGggbm8gdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQncyBnb29kLlxuXG5CdXQgaGFuZyBvbuKApiBJIG5lZWQgdG8gY29uc2lkZXIgYWxsIHRoZSBwbGFjZXMgd2hlcmUgdGhpcyBkYXRhIGlzIHVzZWQuIFdoYXQgYWJvdXQgdGhvc2UgeGF0dHIgZnVuY3Rpb25zLCBgZXh0NF94YXR0cl9pYm9keV9maW5kYCBhbmQgYGV4dDRfeGF0dHJfaWJvZHlfc2V0YD8gSSBzZWUgdGhlc2UgbG9jYWwgc3RydWN0cywgYGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBleHQ0X3hhdHRyX2luZm8gaWAuIFRoZXkncmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gTm93LCBpbiBDLCB3aGVuIHlvdSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZSBhIHN0cnVjdCBsaWtlIHRoYXQsIHRoZSByZW1haW5pbmcgZmllbGRzIGFyZSBhdXRvbWF0aWNhbGx5IHplcm9lZC4gU28sIGV2ZW4gdGhvdWdoIHRoZXkgKmxvb2sqIGxpa2UgdGhleSdyZSBvbmx5IHBhcnRpYWxseSBpbml0aWFsaXplZCwgdGhleSdyZSBhY3R1YWxseSBmdWxseSBpbml0aWFsaXplZCBkdWUgdG8gdGhlIEMgbGFuZ3VhZ2UncyBiZWhhdmlvci4gVGhhdCdzIGEgcG9pbnQgaW4gZmF2b3Igb2Ygc2FmZXR5LlxuXG5Ob3csIHRoZXJlJ3MgYW5vdGhlciBwb2ludCB0byBjb25zaWRlci4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGVycm9yIHBhdGhzLiBXaGF0IGhhcHBlbnMgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlcj8gSW4gdGhlIGNvZGUgSSdtIGxvb2tpbmcgYXQsIHRoZXJlJ3MgYSBjYWxsIHRvIGBleHQ0X2ZpbmRfZXh0ZW50YCBmb2xsb3dlZCBieSBhIGNhbGwgdG8gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbHMsIGBwYXRoYCB3aWxsIGJlIGFuIGVycm9yIHBvaW50ZXIsIHBvc3NpYmx5IGAtRU5PTUVNYC4gSWYgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIHRyaWVzIHRvIGRlcmVmZXJlbmNlIHRoYXQgZXJyb3IgcG9pbnRlciwgaXQgd291bGQgYmUgYSBwcm9ibGVtLiBJJ2xsIG5lZWQgdG8gZ28gYW5kIGNoZWNrIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCB0byBtYWtlIHN1cmUgaXQgaGFuZGxlcyB0aGUgcG9zc2liaWxpdHkgb2YgYSBgTlVMTGAgb3IgZXJyb3IgcG9pbnRlciBjb3JyZWN0bHkuIFRoaXMgd2FycmFudHMgYSBkZWVwZXIgbG9vayBpbnRvIHRoZSBjb2RlIHBhdGggdG8gZW5zdXJlIHdlJ3JlIG5vdCBydW5uaW5nIGludG8gYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UsIHdoaWNoIHdvdWxkIGJlIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjMxNjAsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMjozOS44Mzc2NDkxMjlaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1Mzg3MjQzOTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9leHRfaW5zZXJ0X2V4dGVudFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD02ODQ9ZW51bSB7XFxuLS1cXG5mcy9leHQ0L2V4dDQuaC03NDMtICogcmVhZF9leHRlbnRfdHJlZV9ibG9jaygpLCBleHQ0X3NwbGl0X2V4dGVudF9hdCgpLFxcbmZzL2V4dDQvZXh0NC5oOjc0NDogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KCksIGFuZCBleHQ0X2V4dF9jcmVhdGVfbmV3X2xlYWYoKS5cXG5mcy9leHQ0L2V4dDQuaC03NDUtICogRVhUNF9FWF9OT0NBQ0hFIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgd2Ugc2hvdWxkbid0IGJlXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0zODk0PWV4dGVybiBpbnQgZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dDQuaC0zODk2LVxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKTtcXG5mcy9leHQ0L2V4dDQuaDozODk3OmV4dGVybiBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9leHRfaW5zZXJ0X2V4dGVudChcXG5mcy9leHQ0L2V4dDQuaC0zODk4LVxcdFxcdFxcdFxcdGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMyLSAqIHRvIGluc3RlYWQgd3JpdGUgemVyb2VzIHRvIG91ciBidWZmZXIuIFRoZW4sIHdlIG92ZXJyaWRlXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzozMzogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KCkgdG8gcmV0dXJuIC1FTk9TUEMsIHdoaWNoIHRyaWdnZXJzIHRoZSB6ZXJvb3V0LlxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzQtICogRmluYWxseSwgd2UgY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBleHRlbnQgdHJlZSBhbmQgemVyb291dCBidWZmZXIgdG8gY29uZmlybVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0xNzI9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjE3MzpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50X3N0dWIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTE3NC1cXHRcXHRcXHQgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTM5Nj1zdGF0aWMgdm9pZCB0ZXN0X3NwbGl0X2NvbnZlcnQoc3RydWN0IGt1bml0ICp0ZXN0KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy00MDctXFx0XFx0LypcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjQwODpcXHRcXHQgKiBGb3JjZSB6ZXJvb3V0IGJ5IG1ha2luZyBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50IHJldHVybiBFTk9TUENcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQwOS1cXHRcXHQgKi9cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjQxMDpcXHRcXHRrdW5pdF9hY3RpdmF0ZV9zdGF0aWNfc3R1Yih0ZXN0LCBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50LFxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDExOlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfZXh0X2luc2VydF9leHRlbnRfc3R1Yik7XFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy00MTItXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTQyPXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xOTg1LS8qXFxuZnMvZXh0NC9leHRlbnRzLmM6MTk4NjogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50OlxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5ODctICogdHJpZXMgdG8gbWVyZ2UgcmVxdWVzdGVkIGV4dGVudCBpbnRvIHRoZSBleGlzdGluZyBleHRlbnQgb3JcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTE9c3RydWN0IGV4dDRfZXh0X3BhdGggKlxcbmZzL2V4dDQvZXh0ZW50cy5jOjE5OTI6ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5OTMtXFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjAwMi1cXG5mcy9leHQ0L2V4dGVudHMuYzoyMDAzOlxcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZXh0X2luc2VydF9leHRlbnQsIGhhbmRsZSwgaW5vZGUsIHBhdGgsXFxuZnMvZXh0NC9leHRlbnRzLmMtMjAwNC1cXHRcXHRcXHRcXHQgICBuZXdleHQsIGdiX2ZsYWdzKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTMxOTE9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudF9hdChoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzIzNy1cXHQgKiBwYXRoIG1heSBsZWFkIHRvIG5ldyBsZWFmLCBub3QgdG8gb3JpZ2luYWwgbGVhZiBhbnkgbW9yZVxcbmZzL2V4dDQvZXh0ZW50cy5jOjMyMzg6XFx0ICogYWZ0ZXIgZXh0NF9leHRfaW5zZXJ0X2V4dGVudCgpIHJldHVybnMsXFxuZnMvZXh0NC9leHRlbnRzLmMtMzIzOS1cXHQgKi9cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNTAtXFxuZnMvZXh0NC9leHRlbnRzLmM6MzI1MTpcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXgsIGZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zMjUyLVxcdGlmICghSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDQ4MS1cXG5mcy9leHQ0L2V4dGVudHMuYzo0NDgyOlxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgZmxhZ3MpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTQ0ODMtXFx0aWYgKElTX0VSUihwYXRoKSkge1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjMwMz1FWFBPUlRfU1lNQk9MX0ZPUl9FWFQ0X1RFU1QoZXh0NF9lc19pbnNlcnRfZXh0ZW50KTtcXG5mcy9leHQ0L2V4dGVudHMuYzo2MzA0OkVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MzA1LUVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2ZpbmRfZXh0ZW50KTtcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjIwOC1cXHRcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjIwOTpcXHRcXHRcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChOVUxMLCBpbm9kZSxcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjIxMC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwYXRoLCBcXHUwMDI2bmV3ZXgsIDApO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTExOC1cXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBibG9jayk7XFxuZnMvZXh0NC9pbmxpbmUuYzoxMTE5OlxcdFxcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXFx1MDAyNm5ld2V4LCAwKTtcXG5mcy9leHQ0L2lubGluZS5jLTExMjAtXFx0fSBlbHNlIHtcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy01NC1cXHRcXHRnb3RvIGVycl9vdXQ7XFxuZnMvZXh0NC9taWdyYXRlLmM6NTU6XFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXFx1MDAyNm5ld2V4dCwgMCk7XFxuZnMvZXh0NC9taWdyYXRlLmMtNTYtXFx0aWYgKElTX0VSUihwYXRoKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6NDEuMzc2MzgxODQ4WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU2MDE3NjIzNzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIGZpcnN0LXBlcnNvbiBzdW1tYXJ5LCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAuIEknbSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCB0aGUgY3JpdGljYWwgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIGhhbmRsaW5nIGV4dGVudCBpbnNlcnRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIGNvcmUgb2YgZXh0ZW50LWJhc2VkIGZpbGUgc3RvcmFnZSBoZXJlIOKAkyB0aGUgdmVyeSBtZWNoYW5pc20gdGhhdCBtYWtlcyBtb2Rlcm4gZXh0NCBwZXJmb3JtYW5jZSB3aGF0IGl0IGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uJ3MgbG9naWMgaW50aW1hdGVseS4gV2hhdCBhcmUgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQ/IE9idmlvdXNseSwgYHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXJgIGFuZCBgc3RydWN0IGV4dDRfZXh0ZW50YCBhcmUgY2VudHJhbCwgYnV0IGhvdyBhcmUgdGhleSBiZWluZyBtYW5pcHVsYXRlZCBpbiB0aGlzIHNwZWNpZmljIGluc2VydGlvbiBzY2VuYXJpbz9cblxuRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdHJpZ2dlcnMgdGhpcyBjYWxsLCBsaWtlbHkgZHVyaW5nIGZpbGUgY3JlYXRpb24sIGV4dGVuc2lvbiwgb3IgbW9kaWZpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBuZXcgZXh0ZW50LiBXaGF0IGFyZSB0aGUgcHJlLWNvbmRpdGlvbnM/IERvZXMgaXQgZXhwZWN0IHRoZSBuZXcgZXh0ZW50IHRvIGZpdCBpbiB0aGUgY3VycmVudCBibG9jayBncm91cCwgb3IgZG9lcyBpdCBoYW5kbGUgY3Jvc3MtYmxvY2stZ3JvdXAgaW5zZXJ0aW9ucz8gSWYgdGhlIGZvcm1lciwgd2hhdCdzIHRoZSBvdmVyZmxvdyBsb2dpYyBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlPyBIb3cgZG9lcyBpdCBpbnRlcmFjdCB3aXRoIHRoZSBibG9jayBhbGxvY2F0b3I/IElzIHRoZXJlIGEgc2VwYXJhdGUgbG9ja2luZyBtZWNoYW5pc20gcmVxdWlyZWQgYmV5b25kIHdoYXQncyBoYW5kbGVkIGF0IGEgaGlnaGVyIGxldmVsP1xuXG5JJ20gYWxzbyBjdXJpb3VzIGFib3V0IHRoZSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLiBFeHRlbnQgbWFuaXB1bGF0aW9uLCBlc3BlY2lhbGx5IGluc2VydGlvbnMsIGNhbiBiZSBjb21wbGV4LiBXaGF0IGFyZSB0aGUgdGltZSBjb21wbGV4aXRpZXMgZm9yIHNlYXJjaGluZyBmb3IgdGhlIHJpZ2h0IHBsYWNlIHRvIGluc2VydCwgc2hpZnRpbmcgZXhpc3RpbmcgZXh0ZW50cyBpZiBuZWNlc3NhcnksIGFuZCBmaW5hbGx5LCB3cml0aW5nIHRoZSBjaGFuZ2VzIHRvIGRpc2s/IEFueSBvYnZpb3VzIG9wdGltaXphdGlvbnMgaW1wbGVtZW50ZWQgdG8gbWluaW1pemUgZnJhZ21lbnRhdGlvbiBhbmQgbWF4aW1pemUgcGVyZm9ybWFuY2U/IEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ2llcyB0aGF0IGFyZSBwYXJ0aWN1bGFybHkgY2xldmVyIG9yIHJvYnVzdD8gSSdsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgaG93IGl0IGhhbmRsZXMgbWV0YWRhdGEgdXBkYXRlcywgc3BlY2lmaWNhbGx5IHRoZSBpbm9kZSBhbmQgZ3JvdXAgZGVzY3JpcHRvciBibG9jayBjaGFuZ2VzLlxuXG5UaGUgY3JpdGljYWwgcGF0aCBpcyB0aGUgcGFydCBJIHdhbnQgdG8gZm9jdXMgb24uIFdoYXQncyB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIGluc2VydGlvbiwgYW5kIHdoYXQgZWRnZSBjYXNlcyBhcmUgaGFuZGxlZCAoZS5nLiwgaW5zZXJ0aW9uIGF0IHRoZSBiZWdpbm5pbmcsIG1pZGRsZSwgb3IgZW5kIG9mIGFuIGV4dGVudCBsaXN0LCBvciBldmVuIHNwbGl0dGluZyBleHRlbnRzIHRvIG1ha2Ugc3BhY2UpLiBBbnkgY2hhbmNlIG9mIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgaGVyZT8gSSdsbCBwcm9iYWJseSBzcGVuZCBhIGdvb2Qgd2hpbGUganVzdCB0cmFjaW5nIHRoZSBjb2RlIGZsb3csIGxvb2tpbmcgb3V0IGZvciB0aGUgY29tbW9uIHByb2JsZW1zIEkga25vdyBjYW4gb2NjdXIgaW4gdGhlc2UgdHlwZSBvZiBmaWxlIHN5c3RlbSBmdW5jdGlvbnMuIE5vdywgbGV0J3Mgc2VlIHdoYXQgdGhlIHNvdXJjZSBjb2RlIGFjdHVhbGx5IHRlbGxzIHVzLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1OTQ1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6NDYuOTc4MTQ4MTQyWiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3MTk3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dGVudHMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTkxLFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTkxOlxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpcXG4xOTkyOlxcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4xOTkzOlxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCxcXG4xOTk0OlxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKVxcbjE5OTU6XFx0e1xcbjE5OTY6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7XFxuMTk5NzpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LCAqZmV4O1xcbjE5OTg6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50ICpuZWFyZXg7IC8qIG5lYXJlc3QgZXh0ZW50ICovXFxuMTk5OTpcXHRcXHRpbnQgZGVwdGgsIGxlbiwgZXJyID0gMDtcXG4yMDAwOlxcdFxcdGV4dDRfbGJsa190IG5leHQ7XFxuMjAwMTpcXHRcXHRpbnQgbWJfZmxhZ3MgPSAwLCB1bndyaXR0ZW47XFxuMjAwMjpcXHRcXG4yMDAzOlxcdFxcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZXh0X2luc2VydF9leHRlbnQsIGhhbmRsZSwgaW5vZGUsIHBhdGgsXFxuMjAwNDpcXHRcXHRcXHRcXHRcXHQgICBuZXdleHQsIGdiX2ZsYWdzKTtcXG4yMDA1OlxcdFxcbjIwMDY6XFx0XFx0aWYgKGdiX2ZsYWdzIFxcdTAwMjYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpXFxuMjAwNzpcXHRcXHRcXHRtYl9mbGFncyB8PSBFWFQ0X01CX0RFTEFMTE9DX1JFU0VSVkVEO1xcbjIwMDg6XFx0XFx0aWYgKHVubGlrZWx5KGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCkgPT0gMCkpIHtcXG4yMDA5OlxcdFxcdFxcdEVYVDRfRVJST1JfSU5PREUoaW5vZGUsIFxcXCJleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpID09IDBcXFwiKTtcXG4yMDEwOlxcdFxcdFxcdGVyciA9IC1FRlNDT1JSVVBURUQ7XFxuMjAxMTpcXHRcXHRcXHRnb3RvIGVycm91dDtcXG4yMDEyOlxcdFxcdH1cXG4yMDEzOlxcdFxcdGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTtcXG4yMDE0OlxcdFxcdGV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7XFxuMjAxNTpcXHRcXHRlaCA9IHBhdGhbZGVwdGhdLnBfaGRyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMjo0Ni45Nzg0MjI0OTJaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkyNDcyMjE2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcqKlxuXG5IbW0sIHNvIGlmIEknbSB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZSBjb3JyZWN0bHksIHRoZXJlJ3MgYSBzZXJpb3VzIHJpc2sgaGVyZS4gSWYgdGhlIHZhcmlhYmxlIGBwYXRoYCBpcyBhbiBlcnJvciBwb2ludGVyLCB0aGVuIGFjY2Vzc2luZyBgcGF0aFtkZXB0aF1gIGlzIGdvaW5nIHRvIGxlYWQgdG8gYSBkZXJlZmVyZW5jZSBvZiB0aGF0IGVycm9yIHBvaW50ZXIuIEFuZCB0aGF0J3MgZ29pbmcgdG8gY3Jhc2ggdGhlIGtlcm5lbCwgbm8gcXVlc3Rpb24uIEhhbmcgb24gYSBzZWMuLi4gd2FpdCBhIG1pbnV0ZSwgSSB0aGluayBJIHNlZSBhIHBvdGVudGlhbCBnb3RjaGEuIElmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGBFUlJfUFRSYCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYSBwcm9ibGVtLiBMb29rcyBsaWtlIGEgcHJldHR5IHN0YW5kYXJkIHRoaW5nIHRvIGRvIHdpdGggZXJyb3IgcGF0aHMgaW4gdGhlIGtlcm5lbC4gU28sIHRoZSBrZXkgdG8gYWxsIHRoaXMgaXMgaG93IGBleHQ0X2ZpbmRfZXh0ZW50YCBoYW5kbGVzIGVycm9ycy4gV2UgaGF2ZSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIGV4cGxpY2l0bHkgY2hlY2tzIHRoZSByZXR1cm4gb2YgYGV4dDRfZmluZF9leHRlbnRgIGFuZCBoYW5kbGVzIHRoZSBgRVJSX1BUUmAgYXBwcm9wcmlhdGVseS4gVGhhdCdzIHRoZSBvbmx5IHdheSB0byBhdm9pZCBhIG5hc3R5IGNyYXNoLiBSaWdodCwgbGV0J3Mgc2VlIHdoYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZG9lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY5MzksIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjUyLjkwMzE0NzA4MloiLCJTZXEiOjUwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU4OTQ5OTAxNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2ZpbmRfZXh0ZW50XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vdHJhY2UvaGlzdG9ncmFtLnJzdD01PURvY3VtZW50YXRpb24gd3JpdHRlbiBieSBUb20gWmFudXNzaVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQwNC0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwNGM0YTNjXSBpbnRlbF9wbGFuZV9kdXBsaWNhdGVfc3RhdGUgW2k5MTVdICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTQwMiAgYnl0ZXNfcmVxOiAgICAgMTkwNjcyXFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0OjQwNTogICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZjgxMjg5MWNhXSBleHQ0X2ZpbmRfZXh0ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTUxOCAgYnl0ZXNfcmVxOiAgICAgMTQ2MjA4XFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQwNi0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwMjkwNzBlXSBkcm1fdm1hX25vZGVfYWxsb3cgW2RybV0gICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTc0NiAgYnl0ZXNfcmVxOiAgICAgIDY5ODQwXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3QtNDM5LSAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmYTA0ODlhNjZdIGludGVsX3JpbmdfYmVnaW4gW2k5MTVdICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAyMTg2ICBieXRlc19yZXE6ICAgICAzMTQ3ODRcXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3Q6NDQwOiAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmODEyODkxY2FdIGV4dDRfZmluZF9leHRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAyMTc0ICBieXRlc19yZXE6ICAgICAyMDg5OTJcXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3QtNDQxLSAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmODExYWU4ZTFdIF9fa21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAgICA4ICBieXRlc19yZXE6ICAgICAxMzEwNzJcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTY4ND1lbnVtIHtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTc0MS0gKiBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZXNlIGZsYWdzIG11c3Qgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlXFxuZnMvZXh0NC9leHQ0Lmg6NzQyOiAqIEVYVDRfR0VUX0JMT0NLU18qLiAgVGhleSBhcmUgdXNlZCBieSBleHQ0X2ZpbmRfZXh0ZW50KCksXFxuZnMvZXh0NC9leHQ0LmgtNzQzLSAqIHJlYWRfZXh0ZW50X3RyZWVfYmxvY2soKSwgZXh0NF9zcGxpdF9leHRlbnRfYXQoKSxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTM4OTc9ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KFxcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMzkwMC1cXHRcXHRcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKTtcXG5mcy9leHQ0L2V4dDQuaDozOTAxOmV4dGVybiBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsXFxuZnMvZXh0NC9leHQ0LmgtMzkwMi1cXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0zOTY9c3RhdGljIHZvaWQgdGVzdF9zcGxpdF9jb252ZXJ0KHN0cnVjdCBrdW5pdCAqdGVzdClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtNDEyLVxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDEzOlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfREFUQV9MQkxLLCBOVUxMLCBFWFQ0X0VYX05PQ0FDSEUpO1xcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtNDE0LVxcdGV4ID0gcGF0aC1cXHUwMDNlcF9leHQ7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQzOC1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjQzOTpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX0RBVEFfTEJMSywgTlVMTCwgRVhUNF9FWF9OT0NBQ0hFKTtcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQ0MC1cXHRleCA9IHBhdGgtXFx1MDAzZXBfZXh0O1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9ODg1PXN0cnVjdCBleHQ0X2V4dF9wYXRoICpcXG5mcy9leHQ0L2V4dGVudHMuYzo4ODY6ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcXG5mcy9leHQ0L2V4dGVudHMuYy04ODctXFx0XFx0IHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgZmxhZ3MpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy04OTQtXFxuZnMvZXh0NC9leHRlbnRzLmM6ODk1OlxcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZmluZF9leHRlbnQsIGlub2RlLCBibG9jaywgcGF0aCwgZmxhZ3MpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTg5Ni1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE0MDA9ZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNDI4LVxcdFxcdC8qIHJlZmlsbCBwYXRoICovXFxuZnMvZXh0NC9leHRlbnRzLmM6MTQyOTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZWVfYmxvY2ssIHBhdGgsIGdiX2ZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0xNDMwLVxcdFxcdHJldHVybiBwYXRoO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTQzOC1cXHQvKiByZWZpbGwgcGF0aCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjE0Mzk6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGVlX2Jsb2NrLCBwYXRoLCBnYl9mbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTQ0MC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTk5Mj1leHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI3LVxcdFxcdCAqIHJpZ2h0IGZyb20gZXgsIG9yIGZyb20gdGhlIGxlZnQgb2YgZXguIFRoaXMgaXMgYmVjYXVzZVxcbmZzL2V4dDQvZXh0ZW50cy5jOjIwMjg6XFx0XFx0ICogZXh0NF9maW5kX2V4dGVudCgpIGNhbiByZXR1cm4gZWl0aGVyIGV4dGVudCBvbiB0aGVcXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI5LVxcdFxcdCAqIGxlZnQsIG9yIG9uIHRoZSByaWdodCBmcm9tIHRoZSBzZWFyY2hlZCBwb3NpdGlvbi4gVGhpc1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjEwOS1cXHRcXHRleHRfZGVidWcoaW5vZGUsIFxcXCJuZXh0IGxlYWYgYmxvY2sgLSAldVxcXFxuXFxcIiwgbmV4dCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MjExMDpcXHRcXHRucGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG5leHQsIE5VTEwsIGdiX2ZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTExLVxcdFxcdGlmIChJU19FUlIobnBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yODM3PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yODc2LVxcdFxcdC8qIGZpbmQgZXh0ZW50IGZvciBvciBjbG9zZXN0IGV4dGVudCB0byB0aGlzIGJsb2NrICovXFxuZnMvZXh0NC9leHRlbnRzLmM6Mjg3NzpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZW5kLCBOVUxMLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjg3OC1cXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNjItXFx0ICogR2V0IGEgbmV3IHBhdGggdG8gdHJ5IHRvIHplcm9vdXQgb3IgZml4IHRoZSBleHRlbnQgbGVuZ3RoLlxcbmZzL2V4dDQvZXh0ZW50cy5jOjMyNjM6XFx0ICogVXNpbmcgRVhUNF9FWF9OT0ZBSUwgZ3VhcmFudGVlcyB0aGF0IGV4dDRfZmluZF9leHRlbnQoKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNjQtXFx0ICogd2lsbCBub3QgcmV0dXJuIC1FTk9NRU0sIG90aGVyd2lzZSAtRU5PTUVNIHdpbGwgY2F1c2UgYVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzI2OC1cXHQgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzozMjY5OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlZV9ibG9jaywgTlVMTCwgZmxhZ3MgfCBFWFQ0X0VYX05PRkFJTCk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzI3MC1cXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zNDA5PXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM0NDQtXFx0XFx0ICovXFxuZnMvZXh0NC9leHRlbnRzLmM6MzQ0NTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLVxcdTAwM2VtX2xibGssIHBhdGgsIGZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zNDQ2LVxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNDk2LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjM0OTc6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cXHUwMDNlbV9sYmxrLCBOVUxMLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzQ5OC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MzgxNj1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zODYxLWNvbnZlcnQ6XFxuZnMvZXh0NC9leHRlbnRzLmM6Mzg2MjpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLVxcdTAwM2VtX2xibGssIHBhdGgsIGZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zODYzLVxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zOTM2PWNvbnZlcnRfaW5pdGlhbGl6ZWRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zOTczLVxcdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM5NzQ6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cXHUwMDNlbV9sYmxrLCBwYXRoLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzk3NS1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDI4NS1cXHQvKiBmaW5kIGV4dGVudCBmb3IgdGhpcyBibG9jayAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjQyODY6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cXHUwMDNlbV9sYmxrLCBOVUxMLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDI4Ny1cXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy00Mjk2LVxcdCAqIHRoaXMgc2l0dWF0aW9uIGlzIHBvc3NpYmxlLCB0aG91Z2gsIF9kdXJpbmdfIHRyZWUgbW9kaWZpY2F0aW9uO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjQyOTc6XFx0ICogdGhpcyBpcyB3aHkgYXNzZXJ0IGNhbid0IGJlIHB1dCBpbiBleHQ0X2ZpbmRfZXh0ZW50KClcXG5mcy9leHQ0L2V4dGVudHMuYy00Mjk4LVxcdCAqL1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDM4Mi1cXHQgKiBJZiB3ZSBhcmUgZG9pbmcgYmlnYWxsb2MsIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXh0ZW50IHJldHVybmVkXFxuZnMvZXh0NC9leHRlbnRzLmM6NDM4MzpcXHQgKiBieSBleHQ0X2ZpbmRfZXh0ZW50KCkgaW1wbGllcyBhIGNsdXN0ZXIgd2UgY2FuIHVzZS5cXG5mcy9leHQ0L2V4dGVudHMuYy00Mzg0LVxcdCAqL1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTM4Mj1leHQ0X2V4dF9zaGlmdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01MzkyLVxcdC8qIExldCBwYXRoIHBvaW50IHRvIHRoZSBsYXN0IGV4dGVudCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjUzOTM6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy01Mzk0LVxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01NDEwLVxcdGlmIChTSElGVCA9PSBTSElGVF9MRUZUKSB7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTQxMTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgc3RhcnQgLSAxLCBwYXRoLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTU0MTItXFx0XFx0XFx0XFx0XFx0RVhUNF9FWF9OT0NBQ0hFKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU0NTktXFx0d2hpbGUgKGl0ZXJhdG9yIFxcdTAwMjZcXHUwMDI2IHN0YXJ0IFxcdTAwM2M9IHN0b3ApIHtcXG5mcy9leHQ0L2V4dGVudHMuYzo1NDYwOlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAqaXRlcmF0b3IsIHBhdGgsXFxuZnMvZXh0NC9leHRlbnRzLmMtNTQ2MS1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTYyNj1zdGF0aWMgaW50IGV4dDRfaW5zZXJ0X3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTY4Ny1cXG5mcy9leHQ0L2V4dGVudHMuYzo1Njg4OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBOVUxMLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01Njg5LVxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU3NjM9ZXh0NF9zd2FwX2V4dGVudHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZTEsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01Nzg0LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjU3ODU6XFx0XFx0cGF0aDEgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlMSwgbGJsazEsIHBhdGgxLCBFWFQ0X0VYX05PQ0FDSEUpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODYtXFx0XFx0aWYgKElTX0VSUihwYXRoMSkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODktXFx0XFx0fVxcbmZzL2V4dDQvZXh0ZW50cy5jOjU3OTA6XFx0XFx0cGF0aDIgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlMiwgbGJsazIsIHBhdGgyLCBFWFQ0X0VYX05PQ0FDSEUpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU3OTEtXFx0XFx0aWYgKElTX0VSUihwYXRoMikpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU5NDg9aW50IGV4dDRfY2x1X21hcHBlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsY2x1KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTk2NS1cXHQvKiBzZWFyY2ggZm9yIHRoZSBleHRlbnQgY2xvc2VzdCB0byB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGNsdXN0ZXIgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo1OTY2OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFQ0X0MyQihzYmksIGxjbHUpLCBOVUxMLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01OTY3LVxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01OTc0LVxcdCAqIHRob3VnaCwgX2R1cmluZ18gdHJlZSBtb2RpZmljYXRpb24sIGFuZCBpdCdzIHdoeSBhbiBhc3NlcnQgY2FuJ3RcXG5mcy9leHQ0L2V4dGVudHMuYzo1OTc1OlxcdCAqIGJlIHB1dCBpbiBleHQ0X2ZpbmRfZXh0ZW50KCkuXFxuZnMvZXh0NC9leHRlbnRzLmMtNTk3Ni1cXHQgKi9cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYwMjc9aW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDMzLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYwMzQ6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0LCBOVUxMLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDM1LVxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDUzLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYwNTQ6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0LCBwYXRoLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDU1LVxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDcwLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYwNzE6XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0LCBwYXRoLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDcyLVxcdFxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MDkyPXZvaWQgZXh0NF9leHRfcmVwbGF5X3Nocmlua19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBlbmQpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDk4LVxcdHdoaWxlIChjdXIgXFx1MDAzYyBlbmQpIHtcXG5mcy9leHQ0L2V4dGVudHMuYzo2MDk5OlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIE5VTEwsIDApO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYxMDAtXFx0XFx0aWYgKElTX0VSUihwYXRoKSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYxNDA9aW50IGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjE0OS1cXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYxNTA6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy02MTUxLVxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MTgyLVxcdFxcdGdvdG8gb3V0O1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYxODM6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGN1ciwgcGF0aCwgMCk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNjE4NC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjE4Ny1cXHR3aGlsZSAoY3VyIFxcdTAwM2MgZW5kKSB7XFxuZnMvZXh0NC9leHRlbnRzLmM6NjE4ODpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgY3VyLCBwYXRoLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MTg5LVxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MjAwLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYyMDE6XFx0XFx0cGF0aDIgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIHBhdGgyLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MjAyLVxcdFxcdGlmIChJU19FUlIocGF0aDIpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjIyNz1pbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyMzgtXFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo2MjM5OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI0MC1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI1NS1cXHRcXHRpZiAocmV0IFxcdTAwM2UgMCkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYyNTY6XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNTctXFx0XFx0XFx0aWYgKCFJU19FUlIocGF0aCkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYzMDQ9RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZXh0X2luc2VydF9leHRlbnQpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYzMDU6RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZmluZF9leHRlbnQpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYzMDYtRVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfaXNzdWVfemVyb291dCk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9NjczPXN0YXRpYyB2b2lkIGV4dDRfZXNfaW5zZXJ0X2V4dGVudF9leHRfY2hlY2soc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02ODItXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjY4MzpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZXMtXFx1MDAzZWVzX2xibGssIE5VTEwsIEVYVDRfRVhfTk9DQUNIRSk7XFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTY4NC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIxNDg9c3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9hZGRfcmFuZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTggKnZhbClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMTk3LVxcdFxcdFxcdC8qIFJhbmdlIGlzIG5vdCBtYXBwZWQgKi9cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjE5ODpcXHRcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgY3VyLCBwYXRoLCAwKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjE5OS1cXHRcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIzMjg9c3RhdGljIHZvaWQgZXh0NF9mY19zZXRfYml0bWFwc19hbmRfY291bnRlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzYwLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzZSAwKSB7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIzNjE6XFx0XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzYyLVxcdFxcdFxcdFxcdGlmICghSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEwNzQ9c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTEyLVxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jOjExMTM6XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcXG5mcy9leHQ0L2lubGluZS5jLTExMTQtXFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MjE9c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTM2LVxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbmZzL2V4dDQvbWlncmF0ZS5jOjM3OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cXHUwMDNlZmlyc3RfYmxvY2ssIE5VTEwsIDApO1xcbmZzL2V4dDQvbWlncmF0ZS5jLTM4LVxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmM9MjcxPXN0YXRpYyBpbnQgZXh0NF9nZXRfdmVyaXR5X2Rlc2NyaXB0b3JfbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmMtMjkzLVxcbmZzL2V4dDQvdmVyaXR5LmM6Mjk0OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsIDApO1xcbmZzL2V4dDQvdmVyaXR5LmMtMjk1LVxcdGlmIChJU19FUlIocGF0aCkpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjU0LjQ5MjY1MjE5NloiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MTg3MTk0MzQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBvdGVudGlhbCBLZXJuZWwgQnVnIGluIGV4dDQgSW5saW5lIERhdGEgSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEknbSBsb29raW5nIGF0IHRoaXMgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBmdW5jdGlvbi4gVGhlIGNvZGUgZmlyc3QgY2FsbHMgYGV4dDRfZmluZF9leHRlbnRgIHdoaWNoIGNhbiByZXR1cm4gYW4gZXJyb3IsIHNwZWNpZmljYWxseSBgRVJSX1BUUigtRU5PTUVNKWAuIElmIHRoYXQgaGFwcGVucywgYHBhdGhgIGJlY29tZXMgYW4gZXJyb3IgcG9pbnRlci4gVGhlbiwgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGlzIGNhbGxlZCwgYW5kICp0aGF0KiBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIFwiQWhhISBEZXJlZmVyZW5jaW5nIGFuIGVycm9yIHBvaW50ZXIhIFRoYXQncyBhIGNsYXNzaWMuXCIgU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB0aGVuIHRyaWVzIHRvIGFjY2VzcyBgcGF0aFtkZXB0aF1gLiBUaGlzIHdvdWxkIGF0dGVtcHQgdG8gcmVhZCBmcm9tIG1lbW9yeSBsb2NhdGlvbnMgcmVsYXRlZCB0byBgRVJSX1BUUigtRU5PTUVNKWAsIHdoaWNoIGlzIGVzc2VudGlhbGx5IGFuIGludmFsaWQgbWVtb3J5IGFkZHJlc3Mg4oCTIGEgY3Jhc2ggd2FpdGluZyB0byBoYXBwZW4uIEl0J3MgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UsIG9yIGF0IGxlYXN0IGFuIGludmFsaWQgbWVtb3J5IGFjY2VzcyBjbG9zZSB0byB0aGUgdG9wIG9mIG1lbW9yeS4gVGhpcyB3aWxsIGRlZmluaXRlbHkgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIGNhdXNlIGEgc3RhbmRhcmQga2VybmVsIG9vcHMsIG5vdCBhIHN1YnRsZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHRoYXQgS01TQU4gd291bGQgY2F0Y2guXG5cbkJ1dCB3YWl0LCBJIG5lZWQgdG8gY29uc2lkZXIgYSBkaWZmZXJlbnQgc2NlbmFyaW8uIFdoYXQgaWYgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgICppdHNlbGYqIHJldHVybnMgYW4gZXJyb3I/IEkgc2VlIHRoZSBjb2RlIGlzIHdyaXR0ZW4gaW4gYSB3YXkgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBpcyAqaWdub3JlZCouIE1lYW5pbmcgdGhhdCBpZiBpdCBmYWlscywgdGhlbiB0aGUgb2xkIGBwYXRoYCBpcyBzdGlsbCBpbiB1c2UhXG5cbkFuZCBhIGZ1cnRoZXIgdGhvdWdodCEgQ2FuIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmcmVlIGBwYXRoYCBpbnRlcm5hbGx5PyBJZiBpdCBkb2VzLCBhbmQgcmV0dXJucyBhbiBlcnJvciwgdGhlbiB0aGUgb3JpZ2luYWwgYHBhdGhgIHBvaW50ZXIgd291bGQgYmUgZGFuZ2xpbmcuIE5vdyB0aGF0J3MgYSBwcm9ibGVtLiBUaGF0IGNvdWxkIGxlYWQgdG8gYSB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBkb3VibGUtZnJlZSwgZGVwZW5kaW5nIG9uIGhvdyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgaXMgaW1wbGVtZW50ZWQuIEkgbmVlZCB0byBkaXZlIGRlZXBlciBhbmQgZXhhbWluZSB0aGUgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGZ1bmN0aW9uIGl0c2VsZiB0byBzZWUgaWYgaXQgZG9lcyBpbmRlZWQgZnJlZSB0aGUgYHBhdGhgIHVuZGVyIGFueSBlcnJvciBjb25kaXRpb25zLiBUaGF0J3Mgd2hlcmUgdGhlIHJlYWwgdnVsbmVyYWJpbGl0eSBsaWVzLiBUaGlzIGlzIGEgY3JpdGljYWwgY29kZSBwYXRoLCBhbmQgSSdtIGdvaW5nIHRvIHRyYWNrIHRoYXQgZnVuY3Rpb24gY2FsbCBkb3duIHRvIGVuc3VyZSBJJ20gZ2V0dGluZyB0aGUgd2hvbGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzI2MzgsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDM6MDIuNjc5ODQ5MzI0WiIsIlNlcSI6NTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTk2MDgzODE1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2Ryb3BfcmVmc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dGVudHMuYz0xMDU9c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3BhdGhfYnJlbHNlKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTEwLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjExMTpzdGF0aWMgdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXFxuZnMvZXh0NC9leHRlbnRzLmMtMTEyLXtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTEyMj12b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTEyNS1cXHRcXHRyZXR1cm47XFxuZnMvZXh0NC9leHRlbnRzLmM6MTI2OlxcdGV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0xMjctXFx0a2ZyZWUocGF0aCk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz04ODY9ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTkwOS1cXHRpZiAocGF0aCkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjkxMDpcXHRcXHRleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7XFxuZnMvZXh0NC9leHRlbnRzLmMtOTExLVxcdFxcdGlmIChkZXB0aCBcXHUwMDNlIHBhdGhbMF0ucF9tYXhkZXB0aCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzowNC4yNzU5NDIwMTlaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA4MzkyNzYxMjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFBvdGVudGlhbCBNZW1vcnkgTGVha3MgaW4gRXh0NCBFeHRlbnQgSW5zZXJ0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgZnVuY3Rpb24gYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYHN0cnVjdCBleHQ0X2V4dF9wYXRoICpgIGl0IHdvcmtzIHdpdGguIE15IGluaXRpYWwgY29uY2VybiBpcyBtZW1vcnkgbGVha3MsIHNwZWNpZmljYWxseSBhcm91bmQgdGhlIGBwYXRoYCBwb2ludGVyLiBJZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgZmFpbHMsIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSBpdCBjYWxscyBgZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpYC4gVGhlIHRyaWNreSBwYXJ0IGlzLCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgKnJldHVybnMqIGEgYHN0cnVjdCBleHQ0X2V4dF9wYXRoICpgLlxuXG5TbywgdGhlIHF1ZXN0aW9uIGlzLCBkb2VzIGEgY2FsbGVyIHdobyAqZG9lc24ndCogdXNlIHRoZSByZXR1cm4gdmFsdWUgYW5kICpkb2VzKiBoYXZlIGBwYXRoYCBmcmVlZCBieSBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgbGVhayBtZW1vcnk/IE5vLCB0aGF0J3Mgbm90IHJpZ2h0LCBpZiBpdCBmcmVlcyBgcGF0aGAsIGl0J3MgZnJlZWQuXG5cbkhvd2V2ZXIsIHRoZSBjb2RlIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgaXMgd2hhdCB0cmlnZ2VyZWQgdGhpcyB0aG91Z2h0IHByb2Nlc3MsIGJlY2F1c2UgaXQgY2FsbHMgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGFuZCAqY29tcGxldGVseSBpZ25vcmVzKiB0aGUgcmV0dXJuIHZhbHVlISBJJ20gc2VlaW5nIHRoaXM6XG5cbmBgYGNcblx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApO1xuXHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcblxuXHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XG5cdFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcblx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcblx0XHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbmBgYFxuXG5Pa2F5LCBgZXh0NF9maW5kX2V4dGVudGAgd2lsbCBhbGxvY2F0ZSBgcGF0aGAgYmVjYXVzZSB0aGUgY2FsbGVyIGlzIHBhc3NpbmcgYE5VTExgLiBTbywgYHBhdGhgIGlzIGluaXRpYWxseSBhbGxvY2F0ZWQuIFRoZW4sIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBpcyBjYWxsZWQuIEl0ICptaWdodCogZnJlZSBhbmQgcmV0dXJuIGEgbmV3IHBhdGgsIGl0IG1pZ2h0IHJldHVybiB0aGUgc2FtZSBwYXRoLCBvciBpdCBtaWdodCByZXR1cm4gYW4gZXJyb3IuXG5cblRoZSBwcm9ibGVtIGlzLCBpZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgc3VjY2VlZHMsIGl0ICpyZXR1cm5zKiBgcGF0aGAsIHdoaWNoIGNvdWxkIGJlIHJlYWxsb2NhdGVkIG9yIHRoZSBvcmlnaW5hbCBwYXRoLiBCdXQgdGhlIGNvZGUgKmNvbXBsZXRlbHkqIGlnbm9yZXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCEgQW5kLCBjcnVjaWFsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmcmVlcyBgcGF0aGAgaW4gKmFueSogY2FzZSB3aGVuIGl0IHJldHVybnMgc3VjY2Vzc2Z1bGx5ISBUaGlzIGxvb2tzIGxpa2UgYSBkZWZpbml0ZSBwb3RlbnRpYWwgbGVhay4gSSBuZWVkIHRvIGRpZyBpbnRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCB0byBiZSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMzk4NiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxNS4xMTUyMjIwNzhaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ0MTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIxMDAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIxMDA6XFx0XFxuMjEwMTpcXHRcXHQvKiBwcm9iYWJseSBuZXh0IGxlYWYgaGFzIHNwYWNlIGZvciB1cz8gKi9cXG4yMTAyOlxcdFxcdGZleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7XFxuMjEwMzpcXHRcXHRuZXh0ID0gRVhUX01BWF9CTE9DS1M7XFxuMjEwNDpcXHRcXHRpZiAobGUzMl90b19jcHUobmV3ZXh0LVxcdTAwM2VlZV9ibG9jaykgXFx1MDAzZSBsZTMyX3RvX2NwdShmZXgtXFx1MDAzZWVlX2Jsb2NrKSlcXG4yMTA1OlxcdFxcdFxcdG5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2socGF0aCk7XFxuMjEwNjpcXHRcXHRpZiAobmV4dCAhPSBFWFRfTUFYX0JMT0NLUykge1xcbjIxMDc6XFx0XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKm5wYXRoO1xcbjIxMDg6XFx0XFxuMjEwOTpcXHRcXHRcXHRleHRfZGVidWcoaW5vZGUsIFxcXCJuZXh0IGxlYWYgYmxvY2sgLSAldVxcXFxuXFxcIiwgbmV4dCk7XFxuMjExMDpcXHRcXHRcXHRucGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG5leHQsIE5VTEwsIGdiX2ZsYWdzKTtcXG4yMTExOlxcdFxcdFxcdGlmIChJU19FUlIobnBhdGgpKSB7XFxuMjExMjpcXHRcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKG5wYXRoKTtcXG4yMTEzOlxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjIxMTQ6XFx0XFx0XFx0fVxcbjIxMTU6XFx0XFx0XFx0QlVHX09OKG5wYXRoLVxcdTAwM2VwX2RlcHRoICE9IHBhdGgtXFx1MDAzZXBfZGVwdGgpO1xcbjIxMTY6XFx0XFx0XFx0ZWggPSBucGF0aFtkZXB0aF0ucF9oZHI7XFxuMjExNzpcXHRcXHRcXHRpZiAobGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX2VudHJpZXMpIFxcdTAwM2MgbGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX21heCkpIHtcXG4yMTE4OlxcdFxcdFxcdFxcdGV4dF9kZWJ1Zyhpbm9kZSwgXFxcIm5leHQgbGVhZiBpc24ndCBmdWxsKCVkKVxcXFxuXFxcIixcXG4yMTE5OlxcdFxcdFxcdFxcdFxcdCAgbGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX2VudHJpZXMpKTtcXG4yMTIwOlxcdFxcdFxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4yMTIxOlxcdFxcdFxcdFxcdHBhdGggPSBucGF0aDtcXG4yMTIyOlxcdFxcdFxcdFxcdGdvdG8gaGFzX3NwYWNlO1xcbjIxMjM6XFx0XFx0XFx0fVxcbjIxMjQ6XFx0XFx0XFx0ZXh0X2RlYnVnKGlub2RlLCBcXFwibmV4dCBsZWFmIGhhcyBubyBmcmVlIHNwYWNlKCVkLCVkKVxcXFxuXFxcIixcXG4yMTI1OlxcdFxcdFxcdFxcdCAgbGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX2VudHJpZXMpLCBsZTE2X3RvX2NwdShlaC1cXHUwMDNlZWhfbWF4KSk7XFxuMjEyNjpcXHRcXHRcXHRleHQ0X2ZyZWVfZXh0X3BhdGgobnBhdGgpO1xcbjIxMjc6XFx0XFx0fVxcbjIxMjg6XFx0XFxuMjEyOTpcXHRcXHQvKlxcbjIxMzA6XFx0XFx0ICogVGhlcmUgaXMgbm8gZnJlZSBzcGFjZSBpbiB0aGUgZm91bmQgbGVhZi5cXG4yMTMxOlxcdFxcdCAqIFdlJ3JlIGdvbm5hIGFkZCBhIG5ldyBsZWFmIGluIHRoZSB0cmVlLlxcbjIxMzI6XFx0XFx0ICovXFxuMjEzMzpcXHRcXHRpZiAoZ2JfZmxhZ3MgXFx1MDAyNiBFWFQ0X0dFVF9CTE9DS1NfTUVUQURBVEFfTk9GQUlMKVxcbjIxMzQ6XFx0XFx0XFx0bWJfZmxhZ3MgfD0gRVhUNF9NQl9VU0VfUkVTRVJWRUQ7XFxuMjEzNTpcXHRcXHRwYXRoID0gZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZSwgaW5vZGUsIG1iX2ZsYWdzLCBnYl9mbGFncyxcXG4yMTM2OlxcdFxcdFxcdFxcdFxcdFxcdHBhdGgsIG5ld2V4dCk7XFxuMjEzNzpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbjIxMzg6XFx0XFx0XFx0cmV0dXJuIHBhdGg7XFxuMjEzOTpcXHRcXHRkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7XFxuMjE0MDpcXHRcXHRlaCA9IHBhdGhbZGVwdGhdLnBfaGRyO1xcbjIxNDE6XFx0XFxuMjE0MjpcXHRoYXNfc3BhY2U6XFxuMjE0MzpcXHRcXHRuZWFyZXggPSBwYXRoW2RlcHRoXS5wX2V4dDtcXG4yMTQ0OlxcdFxcbjIxNDU6XFx0XFx0ZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpO1xcbjIxNDY6XFx0XFx0aWYgKGVycilcXG4yMTQ3OlxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjIxNDg6XFx0XFxuMjE0OTpcXHRcXHRpZiAoIW5lYXJleCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxNS4xMTU0NjkzODhaIiwiU2VxIjo1NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ5NDQwMzc1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgUGF0aCBIYW5kbGluZyoqXG5cblJpZ2h0LCBsZXQgbWUgc2VlLi4uIEknbSBsb29raW5nIGF0IGhvdyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgbWFuYWdlcyB0aGUgYHBhdGhgIHZhcmlhYmxlLiBJdCdzIGJlY29taW5nIGNsZWFyIHRoYXQgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBpbnRlcmVzdGluZyBtZW1vcnkgbWFuYWdlbWVudCBiZWhhdmlvcnMsIHNwZWNpZmljYWxseSBzdXJyb3VuZGluZyB0aGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIG9mIGBwYXRoYCBhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byBgbnBhdGhgLiAgSSdtIG5vdGluZyB0aGF0IHRoZXJlIGFyZSB0d28gcHJpbWFyeSBwYXRocywgb3Igb3V0Y29tZXMsIGZvciBgcGF0aGAuIEVpdGhlciBgcGF0aGAgZ2V0cyBmcmVlZCBhbmQgYG5wYXRoYCAod2hpY2ggaXMgYSBuZXcgYWxsb2NhdGlvbikgaXMgcmV0dXJuZWQsIG9yIHRoZSBvcmlnaW5hbCBgcGF0aGAgZ2V0cyByZXR1cm5lZCBhZnRlciBjcmVhdGlvbiBvZiBhIG5ldyBsZWFmIHRocm91Z2ggYGV4dDRfZXh0X2NyZWF0ZV9uZXdfbGVhZmAuIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGVhY2ggc2NlbmFyaW8gcGxheXMgb3V0LCBhcyB0aGlzIGlzIGEgcG90ZW50aWFsIHNvdXJjZSBmb3Igc3VidGxlIG1lbW9yeSBlcnJvcnMgaWYgbm90IGhhbmRsZWQgcHJlY2lzZWx5LiBJbiBwYXJ0aWN1bGFyLCBJIG11c3QgaW52ZXN0aWdhdGUgdGhlIGltcGxpY2F0aW9ucyB0aGlzIGhhcyBmb3IgZXh0ZXJuYWwgY2FsbGVycyBvZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAuIE5vdywgdG8gY29uc2lkZXIgYWxsIHBvc3NpYmxlIHBlcm11dGF0aW9ucyBvZiB0aGlzIGJlaGF2aW9yLiBJJ2xsIG5lZWQgdG8gZXhhbWluZSB0aGUgZnVuY3Rpb24ncyBpbnRlcm5hbCBsb2dpYywgZXNwZWNpYWxseSBhcm91bmQgdGhlIHJldHVybiB2YWx1ZXMsIHRvIGVuc3VyZSB0aGUgY29kZSdzIGludGVncml0eSBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCByZW1haW4gc3BvdC1vbi4gSSBzaG91bGQgbm90ZSB0aGUgZmluYWwgc3RhdGVzIG9mIHRoZSBgcGF0aGAgYW5kIGBucGF0aGAgdmFyaWFibGVzIGFmdGVyIHRoZSBmdW5jdGlvbiBjb21wbGV0ZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM1ODUxLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxOS42MDk4NzY4MDFaIiwiU2VxIjo1NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMzMDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIyMDAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIyMDA6XFx0bWVyZ2U6XFxuMjIwMTpcXHRcXHQvKiB0cnkgdG8gbWVyZ2UgZXh0ZW50cyAqL1xcbjIyMDI6XFx0XFx0aWYgKCEoZ2JfZmxhZ3MgXFx1MDAyNiBFWFQ0X0dFVF9CTE9DS1NfU1BMSVRfTk9NRVJHRSkpXFxuMjIwMzpcXHRcXHRcXHRleHQ0X2V4dF90cnlfdG9fbWVyZ2UoaGFuZGxlLCBpbm9kZSwgcGF0aCwgbmVhcmV4KTtcXG4yMjA0OlxcdFxcbjIyMDU6XFx0XFx0LyogdGltZSB0byBjb3JyZWN0IGFsbCBpbmRleGVzIGFib3ZlICovXFxuMjIwNjpcXHRcXHRlcnIgPSBleHQ0X2V4dF9jb3JyZWN0X2luZGV4ZXMoaGFuZGxlLCBpbm9kZSwgcGF0aCk7XFxuMjIwNzpcXHRcXHRpZiAoZXJyKVxcbjIyMDg6XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuMjIwOTpcXHRcXG4yMjEwOlxcdFxcdGVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBwYXRoLVxcdTAwM2VwX2RlcHRoKTtcXG4yMjExOlxcdFxcdGlmIChlcnIpXFxuMjIxMjpcXHRcXHRcXHRnb3RvIGVycm91dDtcXG4yMjEzOlxcdFxcbjIyMTQ6XFx0XFx0cmV0dXJuIHBhdGg7XFxuMjIxNTpcXHRcXG4yMjE2OlxcdGVycm91dDpcXG4yMjE3OlxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4yMjE4OlxcdFxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuMjIxOTpcXHR9XFxuMjIyMDpcXHRcXG4yMjIxOlxcdHN0YXRpYyBpbnQgZXh0NF9maWxsX2VzX2NhY2hlX2luZm8oc3RydWN0IGlub2RlICppbm9kZSxcXG4yMjIyOlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfbGJsa190IGJsb2NrLCBleHQ0X2xibGtfdCBudW0sXFxuMjIyMzpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvKVxcbjIyMjQ6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxOS42MTAxMTI0NTFaIiwiU2VxIjo1NywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTg5Njc5NTAxMTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgRXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIGFuZCBFeHRlbnQgSGFuZGxpbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBoYXMgYSBtZW1vcnkgbGVhay4gSXQgcmV0dXJucyBhIHBhdGggb24gc3VjY2VzcyBhbmQgZnJlZXMgdGhlIHBhdGgsIHdoaWNoIG1lYW5zIHRoZSBjYWxsZXIgaXMgbm90IHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LiBIb3dldmVyLCB0aGUgY2FsbGVyIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgZG9lc24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBhbmQgKmRvZXNuJ3QqIGZyZWUgYHBhdGhgIGFmdGVyIGEgc3VjY2Vzc2Z1bCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgY2FsbC4gVGhpcyBjcmVhdGVzIGEgbWVtb3J5IGxlYWsgYmVjYXVzZSBwYXRoIHdpbGwgbmV2ZXIgYmUgZnJlZWQuIFRoZSBxdWVzdGlvbiBpcywgd291bGQgS01TQU4gY2F0Y2ggdGhpcz8gTm8sIGl0IGNhdGNoZXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtNRU1MRUFLLCBob3dldmVyLCB3aWxsIGNhdGNoIG1lbW9yeSBsZWFrcy5cblxuQnV0LCBhIHNlY29uZCB0aG91Z2h0IGlzIHRoZSBjb2RlLiBMZXQncyB0cmFjZSBpdCBjYXJlZnVsbHkuIFdhaXQsIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIsIHRoZSBjb2RlIHdvdWxkIGRlcmVmZXJlbmNlIGl0IGluIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gVGhhdCB3b3VsZCBiZSBhIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSwgd2hpY2ggaXMgYW4gaW1tZWRpYXRlIGNyYXNoIHRoYXQgS0FTQU4gb3IgdGhlIGtlcm5lbCdzIG9vcHMgZGV0ZWN0aW9uIHNob3VsZCBjYXRjaC5cblxuTW92aW5nIG9uIHRvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgSSBuZWVkIHRvIHNjcnV0aW5pemUgaXQgZm9yIHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBGaXJzdCwgaXQgYWxsb2NhdGVzIGEgYnVmZmVyIGBidWZgIGFuZCByZWFkcyBpbmxpbmUgZGF0YSBpbnRvIGl0LiBUaGUgcG90ZW50aWFsIGlzc3VlIEkgc2VlIGlzIHRoYXQgaWYgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgcmV0dXJucyBmZXdlciBieXRlcyB0aGFuIGV4cGVjdGVkLCB0aGVuIHBhcnRzIG9mIGBidWZgIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEhvd2V2ZXIsIHRoZSBjb2RlJ3MgbG9naWMgaXMgdGhhdCB0aGUgYGlubGluZV9zaXplYCBpcyBiYXNlZCBvbiB0aGUgZGF0YSB0byBiZSBjb3BpZWQsIHNvIGl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIHJlYWQgbGVzcyB0aGFuIHRoZSBleHBlY3RlZCBzaXplLlxuXG5CdXQgd2FpdCwgd2hhdCBpZiB0aGUgaW5vZGUgaXMgYSBkaXJlY3Rvcnk/IFRoZSBwYXRjaCBpcyBpbXBvcnRhbnQgaW4gY29udGV4dCwgYmVjYXVzZSB0aGUgb3JpZ2luYWwgY29kZSAqZG9lcyBub3QqIGNvcHkgZGF0YSBpbnRvIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaWYgYFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKWAgaXMgdHJ1ZS4gSW5zdGVhZCwgaXQgY2FsbHMgYGV4dDRfdXBkYXRlX2lubGluZV9kaXJgLiBJIHNob3VsZCBjaGVjayBpZiB0aGUgbW9kaWZpY2F0aW9uIHRvIHRoYXQgc2VjdGlvbiBvZiBjb2RlIGlzIGltcG9ydGFudC4gVGhlIHBhdGNoIGRvZXNuJ3Qgc2hvdyBtb2RpZmljYXRpb24gdG8gaXQsIGJ1dCBpdCdzIGNhbGxlZCBhbnl3YXkuXG5cbk9rYXksIGxldCBtZSBnbyBjaGVjayB0aGUgb3JpZ2luYWwgY29kZSFcblxuXG4iLCJJbnB1dFRva2VucyI6MzY2MTgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjAxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDM6MzguNTc4MDY1ODUxWiIsIlNlcSI6NTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NzA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNTA6XFx0XFx0aWYgKCFidWYpIHtcXG4xMTUxOlxcdFxcdFxcdGVycm9yID0gLUVOT01FTTtcXG4xMTUyOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExNTM6XFx0XFx0fVxcbjExNTQ6XFx0XFxuMTE1NTpcXHRcXHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XFxuMTE1NjpcXHRcXHRpZiAoZXJyb3IgXFx1MDAzYyAwKVxcbjExNTc6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTE1ODpcXHRcXG4xMTU5OlxcdFxcdC8qXFxuMTE2MDpcXHRcXHQgKiBNYWtlIHN1cmUgdGhlIGlubGluZSBkaXJlY3RvcnkgZW50cmllcyBwYXNzIGNoZWNrcyBiZWZvcmUgd2UgdHJ5IHRvXFxuMTE2MTpcXHRcXHQgKiBjb252ZXJ0IHRoZW0sIHNvIHRoYXQgd2UgYXZvaWQgdG91Y2hpbmcgc3R1ZmYgdGhhdCBuZWVkcyBmc2NrLlxcbjExNjI6XFx0XFx0ICovXFxuMTE2MzpcXHRcXHRpZiAoU19JU0RJUihpbm9kZS1cXHUwMDNlaV9tb2RlKSkge1xcbjExNjQ6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cXHUwMDNlYmgsXFxuMTE2NTpcXHRcXHRcXHRcXHRcXHRcXHRidWYgKyBFWFQ0X0lOTElORV9ET1RET1RfU0laRSxcXG4xMTY2OlxcdFxcdFxcdFxcdFxcdFxcdGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpO1xcbjExNjc6XFx0XFx0XFx0aWYgKGVycm9yKVxcbjExNjg6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTE2OTpcXHRcXHR9XFxuMTE3MDpcXHRcXG4xMTcxOlxcdFxcdG1lbXNldChcXHUwMDI2YXIsIDAsIHNpemVvZihhcikpO1xcbjExNzI6XFx0XFx0YXIuaW5vZGUgPSBpbm9kZTtcXG4xMTczOlxcdFxcdGFyLmxvZ2ljYWwgPSAwO1xcbjExNzQ6XFx0XFx0YXIubGVuID0gMTtcXG4xMTc1OlxcdFxcdGlmIChTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpKVxcbjExNzY6XFx0XFx0XFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcXG4xMTc3OlxcdFxcdGVsc2VcXG4xMTc4OlxcdFxcdFxcdGFyLmZsYWdzID0gMDtcXG4xMTc5OlxcdFxcdG5ld2Jsb2NrID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgXFx1MDAyNmFyLCBcXHUwMDI2ZXJyb3IpO1xcbjExODA6XFx0XFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4xMTgxOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExODI6XFx0XFxuMTE4MzpcXHRcXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVxcdTAwM2VpX3NiLCBuZXdibG9jayk7XFxuMTE4NDpcXHRcXHRpZiAoIWRhdGFfYmgpIHtcXG4xMTg1OlxcdFxcdFxcdGVycm9yID0gLUVOT01FTTtcXG4xMTg2OlxcdFxcdFxcdGdvdG8gb3V0X2JoO1xcbjExODc6XFx0XFx0fVxcbjExODg6XFx0XFxuMTE4OTpcXHRcXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMTkwOlxcdFxcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgaW5vZGUtXFx1MDAzZWlfc2IsIGRhdGFfYmgsXFxuMTE5MTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgRVhUNF9KVFJfTk9ORSk7XFxuMTE5MjpcXHRcXHRpZiAoZXJyb3IpIHtcXG4xMTkzOlxcdFxcdFxcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XFxuMTE5NDpcXHRcXHRcXHRlcnJvciA9IC1FSU87XFxuMTE5NTpcXHRcXHRcXHRnb3RvIG91dF9iaDtcXG4xMTk2OlxcdFxcdH1cXG4xMTk3OlxcdFxcdG1lbXNldChkYXRhX2JoLVxcdTAwM2ViX2RhdGEsIDAsIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuMTE5ODpcXHRcXG4xMTk5OlxcdFxcdGlmICghU19JU0RJUihpbm9kZS1cXHUwMDNlaV9tb2RlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzozOC41NzgyMTUzMDFaIiwiU2VxIjo1OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI5MTg2NjIwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcHJvY2Vzc2luZyB0aGUgY29kZTpcblxuKipEaXZpbmcgaW50byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbidzIHJvbGUgaW4gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEknbSBhc3N1bWluZyB0aGlzIGlzIGFib3V0IGhhbmRsaW5nIGlubGluZSBkYXRhLCB3aGljaCBpcyBlc3NlbnRpYWxseSBzdG9yaW5nIGZpbGUgY29udGVudCBkaXJlY3RseSB3aXRoaW4gdGhlIGlub2RlIGl0c2VsZiwgcmlnaHQ/IFRoYXQncyBhbiBvcHRpbWl6YXRpb24gdG8gcmVkdWNlIGRpc2sgSS9PLCBzbyBpdCdzIGludGVyZXN0aW5nLiBUaGUgYF9ub2xvY2tgIHN1ZmZpeCBzdWdnZXN0cyB0aGlzIGlzIGxpa2VseSBiZWluZyBjYWxsZWQgZnJvbSBjb2RlIHRoYXQgYWxyZWFkeSBoYXMgdGhlIG5lY2Vzc2FyeSBsb2NraW5nIGRvbmUuIEdvb2QsIHRoYXQgc2ltcGxpZmllcyB0aGluZ3MgYSBiaXQuIEkgY2FuIGZvY3VzIG9uIHRoZSBjb3JlIGxvZ2ljIHRoZW4uIEknbGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdHJpZ2dlcnMgdGhpcyBjb252ZXJzaW9uLCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCBoYXBwZW5zLCBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKmRvaW5nKiB0byBtYWtlIHRoYXQgY29udmVyc2lvbi4gSSBuZWVkIHRvIHRyYWNlIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIHNlZSBob3cgdGhlIGlub2RlIGFuZCB0aGUgb24tZGlzayBmb3JtYXQgYXJlIGNoYW5nZWQsIGFuZCBvZiBjb3Vyc2UsIGVuc3VyZSBjb25zaXN0ZW5jeSB0aHJvdWdob3V0IHRoZSBwcm9jZXNzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGhhbmRsZXMgZXJyb3JzIGFuZCBwYXJ0aWFsIGNvbnZlcnNpb25zLCBwYXJ0aWN1bGFybHkgZm9yIHBvd2VyLWZhaWwgc2NlbmFyaW9zLiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBmYWlscyBoYWxmd2F5IHRocm91Z2g/IEhvdyBkb2VzIGl0IG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGVzeXN0ZW0/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBob3cgZG8gdGhleSBlbnN1cmUgdGhhdCB0aGUgY29udmVyc2lvbiBpcyBhdG9taWMgZnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlLCBldmVuIGlmIHVuZGVyIHRoZSBob29kLCB0aGVyZSBhcmUgYSBzZXJpZXMgb2Ygc3RlcHMgdG8gYWNoaWV2ZSB0aGlzLiBOb3csIGxldCdzIHNlZSB3aGVyZSB0byBiZWdpbi4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDA3OCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDM6NDIuODcwMDg0OTEyWiIsIlNlcSI6NjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0ODczMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMDAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEyMDA6XFx0XFx0XFx0bWVtY3B5KGRhdGFfYmgtXFx1MDAzZWJfZGF0YSwgYnVmLCBpbmxpbmVfc2l6ZSk7XFxuMTIwMTpcXHRcXHRcXHRzZXRfYnVmZmVyX3VwdG9kYXRlKGRhdGFfYmgpO1xcbjEyMDI6XFx0XFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMjAzOlxcdFxcdFxcdGVycm9yID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLFxcbjEyMDQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgaW5vZGUsIGRhdGFfYmgpO1xcbjEyMDU6XFx0XFx0fSBlbHNlIHtcXG4xMjA2OlxcdFxcdFxcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XFxuMTIwNzpcXHRcXHRcXHRpbm9kZS1cXHUwMDNlaV9zaXplID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbjEyMDg6XFx0XFx0XFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpO1xcbjEyMDk6XFx0XFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kaXNrc2l6ZSA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4xMjEwOlxcdFxcbjEyMTE6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCxcXG4xMjEyOlxcdFxcdFxcdFxcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXFx1MDAzZWlub2RlKSxcXG4xMjEzOlxcdFxcdFxcdFxcdCAgYnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXFxuMTIxNDpcXHRcXHRcXHRcXHQgIGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpO1xcbjEyMTU6XFx0XFx0XFx0aWYgKCFlcnJvcilcXG4xMjE2OlxcdFxcdFxcdFxcdGVycm9yID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpO1xcbjEyMTc6XFx0XFx0fVxcbjEyMTg6XFx0XFxuMTIxOTpcXHRcXHRpZiAoZXJyb3IpXFxuMTIyMDpcXHRcXHRcXHRnb3RvIG91dF9iaDtcXG4xMjIxOlxcdFxcdGVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgbmV3YmxvY2ssIGFyLmxlbik7XFxuMTIyMjpcXHRvdXRfYmg6XFxuMTIyMzpcXHRcXHRpZiAoZXJyb3IpXFxuMTIyNDpcXHRcXHRcXHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhci5sZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcXG4xMjI1OlxcdFxcdGJyZWxzZShkYXRhX2JoKTtcXG4xMjI2OlxcdG91dDpcXG4xMjI3OlxcdFxcdGtmcmVlKGJ1Zik7XFxuMTIyODpcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMTIyOTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAzOjQyLjg3MDIzNDk5MloiLCJTZXEiOjYxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyODI3OTM3OTEwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgSW5saW5lIERhdGEgQ29udmVyc2lvbiBQYXRjaCoqXG5cbk9rYXksIGxldCBtZSB3YWxrIHRocm91Z2ggdGhpcy4gSSBzZWUgdGhhdCBpZiBpdCdzIGEgZGlyZWN0b3J5LCBgZXh0NF9pbml0X2RpcmJsb2NrYCBpcyBjYWxsZWQgd2l0aCBgYnVmYC4gQnV0IGBidWZgIGlzIGluaXRpYWxpemVkIGJ5IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgLCBzbyB0aGF0J3MgZmluZTsgaXQncyBmdWxseSBpbml0aWFsaXplZC4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLlxuXG5XYWl0LCB3aGF0IGFib3V0IHBvdGVudGlhbCBlcnJvcnMgaW4gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWA/IElmIGl0IGZhaWxzLCBpdCBnb2VzIHRvIGBvdXRgLCB3aGljaCBmcmVlcyBgYnVmYC4gT2theSwgc3RpbGwgc2FmZS5cblxuV2hhdCBpZiBpdCByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUsIGxlc3MgdGhhbiB0aGUgYGlubGluZV9zaXplYD8gSSByZW1lbWJlciBteSBwcmV2aW91cyBhbmFseXNpcywgdGhhdCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBnb2luZyB0byByZXR1cm4gdGhlIHJpZ2h0IHNpemUuIGBpbmxpbmVfc2l6ZWAgaXMgY2FsY3VsYXRlZCB3aXRoIGBlbnRyeS1cdTAwM2VlX3ZhbHVlX3NpemVgLiBTbywgSSdtIHN1cmUgaXQnbGwgcmV0dXJuIHRoZSBleHBlY3RlZCBzaXplLiBFdmVuIGlmIHRoZSBzaXplIG9mIGBlbnRyeS1cdTAwM2VlX3ZhbHVlX3NpemVgIGlzIGNvcnJ1cHQsIGBpbmxpbmVfc2l6ZWAgaXMgYWx3YXlzIGNvbnNpc3RlbnQgYmVjYXVzZSBpdCdzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAuIEJ1dCwgd2hhdCBpZiB0aGVyZSdzIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24gdG8gYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWA/IE5vcGUsIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgd2l0aCBhIGxvY2sgaGVsZC4gSSdtIGNlcnRhaW4gdGhhdCB0aGUgaW5saW5lIGRhdGEgaXMgbm90IGNvbmN1cnJlbnRseSBtb2RpZmllZC4gQW5kIGV2ZW4gaWYgaXQgd2VyZSwgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgd291bGQganVzdCBjb3B5IGZld2VyIGJ5dGVzLCBsZWF2aW5nIHRoZSByZXN0IG9mIGBidWZgIHVuaW5pdGlhbGl6ZWQuIEJ1dCwgaXMgdGhpcyBhIEtNU0FOLXNwZWNpZmljIGlzc3VlPyBJZiBpdCdzIHBhcnRpYWxseSB1bmluaXRpYWxpemVkIGFuZCB3cml0dGVuIHRvIGRpc2ssIGl0J3MgYW4gaW5mby1sZWFrIHRvIGRpc2suIEJ1dCB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCwgd2hpY2ggZG9lc24ndCB6ZXJvIHdpdGhvdXQgdGhlIGBfX0dGUF9aRVJPYCBmbGFnLiBCdXQsIGhlcmUsIEknbSBzdXJlIHRoYXQgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgc2hvdWxkIHJldHVybiBmZXdlciBieXRlcywgYmVjYXVzZSBgaW5saW5lX3NpemVgIGlzIGV4YWN0bHkgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhLlxuXG5BbHJpZ2h0LCBsZXQncyBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYgYWdhaW4uIFRoZSBwYXRjaCBpcyBjaGFuZ2luZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgdG8gYWxsb2NhdGUgdGhlIGJsb2NrIGZpcnN0LCB0aGVuIGNvcHkgdGhlIGRhdGEsIHRoZW4gc2V0IHRoZSBpbmxpbmUgZGF0YSBibG9jay4gSXQgdXNlZCB0byBjYWxsIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCwgdGhlbiBgZXh0NF9tYXBfYmxvY2tzYC4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIGlmIGBleHQ0X21hcF9ibG9ja3NgIGZhaWxlZCwgaXQgY2FsbGVkIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgLiBUaGF0J3Mgd2hlcmUgdGhlIHByb2JsZW0gbGF5OiBpZiBgZXh0NF9jcmVhdGVfaW5saW5lX2RhdGFgIGZhaWxlZCwgaXQgcHJpbnRlZCBhbiBlcnJvciBhbmQgcmV0dXJuZWQhIERhdGEgbG9zcyEgVGhlIG5ldyBjb2RlIGFsbG9jYXRlcyB0aGUgYmxvY2ssIGFuZCBvbmx5IGlmIHRoYXQgc3VjY2VlZHMsIGl0IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhLiBUaGlzIGlzIGFib3V0IHByZXZlbnRpbmcgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24sIG5vdCB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuSXMgdGhlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYD8gTm8uIFRoZSBjb2RlIHVzZXMgYG1lbXNldGAgdG8gemVybyBgaV9ibG9ja2AgYW5kIGBpX2RhdGFgLiBUaGVuIGl0IGluaXRpYWxpemVzIGBuZXdleGAgYW5kIGNhbGxzIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgLiBBcyBJIHZlcmlmaWVkLCB0aGF0IGluaXRpYWxpemVzIGl0LlxuXG5BcmUgdGhlcmUgYW55IG90aGVyIHN0cnVjdHM/IExldCBtZSBzZWUuIGBleHQ0X3hhdHRyX2lib2R5X2ZpbmRgIGFuZCBgZXh0NF94YXR0cl9pbmZvYC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHdpdGggZXhwbGljaXQgemVyb2luZy4gT2theSwgYWxsIGdvb2QuIFdoYXQgYWJvdXQgYGFyYD8gYG1lbXNldGAgaXMgY2FsbGVkIG9uIHRoYXQ7IGl0J3MgZnVsbHkgemVyb2VkLiBTbywgdGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZC4gSXQgZml4ZXMgdGhlIGRhdGEgbG9zcyBieSBhbGxvY2F0aW5nIHRoZSBibG9jayBmaXJzdC5cblxuSXMgdGhlcmUgYW4gaW5mby1sZWFrPyBObywgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBpcyB6ZXJvZWQgYmVmb3JlIHRoZSBjb3B5LCBhbmQgYGJ1ZmAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQuXG5cblNvLCB0aGlzIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gSXQgZml4ZXMgYSBsb2dpYyAvIGVycm9yIGhhbmRsaW5nIGJ1ZyB0aGF0IGNvdWxkIGxlYWQgdG8gZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24uIFN0YW5kYXJkIHRlc3RpbmcsIEtBU0FOLCBvciBzeXprYWxsZXIgd291bGQgY2F0Y2ggdGhpcy4gTm8gbmVlZCBmb3IgS01TQU4uXG5cbkhvbGQgb24sIGxldCBtZSBkb3VibGUtY2hlY2sgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGFuZCBgbmV3ZXhgLiBgbmV3ZXhgIGlzIHBhc3NlZCBieSBwb2ludGVyIGFuZCBoYXMgNCBmaWVsZHM6IGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gLiBBbGwgb2YgdGhlbSBhcmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZSdzIG5vIHBhZGRpbmcuIE9rYXksIHRoYXQncyBjbGVhci5cblxuT2theSwgbGV0IG1lIGRvdWJsZSBjaGVjayB0aGUgc3RydWN0dXJlcyBhZ2FpbiwgYGV4dDRfeGF0dHJfaWJvZHlfZmluZGAgYW5kIGBleHQ0X3hhdHRyX2luZm9gLiBgZXh0NF94YXR0cl9pYm9keV9maW5kYCBpbml0aWFsaXplZCBgaXMucy5ub3RfZm91bmRgIHRvIDAsIHdoaWNoIHplcm9lcyB0aGUgc3RydWN0LiBgZXh0NF94YXR0cl9pbmZvYCBmdWxseSBpbml0aWFsaXplcyBhbGwgZmllbGRzLlxuXG5ZdXAsIHRoZXJlJ3MgYWJzb2x1dGVseSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBoZXJlLlxuXG5JJ20gc2V0dGluZyBOZWVkc0tNU0FOIHRvIGZhbHNlIGFuZCBnaXZpbmcgdGhlIHJlYXNvbmluZy5cblxuUmVhc29uaW5nOiBUaGlzIHBhdGNoIG1vZGlmaWVzIHRoZVxuXG4iLCJJbnB1dFRva2VucyI6NDA5ODEsIk91dHB1dFRva2VucyI6MjYyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY0NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjA0OjExLjE0OTYxNzQyM1oiLCJTZXEiOjYyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMDA5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cXG5cXG5BbGwgc3RydWN0dXJlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoZSBwYXRjaCAoYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgb3IgZXhwbGljaXRseSB6ZXJvZWQgKHZpYSBgbWVtc2V0YCBvciBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHdoaWNoIHplcm9lcyB0aGUgcmVzdCkuIFRoZSBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIGJsb2NrIGFsbG9jYXRpb24gb3JkZXIgaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIHRvIHByZXZlbnQgcG90ZW50aWFsIGRhdGEgbG9zcyB3aGVuIGNvbnZlcnRpbmcgaW5saW5lIGRhdGEgdG8gYSBibG9jay4gUHJldmlvdXNseSwgaWYgYmxvY2sgYWxsb2NhdGlvbiBmYWlsZWQsIGl0IGF0dGVtcHRlZCB0byByZXN0b3JlIHRoZSBpbmxpbmUgZGF0YSwgd2hpY2ggY291bGQgZmFpbCBhbmQgY2F1c2UgZGF0YSBsb3NzLiBUaGUgbmV3IGxvZ2ljIGFsbG9jYXRlcyB0aGUgYmxvY2sgZmlyc3QgYW5kIG9ubHkgcmVtb3ZlcyB0aGUgaW5saW5lIGRhdGEgdXBvbiBzdWNjZXNzLlxcblxcbkFsbCBzdHJ1Y3R1cmVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgYnkgdGhlIHBhdGNoIChgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCwgYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBvciBleHBsaWNpdGx5IHplcm9lZCAodmlhIGBtZW1zZXRgIG9yIHBhcnRpYWwgaW5pdGlhbGl6YXRpb24gd2hpY2ggemVyb2VzIHRoZSByZXN0KS4gVGhlIGJ1ZmZlciBgZGF0YV9iaC1cXHUwMDNlYl9kYXRhYCBpcyBleHBsaWNpdGx5IHplcm9lZCBiZWZvcmUgY29weWluZyB0aGUgaW5saW5lIGRhdGEuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgcGFkZGluZyBsZWFrcywgb3IgaW5mby1sZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgY3Jhc2hlcyAoZS5nLiwgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlcikgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIG9yIGtlcm5lbCBvb3BzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-16 15:14:57 +0000 UTC FinishedAt: 2026-08-16 16:04:12 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1351c159c59b04195647917c5a5f0e5467f44bb0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1351c159c59b04195647917c5a5f0e5467f44bb0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "74cf3860-255d-49bb-b3df-51f8ee44a69f" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_convert_inline_data", "ext4_try_add_inline_entry" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE1OjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0OywKICAgICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgYmxvY2sgYWxsb2NhdGlvbiBvcmRlciBpbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgdG8gcHJldmVudCBwb3RlbnRpYWwgZGF0YSBsb3NzIHdoZW4gY29udmVydGluZyBpbmxpbmUgZGF0YSB0byBhIGJsb2NrLiBQcmV2aW91c2x5LCBpZiBibG9jayBhbGxvY2F0aW9uIGZhaWxlZCwgaXQgYXR0ZW1wdGVkIHRvIHJlc3RvcmUgdGhlIGlubGluZSBkYXRhLCB3aGljaCBjb3VsZCBmYWlsIGFuZCBjYXVzZSBkYXRhIGxvc3MuIFRoZSBuZXcgbG9naWMgYWxsb2NhdGVzIHRoZSBibG9jayBmaXJzdCBhbmQgb25seSByZW1vdmVzIHRoZSBpbmxpbmUgZGF0YSB1cG9uIHN1Y2Nlc3MuXG5cbkFsbCBzdHJ1Y3R1cmVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgYnkgdGhlIHBhdGNoIChgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCwgYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBvciBleHBsaWNpdGx5IHplcm9lZCAodmlhIGBtZW1zZXRgIG9yIHBhcnRpYWwgaW5pdGlhbGl6YXRpb24gd2hpY2ggemVyb2VzIHRoZSByZXN0KS4gVGhlIGJ1ZmZlciBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJlZm9yZSBjb3B5aW5nIHRoZSBpbmxpbmUgZGF0YS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBwYWRkaW5nIGxlYWtzLCBvciBpbmZvLWxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gQW55IHBvdGVudGlhbCBjcmFzaGVzIChlLmcuLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBhbiBlcnJvciBwb2ludGVyKSB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gb3Iga2VybmVsIG9vcHMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE1OjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jXG5pbmRleCA4MDQ1ZTRmZjI3MGM3Li4yYTkyOTllYTQxNDZjIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuY1xuQEAgLTE0LDYgJiM0MzsxNCw3IEBAXG4gI2luY2x1ZGUgXCYjMzQ7ZXh0NC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7eGF0dHIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O3RydW5jYXRlLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7ZXh0NF9leHRlbnRzLmhcJiMzNDtcbiBcbiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEFcdFwmIzM0O2RhdGFcJiMzNDtcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcdCgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSlcbkBAIC0xMDcwLDIxICYjNDM7MTA3MSw2NyBAQCBzdGF0aWMgaW50IGV4dDRfdXBkYXRlX2lubGluZV9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tXHRcdFx0XHQgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsXG4tXHRcdFx0XHQgICAgIHZvaWQgKmJ1ZiwgaW50IGlubGluZV9zaXplKVxuJiM0MztzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4mIzQzO1x0XHRcdFx0ICAgICAgZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBpbnQgbGVuKVxuIHtcbi1cdGludCByZXQ7XG4mIzQzO1x0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuJiM0MztcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4mIzQzO1x0XHQucyA9IHsgLm5vdF9mb3VuZCA9IDAsIH0sXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4mIzQzO1x0XHQubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLFxuJiM0MztcdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuJiM0MztcdFx0LnZhbHVlID0gTlVMTCxcbiYjNDM7XHRcdC52YWx1ZV9sZW4gPSAwLFxuJiM0MztcdH07XG4mIzQzO1x0aW50IGVycm9yO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwmIzM0O2Vycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKVwmIzM0Oyxcbi1cdFx0XHRpbm9kZS1cdTAwM2VpX2lubywgcmV0KTtcbi1cdFx0cmV0dXJuO1xuJiM0MztcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuJiM0MztcdGlmIChlcnJvcikge1xuJiM0MztcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0XHRyZXR1cm4gZXJyb3I7XG4gXHR9XG4tXHRleHQ0X3dyaXRlX2lubGluZV9kYXRhKGlub2RlLCBpbG9jLCBidWYsIDAsIGlubGluZV9zaXplKTtcbi1cdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbiYjNDM7XHRpZiAoZXJyb3IpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRCVUZGRVJfVFJBQ0UoaXMuaWxvYy5iaCwgXCYjMzQ7Z2V0X3dyaXRlX2FjY2Vzc1wmIzM0Oyk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLVx1MDAzZWlfc2IsIGlzLmlsb2MuYmgsIEVYVDRfSlRSX05PTkUpO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgXHUwMDI2aSwgXHUwMDI2aXMpO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG1lbXNldCgodm9pZCAqKWV4dDRfcmF3X2lub2RlKFx1MDAyNmlzLmlsb2MpLVx1MDAzZWlfYmxvY2ssXG4mIzQzO1x0XHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XHRtZW1zZXQoZWktXHUwMDNlaV9kYXRhLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtXHUwMDNlaV9tb2RlKSkpIHtcbiYjNDM7XHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG4mIzQzO1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4mIzQzO1x0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApO1xuJiM0MztcdFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xuJiM0MztcbiYjNDM7XHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XG4mIzQzO1x0XHRuZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4pO1xuJiM0MztcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4mIzQzO1x0XHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4mIzQzO1x0fVxuJiM0MztcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7XG4mIzQzO1x0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuJiM0MztcdGVycm9yID0gZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4mIzQzO1x0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuJiM0MztcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4mIzQzO1x0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuJiM0MztvdXQ6XG4mIzQzO1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuJiM0MztcdGlmIChlcnJvciA9PSAtRU5PREFUQSlcbiYjNDM7XHRcdGVycm9yID0gMDtcbiYjNDM7XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbiYjNDM7XHRyZXR1cm4gZXJyb3I7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuQEAgLTEwOTQsOCAmIzQzOzExNDEsOSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdGludCBlcnJvcjtcbiBcdHZvaWQgKmJ1ZiA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xuLVx0c3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7XG4gXHRpbnQgaW5saW5lX3NpemU7XG4mIzQzO1x0ZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMDtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XG4gXG4gXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiBcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbkBAIC0xMTIwLDI1ICYjNDM7MTE2OCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRtYXAubV9sYmxrID0gMDtcbi1cdG1hcC5tX2xlbiA9IDE7XG4tXHRtYXAubV9mbGFncyA9IDA7XG4tXHRlcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBcdTAwMjZtYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpO1xuJiM0MztcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4mIzQzO1x0YXIuaW5vZGUgPSBpbm9kZTtcbiYjNDM7XHRhci5sb2dpY2FsID0gMDtcbiYjNDM7XHRhci5sZW4gPSAxO1xuJiM0MztcdGlmIChTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkpXG4mIzQzO1x0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGFyLmZsYWdzID0gMDtcbiYjNDM7XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4gXHRpZiAoZXJyb3IgXHUwMDNjIDApXG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHRpZiAoIShtYXAubV9mbGFncyBcdTAwMjYgRVhUNF9NQVBfTUFQUEVEKSkge1xuLVx0XHRlcnJvciA9IC1FSU87XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHR9XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4mIzQzO1x0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4gXHRpZiAoIWRhdGFfYmgpIHtcbiBcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuJiM0MztcdFx0Z290byBvdXRfYmg7XG4gXHR9XG4gXG4gXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcbkBAIC0xMTQ3LDcgJiM0MzsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuJiM0MztcdFx0Z290byBvdXRfYmg7XG4gXHR9XG4gXHRtZW1zZXQoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIDAsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuIFxuQEAgLTExNzEsMTIgJiM0MzsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0XHRcdGVycm9yID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpO1xuIFx0fVxuIFxuLW91dF9yZXN0b3JlOlxuIFx0aWYgKGVycm9yKVxuLVx0XHRleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaWxvYywgYnVmLCBpbmxpbmVfc2l6ZSk7XG4tXG4tb3V0OlxuJiM0MztcdFx0Z290byBvdXRfYmg7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBuZXdibG9jaywgYXIubGVuKTtcbiYjNDM7b3V0X2JoOlxuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFyLmxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuIFx0YnJlbHNlKGRhdGFfYmgpO1xuJiM0MztvdXQ6XG4gXHRrZnJlZShidWYpO1xuIFx0cmV0dXJuIGVycm9yO1xuIH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNTo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmMKaW5kZXggODA0NWU0ZmYyNzBjNy4uMmE5Mjk5ZWE0MTQ2YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbmxpbmUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2lubGluZS5jCkBAIC0xNCw2ICYjNDM7MTQsNyBAQAogI2luY2x1ZGUgJiMzNDtleHQ0LmgmIzM0OwogI2luY2x1ZGUgJiMzNDt4YXR0ci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7dHJ1bmNhdGUuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtleHQ0X2V4dGVudHMuaCYjMzQ7CiAKICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQQkmIzM0O2RhdGEmIzM0OwogI2RlZmluZSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFCSgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSkKQEAgLTEwNzAsMjEgJiM0MzsxMDcxLDY3IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLAotCQkJCSAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpCiYjNDM7c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAomIzQzOwkJCQkgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiAKLQlyZXQgPSBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbmxpbmVfc2l6ZSk7Ci0JaWYgKHJldCkgewotCQlleHQ0X21zZyhpbm9kZS0mZ3Q7aV9zYiwgS0VSTl9FTUVSRywKLQkJCSYjMzQ7ZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpJiMzNDssCi0JCQlpbm9kZS0mZ3Q7aV9pbm8sIHJldCk7Ci0JCXJldHVybjsKJiM0MzsJZG93bl93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCAmYW1wO2ksICZhbXA7aXMpOwomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgJmFtcDtpLCAmYW1wO2lzKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW1lbXNldCgodm9pZCAqKWV4dDRfcmF3X2lub2RlKCZhbXA7aXMuaWxvYyktJmd0O2lfYmxvY2ssCiYjNDM7CQkwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJbWVtc2V0KGVpLSZndDtpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwomIzQzOwlpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLSZndDtpX3NiKSAmYW1wOyZhbXA7CiYjNDM7CQkoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtJmd0O2lfbW9kZSkpKSB7CiYjNDM7CQlleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpOwomIzQzOwkJZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpOwomIzQzOwkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTsKJiM0MzsJCXN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDsKJiM0MzsKJiM0MzsJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CiYjNDM7CQluZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJmFtcDtuZXdleCwgMCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTsKJiM0MzsJZ2V0X2JoKGlzLmlsb2MuYmgpOwomIzQzOwllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX29mZiA9IDA7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX3NpemUgPSAwOwomIzQzOwlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7b3V0OgomIzQzOwlicmVsc2UoaXMuaWxvYy5iaCk7CiYjNDM7CWlmIChlcnJvciA9PSAtRU5PREFUQSkKJiM0MzsJCWVycm9yID0gMDsKJiM0MzsJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCkBAIC0xMDk0LDggJiM0MzsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAogCWlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpOwogCWJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTsKQEAgLTExMjAsMjUgJiM0MzsxMTY4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0KLQltYXAubV9sYmxrID0gMDsKLQltYXAubV9sZW4gPSAxOwotCW1hcC5tX2ZsYWdzID0gMDsKLQllcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmYW1wO21hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7CiYjNDM7CW1lbXNldCgmYW1wO2FyLCAwLCBzaXplb2YoYXIpKTsKJiM0MzsJYXIuaW5vZGUgPSBpbm9kZTsKJiM0MzsJYXIubG9naWNhbCA9IDA7CiYjNDM7CWFyLmxlbiA9IDE7CiYjNDM7CWlmIChTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpKQomIzQzOwkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKJiM0MzsJZWxzZQomIzQzOwkJYXIuZmxhZ3MgPSAwOwomIzQzOwluZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhbXA7YXIsICZhbXA7ZXJyb3IpOwogCWlmIChlcnJvciAmbHQ7IDApCi0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JaWYgKCEobWFwLm1fZmxhZ3MgJmFtcDsgRVhUNF9NQVBfTUFQUEVEKSkgewotCQllcnJvciA9IC1FSU87Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JfQomIzQzOwkJZ290byBvdXQ7CiAKLQlkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLSZndDtpX3NiLCBtYXAubV9wYmxrKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzExOTIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNzEsMTIgJiM0MzsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQogCi1vdXRfcmVzdG9yZToKIAlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKLQotb3V0OgomIzQzOwkJZ290byBvdXRfYmg7CiYjNDM7CWVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgbmV3YmxvY2ssIGFyLmxlbik7CiYjNDM7b3V0X2JoOgomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhci5sZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAlicmVsc2UoZGF0YV9iaCk7CiYjNDM7b3V0OgogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNTo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDY2CgkJCQkJCQlvdXRwdXQ6IDI1CgkJCQkJCQl0aG91Z2h0czogMjA2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQmIzM5O3Mgc2hha2luZyB1cCB0aGUgYGZzL2V4dDQvaW5saW5lLmNgIGNvZGUuIEl0IGxvb2tzIGxpa2UgdGhleSYjMzk7cmUgZG9pbmcgYSBiaXQgb2YgYSByZWZhY3RvciBpbiBob3cgaW5saW5lIGRhdGEgZ2V0cyBjb252ZXJ0ZWQgdG8gcmVndWxhciBibG9ja3MuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgbGlrZSB0aGV5JiMzOTtyZSByZW1vdmluZyBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgaW50cm9kdWNpbmcgdGhpcyBuZXcgZnVuY3Rpb24sIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGNoYW5nZSwgdGhvdWdoLCBpcyBob3cgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGJlaW5nIHJld29ya2VkLiBJbnN0ZWFkIG9mIHRoYXQgYGV4dDRfbWFwX2Jsb2Nrc2AgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCBkYW5jZSwgdGhleSYjMzk7cmUgbm93IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGRpcmVjdGx5LgoKVGhpcyBpcyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGUgZmlsZXN5c3RlbSBoYW5kbGVzIHRoaXMgaW5saW5lLXRvLWJsb2NrIGNvbnZlcnNpb24sIGFuZCB0aGF0IGFsd2F5cyBnZXRzIG15IGF0dGVudGlvbi4gU28sIGxldCYjMzk7cyB0YWtlIGEgY2xvc2VyIGxvb2suCgpJIG5lZWQgdG8gZm9jdXMgb24gdGhlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG9mIGNvdXJzZSwgdGhlIG1haW4gc3ViamVjdCBvZiBjaGFuZ2U6IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gR2l2ZW4gdGhhdCBpdCYjMzk7cyBhIGNvcmUgY29tcG9uZW50LCBJJiMzOTttIHRoaW5raW5nIHdlIHNob3VsZCBkZWZpbml0ZWx5IGJlIGZ1enppbmcgdGhhdCwgb3IgYXQgbGVhc3QgaXRzIGNhbGxlcnMuIFRoYXQgc2VlbXMgbGlrZSB0aGUgbG9naWNhbCBzcG90IGZvciBzb21lIHRob3JvdWdoIHRlc3RpbmcuIExldCYjMzk7cyBkaWcgaW50byB0aGUgY29kZSBhbmQgZmluZCBvdXQgZXhhY3RseSAqd2hvKiBpcyBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMTM2LVxuZnMvZXh0NC9pbmxpbmUuYzoxMTM3OnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM4LVx0XHRcdFx0XHQgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTIzNj1pbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMjg4LVx0ICovXG5mcy9leHQ0L2lubGluZS5jOjEyODk6XHRyZXQgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgZGlyLCBcdTAwMjZpbG9jKTtcbmZzL2V4dDQvaW5saW5lLmMtMTI5MC1cbi0tXG5mcy9leHQ0L2lubGluZS5jPTIwMDM9aW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMjA0MC1cdGlmIChleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXG5mcy9leHQ0L2lubGluZS5jOjIwNDE6XHRcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlLCBcdTAwMjZpbG9jKTtcbmZzL2V4dDQvaW5saW5lLmMtMjA0Mi1cdGV4dDRfd3JpdGVfdW5sb2NrX3hhdHRyKGlub2RlLCBcdTAwMjZub19leHBhbmQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ5ODkKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIG9uIG15IG1pbmQgcmVnYXJkaW5nIHRoZXNlIGZ1bmN0aW9ucy4KCioqSW52ZXN0aWdhdGluZyBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIGluIGV4dDQqKgoKUmlnaHQsIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSXQgbG9va3MgbGlrZSB0aGVzZSBhcmUga2V5IHBsYXllcnMgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgYW4gaW1wb3J0YW50IG9wdGltaXphdGlvbi4gTXkgZm9jdXMgbmVlZHMgdG8gYmUgb24gaG93IHRoZXkgcmVsYXRlIHRvIGVhY2ggb3RoZXIuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgdHJhY2luZyB0aGUgY2FsbCBjaGFpbi4gSSYjMzk7bGwgY2hlY2sgd2hvIGlzIGNhbGxpbmcgdGhvc2UgZnVuY3Rpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NlbmFyaW9zIHRoYXQgbGVhZCB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGJlaW5nIGludm9rZWQuIEdldHRpbmcgYSBjbGVhciBwaWN0dXJlIG9mIHRoZWlyIGNhbGxlcnMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgZGF0YSBmbG93IGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtIG1ha2VzIGRlY2lzaW9ucyBhYm91dCBpbmxpbmUgZGF0YS4gVGhpcyB3aWxsIGhlbHAgbWUgaW1tZW5zZWx5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0Lmg9Mzc0Nz1leHRlcm4gaW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2V4dDQuaC0zNzUxLVx0XHRcdFx0XHQgIHZvaWQgKipmc2RhdGEsIGJvb2wgZGEpO1xuZnMvZXh0NC9leHQ0Lmg6Mzc1MjpleHRlcm4gaW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSxcbmZzL2V4dDQvZXh0NC5oLTM3NTMtXHRcdFx0XHQgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMjM1LSAqL1xuZnMvZXh0NC9pbmxpbmUuYzoxMjM2OmludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbmZzL2V4dDQvaW5saW5lLmMtMTIzNy1cdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L25hbWVpLmM9MjM1Nj1zdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTIzODMtXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoZGlyKSkge1xuZnMvZXh0NC9uYW1laS5jOjIzODQ6XHRcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcdTAwMjZmbmFtZSwgZGlyLCBpbm9kZSk7XG5mcy9leHQ0L25hbWVpLmMtMjM4NS1cdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NjU4CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc2l0dWF0aW9uLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZSwgc3VtbWFyaXplZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipJbmxpbmUgRGF0YSBIYW5kbGluZyBpbiBleHQ0KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgaW5saW5lIGRhdGEgaXMgbWFuYWdlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS4gSXQmIzM5O3MgY2xlYXIgdGhhdCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgaXMsIGFzIGV4cGVjdGVkLCBhIGhlbHBlciBmdW5jdGlvbiBpbnZva2VkIGJ5IGBfX2V4dDRfYWRkX2VudHJ5YC4gTWFrZXMgc2Vuc2UsIHRoYXQmIzM5O3Mgd2hlcmUgdGhlICphdHRlbXB0KiB0byBhZGQgYW4gaW5saW5lIGVudHJ5IGdldHMgaGFuZGxlZCBkdXJpbmcgZGlyZWN0b3J5IGVudHJ5IGNyZWF0aW9uIG9yIG1vZGlmaWNhdGlvbiwgcHJvYmFibHkgd2hlbiBhIHNtYWxsIGZpbGUgZml0cyB3aXRoaW4gdGhlIGlub2RlJiMzOTtzIGRhdGEgYXJlYS4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQgdGhlIGFkZGl0aW9uIG9mIHRoZSAqZGF0YSogaXRzZWxmIGZvciB0aGlzIGlubGluZSBmaWxlIGhhcHBlbnMgd2l0aGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLiBTbywgdGhhdCB0ZWxscyBtZSB0aGUgZGF0YSBjb252ZXJzaW9uIHRha2VzIHBsYWNlIGFmdGVyIHNvbWUgY2hlY2sgLSBwcmVzdW1hYmx5IGFmdGVyIHRoZSBhdHRlbXB0IHRvIG1ha2UgaXQgaW5saW5lLiBJIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBjYWxsIHN0YWNrIHRvIHNlZSAqd2hhdCogaW5pdGlhdGVzIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBmdW5jdGlvbi4gSXMgaXQgYWx3YXlzIGZyb20gYF9fZXh0NF9hZGRfZW50cnlgLCBvciBhcmUgdGhlcmUgb3RoZXIgZW50cnkgcG9pbnRzLCBsaWtlIHdoZW4gY29udmVydGluZyBhIHJlZ3VsYXIgZmlsZSAqdG8qIGFuIGlubGluZSBmaWxlIGxhdGVyPyBJIGFsc28gbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBlcnJvciBjb25kaXRpb25zIGhlcmUgYW5kIGhvdyBmYWlsdXJlcyBpbiBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgaW5mbHVlbmNlIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAg4oCTIGhvdyBhcmUgdGhleSBjb29yZGluYXRlZD8gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpbXByb3BlciBkYXRhIHBsYWNlbWVudCBjb3VsZCBlYXNpbHkgY29ycnVwdCB0aGUgZmlsZSBzdHJ1Y3R1cmUuIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgdGhlIGNvbnRyb2wgZmxvdyB0byBmdWxseSBncmFzcCB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcbi0tXG5mcy9leHQ0L2NyeXB0by5jLTE1Mi1cbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlx0cmVzID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcbmZzL2V4dDQvY3J5cHRvLmMtMTU0LVx0aWYgKHJlcylcbi0tXG5mcy9leHQ0L2V4dDQuaD0zNzg0PWV4dGVybiBpbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpO1xuZnMvZXh0NC9leHQ0LmgtMzc4NS1cbmZzL2V4dDQvZXh0NC5oOjM3ODY6ZXh0ZXJuIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSk7XG5mcy9leHQ0L2V4dDQuaC0zNzg3LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQ4NTQ9bG9uZyBleHQ0X2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cdGlub2RlX2xvY2soaW5vZGUpO1xuZnMvZXh0NC9leHRlbnRzLmM6NDg4NDpcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L2V4dGVudHMuYy00ODg1LVx0aWYgKHJldClcbi0tXG5mcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbmZzL2V4dDQvaW5saW5lLmMtNTc0LVx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy03MjgtXHRcdFx0LyogUmV0cnkgaW5zaWRlICovXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcdFx0XHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTczMC1cdFx0fVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Nzg0PWludCBleHQ0X3RyeV90b193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cdGlmIChwb3MgJiM0MzsgbGVuIFx1MDAzZSBleHQ0X2dldF9tYXhfaW5saW5lX3NpemUoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMzYtXG5mcy9leHQ0L2lubGluZS5jOjExMzc6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5mcy9leHQ0L2lubGluZS5jLTExMzgtXHRcdFx0XHRcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMjM2PWludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTEyODgtXHQgKi9cbmZzL2V4dDQvaW5saW5lLmM6MTI4OTpcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBkaXIsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xMjkwLVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0yMDAyLVxuZnMvZXh0NC9pbmxpbmUuYzoyMDAzOmludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2V4dDQvaW5saW5lLmMtMjAwNC17XG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0yMDQwLVx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcbmZzL2V4dDQvaW5saW5lLmM6MjA0MTpcdFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0yMDQyLVx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFx1MDAyNm5vX2V4cGFuZCk7XG4tLVxuZnMvZXh0NC9pbm9kZS5jPTU5MzQ9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuLS1cbmZzL2V4dDQvaW5vZGUuYy02MDMxLVx0XHQgICAgYXR0ci1cdTAwM2VpYV9zaXplIFx1MDAzZSBFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUpIHtcbmZzL2V4dDQvaW5vZGUuYzo2MDMyOlx0XHRcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcbmZzL2V4dDQvaW5vZGUuYy02MDMzLVx0XHRcdGlmIChlcnJvcilcbi0tXG5mcy9leHQ0L2lub2RlLmM9Njc4Nz12bV9mYXVsdF90IGV4dDRfcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbmZzL2V4dDQvaW5vZGUuYy02ODA4LVxuZnMvZXh0NC9pbm9kZS5jOjY4MDk6XHRlcnIgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xuZnMvZXh0NC9pbm9kZS5jLTY4MTAtXHRpZiAoZXJyKVxuLS1cbmZzL2V4dDQvdmVyaXR5LmM9MTAyPXN0YXRpYyBpbnQgZXh0NF9iZWdpbl9lbmFibGVfdmVyaXR5KHN0cnVjdCBmaWxlICpmaWxwKVxuLS1cbmZzL2V4dDQvdmVyaXR5LmMtMTI4LVxuZnMvZXh0NC92ZXJpdHkuYzoxMjk6XHRlcnIgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xuZnMvZXh0NC92ZXJpdHkuYy0xMzAtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc0OTIKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAyMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEqKgoKT2theSwgc28gbG9va2luZyBhdCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgaXQgc2VlbXMgbGlrZSB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGFuZCB0aGVyZWZvcmUgd29ydGggY29uc2lkZXJpbmcgZm9yIGZ1enppbmcuIEl0JiMzOTtzIGNhbGxlZCBmcm9tIGEgZmV3IGRpZmZlcmVudCBwbGFjZXMsIHdoaWNoIGlzIGdvb2QgZm9yIGNvdmVyYWdlOiBgZXh0NF9zZXRfY29udGV4dGAgKHdoaWNoIGlzIGNyeXB0by1yZWxhdGVkLCBpbnRlcmVzdGluZyksIGBleHQ0X2ZhbGxvY2F0ZWAsIGBleHQ0X3NldGF0dHJgIChzcGVjaWZpY2FsbHkgZm9yIHRydW5jYXRpbmcgZmlsZXMpLCBgZXh0NF9wYWdlX21rd3JpdGVgLCBhbmQgYGV4dDRfYmVnaW5fZW5hYmxlX3Zlcml0eWAuIFRoYXQmIzM5O3MgYSBkZWNlbnQgc3ByZWFkLgoKVGhlIG9idmlvdXMgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGFyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBpdHNlbGYsIG9mIGNvdXJzZSwgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSSYjMzk7bSBnb2luZyB0byBub3RlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbmQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBhcyB3ZWxsLCBldmVuIHRob3VnaCB0aGV5JiMzOTtyZSBzdGF0aWMg4oCTIHNvbWV0aW1lcyBzdGF0aWMgZnVuY3Rpb25zIHN0aWxsIGV4cG9zZSBpbnRlcmVzdGluZyB2dWxuZXJhYmlsaXRpZXMgaWYgdGhlIGNvcmUgZnVuY3Rpb24gaXMgdHJpZ2dlcmVkLiBUaG91Z2gsIGxpc3RpbmcgdGhlIGNhbGxlcnMgdG8gdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGlzIHByb2JhYmx5IGEgbW9yZSBlZmZlY3RpdmUgYXBwcm9hY2guCgpTbywgbGV0JiMzOTtzIG1ha2UgYSBub3RlIHRvIGRlZmluaXRlbHkgdGFyZ2V0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgSSBuZWVkIHRvIGtlZXAgaW4gbWluZD8gQWgsIHJpZ2h0LCBFWFQ0X0ZTIGlzIG9idmlvdXNseSByZXF1aXJlZC4gR29vZCB0byBrbm93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVhUNF9GUyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmZzL2V4dDQvS2NvbmZpZzoyOmNvbmZpZyBFWFQ0X0ZTXG5mcy9leHQ0L0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O1RoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnPTM1PWNvbmZpZyBFWFQ0X1VTRV9GT1JfRVhUMlxuLS1cbmZzL2V4dDQvS2NvbmZpZy00NS1cbmZzL2V4dDQvS2NvbmZpZzo0Njpjb25maWcgRVhUNF9GU19QT1NJWF9BQ0xcbmZzL2V4dDQvS2NvbmZpZy00Ny1cdGJvb2wgXCYjMzQ7RXh0NCBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0c1wmIzM0O1xuLS1cbmZzL2V4dDQvS2NvbmZpZy01NS1cbmZzL2V4dDQvS2NvbmZpZzo1Njpjb25maWcgRVhUNF9GU19TRUNVUklUWVxuZnMvZXh0NC9LY29uZmlnLTU3LVx0Ym9vbCBcJiMzNDtFeHQ0IFNlY3VyaXR5IExhYmVsc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MjM5CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjcyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBFWFQ0IElubGluZSBEYXRhIENvbnZlcnNpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoZSBgRVhUNF9GU2AgY29uZmlndXJhdGlvbiBhbmQgZGl2aW5nIGludG8gdGhlIGlubGluZSBkYXRhIGNvbnZlcnNpb24gcm91dGluZXMuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSB3YW50IHRvIGNoZWNrIHRoZSB2aXNpYmlsaXR5IG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLiBBaCwgeWVzLCBpdCYjMzk7cyBleHBvcnRlZCBhbmQgZGVjbGFyZWQgaW4gYGZzL2V4dDQvZXh0NC5oYCBhcyBgZXh0ZXJuIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSk7YC4gRXhjZWxsZW50LiBBbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGlzIGFsc28gcmlnaHQgdGhlcmUgaW4gdGhlIGhlYWRlci4KCk5vdywganVzdCB0byBiZSBzdXJlLCBsZXQmIzM5O3MgdGFrZSBhIHF1aWNrIGxvb2sgYXQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gWWVwLCB0aGF0JiMzOTtzIHN0YXRpYywgYXMgaXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBSaWdodCwgc28gdGhhdCBtZWFucyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGFyZSBwcm9iYWJseSB0aGUga2V5IGZ1bmN0aW9ucyB0byBmb2N1cyBvbi4KCldhaXQgYSBzZWNvbmTigKYgaXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGFsc28gYSBjYWxsZXIgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgPyBObywgdGhhdCBkb2VzbiYjMzk7dCBzZWVtIHRvIGJlIHRoZSBjYXNlLiBBaCwgSSBzZWUhIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgYnkgYm90aCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLiBPa2F5LCB0aGF0IGNsYXJpZmllcyB0aGUgY2FsbCBncmFwaC4gTGV0IG1lIG5vdyBzZWUgd2hhdCYjMzk7cyBnb2luZyBvbiB3aXRoIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YC4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmM9NTQ2PWludCBleHQ0X3JlYWRwYWdlX2lubGluZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNTcyLVxuZnMvZXh0NC9pbmxpbmUuYzo1NzM6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuZnMvZXh0NC9pbmxpbmUuYy01NzQtXHRcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz02OTc9aW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTcyOC1cdFx0XHQvKiBSZXRyeSBpbnNpZGUgKi9cbmZzL2V4dDQvaW5saW5lLmM6NzI5Olx0XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzMwLVx0XHR9XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz03ODQ9aW50IGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNzg5LVx0aWYgKHBvcyAmIzQzOyBsZW4gXHUwMDNlIGV4dDRfZ2V0X21heF9pbmxpbmVfc2l6ZShpbm9kZSkpXG5mcy9leHQ0L2lubGluZS5jOjc5MDpcdFx0cmV0dXJuIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQobWFwcGluZywgaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy03OTEtXHRyZXR1cm4gZXh0NF9nZW5lcmljX3dyaXRlX2lubGluZV9kYXRhKG1hcHBpbmcsIGlub2RlLCBwb3MsIGxlbixcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTIzNgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqRGl2aW5nIGludG8gdGhlIGV4dDQgSW5saW5lIERhdGEgQ29udmVyc2lvbioqCgpSaWdodCwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgZnVuY3Rpb24sIGFuZCBpdCBzZWVtcyBsaWtlIGEgY3J1Y2lhbCBwaWVjZSBpbiBob3cgZXh0NCBoYW5kbGVzIGZpbGUgZGF0YS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7V2FpdCBhIG1pbnV0ZSwgSSB0aG91Z2h0IEkgcmVtZW1iZXJlZCBpdCBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBkaXJlY3RseSwgYnV0IHRoYXQgZG9lc24mIzM5O3Qgc2VlbSB0byBiZSB0aGUgY2FzZS4mIzM0OyBQZXJoYXBzIEkgbWlzcmVhZCBzb21ldGhpbmcgb3IgdGhlcmUmIzM5O3Mgc29tZSBpbmRpcmVjdCBjYWxsIHBhdGggSSYjMzk7bSBub3QgaW1tZWRpYXRlbHkgY29uc2lkZXJpbmcuCgpUaGVyZWZvcmUsIGl0IGxvb2tzIGxpa2UgaXQmIzM5O3MgdGltZSB0byB0aG9yb3VnaGx5IGV4YW1pbmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBhbmQgc2VlIGV4YWN0bHkgd2hhdCBpdCYjMzk7cyBkb2luZy4gR290dGEgcmVmcmVzaCBteSBtZW1vcnkgb2YgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhpcyBjb252ZXJzaW9uIGlzIGtleSBmb3IgZGVhbGluZyB3aXRoIHNtYWxsZXIgZmlsZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU3MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTczOlx0c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuIDU3NDpcdFx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDU3NTpcdHtcbiA1NzY6XHRcdGludCByZXQsIG5lZWRlZF9ibG9ja3MsIG5vX2V4cGFuZDtcbiA1Nzc6XHRcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xuIDU3ODpcdFx0aW50IHJldHJpZXMgPSAwLCBzZW1faGVsZCA9IDA7XG4gNTc5Olx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiA1ODA6XHRcdHVuc2lnbmVkIGZyb20sIHRvO1xuIDU4MTpcdFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xuIDU4MjpcdFxuIDU4MzpcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcbiA1ODQ6XHRcdFx0LypcbiA1ODU6XHRcdFx0ICogY2xlYXIgdGhlIGZsYWcgc28gdGhhdCBubyBuZXcgd3JpdGVcbiA1ODY6XHRcdFx0ICogd2lsbCB0cmFwIGhlcmUgYWdhaW4uXG4gNTg3Olx0XHRcdCAqL1xuIDU4ODpcdFx0XHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4gNTg5Olx0XHRcdHJldHVybiAwO1xuIDU5MDpcdFx0fVxuIDU5MTpcdFxuIDU5MjpcdFx0bmVlZGVkX2Jsb2NrcyA9IGV4dDRfY2h1bmtfdHJhbnNfZXh0ZW50KGlub2RlLCAxKTtcbiA1OTM6XHRcbiA1OTQ6XHRcdHJldCA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aWxvYyk7XG4gNTk1Olx0XHRpZiAocmV0KVxuIDU5NjpcdFx0XHRyZXR1cm4gcmV0O1xuIDU5NzpcdFxuIDU5ODpcdHJldHJ5OlxuIDU5OTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX1dSSVRFX1BBR0UsIG5lZWRlZF9ibG9ja3MpO1xuIDYwMDpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNjAxOlx0XHRcdHJldCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA2MDI6XHRcdFx0aGFuZGxlID0gTlVMTDtcbiA2MDM6XHRcdFx0Z290byBvdXQ7XG4gNjA0Olx0XHR9XG4gNjA1Olx0XG4gNjA2Olx0XHQvKiBXZSBjYW5ub3QgcmVjdXJzZSBpbnRvIHRoZSBmaWxlc3lzdGVtIGFzIHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5XG4gNjA3Olx0XHQgKiBzdGFydGVkICovXG4gNjA4Olx0XHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgMCwgRkdQX1dSSVRFQkVHSU4gfCBGR1BfTk9GUyxcbiA2MDk6XHRcdFx0XHRtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTtcbiA2MTA6XHRcdGlmIChJU19FUlIoZm9saW8pKSB7XG4gNjExOlx0XHRcdHJldCA9IFBUUl9FUlIoZm9saW8pO1xuIDYxMjpcdFx0XHRnb3RvIG91dF9ub2ZvbGlvO1xuIDYxMzpcdFx0fVxuIDYxNDpcdFxuIDYxNTpcdFx0ZXh0NF93cml0ZV9sb2NrX3hhdHRyKGlub2RlLCBcdTAwMjZub19leHBhbmQpO1xuIDYxNjpcdFx0c2VtX2hlbGQgPSAxO1xuIDYxNzpcdFx0LyogSWYgc29tZSBvbmUgaGFzIGFscmVhZHkgZG9uZSB0aGlzIGZvciB1cywganVzdCBleGl0LiAqL1xuIDYxODpcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcbiA2MTk6XHRcdFx0cmV0ID0gMDtcbiA2MjA6XHRcdFx0Z290byBvdXQ7XG4gNjIxOlx0XHR9XG4gNjIyOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMjU3CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCoqCgpPa2F5LCBob2xkIG9uIGEgbWludXRlLiBJIHdhcyBwcmV0dHkgc3VyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgd2FzIGp1c3QgYSB3cmFwcGVyIGZvciBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEJ1dCwgcmVyZWFkaW5nIHRoZSBjb2RlLCBpdCBzZWVtcy4uLiB3YWl0LCBpcyB0aGF0IHJpZ2h0PyBJdCAqZG9lc24mIzM5O3QqIGFjdHVhbGx5IGNhbGwgdGhlIGBub2xvY2tgIHZlcnNpb24gZGlyZWN0bHk/IFRoYXQgc2VlbXMgb2RkLCBnaXZlbiB0aGUgdXN1YWwgbG9ja2luZyBzdHJhdGVnaWVzIGluIHRoZSBleHQ0IGNvZGUuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoZSBjYWxsaW5nIGNvbnRleHQgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgLCBhbmQgdmVyaWZ5IHRoYXQgdGhlIG5lY2Vzc2FyeSBsb2NraW5nIGlzIGFjdHVhbGx5ICpiZWluZyogaGFuZGxlZCBleHRlcm5hbGx5LiBUaGlzIGNvdWxkIGJlIGEgY3JpdGljYWwgZmxhdyBpZiBpdCYjMzk7cyBub3QgbG9ja2VkIHByb3Blcmx5LCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGRhdGEgY29ycnVwdGlvbiwgb3IgYXQgbGVhc3Qgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB0cmFjZSB0aGlzIGNhbGwsIHNlZSB3aGVyZSBpdCYjMzk7cyBiZWluZyB1c2VkLCBhbmQgdW5kZXJzdGFuZCBob3cgdGhlIGxvY2sgaXMgYmVpbmcgYWNxdWlyZWQsIGlmIGF0IGFsbC4gSXQgbWlnaHQgdXNlIGFub3RoZXIsIGludGVybmFsIGxvY2tpbmcgbWVjaGFuaXNtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MjMsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYyMzpcdFx0ZnJvbSA9IDA7XG4gNjI0Olx0XHR0byA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiA2MjU6XHRcdGlmICghZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbykpIHtcbiA2MjY6XHRcdFx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9mb2xpbyhpbm9kZSwgZm9saW8pO1xuIDYyNzpcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuIDYyODpcdFx0XHRcdGdvdG8gb3V0O1xuIDYyOTpcdFx0fVxuIDYzMDpcdFxuIDYzMTpcdFx0ZXh0NF9mY190cmFja19pbm9kZShoYW5kbGUsIGlub2RlKTtcbiA2MzI6XHRcdHJldCA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4gNjMzOlx0XHRpZiAocmV0KVxuIDYzNDpcdFx0XHRnb3RvIG91dDtcbiA2MzU6XHRcbiA2MzY6XHRcdGlmIChleHQ0X3Nob3VsZF9kaW9yZWFkX25vbG9jayhpbm9kZSkpIHtcbiA2Mzc6XHRcdFx0cmV0ID0gZXh0NF9ibG9ja193cml0ZV9iZWdpbihoYW5kbGUsIGZvbGlvLCBmcm9tLCB0byxcbiA2Mzg6XHRcdFx0XHRcdFx0ICAgICBleHQ0X2dldF9ibG9ja191bndyaXR0ZW4pO1xuIDYzOTpcdFx0fSBlbHNlXG4gNjQwOlx0XHRcdHJldCA9IGV4dDRfYmxvY2tfd3JpdGVfYmVnaW4oaGFuZGxlLCBmb2xpbywgZnJvbSwgdG8sXG4gNjQxOlx0XHRcdFx0XHRcdCAgICAgZXh0NF9nZXRfYmxvY2spO1xuIDY0MjpcdFx0Y2xlYXJfYnVmZmVyX25ldyhmb2xpb19idWZmZXJzKGZvbGlvKSk7XG4gNjQzOlx0XG4gNjQ0Olx0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkge1xuIDY0NTpcdFx0XHRyZXQgPSBleHQ0X3dhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgaW5vZGUsXG4gNjQ2Olx0XHRcdFx0XHRcdCAgICAgZm9saW9fYnVmZmVycyhmb2xpbyksIGZyb20sIHRvLFxuIDY0NzpcdFx0XHRcdFx0XHQgICAgIE5VTEwsIGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7XG4gNjQ4Olx0XHR9XG4gNjQ5Olx0XG4gNjUwOlx0XHRpZiAocmV0KSB7XG4gNjUxOlx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gNjUyOlx0XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gNjUzOlx0XHRcdGZvbGlvID0gTlVMTDtcbiA2NTQ6XHRcdFx0ZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpO1xuIDY1NTpcdFx0XHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXHUwMDI2bm9fZXhwYW5kKTtcbiA2NTY6XHRcdFx0c2VtX2hlbGQgPSAwO1xuIDY1NzpcdFx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDY1ODpcdFx0XHRoYW5kbGUgPSBOVUxMO1xuIDY1OTpcdFx0XHRleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7XG4gNjYwOlx0XHRcdC8qXG4gNjYxOlx0XHRcdCAqIElmIHRydW5jYXRlIGZhaWxlZCBlYXJseSB0aGUgaW5vZGUgbWlnaHRcbiA2NjI6XHRcdFx0ICogc3RpbGwgYmUgb24gdGhlIG9ycGhhbiBsaXN0OyB3ZSBuZWVkIHRvXG4gNjYzOlx0XHRcdCAqIG1ha2Ugc3VyZSB0aGUgaW5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZVxuIDY2NDpcdFx0XHQgKiBvcnBoYW4gbGlzdCBpbiB0aGF0IGNhc2UuXG4gNjY1Olx0XHRcdCAqL1xuIDY2NjpcdFx0XHRpZiAoaW5vZGUtXHUwMDNlaV9ubGluaylcbiA2Njc6XHRcdFx0XHRleHQ0X29ycGhhbl9kZWwoTlVMTCwgaW5vZGUpO1xuIDY2ODpcdFx0fVxuIDY2OTpcdFxuIDY3MDpcdFx0aWYgKHJldCA9PSAtRU5PU1BDIFx1MDAyNlx1MDAyNiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS1cdTAwM2VpX3NiLCBcdTAwMjZyZXRyaWVzKSlcbiA2NzE6XHRcdFx0Z290byByZXRyeTtcbiA2NzI6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEzMzkKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA5MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBxdWljayBydW5kb3duIG9mIHdoYXQgSSYjMzk7bSBsb29raW5nIGF0LCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZToKCioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgSW50ZXJhY3Rpb25zIEFmdGVyIGEgUmVjZW50IFBhdGNoKioKCkFscmlnaHQsIHNvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBpcyBjYWxsaW5nIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYC4gSW50ZXJlc3RpbmcuIEl0JiMzOTtzIGEga2V5IGZ1bmN0aW9uIGluIHRoaXMgYXJlYSwgYW5kIEkgc2VlIHRoYXQgKnRoYXQqIGZ1bmN0aW9uLCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIHdhc24mIzM5O3QgdG91Y2hlZCBpbiB0aGlzIHNwZWNpZmljIHBhdGNoLiBUaGF0JiMzOTtzIGEgZ29vZCBmaXJzdCBjaGVjaywgbWVhbnMgdGhlcmUmIzM5O3MgbGVzcyBpbW1lZGlhdGUgcmlzayB0aGVyZS4KCkhvd2V2ZXIsIHRoZSBwYXRjaCAqZGlkKiBtb2RpZnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGFuZCBhZGRlZCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBTbywgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBnaXZlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbm90aGVyLCBjbG9zZXIgbG9vay4gTGV0IG1lIGRvdWJsZS1jaGVjayBob3cgKml0KiBoYW5kbGVzIHRoaW5ncyBub3csIGdpdmVuIHRoZXNlIGFkZGl0aW9ucyBhbmQgY2hhbmdlcy4gSnVzdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgaW50ZXJhY3Rpb25zIGFyZSBzb3VuZCwgZXNwZWNpYWxseSBzaW5jZSB3ZSYjMzk7dmUgZ290IGEgbmV3IHBpZWNlIHRvIHRoZSBwdXp6bGUgd2l0aCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTM3LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExMzc6XHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbjExMzg6XHRcdFx0XHRcdFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcbjExMzk6XHRcdFx0XHRcdFx0ICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYylcbjExNDA6XHR7XG4xMTQxOlx0XHRpbnQgZXJyb3I7XG4xMTQyOlx0XHR2b2lkICpidWYgPSBOVUxMO1xuMTE0MzpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDtcbjExNDQ6XHRcdGludCBpbmxpbmVfc2l6ZTtcbjExNDU6XHRcdGV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7XG4xMTQ2Olx0XHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XG4xMTQ3Olx0XG4xMTQ4Olx0XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbjExNDk6XHRcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbjExNTA6XHRcdGlmICghYnVmKSB7XG4xMTUxOlx0XHRcdGVycm9yID0gLUVOT01FTTtcbjExNTI6XHRcdFx0Z290byBvdXQ7XG4xMTUzOlx0XHR9XG4xMTU0Olx0XG4xMTU1Olx0XHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XG4xMTU2Olx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTU3Olx0XHRcdGdvdG8gb3V0O1xuMTE1ODpcdFxuMTE1OTpcdFx0LypcbjExNjA6XHRcdCAqIE1ha2Ugc3VyZSB0aGUgaW5saW5lIGRpcmVjdG9yeSBlbnRyaWVzIHBhc3MgY2hlY2tzIGJlZm9yZSB3ZSB0cnkgdG9cbjExNjE6XHRcdCAqIGNvbnZlcnQgdGhlbSwgc28gdGhhdCB3ZSBhdm9pZCB0b3VjaGluZyBzdHVmZiB0aGF0IG5lZWRzIGZzY2suXG4xMTYyOlx0XHQgKi9cbjExNjM6XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbjExNjQ6XHRcdFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cdTAwM2ViaCxcbjExNjU6XHRcdFx0XHRcdFx0YnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTE2NjpcdFx0XHRcdFx0XHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbjExNjc6XHRcdFx0aWYgKGVycm9yKVxuMTE2ODpcdFx0XHRcdGdvdG8gb3V0O1xuMTE2OTpcdFx0fVxuMTE3MDpcdFxuMTE3MTpcdFx0bWVtc2V0KFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcbjExNzI6XHRcdGFyLmlub2RlID0gaW5vZGU7XG4xMTczOlx0XHRhci5sb2dpY2FsID0gMDtcbjExNzQ6XHRcdGFyLmxlbiA9IDE7XG4xMTc1Olx0XHRpZiAoU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpKVxuMTE3NjpcdFx0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuMTE3NzpcdFx0ZWxzZVxuMTE3ODpcdFx0XHRhci5mbGFncyA9IDA7XG4xMTc5Olx0XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4xMTgwOlx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTgxOlx0XHRcdGdvdG8gb3V0O1xuMTE4MjpcdFxuMTE4MzpcdFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4xMTg0Olx0XHRpZiAoIWRhdGFfYmgpIHtcbjExODU6XHRcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuMTE4NjpcdFx0XHRnb3RvIG91dF9iaDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI0NjMKCQkJCQkJCW91dHB1dDogMjA3CgkJCQkJCQl0aG91Z2h0czogNTgxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBFeHQ0IElubGluZSBEYXRhIENvbnZlcnNpb24gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSB3aGF0IEkmIzM5O20gc2VlaW5nLCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIGNydWNpYWwgZnVuY3Rpb24gaGVyZS4gVGhpcyBpcyB0aGUgb25lIHRoYXQgYWN0dWFsbHkgYWxsb2NhdGVzIGEgbmV3IGJsb2NrIGFuZCBjYWxscyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBJdCYjMzk7cyBjYWxsZWQgYnkgdHdvIHByaW1hcnkgZnVuY3Rpb25zOiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgLiBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGlzIGRpc3RpbmN0IGFuZCBoYW5kbGVzIGNvbnZlcnNpb25zIGZvciAqcmVndWxhciogZmlsZXMgZHVyaW5nIHdyaXRlcy4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgc3BlY2lmaWNhbGx5IHVzZWQgZm9yIGRpcmVjdG9yaWVzICh0aHJvdWdoIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCkgYW5kIGZvciByZWd1bGFyIGZpbGVzIHZpYSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgd2hpY2ggaXRzZWxmIGlzIGludm9rZWQgYnkgb3BlcmF0aW9ucyBsaWtlIGBmYWxsb2NhdGVgLCBgc2V0YXR0cmAsIGNyeXB0byBhbmQgdmVyaXR5LgoKU28sIG15IHByaW1hcnkgZm9jdXMgZm9yIGZ1enppbmcgbmVlZHMgdG8gYmUgb246CgoqICAgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAKKiAgIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YAoKSSYjMzk7dmUgYWxyZWFkeSBkb3VibGUtY2hlY2tlZCBmb3IgYW55IG90aGVyIGNhbGxlcnMgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCBhbmQgdGhlIGdyZXAgcmVzdWx0cyBjb25maXJtIHRoYXQgSSYjMzk7dmUgZ290IHRoZSBjb3JyZWN0IGVudHJ5IHBvaW50cy4gSnVzdCB0aG9zZSB0d28uCgpSZWdhcmRpbmcgY29uZmlndXJhdGlvbnMsIGl0JiMzOTtzIGp1c3QgYEVYVDRfRlNgLCBub3RoaW5nIGVsc2UgdG8gd29ycnkgYWJvdXQgb24gdGhhdCBmcm9udC4KCkkmIzM5O3ZlIHJldmlld2VkIHRoZSBwYXRjaCBjbG9zZWx5LiBJdCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIHRoZSBuZXcgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlIGlzIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgd2hlcmUgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgaXMgbm93IHVzZWQgaW5zdGVhZCBvZiBgZXh0NF9tYXBfYmxvY2tzYC4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgZGVmaW5pdGVseSB3b3J0aCBhIGZ1enppbmcgY2FtcGFpZ24gdG8gaWRlbnRpZnkgYW55IGx1cmtpbmcgaXNzdWVzLiBJdCBoYXMgY2hhbmdlZCB0aGUgY29yZSBvZiBleHQ0IGlubGluZSBkYXRhIGhhbmRsaW5nLgoKSW4gZXNzZW5jZSwgdGhlIHBhdGNoIGFsdGVycyB0aGUgY29yZSBtZWNoYW5pc20gb2YgY29udmVydGluZyBpbmxpbmUgZGF0YSB0byByZWd1bGFyIGJsb2Nrcy4gSXQmIzM5O3MgdG91Y2hpbmcgdGhlIGhlYXJ0IG9mIGV4dDQuIFRoZSBjaGFuZ2VzIGluIHRoZSBpbnRlcm5hbHMsIGxpa2UgcmVwbGFjaW5nIGBleHQ0X21hcF9ibG9ja3NgIHdpdGggYGV4dDRfbWJfbmV3X2Jsb2Nrc2AsIGFuZCB0aGUgaW50cm9kdWN0aW9uIG9mIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGNvdXBsZWQgd2l0aCB0aGUgY2FsbGVycyBvZiB0aGUgbW9kaWZpZWQgZnVuY3Rpb24sIG1ha2UgdGhpcyBhIGhpZ2gtcHJpb3JpdHkgZnV6emluZyB0YXJnZXQuCgpUaW1lIHRvIGxvZyB0aGlzLiBMZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhJiMzNDssCiAgICAmIzM0O2V4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHdheSBleHQ0IGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gb2YgaW5saW5lIGRhdGEgdG8gcmVndWxhciBibG9ja3MuIEl0IHJlcGxhY2VzIGBleHQ0X21hcF9ibG9ja3NgIHdpdGggYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgYW5kIGludHJvZHVjZXMgYSBuZXcgaGVscGVyIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgdG8gZGlyZWN0bHkgc2V0IHRoZSBibG9jayB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGlubGluZSBkYXRhIGZpcnN0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXh0NCBsb2dpYy4gVGhlIG1vZGlmaWVkIGZ1bmN0aW9uIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgYnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCwgd2hpY2ggYXJlIHJlYWNoYWJsZSB2aWEgdmFyaW91cyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBkaXJlY3RvcnkgZW50cnkgYWRkaXRpb25zLiBUaGVyZWZvcmUsIGl0IGlzIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjNtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cblxuQWxsIHN0cnVjdHVyZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGUgcGF0Y2ggKGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLCBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG9yIGV4cGxpY2l0bHkgemVyb2VkICh2aWEgYG1lbXNldGAgb3IgcGFydGlhbCBpbml0aWFsaXphdGlvbiB3aGljaCB6ZXJvZXMgdGhlIHJlc3QpLiBUaGUgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmMKaW5kZXggODA0NWU0ZmYyNzBjNy4uMmE5Mjk5ZWE0MTQ2YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbmxpbmUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2lubGluZS5jCkBAIC0xNCw2ICYjNDM7MTQsNyBAQAogI2luY2x1ZGUgJiMzNDtleHQ0LmgmIzM0OwogI2luY2x1ZGUgJiMzNDt4YXR0ci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7dHJ1bmNhdGUuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtleHQ0X2V4dGVudHMuaCYjMzQ7CiAKICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQQkmIzM0O2RhdGEmIzM0OwogI2RlZmluZSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFCSgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSkKQEAgLTEwNzAsMjEgJiM0MzsxMDcxLDY3IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLAotCQkJCSAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpCiYjNDM7c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAomIzQzOwkJCQkgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiAKLQlyZXQgPSBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbmxpbmVfc2l6ZSk7Ci0JaWYgKHJldCkgewotCQlleHQ0X21zZyhpbm9kZS0mZ3Q7aV9zYiwgS0VSTl9FTUVSRywKLQkJCSYjMzQ7ZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpJiMzNDssCi0JCQlpbm9kZS0mZ3Q7aV9pbm8sIHJldCk7Ci0JCXJldHVybjsKJiM0MzsJZG93bl93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCAmYW1wO2ksICZhbXA7aXMpOwomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgJmFtcDtpLCAmYW1wO2lzKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW1lbXNldCgodm9pZCAqKWV4dDRfcmF3X2lub2RlKCZhbXA7aXMuaWxvYyktJmd0O2lfYmxvY2ssCiYjNDM7CQkwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJbWVtc2V0KGVpLSZndDtpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwomIzQzOwlpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLSZndDtpX3NiKSAmYW1wOyZhbXA7CiYjNDM7CQkoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtJmd0O2lfbW9kZSkpKSB7CiYjNDM7CQlleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpOwomIzQzOwkJZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpOwomIzQzOwkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTsKJiM0MzsJCXN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDsKJiM0MzsKJiM0MzsJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CiYjNDM7CQluZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJmFtcDtuZXdleCwgMCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTsKJiM0MzsJZ2V0X2JoKGlzLmlsb2MuYmgpOwomIzQzOwllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX29mZiA9IDA7CiYjNDM7CUVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX3NpemUgPSAwOwomIzQzOwlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7b3V0OgomIzQzOwlicmVsc2UoaXMuaWxvYy5iaCk7CiYjNDM7CWlmIChlcnJvciA9PSAtRU5PREFUQSkKJiM0MzsJCWVycm9yID0gMDsKJiM0MzsJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCkBAIC0xMDk0LDggJiM0MzsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAogCWlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpOwogCWJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTsKQEAgLTExMjAsMjUgJiM0MzsxMTY4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0KLQltYXAubV9sYmxrID0gMDsKLQltYXAubV9sZW4gPSAxOwotCW1hcC5tX2ZsYWdzID0gMDsKLQllcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmYW1wO21hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7CiYjNDM7CW1lbXNldCgmYW1wO2FyLCAwLCBzaXplb2YoYXIpKTsKJiM0MzsJYXIuaW5vZGUgPSBpbm9kZTsKJiM0MzsJYXIubG9naWNhbCA9IDA7CiYjNDM7CWFyLmxlbiA9IDE7CiYjNDM7CWlmIChTX0lTUkVHKGlub2RlLSZndDtpX21vZGUpKQomIzQzOwkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKJiM0MzsJZWxzZQomIzQzOwkJYXIuZmxhZ3MgPSAwOwomIzQzOwluZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhbXA7YXIsICZhbXA7ZXJyb3IpOwogCWlmIChlcnJvciAmbHQ7IDApCi0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JaWYgKCEobWFwLm1fZmxhZ3MgJmFtcDsgRVhUNF9NQVBfTUFQUEVEKSkgewotCQllcnJvciA9IC1FSU87Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7Ci0JfQomIzQzOwkJZ290byBvdXQ7CiAKLQlkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLSZndDtpX3NiLCBtYXAubV9wYmxrKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzExOTIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNzEsMTIgJiM0MzsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQogCi1vdXRfcmVzdG9yZToKIAlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKLQotb3V0OgomIzQzOwkJZ290byBvdXRfYmg7CiYjNDM7CWVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgbmV3YmxvY2ssIGFyLmxlbik7CiYjNDM7b3V0X2JoOgomIzQzOwlpZiAoZXJyb3IpCiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhci5sZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAlicmVsc2UoZGF0YV9iaCk7CiYjNDM7b3V0OgogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2MwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDkyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBGdXp6aW5nIFNlc3Npb24gSnVzdGlmaWNhdGlvbjogZXh0NC9pbmxpbmUuYyBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7dmUgZ290IGEgcGF0Y2ggaW4gYGZzL2V4dDQvaW5saW5lLmNgLCBhbmQgdGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQgd2FycmFudHMgZmlyaW5nIHVwIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gVGhlIHBhdGNoIGZvY3VzZXMgb24gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgd2l0aCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBSaWdodCwgbGV0JiMzOTtzIHNlZS4uLgoKU28sIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgemVyb3Mgb3V0IHRoZSBpbmxpbmUgZGF0YSBibG9jayB1c2luZyBgbWVtc2V0YCwgYm90aCBpbiB0aGUgcmF3IGlub2RlIGFuZCB0aGUgYGVpLSZndDtpX2RhdGFgIHN0cnVjdHVyZXMsIHdoaWNoIGlzIGdvb2QuIFRoZW4sIGl0IHNldHMgdXAgZXh0ZW50cyBvciBkaXJlY3QgYmxvY2tzLCBkZXBlbmRpbmcgb24gdGhlIGZpbGUgc3lzdGVtIGZlYXR1cmVzIGFuZCBpbm9kZSB0eXBlLCB3aGljaCBpcyBub3JtYWwuCgpOb3csIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSXQgdXNlcyBgZXh0NF9tYl9uZXdfYmxvY2tzYCB0byBhbGxvY2F0ZSBuZXcgYmxvY2tzLCB3aGljaCBpcyBhIGtleSBjaGFuZ2UuIFdlIG1lbXNldCB0aGUgYGFyYCBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGltcG9ydGFudCwgYW5kIGFsbG9jYXRlIGEgYnVmZmVyIGhlYWQgYGRhdGFfYmhgLiBUaGVuIHplcm8gdGhlIGJ1ZmZlciBoZWFkJiMzOTtzIGRhdGEgYGRhdGFfYmgtJmd0O2JfZGF0YWAgZXhwbGljaXRseSwgYWdhaW4sIGdvb2QuICBUaGUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gdGhlIGJsb2NrLCBhbmQgZmluYWxseSwgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBpcyBjYWxsZWQuCgpUaGUgY3JpdGljYWwgcXVlc3Rpb24gaGVyZSBpcyBhcm91bmQgdW5pbml0aWFsaXplZCBtZW1vcnkuIEluaXRpYWxpemluZyBgYXJgIHdpdGggYG1lbXNldGAsIHplcm9pbmcgYGRhdGFfYmgtJmd0O2JfZGF0YWAgYW5kIHRoZSBgaV9ibG9ja2AgYW5kIGBpX2RhdGFgIHdpdGggYG1lbXNldGAgc2VlbXMgcHJldHR5IHNvbGlkLiBUaGVuIHRoZXJlJiMzOTtzIHRoZSBgbmV3ZXhgIHN0cnVjdCwgd2hpY2ggaXMgcGFydGlhbGx5IGluaXRpYWxpemVkLCBgZWVfYmxvY2tgIGFuZCBgZWVfbGVuYCBhcmUgc2V0LiBCdXQgd2hhdCBhYm91dCB0aGUgb3RoZXIgZmllbGRzIG9mIGBzdHJ1Y3QgZXh0NF9leHRlbnRgPyBXZSBoYXZlIHRvIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIHRvIHNlZSBpZiB0aGVyZSYjMzk7cyBhbnkgcmlzayBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJZiBhbnkgb2YgdGhlIG90aGVyIGZpZWxkcyBhcmUgcmVhZCBiZWZvcmUgYmVpbmcgd3JpdHRlbiB0bywgdGhhdCAqY291bGQqIGJlIGEgS01TQU4gaXNzdWUsIHJpZ2h0PyBTbywgdGhpcyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gYmVmb3JlIHdlIGRlY2lkZSBpZiBhIGZ1enppbmcgc2Vzc2lvbiBpcyByZXF1aXJlZC4gSSBuZWVkIHRvIGxvb2sgYXQgdGhhdCBzdHJ1Y3QgZGVmaW5pdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3RydWN0IGV4dDRfZXh0ZW50IFxceyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTQ4PXN0cnVjdCBleHQ0X2V4dGVudF90YWlsIHtcbi0tXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTU1LSAqL1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDo1NjpzdHJ1Y3QgZXh0NF9leHRlbnQge1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC01Ny1cdF9fbGUzMlx0ZWVfYmxvY2s7XHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTU5NQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gRXh0ZW50cyBpbiBleHQ0KioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgZXh0ZW50cyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5LiBUaGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gc3RhcnQgaXMgdGhlIGhlYWRlciBmaWxlLCB3aGljaCB1c3VhbGx5IGRlZmluZXMgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4gSSYjMzk7bSBnb2luZyB0byBqdW1wIGludG8gYGZzL2V4dDQvZXh0NF9leHRlbnRzLmhgIGFuZCB0YWtlIGEgbG9vayBhcm91bmQgbGluZSA1Ni4gSSYjMzk7bSBob3BpbmcgdG8gZmluZCB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCB0byByZXByZXNlbnQgYW4gZXh0ZW50LCB3aGljaCB3aWxsIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlJiMzOTt2ZSBnb3QhIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSB0aGluZ3MgbGlrZSB0aGUgYGV4dDRfZXh0ZW50X2hlYWRlcmAsIGBleHQ0X2V4dGVudGAsIGFuZCBwb3NzaWJseSBzb21lIHJlbGF0ZWQgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgdGhlIGV4dGVudCB0cmVlLCBpZiB0aGV5JiMzOTtyZSB1c2luZyBvbmUuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBvbi1kaXNrIGZvcm1hdCBhbmQgaG93IHRoZSBsb2dpY2FsLXRvLXBoeXNpY2FsIG1hcHBpbmcgaXMgaGFuZGxlZC4gS25vd2luZyB0aGlzIHNob3VsZCBwcm92aWRlIGtleSBpbnNpZ2h0IGludG8gdW5kZXJzdGFuZGluZyBmaWxlIGFsbG9jYXRpb24gaW4gdGhpcyBmaWxlc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDUwOlx0fTtcbiAgNTE6XHRcbiAgNTI6XHQvKlxuICA1MzpcdCAqIFRoaXMgaXMgdGhlIGV4dGVudCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNTQ6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUuXG4gIDU1Olx0ICovXG4gIDU2Olx0c3RydWN0IGV4dDRfZXh0ZW50IHtcbiAgNTc6XHRcdF9fbGUzMlx0ZWVfYmxvY2s7XHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cbiAgNTg6XHRcdF9fbGUxNlx0ZWVfbGVuO1x0XHQvKiBudW1iZXIgb2YgYmxvY2tzIGNvdmVyZWQgYnkgZXh0ZW50ICovXG4gIDU5Olx0XHRfX2xlMTZcdGVlX3N0YXJ0X2hpO1x0LyogaGlnaCAxNiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXG4gIDYwOlx0XHRfX2xlMzJcdGVlX3N0YXJ0X2xvO1x0LyogbG93IDMyIGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cbiAgNjE6XHR9O1xuICA2MjpcdFxuICA2MzpcdC8qXG4gIDY0Olx0ICogVGhpcyBpcyBpbmRleCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNjU6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IGFsbCB0aGUgbGV2ZWxzIGV4Y2VwdCB0aGUgYm90dG9tLlxuICA2NjpcdCAqL1xuICA2NzpcdHN0cnVjdCBleHQ0X2V4dGVudF9pZHgge1xuICA2ODpcdFx0X19sZTMyXHRlaV9ibG9jaztcdC8qIGluZGV4IGNvdmVycyBsb2dpY2FsIGJsb2NrcyBmcm9tICYjMzk7YmxvY2smIzM5OyAqL1xuICA2OTpcdFx0X19sZTMyXHRlaV9sZWFmX2xvO1x0LyogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgYmxvY2sgb2YgdGhlIG5leHQgKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MjAxCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMTI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBFeHRlbnQgSW5pdGlhbGl6YXRpb24gaW4gRXh0NCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBjb2RlIGFuZCBpbW1lZGlhdGVseSBteSBmb2N1cyBpcyBkcmF3biB0byB0aGUgYHN0cnVjdCBleHQ0X2V4dGVudGAuIFJpZ2h0LCBJIHJlbWVtYmVyIHRoYXQgc3RydWN0dXJlOiBgZWVfYmxvY2tgLCBgZWVfbGVuYCwgYGVlX3N0YXJ0X2hpYCwgYGVlX3N0YXJ0X2xvYC4gQ2xhc3NpYy4gTm93LCB3aXRoaW4gdGhpcyBwYXRjaCwgSSBzZWUgdGhleSYjMzk7cmUgaW5pdGlhbGl6aW5nIGEgbmV3IGV4dGVudCwgYG5ld2V4YC4gVGhlIGNvZGUgc25pcHBldCBzaG93czoKCmBgYGMKCQlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7CgoJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CgkJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTsKCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJmFtcDtuZXdleCwgYmxvY2spOwpgYGAKClRoZSBmaXJzdCB0d28gaW5pdGlhbGl6YXRpb25zIGFyZSBzdHJhaWdodGZvcndhcmQ6IHNldHRpbmcgYGVlX2Jsb2NrYCB0byB6ZXJvIChsaWtlbHkgcmVwcmVzZW50aW5nIGFuIHVuYWxsb2NhdGVkIG9yIGVtcHR5IGJsb2NrKSBhbmQgYGVlX2xlbmAgdG8gYGxlbmAgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIFRoZSBjcml0aWNhbCBwYXJ0IGhlcmUgaXMgdGhpcyBjYWxsIHRvIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgLiBJIG5lZWQgdG8gZGlnIGludG8gdGhhdCBmdW5jdGlvbi4gQ2xlYXJseSwgdGhhdCYjMzk7cyB3aGVyZSB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGlzIGJlaW5nIHN0b3JlZCwgcHJvYmFibHkgc3ByZWFkaW5nIGl0IGFjcm9zcyB0aGUgYGVlX3N0YXJ0X2hpYCBhbmQgYGVlX3N0YXJ0X2xvYCBmaWVsZHMsIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUuIEkmIzM5O2xsIG5lZWQgdG8gdmVyaWZ5IHRoYXQgaXQgY29ycmVjdGx5IGhhbmRsZXMgdGhlIDY0LWJpdCBibG9jayBudW1iZXJzLiBJJiMzOTtsbCBnbyBjaGVjayB0aGF0IG5leHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZXh0X3N0b3JlX3BibG9jayYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTIzMj1zdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2lkeF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgpXG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDEtLypcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6MjQyOiAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQzLSAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsXG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDUtICovXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0NjpzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0Ny1cdFx0XHRcdFx0IGV4dDRfZnNibGtfdCBwYilcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTIyNz1zdGF0aWMgaW50IGV4dGVudHNfa3VuaXRfaW5pdChzdHJ1Y3Qga3VuaXQgKnRlc3QpXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy0zMTktXHRFWFRfRklSU1RfRVhURU5UKGVoKS1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihFWFRfREFUQV9MRU4pO1xuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzozMjA6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soRVhUX0ZJUlNUX0VYVEVOVChlaCksIEVYVF9EQVRBX1BCTEspO1xuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy0zMjEtXHRpZiAoIXBhcmFtIHx8IHBhcmFtLVx1MDAzZWlzX3Vud3JpdF9hdF9zdGFydClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMDg1LVx0XHRcdGV4LVx1MDAzZWVlX2Jsb2NrID0gbmV3ZXh0LVx1MDAzZWVlX2Jsb2NrO1xuZnMvZXh0NC9leHRlbnRzLmM6MjA4NjpcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIGV4dDRfZXh0X3BibG9jayhuZXdleHQpKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTIwODctXHRcdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjE5Ni1cdG5lYXJleC1cdTAwM2VlZV9ibG9jayA9IG5ld2V4dC1cdTAwM2VlZV9ibG9jaztcbmZzL2V4dDQvZXh0ZW50cy5jOjIxOTc6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2sobmVhcmV4LCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSk7XG5mcy9leHQ0L2V4dGVudHMuYy0yMTk4LVx0bmVhcmV4LVx1MDAzZWVlX2xlbiA9IG5ld2V4dC1cdTAwM2VlZV9sZW47XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MjYxND1leHQ0X2V4dF9ybV9sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjczOS1cdFx0XHQvKiB0aGlzIGV4dGVudCBpcyByZW1vdmVkOyBtYXJrIHNsb3QgZW50aXJlbHkgdW51c2VkICovXG5mcy9leHQ0L2V4dGVudHMuYzoyNzQwOlx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy0yNzQxLVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTMxOTE9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudF9hdChoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDYtXHRleDItXHUwMDNlZWVfbGVuICAgPSBjcHVfdG9fbGUxNihlZV9sZW4gLSAoc3BsaXQgLSBlZV9ibG9jaykpO1xuZnMvZXh0NC9leHRlbnRzLmM6MzI0NzpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleDIsIG5ld2Jsb2NrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDgtXHRpZiAoaXNfdW53cml0KVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTM1NTc9ZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTM2NDUtXHRcdFx0ZXgtXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihlZV9ibG9jayAmIzQzOyBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjM2NDY6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBlZV9wYmxrICYjNDM7IG1hcF9sZW4pO1xuZnMvZXh0NC9leHRlbnRzLmMtMzY0Ny1cdFx0XHRleC1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNjkxLVx0XHRcdGFidXRfZXgtXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihuZXh0X2xibGsgLSBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjM2OTI6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGFidXRfZXgsIG5leHRfcGJsayAtIG1hcF9sZW4pO1xuZnMvZXh0NC9leHRlbnRzLmMtMzY5My1cdFx0XHRleC1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ1LVx0XHRcdFx0Y3B1X3RvX2xlMTYoKmFsbG9jYXRlZCAtIHNwbGl0X21hcC5tX2xlbik7XG5mcy9leHQ0L2V4dGVudHMuYzozNzQ2Olx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZ6ZXJvX2V4MSxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NDctXHRcdFx0XHRleHQ0X2V4dF9wYmxvY2soZXgpICYjNDM7IHNwbGl0X21hcC5tX2xibGsgJiM0Mztcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNzYwLVx0XHRcdFx0XHRcdFx0ZWVfYmxvY2spO1xuZnMvZXh0NC9leHRlbnRzLmM6Mzc2MTpcdFx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZ6ZXJvX2V4MixcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NjItXHRcdFx0XHRcdFx0ICAgICAgZXh0NF9leHRfcGJsb2NrKGV4KSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTQ0NzMtXHRwYmxrID0gbmV3YmxvY2sgJiM0Mzsgb2Zmc2V0O1xuZnMvZXh0NC9leHRlbnRzLmM6NDQ3NDpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleCwgcGJsayk7XG5mcy9leHQ0L2V4dGVudHMuYy00NDc1LVx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYXIubGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NzYzPWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU4OTctXHRcdHRtcF9leCA9ICpleDE7XG5mcy9leHQ0L2V4dGVudHMuYzo1ODk4Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgxLCBleHQ0X2V4dF9wYmxvY2soZXgyKSk7XG5mcy9leHQ0L2V4dGVudHMuYzo1ODk5Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBleHQ0X2V4dF9wYmxvY2soXHUwMDI2dG1wX2V4KSk7XG5mcy9leHQ0L2V4dGVudHMuYy01OTAwLVx0XHRleDEtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZTJfbGVuKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MDI3PWludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYwODAtXHRcdGV4dDRfZXh0X21hcmtfaW5pdGlhbGl6ZWQoZXgpO1xuZnMvZXh0NC9leHRlbnRzLmM6NjA4MTpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgcGJsayk7XG5mcy9leHQ0L2V4dGVudHMuYy02MDgyLVx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz05MzE9c3RhdGljIGludCBleHQ0X2ZjX3dyaXRlX2lub2RlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgdTMyICpjcmMpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2MS1cdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYocmFuZ2UtXHUwMDNlbGVuKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo5NjI6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgcmFuZ2UtXHUwMDNlcGJsayk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtOTYzLVx0XHRpZiAocmFuZ2UtXHUwMDNldW53cml0dGVuKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMDItXHRcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihjdXIpO1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIyMDM6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMDQtXHRcdFx0XHRcdTAwMjZuZXdleCwgc3RhcnRfcGJsayAmIzQzOyBjdXIgLSBzdGFydCk7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMTctXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XG5mcy9leHQ0L2lubGluZS5jOjExMTg6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleCwgYmxvY2spO1xuZnMvZXh0NC9pbmxpbmUuYy0xMTE5LVx0XHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTMzLVx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEpO1xuZnMvZXh0NC9taWdyYXRlLmM6MzQ6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXh0LCBsYi1cdTAwM2VmaXJzdF9wYmxvY2spO1xuZnMvZXh0NC9taWdyYXRlLmMtMzUtXHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MDUxCgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyBhbmQgdGhpbmtpbmcgYWJvdXQgdGhlIGNvZGU6CgoqKkRpdmluZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqCgpPa2F5LCB0aW1lIHRvIGdldCBhIGdvb2QgbG9vayBhdCBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYC4gTGV0JiMzOTtzIHB1bGwgdXAgdGhlIGRlZmluaXRpb24sIHJpZ2h0IGhlcmUgaW4gYGZzL2V4dDQvZXh0NF9leHRlbnRzLmhgLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBmdW5jdGlvbiBwbGF5cyB3aXRoIHRoZSBleHRlbnQgc3RydWN0dXJlIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBzb2xpZCBncmFzcCBvZiB0aGUgb3ZlcmFsbCBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCByZWxhdGVzIHRvIGJsb2NrIGFsbG9jYXRpb24sIHNvIGxldCYjMzk7cyBzZWUgaG93IHRoaXMgcGllY2UgZml0cyBpbi4gTXkgdW5kZXJzdGFuZGluZyBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gbGlrZWx5IGRlYWxzIHdpdGggdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciwgb3IgYHBibG9ja2AsIHdpdGhpbiBhIGdpdmVuIGV4dGVudCwgYnV0IGxldCYjMzk7cyBjb25maXJtIHRoYXQuIEkmIzM5O20gZ3Vlc3NpbmcgaXQgaGFuZGxlcyBzdG9yaW5nIG9yIHJldHJpZXZpbmcgdGhhdCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gSXQmIzM5O3MgbGlrZWx5IGludm9sdmVkIGluIHVwZGF0aW5nIGFuIGV4dGVudCYjMzk7cyBtZXRhZGF0YSB3aGVuIGEgZmlsZSBibG9jayBnZXRzIGFsbG9jYXRlZCBvciBkZWFsbG9jYXRlZCwgb3IgbWF5YmUgd2hlbiBoYW5kbGluZyBmaWxlIGV4dGVuc2lvbiBvciB0cnVuY2F0aW9uLiBMZXQmIzM5O3Mgc2VlIGhvdyBpdCBoYW5kbGVzIHRob3NlIGVkZ2UgY2FzZXMuIEkgaG9wZSB0aGUgaW5saW5lIGNvbW1lbnRzIGFyZSBnb29kLCB0aGF0IHdvdWxkIG1ha2UgdGhpcyBlYXNpZXIuIEFscmlnaHQsIGxldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSBleGFjdGx5IHdoYXQmIzM5O3MgaGFwcGVuaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNDIsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI0MjpcdCAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcbiAyNDM6XHQgKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBleHRlbnQgc3RydWN0LFxuIDI0NDpcdCAqIGJyZWFraW5nIGl0IGludG8gcGFydHNcbiAyNDU6XHQgKi9cbiAyNDY6XHRzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXG4gMjQ3Olx0XHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4gMjQ4Olx0e1xuIDI0OTpcdFx0ZXgtXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFx1MDAyNiAweGZmZmZmZmZmKSk7XG4gMjUwOlx0XHRleC1cdTAwM2VlZV9zdGFydF9oaSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBsb25nKSAoKHBiIFx1MDAzZVx1MDAzZSAzMSkgXHUwMDNlXHUwMDNlIDEpIFx1MDAyNlxuIDI1MTpcdFx0XHRcdFx0ICAgICAgMHhmZmZmKTtcbiAyNTI6XHR9XG4gMjUzOlx0XG4gMjU0Olx0LypcbiAyNTU6XHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XG4gMjU2Olx0ICogc3RvcmVzIGEgbGFyZ2UgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gYW4gaW5kZXggc3RydWN0LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjMzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNzgxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBEYXRhIEluaXRpYWxpemF0aW9uIGluIGV4dDQqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyBzb21lIHN0cnVjdHVyZXMgYXJlIGJlaW5nIGluaXRpYWxpemVkIGhlcmUsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBGaXJzdCwgSSBzZWUgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyBgZWVfc3RhcnRfbG9gIGFuZCBgZWVfc3RhcnRfaGlgIHdpdGhpbiB0aGUgYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAuIEJlZm9yZSB0aGF0LCBgZWVfYmxvY2tgIGFuZCBgZWVfbGVuYCBhcmUgc2V0LCBzbyBhbGwgZmllbGRzIG9mIGBuZXdleGAgYXJlIHNldDoKCmBgYGMKCQluZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApOwoJCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7CgkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKYGBgCgpJIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBzaXplIG9mIGBleHQ0X2V4dGVudGAuIEl0JiMzOTtzIGBlZV9ibG9ja2AgKDQgYnl0ZXMpLCBgZWVfbGVuYCAoMiBieXRlcyksIGBlZV9zdGFydF9oaWAgKDIgYnl0ZXMpLCBhbmQgYGVlX3N0YXJ0X2xvYCAoNCBieXRlcyksIHRvdGFsaW5nIDEyIGJ5dGVzLiBBbmQsIG5vIHBhZGRpbmcgaXMgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLCBzbyBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhcyBleHBlY3RlZC4KClRoZW4gSSBsb29rIGF0IGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgd2hpY2ggYXBwZWFycyB0byBiZSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQ6CgpgYGBjCglzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewoJCS5zID0geyAubm90X2ZvdW5kID0gMCwgfSwKCX07CmBgYAoKVGhlIGNvbXBpbGVyIHdpbGwgemVybyBvdXQgdGhlIHJlbWFpbmluZyBmaWVsZHMuIFNhbWUgZ29lcyBmb3IgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAsIHBhcnRpYWxseSBpbml0aWFsaXplZCBhbmQgdGhlIHJlc3Qgd2lsbCBiZSB6ZXJvZWQgb3V0LgoKYGBgYwoJc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpID0gewoJCS5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sCgkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAoJCS52YWx1ZSA9IE5VTEwsCgkJLnZhbHVlX2xlbiA9IDAsCgl9OwpgYGAKCmBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCwgdGhhdCYjMzk7cyBjbGVhciBlbm91Z2guCgpgYGBjCgltZW1zZXQoJmFtcDthciwgMCwgc2l6ZW9mKGFyKSk7CmBgYAoKTm93LCByZWdhcmRpbmcgYGJ1ZmAsIEkgc2VlIGl0JiMzOTtzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCwgYnV0IHdpdGhvdXQgYF9fR0ZQX1pFUk9gLiBUaGUgY29kZSB0aGVuIHJlYWRzIGlubGluZSBkYXRhIGludG8gYGJ1ZmA6CgpgYGBjCglpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTsKCWJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTsKCWVycm9yID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBidWYsICZhbXA7aW5saW5lX3NpemUsICZhbXA7aWxvYyk7CmBgYAoKSWYgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZmFpbHMsIGBidWZgIGdldHMgZnJlZWQuIElmIGl0IHN1Y2NlZWRzLCBgYnVmYCBjb250YWlucyB0aGUgaW5saW5lIGRhdGEuIEFmdGVyIHRoYXQsIGEgbmV3IGJsb2NrIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkIHVzaW5nIGBtZW1zZXRgLiBUaGUgY29udGVudHMgb2YgYGJ1ZmAgYXJlIHRoZW4gY29waWVkIGludG8gdGhhdCBuZXdseSBhbGxvY2F0ZWQgYmxvY2ssIGJ1dCBvbmx5IGlmIHRoZSBpbm9kZSBpc24mIzM5O3QgYSBkaXJlY3RvcnkuCgpgYGBjCgltZW1zZXQoZGF0YV9iaC0mZ3Q7Yl9kYXRhLCAwLCBpbm9kZS0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemUpOwoJaWYgKCFTX0lTRElSKGlub2RlLSZndDtpX21vZGUpKQoJCW1lbWNweShkYXRhX2JoLSZndDtiX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpOwpgYGAKClRoaXMgcmFpc2VzIHRoZSBxdWVzdGlvbjogSXMgYGJ1ZmAgKmd1YXJhbnRlZWQqIHRvIGJlIGZ1bGx5IGluaXRpYWxpemVkIGJ5IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgPyBJJiMzOTtsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayBob3cgdGhhdCBmdW5jdGlvbiB3b3JrcyB0byBiZSBjZXJ0YWluLiBUaGF0JiMzOTtzIHRoZSBrZXkgcXVlc3Rpb24gaGVyZSwgdGhhdCBmdW5jdGlvbiBpcyBjcml0aWNhbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9yZWFkX2lubGluZV9kYXRhJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmM9MTQ1PWludCBleHQ0X2ZpbmRfaW5saW5lX2RhdGFfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xODMtXG5mcy9leHQ0L2lubGluZS5jOjE4NDpzdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsXG5mcy9leHQ0L2lubGluZS5jLTE4NS1cdFx0XHRcdCB1bnNpZ25lZCBpbnQgbGVuLFxuLS1cbmZzL2V4dDQvaW5saW5lLmM9NTA0PXN0YXRpYyBpbnQgZXh0NF9yZWFkX2lubGluZV9mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNTM1LVx0a2FkZHIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCAwKTtcbmZzL2V4dDQvaW5saW5lLmM6NTM2Olx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBrYWRkciwgbGVuLCBcdTAwMjZpbG9jKTtcbmZzL2V4dDQvaW5saW5lLmMtNTM3LVx0a2FkZHIgPSBmb2xpb196ZXJvX3RhaWwoZm9saW8sIGxlbiwga2FkZHIgJiM0MzsgbGVuKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMTU0LVxuZnMvZXh0NC9pbmxpbmUuYzoxMTU1Olx0ZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xMTU2LVx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTMwNT1pbnQgZXh0NF9pbmxpbmVkaXJfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMzQwLVxuZnMvZXh0NC9pbmxpbmUuYzoxMzQxOlx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBkaXJfYnVmLCBpbmxpbmVfc2l6ZSwgXHUwMDI2aWxvYyk7XG5mcy9leHQ0L2lubGluZS5jLTEzNDItXHR1cF9yZWFkKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNleGF0dHJfc2VtKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE0MjY9aW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTQ1OS1cbmZzL2V4dDQvaW5saW5lLmM6MTQ2MDpcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgZGlyX2J1ZiwgaW5saW5lX3NpemUsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNDYxLVx0dXBfcmVhZChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZXhhdHRyX3NlbSk7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xNTU3PXZvaWQgKmV4dDRfcmVhZF9pbmxpbmVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6MTU3MzpcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgbGluaywgaW5saW5lX3NpemUsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNTc0LVx0aWYgKHJldCBcdTAwM2MgMCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTkyMQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byBgZXh0NF9yZWFkX2lubGluZV9kYXRhYC4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBmdW5jdGlvbiBpdCBzZXJ2ZXMgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gYXJjaGl0ZWN0dXJlLiBJJiMzOTttIGltbWVkaWF0ZWx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGRldmlhdGVzIGZyb20gdGhlIHN0YW5kYXJkIGJsb2NrLWJhc2VkIHJlYWQgb3BlcmF0aW9ucy4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBoYW5kbGVzIGRhdGEgdGhhdCYjMzk7cyAqaW5saW5lKiB3aXRoaW4gdGhlIGlub2RlIGl0c2VsZiwgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBzZXBhcmF0ZSBkYXRhIGJsb2Nrcy4gVGhpcyBpbXBsaWVzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJlbmVmaXRzLCBhc3N1bWluZyB0aGUgZGF0YSBzaXplIGlzIGFwcHJvcHJpYXRlIGZvciBpbmxpbmUgc3RvcmFnZS4KCkkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHNldmVyYWwga2V5IHRoaW5nczogdGhlIGNvbmRpdGlvbnMgdGhhdCB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24gKGkuZS4sIHdoZW4gZG9lcyBleHQ0IGRlY2lkZSB0byB1c2UgaW5saW5lIGRhdGE/KSwgaG93IGl0IHZlcmlmaWVzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGlubGluZSBkYXRhIChjaGVja3N1bXMsIGxlbmd0aCBjaGVja3MsIGV0Yy4pLCB0aGUgbWVjaGFuaXNtcyB1c2VkIHRvIGNvcHkgdGhlIGRhdGEgb3V0IHRvIHRoZSByZXF1ZXN0aW5nIGJ1ZmZlciwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgb3B0aW1pemF0aW9ucyBzcGVjaWZpYyB0byBpbmxpbmUgcmVhZHMuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhlcmUgYXJlIHVzdWFsbHkgY29uc2lkZXJhdGlvbnMgcmVsYXRlZCB0byBwYXJ0aWFsIHJlYWRzIGFuZCBob3cgdGhleSBhcmUgaGFuZGxlZCwgYWxvbmcgd2l0aCBwb3RlbnRpYWwgYWxpZ25tZW50IGlzc3Vlcy4KCkkmIzM5O2xsIGFsc28ga2VlcCBhbiBleWUgb3V0IGZvciBwb3RlbnRpYWwgY29uY3VycmVuY3kgY29uY2VybnMuIElmIHRoaXMgZnVuY3Rpb24gaXMgaGVhdmlseSB1c2VkIGFuZCBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLCB0aGVyZSBtaWdodCBiZSBsb2NraW5nIG1lY2hhbmlzbXMgdG8gZW5zdXJlIGRhdGEgY29uc2lzdGVuY3kuCgpVbHRpbWF0ZWx5LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBwYXRoIG9mIGV4ZWN1dGlvbjogZnJvbSB0aGUgVkZTIGxheWVyIG1ha2luZyB0aGUgcmVhZCByZXF1ZXN0IGFsbCB0aGUgd2F5IGRvd24gdG8gaG93IHRoZSBpbmxpbmUgZGF0YSBpcyByZXRyaWV2ZWQgYW5kIHBhc3NlZCBiYWNrIHRvIHRoZSB1c2VyIHNwYWNlIGJ1ZmZlci4gSSYjMzk7bSBhc3N1bWluZyB0aGVyZSYjMzk7cyBsaWtlbHkgc29tZSBjbGV2ZXIgYml0IG1hbmlwdWxhdGlvbiBvciBkYXRhIHN0cnVjdHVyZSB1bmRlcnN0YW5kaW5nIGluIHBsYXkgaGVyZSB0byBtYWtlIHRoaXMgZWZmaWNpZW50LiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGNvZGUgcmV2ZWFscyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2lubGluZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxODA6XHRcdGJyZWxzZShpcy5pbG9jLmJoKTtcbiAxODE6XHRcdHJldHVybiBlcnJvcjtcbiAxODI6XHR9XG4gMTgzOlx0XG4gMTg0Olx0c3RhdGljIGludCBleHQ0X3JlYWRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqYnVmZmVyLFxuIDE4NTpcdFx0XHRcdFx0IHVuc2lnbmVkIGludCBsZW4sXG4gMTg2Olx0XHRcdFx0XHQgc3RydWN0IGV4dDRfaWxvYyAqaWxvYylcbiAxODc6XHR7XG4gMTg4Olx0XHRzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnk7XG4gMTg5Olx0XHRzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9oZWFkZXIgKmhlYWRlcjtcbiAxOTA6XHRcdGludCBjcF9sZW4gPSAwO1xuIDE5MTpcdFx0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtcbiAxOTI6XHRcbiAxOTM6XHRcdGlmICghbGVuKVxuIDE5NDpcdFx0XHRyZXR1cm4gMDtcbiAxOTU6XHRcbiAxOTY6XHRcdEJVR19PTihsZW4gXHUwMDNlIEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSk7XG4gMTk3Olx0XG4gMTk4Olx0XHRjcF9sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4gMTk5Olx0XG4gMjAwOlx0XHRyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZShpbG9jKTtcbiAyMDE6XHRcdG1lbWNweShidWZmZXIsICh2b2lkICopKHJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrKSwgY3BfbGVuKTtcbiAyMDI6XHRcbiAyMDM6XHRcdGxlbiAtPSBjcF9sZW47XG4gMjA0Olx0XHRidWZmZXIgJiM0Mzs9IGNwX2xlbjtcbiAyMDU6XHRcbiAyMDY6XHRcdGlmICghbGVuKVxuIDIwNzpcdFx0XHRnb3RvIG91dDtcbiAyMDg6XHRcbiAyMDk6XHRcdGhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7XG4gMjEwOlx0XHRlbnRyeSA9IChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqKSgodm9pZCAqKXJhd19pbm9kZSAmIzQzO1xuIDIxMTpcdFx0XHRcdFx0XHQgICAgRVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYpO1xuIDIxMjpcdFx0bGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sXG4gMjEzOlx0XHRcdCAgICAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZSkpO1xuIDIxNDpcdFxuIDIxNTpcdFx0bWVtY3B5KGJ1ZmZlcixcbiAyMTY6XHRcdCAgICAgICAodm9pZCAqKUlGSVJTVChoZWFkZXIpICYjNDM7IGxlMTZfdG9fY3B1KGVudHJ5LVx1MDAzZWVfdmFsdWVfb2ZmcyksIGxlbik7XG4gMjE3Olx0XHRjcF9sZW4gJiM0Mzs9IGxlbjtcbiAyMTg6XHRcbiAyMTk6XHRvdXQ6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyOTE5CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNTM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBhbmQgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFNvLCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBzdXBwb3NlZCB0byBjb3B5IGlubGluZSBkYXRhIGZyb20gYW4gaW5vZGUgaW50byBhIGJ1ZmZlci4gTXkgaW5pdGlhbCB1bmRlcnN0YW5kaW5nLCBiYXNlZCBvbiB0aGUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGNvZGUsIGlzIHRoYXQgaXQgY29waWVzIGV4YWN0bHkgYGlubGluZV9zaXplYCBieXRlcy4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBzaXplIG9mIHRoZSBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvY2AuCgpIb3dldmVyLCBsb29raW5nIGNsb3NlciwgdGhlcmUmIzM5O3MgYSBjcnVjaWFsIGRldGFpbC4gVGhlIGBsZW5gIHBhcmFtZXRlciBwYXNzZWQgdG8gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMsIGluIGZhY3QsIGBpbmxpbmVfc2l6ZWAuIFRoZSBmdW5jdGlvbiBjb3BpZXMgdXAgdG8gdGhlIHByb3ZpZGVkIGBsZW5gIGJ5dGVzLCBidXQgKkJVR19PTnMqIGlmIGBsZW5gIGV4Y2VlZHMgdGhlIGFjdHVhbCBpbmxpbmUgZGF0YSBzaXplLiBUaGlzIG1ha2VzIHNlbnNlLgoKVGhlbiBJIHNlZSB0aGlzIHNuaXBwZXQ6CgpgYGBjCmxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLAoJCSAgICAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LSZndDtlX3ZhbHVlX3NpemUpKTsKYGBgCgpBaGEhIGBsZW5gICh3aGljaCBzdGFydGVkIGFzIGBpbmxpbmVfc2l6ZWApIGlzIHBvdGVudGlhbGx5IHJlZHVjZWQgYnkgdGhlIHNpemUgb2YgdGhlICp2YWx1ZSogb2YgdGhlIGlubGluZSBkYXRhIGVudHJ5LiBUaGlzIHJlZHVjdGlvbiBvZiBgbGVuYCBpbnRyb2R1Y2VzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBmdW5jdGlvbiBkb2VzbiYjMzk7dCBjb3B5IHRoZSBmdWxsIGBpbmxpbmVfc2l6ZWAgYnl0ZXMuIEFuZCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB0aGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsIGFzIGBlcnJvcmAsIHdoaWNoIGlzIHRoZW4gbGF0ZXIgdXNlZCBhcyBzdWNoOgoKYGBgYwoJZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpOwoJaWYgKGVycm9yICZsdDsgMCkKCQlnb3RvIG91dDsKYGBgCgpIZXJlJiMzOTtzIHRoZSBwcm9ibGVtOiBUaGUgY29kZSAqZG9lc24mIzM5O3QqIGNoZWNrIGlmIGBlcnJvcmAgaXMgbGVzcyB0aGFuIGBpbmxpbmVfc2l6ZWAuIEl0IHByb2NlZWRzIHRvIGBtZW1jcHlgIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtJmd0O2JfZGF0YWAgdXNpbmcgYGlubGluZV9zaXplYCBhcyB0aGUgY29weSBzaXplLiBJZiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBjb3BpZWQgZmV3ZXIgdGhhbiBgaW5saW5lX3NpemVgIGJ5dGVzLCB0aGVuIHRoZSBgYnVmYCBidWZmZXIgd2lsbCBjb250YWluIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgYGttYWxsb2NgIGFsbG9jYXRpb24uIFRob3NlIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgd2lsbCB0aGVuIGJlIGNvcGllZCBpbnRvIGBkYXRhX2JoLSZndDtiX2RhdGFgLiBUaGlzIGNvdWxkIGxlYWQgdG8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBzaW5jZSB0aGVzZSB1bmluaXRpYWxpemVkIGJ5dGVzIGFyZSBlZmZlY3RpdmVseSBkYXRhIGxlYWthZ2UgZnJvbSBtZW1vcnkuIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvcGllcyBsZXNzIHRoYW4gdGhlIGBpbmxpbmVfc2l6ZWAsIGluIHRoZSBjYWxsZXJzLiBJIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBhY3R1YWwgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgY29kZSBhbmQgaG93IGBlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplYCBpcyBkZXRlcm1pbmVkLiBJdCYjMzk7cyB0aW1lIHRvIHRlc3QgYW5kIHJlcHJvZHVjZSB0aGUgaXNzdWUgYW5kIHRoZW4gcGF0Y2ggdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9nZXRfaW5saW5lX3NpemUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYz0yNT1zdGF0aWMgaW50IGV4dDRfZGFfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0yOC1cbmZzL2V4dDQvaW5saW5lLmM6Mjk6c3RhdGljIGludCBleHQ0X2dldF9pbmxpbmVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9pbmxpbmUuYy0zMC17XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz01MDQ9c3RhdGljIGludCBleHQ0X3JlYWRfaW5saW5lX2ZvbGlvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy01MjQtXG5mcy9leHQ0L2lubGluZS5jOjUyNTpcdGxlbiA9IG1pbl90KHNpemVfdCwgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpLCBpX3NpemVfcmVhZChpbm9kZSkpO1xuZnMvZXh0NC9pbmxpbmUuYy01MjYtXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz01NzM9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNjIzLVx0ZnJvbSA9IDA7XG5mcy9leHQ0L2lubGluZS5jOjYyNDpcdHRvID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy02MjUtXHRpZiAoIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pKSB7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz04ODY9c3RhdGljIGludCBleHQ0X2RhX2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtOTAzLVxuZnMvZXh0NC9pbmxpbmUuYzo5MDQ6XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtOTA1LVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTEzNz1zdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExNDctXG5mcy9leHQ0L2lubGluZS5jOjExNDg6XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtMTE0OS1cdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTEzMDU9aW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTMzMi1cbmZzL2V4dDQvaW5saW5lLmM6MTMzMzpcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy0xMzM0LVx0ZGlyX2J1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE0MjY9aW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTQ1MS1cbmZzL2V4dDQvaW5saW5lLmM6MTQ1MjpcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNDUzLVx0ZGlyX2J1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE1NTc9dm9pZCAqZXh0NF9yZWFkX2lubGluZV9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNTY3LVx0cmV0ID0gLUVOT01FTTtcbmZzL2V4dDQvaW5saW5lLmM6MTU2ODpcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuZnMvZXh0NC9pbmxpbmUuYy0xNTY5LVx0bGluayA9IGttYWxsb2MoaW5saW5lX3NpemUgJiM0MzsgMSwgR0ZQX05PRlMpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTYzOT1zdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfZmluZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNjc5LVxuZnMvZXh0NC9pbmxpbmUuYzoxNjgwOlx0aWYgKGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcikgPT0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSlcbmZzL2V4dDQvaW5saW5lLmMtMTY4MS1cdFx0Z290byBvdXQ7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNjgzLVx0aW5saW5lX3N0YXJ0ID0gZXh0NF9nZXRfaW5saW5lX3hhdHRyX3BvcyhkaXIsIFx1MDAyNmlzLmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYzoxNjg0Olx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShkaXIpIC0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbmZzL2V4dDQvaW5saW5lLmMtMTY4NS1cbi0tXG5mcy9leHQ0L2lubGluZS5jPTE3MDI9aW50IGV4dDRfZGVsZXRlX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTcyOS1cdFx0aW5saW5lX3N0YXJ0ID0gZXh0NF9nZXRfaW5saW5lX3hhdHRyX3BvcyhkaXIsIFx1MDAyNmlsb2MpO1xuZnMvZXh0NC9pbmxpbmUuYzoxNzMwOlx0XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcikgLVxuZnMvZXh0NC9pbmxpbmUuYy0xNzMxLVx0XHRcdFx0RVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE3NjA9ZXh0NF9nZXRfaW5saW5lX2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xNzY3LVxuZnMvZXh0NC9pbmxpbmUuYzoxNzY4Olx0QlVHX09OKG9mZnNldCBcdTAwM2UgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpKTtcbmZzL2V4dDQvaW5saW5lLmMtMTc2OS1cbi0tXG5mcy9leHQ0L2lubGluZS5jLTE3NzUtXHRcdG9mZnNldCAtPSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xuZnMvZXh0NC9pbmxpbmUuYzoxNzc2Olx0XHQqaW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSkgLVxuZnMvZXh0NC9pbmxpbmUuYy0xNzc3LVx0XHRcdFx0RVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbi0tXG5mcy9leHQ0L2lubGluZS5jPTE3ODU9Ym9vbCBlbXB0eV9pbmxpbmVfZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgKmhhc19pbmxpbmVfZGF0YSlcbi0tXG5mcy9leHQ0L2lubGluZS5jLTE4MTctXG5mcy9leHQ0L2lubGluZS5jOjE4MTg6XHRpbmxpbmVfbGVuID0gZXh0NF9nZXRfaW5saW5lX3NpemUoZGlyKTtcbmZzL2V4dDQvaW5saW5lLmMtMTgxOS1cdG9mZnNldCA9IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg1OT1pbnQgZXh0NF9pbmxpbmVfZGF0YV9pb21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW9tYXAgKmlvbWFwKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTg4MC1cdGlvbWFwLVx1MDAzZW9mZnNldCA9IDA7XG5mcy9leHQ0L2lubGluZS5jOjE4ODE6XHRpb21hcC1cdTAwM2VsZW5ndGggPSBtaW5fdChsb2ZmX3QsIGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKSxcbmZzL2V4dDQvaW5saW5lLmMtMTg4Mi1cdFx0XHQgICAgICBpX3NpemVfcmVhZChpbm9kZSkpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xOTI2LVx0aV9zaXplID0gaW5vZGUtXHUwMDNlaV9zaXplO1xuZnMvZXh0NC9pbmxpbmUuYzoxOTI3Olx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTE5MjgtXHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpX3NpemU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1ODY2CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYGV4dDRfZ2V0X2lubGluZV9zaXplYCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgZXh0NF9nZXRfaW5saW5lX3NpemVgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBmb2N1c2VzIG9uIGl0cyBwdXJwb3NlOiBjbGVhcmx5LCB0aGlzIHJvdXRpbmUgaXMgZGVzaWduZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGRhdGEgdGhhdCBjYW4gYmUgaW5saW5lZCB3aXRoaW4gYW4gZXh0NCBpbm9kZSBpdHNlbGYuIEkgbmVlZCB0byBpbW1lZGlhdGVseSB1bmRlcnN0YW5kIHdoYXQgaW5wdXRzIGl0IHRha2VzLiBMaWtlbHksIHRoZXJlIHdpbGwgYmUgYXJndW1lbnRzIHBlcnRhaW5pbmcgdG8gdGhlIGlub2RlIGl0c2VsZiwgYW5kIHBlcmhhcHMgc29tZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGZpbGVzeXN0ZW3igJlzIGJsb2NrIHNpemUgb3IgZmVhdHVyZXMgZW5hYmxlZC4gTXkgbmV4dCBsaW5lIG9mIHRob3VnaHQgY29uY2VybnMgd2hhdCBhc3BlY3RzIG9mIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgYXJlIHJlbGV2YW50IHRvIGRldGVybWluaW5nIHRoZSBpbmxpbmUgc2l6ZSBsaW1pdDsgSSBpbW1lZGlhdGVseSB0aGluayBvZiB0aGUgZmlsZSYjMzk7cyB0eXBlLCB0aGUgaW5vZGUgZmxhZ3MgKGVzcGVjaWFsbHkgdGhvc2UgdGhhdCBtaWdodCBhZmZlY3QgdGhlIGxheW91dCksIGFuZCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgdGhpcyBpbm9kZS4gVGhlIHJldHVybiB2YWx1ZSwgb2J2aW91c2x5LCB3aWxsIGJlIHRoZSBzaXplIG9mIGRhdGEsIGluIGJ5dGVzLCB0aGF0IGlzIGxlZ2FsbHkgYWxsb3dlZCB0byBiZSBkaXJlY3RseSBzdG9yZWQgaW4gdGhlIGlub2RlLiBJIHdpbGwgZm9jdXMgb24gdW5kZXJzdGFuZGluZyB0aGUgKmxvZ2ljKiBvZiB0aGUgY2FsY3VsYXRpb24uIEkgd2lsbCBjaGVjayBmb3IgY29ybmVyIGNhc2VzIGFuZCBlcnJvciBjb25kaXRpb25zLiBJIHdhbnQgdG8ga25vdyB3aGVuIGl0IHNheXMg4oCcbm8gaW5saW5lIHNpemXigJ0gYW5kIHdoYXQgaXRzIG1lYW5pbmcgaXMuIEkmIzM5O20gZ29pbmcgdG8gbG9vayBmb3IgYW55IHJlZmVyZW5jZXMgdG8gYmxvY2sgZ3JvdXAgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBvciBvdGhlciBvbi1kaXNrIG1ldGFkYXRhIHRoYXQgbWlnaHQgaW5mbHVlbmNlIHRoZSBzaXplIGxpbWl0cy4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgcG9zc2libGUgdnVsbmVyYWJpbGl0aWVzLCBzdWNoIGFzIGludGVnZXIgb3ZlcmZsb3dzLCB0aGF0IGNvdWxkIGFsbG93IGV4Y2VlZGluZyB0aGUgaW50ZW5kZWQgc2l6ZSBsaW1pdCBvciB0aGF0IG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLiBGdXJ0aGVybW9yZSwgSSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgZGlmZmVyZW50IGV4dDQgZmVhdHVyZSBmbGFncyBjb3JyZWN0bHkgKGUuZy4gZXh0ZW50IHZzIGluZGlyZWN0IGJsb2NrIGhhbmRsaW5nKS4gRmluYWxseSwgSSB3aWxsIHZlcmlmeSBob3cgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhIGltcGFjdHMgdGhlIGJsb2NrIGFsbG9jYXRpb24gc3RyYXRlZ3kgd2hlbiB0aGUgZGF0YSBpcyBiaWdnZXIgdGhhbiBpbmxpbmUgbGltaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMjk6XHRzdGF0aWMgaW50IGV4dDRfZ2V0X2lubGluZV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gIDMwOlx0e1xuICAzMTpcdFx0aWYgKEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfb2ZmKVxuICAzMjpcdFx0XHRyZXR1cm4gRVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9zaXplO1xuICAzMzpcdFxuICAzNDpcdFx0cmV0dXJuIDA7XG4gIDM1Olx0fVxuICAzNjpcdFxuICAzNzpcdHN0YXRpYyBpbnQgZ2V0X21heF9pbmxpbmVfeGF0dHJfdmFsdWVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuICAzODpcdFx0XHRcdFx0XHQgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjQyOAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDgzOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipWdWxuZXJhYmlsaXR5IERldGVjdGVkOiBVbmluaXRpYWxpemVkIE1lbW9yeSBMZWFrIGluIGV4dDQgSW5saW5lIERhdGEgQ29udmVyc2lvbioqCgpPa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBgZXh0NF9nZXRfaW5saW5lX3NpemVgIGp1c3QgZ3JhYnMgYEVYVDRfSShpbm9kZSktJmd0O2lfaW5saW5lX3NpemVgLCB0aGF0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZC4gTm93LCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBJIHNlZSBhIGBCVUdfT05gIGNoZWNrIGVuc3VyaW5nIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIChgbGVuYCkgZG9lc24mIzM5O3QgZXhjZWVkIGBpX2lubGluZV9zaXplYCwgd2hpY2ggaXMgZ29vZC4gVGhlbiB0aGVyZSYjMzk7cyB0aGlzIGBjcF9sZW5gIGNhbGN1bGF0aW9uLCBpbml0aWFsbHkgbGltaXRlZCBieSBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWAuIFRoZSBpbml0aWFsIGRhdGEgaXMgY29waWVkIHVzaW5nIGBtZW1jcHlgLgoKVGhlIGNydWNpYWwgYml0LCB0aG91Z2gsIGlzIHRoZSBjb25kaXRpb25hbC4gVGhlIGNvZGUgY2FsY3VsYXRlcyBhIHJlbWFpbmluZyBsZW5ndGggKGBsZW5gKSBhbmQgdGhlbiwgd2l0aGluIHRoZSBgaWYgKCFsZW4pYCBjaGVjaywgdGhlIGtleSBsaW5lIGlzIGBsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgKHVuc2lnbmVkIGludClsZTMyX3RvX2NwdShlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplKSk7YC4gSWYgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluaW5nIGBsZW5gLCB0aGVuIGBsZW5gIGdldHMgcmVkdWNlZC4gQW5kIHRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgYGNwX2xlbiAmIzQzOyBsZW5gLCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gdGhlIGluaXRpYWwgYGlubGluZV9zaXplYC4KClRoaXMgaXMgd2hlcmUgdGhlIHByb2JsZW0gYXJpc2VzLiBXaGVuIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBjYWxscyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgaXQgb25seSBjaGVja3MgZm9yIG5lZ2F0aXZlIHJldHVybiB2YWx1ZXMsIGJ1dCBkb2VzbiYjMzk7dCBjaGVjayBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byB0aGUgaW5pdGlhbGx5IHJlcXVlc3RlZCBzaXplIChgaW5saW5lX3NpemVgKS4gVGhlbiwgaXQgcHJvY2VlZHMgdG8gY29weSBgaW5saW5lX3NpemVgIGJ5dGVzIGZyb20gYSBidWZmZXIgYGJ1ZmAgdG8gdGhlIGJsb2NrJiMzOTtzIGJ1ZmZlciBoZWFkIGBkYXRhX2JoLSZndDtiX2RhdGFgICp3aXRob3V0IGNoZWNraW5nIHRoZSByZXR1cm4gdmFsdWUqLgoKSGVyZSYjMzk7cyB0aGUga2lja2VyOiBgYnVmYCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgY29udGVudHMgb2YgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAsIHdoaWNoIGNvdWxkIGJlIHNtYWxsZXIgdGhhbiBgaW5saW5lX3NpemVgLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBiZWluZyB3cml0dGVuIHRvIGBidWZgLiBCZWNhdXNlIHRoZXJlIGlzIG5vIGNoZWNrIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBlbnN1cmUgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMgZXF1aXZhbGVudCB0byB0aGUgYGlubGluZV9zaXplYCwgdGhlIHN1YnNlcXVlbnQgYG1lbWNweWAgY291bGQgYmUgd3JpdGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSAoZnJvbSBga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpYCkgaW50byBgZGF0YV9iaC0mZ3Q7Yl9kYXRhYC4gYGRhdGFfYmgtJmd0O2JfZGF0YWAgaXMgdGhlbiB3cml0dGVuIHRvIGRpc2shCgpUaGlzIG1lYW5zIHVuaW5pdGlhbGl6ZWQga2VybmVsIGhlYXAgbWVtb3J5IGlzIHdyaXR0ZW4gdG8gZGlzaywgd2hpY2ggaXMgYSB0ZXh0Ym9vayBpbmZvcm1hdGlvbiBsZWFrISBUaGF0JiMzOTtzIGEgc2VyaW91cyBzZWN1cml0eSBmbGF3LiBUaGUgYXR0YWNrIHZlY3RvciBjb3VsZCBiZSByZWFkaW5nIHRoZSBkaXNrIGNvbnRlbnRzIGFmdGVyIGEgZmlsZSB3aXRoIGlubGluZSBkYXRhIGhhcyBiZWVuIGNvbnZlcnRlZC4KCldhaXQgYSBzZWNvbmTigKYgaXMgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgICphbHdheXMqIGVxdWFsIHRvIGBFWFQ0X0koaW5vZGUpLSZndDtpX2lubGluZV9zaXplIC0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWA/IElmIGl0IGlzLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgd291bGQgYWx3YXlzIG1hdGNoIGBpbmxpbmVfc2l6ZWAsIGFuZCB0aGUgbGVhayB3b3VsZCBub3Qgb2NjdXIuIEkgbmVlZCB0byB2ZXJpZnkgaG93IGBpX2lubGluZV9zaXplYCBpcyBzZXQgdG8gZW5zdXJlIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lfaW5saW5lX3NpemUgPSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2lubGluZS5jPTE0NT1pbnQgZXh0NF9maW5kX2lubGluZV9kYXRhX25vbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTc1LVx0XHRcdFx0XHQodm9pZCAqKWV4dDRfcmF3X2lub2RlKFx1MDAyNmlzLmlsb2MpKTtcbmZzL2V4dDQvaW5saW5lLmM6MTc2Olx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFICYjNDM7XG5mcy9leHQ0L2lubGluZS5jLTE3Ny1cdFx0XHRcdGxlMzJfdG9fY3B1KGlzLnMuaGVyZS1cdTAwM2VlX3ZhbHVlX3NpemUpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MjY4PXN0YXRpYyBpbnQgZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTMyNS1cdFx0XHRcdCAgICAgICh2b2lkICopZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYykpO1xuZnMvZXh0NC9pbmxpbmUuYzozMjY6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBsZW4gJiM0MzsgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTtcbmZzL2V4dDQvaW5saW5lLmMtMzI3LVx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MzM3PXN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTM5NS1cdFx0XHRcdCAgICAgICh2b2lkICopZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYykpO1xuZnMvZXh0NC9pbmxpbmUuYzozOTY6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFICYjNDM7XG5mcy9leHQ0L2lubGluZS5jLTM5Ny1cdFx0XHRcdGxlMzJfdG9fY3B1KGlzLnMuaGVyZS1cdTAwM2VlX3ZhbHVlX3NpemUpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9NDM3PXN0YXRpYyBpbnQgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtNDkzLVx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuZnMvZXh0NC9pbmxpbmUuYzo0OTQ6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xuZnMvZXh0NC9pbmxpbmUuYy00OTUtXHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMjYtXHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX29mZiA9IDA7XG5mcy9leHQ0L2lubGluZS5jOjExMjc6XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xuZnMvZXh0NC9pbmxpbmUuYy0xMTI4LVx0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xOTc4LVxuZnMvZXh0NC9pbmxpbmUuYzoxOTc5Olx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSBpX3NpemUgXHUwMDNjXG5mcy9leHQ0L2lubGluZS5jLTE5ODAtXHRcdFx0XHRcdEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUgP1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODc3NwoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDE3MzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIElubGluZSBEYXRhIENvbnZlcnNpb24gYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93biBzdGVwIGJ5IHN0ZXAuIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGV4dDRfZmluZF9pbmxpbmVfZGF0YV9ub2xvY2tgIGZ1bmN0aW9uIGFuZCBob3cgaXQgY2FsY3VsYXRlcyBgaV9pbmxpbmVfc2l6ZWAuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBpdCYjMzk7cyBjYWxjdWxhdGVkIHByZWNpc2VseSBhcyBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWAgcGx1cyB0aGUgdmFsdWUgb2YgYGVfdmFsdWVfc2l6ZWAuIFRoaXMgYGVfdmFsdWVfc2l6ZWAgY29tZXMgaW50byBwbGF5IGFnYWluIGluIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgLiBIZXJlLCBpZiB0aGUgY2FsY3VsYXRlZCBgaW5saW5lX3NpemVgIGlzIGJpZ2dlciB0aGFuIGBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFYCwgdGhlIGNvZGUgaXMgZGVzaWduZWQgdG8gY29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSB2YWx1ZSBwb2ludGVkIGF0IGJ5IGBlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplYC4gIFRoZSBzdWJzZXF1ZW50IGBtaW5fdGAgY2FsbCB3b24mIzM5O3QgcmVkdWNlIGBsZW5gIHNvIGVmZmVjdGl2ZWx5IGl0IGlzIGRvaW5nIGEgZnVsbCBjb3B5IG9mIGV4YWN0bHkgYGlubGluZV9zaXplYCBieXRlcy4gVGhlIHF1ZXN0aW9uIGFyaXNlczogaXMgdGhlcmUgYSByaXNrIG9mIHJlYWRpbmcgYmV5b25kIHdoYXQmIzM5O3MgaW50ZW5kZWQ/CgpJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBwb3RlbnRpYWwgZm9yIG9uLWRpc2sgY29ycnVwdGlvbiwgd2hlcmUgYGlzLnMuaGVyZS0mZ3Q7ZV92YWx1ZV9zaXplYCBtaWdodCBiZSBjb3JydXB0ZWQuIElmIHRoaXMgdmFsdWUgaXMgY29ycnVwdGVkIHRvIGJlIGxhcmdlLCB0aGUgYGlfaW5saW5lX3NpemVgIG1pZ2h0IGJlIGxhcmdlLiBCdXQgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgb25seSByZWFkcyB0aGUgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgLiBCZWNhdXNlIGBpcy5zLmhlcmVgIGluIGBleHQ0X2ZpbmRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyB0aGUgc2FtZSBhcyB0aGUgYGVudHJ5YCBpbiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgdGhlIHZhbHVlcyBhcmUgbGlua2VkLiBIb3dldmVyLCB0aGVyZSYjMzk7cyBhbHNvIHRoZSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBwb3NzaWJpbGl0eS4gSWYgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgIGlzIG1vZGlmaWVkIGNvbmN1cnJlbnRseSwgb3IgaWYgYGlfaW5saW5lX3NpemVgIGlzIGNhbGN1bGF0ZWQsIGttYWxsb2MgaXMgY2FsbGVkLCBhbmQgdGhlbiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBjb3BpZXMgYGlubGluZV9zaXplYCBieXRlcywgaXMgdGhlcmUgYSByYWNlIGNvbmRpdGlvbj8gSXMgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIHBvaW50ZWQgdG8gYnkgYGlubGluZV9zaXplYD8gIElmIHRoZSBvcmlnaW5hbCBgbGVuYCB0byBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBgaW5saW5lX3NpemVgIGFuZCAgYGlfaW5saW5lX3NpemVgIGlzIGJhc2VkIG9uICBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSAmIzQzOyBsZTMyX3RvX2NwdShlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplKWAsIHRoZW4sIEkgdGhpbmssIGl0JiMzOTtzIGNvcHlpbmcgYGlubGluZV9zaXplYCBieXRlcyBhbmQgdGhlIGJ1ZmZlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkLgoKTW92aW5nIHRvIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgZnVuY3Rpb24sIEkgc2VlIHRoYXQgYGlubGluZV9zaXplYCBpcyBjYWxjdWxhdGVkIGFuZCB1c2VkIHRvIGBrbWFsbG9jYCBhIGJ1ZmZlci4gVGhlIG9yaWdpbmFsIGNvZGUgd2FzIHVzaW5nIGEgcG9pbnRlciB0byBgaW5saW5lX3NpemVgIGluIHRoZSBjYWxsIHRvIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIHdoaWNoIEkmIzM5O3ZlIGp1c3QgZGV0ZXJtaW5lZCBpc24mIzM5O3QgdGhlIGNhc2UgYW5kIG5vdyB0YWtlcyBgaW5saW5lX3NpemVgIGJ5IHZhbHVlLiBTbywgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMgdGFraW5nIHRoZSBsZW5ndGggYnkgdmFsdWUsIHNvIHRoZSB2YWx1ZSBpcyBub3QgYmVpbmcgbW9kaWZpZWQuCgpOb3csIGxldCYjMzk7cyBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYuIFRoZSBwYXRjaCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEluIHRoZSBvcmlnaW5hbCBhcHByb2FjaCwgdGhlIGlubGluZSBkYXRhIHdhcyBmaXJzdCBkZXN0cm95ZWQgd2l0aCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIGFuZCB0aGVuIGEgYmxvY2sgd2FzIGFsbG9jYXRlZC4gSWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCB0aGUgaW5saW5lIGRhdGEgd2FzIHJlc3RvcmVkLiBUaGUgdXBkYXRlZCBjb2RlLCBob3dldmVyLCBhbGxvY2F0ZXMgYSBibG9jayB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgLiBUaGVuIGl0IGxvY2tzLCB6ZXJvcyBhbmQgY29waWVzIGludG8gdGhlIGJ1ZmZlci4gVGhlbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGlzIGNhbGxlZCB3aGljaCByZXBsYWNlcyB0aGUgaW5saW5lIGRhdGEgd2l0aCB0aGUgbmV3IGJsb2NrIGluIHRoZSBpbm9kZS4gTm93LCBpZiBhbnl0aGluZyBmYWlscyBiZWZvcmUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgdGhlIG5ldyBibG9jayBpcyBqdXN0IGZyZWVkLgoKTXkgbWFpbiBjb25jZXJuIG5vdyBpcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gSXMgaXQgcG9zc2libGUgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlIHRvIG9jY3VyPyBJJiMzOTttIGNoZWNraW5nIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2A6IEkgc2VlIGl0IHplcm9lcyB0aGUgaW5saW5lIGRhdGEgYXJlYSB3aXRoIGBtZW1zZXRgLCBib3RoIGluIHRoZSBpbm9kZSBpdHNlbGYgYW5kIHRoZSBidWZmZXIuIFRoZXJlJiMzOTtzIHRoZW4gYSBjaGVjayBmb3IgZXh0ZW50cy4gIEZvciBkaXJlY3RvcnksIHJlZ3VsYXIgb3Igc3ltbGluayBpbm9kZXMsIGBleHQ0X2V4dF90cmVlX2luaXRgIGlzIGNhbGxlZCwgYW5kIGl0JiMzOTtzIGluc2VydGluZyBleHRlbnRzLgoKTXkgbWFpbiBxdWVzdGlvbiBpczogZG9lcyBgZXh0NF9leHRfdHJlZV9pbml0YCBwb3RlbnRpYWxseSB3cml0ZSB0byBgaV9kYXRhYCwgb3ZlcndyaXRpbmcgdGhlIGBtZW1zZXRgPyBUaGlzIHdvdWxkIGJlIHRoZSBtb3N0IGxpa2VseSBzb3VyY2Ugb2YgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUuIEkgbmVlZCB0byBzdHVkeSBob3cgYGV4dDRfZXh0X3RyZWVfaW5pdGAgYW5kIHRoZSBleHRlbnQgaW5zZXJ0aW9uIHdvcmsgdG8gYmUgY29tcGxldGVseSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2V4dF90cmVlX2luaXQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0Lmg9Mzg2Mz1zdHJ1Y3QgZXh0NF9leHRlbnQ7XG4tLVxuZnMvZXh0NC9leHQ0LmgtMzg3MC1cbmZzL2V4dDQvZXh0NC5oOjM4NzE6ZXh0ZXJuIHZvaWQgZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuZnMvZXh0NC9leHQ0LmgtMzg3Mi1leHRlcm4gaW50IGV4dDRfZXh0X2luZGV4X3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZXh0ZW50cyk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9ODE1PWV4dDRfZXh0X2JpbnNlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTg3MS1cbmZzL2V4dDQvZXh0ZW50cy5jOjg3Mjp2b2lkIGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9leHRlbnRzLmMtODczLXtcbi0tXG5mcy9leHQ0L2lhbGxvYy5jPTkzMz1zdHJ1Y3QgaW5vZGUgKl9fZXh0NF9uZXdfaW5vZGUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsXG4tLVxuZnMvZXh0NC9pYWxsb2MuYy0xMzQwLVx0XHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG5mcy9leHQ0L2lhbGxvYy5jOjEzNDE6XHRcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpO1xuZnMvZXh0NC9pYWxsb2MuYy0xMzQyLVx0XHR9XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz00Mzc9c3RhdGljIGludCBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy00ODQtXHRcdFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbmZzL2V4dDQvaW5saW5lLmM6NDg1Olx0XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNDg2LVx0XHR9XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMTEtXHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG5mcy9leHQ0L2lubGluZS5jOjExMTI6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtMTExMy1cdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcbi0tXG5mcy9leHQ0L2lvY3RsLmM9Mzc1PXN0YXRpYyBsb25nIHN3YXBfaW5vZGVfYm9vdF9sb2FkZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbi0tXG5mcy9leHQ0L2lvY3RsLmMtNDUwLVx0XHRcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGVfYmwsIEVYVDRfSU5PREVfRVhURU5UUyk7XG5mcy9leHQ0L2lvY3RsLmM6NDUxOlx0XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlX2JsKTtcbmZzL2V4dDQvaW9jdGwuYy00NTItXHRcdH0gZWxzZVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTQxMD1pbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTQ4My1cbmZzL2V4dDQvbWlncmF0ZS5jOjQ4NDpcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG5mcy9leHQ0L21pZ3JhdGUuYy00ODUtXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTU2Ny1cbmZzL2V4dDQvbWlncmF0ZS5jOjU2ODpcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xuZnMvZXh0NC9taWdyYXRlLmMtNTY5LVx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgMSwgMCk7XG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNTg4LVx0LyogUmVzZXQgdGhlIGV4dGVudCBkZXRhaWxzICovXG5mcy9leHQ0L21pZ3JhdGUuYzo1ODk6XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCB0bXBfaW5vZGUpO1xuZnMvZXh0NC9taWdyYXRlLmMtNTkwLW91dF9zdG9wOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjQ5MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHdoYXQmIzM5O3MgZ29pbmcgb24sIHdyaXR0ZW4gYXMgdGhvdWdoIGl0JiMzOTtzIG15IG93biB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIGV4dDRfZXh0X3RyZWVfaW5pdCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGlzc2VjdCBgZXh0NF9leHRfdHJlZV9pbml0YC4gVGhlIG5hbWUgaXRzZWxmIGhpbnRzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlIG9mIHRoZSBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgd2l0aGluIGFuIGV4dDQgZmlsZXN5c3RlbS4gSSYjMzk7bSBhbHJlYWR5IGZhbWlsaWFyIHdpdGggdGhlIGNvbmNlcHQgb2YgZXh0ZW50IHRyZWVzLCBJIHVuZGVyc3RhbmQgdGhhdCB0aGV5IGFyZSB0aGUgYmFzaXMgZm9yIHN0b3JpbmcgZmlsZSBibG9ja3MgaW4gYSB3YXkgdGhhdCBtaW5pbWl6ZXMgZnJhZ21lbnRhdGlvbiBhbmQgbWF4aW1pemVzIHRoZSBlZmZpY2llbnQgdXNlIG9mIGRpc2sgc3BhY2UsIGNvbXBhcmVkIHRvIHRoZSBvbGRlciBibG9jay1iYXNlZCBpbm9kZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB0aGUgY3J1Y2lhbCBmaXJzdCBzdGVwIGluIHByZXBhcmluZyBhIGZpbGUmIzM5O3MgbWV0YWRhdGEgZm9yIGV4dGVudC1iYXNlZCBzdG9yYWdlLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzdGF0ZXMgY2FuIGV4aXN0IGF0IHRoaXMgcG9pbnQsIGFuZCB3aGF0IHRoZSBpbml0aWFsIHN0YXRlIGlzLiBJIHNob3VsZCBsb29rIGZvciB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIGluaXRpYWxpemVkLCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaW52b2x2ZWQgKGJlY2F1c2UgdGhpcyBpcyBjcml0aWNhbCBpbiBhIGtlcm5lbCBjb250ZXh0KSwgYW5kIGFueSBzYW5pdHkgY2hlY2tzIGJlaW5nIHBlcmZvcm1lZC4gSSYjMzk7bGwgYmUgbG9va2luZyB0byB1bmRlcnN0YW5kIHRoZSBtZWNoYW5pY3Mgb2YgaG93IHRoZSBleHRlbnQgaGVhZGVyIGlzIHNldCB1cCwgd2hhdCB2YWx1ZXMgYXJlIHBsYWNlZCBpbnRvIHRoZSBgZXh0X3RyZWVgIHN0cnVjdHVyZSwgYW5kIGlmIGl0JiMzOTtzIGJhc2VkIG9uIGFuIGV4aXN0aW5nIGlub2RlLCBvciBiZWluZyBpbml0aWFsaXplZCBmcm9tIHNjcmF0Y2guIEl0IG11c3QgYmUgc2V0dGluZyB1cCB0aGUgaW5pdGlhbCBleHRlbnQgbm9kZSwgbGlrZWx5IGEgc2luZ2xlIGV4dGVudCwgYW5kIGFueSBhc3NvY2lhdGVkIG1ldGEtZGF0YS4KCkkgc2hvdWxkIGFsc28gcGF5IGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgY29uZGl0aW9ucyB0aGlzIGZ1bmN0aW9uIGFudGljaXBhdGVzLiBXaGF0IGhhcHBlbnMgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHM/IEFyZSB0aGVyZSBzcGVjaWZpYyBlcnJvciBjb2RlcyByZXR1cm5lZD8gQW5kLCBtb3N0IGltcG9ydGFudGx5LCBJIG5lZWQgdG8gbG9vayBvdXQgZm9yIHdoZXJlIHRoaXMgaXMgdWx0aW1hdGVseSBjYWxsZWQgYW5kIGluIHdoYXQgY2lyY3Vtc3RhbmNlcyBpdCBpcyB1c2VkLiBJcyBpdCBjYWxsZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBmaWxlLCBvciB3aGVuIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgZmlsZSB0byBleHRlbnQtYmFzZWQgc3RvcmFnZT8gUGVyaGFwcyBib3RoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0ZW50cy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogODcyLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA4NzI6XHR2b2lkIGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDg3MzpcdHtcbiA4NzQ6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xuIDg3NTpcdFxuIDg3NjpcdFx0ZWggPSBleHRfaW5vZGVfaGRyKGlub2RlKTtcbiA4Nzc6XHRcdGVoLVx1MDAzZWVoX2RlcHRoID0gMDtcbiA4Nzg6XHRcdGVoLVx1MDAzZWVoX2VudHJpZXMgPSAwO1xuIDg3OTpcdFx0ZWgtXHUwMDNlZWhfbWFnaWMgPSBFWFQ0X0VYVF9NQUdJQztcbiA4ODA6XHRcdGVoLVx1MDAzZWVoX21heCA9IGNwdV90b19sZTE2KGV4dDRfZXh0X3NwYWNlX3Jvb3QoaW5vZGUsIDApKTtcbiA4ODE6XHRcdGVoLVx1MDAzZWVoX2dlbmVyYXRpb24gPSAwO1xuIDg4MjpcdFx0ZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpO1xuIDg4MzpcdH1cbiA4ODQ6XHRcbiA4ODU6XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqXG4gODg2Olx0ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjMxNjAKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA1MDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBpbiBleHQ0IENvZGUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9leHRfdHJlZV9pbml0YCBmdW5jdGlvbi4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBpbml0aWFsaXppbmcgYGVoX2RlcHRoYCwgYGVoX2VudHJpZXNgLCBgZWhfbWFnaWNgLCBgZWhfbWF4YCwgYW5kIGBlaF9nZW5lcmF0aW9uYC4gVGhlIGBlaGAgdmFyaWFibGUgaXMgcG9pbnRpbmcgdG8gYEVYVDRfSShpbm9kZSktJmd0O2lfZGF0YWAsIHdoaWNoIG1ha2VzIHNlbnNlLiBJIHJlbWVtYmVyIHRoYXQgYGlfZGF0YWAgd2FzIGp1c3QgemVyb2VkIG91dCB3aXRoIGBtZW1zZXRgLiBTbywgYXQgdGhpcyBwb2ludCwgdGhlIGVudGlyZSBgaV9kYXRhYCBhcmVhIHNob3VsZCBiZSBjbGVhbiwgd2l0aCBubyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhhdCYjMzk7cyBnb29kLgoKQnV0IGhhbmcgb27igKYgSSBuZWVkIHRvIGNvbnNpZGVyIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHRoaXMgZGF0YSBpcyB1c2VkLiBXaGF0IGFib3V0IHRob3NlIHhhdHRyIGZ1bmN0aW9ucywgYGV4dDRfeGF0dHJfaWJvZHlfZmluZGAgYW5kIGBleHQ0X3hhdHRyX2lib2R5X3NldGA/IEkgc2VlIHRoZXNlIGxvY2FsIHN0cnVjdHMsIGBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgIGFuZCBgZXh0NF94YXR0cl9pbmZvIGlgLiBUaGV5JiMzOTtyZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLiBOb3csIGluIEMsIHdoZW4geW91IHBhcnRpYWxseSBpbml0aWFsaXplIGEgc3RydWN0IGxpa2UgdGhhdCwgdGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIGF1dG9tYXRpY2FsbHkgemVyb2VkLiBTbywgZXZlbiB0aG91Z2ggdGhleSAqbG9vayogbGlrZSB0aGV5JiMzOTtyZSBvbmx5IHBhcnRpYWxseSBpbml0aWFsaXplZCwgdGhleSYjMzk7cmUgYWN0dWFsbHkgZnVsbHkgaW5pdGlhbGl6ZWQgZHVlIHRvIHRoZSBDIGxhbmd1YWdlJiMzOTtzIGJlaGF2aW9yLiBUaGF0JiMzOTtzIGEgcG9pbnQgaW4gZmF2b3Igb2Ygc2FmZXR5LgoKTm93LCB0aGVyZSYjMzk7cyBhbm90aGVyIHBvaW50IHRvIGNvbnNpZGVyLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZXJyb3IgcGF0aHMuIFdoYXQgaGFwcGVucyBpZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBhbiBlcnJvciBwb2ludGVyPyBJbiB0aGUgY29kZSBJJiMzOTttIGxvb2tpbmcgYXQsIHRoZXJlJiMzOTtzIGEgY2FsbCB0byBgZXh0NF9maW5kX2V4dGVudGAgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSWYgYGV4dDRfZmluZF9leHRlbnRgIGZhaWxzLCBgcGF0aGAgd2lsbCBiZSBhbiBlcnJvciBwb2ludGVyLCBwb3NzaWJseSBgLUVOT01FTWAuIElmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCB0cmllcyB0byBkZXJlZmVyZW5jZSB0aGF0IGVycm9yIHBvaW50ZXIsIGl0IHdvdWxkIGJlIGEgcHJvYmxlbS4gSSYjMzk7bGwgbmVlZCB0byBnbyBhbmQgY2hlY2sgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIHRvIG1ha2Ugc3VyZSBpdCBoYW5kbGVzIHRoZSBwb3NzaWJpbGl0eSBvZiBhIGBOVUxMYCBvciBlcnJvciBwb2ludGVyIGNvcnJlY3RseS4gVGhpcyB3YXJyYW50cyBhIGRlZXBlciBsb29rIGludG8gdGhlIGNvZGUgcGF0aCB0byBlbnN1cmUgd2UmIzM5O3JlIG5vdCBydW5uaW5nIGludG8gYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UsIHdoaWNoIHdvdWxkIGJlIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfaW5zZXJ0X2V4dGVudCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD02ODQ9ZW51bSB7XG4tLVxuZnMvZXh0NC9leHQ0LmgtNzQzLSAqIHJlYWRfZXh0ZW50X3RyZWVfYmxvY2soKSwgZXh0NF9zcGxpdF9leHRlbnRfYXQoKSxcbmZzL2V4dDQvZXh0NC5oOjc0NDogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KCksIGFuZCBleHQ0X2V4dF9jcmVhdGVfbmV3X2xlYWYoKS5cbmZzL2V4dDQvZXh0NC5oLTc0NS0gKiBFWFQ0X0VYX05PQ0FDSEUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3ZSBzaG91bGRuJiMzOTt0IGJlXG4tLVxuZnMvZXh0NC9leHQ0Lmg9Mzg5ND1leHRlcm4gaW50IGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3Jfc2luZ2xlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0NC5oLTM4OTYtXHRcdFx0XHRcdFx0ICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpO1xuZnMvZXh0NC9leHQ0Lmg6Mzg5NzpleHRlcm4gc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfZXh0X2luc2VydF9leHRlbnQoXG5mcy9leHQ0L2V4dDQuaC0zODk4LVx0XHRcdFx0aGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMyLSAqIHRvIGluc3RlYWQgd3JpdGUgemVyb2VzIHRvIG91ciBidWZmZXIuIFRoZW4sIHdlIG92ZXJyaWRlXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjMzOiAqIGV4dDRfZXh0X2luc2VydF9leHRlbnQoKSB0byByZXR1cm4gLUVOT1NQQywgd2hpY2ggdHJpZ2dlcnMgdGhlIHplcm9vdXQuXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTM0LSAqIEZpbmFsbHksIHdlIGNoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgZXh0ZW50IHRyZWUgYW5kIHplcm9vdXQgYnVmZmVyIHRvIGNvbmZpcm1cbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTE3Mj1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKlxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzoxNzM6ZXh0NF9leHRfaW5zZXJ0X2V4dGVudF9zdHViKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTE3NC1cdFx0XHQgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0zOTY9c3RhdGljIHZvaWQgdGVzdF9zcGxpdF9jb252ZXJ0KHN0cnVjdCBrdW5pdCAqdGVzdClcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQwNy1cdFx0LypcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDA4Olx0XHQgKiBGb3JjZSB6ZXJvb3V0IGJ5IG1ha2luZyBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50IHJldHVybiBFTk9TUENcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtNDA5LVx0XHQgKi9cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDEwOlx0XHRrdW5pdF9hY3RpdmF0ZV9zdGF0aWNfc3R1Yih0ZXN0LCBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50LFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzo0MTE6XHRcdFx0XHRcdCAgIGV4dDRfZXh0X2luc2VydF9leHRlbnRfc3R1Yik7XG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQxMi1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTQyPXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTk4NS0vKlxuZnMvZXh0NC9leHRlbnRzLmM6MTk4NjogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50OlxuZnMvZXh0NC9leHRlbnRzLmMtMTk4Ny0gKiB0cmllcyB0byBtZXJnZSByZXF1ZXN0ZWQgZXh0ZW50IGludG8gdGhlIGV4aXN0aW5nIGV4dGVudCBvclxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTE9c3RydWN0IGV4dDRfZXh0X3BhdGggKlxuZnMvZXh0NC9leHRlbnRzLmM6MTk5MjpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L2V4dGVudHMuYy0xOTkzLVx0XHQgICAgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjAwMi1cbmZzL2V4dDQvZXh0ZW50cy5jOjIwMDM6XHRLVU5JVF9TVEFUSUNfU1RVQl9SRURJUkVDVChleHQ0X2V4dF9pbnNlcnRfZXh0ZW50LCBoYW5kbGUsIGlub2RlLCBwYXRoLFxuZnMvZXh0NC9leHRlbnRzLmMtMjAwNC1cdFx0XHRcdCAgIG5ld2V4dCwgZ2JfZmxhZ3MpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTMxOTE9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudF9hdChoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTMyMzctXHQgKiBwYXRoIG1heSBsZWFkIHRvIG5ldyBsZWFmLCBub3QgdG8gb3JpZ2luYWwgbGVhZiBhbnkgbW9yZVxuZnMvZXh0NC9leHRlbnRzLmM6MzIzODpcdCAqIGFmdGVyIGV4dDRfZXh0X2luc2VydF9leHRlbnQoKSByZXR1cm5zLFxuZnMvZXh0NC9leHRlbnRzLmMtMzIzOS1cdCAqL1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTMyNTAtXG5mcy9leHQ0L2V4dGVudHMuYzozMjUxOlx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNTItXHRpZiAoIUlTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz00MjY5PWludCBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDQ4MS1cbmZzL2V4dDQvZXh0ZW50cy5jOjQ0ODI6XHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcdTAwMjZuZXdleCwgZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtNDQ4My1cdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MzAzPUVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2VzX2luc2VydF9leHRlbnQpO1xuZnMvZXh0NC9leHRlbnRzLmM6NjMwNDpFWFBPUlRfU1lNQk9MX0ZPUl9FWFQ0X1RFU1QoZXh0NF9leHRfaW5zZXJ0X2V4dGVudCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MzA1LUVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2ZpbmRfZXh0ZW50KTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjE0OD1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2FkZF9yYW5nZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1OCAqdmFsKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjA4LVx0XHRcdGRvd25fd3JpdGUoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMjA5Olx0XHRcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KE5VTEwsIGlub2RlLFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMTAtXHRcdFx0XHRcdFx0ICAgICAgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy0xMTE4LVx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcbmZzL2V4dDQvaW5saW5lLmM6MTExOTpcdFx0ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcdTAwMjZuZXdleCwgMCk7XG5mcy9leHQ0L2lubGluZS5jLTExMjAtXHR9IGVsc2Uge1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNTQtXHRcdGdvdG8gZXJyX291dDtcbmZzL2V4dDQvbWlncmF0ZS5jOjU1Olx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbmZzL2V4dDQvbWlncmF0ZS5jLTU2LVx0aWYgKElTX0VSUihwYXRoKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU5NDUKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIGZpcnN0LXBlcnNvbiBzdW1tYXJ5LCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCB0aGUgY3JpdGljYWwgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIGhhbmRsaW5nIGV4dGVudCBpbnNlcnRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IHRoZSBjb3JlIG9mIGV4dGVudC1iYXNlZCBmaWxlIHN0b3JhZ2UgaGVyZSDigJMgdGhlIHZlcnkgbWVjaGFuaXNtIHRoYXQgbWFrZXMgbW9kZXJuIGV4dDQgcGVyZm9ybWFuY2Ugd2hhdCBpdCBpcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiYjMzk7cyBsb2dpYyBpbnRpbWF0ZWx5LiBXaGF0IGFyZSB0aGUga2V5IGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZD8gT2J2aW91c2x5LCBgc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlcmAgYW5kIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIGFyZSBjZW50cmFsLCBidXQgaG93IGFyZSB0aGV5IGJlaW5nIG1hbmlwdWxhdGVkIGluIHRoaXMgc3BlY2lmaWMgaW5zZXJ0aW9uIHNjZW5hcmlvPwoKRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdHJpZ2dlcnMgdGhpcyBjYWxsLCBsaWtlbHkgZHVyaW5nIGZpbGUgY3JlYXRpb24sIGV4dGVuc2lvbiwgb3IgbW9kaWZpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBuZXcgZXh0ZW50LiBXaGF0IGFyZSB0aGUgcHJlLWNvbmRpdGlvbnM/IERvZXMgaXQgZXhwZWN0IHRoZSBuZXcgZXh0ZW50IHRvIGZpdCBpbiB0aGUgY3VycmVudCBibG9jayBncm91cCwgb3IgZG9lcyBpdCBoYW5kbGUgY3Jvc3MtYmxvY2stZ3JvdXAgaW5zZXJ0aW9ucz8gSWYgdGhlIGZvcm1lciwgd2hhdCYjMzk7cyB0aGUgb3ZlcmZsb3cgbG9naWMgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZT8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgYmxvY2sgYWxsb2NhdG9yPyBJcyB0aGVyZSBhIHNlcGFyYXRlIGxvY2tpbmcgbWVjaGFuaXNtIHJlcXVpcmVkIGJleW9uZCB3aGF0JiMzOTtzIGhhbmRsZWQgYXQgYSBoaWdoZXIgbGV2ZWw/CgpJJiMzOTttIGFsc28gY3VyaW91cyBhYm91dCB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4gRXh0ZW50IG1hbmlwdWxhdGlvbiwgZXNwZWNpYWxseSBpbnNlcnRpb25zLCBjYW4gYmUgY29tcGxleC4gV2hhdCBhcmUgdGhlIHRpbWUgY29tcGxleGl0aWVzIGZvciBzZWFyY2hpbmcgZm9yIHRoZSByaWdodCBwbGFjZSB0byBpbnNlcnQsIHNoaWZ0aW5nIGV4aXN0aW5nIGV4dGVudHMgaWYgbmVjZXNzYXJ5LCBhbmQgZmluYWxseSwgd3JpdGluZyB0aGUgY2hhbmdlcyB0byBkaXNrPyBBbnkgb2J2aW91cyBvcHRpbWl6YXRpb25zIGltcGxlbWVudGVkIHRvIG1pbmltaXplIGZyYWdtZW50YXRpb24gYW5kIG1heGltaXplIHBlcmZvcm1hbmNlPyBBcmUgdGhlcmUgYW55IHNwZWNpZmljIGVycm9yIGhhbmRsaW5nIHN0cmF0ZWdpZXMgdGhhdCBhcmUgcGFydGljdWxhcmx5IGNsZXZlciBvciByb2J1c3Q/IEkmIzM5O2xsIGJlIGxvb2tpbmcgY2xvc2VseSBhdCBob3cgaXQgaGFuZGxlcyBtZXRhZGF0YSB1cGRhdGVzLCBzcGVjaWZpY2FsbHkgdGhlIGlub2RlIGFuZCBncm91cCBkZXNjcmlwdG9yIGJsb2NrIGNoYW5nZXMuCgpUaGUgY3JpdGljYWwgcGF0aCBpcyB0aGUgcGFydCBJIHdhbnQgdG8gZm9jdXMgb24uIFdoYXQmIzM5O3MgdGhlIGNvcmUgbG9naWMgZm9yIHRoZSBpbnNlcnRpb24sIGFuZCB3aGF0IGVkZ2UgY2FzZXMgYXJlIGhhbmRsZWQgKGUuZy4sIGluc2VydGlvbiBhdCB0aGUgYmVnaW5uaW5nLCBtaWRkbGUsIG9yIGVuZCBvZiBhbiBleHRlbnQgbGlzdCwgb3IgZXZlbiBzcGxpdHRpbmcgZXh0ZW50cyB0byBtYWtlIHNwYWNlKS4gQW55IGNoYW5jZSBvZiBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGhlcmU/IEkmIzM5O2xsIHByb2JhYmx5IHNwZW5kIGEgZ29vZCB3aGlsZSBqdXN0IHRyYWNpbmcgdGhlIGNvZGUgZmxvdywgbG9va2luZyBvdXQgZm9yIHRoZSBjb21tb24gcHJvYmxlbXMgSSBrbm93IGNhbiBvY2N1ciBpbiB0aGVzZSB0eXBlIG9mIGZpbGUgc3lzdGVtIGZ1bmN0aW9ucy4gTm93LCBsZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIHNvdXJjZSBjb2RlIGFjdHVhbGx5IHRlbGxzIHVzLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTkxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5OTE6XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqXG4xOTkyOlx0ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuMTk5MzpcdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXG4xOTk0Olx0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKVxuMTk5NTpcdHtcbjE5OTY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xuMTk5NzpcdFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleCwgKmZleDtcbjE5OTg6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCAqbmVhcmV4OyAvKiBuZWFyZXN0IGV4dGVudCAqL1xuMTk5OTpcdFx0aW50IGRlcHRoLCBsZW4sIGVyciA9IDA7XG4yMDAwOlx0XHRleHQ0X2xibGtfdCBuZXh0O1xuMjAwMTpcdFx0aW50IG1iX2ZsYWdzID0gMCwgdW53cml0dGVuO1xuMjAwMjpcdFxuMjAwMzpcdFx0S1VOSVRfU1RBVElDX1NUVUJfUkVESVJFQ1QoZXh0NF9leHRfaW5zZXJ0X2V4dGVudCwgaGFuZGxlLCBpbm9kZSwgcGF0aCxcbjIwMDQ6XHRcdFx0XHRcdCAgIG5ld2V4dCwgZ2JfZmxhZ3MpO1xuMjAwNTpcdFxuMjAwNjpcdFx0aWYgKGdiX2ZsYWdzIFx1MDAyNiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSlcbjIwMDc6XHRcdFx0bWJfZmxhZ3MgfD0gRVhUNF9NQl9ERUxBTExPQ19SRVNFUlZFRDtcbjIwMDg6XHRcdGlmICh1bmxpa2VseShleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpID09IDApKSB7XG4yMDA5Olx0XHRcdEVYVDRfRVJST1JfSU5PREUoaW5vZGUsIFwmIzM0O2V4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCkgPT0gMFwmIzM0Oyk7XG4yMDEwOlx0XHRcdGVyciA9IC1FRlNDT1JSVVBURUQ7XG4yMDExOlx0XHRcdGdvdG8gZXJyb3V0O1xuMjAxMjpcdFx0fVxuMjAxMzpcdFx0ZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpO1xuMjAxNDpcdFx0ZXggPSBwYXRoW2RlcHRoXS5wX2V4dDtcbjIwMTU6XHRcdGVoID0gcGF0aFtkZXB0aF0ucF9oZHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2OTM5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcqKgoKSG1tLCBzbyBpZiBJJiMzOTttIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlIGNvcnJlY3RseSwgdGhlcmUmIzM5O3MgYSBzZXJpb3VzIHJpc2sgaGVyZS4gSWYgdGhlIHZhcmlhYmxlIGBwYXRoYCBpcyBhbiBlcnJvciBwb2ludGVyLCB0aGVuIGFjY2Vzc2luZyBgcGF0aFtkZXB0aF1gIGlzIGdvaW5nIHRvIGxlYWQgdG8gYSBkZXJlZmVyZW5jZSBvZiB0aGF0IGVycm9yIHBvaW50ZXIuIEFuZCB0aGF0JiMzOTtzIGdvaW5nIHRvIGNyYXNoIHRoZSBrZXJuZWwsIG5vIHF1ZXN0aW9uLiBIYW5nIG9uIGEgc2VjLi4uIHdhaXQgYSBtaW51dGUsIEkgdGhpbmsgSSBzZWUgYSBwb3RlbnRpYWwgZ290Y2hhLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBgRVJSX1BUUmAgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLCB3ZSBtaWdodCBoYXZlIGEgcHJvYmxlbS4gTG9va3MgbGlrZSBhIHByZXR0eSBzdGFuZGFyZCB0aGluZyB0byBkbyB3aXRoIGVycm9yIHBhdGhzIGluIHRoZSBrZXJuZWwuIFNvLCB0aGUga2V5IHRvIGFsbCB0aGlzIGlzIGhvdyBgZXh0NF9maW5kX2V4dGVudGAgaGFuZGxlcyBlcnJvcnMuIFdlIGhhdmUgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgY29kZSBleHBsaWNpdGx5IGNoZWNrcyB0aGUgcmV0dXJuIG9mIGBleHQ0X2ZpbmRfZXh0ZW50YCBhbmQgaGFuZGxlcyB0aGUgYEVSUl9QVFJgIGFwcHJvcHJpYXRlbHkuIFRoYXQmIzM5O3MgdGhlIG9ubHkgd2F5IHRvIGF2b2lkIGEgbmFzdHkgY3Jhc2guIFJpZ2h0LCBsZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZG9lcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9maW5kX2V4dGVudCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtEb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3Q9NT1Eb2N1bWVudGF0aW9uIHdyaXR0ZW4gYnkgVG9tIFphbnVzc2lcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3QtNDA0LSAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmYTA0YzRhM2NdIGludGVsX3BsYW5lX2R1cGxpY2F0ZV9zdGF0ZSBbaTkxNV0gICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAxNDAyICBieXRlc19yZXE6ICAgICAxOTA2NzJcbkRvY3VtZW50YXRpb24vdHJhY2UvaGlzdG9ncmFtLnJzdDo0MDU6ICAgIHsgY2FsbF9zaXRlOiBbZmZmZmZmZmY4MTI4OTFjYV0gZXh0NF9maW5kX2V4dGVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gaGl0Y291bnQ6ICAgICAgIDE1MTggIGJ5dGVzX3JlcTogICAgIDE0NjIwOFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQwNi0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwMjkwNzBlXSBkcm1fdm1hX25vZGVfYWxsb3cgW2RybV0gICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTc0NiAgYnl0ZXNfcmVxOiAgICAgIDY5ODQwXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQzOS0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwNDg5YTY2XSBpbnRlbF9yaW5nX2JlZ2luIFtpOTE1XSAgICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMjE4NiAgYnl0ZXNfcmVxOiAgICAgMzE0Nzg0XG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3Q6NDQwOiAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmODEyODkxY2FdIGV4dDRfZmluZF9leHRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAyMTc0ICBieXRlc19yZXE6ICAgICAyMDg5OTJcbkRvY3VtZW50YXRpb24vdHJhY2UvaGlzdG9ncmFtLnJzdC00NDEtICAgIHsgY2FsbF9zaXRlOiBbZmZmZmZmZmY4MTFhZThlMV0gX19rbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gaGl0Y291bnQ6ICAgICAgICAgIDggIGJ5dGVzX3JlcTogICAgIDEzMTA3MlxuLS1cbmZzL2V4dDQvZXh0NC5oPTY4ND1lbnVtIHtcbi0tXG5mcy9leHQ0L2V4dDQuaC03NDEtICogVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGVzZSBmbGFncyBtdXN0IG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZVxuZnMvZXh0NC9leHQ0Lmg6NzQyOiAqIEVYVDRfR0VUX0JMT0NLU18qLiAgVGhleSBhcmUgdXNlZCBieSBleHQ0X2ZpbmRfZXh0ZW50KCksXG5mcy9leHQ0L2V4dDQuaC03NDMtICogcmVhZF9leHRlbnRfdHJlZV9ibG9jaygpLCBleHQ0X3NwbGl0X2V4dGVudF9hdCgpLFxuLS1cbmZzL2V4dDQvZXh0NC5oPTM4OTc9ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KFxuLS1cbmZzL2V4dDQvZXh0NC5oLTM5MDAtXHRcdFx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKTtcbmZzL2V4dDQvZXh0NC5oOjM5MDE6ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2ZpbmRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqLCBleHQ0X2xibGtfdCxcbmZzL2V4dDQvZXh0NC5oLTM5MDItXHRcdFx0XHRcdCAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICosXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0zOTY9c3RhdGljIHZvaWQgdGVzdF9zcGxpdF9jb252ZXJ0KHN0cnVjdCBrdW5pdCAqdGVzdClcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQxMi1cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDEzOlx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9EQVRBX0xCTEssIE5VTEwsIEVYVDRfRVhfTk9DQUNIRSk7XG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQxNC1cdGV4ID0gcGF0aC1cdTAwM2VwX2V4dDtcbi0tXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQzOC1cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDM5Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9EQVRBX0xCTEssIE5VTEwsIEVYVDRfRVhfTk9DQUNIRSk7XG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQ0MC1cdGV4ID0gcGF0aC1cdTAwM2VwX2V4dDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz04ODU9c3RydWN0IGV4dDRfZXh0X3BhdGggKlxuZnMvZXh0NC9leHRlbnRzLmM6ODg2OmV4dDRfZmluZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgYmxvY2ssXG5mcy9leHQ0L2V4dGVudHMuYy04ODctXHRcdCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwgaW50IGZsYWdzKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTg5NC1cbmZzL2V4dDQvZXh0ZW50cy5jOjg5NTpcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZmluZF9leHRlbnQsIGlub2RlLCBibG9jaywgcGF0aCwgZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtODk2LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE0MDA9ZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTQyOC1cdFx0LyogcmVmaWxsIHBhdGggKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjE0Mjk6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlZV9ibG9jaywgcGF0aCwgZ2JfZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtMTQzMC1cdFx0cmV0dXJuIHBhdGg7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTQzOC1cdC8qIHJlZmlsbCBwYXRoICovXG5mcy9leHQ0L2V4dGVudHMuYzoxNDM5Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGVlX2Jsb2NrLCBwYXRoLCBnYl9mbGFncyk7XG5mcy9leHQ0L2V4dGVudHMuYy0xNDQwLVx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI3LVx0XHQgKiByaWdodCBmcm9tIGV4LCBvciBmcm9tIHRoZSBsZWZ0IG9mIGV4LiBUaGlzIGlzIGJlY2F1c2VcbmZzL2V4dDQvZXh0ZW50cy5jOjIwMjg6XHRcdCAqIGV4dDRfZmluZF9leHRlbnQoKSBjYW4gcmV0dXJuIGVpdGhlciBleHRlbnQgb24gdGhlXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI5LVx0XHQgKiBsZWZ0LCBvciBvbiB0aGUgcmlnaHQgZnJvbSB0aGUgc2VhcmNoZWQgcG9zaXRpb24uIFRoaXNcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA5LVx0XHRleHRfZGVidWcoaW5vZGUsIFwmIzM0O25leHQgbGVhZiBibG9jayAtICV1XFxuXCYjMzQ7LCBuZXh0KTtcbmZzL2V4dDQvZXh0ZW50cy5jOjIxMTA6XHRcdG5wYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbmV4dCwgTlVMTCwgZ2JfZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtMjExMS1cdFx0aWYgKElTX0VSUihucGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yODM3PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjg3Ni1cdFx0LyogZmluZCBleHRlbnQgZm9yIG9yIGNsb3Nlc3QgZXh0ZW50IHRvIHRoaXMgYmxvY2sgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjI4Nzc6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlbmQsIE5VTEwsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTI4NzgtXHRcdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zMjYyLVx0ICogR2V0IGEgbmV3IHBhdGggdG8gdHJ5IHRvIHplcm9vdXQgb3IgZml4IHRoZSBleHRlbnQgbGVuZ3RoLlxuZnMvZXh0NC9leHRlbnRzLmM6MzI2MzpcdCAqIFVzaW5nIEVYVDRfRVhfTk9GQUlMIGd1YXJhbnRlZXMgdGhhdCBleHQ0X2ZpbmRfZXh0ZW50KClcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNjQtXHQgKiB3aWxsIG5vdCByZXR1cm4gLUVOT01FTSwgb3RoZXJ3aXNlIC1FTk9NRU0gd2lsbCBjYXVzZSBhXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzI2OC1cdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6MzI2OTpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlZV9ibG9jaywgTlVMTCwgZmxhZ3MgfCBFWFQ0X0VYX05PRkFJTCk7XG5mcy9leHQ0L2V4dGVudHMuYy0zMjcwLVx0aWYgKElTX0VSUihwYXRoKSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTM0MDk9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTM0NDQtXHRcdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6MzQ0NTpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cdTAwM2VtX2xibGssIHBhdGgsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTM0NDYtXHRcdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzQ5Ni1cbmZzL2V4dDQvZXh0ZW50cy5jOjM0OTc6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLVx1MDAzZW1fbGJsaywgTlVMTCwgZmxhZ3MpO1xuZnMvZXh0NC9leHRlbnRzLmMtMzQ5OC1cdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MzgxNj1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzg2MS1jb252ZXJ0OlxuZnMvZXh0NC9leHRlbnRzLmM6Mzg2MjpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAtXHUwMDNlbV9sYmxrLCBwYXRoLCBmbGFncyk7XG5mcy9leHQ0L2V4dGVudHMuYy0zODYzLVx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zOTM2PWNvbnZlcnRfaW5pdGlhbGl6ZWRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzk3My1cdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6Mzk3NDpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAtXHUwMDNlbV9sYmxrLCBwYXRoLCBmbGFncyk7XG5mcy9leHQ0L2V4dGVudHMuYy0zOTc1LVx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz00MjY5PWludCBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDI4NS1cdC8qIGZpbmQgZXh0ZW50IGZvciB0aGlzIGJsb2NrICovXG5mcy9leHQ0L2V4dGVudHMuYzo0Mjg2Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cdTAwM2VtX2xibGssIE5VTEwsIGZsYWdzKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTQyODctXHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDI5Ni1cdCAqIHRoaXMgc2l0dWF0aW9uIGlzIHBvc3NpYmxlLCB0aG91Z2gsIF9kdXJpbmdfIHRyZWUgbW9kaWZpY2F0aW9uO1xuZnMvZXh0NC9leHRlbnRzLmM6NDI5NzpcdCAqIHRoaXMgaXMgd2h5IGFzc2VydCBjYW4mIzM5O3QgYmUgcHV0IGluIGV4dDRfZmluZF9leHRlbnQoKVxuZnMvZXh0NC9leHRlbnRzLmMtNDI5OC1cdCAqL1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTQzODItXHQgKiBJZiB3ZSBhcmUgZG9pbmcgYmlnYWxsb2MsIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXh0ZW50IHJldHVybmVkXG5mcy9leHQ0L2V4dGVudHMuYzo0MzgzOlx0ICogYnkgZXh0NF9maW5kX2V4dGVudCgpIGltcGxpZXMgYSBjbHVzdGVyIHdlIGNhbiB1c2UuXG5mcy9leHQ0L2V4dGVudHMuYy00Mzg0LVx0ICovXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTM4Mj1leHQ0X2V4dF9zaGlmdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTM5Mi1cdC8qIExldCBwYXRoIHBvaW50IHRvIHRoZSBsYXN0IGV4dGVudCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTM5MzpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG5mcy9leHQ0L2V4dGVudHMuYy01Mzk0LVx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NDEwLVx0aWYgKFNISUZUID09IFNISUZUX0xFRlQpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjU0MTE6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydCAtIDEsIHBhdGgsXG5mcy9leHQ0L2V4dGVudHMuYy01NDEyLVx0XHRcdFx0XHRFWFQ0X0VYX05PQ0FDSEUpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU0NTktXHR3aGlsZSAoaXRlcmF0b3IgXHUwMDI2XHUwMDI2IHN0YXJ0IFx1MDAzYz0gc3RvcCkge1xuZnMvZXh0NC9leHRlbnRzLmM6NTQ2MDpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsICppdGVyYXRvciwgcGF0aCxcbmZzL2V4dDQvZXh0ZW50cy5jLTU0NjEtXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTYyNj1zdGF0aWMgaW50IGV4dDRfaW5zZXJ0X3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU2ODctXG5mcy9leHQ0L2V4dGVudHMuYzo1Njg4Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0X2xibGssIE5VTEwsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNTY4OS1cdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NzYzPWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODQtXG5mcy9leHQ0L2V4dGVudHMuYzo1Nzg1Olx0XHRwYXRoMSA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUxLCBsYmxrMSwgcGF0aDEsIEVYVDRfRVhfTk9DQUNIRSk7XG5mcy9leHQ0L2V4dGVudHMuYy01Nzg2LVx0XHRpZiAoSVNfRVJSKHBhdGgxKSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODktXHRcdH1cbmZzL2V4dDQvZXh0ZW50cy5jOjU3OTA6XHRcdHBhdGgyID0gZXh0NF9maW5kX2V4dGVudChpbm9kZTIsIGxibGsyLCBwYXRoMiwgRVhUNF9FWF9OT0NBQ0hFKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU3OTEtXHRcdGlmIChJU19FUlIocGF0aDIpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTk0OD1pbnQgZXh0NF9jbHVfbWFwcGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxjbHUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTk2NS1cdC8qIHNlYXJjaCBmb3IgdGhlIGV4dGVudCBjbG9zZXN0IHRvIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgY2x1c3RlciAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTk2NjpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFQ0X0MyQihzYmksIGxjbHUpLCBOVUxMLCAwKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU5NjctXHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU5NzQtXHQgKiB0aG91Z2gsIF9kdXJpbmdfIHRyZWUgbW9kaWZpY2F0aW9uLCBhbmQgaXQmIzM5O3Mgd2h5IGFuIGFzc2VydCBjYW4mIzM5O3RcbmZzL2V4dDQvZXh0ZW50cy5jOjU5NzU6XHQgKiBiZSBwdXQgaW4gZXh0NF9maW5kX2V4dGVudCgpLlxuZnMvZXh0NC9leHRlbnRzLmMtNTk3Ni1cdCAqL1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYwMjc9aW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjAzMy1cbmZzL2V4dDQvZXh0ZW50cy5jOjYwMzQ6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgc3RhcnQsIE5VTEwsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNjAzNS1cdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjA1My1cbmZzL2V4dDQvZXh0ZW50cy5jOjYwNTQ6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydCwgcGF0aCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MDU1LVx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYwNzAtXG5mcy9leHQ0L2V4dGVudHMuYzo2MDcxOlx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydCwgcGF0aCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MDcyLVx0XHRcdGlmIChJU19FUlIocGF0aCkpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjA5Mj12b2lkIGV4dDRfZXh0X3JlcGxheV9zaHJpbmtfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgZW5kKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYwOTgtXHR3aGlsZSAoY3VyIFx1MDAzYyBlbmQpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjYwOTk6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIE5VTEwsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNjEwMC1cdFx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MTQwPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MTQ5LVx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjYxNTA6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuZnMvZXh0NC9leHRlbnRzLmMtNjE1MS1cdFx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MTgyLVx0XHRnb3RvIG91dDtcbmZzL2V4dDQvZXh0ZW50cy5jOjYxODM6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgY3VyLCBwYXRoLCAwKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTYxODQtXHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYxODctXHR3aGlsZSAoY3VyIFx1MDAzYyBlbmQpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjYxODg6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIHBhdGgsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtNjE4OS1cdFx0aWYgKElTX0VSUihwYXRoKSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MjAwLVxuZnMvZXh0NC9leHRlbnRzLmM6NjIwMTpcdFx0cGF0aDIgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIHBhdGgyLCAwKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTYyMDItXHRcdGlmIChJU19FUlIocGF0aDIpKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYyMjc9aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjIzOC1cdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG5mcy9leHQ0L2V4dGVudHMuYzo2MjM5Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNDAtXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjI1NS1cdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuZnMvZXh0NC9leHRlbnRzLmM6NjI1NjpcdFx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XG5mcy9leHQ0L2V4dGVudHMuYy02MjU3LVx0XHRcdGlmICghSVNfRVJSKHBhdGgpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjMwND1FWFBPUlRfU1lNQk9MX0ZPUl9FWFQ0X1RFU1QoZXh0NF9leHRfaW5zZXJ0X2V4dGVudCk7XG5mcy9leHQ0L2V4dGVudHMuYzo2MzA1OkVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2ZpbmRfZXh0ZW50KTtcbmZzL2V4dDQvZXh0ZW50cy5jLTYzMDYtRVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfaXNzdWVfemVyb291dCk7XG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTY3Mz1zdGF0aWMgdm9pZCBleHQ0X2VzX2luc2VydF9leHRlbnRfZXh0X2NoZWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTY4Mi1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo2ODM6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZXMtXHUwMDNlZXNfbGJsaywgTlVMTCwgRVhUNF9FWF9OT0NBQ0hFKTtcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02ODQtXHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIxOTctXHRcdFx0LyogUmFuZ2UgaXMgbm90IG1hcHBlZCAqL1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIxOTg6XHRcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGN1ciwgcGF0aCwgMCk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjE5OS1cdFx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMzI4PXN0YXRpYyB2b2lkIGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIzNjAtXHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIzNjE6XHRcdFx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjM2Mi1cdFx0XHRcdGlmICghSVNfRVJSKHBhdGgpKSB7XG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMTItXHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmM6MTExMzpcdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcbmZzL2V4dDQvaW5saW5lLmMtMTExNC1cdFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtMzYtXHRkb3duX3dyaXRlKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSk7XG5mcy9leHQ0L21pZ3JhdGUuYzozNzpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XG5mcy9leHQ0L21pZ3JhdGUuYy0zOC1cdGlmIChJU19FUlIocGF0aCkpIHtcbi0tXG5mcy9leHQ0L3Zlcml0eS5jPTI3MT1zdGF0aWMgaW50IGV4dDRfZ2V0X3Zlcml0eV9kZXNjcmlwdG9yX2xvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC92ZXJpdHkuYy0yOTMtXG5mcy9leHQ0L3Zlcml0eS5jOjI5NDpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsIDApO1xuZnMvZXh0NC92ZXJpdHkuYy0yOTUtXHRpZiAoSVNfRVJSKHBhdGgpKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMjYzOAoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDUxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2VybmVsIEJ1ZyBpbiBleHQ0IElubGluZSBEYXRhIEhhbmRsaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgZnVuY3Rpb24uIFRoZSBjb2RlIGZpcnN0IGNhbGxzIGBleHQ0X2ZpbmRfZXh0ZW50YCB3aGljaCBjYW4gcmV0dXJuIGFuIGVycm9yLCBzcGVjaWZpY2FsbHkgYEVSUl9QVFIoLUVOT01FTSlgLiBJZiB0aGF0IGhhcHBlbnMsIGBwYXRoYCBiZWNvbWVzIGFuIGVycm9yIHBvaW50ZXIuIFRoZW4sIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBpcyBjYWxsZWQsIGFuZCAqdGhhdCogaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LgoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcywgJiMzNDtBaGEhIERlcmVmZXJlbmNpbmcgYW4gZXJyb3IgcG9pbnRlciEgVGhhdCYjMzk7cyBhIGNsYXNzaWMuJiMzNDsgU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB0aGVuIHRyaWVzIHRvIGFjY2VzcyBgcGF0aFtkZXB0aF1gLiBUaGlzIHdvdWxkIGF0dGVtcHQgdG8gcmVhZCBmcm9tIG1lbW9yeSBsb2NhdGlvbnMgcmVsYXRlZCB0byBgRVJSX1BUUigtRU5PTUVNKWAsIHdoaWNoIGlzIGVzc2VudGlhbGx5IGFuIGludmFsaWQgbWVtb3J5IGFkZHJlc3Mg4oCTIGEgY3Jhc2ggd2FpdGluZyB0byBoYXBwZW4uIEl0JiMzOTtzIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLCBvciBhdCBsZWFzdCBhbiBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgY2xvc2UgdG8gdGhlIHRvcCBvZiBtZW1vcnkuIFRoaXMgd2lsbCBkZWZpbml0ZWx5IGJlIGNhdWdodCBieSBLQVNBTiBvciBjYXVzZSBhIHN0YW5kYXJkIGtlcm5lbCBvb3BzLCBub3QgYSBzdWJ0bGUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoLgoKQnV0IHdhaXQsIEkgbmVlZCB0byBjb25zaWRlciBhIGRpZmZlcmVudCBzY2VuYXJpby4gV2hhdCBpZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgKml0c2VsZiogcmV0dXJucyBhbiBlcnJvcj8gSSBzZWUgdGhlIGNvZGUgaXMgd3JpdHRlbiBpbiBhIHdheSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGlzICppZ25vcmVkKi4gTWVhbmluZyB0aGF0IGlmIGl0IGZhaWxzLCB0aGVuIHRoZSBvbGQgYHBhdGhgIGlzIHN0aWxsIGluIHVzZSEKCkFuZCBhIGZ1cnRoZXIgdGhvdWdodCEgQ2FuIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmcmVlIGBwYXRoYCBpbnRlcm5hbGx5PyBJZiBpdCBkb2VzLCBhbmQgcmV0dXJucyBhbiBlcnJvciwgdGhlbiB0aGUgb3JpZ2luYWwgYHBhdGhgIHBvaW50ZXIgd291bGQgYmUgZGFuZ2xpbmcuIE5vdyB0aGF0JiMzOTtzIGEgcHJvYmxlbS4gVGhhdCBjb3VsZCBsZWFkIHRvIGEgdXNlLWFmdGVyLWZyZWUsIG9yIGEgZG91YmxlLWZyZWUsIGRlcGVuZGluZyBvbiBob3cgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGlzIGltcGxlbWVudGVkLiBJIG5lZWQgdG8gZGl2ZSBkZWVwZXIgYW5kIGV4YW1pbmUgdGhlIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmdW5jdGlvbiBpdHNlbGYgdG8gc2VlIGlmIGl0IGRvZXMgaW5kZWVkIGZyZWUgdGhlIGBwYXRoYCB1bmRlciBhbnkgZXJyb3IgY29uZGl0aW9ucy4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgcmVhbCB2dWxuZXJhYmlsaXR5IGxpZXMuIFRoaXMgaXMgYSBjcml0aWNhbCBjb2RlIHBhdGgsIGFuZCBJJiMzOTttIGdvaW5nIHRvIHRyYWNrIHRoYXQgZnVuY3Rpb24gY2FsbCBkb3duIHRvIGVuc3VyZSBJJiMzOTttIGdldHRpbmcgdGhlIHdob2xlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZXh0X2Ryb3BfcmVmcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dGVudHMuYz0xMDU9c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3BhdGhfYnJlbHNlKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTExMC1cbmZzL2V4dDQvZXh0ZW50cy5jOjExMTpzdGF0aWMgdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG5mcy9leHQ0L2V4dGVudHMuYy0xMTIte1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTEyMj12b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xMjUtXHRcdHJldHVybjtcbmZzL2V4dDQvZXh0ZW50cy5jOjEyNjpcdGV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTEyNy1cdGtmcmVlKHBhdGgpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTg4Nj1leHQ0X2ZpbmRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGJsb2NrLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTkwOS1cdGlmIChwYXRoKSB7XG5mcy9leHQ0L2V4dGVudHMuYzo5MTA6XHRcdGV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTkxMS1cdFx0aWYgKGRlcHRoIFx1MDAzZSBwYXRoWzBdLnBfbWF4ZGVwdGgpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTYgMTY6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM5ODYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBNZW1vcnkgTGVha3MgaW4gRXh0NCBFeHRlbnQgSW5zZXJ0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmdW5jdGlvbiBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBgc3RydWN0IGV4dDRfZXh0X3BhdGggKmAgaXQgd29ya3Mgd2l0aC4gTXkgaW5pdGlhbCBjb25jZXJuIGlzIG1lbW9yeSBsZWFrcywgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYHBhdGhgIHBvaW50ZXIuIElmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmYWlscywgdGhlcmUmIzM5O3MgYSBwb3NzaWJpbGl0eSBpdCBjYWxscyBgZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpYC4gVGhlIHRyaWNreSBwYXJ0IGlzLCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgKnJldHVybnMqIGEgYHN0cnVjdCBleHQ0X2V4dF9wYXRoICpgLgoKU28sIHRoZSBxdWVzdGlvbiBpcywgZG9lcyBhIGNhbGxlciB3aG8gKmRvZXNuJiMzOTt0KiB1c2UgdGhlIHJldHVybiB2YWx1ZSBhbmQgKmRvZXMqIGhhdmUgYHBhdGhgIGZyZWVkIGJ5IGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBsZWFrIG1lbW9yeT8gTm8sIHRoYXQmIzM5O3Mgbm90IHJpZ2h0LCBpZiBpdCBmcmVlcyBgcGF0aGAsIGl0JiMzOTtzIGZyZWVkLgoKSG93ZXZlciwgdGhlIGNvZGUgaW4gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBpcyB3aGF0IHRyaWdnZXJlZCB0aGlzIHRob3VnaHQgcHJvY2VzcywgYmVjYXVzZSBpdCBjYWxscyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgYW5kICpjb21wbGV0ZWx5IGlnbm9yZXMqIHRoZSByZXR1cm4gdmFsdWUhIEkmIzM5O20gc2VlaW5nIHRoaXM6CgpgYGBjCgkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTsKCQlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7CgoJCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7CgkJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTsKCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJmFtcDtuZXdleCwgYmxvY2spOwoJCWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJmFtcDtuZXdleCwgMCk7CmBgYAoKT2theSwgYGV4dDRfZmluZF9leHRlbnRgIHdpbGwgYWxsb2NhdGUgYHBhdGhgIGJlY2F1c2UgdGhlIGNhbGxlciBpcyBwYXNzaW5nIGBOVUxMYC4gU28sIGBwYXRoYCBpcyBpbml0aWFsbHkgYWxsb2NhdGVkLiBUaGVuLCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgaXMgY2FsbGVkLiBJdCAqbWlnaHQqIGZyZWUgYW5kIHJldHVybiBhIG5ldyBwYXRoLCBpdCBtaWdodCByZXR1cm4gdGhlIHNhbWUgcGF0aCwgb3IgaXQgbWlnaHQgcmV0dXJuIGFuIGVycm9yLgoKVGhlIHByb2JsZW0gaXMsIGlmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBzdWNjZWVkcywgaXQgKnJldHVybnMqIGBwYXRoYCwgd2hpY2ggY291bGQgYmUgcmVhbGxvY2F0ZWQgb3IgdGhlIG9yaWdpbmFsIHBhdGguIEJ1dCB0aGUgY29kZSAqY29tcGxldGVseSogaWdub3JlcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgISBBbmQsIGNydWNpYWxseSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGZyZWVzIGBwYXRoYCBpbiAqYW55KiBjYXNlIHdoZW4gaXQgcmV0dXJucyBzdWNjZXNzZnVsbHkhIFRoaXMgbG9va3MgbGlrZSBhIGRlZmluaXRlIHBvdGVudGlhbCBsZWFrLiBJIG5lZWQgdG8gZGlnIGludG8gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIHRvIGJlIHN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIxMDA6XHRcbjIxMDE6XHRcdC8qIHByb2JhYmx5IG5leHQgbGVhZiBoYXMgc3BhY2UgZm9yIHVzPyAqL1xuMjEwMjpcdFx0ZmV4ID0gRVhUX0xBU1RfRVhURU5UKGVoKTtcbjIxMDM6XHRcdG5leHQgPSBFWFRfTUFYX0JMT0NLUztcbjIxMDQ6XHRcdGlmIChsZTMyX3RvX2NwdShuZXdleHQtXHUwMDNlZWVfYmxvY2spIFx1MDAzZSBsZTMyX3RvX2NwdShmZXgtXHUwMDNlZWVfYmxvY2spKVxuMjEwNTpcdFx0XHRuZXh0ID0gZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHBhdGgpO1xuMjEwNjpcdFx0aWYgKG5leHQgIT0gRVhUX01BWF9CTE9DS1MpIHtcbjIxMDc6XHRcdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKm5wYXRoO1xuMjEwODpcdFxuMjEwOTpcdFx0XHRleHRfZGVidWcoaW5vZGUsIFwmIzM0O25leHQgbGVhZiBibG9jayAtICV1XFxuXCYjMzQ7LCBuZXh0KTtcbjIxMTA6XHRcdFx0bnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMLCBnYl9mbGFncyk7XG4yMTExOlx0XHRcdGlmIChJU19FUlIobnBhdGgpKSB7XG4yMTEyOlx0XHRcdFx0ZXJyID0gUFRSX0VSUihucGF0aCk7XG4yMTEzOlx0XHRcdFx0Z290byBlcnJvdXQ7XG4yMTE0Olx0XHRcdH1cbjIxMTU6XHRcdFx0QlVHX09OKG5wYXRoLVx1MDAzZXBfZGVwdGggIT0gcGF0aC1cdTAwM2VwX2RlcHRoKTtcbjIxMTY6XHRcdFx0ZWggPSBucGF0aFtkZXB0aF0ucF9oZHI7XG4yMTE3Olx0XHRcdGlmIChsZTE2X3RvX2NwdShlaC1cdTAwM2VlaF9lbnRyaWVzKSBcdTAwM2MgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfbWF4KSkge1xuMjExODpcdFx0XHRcdGV4dF9kZWJ1Zyhpbm9kZSwgXCYjMzQ7bmV4dCBsZWFmIGlzbiYjMzk7dCBmdWxsKCVkKVxcblwmIzM0OyxcbjIxMTk6XHRcdFx0XHRcdCAgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfZW50cmllcykpO1xuMjEyMDpcdFx0XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbjIxMjE6XHRcdFx0XHRwYXRoID0gbnBhdGg7XG4yMTIyOlx0XHRcdFx0Z290byBoYXNfc3BhY2U7XG4yMTIzOlx0XHRcdH1cbjIxMjQ6XHRcdFx0ZXh0X2RlYnVnKGlub2RlLCBcJiMzNDtuZXh0IGxlYWYgaGFzIG5vIGZyZWUgc3BhY2UoJWQsJWQpXFxuXCYjMzQ7LFxuMjEyNTpcdFx0XHRcdCAgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfZW50cmllcyksIGxlMTZfdG9fY3B1KGVoLVx1MDAzZWVoX21heCkpO1xuMjEyNjpcdFx0XHRleHQ0X2ZyZWVfZXh0X3BhdGgobnBhdGgpO1xuMjEyNzpcdFx0fVxuMjEyODpcdFxuMjEyOTpcdFx0LypcbjIxMzA6XHRcdCAqIFRoZXJlIGlzIG5vIGZyZWUgc3BhY2UgaW4gdGhlIGZvdW5kIGxlYWYuXG4yMTMxOlx0XHQgKiBXZSYjMzk7cmUgZ29ubmEgYWRkIGEgbmV3IGxlYWYgaW4gdGhlIHRyZWUuXG4yMTMyOlx0XHQgKi9cbjIxMzM6XHRcdGlmIChnYl9mbGFncyBcdTAwMjYgRVhUNF9HRVRfQkxPQ0tTX01FVEFEQVRBX05PRkFJTClcbjIxMzQ6XHRcdFx0bWJfZmxhZ3MgfD0gRVhUNF9NQl9VU0VfUkVTRVJWRUQ7XG4yMTM1Olx0XHRwYXRoID0gZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZSwgaW5vZGUsIG1iX2ZsYWdzLCBnYl9mbGFncyxcbjIxMzY6XHRcdFx0XHRcdFx0cGF0aCwgbmV3ZXh0KTtcbjIxMzc6XHRcdGlmIChJU19FUlIocGF0aCkpXG4yMTM4Olx0XHRcdHJldHVybiBwYXRoO1xuMjEzOTpcdFx0ZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpO1xuMjE0MDpcdFx0ZWggPSBwYXRoW2RlcHRoXS5wX2hkcjtcbjIxNDE6XHRcbjIxNDI6XHRoYXNfc3BhY2U6XG4yMTQzOlx0XHRuZWFyZXggPSBwYXRoW2RlcHRoXS5wX2V4dDtcbjIxNDQ6XHRcbjIxNDU6XHRcdGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCAmIzQzOyBkZXB0aCk7XG4yMTQ2Olx0XHRpZiAoZXJyKVxuMjE0NzpcdFx0XHRnb3RvIGVycm91dDtcbjIxNDg6XHRcbjIxNDk6XHRcdGlmICghbmVhcmV4KSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1ODUxCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgUGF0aCBIYW5kbGluZyoqCgpSaWdodCwgbGV0IG1lIHNlZS4uLiBJJiMzOTttIGxvb2tpbmcgYXQgaG93IGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBtYW5hZ2VzIHRoZSBgcGF0aGAgdmFyaWFibGUuIEl0JiMzOTtzIGJlY29taW5nIGNsZWFyIHRoYXQgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBpbnRlcmVzdGluZyBtZW1vcnkgbWFuYWdlbWVudCBiZWhhdmlvcnMsIHNwZWNpZmljYWxseSBzdXJyb3VuZGluZyB0aGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIG9mIGBwYXRoYCBhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byBgbnBhdGhgLiAgSSYjMzk7bSBub3RpbmcgdGhhdCB0aGVyZSBhcmUgdHdvIHByaW1hcnkgcGF0aHMsIG9yIG91dGNvbWVzLCBmb3IgYHBhdGhgLiBFaXRoZXIgYHBhdGhgIGdldHMgZnJlZWQgYW5kIGBucGF0aGAgKHdoaWNoIGlzIGEgbmV3IGFsbG9jYXRpb24pIGlzIHJldHVybmVkLCBvciB0aGUgb3JpZ2luYWwgYHBhdGhgIGdldHMgcmV0dXJuZWQgYWZ0ZXIgY3JlYXRpb24gb2YgYSBuZXcgbGVhZiB0aHJvdWdoIGBleHQ0X2V4dF9jcmVhdGVfbmV3X2xlYWZgLiBJIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBlYWNoIHNjZW5hcmlvIHBsYXlzIG91dCwgYXMgdGhpcyBpcyBhIHBvdGVudGlhbCBzb3VyY2UgZm9yIHN1YnRsZSBtZW1vcnkgZXJyb3JzIGlmIG5vdCBoYW5kbGVkIHByZWNpc2VseS4gSW4gcGFydGljdWxhciwgSSBtdXN0IGludmVzdGlnYXRlIHRoZSBpbXBsaWNhdGlvbnMgdGhpcyBoYXMgZm9yIGV4dGVybmFsIGNhbGxlcnMgb2YgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgLiBOb3csIHRvIGNvbnNpZGVyIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMgb2YgdGhpcyBiZWhhdmlvci4gSSYjMzk7bGwgbmVlZCB0byBleGFtaW5lIHRoZSBmdW5jdGlvbiYjMzk7cyBpbnRlcm5hbCBsb2dpYywgZXNwZWNpYWxseSBhcm91bmQgdGhlIHJldHVybiB2YWx1ZXMsIHRvIGVuc3VyZSB0aGUgY29kZSYjMzk7cyBpbnRlZ3JpdHkgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQgcmVtYWluIHNwb3Qtb24uIEkgc2hvdWxkIG5vdGUgdGhlIGZpbmFsIHN0YXRlcyBvZiB0aGUgYHBhdGhgIGFuZCBgbnBhdGhgIHZhcmlhYmxlcyBhZnRlciB0aGUgZnVuY3Rpb24gY29tcGxldGVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0ZW50cy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjIwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjAwOlx0bWVyZ2U6XG4yMjAxOlx0XHQvKiB0cnkgdG8gbWVyZ2UgZXh0ZW50cyAqL1xuMjIwMjpcdFx0aWYgKCEoZ2JfZmxhZ3MgXHUwMDI2IEVYVDRfR0VUX0JMT0NLU19TUExJVF9OT01FUkdFKSlcbjIyMDM6XHRcdFx0ZXh0NF9leHRfdHJ5X3RvX21lcmdlKGhhbmRsZSwgaW5vZGUsIHBhdGgsIG5lYXJleCk7XG4yMjA0Olx0XG4yMjA1Olx0XHQvKiB0aW1lIHRvIGNvcnJlY3QgYWxsIGluZGV4ZXMgYWJvdmUgKi9cbjIyMDY6XHRcdGVyciA9IGV4dDRfZXh0X2NvcnJlY3RfaW5kZXhlcyhoYW5kbGUsIGlub2RlLCBwYXRoKTtcbjIyMDc6XHRcdGlmIChlcnIpXG4yMjA4Olx0XHRcdGdvdG8gZXJyb3V0O1xuMjIwOTpcdFxuMjIxMDpcdFx0ZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCAmIzQzOyBwYXRoLVx1MDAzZXBfZGVwdGgpO1xuMjIxMTpcdFx0aWYgKGVycilcbjIyMTI6XHRcdFx0Z290byBlcnJvdXQ7XG4yMjEzOlx0XG4yMjE0Olx0XHRyZXR1cm4gcGF0aDtcbjIyMTU6XHRcbjIyMTY6XHRlcnJvdXQ6XG4yMjE3Olx0XHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XG4yMjE4Olx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuMjIxOTpcdH1cbjIyMjA6XHRcbjIyMjE6XHRzdGF0aWMgaW50IGV4dDRfZmlsbF9lc19jYWNoZV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4yMjIyOlx0XHRcdFx0XHQgICBleHQ0X2xibGtfdCBibG9jaywgZXh0NF9sYmxrX3QgbnVtLFxuMjIyMzpcdFx0XHRcdFx0ICAgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbylcbjIyMjQ6XHR7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM2NjE4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjIwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBFeHQ0IElubGluZSBEYXRhIENvbnZlcnNpb24gYW5kIEV4dGVudCBIYW5kbGluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgaGFzIGEgbWVtb3J5IGxlYWsuIEl0IHJldHVybnMgYSBwYXRoIG9uIHN1Y2Nlc3MgYW5kIGZyZWVzIHRoZSBwYXRoLCB3aGljaCBtZWFucyB0aGUgY2FsbGVyIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4gSG93ZXZlciwgdGhlIGNhbGxlciBpbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGRvZXNuJiMzOTt0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGFuZCAqZG9lc24mIzM5O3QqIGZyZWUgYHBhdGhgIGFmdGVyIGEgc3VjY2Vzc2Z1bCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgY2FsbC4gVGhpcyBjcmVhdGVzIGEgbWVtb3J5IGxlYWsgYmVjYXVzZSBwYXRoIHdpbGwgbmV2ZXIgYmUgZnJlZWQuIFRoZSBxdWVzdGlvbiBpcywgd291bGQgS01TQU4gY2F0Y2ggdGhpcz8gTm8sIGl0IGNhdGNoZXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtNRU1MRUFLLCBob3dldmVyLCB3aWxsIGNhdGNoIG1lbW9yeSBsZWFrcy4KCkJ1dCwgYSBzZWNvbmQgdGhvdWdodCBpcyB0aGUgY29kZS4gTGV0JiMzOTtzIHRyYWNlIGl0IGNhcmVmdWxseS4gV2FpdCwgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlciwgdGhlIGNvZGUgd291bGQgZGVyZWZlcmVuY2UgaXQgaW4gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgLiBUaGF0IHdvdWxkIGJlIGEgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlLCB3aGljaCBpcyBhbiBpbW1lZGlhdGUgY3Jhc2ggdGhhdCBLQVNBTiBvciB0aGUga2VybmVsJiMzOTtzIG9vcHMgZGV0ZWN0aW9uIHNob3VsZCBjYXRjaC4KCk1vdmluZyBvbiB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIEkgbmVlZCB0byBzY3J1dGluaXplIGl0IGZvciBwb3NzaWJsZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gRmlyc3QsIGl0IGFsbG9jYXRlcyBhIGJ1ZmZlciBgYnVmYCBhbmQgcmVhZHMgaW5saW5lIGRhdGEgaW50byBpdC4gVGhlIHBvdGVudGlhbCBpc3N1ZSBJIHNlZSBpcyB0aGF0IGlmIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIHJldHVybnMgZmV3ZXIgYnl0ZXMgdGhhbiBleHBlY3RlZCwgdGhlbiBwYXJ0cyBvZiBgYnVmYCBhcmUgbGVmdCB1bmluaXRpYWxpemVkLiBIb3dldmVyLCB0aGUgY29kZSYjMzk7cyBsb2dpYyBpcyB0aGF0IHRoZSBgaW5saW5lX3NpemVgIGlzIGJhc2VkIG9uIHRoZSBkYXRhIHRvIGJlIGNvcGllZCwgc28gaXQgc2hvdWxkIGJlIGltcG9zc2libGUgdG8gcmVhZCBsZXNzIHRoYW4gdGhlIGV4cGVjdGVkIHNpemUuCgpCdXQgd2FpdCwgd2hhdCBpZiB0aGUgaW5vZGUgaXMgYSBkaXJlY3Rvcnk/IFRoZSBwYXRjaCBpcyBpbXBvcnRhbnQgaW4gY29udGV4dCwgYmVjYXVzZSB0aGUgb3JpZ2luYWwgY29kZSAqZG9lcyBub3QqIGNvcHkgZGF0YSBpbnRvIGBkYXRhX2JoLSZndDtiX2RhdGFgIGlmIGBTX0lTRElSKGlub2RlLSZndDtpX21vZGUpYCBpcyB0cnVlLiBJbnN0ZWFkLCBpdCBjYWxscyBgZXh0NF91cGRhdGVfaW5saW5lX2RpcmAuIEkgc2hvdWxkIGNoZWNrIGlmIHRoZSBtb2RpZmljYXRpb24gdG8gdGhhdCBzZWN0aW9uIG9mIGNvZGUgaXMgaW1wb3J0YW50LiBUaGUgcGF0Y2ggZG9lc24mIzM5O3Qgc2hvdyBtb2RpZmljYXRpb24gdG8gaXQsIGJ1dCBpdCYjMzk7cyBjYWxsZWQgYW55d2F5LgoKT2theSwgbGV0IG1lIGdvIGNoZWNrIHRoZSBvcmlnaW5hbCBjb2RlIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNTA6XHRcdGlmICghYnVmKSB7XG4xMTUxOlx0XHRcdGVycm9yID0gLUVOT01FTTtcbjExNTI6XHRcdFx0Z290byBvdXQ7XG4xMTUzOlx0XHR9XG4xMTU0Olx0XG4xMTU1Olx0XHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XG4xMTU2Olx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTU3Olx0XHRcdGdvdG8gb3V0O1xuMTE1ODpcdFxuMTE1OTpcdFx0LypcbjExNjA6XHRcdCAqIE1ha2Ugc3VyZSB0aGUgaW5saW5lIGRpcmVjdG9yeSBlbnRyaWVzIHBhc3MgY2hlY2tzIGJlZm9yZSB3ZSB0cnkgdG9cbjExNjE6XHRcdCAqIGNvbnZlcnQgdGhlbSwgc28gdGhhdCB3ZSBhdm9pZCB0b3VjaGluZyBzdHVmZiB0aGF0IG5lZWRzIGZzY2suXG4xMTYyOlx0XHQgKi9cbjExNjM6XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbjExNjQ6XHRcdFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cdTAwM2ViaCxcbjExNjU6XHRcdFx0XHRcdFx0YnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTE2NjpcdFx0XHRcdFx0XHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbjExNjc6XHRcdFx0aWYgKGVycm9yKVxuMTE2ODpcdFx0XHRcdGdvdG8gb3V0O1xuMTE2OTpcdFx0fVxuMTE3MDpcdFxuMTE3MTpcdFx0bWVtc2V0KFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcbjExNzI6XHRcdGFyLmlub2RlID0gaW5vZGU7XG4xMTczOlx0XHRhci5sb2dpY2FsID0gMDtcbjExNzQ6XHRcdGFyLmxlbiA9IDE7XG4xMTc1Olx0XHRpZiAoU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpKVxuMTE3NjpcdFx0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuMTE3NzpcdFx0ZWxzZVxuMTE3ODpcdFx0XHRhci5mbGFncyA9IDA7XG4xMTc5Olx0XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4xMTgwOlx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMTgxOlx0XHRcdGdvdG8gb3V0O1xuMTE4MjpcdFxuMTE4MzpcdFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4xMTg0Olx0XHRpZiAoIWRhdGFfYmgpIHtcbjExODU6XHRcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuMTE4NjpcdFx0XHRnb3RvIG91dF9iaDtcbjExODc6XHRcdH1cbjExODg6XHRcbjExODk6XHRcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTE5MDpcdFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBkYXRhX2JoLFxuMTE5MTpcdFx0XHRcdFx0XHQgICAgICAgRVhUNF9KVFJfTk9ORSk7XG4xMTkyOlx0XHRpZiAoZXJyb3IpIHtcbjExOTM6XHRcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbjExOTQ6XHRcdFx0ZXJyb3IgPSAtRUlPO1xuMTE5NTpcdFx0XHRnb3RvIG91dF9iaDtcbjExOTY6XHRcdH1cbjExOTc6XHRcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4xMTk4Olx0XG4xMTk5Olx0XHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDA3OAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHByb2Nlc3NpbmcgdGhlIGNvZGU6CgoqKkRpdmluZyBpbnRvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24mIzM5O3Mgcm9sZSBpbiB0aGUgbGFyZ2VyIHBpY3R1cmUgb2YgdGhlIGV4dDQgZmlsZXN5c3RlbS4gSSYjMzk7bSBhc3N1bWluZyB0aGlzIGlzIGFib3V0IGhhbmRsaW5nIGlubGluZSBkYXRhLCB3aGljaCBpcyBlc3NlbnRpYWxseSBzdG9yaW5nIGZpbGUgY29udGVudCBkaXJlY3RseSB3aXRoaW4gdGhlIGlub2RlIGl0c2VsZiwgcmlnaHQ/IFRoYXQmIzM5O3MgYW4gb3B0aW1pemF0aW9uIHRvIHJlZHVjZSBkaXNrIEkvTywgc28gaXQmIzM5O3MgaW50ZXJlc3RpbmcuIFRoZSBgX25vbG9ja2Agc3VmZml4IHN1Z2dlc3RzIHRoaXMgaXMgbGlrZWx5IGJlaW5nIGNhbGxlZCBmcm9tIGNvZGUgdGhhdCBhbHJlYWR5IGhhcyB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcgZG9uZS4gR29vZCwgdGhhdCBzaW1wbGlmaWVzIHRoaW5ncyBhIGJpdC4gSSBjYW4gZm9jdXMgb24gdGhlIGNvcmUgbG9naWMgdGhlbi4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdHJpZ2dlcnMgdGhpcyBjb252ZXJzaW9uLCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCBoYXBwZW5zLCBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKmRvaW5nKiB0byBtYWtlIHRoYXQgY29udmVyc2lvbi4gSSBuZWVkIHRvIHRyYWNlIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIHNlZSBob3cgdGhlIGlub2RlIGFuZCB0aGUgb24tZGlzayBmb3JtYXQgYXJlIGNoYW5nZWQsIGFuZCBvZiBjb3Vyc2UsIGVuc3VyZSBjb25zaXN0ZW5jeSB0aHJvdWdob3V0IHRoZSBwcm9jZXNzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGhhbmRsZXMgZXJyb3JzIGFuZCBwYXJ0aWFsIGNvbnZlcnNpb25zLCBwYXJ0aWN1bGFybHkgZm9yIHBvd2VyLWZhaWwgc2NlbmFyaW9zLiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBmYWlscyBoYWxmd2F5IHRocm91Z2g/IEhvdyBkb2VzIGl0IG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGVzeXN0ZW0/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBob3cgZG8gdGhleSBlbnN1cmUgdGhhdCB0aGUgY29udmVyc2lvbiBpcyBhdG9taWMgZnJvbSB0aGUgdXNlciYjMzk7cyBwZXJzcGVjdGl2ZSwgZXZlbiBpZiB1bmRlciB0aGUgaG9vZCwgdGhlcmUgYXJlIGEgc2VyaWVzIG9mIHN0ZXBzIHRvIGFjaGlldmUgdGhpcy4gTm93LCBsZXQmIzM5O3Mgc2VlIHdoZXJlIHRvIGJlZ2luLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pbmxpbmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTIwMDpcdFx0XHRtZW1jcHkoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpO1xuMTIwMTpcdFx0XHRzZXRfYnVmZmVyX3VwdG9kYXRlKGRhdGFfYmgpO1xuMTIwMjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTIwMzpcdFx0XHRlcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSxcbjEyMDQ6XHRcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4xMjA1Olx0XHR9IGVsc2Uge1xuMTIwNjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTIwNzpcdFx0XHRpbm9kZS1cdTAwM2VpX3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuMTIwODpcdFx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuMTIwOTpcdFx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuMTIxMDpcdFxuMTIxMTpcdFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuMTIxMjpcdFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuMTIxMzpcdFx0XHRcdCAgYnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTIxNDpcdFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4xMjE1Olx0XHRcdGlmICghZXJyb3IpXG4xMjE2Olx0XHRcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XG4xMjE3Olx0XHR9XG4xMjE4Olx0XG4xMjE5Olx0XHRpZiAoZXJyb3IpXG4xMjIwOlx0XHRcdGdvdG8gb3V0X2JoO1xuMTIyMTpcdFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBuZXdibG9jaywgYXIubGVuKTtcbjEyMjI6XHRvdXRfYmg6XG4xMjIzOlx0XHRpZiAoZXJyb3IpXG4xMjI0Olx0XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFyLmxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuMTIyNTpcdFx0YnJlbHNlKGRhdGFfYmgpO1xuMTIyNjpcdG91dDpcbjEyMjc6XHRcdGtmcmVlKGJ1Zik7XG4xMjI4Olx0XHRyZXR1cm4gZXJyb3I7XG4xMjI5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDk4MQoJCQkJCQkJb3V0cHV0OiAyNjIKCQkJCQkJCXRob3VnaHRzOiAyNjQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoKioKCk9rYXksIGxldCBtZSB3YWxrIHRocm91Z2ggdGhpcy4gSSBzZWUgdGhhdCBpZiBpdCYjMzk7cyBhIGRpcmVjdG9yeSwgYGV4dDRfaW5pdF9kaXJibG9ja2AgaXMgY2FsbGVkIHdpdGggYGJ1ZmAuIEJ1dCBgYnVmYCBpcyBpbml0aWFsaXplZCBieSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgc28gdGhhdCYjMzk7cyBmaW5lOyBpdCYjMzk7cyBmdWxseSBpbml0aWFsaXplZC4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLgoKV2FpdCwgd2hhdCBhYm91dCBwb3RlbnRpYWwgZXJyb3JzIGluIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgPyBJZiBpdCBmYWlscywgaXQgZ29lcyB0byBgb3V0YCwgd2hpY2ggZnJlZXMgYGJ1ZmAuIE9rYXksIHN0aWxsIHNhZmUuCgpXaGF0IGlmIGl0IHJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSwgbGVzcyB0aGFuIHRoZSBgaW5saW5lX3NpemVgPyBJIHJlbWVtYmVyIG15IHByZXZpb3VzIGFuYWx5c2lzLCB0aGF0IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIGdvaW5nIHRvIHJldHVybiB0aGUgcmlnaHQgc2l6ZS4gYGlubGluZV9zaXplYCBpcyBjYWxjdWxhdGVkIHdpdGggYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgLiBTbywgSSYjMzk7bSBzdXJlIGl0JiMzOTtsbCByZXR1cm4gdGhlIGV4cGVjdGVkIHNpemUuIEV2ZW4gaWYgdGhlIHNpemUgb2YgYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgIGlzIGNvcnJ1cHQsIGBpbmxpbmVfc2l6ZWAgaXMgYWx3YXlzIGNvbnNpc3RlbnQgYmVjYXVzZSBpdCYjMzk7cyBjYWxjdWxhdGVkIGZyb20gdGhlIGBlbnRyeS0mZ3Q7ZV92YWx1ZV9zaXplYC4gQnV0LCB3aGF0IGlmIHRoZXJlJiMzOTtzIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24gdG8gYGVudHJ5LSZndDtlX3ZhbHVlX3NpemVgPyBOb3BlLCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIHdpdGggYSBsb2NrIGhlbGQuIEkmIzM5O20gY2VydGFpbiB0aGF0IHRoZSBpbmxpbmUgZGF0YSBpcyBub3QgY29uY3VycmVudGx5IG1vZGlmaWVkLiBBbmQgZXZlbiBpZiBpdCB3ZXJlLCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB3b3VsZCBqdXN0IGNvcHkgZmV3ZXIgYnl0ZXMsIGxlYXZpbmcgdGhlIHJlc3Qgb2YgYGJ1ZmAgdW5pbml0aWFsaXplZC4gQnV0LCBpcyB0aGlzIGEgS01TQU4tc3BlY2lmaWMgaXNzdWU/IElmIGl0JiMzOTtzIHBhcnRpYWxseSB1bmluaXRpYWxpemVkIGFuZCB3cml0dGVuIHRvIGRpc2ssIGl0JiMzOTtzIGFuIGluZm8tbGVhayB0byBkaXNrLiBCdXQgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AsIHdoaWNoIGRvZXNuJiMzOTt0IHplcm8gd2l0aG91dCB0aGUgYF9fR0ZQX1pFUk9gIGZsYWcuIEJ1dCwgaGVyZSwgSSYjMzk7bSBzdXJlIHRoYXQgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgc2hvdWxkIHJldHVybiBmZXdlciBieXRlcywgYmVjYXVzZSBgaW5saW5lX3NpemVgIGlzIGV4YWN0bHkgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhLgoKQWxyaWdodCwgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIHBhdGNoIGl0c2VsZiBhZ2Fpbi4gVGhlIHBhdGNoIGlzIGNoYW5naW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBhbGxvY2F0ZSB0aGUgYmxvY2sgZmlyc3QsIHRoZW4gY29weSB0aGUgZGF0YSwgdGhlbiBzZXQgdGhlIGlubGluZSBkYXRhIGJsb2NrLiBJdCB1c2VkIHRvIGNhbGwgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLCB0aGVuIGBleHQ0X21hcF9ibG9ja3NgLiBUaGUgY3JpdGljYWwgcG9pbnQgaXMgaWYgYGV4dDRfbWFwX2Jsb2Nrc2AgZmFpbGVkLCBpdCBjYWxsZWQgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIHByb2JsZW0gbGF5OiBpZiBgZXh0NF9jcmVhdGVfaW5saW5lX2RhdGFgIGZhaWxlZCwgaXQgcHJpbnRlZCBhbiBlcnJvciBhbmQgcmV0dXJuZWQhIERhdGEgbG9zcyEgVGhlIG5ldyBjb2RlIGFsbG9jYXRlcyB0aGUgYmxvY2ssIGFuZCBvbmx5IGlmIHRoYXQgc3VjY2VlZHMsIGl0IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhLiBUaGlzIGlzIGFib3V0IHByZXZlbnRpbmcgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24sIG5vdCB1bmluaXRpYWxpemVkIG1lbW9yeS4KCklzIHRoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2A/IE5vLiBUaGUgY29kZSB1c2VzIGBtZW1zZXRgIHRvIHplcm8gYGlfYmxvY2tgIGFuZCBgaV9kYXRhYC4gVGhlbiBpdCBpbml0aWFsaXplcyBgbmV3ZXhgIGFuZCBjYWxscyBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYC4gQXMgSSB2ZXJpZmllZCwgdGhhdCBpbml0aWFsaXplcyBpdC4KCkFyZSB0aGVyZSBhbnkgb3RoZXIgc3RydWN0cz8gTGV0IG1lIHNlZS4gYGV4dDRfeGF0dHJfaWJvZHlfZmluZGAgYW5kIGBleHQ0X3hhdHRyX2luZm9gLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBleHBsaWNpdCB6ZXJvaW5nLiBPa2F5LCBhbGwgZ29vZC4gV2hhdCBhYm91dCBgYXJgPyBgbWVtc2V0YCBpcyBjYWxsZWQgb24gdGhhdDsgaXQmIzM5O3MgZnVsbHkgemVyb2VkLiBTbywgdGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZC4gSXQgZml4ZXMgdGhlIGRhdGEgbG9zcyBieSBhbGxvY2F0aW5nIHRoZSBibG9jayBmaXJzdC4KCklzIHRoZXJlIGFuIGluZm8tbGVhaz8gTm8sIGBkYXRhX2JoLSZndDtiX2RhdGFgIGlzIHplcm9lZCBiZWZvcmUgdGhlIGNvcHksIGFuZCBgYnVmYCBpcyBmdWxseSBpbml0aWFsaXplZC4KClNvLCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIEl0IGZpeGVzIGEgbG9naWMgLyBlcnJvciBoYW5kbGluZyBidWcgdGhhdCBjb3VsZCBsZWFkIHRvIGRhdGEgbG9zcyBvciBjb3JydXB0aW9uLiBTdGFuZGFyZCB0ZXN0aW5nLCBLQVNBTiwgb3Igc3l6a2FsbGVyIHdvdWxkIGNhdGNoIHRoaXMuIE5vIG5lZWQgZm9yIEtNU0FOLgoKSG9sZCBvbiwgbGV0IG1lIGRvdWJsZS1jaGVjayBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgYW5kIGBuZXdleGAuIGBuZXdleGAgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgYW5kIGhhcyA0IGZpZWxkczogYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2AuIEFsbCBvZiB0aGVtIGFyZSBpbml0aWFsaXplZCwgYW5kIHRoZXJlJiMzOTtzIG5vIHBhZGRpbmcuIE9rYXksIHRoYXQmIzM5O3MgY2xlYXIuCgpPa2F5LCBsZXQgbWUgZG91YmxlIGNoZWNrIHRoZSBzdHJ1Y3R1cmVzIGFnYWluLCBgZXh0NF94YXR0cl9pYm9keV9maW5kYCBhbmQgYGV4dDRfeGF0dHJfaW5mb2AuIGBleHQ0X3hhdHRyX2lib2R5X2ZpbmRgIGluaXRpYWxpemVkIGBpcy5zLm5vdF9mb3VuZGAgdG8gMCwgd2hpY2ggemVyb2VzIHRoZSBzdHJ1Y3QuIGBleHQ0X3hhdHRyX2luZm9gIGZ1bGx5IGluaXRpYWxpemVzIGFsbCBmaWVsZHMuCgpZdXAsIHRoZXJlJiMzOTtzIGFic29sdXRlbHkgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaGVyZS4KCkkmIzM5O20gc2V0dGluZyBOZWVkc0tNU0FOIHRvIGZhbHNlIGFuZCBnaXZpbmcgdGhlIHJlYXNvbmluZy4KClJlYXNvbmluZzogVGhpcyBwYXRjaCBtb2RpZmllcyB0aGUKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNiAxNjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIGJsb2NrIGFsbG9jYXRpb24gb3JkZXIgaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIHRvIHByZXZlbnQgcG90ZW50aWFsIGRhdGEgbG9zcyB3aGVuIGNvbnZlcnRpbmcgaW5saW5lIGRhdGEgdG8gYSBibG9jay4gUHJldmlvdXNseSwgaWYgYmxvY2sgYWxsb2NhdGlvbiBmYWlsZWQsIGl0IGF0dGVtcHRlZCB0byByZXN0b3JlIHRoZSBpbmxpbmUgZGF0YSwgd2hpY2ggY291bGQgZmFpbCBhbmQgY2F1c2UgZGF0YSBsb3NzLiBUaGUgbmV3IGxvZ2ljIGFsbG9jYXRlcyB0aGUgYmxvY2sgZmlyc3QgYW5kIG9ubHkgcmVtb3ZlcyB0aGUgaW5saW5lIGRhdGEgdXBvbiBzdWNjZXNzLlxuXG5BbGwgc3RydWN0dXJlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoZSBwYXRjaCAoYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgb3IgZXhwbGljaXRseSB6ZXJvZWQgKHZpYSBgbWVtc2V0YCBvciBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHdoaWNoIHplcm9lcyB0aGUgcmVzdCkuIFRoZSBidWZmZXIgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBpcyBleHBsaWNpdGx5IHplcm9lZCBiZWZvcmUgY29weWluZyB0aGUgaW5saW5lIGRhdGEuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgcGFkZGluZyBsZWFrcywgb3IgaW5mby1sZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgY3Jhc2hlcyAoZS5nLiwgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlcikgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIG9yIGtlcm5lbCBvb3BzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cblxuQWxsIHN0cnVjdHVyZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGUgcGF0Y2ggKGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLCBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG9yIGV4cGxpY2l0bHkgemVyb2VkICh2aWEgYG1lbXNldGAgb3IgcGFydGlhbCBpbml0aWFsaXphdGlvbiB3aGljaCB6ZXJvZXMgdGhlIHJlc3QpLiBUaGUgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTU6NTk6NTUuMTc4NjU4MzRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTU5NzA5OTU3MTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cXG5cXG5BbGwgc3RydWN0dXJlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoZSBwYXRjaCAoYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgb3IgZXhwbGljaXRseSB6ZXJvZWQgKHZpYSBgbWVtc2V0YCBvciBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHdoaWNoIHplcm9lcyB0aGUgcmVzdCkuIFRoZSBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgd2F5IGV4dDQgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBvZiBpbmxpbmUgZGF0YSB0byByZWd1bGFyIGJsb2Nrcy4gSXQgcmVwbGFjZXMgYGV4dDRfbWFwX2Jsb2Nrc2Agd2l0aCBgZXh0NF9tYl9uZXdfYmxvY2tzYCBhbmQgaW50cm9kdWNlcyBhIG5ldyBoZWxwZXIgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCB0byBkaXJlY3RseSBzZXQgdGhlIGJsb2NrIHdpdGhvdXQgZGVzdHJveWluZyB0aGUgaW5saW5lIGRhdGEgZmlyc3QuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBleHQ0IGxvZ2ljLiBUaGUgbW9kaWZpZWQgZnVuY3Rpb24gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgLCB3aGljaCBhcmUgcmVhY2hhYmxlIHZpYSB2YXJpb3VzIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGRpcmVjdG9yeSBlbnRyeSBhZGRpdGlvbnMuIFRoZXJlZm9yZSwgaXQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTU6NTk6NTUuMTc4NjY0NjQ5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI4MzY1MjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU3VuIEF1ZyAxNiAxNTo1OTo1MyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuY1xcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjJhOTI5OWVhNDE0NmMgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xcbisrKyBiL2ZzL2V4dDQvaW5saW5lLmNcXG5AQCAtMTQsNiArMTQsNyBAQFxcbiAjaW5jbHVkZSBcXFwiZXh0NC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwieGF0dHIuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInRydW5jYXRlLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gXFxuICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQVxcdFxcXCJkYXRhXFxcIlxcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcXHQoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpXFxuQEAgLTEwNzAsMjEgKzEwNzEsNjcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLVxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYyxcXG4tXFx0XFx0XFx0XFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcXG4rc3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbitcXHRcXHRcXHRcXHQgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pXFxuIHtcXG4tXFx0aW50IHJldDtcXG4rXFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xcbitcXHRzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0ge1xcbitcXHRcXHQucyA9IHsgLm5vdF9mb3VuZCA9IDAsIH0sXFxuK1xcdH07XFxuK1xcdHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaSA9IHtcXG4rXFx0XFx0Lm5hbWVfaW5kZXggPSBFWFQ0X1hBVFRSX0lOREVYX1NZU1RFTSxcXG4rXFx0XFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxcbitcXHRcXHQudmFsdWUgPSBOVUxMLFxcbitcXHRcXHQudmFsdWVfbGVuID0gMCxcXG4rXFx0fTtcXG4rXFx0aW50IGVycm9yO1xcbiBcXG4tXFx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xcbi1cXHRpZiAocmV0KSB7XFxuLVxcdFxcdGV4dDRfbXNnKGlub2RlLVxcdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxcbi1cXHRcXHRcXHRcXFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXFxcIixcXG4tXFx0XFx0XFx0aW5vZGUtXFx1MDAzZWlfaW5vLCByZXQpO1xcbi1cXHRcXHRyZXR1cm47XFxuK1xcdGRvd25fd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0aWYgKGVycm9yKSB7XFxuK1xcdFxcdHVwX3dyaXRlKFxcdTAwMjZlaS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuK1xcdFxcdHJldHVybiBlcnJvcjtcXG4gXFx0fVxcbi1cXHRleHQ0X3dyaXRlX2lubGluZV9kYXRhKGlub2RlLCBpbG9jLCBidWYsIDAsIGlubGluZV9zaXplKTtcXG4tXFx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFxcdTAwMjZpLCBcXHUwMDI2aXMpO1xcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRCVUZGRVJfVFJBQ0UoaXMuaWxvYy5iaCwgXFxcImdldF93cml0ZV9hY2Nlc3NcXFwiKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLVxcdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcXG4rXFx0aWYgKGVycm9yKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCBcXHUwMDI2aSwgXFx1MDAyNmlzKTtcXG4rXFx0aWYgKGVycm9yKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bWVtc2V0KCh2b2lkICopZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlzLmlsb2MpLVxcdTAwM2VpX2Jsb2NrLFxcbitcXHRcXHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcXG4rXFx0bWVtc2V0KGVpLVxcdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xcbitcXG4rXFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cXHUwMDNlaV9zYikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0KFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkgfHwgU19JU1JFRyhpbm9kZS1cXHUwMDNlaV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLVxcdTAwM2VpX21vZGUpKSkge1xcbitcXHRcXHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xcbitcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcXG4rXFxuK1xcdFxcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XFxuK1xcdFxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XFxuK1xcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXgsIGJsb2NrKTtcXG4rXFx0XFx0ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXgsIDApO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XFxuK1xcdH1cXG4rXFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTtcXG4rXFx0Z2V0X2JoKGlzLmlsb2MuYmgpO1xcbitcXHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcXG4rXFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XFxuK1xcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4rb3V0OlxcbitcXHRicmVsc2UoaXMuaWxvYy5iaCk7XFxuK1xcdGlmIChlcnJvciA9PSAtRU5PREFUQSlcXG4rXFx0XFx0ZXJyb3IgPSAwO1xcbitcXHR1cF93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbitcXHRyZXR1cm4gZXJyb3I7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbkBAIC0xMDk0LDggKzExNDEsOSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4gXFx0aW50IGVycm9yO1xcbiBcXHR2b2lkICpidWYgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcXG4gXFx0aW50IGlubGluZV9zaXplO1xcbitcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbitcXHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XFxuIFxcbiBcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4gXFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xcbkBAIC0xMTIwLDI1ICsxMTY4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0ZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xcbi1cXHRpZiAoZXJyb3IpXFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXG4tXFx0bWFwLm1fbGJsayA9IDA7XFxuLVxcdG1hcC5tX2xlbiA9IDE7XFxuLVxcdG1hcC5tX2ZsYWdzID0gMDtcXG4tXFx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXFx1MDAyNm1hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7XFxuK1xcdG1lbXNldChcXHUwMDI2YXIsIDAsIHNpemVvZihhcikpO1xcbitcXHRhci5pbm9kZSA9IGlub2RlO1xcbitcXHRhci5sb2dpY2FsID0gMDtcXG4rXFx0YXIubGVuID0gMTtcXG4rXFx0aWYgKFNfSVNSRUcoaW5vZGUtXFx1MDAzZWlfbW9kZSkpXFxuK1xcdFxcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XFxuK1xcdGVsc2VcXG4rXFx0XFx0YXIuZmxhZ3MgPSAwO1xcbitcXHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFxcdTAwMjZhciwgXFx1MDAyNmVycm9yKTtcXG4gXFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4tXFx0XFx0Z290byBvdXRfcmVzdG9yZTtcXG4tXFx0aWYgKCEobWFwLm1fZmxhZ3MgXFx1MDAyNiBFWFQ0X01BUF9NQVBQRUQpKSB7XFxuLVxcdFxcdGVycm9yID0gLUVJTztcXG4tXFx0XFx0Z290byBvdXRfcmVzdG9yZTtcXG4tXFx0fVxcbitcXHRcXHRnb3RvIG91dDtcXG4gXFxuLVxcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXFx1MDAzZWlfc2IsIG1hcC5tX3BibGspO1xcbitcXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVxcdTAwM2VpX3NiLCBuZXdibG9jayk7XFxuIFxcdGlmICghZGF0YV9iaCkge1xcbiBcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcbiBcXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG5AQCAtMTE0Nyw3ICsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuIFxcdGlmIChlcnJvcikge1xcbiBcXHRcXHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbiBcXHRcXHRlcnJvciA9IC1FSU87XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcdG1lbXNldChkYXRhX2JoLVxcdTAwM2ViX2RhdGEsIDAsIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuIFxcbkBAIC0xMTcxLDEyICsxMjE2LDE0IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbiBcXHRcXHRcXHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcXG4gXFx0fVxcbiBcXG4tb3V0X3Jlc3RvcmU6XFxuIFxcdGlmIChlcnJvcilcXG4tXFx0XFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xcbi1cXG4tb3V0OlxcbitcXHRcXHRnb3RvIG91dF9iaDtcXG4rXFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBuZXdibG9jaywgYXIubGVuKTtcXG4rb3V0X2JoOlxcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFyLmxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbiBcXHRicmVsc2UoZGF0YV9iaCk7XFxuK291dDpcXG4gXFx0a2ZyZWUoYnVmKTtcXG4gXFx0cmV0dXJuIGVycm9yO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE1OjU5OjU2LjYwNzk5MjExNloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjUxNzcyNTQ0NDU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFcIixcbiAgICBcImV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgd2F5IGV4dDQgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBvZiBpbmxpbmUgZGF0YSB0byByZWd1bGFyIGJsb2Nrcy4gSXQgcmVwbGFjZXMgYGV4dDRfbWFwX2Jsb2Nrc2Agd2l0aCBgZXh0NF9tYl9uZXdfYmxvY2tzYCBhbmQgaW50cm9kdWNlcyBhIG5ldyBoZWxwZXIgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCB0byBkaXJlY3RseSBzZXQgdGhlIGJsb2NrIHdpdGhvdXQgZGVzdHJveWluZyB0aGUgaW5saW5lIGRhdGEgZmlyc3QuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBleHQ0IGxvZ2ljLiBUaGUgbW9kaWZpZWQgZnVuY3Rpb24gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgLCB3aGljaCBhcmUgcmVhY2hhYmxlIHZpYSB2YXJpb3VzIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGRpcmVjdG9yeSBlbnRyeSBhZGRpdGlvbnMuIFRoZXJlZm9yZSwgaXQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmNcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjJhOTI5OWVhNDE0NmMgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2lubGluZS5jXG4rKysgYi9mcy9leHQ0L2lubGluZS5jXG5AQCAtMTQsNiArMTQsNyBAQFxuICNpbmNsdWRlIFwiZXh0NC5oXCJcbiAjaW5jbHVkZSBcInhhdHRyLmhcIlxuICNpbmNsdWRlIFwidHJ1bmNhdGUuaFwiXG4rI2luY2x1ZGUgXCJleHQ0X2V4dGVudHMuaFwiXG4gXG4gI2RlZmluZSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBXHRcImRhdGFcIlxuICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRVx0KChzaXplb2YoX19sZTMyKSAqIEVYVDRfTl9CTE9DS1MpKVxuQEAgLTEwNzAsMjEgKzEwNzEsNjcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbitzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4rXHRcdFx0XHQgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pXG4ge1xuLVx0aW50IHJldDtcbitcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4rXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcbitcdH07XG4rXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4rXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG4rXHRcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcbitcdFx0LnZhbHVlID0gTlVMTCxcbitcdFx0LnZhbHVlX2xlbiA9IDAsXG4rXHR9O1xuK1x0aW50IGVycm9yO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXCIsXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbitcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdHJldHVybiBlcnJvcjtcbiBcdH1cbi1cdGV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpO1xuLVx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rXHRpZiAoZXJyb3IpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFwiZ2V0X3dyaXRlX2FjY2Vzc1wiKTtcbitcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRtZW1zZXQoKHZvaWQgKilleHQ0X3Jhd19pbm9kZShcdTAwMjZpcy5pbG9jKS1cdTAwM2VpX2Jsb2NrLFxuK1x0XHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdG1lbXNldChlaS1cdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xuK1xuK1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbitcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuK1x0XHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcbitcbitcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTtcbitcdFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcbitcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4rXHRcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuK1x0fSBlbHNlIHtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4rXHR9XG4rXHRleHQ0X2NsZWFyX2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpO1xuK1x0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuK1x0ZXJyb3IgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4rXHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4rb3V0OlxuK1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuK1x0aWYgKGVycm9yID09IC1FTk9EQVRBKVxuK1x0XHRlcnJvciA9IDA7XG4rXHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdHJldHVybiBlcnJvcjtcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5AQCAtMTA5NCw4ICsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpbnQgZXJyb3I7XG4gXHR2b2lkICpidWYgPSBOVUxMO1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDtcbi1cdHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwO1xuIFx0aW50IGlubGluZV9zaXplO1xuK1x0ZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMDtcbitcdHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjtcbiBcbiBcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuIFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuQEAgLTExMjAsMjUgKzExNjgsMjIgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRlcnJvciA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFwLm1fbGJsayA9IDA7XG4tXHRtYXAubV9sZW4gPSAxO1xuLVx0bWFwLm1fZmxhZ3MgPSAwO1xuLVx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXHUwMDI2bWFwLCBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKTtcbitcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4rXHRhci5pbm9kZSA9IGlub2RlO1xuK1x0YXIubG9naWNhbCA9IDA7XG4rXHRhci5sZW4gPSAxO1xuK1x0aWYgKFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKSlcbitcdFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcbitcdGVsc2VcbitcdFx0YXIuZmxhZ3MgPSAwO1xuK1x0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcdTAwMjZhciwgXHUwMDI2ZXJyb3IpO1xuIFx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0aWYgKCEobWFwLm1fZmxhZ3MgXHUwMDI2IEVYVDRfTUFQX01BUFBFRCkpIHtcbi1cdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0fVxuK1x0XHRnb3RvIG91dDtcbiBcbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4rXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcbiBcdGlmICghZGF0YV9iaCkge1xuIFx0XHRlcnJvciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4rXHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4gXG5AQCAtMTE3MSwxMiArMTIxNiwxNCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdH1cbiBcbi1vdXRfcmVzdG9yZTpcbiBcdGlmIChlcnJvcilcbi1cdFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xuLVxuLW91dDpcbitcdFx0Z290byBvdXRfYmg7XG4rXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsIG5ld2Jsb2NrLCBhci5sZW4pO1xuK291dF9iaDpcbitcdGlmIChlcnJvcilcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYXIubGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4gXHRicmVsc2UoZGF0YV9iaCk7XG4rb3V0OlxuIFx0a2ZyZWUoYnVmKTtcbiBcdHJldHVybiBlcnJvcjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNTo1OTo1Ni42MDc5OTM1MDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzUyMzQwNTkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0J3Mgc2hha2luZyB1cCB0aGUgYGZzL2V4dDQvaW5saW5lLmNgIGNvZGUuIEl0IGxvb2tzIGxpa2UgdGhleSdyZSBkb2luZyBhIGJpdCBvZiBhIHJlZmFjdG9yIGluIGhvdyBpbmxpbmUgZGF0YSBnZXRzIGNvbnZlcnRlZCB0byByZWd1bGFyIGJsb2Nrcy4gU3BlY2lmaWNhbGx5LCBpdCBzZWVtcyBsaWtlIHRoZXkncmUgcmVtb3ZpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGludHJvZHVjaW5nIHRoaXMgbmV3IGZ1bmN0aW9uLCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBUaGUgcmVhbCBtZWF0IG9mIHRoZSBjaGFuZ2UsIHRob3VnaCwgaXMgaG93IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBiZWluZyByZXdvcmtlZC4gSW5zdGVhZCBvZiB0aGF0IGBleHQ0X21hcF9ibG9ja3NgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AgZGFuY2UsIHRoZXkncmUgbm93IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGRpcmVjdGx5LlxuXG5UaGlzIGlzIGEgZnVuZGFtZW50YWwgc2hpZnQgaW4gaG93IHRoZSBmaWxlc3lzdGVtIGhhbmRsZXMgdGhpcyBpbmxpbmUtdG8tYmxvY2sgY29udmVyc2lvbiwgYW5kIHRoYXQgYWx3YXlzIGdldHMgbXkgYXR0ZW50aW9uLiBTbywgbGV0J3MgdGFrZSBhIGNsb3NlciBsb29rLlxuXG5JIG5lZWQgdG8gZm9jdXMgb24gdGhlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG9mIGNvdXJzZSwgdGhlIG1haW4gc3ViamVjdCBvZiBjaGFuZ2U6IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gR2l2ZW4gdGhhdCBpdCdzIGEgY29yZSBjb21wb25lbnQsIEknbSB0aGlua2luZyB3ZSBzaG91bGQgZGVmaW5pdGVseSBiZSBmdXp6aW5nIHRoYXQsIG9yIGF0IGxlYXN0IGl0cyBjYWxsZXJzLiBUaGF0IHNlZW1zIGxpa2UgdGhlIGxvZ2ljYWwgc3BvdCBmb3Igc29tZSB0aG9yb3VnaCB0ZXN0aW5nLiBMZXQncyBkaWcgaW50byB0aGUgY29kZSBhbmQgZmluZCBvdXQgZXhhY3RseSAqd2hvKiBpcyBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2NiwiT3V0cHV0VG9rZW5zIjoyNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjAxLjM2MDM0MTgzOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzQ3NzE0OTEyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTEzNi1cXG5mcy9leHQ0L2lubGluZS5jOjExMzc6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM4LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEyMzY9aW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMjg4LVxcdCAqL1xcbmZzL2V4dDQvaW5saW5lLmM6MTI4OTpcXHRyZXQgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgZGlyLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMjkwLVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0yMDAzPWludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjA0MC1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbmZzL2V4dDQvaW5saW5lLmM6MjA0MTpcXHRcXHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSwgXFx1MDAyNmlsb2MpO1xcbmZzL2V4dDQvaW5saW5lLmMtMjA0Mi1cXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXFx1MDAyNm5vX2V4cGFuZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjAzLjEwODA2NDMyOVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MzcxOTQ0MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSB3aGF0J3Mgb24gbXkgbWluZCByZWdhcmRpbmcgdGhlc2UgZnVuY3Rpb25zLlxuXG4qKkludmVzdGlnYXRpbmcgSW5saW5lIERhdGEgQ29udmVyc2lvbiBpbiBleHQ0KipcblxuUmlnaHQsIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSXQgbG9va3MgbGlrZSB0aGVzZSBhcmUga2V5IHBsYXllcnMgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgYW4gaW1wb3J0YW50IG9wdGltaXphdGlvbi4gTXkgZm9jdXMgbmVlZHMgdG8gYmUgb24gaG93IHRoZXkgcmVsYXRlIHRvIGVhY2ggb3RoZXIuIEknbSBnb2luZyB0byBzdGFydCBieSB0cmFjaW5nIHRoZSBjYWxsIGNoYWluLiBJJ2xsIGNoZWNrIHdobyBpcyBjYWxsaW5nIHRob3NlIGZ1bmN0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjZW5hcmlvcyB0aGF0IGxlYWQgdG8gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBiZWluZyBpbnZva2VkLiBHZXR0aW5nIGEgY2xlYXIgcGljdHVyZSBvZiB0aGVpciBjYWxsZXJzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGRhdGEgZmxvdyBhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSBtYWtlcyBkZWNpc2lvbnMgYWJvdXQgaW5saW5lIGRhdGEuIFRoaXMgd2lsbCBoZWxwIG1lIGltbWVuc2VseS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDk4OSwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjA2LjU0NTI2MTExNloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODE4NTQ0MzIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0Lmg9Mzc0Nz1leHRlcm4gaW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM3NTEtXFx0XFx0XFx0XFx0XFx0ICB2b2lkICoqZnNkYXRhLCBib29sIGRhKTtcXG5mcy9leHQ0L2V4dDQuaDozNzUyOmV4dGVybiBpbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLFxcbmZzL2V4dDQvZXh0NC5oLTM3NTMtXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEyMzUtICovXFxuZnMvZXh0NC9pbmxpbmUuYzoxMjM2OmludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG5mcy9leHQ0L2lubGluZS5jLTEyMzctXFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9MjM1Nj1zdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtMjM4My1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoZGlyKSkge1xcbmZzL2V4dDQvbmFtZWkuYzoyMzg0OlxcdFxcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xcbmZzL2V4dDQvbmFtZWkuYy0yMzg1LVxcdFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDowOC4zNjM4MTQyNzZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzY0OTM4OTIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc2l0dWF0aW9uLCBmcm9tIGFuIGV4cGVydCdzIHBlcnNwZWN0aXZlLCBzdW1tYXJpemVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqSW5saW5lIERhdGEgSGFuZGxpbmcgaW4gZXh0NCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBpbmxpbmUgZGF0YSBpcyBtYW5hZ2VkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJdCdzIGNsZWFyIHRoYXQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGlzLCBhcyBleHBlY3RlZCwgYSBoZWxwZXIgZnVuY3Rpb24gaW52b2tlZCBieSBgX19leHQ0X2FkZF9lbnRyeWAuIE1ha2VzIHNlbnNlLCB0aGF0J3Mgd2hlcmUgdGhlICphdHRlbXB0KiB0byBhZGQgYW4gaW5saW5lIGVudHJ5IGdldHMgaGFuZGxlZCBkdXJpbmcgZGlyZWN0b3J5IGVudHJ5IGNyZWF0aW9uIG9yIG1vZGlmaWNhdGlvbiwgcHJvYmFibHkgd2hlbiBhIHNtYWxsIGZpbGUgZml0cyB3aXRoaW4gdGhlIGlub2RlJ3MgZGF0YSBhcmVhLiBUaGUgY3JpdGljYWwgcG9pbnQgaXMgdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlICpkYXRhKiBpdHNlbGYgZm9yIHRoaXMgaW5saW5lIGZpbGUgaGFwcGVucyB3aXRoaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAuIFNvLCB0aGF0IHRlbGxzIG1lIHRoZSBkYXRhIGNvbnZlcnNpb24gdGFrZXMgcGxhY2UgYWZ0ZXIgc29tZSBjaGVjayAtIHByZXN1bWFibHkgYWZ0ZXIgdGhlIGF0dGVtcHQgdG8gbWFrZSBpdCBpbmxpbmUuIEkgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNhbGwgc3RhY2sgdG8gc2VlICp3aGF0KiBpbml0aWF0ZXMgdGhlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGZ1bmN0aW9uLiBJcyBpdCBhbHdheXMgZnJvbSBgX19leHQ0X2FkZF9lbnRyeWAsIG9yIGFyZSB0aGVyZSBvdGhlciBlbnRyeSBwb2ludHMsIGxpa2Ugd2hlbiBjb252ZXJ0aW5nIGEgcmVndWxhciBmaWxlICp0byogYW4gaW5saW5lIGZpbGUgbGF0ZXI/IEkgYWxzbyBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVycm9yIGNvbmRpdGlvbnMgaGVyZSBhbmQgaG93IGZhaWx1cmVzIGluIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpbmZsdWVuY2UgdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCDigJMgaG93IGFyZSB0aGV5IGNvb3JkaW5hdGVkPyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGltcHJvcGVyIGRhdGEgcGxhY2VtZW50IGNvdWxkIGVhc2lseSBjb3JydXB0IHRoZSBmaWxlIHN0cnVjdHVyZS4gSSdsbCBuZWVkIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgdG8gZnVsbHkgZ3Jhc3AgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU2NTgsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDoxMi4xMjg3NTc3NzlaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU2ODc2OTk1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcXG4tLVxcbmZzL2V4dDQvY3J5cHRvLmMtMTUyLVxcbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlxcdHJlcyA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9jcnlwdG8uYy0xNTQtXFx0aWYgKHJlcylcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTM3ODQ9ZXh0ZXJuIGludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSk7XFxuZnMvZXh0NC9leHQ0LmgtMzc4NS1cXG5mcy9leHQ0L2V4dDQuaDozNzg2OmV4dGVybiBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbmZzL2V4dDQvZXh0NC5oLTM3ODctXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00ODU0PWxvbmcgZXh0NF9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cXHRpbm9kZV9sb2NrKGlub2RlKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo0ODg0OlxcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4NS1cXHRpZiAocmV0KVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz01NDY9aW50IGV4dDRfcmVhZHBhZ2VfaW5saW5lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cXG5mcy9leHQ0L2lubGluZS5jOjU3MzpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuZnMvZXh0NC9pbmxpbmUuYy01NzQtXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTcyOC1cXHRcXHRcXHQvKiBSZXRyeSBpbnNpZGUgKi9cXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcXHRcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03MzAtXFx0XFx0fVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz03ODQ9aW50IGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy03ODktXFx0aWYgKHBvcyArIGxlbiBcXHUwMDNlIGV4dDRfZ2V0X21heF9pbmxpbmVfc2l6ZShpbm9kZSkpXFxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XFx0XFx0cmV0dXJuIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQobWFwcGluZywgaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVxcdHJldHVybiBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEobWFwcGluZywgaW5vZGUsIHBvcywgbGVuLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTEzNi1cXG5mcy9leHQ0L2lubGluZS5jOjExMzc6c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM4LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEyMzY9aW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMjg4LVxcdCAqL1xcbmZzL2V4dDQvaW5saW5lLmM6MTI4OTpcXHRyZXQgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgZGlyLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMjkwLVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xODkxPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjAwMi1cXG5mcy9leHQ0L2lubGluZS5jOjIwMDM6aW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL2V4dDQvaW5saW5lLmMtMjAwNC17XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTIwNDAtXFx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG5mcy9leHQ0L2lubGluZS5jOjIwNDE6XFx0XFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZpbG9jKTtcXG5mcy9leHQ0L2lubGluZS5jLTIwNDItXFx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTU5MzQ9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTYwMzEtXFx0XFx0ICAgIGF0dHItXFx1MDAzZWlhX3NpemUgXFx1MDAzZSBFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplKSB7XFxuZnMvZXh0NC9pbm9kZS5jOjYwMzI6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xcbmZzL2V4dDQvaW5vZGUuYy02MDMzLVxcdFxcdFxcdGlmIChlcnJvcilcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYz02Nzg3PXZtX2ZhdWx0X3QgZXh0NF9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtNjgwOC1cXG5mcy9leHQ0L2lub2RlLmM6NjgwOTpcXHRlcnIgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xcbmZzL2V4dDQvaW5vZGUuYy02ODEwLVxcdGlmIChlcnIpXFxuLS1cXG5mcy9leHQ0L3Zlcml0eS5jPTEwMj1zdGF0aWMgaW50IGV4dDRfYmVnaW5fZW5hYmxlX3Zlcml0eShzdHJ1Y3QgZmlsZSAqZmlscClcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmMtMTI4LVxcbmZzL2V4dDQvdmVyaXR5LmM6MTI5OlxcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC92ZXJpdHkuYy0xMzAtXFx0aWYgKGVycilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDA6MTMuNjk3NTMyNjQxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ0NzY0MDM2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YSoqXG5cbk9rYXksIHNvIGxvb2tpbmcgYXQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAsIGl0IHNlZW1zIGxpa2UgdGhpcyBmdW5jdGlvbiBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBhbmQgdGhlcmVmb3JlIHdvcnRoIGNvbnNpZGVyaW5nIGZvciBmdXp6aW5nLiBJdCdzIGNhbGxlZCBmcm9tIGEgZmV3IGRpZmZlcmVudCBwbGFjZXMsIHdoaWNoIGlzIGdvb2QgZm9yIGNvdmVyYWdlOiBgZXh0NF9zZXRfY29udGV4dGAgKHdoaWNoIGlzIGNyeXB0by1yZWxhdGVkLCBpbnRlcmVzdGluZyksIGBleHQ0X2ZhbGxvY2F0ZWAsIGBleHQ0X3NldGF0dHJgIChzcGVjaWZpY2FsbHkgZm9yIHRydW5jYXRpbmcgZmlsZXMpLCBgZXh0NF9wYWdlX21rd3JpdGVgLCBhbmQgYGV4dDRfYmVnaW5fZW5hYmxlX3Zlcml0eWAuIFRoYXQncyBhIGRlY2VudCBzcHJlYWQuXG5cblRoZSBvYnZpb3VzIGZ1bmN0aW9ucyB0byBmb2N1cyBvbiBhcmUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXRzZWxmLCBvZiBjb3Vyc2UsIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEknbSBnb2luZyB0byBub3RlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbmQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBhcyB3ZWxsLCBldmVuIHRob3VnaCB0aGV5J3JlIHN0YXRpYyDigJMgc29tZXRpbWVzIHN0YXRpYyBmdW5jdGlvbnMgc3RpbGwgZXhwb3NlIGludGVyZXN0aW5nIHZ1bG5lcmFiaWxpdGllcyBpZiB0aGUgY29yZSBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQuIFRob3VnaCwgbGlzdGluZyB0aGUgY2FsbGVycyB0byB0aGUgbm9uLXN0YXRpYyBmdW5jdGlvbnMgaXMgcHJvYmFibHkgYSBtb3JlIGVmZmVjdGl2ZSBhcHByb2FjaC5cblxuU28sIGxldCdzIG1ha2UgYSBub3RlIHRvIGRlZmluaXRlbHkgdGFyZ2V0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgSSBuZWVkIHRvIGtlZXAgaW4gbWluZD8gQWgsIHJpZ2h0LCBFWFQ0X0ZTIGlzIG9idmlvdXNseSByZXF1aXJlZC4gR29vZCB0byBrbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NDkyLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjE4LjE0NTE3NjU4OFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYyOTc0NzEwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgRVhUNF9GU1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9leHQ0L0tjb25maWc6Mjpjb25maWcgRVhUNF9GU1xcbmZzL2V4dDQvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVxcXCJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZz0zNT1jb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZy00NS1cXG5mcy9leHQ0L0tjb25maWc6NDY6Y29uZmlnIEVYVDRfRlNfUE9TSVhfQUNMXFxuZnMvZXh0NC9LY29uZmlnLTQ3LVxcdGJvb2wgXFxcIkV4dDQgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHNcXFwiXFxuLS1cXG5mcy9leHQ0L0tjb25maWctNTUtXFxuZnMvZXh0NC9LY29uZmlnOjU2OmNvbmZpZyBFWFQ0X0ZTX1NFQ1VSSVRZXFxuZnMvZXh0NC9LY29uZmlnLTU3LVxcdGJvb2wgXFxcIkV4dDQgU2VjdXJpdHkgTGFiZWxzXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDoxOS43NzQ5MzI5MjdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTYwMjIwMjU4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRVhUNCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIGBFWFQ0X0ZTYCBjb25maWd1cmF0aW9uIGFuZCBkaXZpbmcgaW50byB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiByb3V0aW5lcy4gRmlyc3QgdGhpbmdzIGZpcnN0LCBJIHdhbnQgdG8gY2hlY2sgdGhlIHZpc2liaWxpdHkgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAuIEFoLCB5ZXMsIGl0J3MgZXhwb3J0ZWQgYW5kIGRlY2xhcmVkIGluIGBmcy9leHQ0L2V4dDQuaGAgYXMgYGV4dGVybiBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpO2AuIEV4Y2VsbGVudC4gQW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpcyBhbHNvIHJpZ2h0IHRoZXJlIGluIHRoZSBoZWFkZXIuXG5cbk5vdywganVzdCB0byBiZSBzdXJlLCBsZXQncyB0YWtlIGEgcXVpY2sgbG9vayBhdCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBZZXAsIHRoYXQncyBzdGF0aWMsIGFzIGlzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gUmlnaHQsIHNvIHRoYXQgbWVhbnMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBhcmUgcHJvYmFibHkgdGhlIGtleSBmdW5jdGlvbnMgdG8gZm9jdXMgb24uXG5cbldhaXQgYSBzZWNvbmTigKYgaXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGFsc28gYSBjYWxsZXIgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgPyBObywgdGhhdCBkb2Vzbid0IHNlZW0gdG8gYmUgdGhlIGNhc2UuIEFoLCBJIHNlZSEgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBib3RoIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBhbmQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAuIE9rYXksIHRoYXQgY2xhcmlmaWVzIHRoZSBjYWxsIGdyYXBoLiBMZXQgbWUgbm93IHNlZSB3aGF0J3MgZ29pbmcgb24gd2l0aCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODIzOSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDoyNS4zNzcxMzkwNzJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MjY2NzUyODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTcyLVxcbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG5mcy9leHQ0L2lubGluZS5jLTU3NC1cXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz02OTc9aW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNzI4LVxcdFxcdFxcdC8qIFJldHJ5IGluc2lkZSAqL1xcbmZzL2V4dDQvaW5saW5lLmM6NzI5OlxcdFxcdFxcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jLTczMC1cXHRcXHR9XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTc4ND1pbnQgZXh0NF90cnlfdG9fd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cXHRpZiAocG9zICsgbGVuIFxcdTAwM2UgZXh0NF9nZXRfbWF4X2lubGluZV9zaXplKGlub2RlKSlcXG5mcy9leHQ0L2lubGluZS5jOjc5MDpcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03OTEtXFx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjI3LjAwMzgyMTY2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MDM4NDI5OTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipEaXZpbmcgaW50byB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uKipcblxuUmlnaHQsIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgZnVuY3Rpb24sIGFuZCBpdCBzZWVtcyBsaWtlIGEgY3J1Y2lhbCBwaWVjZSBpbiBob3cgZXh0NCBoYW5kbGVzIGZpbGUgZGF0YS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiV2FpdCBhIG1pbnV0ZSwgSSB0aG91Z2h0IEkgcmVtZW1iZXJlZCBpdCBjYWxsaW5nIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBkaXJlY3RseSwgYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIGJlIHRoZSBjYXNlLlwiIFBlcmhhcHMgSSBtaXNyZWFkIHNvbWV0aGluZyBvciB0aGVyZSdzIHNvbWUgaW5kaXJlY3QgY2FsbCBwYXRoIEknbSBub3QgaW1tZWRpYXRlbHkgY29uc2lkZXJpbmcuXG5cblRoZXJlZm9yZSwgaXQgbG9va3MgbGlrZSBpdCdzIHRpbWUgdG8gdGhvcm91Z2hseSBleGFtaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgYW5kIHNlZSBleGFjdGx5IHdoYXQgaXQncyBkb2luZy4gR290dGEgcmVmcmVzaCBteSBtZW1vcnkgb2YgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhpcyBjb252ZXJzaW9uIGlzIGtleSBmb3IgZGVhbGluZyB3aXRoIHNtYWxsZXIgZmlsZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyMzYsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozMC41MDc2NjcxMzRaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc4MDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW5saW5lLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTczLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTczOlxcdHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4gNTc0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIDU3NTpcXHR7XFxuIDU3NjpcXHRcXHRpbnQgcmV0LCBuZWVkZWRfYmxvY2tzLCBub19leHBhbmQ7XFxuIDU3NzpcXHRcXHRoYW5kbGVfdCAqaGFuZGxlID0gTlVMTDtcXG4gNTc4OlxcdFxcdGludCByZXRyaWVzID0gMCwgc2VtX2hlbGQgPSAwO1xcbiA1Nzk6XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuIDU4MDpcXHRcXHR1bnNpZ25lZCBmcm9tLCB0bztcXG4gNTgxOlxcdFxcdHN0cnVjdCBleHQ0X2lsb2MgaWxvYztcXG4gNTgyOlxcdFxcbiA1ODM6XFx0XFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcXG4gNTg0OlxcdFxcdFxcdC8qXFxuIDU4NTpcXHRcXHRcXHQgKiBjbGVhciB0aGUgZmxhZyBzbyB0aGF0IG5vIG5ldyB3cml0ZVxcbiA1ODY6XFx0XFx0XFx0ICogd2lsbCB0cmFwIGhlcmUgYWdhaW4uXFxuIDU4NzpcXHRcXHRcXHQgKi9cXG4gNTg4OlxcdFxcdFxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4gNTg5OlxcdFxcdFxcdHJldHVybiAwO1xcbiA1OTA6XFx0XFx0fVxcbiA1OTE6XFx0XFxuIDU5MjpcXHRcXHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xcbiA1OTM6XFx0XFxuIDU5NDpcXHRcXHRyZXQgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFxcdTAwMjZpbG9jKTtcXG4gNTk1OlxcdFxcdGlmIChyZXQpXFxuIDU5NjpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA1OTc6XFx0XFxuIDU5ODpcXHRyZXRyeTpcXG4gNTk5OlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9XUklURV9QQUdFLCBuZWVkZWRfYmxvY2tzKTtcXG4gNjAwOlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbiA2MDE6XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihoYW5kbGUpO1xcbiA2MDI6XFx0XFx0XFx0aGFuZGxlID0gTlVMTDtcXG4gNjAzOlxcdFxcdFxcdGdvdG8gb3V0O1xcbiA2MDQ6XFx0XFx0fVxcbiA2MDU6XFx0XFxuIDYwNjpcXHRcXHQvKiBXZSBjYW5ub3QgcmVjdXJzZSBpbnRvIHRoZSBmaWxlc3lzdGVtIGFzIHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5XFxuIDYwNzpcXHRcXHQgKiBzdGFydGVkICovXFxuIDYwODpcXHRcXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgMCwgRkdQX1dSSVRFQkVHSU4gfCBGR1BfTk9GUyxcXG4gNjA5OlxcdFxcdFxcdFxcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xcbiA2MTA6XFx0XFx0aWYgKElTX0VSUihmb2xpbykpIHtcXG4gNjExOlxcdFxcdFxcdHJldCA9IFBUUl9FUlIoZm9saW8pO1xcbiA2MTI6XFx0XFx0XFx0Z290byBvdXRfbm9mb2xpbztcXG4gNjEzOlxcdFxcdH1cXG4gNjE0OlxcdFxcbiA2MTU6XFx0XFx0ZXh0NF93cml0ZV9sb2NrX3hhdHRyKGlub2RlLCBcXHUwMDI2bm9fZXhwYW5kKTtcXG4gNjE2OlxcdFxcdHNlbV9oZWxkID0gMTtcXG4gNjE3OlxcdFxcdC8qIElmIHNvbWUgb25lIGhhcyBhbHJlYWR5IGRvbmUgdGhpcyBmb3IgdXMsIGp1c3QgZXhpdC4gKi9cXG4gNjE4OlxcdFxcdGlmICghZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKSB7XFxuIDYxOTpcXHRcXHRcXHRyZXQgPSAwO1xcbiA2MjA6XFx0XFx0XFx0Z290byBvdXQ7XFxuIDYyMTpcXHRcXHR9XFxuIDYyMjpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDA6MzAuNTA3ODQ3MjU0WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1OTI1MTA0ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAqKlxuXG5Pa2F5LCBob2xkIG9uIGEgbWludXRlLiBJIHdhcyBwcmV0dHkgc3VyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgd2FzIGp1c3QgYSB3cmFwcGVyIGZvciBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEJ1dCwgcmVyZWFkaW5nIHRoZSBjb2RlLCBpdCBzZWVtcy4uLiB3YWl0LCBpcyB0aGF0IHJpZ2h0PyBJdCAqZG9lc24ndCogYWN0dWFsbHkgY2FsbCB0aGUgYG5vbG9ja2AgdmVyc2lvbiBkaXJlY3RseT8gVGhhdCBzZWVtcyBvZGQsIGdpdmVuIHRoZSB1c3VhbCBsb2NraW5nIHN0cmF0ZWdpZXMgaW4gdGhlIGV4dDQgY29kZS4gSSdsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayB0aGUgY2FsbGluZyBjb250ZXh0IG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCwgYW5kIHZlcmlmeSB0aGF0IHRoZSBuZWNlc3NhcnkgbG9ja2luZyBpcyBhY3R1YWxseSAqYmVpbmcqIGhhbmRsZWQgZXh0ZXJuYWxseS4gVGhpcyBjb3VsZCBiZSBhIGNyaXRpY2FsIGZsYXcgaWYgaXQncyBub3QgbG9ja2VkIHByb3Blcmx5LCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGRhdGEgY29ycnVwdGlvbiwgb3IgYXQgbGVhc3Qgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB0cmFjZSB0aGlzIGNhbGwsIHNlZSB3aGVyZSBpdCdzIGJlaW5nIHVzZWQsIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGUgbG9jayBpcyBiZWluZyBhY3F1aXJlZCwgaWYgYXQgYWxsLiBJdCBtaWdodCB1c2UgYW5vdGhlciwgaW50ZXJuYWwgbG9ja2luZyBtZWNoYW5pc20uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMjU3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozNC4xMDAzNjI0MDhaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc4MDUxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW5saW5lLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjIzLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjIzOlxcdFxcdGZyb20gPSAwO1xcbiA2MjQ6XFx0XFx0dG8gPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuIDYyNTpcXHRcXHRpZiAoIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pKSB7XFxuIDYyNjpcXHRcXHRcXHRyZXQgPSBleHQ0X3JlYWRfaW5saW5lX2ZvbGlvKGlub2RlLCBmb2xpbyk7XFxuIDYyNzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4gNjI4OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiA2Mjk6XFx0XFx0fVxcbiA2MzA6XFx0XFxuIDYzMTpcXHRcXHRleHQ0X2ZjX3RyYWNrX2lub2RlKGhhbmRsZSwgaW5vZGUpO1xcbiA2MzI6XFx0XFx0cmV0ID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcXG4gNjMzOlxcdFxcdGlmIChyZXQpXFxuIDYzNDpcXHRcXHRcXHRnb3RvIG91dDtcXG4gNjM1OlxcdFxcbiA2MzY6XFx0XFx0aWYgKGV4dDRfc2hvdWxkX2Rpb3JlYWRfbm9sb2NrKGlub2RlKSkge1xcbiA2Mzc6XFx0XFx0XFx0cmV0ID0gZXh0NF9ibG9ja193cml0ZV9iZWdpbihoYW5kbGUsIGZvbGlvLCBmcm9tLCB0byxcXG4gNjM4OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgZXh0NF9nZXRfYmxvY2tfdW53cml0dGVuKTtcXG4gNjM5OlxcdFxcdH0gZWxzZVxcbiA2NDA6XFx0XFx0XFx0cmV0ID0gZXh0NF9ibG9ja193cml0ZV9iZWdpbihoYW5kbGUsIGZvbGlvLCBmcm9tLCB0byxcXG4gNjQxOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgZXh0NF9nZXRfYmxvY2spO1xcbiA2NDI6XFx0XFx0Y2xlYXJfYnVmZmVyX25ldyhmb2xpb19idWZmZXJzKGZvbGlvKSk7XFxuIDY0MzpcXHRcXG4gNjQ0OlxcdFxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHtcXG4gNjQ1OlxcdFxcdFxcdHJldCA9IGV4dDRfd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBpbm9kZSxcXG4gNjQ2OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgZm9saW9fYnVmZmVycyhmb2xpbyksIGZyb20sIHRvLFxcbiA2NDc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpO1xcbiA2NDg6XFx0XFx0fVxcbiA2NDk6XFx0XFxuIDY1MDpcXHRcXHRpZiAocmV0KSB7XFxuIDY1MTpcXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbiA2NTI6XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4gNjUzOlxcdFxcdFxcdGZvbGlvID0gTlVMTDtcXG4gNjU0OlxcdFxcdFxcdGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTtcXG4gNjU1OlxcdFxcdFxcdGV4dDRfd3JpdGVfdW5sb2NrX3hhdHRyKGlub2RlLCBcXHUwMDI2bm9fZXhwYW5kKTtcXG4gNjU2OlxcdFxcdFxcdHNlbV9oZWxkID0gMDtcXG4gNjU3OlxcdFxcdFxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuIDY1ODpcXHRcXHRcXHRoYW5kbGUgPSBOVUxMO1xcbiA2NTk6XFx0XFx0XFx0ZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpO1xcbiA2NjA6XFx0XFx0XFx0LypcXG4gNjYxOlxcdFxcdFxcdCAqIElmIHRydW5jYXRlIGZhaWxlZCBlYXJseSB0aGUgaW5vZGUgbWlnaHRcXG4gNjYyOlxcdFxcdFxcdCAqIHN0aWxsIGJlIG9uIHRoZSBvcnBoYW4gbGlzdDsgd2UgbmVlZCB0b1xcbiA2NjM6XFx0XFx0XFx0ICogbWFrZSBzdXJlIHRoZSBpbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlXFxuIDY2NDpcXHRcXHRcXHQgKiBvcnBoYW4gbGlzdCBpbiB0aGF0IGNhc2UuXFxuIDY2NTpcXHRcXHRcXHQgKi9cXG4gNjY2OlxcdFxcdFxcdGlmIChpbm9kZS1cXHUwMDNlaV9ubGluaylcXG4gNjY3OlxcdFxcdFxcdFxcdGV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7XFxuIDY2ODpcXHRcXHR9XFxuIDY2OTpcXHRcXG4gNjcwOlxcdFxcdGlmIChyZXQgPT0gLUVOT1NQQyBcXHUwMDI2XFx1MDAyNiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS1cXHUwMDNlaV9zYiwgXFx1MDAyNnJldHJpZXMpKVxcbiA2NzE6XFx0XFx0XFx0Z290byByZXRyeTtcXG4gNjcyOlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozNC4xMDA1NDI1NjlaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEwNzU1MDc1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHF1aWNrIHJ1bmRvd24gb2Ygd2hhdCBJJ20gbG9va2luZyBhdCwgZnJvbSBteSBleHBlcnQgcGVyc3BlY3RpdmU6XG5cbioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgSW50ZXJhY3Rpb25zIEFmdGVyIGEgUmVjZW50IFBhdGNoKipcblxuQWxyaWdodCwgc28gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGlzIGNhbGxpbmcgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLiBJbnRlcmVzdGluZy4gSXQncyBhIGtleSBmdW5jdGlvbiBpbiB0aGlzIGFyZWEsIGFuZCBJIHNlZSB0aGF0ICp0aGF0KiBmdW5jdGlvbiwgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3YXNuJ3QgdG91Y2hlZCBpbiB0aGlzIHNwZWNpZmljIHBhdGNoLiBUaGF0J3MgYSBnb29kIGZpcnN0IGNoZWNrLCBtZWFucyB0aGVyZSdzIGxlc3MgaW1tZWRpYXRlIHJpc2sgdGhlcmUuXG5cbkhvd2V2ZXIsIHRoZSBwYXRjaCAqZGlkKiBtb2RpZnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGFuZCBhZGRlZCBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBTbywgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBnaXZlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBhbm90aGVyLCBjbG9zZXIgbG9vay4gTGV0IG1lIGRvdWJsZS1jaGVjayBob3cgKml0KiBoYW5kbGVzIHRoaW5ncyBub3csIGdpdmVuIHRoZXNlIGFkZGl0aW9ucyBhbmQgY2hhbmdlcy4gSnVzdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgaW50ZXJhY3Rpb25zIGFyZSBzb3VuZCwgZXNwZWNpYWxseSBzaW5jZSB3ZSd2ZSBnb3QgYSBuZXcgcGllY2UgdG8gdGhlIHB1enpsZSB3aXRoIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzM5LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDozOC4yMDgwOTY1NDlaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY2MzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW5saW5lLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTEzNyxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTEzNzpcXHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4xMTM4OlxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuMTEzOTpcXHRcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxcbjExNDA6XFx0e1xcbjExNDE6XFx0XFx0aW50IGVycm9yO1xcbjExNDI6XFx0XFx0dm9pZCAqYnVmID0gTlVMTDtcXG4xMTQzOlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XFxuMTE0NDpcXHRcXHRpbnQgaW5saW5lX3NpemU7XFxuMTE0NTpcXHRcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbjExNDY6XFx0XFx0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xcbjExNDc6XFx0XFxuMTE0ODpcXHRcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4xMTQ5OlxcdFxcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG4xMTUwOlxcdFxcdGlmICghYnVmKSB7XFxuMTE1MTpcXHRcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuMTE1MjpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMTUzOlxcdFxcdH1cXG4xMTU0OlxcdFxcbjExNTU6XFx0XFx0ZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpO1xcbjExNTY6XFx0XFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4xMTU3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExNTg6XFx0XFxuMTE1OTpcXHRcXHQvKlxcbjExNjA6XFx0XFx0ICogTWFrZSBzdXJlIHRoZSBpbmxpbmUgZGlyZWN0b3J5IGVudHJpZXMgcGFzcyBjaGVja3MgYmVmb3JlIHdlIHRyeSB0b1xcbjExNjE6XFx0XFx0ICogY29udmVydCB0aGVtLCBzbyB0aGF0IHdlIGF2b2lkIHRvdWNoaW5nIHN0dWZmIHRoYXQgbmVlZHMgZnNjay5cXG4xMTYyOlxcdFxcdCAqL1xcbjExNjM6XFx0XFx0aWYgKFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkpIHtcXG4xMTY0OlxcdFxcdFxcdGVycm9yID0gZXh0NF9jaGVja19hbGxfZGUoaW5vZGUsIGlsb2MtXFx1MDAzZWJoLFxcbjExNjU6XFx0XFx0XFx0XFx0XFx0XFx0YnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXFxuMTE2NjpcXHRcXHRcXHRcXHRcXHRcXHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4xMTY3OlxcdFxcdFxcdGlmIChlcnJvcilcXG4xMTY4OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjExNjk6XFx0XFx0fVxcbjExNzA6XFx0XFxuMTE3MTpcXHRcXHRtZW1zZXQoXFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcXG4xMTcyOlxcdFxcdGFyLmlub2RlID0gaW5vZGU7XFxuMTE3MzpcXHRcXHRhci5sb2dpY2FsID0gMDtcXG4xMTc0OlxcdFxcdGFyLmxlbiA9IDE7XFxuMTE3NTpcXHRcXHRpZiAoU19JU1JFRyhpbm9kZS1cXHUwMDNlaV9tb2RlKSlcXG4xMTc2OlxcdFxcdFxcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XFxuMTE3NzpcXHRcXHRlbHNlXFxuMTE3ODpcXHRcXHRcXHRhci5mbGFncyA9IDA7XFxuMTE3OTpcXHRcXHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFxcdTAwMjZhciwgXFx1MDAyNmVycm9yKTtcXG4xMTgwOlxcdFxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuMTE4MTpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMTgyOlxcdFxcbjExODM6XFx0XFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cXHUwMDNlaV9zYiwgbmV3YmxvY2spO1xcbjExODQ6XFx0XFx0aWYgKCFkYXRhX2JoKSB7XFxuMTE4NTpcXHRcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuMTE4NjpcXHRcXHRcXHRnb3RvIG91dF9iaDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDA6MzguMjA4MjY2NjQ5WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDkxNTQ4MjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBFeHQ0IElubGluZSBEYXRhIENvbnZlcnNpb24gUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJJ20gc2VlaW5nLCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIGNydWNpYWwgZnVuY3Rpb24gaGVyZS4gVGhpcyBpcyB0aGUgb25lIHRoYXQgYWN0dWFsbHkgYWxsb2NhdGVzIGEgbmV3IGJsb2NrIGFuZCBjYWxscyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBJdCdzIGNhbGxlZCBieSB0d28gcHJpbWFyeSBmdW5jdGlvbnM6IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEkgbmVlZCB0byBrZWVwIGluIG1pbmQgdGhhdCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgaXMgZGlzdGluY3QgYW5kIGhhbmRsZXMgY29udmVyc2lvbnMgZm9yICpyZWd1bGFyKiBmaWxlcyBkdXJpbmcgd3JpdGVzLiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyBzcGVjaWZpY2FsbHkgdXNlZCBmb3IgZGlyZWN0b3JpZXMgKHRocm91Z2ggYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgKSBhbmQgZm9yIHJlZ3VsYXIgZmlsZXMgdmlhIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgLCB3aGljaCBpdHNlbGYgaXMgaW52b2tlZCBieSBvcGVyYXRpb25zIGxpa2UgYGZhbGxvY2F0ZWAsIGBzZXRhdHRyYCwgY3J5cHRvIGFuZCB2ZXJpdHkuXG5cblNvLCBteSBwcmltYXJ5IGZvY3VzIGZvciBmdXp6aW5nIG5lZWRzIHRvIGJlIG9uOlxuXG4qICAgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWBcbiogICBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWBcblxuSSd2ZSBhbHJlYWR5IGRvdWJsZS1jaGVja2VkIGZvciBhbnkgb3RoZXIgY2FsbGVycyBvZiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIGFuZCB0aGUgZ3JlcCByZXN1bHRzIGNvbmZpcm0gdGhhdCBJJ3ZlIGdvdCB0aGUgY29ycmVjdCBlbnRyeSBwb2ludHMuIEp1c3QgdGhvc2UgdHdvLlxuXG5SZWdhcmRpbmcgY29uZmlndXJhdGlvbnMsIGl0J3MganVzdCBgRVhUNF9GU2AsIG5vdGhpbmcgZWxzZSB0byB3b3JyeSBhYm91dCBvbiB0aGF0IGZyb250LlxuXG5JJ3ZlIHJldmlld2VkIHRoZSBwYXRjaCBjbG9zZWx5LiBJdCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIHRoZSBuZXcgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlIGlzIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgd2hlcmUgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgaXMgbm93IHVzZWQgaW5zdGVhZCBvZiBgZXh0NF9tYXBfYmxvY2tzYC4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gaG93IGV4dDQgaGFuZGxlcyBpbmxpbmUgZGF0YSwgd2hpY2ggaXMgZGVmaW5pdGVseSB3b3J0aCBhIGZ1enppbmcgY2FtcGFpZ24gdG8gaWRlbnRpZnkgYW55IGx1cmtpbmcgaXNzdWVzLiBJdCBoYXMgY2hhbmdlZCB0aGUgY29yZSBvZiBleHQ0IGlubGluZSBkYXRhIGhhbmRsaW5nLlxuXG5JbiBlc3NlbmNlLCB0aGUgcGF0Y2ggYWx0ZXJzIHRoZSBjb3JlIG1lY2hhbmlzbSBvZiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCdzIHRvdWNoaW5nIHRoZSBoZWFydCBvZiBleHQ0LiBUaGUgY2hhbmdlcyBpbiB0aGUgaW50ZXJuYWxzLCBsaWtlIHJlcGxhY2luZyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgLCBhbmQgdGhlIGludHJvZHVjdGlvbiBvZiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBjb3VwbGVkIHdpdGggdGhlIGNhbGxlcnMgb2YgdGhlIG1vZGlmaWVkIGZ1bmN0aW9uLCBtYWtlIHRoaXMgYSBoaWdoLXByaW9yaXR5IGZ1enppbmcgdGFyZ2V0LlxuXG5UaW1lIHRvIGxvZyB0aGlzLiBMZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNDYzLCJPdXRwdXRUb2tlbnMiOjIwNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjQ4LjI5OTgyMTIxNloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwNzEyMTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFWFQ0X0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhXCIsXG4gICAgXCJleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHdheSBleHQ0IGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gb2YgaW5saW5lIGRhdGEgdG8gcmVndWxhciBibG9ja3MuIEl0IHJlcGxhY2VzIGBleHQ0X21hcF9ibG9ja3NgIHdpdGggYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgYW5kIGludHJvZHVjZXMgYSBuZXcgaGVscGVyIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgdG8gZGlyZWN0bHkgc2V0IHRoZSBibG9jayB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGlubGluZSBkYXRhIGZpcnN0LiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXh0NCBsb2dpYy4gVGhlIG1vZGlmaWVkIGZ1bmN0aW9uIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgYnkgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCwgd2hpY2ggYXJlIHJlYWNoYWJsZSB2aWEgdmFyaW91cyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBkaXJlY3RvcnkgZW50cnkgYWRkaXRpb25zLiBUaGVyZWZvcmUsIGl0IGlzIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSB3YXkgZXh0NCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGlubGluZSBkYXRhIHRvIHJlZ3VsYXIgYmxvY2tzLiBJdCByZXBsYWNlcyBgZXh0NF9tYXBfYmxvY2tzYCB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgIGFuZCBpbnRyb2R1Y2VzIGEgbmV3IGhlbHBlciBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIHRvIGRpcmVjdGx5IHNldCB0aGUgYmxvY2sgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBpbmxpbmUgZGF0YSBmaXJzdC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV4dDQgbG9naWMuIFRoZSBtb2RpZmllZCBmdW5jdGlvbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgY2FsbGVkIGJ5IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAsIHdoaWNoIGFyZSByZWFjaGFibGUgdmlhIHZhcmlvdXMgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgZGlyZWN0b3J5IGVudHJ5IGFkZGl0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDo0OC4zODA1NDAyMTVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMjc2OTEwMzM2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjQ4LjM4MTE0MzU5NVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyMDI3Njg0OTUwMzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgYmxvY2sgYWxsb2NhdGlvbiBvcmRlciBpbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgdG8gcHJldmVudCBwb3RlbnRpYWwgZGF0YSBsb3NzIHdoZW4gY29udmVydGluZyBpbmxpbmUgZGF0YSB0byBhIGJsb2NrLiBQcmV2aW91c2x5LCBpZiBibG9jayBhbGxvY2F0aW9uIGZhaWxlZCwgaXQgYXR0ZW1wdGVkIHRvIHJlc3RvcmUgdGhlIGlubGluZSBkYXRhLCB3aGljaCBjb3VsZCBmYWlsIGFuZCBjYXVzZSBkYXRhIGxvc3MuIFRoZSBuZXcgbG9naWMgYWxsb2NhdGVzIHRoZSBibG9jayBmaXJzdCBhbmQgb25seSByZW1vdmVzIHRoZSBpbmxpbmUgZGF0YSB1cG9uIHN1Y2Nlc3MuXFxuXFxuQWxsIHN0cnVjdHVyZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGUgcGF0Y2ggKGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLCBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG9yIGV4cGxpY2l0bHkgemVyb2VkICh2aWEgYG1lbXNldGAgb3IgcGFydGlhbCBpbml0aWFsaXphdGlvbiB3aGljaCB6ZXJvZXMgdGhlIHJlc3QpLiBUaGUgYnVmZmVyIGBkYXRhX2JoLVxcdTAwM2ViX2RhdGFgIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJlZm9yZSBjb3B5aW5nIHRoZSBpbmxpbmUgZGF0YS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBwYWRkaW5nIGxlYWtzLCBvciBpbmZvLWxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gQW55IHBvdGVudGlhbCBjcmFzaGVzIChlLmcuLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgcmV0dXJucyBhbiBlcnJvciBwb2ludGVyKSB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gb3Iga2VybmVsIG9vcHMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYjQyZjI0MTA4ZjAxYTM0NWRmNjU1YzgwODlhY2UwY2QzYmFmMTNmZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gQXVnIDE2IDE1OjU5OjUzIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmNcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjJhOTI5OWVhNDE0NmMgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2lubGluZS5jXG4rKysgYi9mcy9leHQ0L2lubGluZS5jXG5AQCAtMTQsNiArMTQsNyBAQFxuICNpbmNsdWRlIFwiZXh0NC5oXCJcbiAjaW5jbHVkZSBcInhhdHRyLmhcIlxuICNpbmNsdWRlIFwidHJ1bmNhdGUuaFwiXG4rI2luY2x1ZGUgXCJleHQ0X2V4dGVudHMuaFwiXG4gXG4gI2RlZmluZSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBXHRcImRhdGFcIlxuICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRVx0KChzaXplb2YoX19sZTMyKSAqIEVYVDRfTl9CTE9DS1MpKVxuQEAgLTEwNzAsMjEgKzEwNzEsNjcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbitzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4rXHRcdFx0XHQgICAgICBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4pXG4ge1xuLVx0aW50IHJldDtcbitcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4rXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcbitcdH07XG4rXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4rXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG4rXHRcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcbitcdFx0LnZhbHVlID0gTlVMTCxcbitcdFx0LnZhbHVlX2xlbiA9IDAsXG4rXHR9O1xuK1x0aW50IGVycm9yO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXCIsXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbitcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdHJldHVybiBlcnJvcjtcbiBcdH1cbi1cdGV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpO1xuLVx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rXHRpZiAoZXJyb3IpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFwiZ2V0X3dyaXRlX2FjY2Vzc1wiKTtcbitcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBvdXQ7XG4rXHRtZW1zZXQoKHZvaWQgKilleHQ0X3Jhd19pbm9kZShcdTAwMjZpcy5pbG9jKS1cdTAwM2VpX2Jsb2NrLFxuK1x0XHQwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdG1lbXNldChlaS1cdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xuK1xuK1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbitcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuK1x0XHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcbitcbitcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTtcbitcdFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcbitcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4rXHRcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuK1x0fSBlbHNlIHtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4rXHR9XG4rXHRleHQ0X2NsZWFyX2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpO1xuK1x0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuK1x0ZXJyb3IgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcbitcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4rXHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4rb3V0OlxuK1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuK1x0aWYgKGVycm9yID09IC1FTk9EQVRBKVxuK1x0XHRlcnJvciA9IDA7XG4rXHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdHJldHVybiBlcnJvcjtcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5AQCAtMTA5NCw4ICsxMTQxLDkgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpbnQgZXJyb3I7XG4gXHR2b2lkICpidWYgPSBOVUxMO1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDtcbi1cdHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwO1xuIFx0aW50IGlubGluZV9zaXplO1xuK1x0ZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMDtcbitcdHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjtcbiBcbiBcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuIFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuQEAgLTExMjAsMjUgKzExNjgsMjIgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRlcnJvciA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFwLm1fbGJsayA9IDA7XG4tXHRtYXAubV9sZW4gPSAxO1xuLVx0bWFwLm1fZmxhZ3MgPSAwO1xuLVx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXHUwMDI2bWFwLCBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKTtcbitcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4rXHRhci5pbm9kZSA9IGlub2RlO1xuK1x0YXIubG9naWNhbCA9IDA7XG4rXHRhci5sZW4gPSAxO1xuK1x0aWYgKFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKSlcbitcdFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcbitcdGVsc2VcbitcdFx0YXIuZmxhZ3MgPSAwO1xuK1x0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcdTAwMjZhciwgXHUwMDI2ZXJyb3IpO1xuIFx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0aWYgKCEobWFwLm1fZmxhZ3MgXHUwMDI2IEVYVDRfTUFQX01BUFBFRCkpIHtcbi1cdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0fVxuK1x0XHRnb3RvIG91dDtcbiBcbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4rXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcbiBcdGlmICghZGF0YV9iaCkge1xuIFx0XHRlcnJvciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4rXHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICsxMTkyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4gXG5AQCAtMTE3MSwxMiArMTIxNiwxNCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdH1cbiBcbi1vdXRfcmVzdG9yZTpcbiBcdGlmIChlcnJvcilcbi1cdFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xuLVxuLW91dDpcbitcdFx0Z290byBvdXRfYmg7XG4rXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsIG5ld2Jsb2NrLCBhci5sZW4pO1xuK291dF9iaDpcbitcdGlmIChlcnJvcilcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYXIubGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4gXHRicmVsc2UoZGF0YV9iaCk7XG4rb3V0OlxuIFx0a2ZyZWUoYnVmKTtcbiBcdHJldHVybiBlcnJvcjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMDo0OC4zODExNDUwMDVaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAyNjI0Nzk1ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gRnV6emluZyBTZXNzaW9uIEp1c3RpZmljYXRpb246IGV4dDQvaW5saW5lLmMgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlJ3ZlIGdvdCBhIHBhdGNoIGluIGBmcy9leHQ0L2lubGluZS5jYCwgYW5kIHRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGl0IHdhcnJhbnRzIGZpcmluZyB1cCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIFRoZSBwYXRjaCBmb2N1c2VzIG9uIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIHdpdGggYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gUmlnaHQsIGxldCdzIHNlZS4uLlxuXG5TbywgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCB6ZXJvcyBvdXQgdGhlIGlubGluZSBkYXRhIGJsb2NrIHVzaW5nIGBtZW1zZXRgLCBib3RoIGluIHRoZSByYXcgaW5vZGUgYW5kIHRoZSBgZWktXHUwMDNlaV9kYXRhYCBzdHJ1Y3R1cmVzLCB3aGljaCBpcyBnb29kLiBUaGVuLCBpdCBzZXRzIHVwIGV4dGVudHMgb3IgZGlyZWN0IGJsb2NrcywgZGVwZW5kaW5nIG9uIHRoZSBmaWxlIHN5c3RlbSBmZWF0dXJlcyBhbmQgaW5vZGUgdHlwZSwgd2hpY2ggaXMgbm9ybWFsLlxuXG5Ob3csIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSXQgdXNlcyBgZXh0NF9tYl9uZXdfYmxvY2tzYCB0byBhbGxvY2F0ZSBuZXcgYmxvY2tzLCB3aGljaCBpcyBhIGtleSBjaGFuZ2UuIFdlIG1lbXNldCB0aGUgYGFyYCBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGltcG9ydGFudCwgYW5kIGFsbG9jYXRlIGEgYnVmZmVyIGhlYWQgYGRhdGFfYmhgLiBUaGVuIHplcm8gdGhlIGJ1ZmZlciBoZWFkJ3MgZGF0YSBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGV4cGxpY2l0bHksIGFnYWluLCBnb29kLiAgVGhlIGlubGluZSBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBibG9jaywgYW5kIGZpbmFsbHksIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgaXMgY2FsbGVkLlxuXG5UaGUgY3JpdGljYWwgcXVlc3Rpb24gaGVyZSBpcyBhcm91bmQgdW5pbml0aWFsaXplZCBtZW1vcnkuIEluaXRpYWxpemluZyBgYXJgIHdpdGggYG1lbXNldGAsIHplcm9pbmcgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBhbmQgdGhlIGBpX2Jsb2NrYCBhbmQgYGlfZGF0YWAgd2l0aCBgbWVtc2V0YCBzZWVtcyBwcmV0dHkgc29saWQuIFRoZW4gdGhlcmUncyB0aGUgYG5ld2V4YCBzdHJ1Y3QsIHdoaWNoIGlzIHBhcnRpYWxseSBpbml0aWFsaXplZCwgYGVlX2Jsb2NrYCBhbmQgYGVlX2xlbmAgYXJlIHNldC4gQnV0IHdoYXQgYWJvdXQgdGhlIG90aGVyIGZpZWxkcyBvZiBgc3RydWN0IGV4dDRfZXh0ZW50YD8gV2UgaGF2ZSB0byBjaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBgc3RydWN0IGV4dDRfZXh0ZW50YCB0byBzZWUgaWYgdGhlcmUncyBhbnkgcmlzayBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJZiBhbnkgb2YgdGhlIG90aGVyIGZpZWxkcyBhcmUgcmVhZCBiZWZvcmUgYmVpbmcgd3JpdHRlbiB0bywgdGhhdCAqY291bGQqIGJlIGEgS01TQU4gaXNzdWUsIHJpZ2h0PyBTbywgdGhpcyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gYmVmb3JlIHdlIGRlY2lkZSBpZiBhIGZ1enppbmcgc2Vzc2lvbiBpcyByZXF1aXJlZC4gSSBuZWVkIHRvIGxvb2sgYXQgdGhhdCBzdHJ1Y3QgZGVmaW5pdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2MywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkyOCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAwOjU4LjY0MzYyODg3WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTMxMzkxOTQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBleHQ0X2V4dGVudCBcXFxce1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTQ4PXN0cnVjdCBleHQ0X2V4dGVudF90YWlsIHtcXG4tLVxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTUtICovXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDo1NjpzdHJ1Y3QgZXh0NF9leHRlbnQge1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXFx0X19sZTMyXFx0ZWVfYmxvY2s7XFx0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjAxLjE3NTAyNjU1OFoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNDQzNzI5MDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIEV4dGVudHMgaW4gZXh0NCoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgZXh0ZW50cyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5LiBUaGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gc3RhcnQgaXMgdGhlIGhlYWRlciBmaWxlLCB3aGljaCB1c3VhbGx5IGRlZmluZXMgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4gSSdtIGdvaW5nIHRvIGp1bXAgaW50byBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAgYW5kIHRha2UgYSBsb29rIGFyb3VuZCBsaW5lIDU2LiBJJ20gaG9waW5nIHRvIGZpbmQgdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgdG8gcmVwcmVzZW50IGFuIGV4dGVudCwgd2hpY2ggd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24uIExldCdzIHNlZSB3aGF0IHdlJ3ZlIGdvdCEgSSdtIGV4cGVjdGluZyB0byBzZWUgdGhpbmdzIGxpa2UgdGhlIGBleHQ0X2V4dGVudF9oZWFkZXJgLCBgZXh0NF9leHRlbnRgLCBhbmQgcG9zc2libHkgc29tZSByZWxhdGVkIHN0cnVjdHVyZXMgZm9yIG1hbmFnaW5nIHRoZSBleHRlbnQgdHJlZSwgaWYgdGhleSdyZSB1c2luZyBvbmUuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBvbi1kaXNrIGZvcm1hdCBhbmQgaG93IHRoZSBsb2dpY2FsLXRvLXBoeXNpY2FsIG1hcHBpbmcgaXMgaGFuZGxlZC4gS25vd2luZyB0aGlzIHNob3VsZCBwcm92aWRlIGtleSBpbnNpZ2h0IGludG8gdW5kZXJzdGFuZGluZyBmaWxlIGFsbG9jYXRpb24gaW4gdGhpcyBmaWxlc3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTk1LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6MDQuNjE4NzU5NTU2WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExODQ0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDUwOlxcdH07XFxuICA1MTpcXHRcXG4gIDUyOlxcdC8qXFxuICA1MzpcXHQgKiBUaGlzIGlzIHRoZSBleHRlbnQgb24tZGlzayBzdHJ1Y3R1cmUuXFxuICA1NDpcXHQgKiBJdCdzIHVzZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZS5cXG4gIDU1OlxcdCAqL1xcbiAgNTY6XFx0c3RydWN0IGV4dDRfZXh0ZW50IHtcXG4gIDU3OlxcdFxcdF9fbGUzMlxcdGVlX2Jsb2NrO1xcdC8qIGZpcnN0IGxvZ2ljYWwgYmxvY2sgZXh0ZW50IGNvdmVycyAqL1xcbiAgNTg6XFx0XFx0X19sZTE2XFx0ZWVfbGVuO1xcdFxcdC8qIG51bWJlciBvZiBibG9ja3MgY292ZXJlZCBieSBleHRlbnQgKi9cXG4gIDU5OlxcdFxcdF9fbGUxNlxcdGVlX3N0YXJ0X2hpO1xcdC8qIGhpZ2ggMTYgYml0cyBvZiBwaHlzaWNhbCBibG9jayAqL1xcbiAgNjA6XFx0XFx0X19sZTMyXFx0ZWVfc3RhcnRfbG87XFx0LyogbG93IDMyIGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cXG4gIDYxOlxcdH07XFxuICA2MjpcXHRcXG4gIDYzOlxcdC8qXFxuICA2NDpcXHQgKiBUaGlzIGlzIGluZGV4IG9uLWRpc2sgc3RydWN0dXJlLlxcbiAgNjU6XFx0ICogSXQncyB1c2VkIGF0IGFsbCB0aGUgbGV2ZWxzIGV4Y2VwdCB0aGUgYm90dG9tLlxcbiAgNjY6XFx0ICovXFxuICA2NzpcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4IHtcXG4gIDY4OlxcdFxcdF9fbGUzMlxcdGVpX2Jsb2NrO1xcdC8qIGluZGV4IGNvdmVycyBsb2dpY2FsIGJsb2NrcyBmcm9tICdibG9jaycgKi9cXG4gIDY5OlxcdFxcdF9fbGUzMlxcdGVpX2xlYWZfbG87XFx0LyogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgYmxvY2sgb2YgdGhlIG5leHQgKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMTowNC42MTg4ODAwMDVaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI5NDczOTE1MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRXh0ZW50IEluaXRpYWxpemF0aW9uIGluIEV4dDQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIGltbWVkaWF0ZWx5IG15IGZvY3VzIGlzIGRyYXduIHRvIHRoZSBgc3RydWN0IGV4dDRfZXh0ZW50YC4gUmlnaHQsIEkgcmVtZW1iZXIgdGhhdCBzdHJ1Y3R1cmU6IGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gLiBDbGFzc2ljLiBOb3csIHdpdGhpbiB0aGlzIHBhdGNoLCBJIHNlZSB0aGV5J3JlIGluaXRpYWxpemluZyBhIG5ldyBleHRlbnQsIGBuZXdleGAuIFRoZSBjb2RlIHNuaXBwZXQgc2hvd3M6XG5cbmBgYGNcblx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7XG5cblx0XHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApO1xuXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XG5cdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG5gYGBcblxuVGhlIGZpcnN0IHR3byBpbml0aWFsaXphdGlvbnMgYXJlIHN0cmFpZ2h0Zm9yd2FyZDogc2V0dGluZyBgZWVfYmxvY2tgIHRvIHplcm8gKGxpa2VseSByZXByZXNlbnRpbmcgYW4gdW5hbGxvY2F0ZWQgb3IgZW1wdHkgYmxvY2spIGFuZCBgZWVfbGVuYCB0byBgbGVuYCBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gVGhlIGNyaXRpY2FsIHBhcnQgaGVyZSBpcyB0aGlzIGNhbGwgdG8gYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AuIEkgbmVlZCB0byBkaWcgaW50byB0aGF0IGZ1bmN0aW9uLiBDbGVhcmx5LCB0aGF0J3Mgd2hlcmUgdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpcyBiZWluZyBzdG9yZWQsIHByb2JhYmx5IHNwcmVhZGluZyBpdCBhY3Jvc3MgdGhlIGBlZV9zdGFydF9oaWAgYW5kIGBlZV9zdGFydF9sb2AgZmllbGRzLCB3aGljaCBpcyB0aGUgc3RhbmRhcmQgcHJvY2VkdXJlLiBJJ2xsIG5lZWQgdG8gdmVyaWZ5IHRoYXQgaXQgY29ycmVjdGx5IGhhbmRsZXMgdGhlIDY0LWJpdCBibG9jayBudW1iZXJzLiBJJ2xsIGdvIGNoZWNrIHRoYXQgbmV4dC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjIwMSwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjA4LjkxMzYyMjI3NloiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwODMxNTQwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2V4dF9zdG9yZV9wYmxvY2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yMzI9c3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9pZHhfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKml4KVxcbi0tXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDEtLypcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0MjogKiBleHQ0X2V4dF9zdG9yZV9wYmxvY2s6XFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDMtICogc3RvcmVzIGEgbGFyZ2UgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gYW4gZXh0ZW50IHN0cnVjdCxcXG4tLVxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ1LSAqL1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6MjQ2OnN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0Ny1cXHRcXHRcXHRcXHRcXHQgZXh0NF9mc2Jsa190IHBiKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0yMjc9c3RhdGljIGludCBleHRlbnRzX2t1bml0X2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy0zMTktXFx0RVhUX0ZJUlNUX0VYVEVOVChlaCktXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KEVYVF9EQVRBX0xFTik7XFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzozMjA6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKEVYVF9GSVJTVF9FWFRFTlQoZWgpLCBFWFRfREFUQV9QQkxLKTtcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMyMS1cXHRpZiAoIXBhcmFtIHx8IHBhcmFtLVxcdTAwM2Vpc191bndyaXRfYXRfc3RhcnQpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIwODUtXFx0XFx0XFx0ZXgtXFx1MDAzZWVlX2Jsb2NrID0gbmV3ZXh0LVxcdTAwM2VlZV9ibG9jaztcXG5mcy9leHQ0L2V4dGVudHMuYzoyMDg2OlxcdFxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIwODctXFx0XFx0XFx0ZXgtXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjE5Ni1cXHRuZWFyZXgtXFx1MDAzZWVlX2Jsb2NrID0gbmV3ZXh0LVxcdTAwM2VlZV9ibG9jaztcXG5mcy9leHQ0L2V4dGVudHMuYzoyMTk3OlxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhuZWFyZXgsIGV4dDRfZXh0X3BibG9jayhuZXdleHQpKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTk4LVxcdG5lYXJleC1cXHUwMDNlZWVfbGVuID0gbmV3ZXh0LVxcdTAwM2VlZV9sZW47XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yNjE0PWV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTI3MzktXFx0XFx0XFx0LyogdGhpcyBleHRlbnQgaXMgcmVtb3ZlZDsgbWFyayBzbG90IGVudGlyZWx5IHVudXNlZCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjI3NDA6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0yNzQxLVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MzE5MT1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfZXh0ZW50X2F0KGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zMjQ2LVxcdGV4Mi1cXHUwMDNlZWVfbGVuICAgPSBjcHVfdG9fbGUxNihlZV9sZW4gLSAoc3BsaXQgLSBlZV9ibG9jaykpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjMyNDc6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MiwgbmV3YmxvY2spO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDgtXFx0aWYgKGlzX3Vud3JpdClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTM1NTc9ZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzY0NS1cXHRcXHRcXHRleC1cXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihlZV9ibG9jayArIG1hcF9sZW4pO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM2NDY6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBlZV9wYmxrICsgbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzY0Ny1cXHRcXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNjkxLVxcdFxcdFxcdGFidXRfZXgtXFx1MDAzZWVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobmV4dF9sYmxrIC0gbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmM6MzY5MjpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soYWJ1dF9leCwgbmV4dF9wYmxrIC0gbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzY5My1cXHRcXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ1LVxcdFxcdFxcdFxcdGNwdV90b19sZTE2KCphbGxvY2F0ZWQgLSBzcGxpdF9tYXAubV9sZW4pO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM3NDY6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZ6ZXJvX2V4MSxcXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ3LVxcdFxcdFxcdFxcdGV4dDRfZXh0X3BibG9jayhleCkgKyBzcGxpdF9tYXAubV9sYmxrICtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NjAtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ZWVfYmxvY2spO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM3NjE6XFx0XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZ6ZXJvX2V4MixcXG5mcy9leHQ0L2V4dGVudHMuYy0zNzYyLVxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIGV4dDRfZXh0X3BibG9jayhleCkpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDQ3My1cXHRwYmxrID0gbmV3YmxvY2sgKyBvZmZzZXQ7XFxuZnMvZXh0NC9leHRlbnRzLmM6NDQ3NDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBwYmxrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy00NDc1LVxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGFyLmxlbik7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01NzYzPWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTg5Ny1cXHRcXHR0bXBfZXggPSAqZXgxO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU4OTg6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MSwgZXh0NF9leHRfcGJsb2NrKGV4MikpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU4OTk6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MiwgZXh0NF9leHRfcGJsb2NrKFxcdTAwMjZ0bXBfZXgpKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01OTAwLVxcdFxcdGV4MS1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZTJfbGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYwMjc9aW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDgwLVxcdFxcdGV4dDRfZXh0X21hcmtfaW5pdGlhbGl6ZWQoZXgpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYwODE6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBwYmxrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDgyLVxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTkzMT1zdGF0aWMgaW50IGV4dDRfZmNfd3JpdGVfaW5vZGVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKmNyYylcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy05NjEtXFx0XFx0ZXgtXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KHJhbmdlLVxcdTAwM2VsZW4pO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo5NjI6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCByYW5nZS1cXHUwMDNlcGJsayk7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2My1cXHRcXHRpZiAocmFuZ2UtXFx1MDAzZXVud3JpdHRlbilcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjIwMi1cXHRcXHRcXHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGN1cik7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIyMDM6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjA0LVxcdFxcdFxcdFxcdFxcdTAwMjZuZXdleCwgc3RhcnRfcGJsayArIGN1ciAtIHN0YXJ0KTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTExMTctXFx0XFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcXG5mcy9leHQ0L2lubGluZS5jOjExMTg6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZuZXdleCwgYmxvY2spO1xcbmZzL2V4dDQvaW5saW5lLmMtMTExOS1cXHRcXHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgMCk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmMtMzMtXFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG5mcy9leHQ0L21pZ3JhdGUuYzozNDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4dCwgbGItXFx1MDAzZWZpcnN0X3BibG9jayk7XFxuZnMvZXh0NC9taWdyYXRlLmMtMzUtXFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6MTAuNTIxOTQyMjIzWiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNjk4MzM4NjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHJlYWRpbmcgYW5kIHRoaW5raW5nIGFib3V0IHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IGEgZ29vZCBsb29rIGF0IGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgLiBMZXQncyBwdWxsIHVwIHRoZSBkZWZpbml0aW9uLCByaWdodCBoZXJlIGluIGBmcy9leHQ0L2V4dDRfZXh0ZW50cy5oYC4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBmdW5jdGlvbiBwbGF5cyB3aXRoIHRoZSBleHRlbnQgc3RydWN0dXJlIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBzb2xpZCBncmFzcCBvZiB0aGUgb3ZlcmFsbCBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCByZWxhdGVzIHRvIGJsb2NrIGFsbG9jYXRpb24sIHNvIGxldCdzIHNlZSBob3cgdGhpcyBwaWVjZSBmaXRzIGluLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgZGVhbHMgd2l0aCB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyLCBvciBgcGJsb2NrYCwgd2l0aGluIGEgZ2l2ZW4gZXh0ZW50LCBidXQgbGV0J3MgY29uZmlybSB0aGF0LiBJJ20gZ3Vlc3NpbmcgaXQgaGFuZGxlcyBzdG9yaW5nIG9yIHJldHJpZXZpbmcgdGhhdCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gSXQncyBsaWtlbHkgaW52b2x2ZWQgaW4gdXBkYXRpbmcgYW4gZXh0ZW50J3MgbWV0YWRhdGEgd2hlbiBhIGZpbGUgYmxvY2sgZ2V0cyBhbGxvY2F0ZWQgb3IgZGVhbGxvY2F0ZWQsIG9yIG1heWJlIHdoZW4gaGFuZGxpbmcgZmlsZSBleHRlbnNpb24gb3IgdHJ1bmNhdGlvbi4gTGV0J3Mgc2VlIGhvdyBpdCBoYW5kbGVzIHRob3NlIGVkZ2UgY2FzZXMuIEkgaG9wZSB0aGUgaW5saW5lIGNvbW1lbnRzIGFyZSBnb29kLCB0aGF0IHdvdWxkIG1ha2UgdGhpcyBlYXNpZXIuIEFscmlnaHQsIGxldCdzIGRpZyBpbiBhbmQgc2VlIGV4YWN0bHkgd2hhdCdzIGhhcHBlbmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTA1MSwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjE0LjY5MTc3ODEyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk4NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0NF9leHRlbnRzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjQyLFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjQyOlxcdCAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcXG4gMjQzOlxcdCAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsXFxuIDI0NDpcXHQgKiBicmVha2luZyBpdCBpbnRvIHBhcnRzXFxuIDI0NTpcXHQgKi9cXG4gMjQ2OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcXG4gMjQ3OlxcdFxcdFxcdFxcdFxcdFxcdCBleHQ0X2ZzYmxrX3QgcGIpXFxuIDI0ODpcXHR7XFxuIDI0OTpcXHRcXHRleC1cXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFxcdTAwMjYgMHhmZmZmZmZmZikpO1xcbiAyNTA6XFx0XFx0ZXgtXFx1MDAzZWVlX3N0YXJ0X2hpID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIGxvbmcpICgocGIgXFx1MDAzZVxcdTAwM2UgMzEpIFxcdTAwM2VcXHUwMDNlIDEpIFxcdTAwMjZcXG4gMjUxOlxcdFxcdFxcdFxcdFxcdCAgICAgIDB4ZmZmZik7XFxuIDI1MjpcXHR9XFxuIDI1MzpcXHRcXG4gMjU0OlxcdC8qXFxuIDI1NTpcXHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XFxuIDI1NjpcXHQgKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBpbmRleCBzdHJ1Y3QsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjE0LjY5MTg3ODQ5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExODQxNjMwNTE5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBEYXRhIEluaXRpYWxpemF0aW9uIGluIGV4dDQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBob3cgc29tZSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBpbml0aWFsaXplZCBoZXJlLCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gY29kZS4gRmlyc3QsIEkgc2VlIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgYGVlX3N0YXJ0X2xvYCBhbmQgYGVlX3N0YXJ0X2hpYCB3aXRoaW4gdGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgLiBCZWZvcmUgdGhhdCwgYGVlX2Jsb2NrYCBhbmQgYGVlX2xlbmAgYXJlIHNldCwgc28gYWxsIGZpZWxkcyBvZiBgbmV3ZXhgIGFyZSBzZXQ6XG5cbmBgYGNcblx0XHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApO1xuXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbik7XG5cdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG5gYGBcblxuSSBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGUgc2l6ZSBvZiBgZXh0NF9leHRlbnRgLiBJdCdzIGBlZV9ibG9ja2AgKDQgYnl0ZXMpLCBgZWVfbGVuYCAoMiBieXRlcyksIGBlZV9zdGFydF9oaWAgKDIgYnl0ZXMpLCBhbmQgYGVlX3N0YXJ0X2xvYCAoNCBieXRlcyksIHRvdGFsaW5nIDEyIGJ5dGVzLiBBbmQsIG5vIHBhZGRpbmcgaXMgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLCBzbyBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhcyBleHBlY3RlZC5cblxuVGhlbiBJIGxvb2sgYXQgYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgLCB3aGljaCBhcHBlYXJzIHRvIGJlIHBhcnRpYWxseSBpbml0aWFsaXplZDpcblxuYGBgY1xuXHRzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0ge1xuXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcblx0fTtcbmBgYFxuXG5UaGUgY29tcGlsZXIgd2lsbCB6ZXJvIG91dCB0aGUgcmVtYWluaW5nIGZpZWxkcy4gU2FtZSBnb2VzIGZvciBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCwgcGFydGlhbGx5IGluaXRpYWxpemVkIGFuZCB0aGUgcmVzdCB3aWxsIGJlIHplcm9lZCBvdXQuXG5cbmBgYGNcblx0c3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpID0ge1xuXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG5cdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuXHRcdC52YWx1ZSA9IE5VTEwsXG5cdFx0LnZhbHVlX2xlbiA9IDAsXG5cdH07XG5gYGBcblxuYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLCB0aGF0J3MgY2xlYXIgZW5vdWdoLlxuXG5gYGBjXG5cdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG5gYGBcblxuTm93LCByZWdhcmRpbmcgYGJ1ZmAsIEkgc2VlIGl0J3MgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgLCBidXQgd2l0aG91dCBgX19HRlBfWkVST2AuIFRoZSBjb2RlIHRoZW4gcmVhZHMgaW5saW5lIGRhdGEgaW50byBgYnVmYDpcblxuYGBgY1xuXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcblx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuXHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBcdTAwMjZpbmxpbmVfc2l6ZSwgXHUwMDI2aWxvYyk7XG5gYGBcblxuSWYgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZmFpbHMsIGBidWZgIGdldHMgZnJlZWQuIElmIGl0IHN1Y2NlZWRzLCBgYnVmYCBjb250YWlucyB0aGUgaW5saW5lIGRhdGEuIEFmdGVyIHRoYXQsIGEgbmV3IGJsb2NrIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkIHVzaW5nIGBtZW1zZXRgLiBUaGUgY29udGVudHMgb2YgYGJ1ZmAgYXJlIHRoZW4gY29waWVkIGludG8gdGhhdCBuZXdseSBhbGxvY2F0ZWQgYmxvY2ssIGJ1dCBvbmx5IGlmIHRoZSBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeS5cblxuYGBgY1xuXHRtZW1zZXQoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIDAsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuXHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSlcblx0XHRtZW1jcHkoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpO1xuYGBgXG5cblRoaXMgcmFpc2VzIHRoZSBxdWVzdGlvbjogSXMgYGJ1ZmAgKmd1YXJhbnRlZWQqIHRvIGJlIGZ1bGx5IGluaXRpYWxpemVkIGJ5IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgPyBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyB0aGF0IGZ1bmN0aW9uIHdvcmtzIHRvIGJlIGNlcnRhaW4uIFRoYXQncyB0aGUga2V5IHF1ZXN0aW9uIGhlcmUsIHRoYXQgZnVuY3Rpb24gaXMgY3JpdGljYWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2MzMsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3ODEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMToyNi41MzM1MTIxNzlaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1OTg2NjM4MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9yZWFkX2lubGluZV9kYXRhXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvaW5saW5lLmM9MTQ1PWludCBleHQ0X2ZpbmRfaW5saW5lX2RhdGFfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE4My1cXG5mcy9leHQ0L2lubGluZS5jOjE4NDpzdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsXFxuZnMvZXh0NC9pbmxpbmUuYy0xODUtXFx0XFx0XFx0XFx0IHVuc2lnbmVkIGludCBsZW4sXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTUwND1zdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTM1LVxcdGthZGRyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgMCk7XFxuZnMvZXh0NC9pbmxpbmUuYzo1MzY6XFx0cmV0ID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBrYWRkciwgbGVuLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy01MzctXFx0a2FkZHIgPSBmb2xpb196ZXJvX3RhaWwoZm9saW8sIGxlbiwga2FkZHIgKyBsZW4pO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMTM3PXN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTU0LVxcbmZzL2V4dDQvaW5saW5lLmM6MTE1NTpcXHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTU2LVxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEzMDU9aW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMzQwLVxcbmZzL2V4dDQvaW5saW5lLmM6MTM0MTpcXHRyZXQgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGRpcl9idWYsIGlubGluZV9zaXplLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMzQyLVxcdHVwX3JlYWQoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZXhhdHRyX3NlbSk7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE0MjY9aW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNDU5LVxcbmZzL2V4dDQvaW5saW5lLmM6MTQ2MDpcXHRyZXQgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGRpcl9idWYsIGlubGluZV9zaXplLCBcXHUwMDI2aWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xNDYxLVxcdHVwX3JlYWQoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZXhhdHRyX3NlbSk7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE1NTc9dm9pZCAqZXh0NF9yZWFkX2lubGluZV9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE1NzItXFxuZnMvZXh0NC9pbmxpbmUuYzoxNTczOlxcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgbGluaywgaW5saW5lX3NpemUsIFxcdTAwMjZpbG9jKTtcXG5mcy9leHQ0L2lubGluZS5jLTE1NzQtXFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6MjguMTMyMTg4NDc0WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc0OTQzNDU1MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvcmUgZnVuY3Rpb24gaXQgc2VydmVzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIGFyY2hpdGVjdHVyZS4gSSdtIGltbWVkaWF0ZWx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGRldmlhdGVzIGZyb20gdGhlIHN0YW5kYXJkIGJsb2NrLWJhc2VkIHJlYWQgb3BlcmF0aW9ucy4gSSdtIGV4cGVjdGluZyB0aGlzIGhhbmRsZXMgZGF0YSB0aGF0J3MgKmlubGluZSogd2l0aGluIHRoZSBpbm9kZSBpdHNlbGYsIGJ5cGFzc2luZyB0aGUgbmVlZCBmb3Igc2VwYXJhdGUgZGF0YSBibG9ja3MuIFRoaXMgaW1wbGllcyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBiZW5lZml0cywgYXNzdW1pbmcgdGhlIGRhdGEgc2l6ZSBpcyBhcHByb3ByaWF0ZSBmb3IgaW5saW5lIHN0b3JhZ2UuXG5cbkknbGwgYmUgbG9va2luZyBmb3Igc2V2ZXJhbCBrZXkgdGhpbmdzOiB0aGUgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgdGhpcyBmdW5jdGlvbiAoaS5lLiwgd2hlbiBkb2VzIGV4dDQgZGVjaWRlIHRvIHVzZSBpbmxpbmUgZGF0YT8pLCBob3cgaXQgdmVyaWZpZXMgdGhlIGludGVncml0eSBvZiB0aGUgaW5saW5lIGRhdGEgKGNoZWNrc3VtcywgbGVuZ3RoIGNoZWNrcywgZXRjLiksIHRoZSBtZWNoYW5pc21zIHVzZWQgdG8gY29weSB0aGUgZGF0YSBvdXQgdG8gdGhlIHJlcXVlc3RpbmcgYnVmZmVyLCBhbmQgaWYgdGhlcmUgYXJlIGFueSBvcHRpbWl6YXRpb25zIHNwZWNpZmljIHRvIGlubGluZSByZWFkcy4gTXkgZXhwZXJpZW5jZSB0ZWxscyBtZSB0aGVyZSBhcmUgdXN1YWxseSBjb25zaWRlcmF0aW9ucyByZWxhdGVkIHRvIHBhcnRpYWwgcmVhZHMgYW5kIGhvdyB0aGV5IGFyZSBoYW5kbGVkLCBhbG9uZyB3aXRoIHBvdGVudGlhbCBhbGlnbm1lbnQgaXNzdWVzLlxuXG5JJ2xsIGFsc28ga2VlcCBhbiBleWUgb3V0IGZvciBwb3RlbnRpYWwgY29uY3VycmVuY3kgY29uY2VybnMuIElmIHRoaXMgZnVuY3Rpb24gaXMgaGVhdmlseSB1c2VkIGFuZCBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLCB0aGVyZSBtaWdodCBiZSBsb2NraW5nIG1lY2hhbmlzbXMgdG8gZW5zdXJlIGRhdGEgY29uc2lzdGVuY3kuXG5cblVsdGltYXRlbHksIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHBhdGggb2YgZXhlY3V0aW9uOiBmcm9tIHRoZSBWRlMgbGF5ZXIgbWFraW5nIHRoZSByZWFkIHJlcXVlc3QgYWxsIHRoZSB3YXkgZG93biB0byBob3cgdGhlIGlubGluZSBkYXRhIGlzIHJldHJpZXZlZCBhbmQgcGFzc2VkIGJhY2sgdG8gdGhlIHVzZXIgc3BhY2UgYnVmZmVyLiBJJ20gYXNzdW1pbmcgdGhlcmUncyBsaWtlbHkgc29tZSBjbGV2ZXIgYml0IG1hbmlwdWxhdGlvbiBvciBkYXRhIHN0cnVjdHVyZSB1bmRlcnN0YW5kaW5nIGluIHBsYXkgaGVyZSB0byBtYWtlIHRoaXMgZWZmaWNpZW50LiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTkyMSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjM1LjYyNjUzOTY1NloiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTI0MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pbmxpbmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxODA6XFx0XFx0YnJlbHNlKGlzLmlsb2MuYmgpO1xcbiAxODE6XFx0XFx0cmV0dXJuIGVycm9yO1xcbiAxODI6XFx0fVxcbiAxODM6XFx0XFxuIDE4NDpcXHRzdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IGxlbixcXG4gMTg2OlxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxcbiAxODc6XFx0e1xcbiAxODg6XFx0XFx0c3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmVudHJ5O1xcbiAxODk6XFx0XFx0c3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7XFxuIDE5MDpcXHRcXHRpbnQgY3BfbGVuID0gMDtcXG4gMTkxOlxcdFxcdHN0cnVjdCBleHQ0X2lub2RlICpyYXdfaW5vZGU7XFxuIDE5MjpcXHRcXG4gMTkzOlxcdFxcdGlmICghbGVuKVxcbiAxOTQ6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDE5NTpcXHRcXG4gMTk2OlxcdFxcdEJVR19PTihsZW4gXFx1MDAzZSBFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplKTtcXG4gMTk3OlxcdFxcbiAxOTg6XFx0XFx0Y3BfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xcbiAxOTk6XFx0XFxuIDIwMDpcXHRcXHRyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZShpbG9jKTtcXG4gMjAxOlxcdFxcdG1lbWNweShidWZmZXIsICh2b2lkICopKHJhd19pbm9kZS1cXHUwMDNlaV9ibG9jayksIGNwX2xlbik7XFxuIDIwMjpcXHRcXG4gMjAzOlxcdFxcdGxlbiAtPSBjcF9sZW47XFxuIDIwNDpcXHRcXHRidWZmZXIgKz0gY3BfbGVuO1xcbiAyMDU6XFx0XFxuIDIwNjpcXHRcXHRpZiAoIWxlbilcXG4gMjA3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbiAyMDg6XFx0XFxuIDIwOTpcXHRcXHRoZWFkZXIgPSBJSERSKGlub2RlLCByYXdfaW5vZGUpO1xcbiAyMTA6XFx0XFx0ZW50cnkgPSAoc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKikoKHZvaWQgKilyYXdfaW5vZGUgK1xcbiAyMTE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX29mZik7XFxuIDIxMjpcXHRcXHRsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbixcXG4gMjEzOlxcdFxcdFxcdCAgICAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LVxcdTAwM2VlX3ZhbHVlX3NpemUpKTtcXG4gMjE0OlxcdFxcbiAyMTU6XFx0XFx0bWVtY3B5KGJ1ZmZlcixcXG4gMjE2OlxcdFxcdCAgICAgICAodm9pZCAqKUlGSVJTVChoZWFkZXIpICsgbGUxNl90b19jcHUoZW50cnktXFx1MDAzZWVfdmFsdWVfb2ZmcyksIGxlbik7XFxuIDIxNzpcXHRcXHRjcF9sZW4gKz0gbGVuO1xcbiAyMTg6XFx0XFxuIDIxOTpcXHRvdXQ6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjM1LjYyNjc5NDc4NloiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTA1NzI1MTIwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gU28sIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIHN1cHBvc2VkIHRvIGNvcHkgaW5saW5lIGRhdGEgZnJvbSBhbiBpbm9kZSBpbnRvIGEgYnVmZmVyLiBNeSBpbml0aWFsIHVuZGVyc3RhbmRpbmcsIGJhc2VkIG9uIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgY29kZSwgaXMgdGhhdCBpdCBjb3BpZXMgZXhhY3RseSBgaW5saW5lX3NpemVgIGJ5dGVzLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhLCB3aGljaCBpcyBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jYC5cblxuSG93ZXZlciwgbG9va2luZyBjbG9zZXIsIHRoZXJlJ3MgYSBjcnVjaWFsIGRldGFpbC4gVGhlIGBsZW5gIHBhcmFtZXRlciBwYXNzZWQgdG8gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgaXMsIGluIGZhY3QsIGBpbmxpbmVfc2l6ZWAuIFRoZSBmdW5jdGlvbiBjb3BpZXMgdXAgdG8gdGhlIHByb3ZpZGVkIGBsZW5gIGJ5dGVzLCBidXQgKkJVR19PTnMqIGlmIGBsZW5gIGV4Y2VlZHMgdGhlIGFjdHVhbCBpbmxpbmUgZGF0YSBzaXplLiBUaGlzIG1ha2VzIHNlbnNlLlxuXG5UaGVuIEkgc2VlIHRoaXMgc25pcHBldDpcblxuYGBgY1xubGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sXG5cdFx0ICAgICh1bnNpZ25lZCBpbnQpbGUzMl90b19jcHUoZW50cnktXHUwMDNlZV92YWx1ZV9zaXplKSk7XG5gYGBcblxuQWhhISBgbGVuYCAod2hpY2ggc3RhcnRlZCBhcyBgaW5saW5lX3NpemVgKSBpcyBwb3RlbnRpYWxseSByZWR1Y2VkIGJ5IHRoZSBzaXplIG9mIHRoZSAqdmFsdWUqIG9mIHRoZSBpbmxpbmUgZGF0YSBlbnRyeS4gVGhpcyByZWR1Y3Rpb24gb2YgYGxlbmAgaW50cm9kdWNlcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgZnVuY3Rpb24gZG9lc24ndCBjb3B5IHRoZSBmdWxsIGBpbmxpbmVfc2l6ZWAgYnl0ZXMuIEFuZCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB0aGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsIGFzIGBlcnJvcmAsIHdoaWNoIGlzIHRoZW4gbGF0ZXIgdXNlZCBhcyBzdWNoOlxuXG5gYGBjXG5cdGVycm9yID0gZXh0NF9yZWFkX2lubGluZV9kYXRhKGlub2RlLCBidWYsIGlubGluZV9zaXplLCBpbG9jKTtcblx0aWYgKGVycm9yIFx1MDAzYyAwKVxuXHRcdGdvdG8gb3V0O1xuYGBgXG5cbkhlcmUncyB0aGUgcHJvYmxlbTogVGhlIGNvZGUgKmRvZXNuJ3QqIGNoZWNrIGlmIGBlcnJvcmAgaXMgbGVzcyB0aGFuIGBpbmxpbmVfc2l6ZWAuIEl0IHByb2NlZWRzIHRvIGBtZW1jcHlgIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCB1c2luZyBgaW5saW5lX3NpemVgIGFzIHRoZSBjb3B5IHNpemUuIElmIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvcGllZCBmZXdlciB0aGFuIGBpbmxpbmVfc2l6ZWAgYnl0ZXMsIHRoZW4gdGhlIGBidWZgIGJ1ZmZlciB3aWxsIGNvbnRhaW4gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSBga21hbGxvY2AgYWxsb2NhdGlvbi4gVGhvc2UgdW5pbml0aWFsaXplZCBieXRlcyB3aWxsIHRoZW4gYmUgY29waWVkIGludG8gYGRhdGFfYmgtXHUwMDNlYl9kYXRhYC4gVGhpcyBjb3VsZCBsZWFkIHRvIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcywgc2luY2UgdGhlc2UgdW5pbml0aWFsaXplZCBieXRlcyBhcmUgZWZmZWN0aXZlbHkgZGF0YSBsZWFrYWdlIGZyb20gbWVtb3J5LiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBjb3BpZXMgbGVzcyB0aGFuIHRoZSBgaW5saW5lX3NpemVgLCBpbiB0aGUgY2FsbGVycy4gSSBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYWN0dWFsIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvZGUgYW5kIGhvdyBgZW50cnktXHUwMDNlZV92YWx1ZV9zaXplYCBpcyBkZXRlcm1pbmVkLiBJdCdzIHRpbWUgdG8gdGVzdCBhbmQgcmVwcm9kdWNlIHRoZSBpc3N1ZSBhbmQgdGhlbiBwYXRjaCB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjkxOSwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjQ2LjY4NDA0OTUyOVoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYxMzI2ODE2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2dldF9pbmxpbmVfc2l6ZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2lubGluZS5jPTI1PXN0YXRpYyBpbnQgZXh0NF9kYV9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjgtXFxuZnMvZXh0NC9pbmxpbmUuYzoyOTpzdGF0aWMgaW50IGV4dDRfZ2V0X2lubGluZV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9pbmxpbmUuYy0zMC17XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTUwND1zdGF0aWMgaW50IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTI0LVxcbmZzL2V4dDQvaW5saW5lLmM6NTI1OlxcdGxlbiA9IG1pbl90KHNpemVfdCwgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpLCBpX3NpemVfcmVhZChpbm9kZSkpO1xcbmZzL2V4dDQvaW5saW5lLmMtNTI2LVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz01NzM9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy02MjMtXFx0ZnJvbSA9IDA7XFxuZnMvZXh0NC9pbmxpbmUuYzo2MjQ6XFx0dG8gPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy02MjUtXFx0aWYgKCFmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSkge1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz04ODY9c3RhdGljIGludCBleHQ0X2RhX2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy05MDMtXFxuZnMvZXh0NC9pbmxpbmUuYzo5MDQ6XFx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy05MDUtXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExMzc9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTExNDctXFxuZnMvZXh0NC9pbmxpbmUuYzoxMTQ4OlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtMTE0OS1cXHRidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEzMDU9aW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMzMyLVxcbmZzL2V4dDQvaW5saW5lLmM6MTMzMzpcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jLTEzMzQtXFx0ZGlyX2J1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTQyNj1pbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE0NTEtXFxuZnMvZXh0NC9pbmxpbmUuYzoxNDUyOlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtMTQ1My1cXHRkaXJfYnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xNTU3PXZvaWQgKmV4dDRfcmVhZF9pbmxpbmVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNTY3LVxcdHJldCA9IC1FTk9NRU07XFxuZnMvZXh0NC9pbmxpbmUuYzoxNTY4OlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtMTU2OS1cXHRsaW5rID0ga21hbGxvYyhpbmxpbmVfc2l6ZSArIDEsIEdGUF9OT0ZTKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTYzOT1zdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfZmluZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICpkaXIsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE2NzktXFxuZnMvZXh0NC9pbmxpbmUuYzoxNjgwOlxcdGlmIChleHQ0X2dldF9pbmxpbmVfc2l6ZShkaXIpID09IEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpXFxuZnMvZXh0NC9pbmxpbmUuYy0xNjgxLVxcdFxcdGdvdG8gb3V0O1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNjgzLVxcdGlubGluZV9zdGFydCA9IGV4dDRfZ2V0X2lubGluZV94YXR0cl9wb3MoZGlyLCBcXHUwMDI2aXMuaWxvYyk7XFxuZnMvZXh0NC9pbmxpbmUuYzoxNjg0OlxcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoZGlyKSAtIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkU7XFxuZnMvZXh0NC9pbmxpbmUuYy0xNjg1LVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xNzAyPWludCBleHQ0X2RlbGV0ZV9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTcyOS1cXHRcXHRpbmxpbmVfc3RhcnQgPSBleHQ0X2dldF9pbmxpbmVfeGF0dHJfcG9zKGRpciwgXFx1MDAyNmlsb2MpO1xcbmZzL2V4dDQvaW5saW5lLmM6MTczMDpcXHRcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcikgLVxcbmZzL2V4dDQvaW5saW5lLmMtMTczMS1cXHRcXHRcXHRcXHRFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xNzYwPWV4dDRfZ2V0X2lubGluZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xNzY3LVxcbmZzL2V4dDQvaW5saW5lLmM6MTc2ODpcXHRCVUdfT04ob2Zmc2V0IFxcdTAwM2UgZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpKTtcXG5mcy9leHQ0L2lubGluZS5jLTE3NjktXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE3NzUtXFx0XFx0b2Zmc2V0IC09IEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkU7XFxuZnMvZXh0NC9pbmxpbmUuYzoxNzc2OlxcdFxcdCppbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKSAtXFxuZnMvZXh0NC9pbmxpbmUuYy0xNzc3LVxcdFxcdFxcdFxcdEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkU7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE3ODU9Ym9vbCBlbXB0eV9pbmxpbmVfZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgKmhhc19pbmxpbmVfZGF0YSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTgxNy1cXG5mcy9leHQ0L2lubGluZS5jOjE4MTg6XFx0aW5saW5lX2xlbiA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGRpcik7XFxuZnMvZXh0NC9pbmxpbmUuYy0xODE5LVxcdG9mZnNldCA9IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xODU5PWludCBleHQ0X2lubGluZV9kYXRhX2lvbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpb21hcCAqaW9tYXApXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE4ODAtXFx0aW9tYXAtXFx1MDAzZW9mZnNldCA9IDA7XFxuZnMvZXh0NC9pbmxpbmUuYzoxODgxOlxcdGlvbWFwLVxcdTAwM2VsZW5ndGggPSBtaW5fdChsb2ZmX3QsIGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKSxcXG5mcy9leHQ0L2lubGluZS5jLTE4ODItXFx0XFx0XFx0ICAgICAgaV9zaXplX3JlYWQoaW5vZGUpKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE5MjYtXFx0aV9zaXplID0gaW5vZGUtXFx1MDAzZWlfc2l6ZTtcXG5mcy9leHQ0L2lubGluZS5jOjE5Mjc6XFx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xOTI4LVxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGlza3NpemUgPSBpX3NpemU7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAxOjQ4LjI5NzM0NDMwNloiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTk0MjY3NTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBgZXh0NF9nZXRfaW5saW5lX3NpemVgKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBgZXh0NF9nZXRfaW5saW5lX3NpemVgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBmb2N1c2VzIG9uIGl0cyBwdXJwb3NlOiBjbGVhcmx5LCB0aGlzIHJvdXRpbmUgaXMgZGVzaWduZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGRhdGEgdGhhdCBjYW4gYmUgaW5saW5lZCB3aXRoaW4gYW4gZXh0NCBpbm9kZSBpdHNlbGYuIEkgbmVlZCB0byBpbW1lZGlhdGVseSB1bmRlcnN0YW5kIHdoYXQgaW5wdXRzIGl0IHRha2VzLiBMaWtlbHksIHRoZXJlIHdpbGwgYmUgYXJndW1lbnRzIHBlcnRhaW5pbmcgdG8gdGhlIGlub2RlIGl0c2VsZiwgYW5kIHBlcmhhcHMgc29tZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGZpbGVzeXN0ZW3igJlzIGJsb2NrIHNpemUgb3IgZmVhdHVyZXMgZW5hYmxlZC4gTXkgbmV4dCBsaW5lIG9mIHRob3VnaHQgY29uY2VybnMgd2hhdCBhc3BlY3RzIG9mIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgYXJlIHJlbGV2YW50IHRvIGRldGVybWluaW5nIHRoZSBpbmxpbmUgc2l6ZSBsaW1pdDsgSSBpbW1lZGlhdGVseSB0aGluayBvZiB0aGUgZmlsZSdzIHR5cGUsIHRoZSBpbm9kZSBmbGFncyAoZXNwZWNpYWxseSB0aG9zZSB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgbGF5b3V0KSwgYW5kIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFscmVhZHkgYWxsb2NhdGVkIGZvciB0aGlzIGlub2RlLiBUaGUgcmV0dXJuIHZhbHVlLCBvYnZpb3VzbHksIHdpbGwgYmUgdGhlIHNpemUgb2YgZGF0YSwgaW4gYnl0ZXMsIHRoYXQgaXMgbGVnYWxseSBhbGxvd2VkIHRvIGJlIGRpcmVjdGx5IHN0b3JlZCBpbiB0aGUgaW5vZGUuIEkgd2lsbCBmb2N1cyBvbiB1bmRlcnN0YW5kaW5nIHRoZSAqbG9naWMqIG9mIHRoZSBjYWxjdWxhdGlvbi4gSSB3aWxsIGNoZWNrIGZvciBjb3JuZXIgY2FzZXMgYW5kIGVycm9yIGNvbmRpdGlvbnMuIEkgd2FudCB0byBrbm93IHdoZW4gaXQgc2F5cyDigJxubyBpbmxpbmUgc2l6ZeKAnSBhbmQgd2hhdCBpdHMgbWVhbmluZyBpcy4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSByZWZlcmVuY2VzIHRvIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gb3Igb3RoZXIgb24tZGlzayBtZXRhZGF0YSB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGUgc2l6ZSBsaW1pdHMuIEknbGwgYmUgbG9va2luZyBmb3IgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgcG9zc2libGUgdnVsbmVyYWJpbGl0aWVzLCBzdWNoIGFzIGludGVnZXIgb3ZlcmZsb3dzLCB0aGF0IGNvdWxkIGFsbG93IGV4Y2VlZGluZyB0aGUgaW50ZW5kZWQgc2l6ZSBsaW1pdCBvciB0aGF0IG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLiBGdXJ0aGVybW9yZSwgSSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgZGlmZmVyZW50IGV4dDQgZmVhdHVyZSBmbGFncyBjb3JyZWN0bHkgKGUuZy4gZXh0ZW50IHZzIGluZGlyZWN0IGJsb2NrIGhhbmRsaW5nKS4gRmluYWxseSwgSSB3aWxsIHZlcmlmeSBob3cgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhIGltcGFjdHMgdGhlIGJsb2NrIGFsbG9jYXRpb24gc3RyYXRlZ3kgd2hlbiB0aGUgZGF0YSBpcyBiaWdnZXIgdGhhbiBpbmxpbmUgbGltaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1ODY2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6NTMuNDkxNjE0MjI2WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExOTEyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI5LFxuICBcIkxpbmVDb3VudFwiOiAxMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDI5OlxcdHN0YXRpYyBpbnQgZXh0NF9nZXRfaW5saW5lX3NpemUoc3RydWN0IGlub2RlICppbm9kZSlcXG4gIDMwOlxcdHtcXG4gIDMxOlxcdFxcdGlmIChFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9vZmYpXFxuICAzMjpcXHRcXHRcXHRyZXR1cm4gRVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZTtcXG4gIDMzOlxcdFxcbiAgMzQ6XFx0XFx0cmV0dXJuIDA7XFxuICAzNTpcXHR9XFxuICAzNjpcXHRcXG4gIDM3OlxcdHN0YXRpYyBpbnQgZ2V0X21heF9pbmxpbmVfeGF0dHJfdmFsdWVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgMzg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDE6NTMuNDkxNzM1MzU2WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwOTMzMjIzNjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlZ1bG5lcmFiaWxpdHkgRGV0ZWN0ZWQ6IFVuaW5pdGlhbGl6ZWQgTWVtb3J5IExlYWsgaW4gZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uKipcblxuT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi4gYGV4dDRfZ2V0X2lubGluZV9zaXplYCBqdXN0IGdyYWJzIGBFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemVgLCB0aGF0J3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3csIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIEkgc2VlIGEgYEJVR19PTmAgY2hlY2sgZW5zdXJpbmcgdGhlIHJlcXVlc3RlZCBsZW5ndGggKGBsZW5gKSBkb2Vzbid0IGV4Y2VlZCBgaV9pbmxpbmVfc2l6ZWAsIHdoaWNoIGlzIGdvb2QuIFRoZW4gdGhlcmUncyB0aGlzIGBjcF9sZW5gIGNhbGN1bGF0aW9uLCBpbml0aWFsbHkgbGltaXRlZCBieSBgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRWAuIFRoZSBpbml0aWFsIGRhdGEgaXMgY29waWVkIHVzaW5nIGBtZW1jcHlgLlxuXG5UaGUgY3J1Y2lhbCBiaXQsIHRob3VnaCwgaXMgdGhlIGNvbmRpdGlvbmFsLiBUaGUgY29kZSBjYWxjdWxhdGVzIGEgcmVtYWluaW5nIGxlbmd0aCAoYGxlbmApIGFuZCB0aGVuLCB3aXRoaW4gdGhlIGBpZiAoIWxlbilgIGNoZWNrLCB0aGUga2V5IGxpbmUgaXMgYGxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCAodW5zaWduZWQgaW50KWxlMzJfdG9fY3B1KGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZSkpO2AuIElmIGBlbnRyeS1cdTAwM2VlX3ZhbHVlX3NpemVgIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluaW5nIGBsZW5gLCB0aGVuIGBsZW5gIGdldHMgcmVkdWNlZC4gQW5kIHRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgYGNwX2xlbiArIGxlbmAsIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiB0aGUgaW5pdGlhbCBgaW5saW5lX3NpemVgLlxuXG5UaGlzIGlzIHdoZXJlIHRoZSBwcm9ibGVtIGFyaXNlcy4gV2hlbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgY2FsbHMgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAsIGl0IG9ubHkgY2hlY2tzIGZvciBuZWdhdGl2ZSByZXR1cm4gdmFsdWVzLCBidXQgZG9lc24ndCBjaGVjayBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byB0aGUgaW5pdGlhbGx5IHJlcXVlc3RlZCBzaXplIChgaW5saW5lX3NpemVgKS4gVGhlbiwgaXQgcHJvY2VlZHMgdG8gY29weSBgaW5saW5lX3NpemVgIGJ5dGVzIGZyb20gYSBidWZmZXIgYGJ1ZmAgdG8gdGhlIGJsb2NrJ3MgYnVmZmVyIGhlYWQgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCAqd2l0aG91dCBjaGVja2luZyB0aGUgcmV0dXJuIHZhbHVlKi5cblxuSGVyZSdzIHRoZSBraWNrZXI6IGBidWZgIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCwgd2hpY2ggY291bGQgYmUgc21hbGxlciB0aGFuIGBpbmxpbmVfc2l6ZWAsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IGJlaW5nIHdyaXR0ZW4gdG8gYGJ1ZmAuIEJlY2F1c2UgdGhlcmUgaXMgbm8gY2hlY2sgaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIHRvIGVuc3VyZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBlcXVpdmFsZW50IHRvIHRoZSBgaW5saW5lX3NpemVgLCB0aGUgc3Vic2VxdWVudCBgbWVtY3B5YCBjb3VsZCBiZSB3cml0aW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChmcm9tIGBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUylgKSBpbnRvIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAuIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgdGhlbiB3cml0dGVuIHRvIGRpc2shXG5cblRoaXMgbWVhbnMgdW5pbml0aWFsaXplZCBrZXJuZWwgaGVhcCBtZW1vcnkgaXMgd3JpdHRlbiB0byBkaXNrLCB3aGljaCBpcyBhIHRleHRib29rIGluZm9ybWF0aW9uIGxlYWshIFRoYXQncyBhIHNlcmlvdXMgc2VjdXJpdHkgZmxhdy4gVGhlIGF0dGFjayB2ZWN0b3IgY291bGQgYmUgcmVhZGluZyB0aGUgZGlzayBjb250ZW50cyBhZnRlciBhIGZpbGUgd2l0aCBpbmxpbmUgZGF0YSBoYXMgYmVlbiBjb252ZXJ0ZWQuXG5cbldhaXQgYSBzZWNvbmTigKYgaXMgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAgKmFsd2F5cyogZXF1YWwgdG8gYEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSAtIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVgPyBJZiBpdCBpcywgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIHdvdWxkIGFsd2F5cyBtYXRjaCBgaW5saW5lX3NpemVgLCBhbmQgdGhlIGxlYWsgd291bGQgbm90IG9jY3VyLiBJIG5lZWQgdG8gdmVyaWZ5IGhvdyBgaV9pbmxpbmVfc2l6ZWAgaXMgc2V0IHRvIGVuc3VyZSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjQyOCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgzOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjA0LjQyNDk2MTY0NVoiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5NDU0OTM0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpX2lubGluZV9zaXplID1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9pbmxpbmUuYz0xNDU9aW50IGV4dDRfZmluZF9pbmxpbmVfZGF0YV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTc1LVxcdFxcdFxcdFxcdFxcdCh2b2lkICopZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlzLmlsb2MpKTtcXG5mcy9leHQ0L2lubGluZS5jOjE3NjpcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplID0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSArXFxuZnMvZXh0NC9pbmxpbmUuYy0xNzctXFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaXMucy5oZXJlLVxcdTAwM2VlX3ZhbHVlX3NpemUpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0yNjg9c3RhdGljIGludCBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0zMjUtXFx0XFx0XFx0XFx0ICAgICAgKHZvaWQgKilleHQ0X3Jhd19pbm9kZShcXHUwMDI2aXMuaWxvYykpO1xcbmZzL2V4dDQvaW5saW5lLmM6MzI2OlxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUgPSBsZW4gKyBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xcbmZzL2V4dDQvaW5saW5lLmMtMzI3LVxcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MzM3PXN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMzk1LVxcdFxcdFxcdFxcdCAgICAgICh2b2lkICopZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlzLmlsb2MpKTtcXG5mcy9leHQ0L2lubGluZS5jOjM5NjpcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9zaXplID0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSArXFxuZnMvZXh0NC9pbmxpbmUuYy0zOTctXFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaXMucy5oZXJlLVxcdTAwM2VlX3ZhbHVlX3NpemUpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz00Mzc9c3RhdGljIGludCBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTQ5My1cXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2lubGluZV9vZmYgPSAwO1xcbmZzL2V4dDQvaW5saW5lLmM6NDk0OlxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xcbmZzL2V4dDQvaW5saW5lLmMtNDk1LVxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTExMjYtXFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcXG5mcy9leHQ0L2lubGluZS5jOjExMjc6XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTI4LVxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTg5MT1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE5NzgtXFxuZnMvZXh0NC9pbmxpbmUuYzoxOTc5OlxcdFxcdEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUgPSBpX3NpemUgXFx1MDAzY1xcbmZzL2V4dDQvaW5saW5lLmMtMTk4MC1cXHRcXHRcXHRcXHRcXHRFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFID9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6MDYuMDE5NTE4MDZaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTgzMzAxNzAzNTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIElubGluZSBEYXRhIENvbnZlcnNpb24gYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24gc3RlcCBieSBzdGVwLiBJJ20gbG9va2luZyBhdCB0aGUgYGV4dDRfZmluZF9pbmxpbmVfZGF0YV9ub2xvY2tgIGZ1bmN0aW9uIGFuZCBob3cgaXQgY2FsY3VsYXRlcyBgaV9pbmxpbmVfc2l6ZWAuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBpdCdzIGNhbGN1bGF0ZWQgcHJlY2lzZWx5IGFzIGBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFYCBwbHVzIHRoZSB2YWx1ZSBvZiBgZV92YWx1ZV9zaXplYC4gVGhpcyBgZV92YWx1ZV9zaXplYCBjb21lcyBpbnRvIHBsYXkgYWdhaW4gaW4gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAuIEhlcmUsIGlmIHRoZSBjYWxjdWxhdGVkIGBpbmxpbmVfc2l6ZWAgaXMgYmlnZ2VyIHRoYW4gYEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVgLCB0aGUgY29kZSBpcyBkZXNpZ25lZCB0byBjb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHZhbHVlIHBvaW50ZWQgYXQgYnkgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAuICBUaGUgc3Vic2VxdWVudCBgbWluX3RgIGNhbGwgd29uJ3QgcmVkdWNlIGBsZW5gIHNvIGVmZmVjdGl2ZWx5IGl0IGlzIGRvaW5nIGEgZnVsbCBjb3B5IG9mIGV4YWN0bHkgYGlubGluZV9zaXplYCBieXRlcy4gVGhlIHF1ZXN0aW9uIGFyaXNlczogaXMgdGhlcmUgYSByaXNrIG9mIHJlYWRpbmcgYmV5b25kIHdoYXQncyBpbnRlbmRlZD9cblxuSSdtIHRoaW5raW5nIGFib3V0IHRoZSBwb3RlbnRpYWwgZm9yIG9uLWRpc2sgY29ycnVwdGlvbiwgd2hlcmUgYGlzLnMuaGVyZS1cdTAwM2VlX3ZhbHVlX3NpemVgIG1pZ2h0IGJlIGNvcnJ1cHRlZC4gSWYgdGhpcyB2YWx1ZSBpcyBjb3JydXB0ZWQgdG8gYmUgbGFyZ2UsIHRoZSBgaV9pbmxpbmVfc2l6ZWAgbWlnaHQgYmUgbGFyZ2UuIEJ1dCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBvbmx5IHJlYWRzIHRoZSBgZW50cnktXHUwMDNlZV92YWx1ZV9zaXplYC4gQmVjYXVzZSBgaXMucy5oZXJlYCBpbiBgZXh0NF9maW5kX2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIHNhbWUgYXMgdGhlIGBlbnRyeWAgaW4gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAsIHRoZSB2YWx1ZXMgYXJlIGxpbmtlZC4gSG93ZXZlciwgdGhlcmUncyBhbHNvIHRoZSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBwb3NzaWJpbGl0eS4gSWYgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAgaXMgbW9kaWZpZWQgY29uY3VycmVudGx5LCBvciBpZiBgaV9pbmxpbmVfc2l6ZWAgaXMgY2FsY3VsYXRlZCwga21hbGxvYyBpcyBjYWxsZWQsIGFuZCB0aGVuIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGNvcGllcyBgaW5saW5lX3NpemVgIGJ5dGVzLCBpcyB0aGVyZSBhIHJhY2UgY29uZGl0aW9uPyBJcyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgcG9pbnRlZCB0byBieSBgaW5saW5lX3NpemVgPyAgSWYgdGhlIG9yaWdpbmFsIGBsZW5gIHRvIGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgIGlzIGBpbmxpbmVfc2l6ZWAgYW5kICBgaV9pbmxpbmVfc2l6ZWAgaXMgYmFzZWQgb24gIGBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFICsgbGUzMl90b19jcHUoZW50cnktXHUwMDNlZV92YWx1ZV9zaXplKWAsIHRoZW4sIEkgdGhpbmssIGl0J3MgY29weWluZyBgaW5saW5lX3NpemVgIGJ5dGVzIGFuZCB0aGUgYnVmZmVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQuXG5cbk1vdmluZyB0byB0aGUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGZ1bmN0aW9uLCBJIHNlZSB0aGF0IGBpbmxpbmVfc2l6ZWAgaXMgY2FsY3VsYXRlZCBhbmQgdXNlZCB0byBga21hbGxvY2AgYSBidWZmZXIuIFRoZSBvcmlnaW5hbCBjb2RlIHdhcyB1c2luZyBhIHBvaW50ZXIgdG8gYGlubGluZV9zaXplYCBpbiB0aGUgY2FsbCB0byBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCB3aGljaCBJJ3ZlIGp1c3QgZGV0ZXJtaW5lZCBpc24ndCB0aGUgY2FzZSBhbmQgbm93IHRha2VzIGBpbmxpbmVfc2l6ZWAgYnkgdmFsdWUuIFNvLCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyB0YWtpbmcgdGhlIGxlbmd0aCBieSB2YWx1ZSwgc28gdGhlIHZhbHVlIGlzIG5vdCBiZWluZyBtb2RpZmllZC5cblxuTm93LCBsZXQncyBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYuIFRoZSBwYXRjaCByZW1vdmVzIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y2VzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEluIHRoZSBvcmlnaW5hbCBhcHByb2FjaCwgdGhlIGlubGluZSBkYXRhIHdhcyBmaXJzdCBkZXN0cm95ZWQgd2l0aCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIGFuZCB0aGVuIGEgYmxvY2sgd2FzIGFsbG9jYXRlZC4gSWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCB0aGUgaW5saW5lIGRhdGEgd2FzIHJlc3RvcmVkLiBUaGUgdXBkYXRlZCBjb2RlLCBob3dldmVyLCBhbGxvY2F0ZXMgYSBibG9jayB3aXRoIGBleHQ0X21iX25ld19ibG9ja3NgLiBUaGVuIGl0IGxvY2tzLCB6ZXJvcyBhbmQgY29waWVzIGludG8gdGhlIGJ1ZmZlci4gVGhlbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGlzIGNhbGxlZCB3aGljaCByZXBsYWNlcyB0aGUgaW5saW5lIGRhdGEgd2l0aCB0aGUgbmV3IGJsb2NrIGluIHRoZSBpbm9kZS4gTm93LCBpZiBhbnl0aGluZyBmYWlscyBiZWZvcmUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgdGhlIG5ldyBibG9jayBpcyBqdXN0IGZyZWVkLlxuXG5NeSBtYWluIGNvbmNlcm4gbm93IGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJcyBpdCBwb3NzaWJsZSBmb3IgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUgdG8gb2NjdXI/IEknbSBjaGVja2luZyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgOiBJIHNlZSBpdCB6ZXJvZXMgdGhlIGlubGluZSBkYXRhIGFyZWEgd2l0aCBgbWVtc2V0YCwgYm90aCBpbiB0aGUgaW5vZGUgaXRzZWxmIGFuZCB0aGUgYnVmZmVyLiBUaGVyZSdzIHRoZW4gYSBjaGVjayBmb3IgZXh0ZW50cy4gIEZvciBkaXJlY3RvcnksIHJlZ3VsYXIgb3Igc3ltbGluayBpbm9kZXMsIGBleHQ0X2V4dF90cmVlX2luaXRgIGlzIGNhbGxlZCwgYW5kIGl0J3MgaW5zZXJ0aW5nIGV4dGVudHMuXG5cbk15IG1haW4gcXVlc3Rpb24gaXM6IGRvZXMgYGV4dDRfZXh0X3RyZWVfaW5pdGAgcG90ZW50aWFsbHkgd3JpdGUgdG8gYGlfZGF0YWAsIG92ZXJ3cml0aW5nIHRoZSBgbWVtc2V0YD8gVGhpcyB3b3VsZCBiZSB0aGUgbW9zdCBsaWtlbHkgc291cmNlIG9mIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLiBJIG5lZWQgdG8gc3R1ZHkgaG93IGBleHQ0X2V4dF90cmVlX2luaXRgIGFuZCB0aGUgZXh0ZW50IGluc2VydGlvbiB3b3JrIHRvIGJlIGNvbXBsZXRlbHkgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg3NzcsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjI0LjM0OTY5MDQzWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg0NzUyNzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X3RyZWVfaW5pdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD0zODYzPXN0cnVjdCBleHQ0X2V4dGVudDtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM4NzAtXFxuZnMvZXh0NC9leHQ0Lmg6Mzg3MTpleHRlcm4gdm9pZCBleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XFxuZnMvZXh0NC9leHQ0LmgtMzg3Mi1leHRlcm4gaW50IGV4dDRfZXh0X2luZGV4X3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZXh0ZW50cyk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz04MTU9ZXh0NF9leHRfYmluc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy04NzEtXFxuZnMvZXh0NC9leHRlbnRzLmM6ODcyOnZvaWQgZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9leHRlbnRzLmMtODczLXtcXG4tLVxcbmZzL2V4dDQvaWFsbG9jLmM9OTMzPXN0cnVjdCBpbm9kZSAqX19leHQ0X25ld19pbm9kZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcXG4tLVxcbmZzL2V4dDQvaWFsbG9jLmMtMTM0MC1cXHRcXHRcXHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xcbmZzL2V4dDQvaWFsbG9jLmM6MTM0MTpcXHRcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuZnMvZXh0NC9pYWxsb2MuYy0xMzQyLVxcdFxcdH1cXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9NDM3PXN0YXRpYyBpbnQgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy00ODQtXFx0XFx0XFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG5mcy9leHQ0L2lubGluZS5jOjQ4NTpcXHRcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy00ODYtXFx0XFx0fVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTExMS1cXHRcXHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xcbmZzL2V4dDQvaW5saW5lLmM6MTExMjpcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTEzLVxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XFxuLS1cXG5mcy9leHQ0L2lvY3RsLmM9Mzc1PXN0YXRpYyBsb25nIHN3YXBfaW5vZGVfYm9vdF9sb2FkZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYy00NTAtXFx0XFx0XFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZV9ibCwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG5mcy9leHQ0L2lvY3RsLmM6NDUxOlxcdFxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlX2JsKTtcXG5mcy9leHQ0L2lvY3RsLmMtNDUyLVxcdFxcdH0gZWxzZVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NDEwPWludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy00ODMtXFxuZnMvZXh0NC9taWdyYXRlLmM6NDg0OlxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XFxuZnMvZXh0NC9taWdyYXRlLmMtNDg1LVxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy01NjctXFxuZnMvZXh0NC9taWdyYXRlLmM6NTY4OlxcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xcbmZzL2V4dDQvbWlncmF0ZS5jLTU2OS1cXHRyZXR2YWwgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCAxLCAwKTtcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTU4OC1cXHQvKiBSZXNldCB0aGUgZXh0ZW50IGRldGFpbHMgKi9cXG5mcy9leHQ0L21pZ3JhdGUuYzo1ODk6XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG5mcy9leHQ0L21pZ3JhdGUuYy01OTAtb3V0X3N0b3A6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjI1LjkzNDQ1MTY5NFoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDcwMjc5MTQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2Ygd2hhdCdzIGdvaW5nIG9uLCB3cml0dGVuIGFzIHRob3VnaCBpdCdzIG15IG93biB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gZXh0NF9leHRfdHJlZV9pbml0KipcblxuQWxyaWdodCwgbGV0J3MgZGlzc2VjdCBgZXh0NF9leHRfdHJlZV9pbml0YC4gVGhlIG5hbWUgaXRzZWxmIGhpbnRzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlIG9mIHRoZSBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgd2l0aGluIGFuIGV4dDQgZmlsZXN5c3RlbS4gSSdtIGFscmVhZHkgZmFtaWxpYXIgd2l0aCB0aGUgY29uY2VwdCBvZiBleHRlbnQgdHJlZXMsIEkgdW5kZXJzdGFuZCB0aGF0IHRoZXkgYXJlIHRoZSBiYXNpcyBmb3Igc3RvcmluZyBmaWxlIGJsb2NrcyBpbiBhIHdheSB0aGF0IG1pbmltaXplcyBmcmFnbWVudGF0aW9uIGFuZCBtYXhpbWl6ZXMgdGhlIGVmZmljaWVudCB1c2Ugb2YgZGlzayBzcGFjZSwgY29tcGFyZWQgdG8gdGhlIG9sZGVyIGJsb2NrLWJhc2VkIGlub2RlIHN5c3RlbS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHRoZSBjcnVjaWFsIGZpcnN0IHN0ZXAgaW4gcHJlcGFyaW5nIGEgZmlsZSdzIG1ldGFkYXRhIGZvciBleHRlbnQtYmFzZWQgc3RvcmFnZS5cblxuSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzdGF0ZXMgY2FuIGV4aXN0IGF0IHRoaXMgcG9pbnQsIGFuZCB3aGF0IHRoZSBpbml0aWFsIHN0YXRlIGlzLiBJIHNob3VsZCBsb29rIGZvciB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIGluaXRpYWxpemVkLCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaW52b2x2ZWQgKGJlY2F1c2UgdGhpcyBpcyBjcml0aWNhbCBpbiBhIGtlcm5lbCBjb250ZXh0KSwgYW5kIGFueSBzYW5pdHkgY2hlY2tzIGJlaW5nIHBlcmZvcm1lZC4gSSdsbCBiZSBsb29raW5nIHRvIHVuZGVyc3RhbmQgdGhlIG1lY2hhbmljcyBvZiBob3cgdGhlIGV4dGVudCBoZWFkZXIgaXMgc2V0IHVwLCB3aGF0IHZhbHVlcyBhcmUgcGxhY2VkIGludG8gdGhlIGBleHRfdHJlZWAgc3RydWN0dXJlLCBhbmQgaWYgaXQncyBiYXNlZCBvbiBhbiBleGlzdGluZyBpbm9kZSwgb3IgYmVpbmcgaW5pdGlhbGl6ZWQgZnJvbSBzY3JhdGNoLiBJdCBtdXN0IGJlIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgZXh0ZW50IG5vZGUsIGxpa2VseSBhIHNpbmdsZSBleHRlbnQsIGFuZCBhbnkgYXNzb2NpYXRlZCBtZXRhLWRhdGEuXG5cbkkgc2hvdWxkIGFsc28gcGF5IGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgY29uZGl0aW9ucyB0aGlzIGZ1bmN0aW9uIGFudGljaXBhdGVzLiBXaGF0IGhhcHBlbnMgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHM/IEFyZSB0aGVyZSBzcGVjaWZpYyBlcnJvciBjb2RlcyByZXR1cm5lZD8gQW5kLCBtb3N0IGltcG9ydGFudGx5LCBJIG5lZWQgdG8gbG9vayBvdXQgZm9yIHdoZXJlIHRoaXMgaXMgdWx0aW1hdGVseSBjYWxsZWQgYW5kIGluIHdoYXQgY2lyY3Vtc3RhbmNlcyBpdCBpcyB1c2VkLiBJcyBpdCBjYWxsZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBmaWxlLCBvciB3aGVuIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgZmlsZSB0byBleHRlbnQtYmFzZWQgc3RvcmFnZT8gUGVyaGFwcyBib3RoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjQ5MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjMwLjAwNDczMzk2WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzM2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dGVudHMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA4NzIsXG4gIFwiTGluZUNvdW50XCI6IDE1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA4NzI6XFx0dm9pZCBleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4gODczOlxcdHtcXG4gODc0OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xcbiA4NzU6XFx0XFxuIDg3NjpcXHRcXHRlaCA9IGV4dF9pbm9kZV9oZHIoaW5vZGUpO1xcbiA4Nzc6XFx0XFx0ZWgtXFx1MDAzZWVoX2RlcHRoID0gMDtcXG4gODc4OlxcdFxcdGVoLVxcdTAwM2VlaF9lbnRyaWVzID0gMDtcXG4gODc5OlxcdFxcdGVoLVxcdTAwM2VlaF9tYWdpYyA9IEVYVDRfRVhUX01BR0lDO1xcbiA4ODA6XFx0XFx0ZWgtXFx1MDAzZWVoX21heCA9IGNwdV90b19sZTE2KGV4dDRfZXh0X3NwYWNlX3Jvb3QoaW5vZGUsIDApKTtcXG4gODgxOlxcdFxcdGVoLVxcdTAwM2VlaF9nZW5lcmF0aW9uID0gMDtcXG4gODgyOlxcdFxcdGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcXG4gODgzOlxcdH1cXG4gODg0OlxcdFxcbiA4ODU6XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKlxcbiA4ODY6XFx0ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6MzAuMDA0OTY5NDhaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTgzMjY3NTgxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IGluIGV4dDQgQ29kZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgZXh0NF9leHRfdHJlZV9pbml0YCBmdW5jdGlvbi4gSXQgbG9va3MgbGlrZSBpdCdzIGluaXRpYWxpemluZyBgZWhfZGVwdGhgLCBgZWhfZW50cmllc2AsIGBlaF9tYWdpY2AsIGBlaF9tYXhgLCBhbmQgYGVoX2dlbmVyYXRpb25gLiBUaGUgYGVoYCB2YXJpYWJsZSBpcyBwb2ludGluZyB0byBgRVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFgLCB3aGljaCBtYWtlcyBzZW5zZS4gSSByZW1lbWJlciB0aGF0IGBpX2RhdGFgIHdhcyBqdXN0IHplcm9lZCBvdXQgd2l0aCBgbWVtc2V0YC4gU28sIGF0IHRoaXMgcG9pbnQsIHRoZSBlbnRpcmUgYGlfZGF0YWAgYXJlYSBzaG91bGQgYmUgY2xlYW4sIHdpdGggbm8gdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQncyBnb29kLlxuXG5CdXQgaGFuZyBvbuKApiBJIG5lZWQgdG8gY29uc2lkZXIgYWxsIHRoZSBwbGFjZXMgd2hlcmUgdGhpcyBkYXRhIGlzIHVzZWQuIFdoYXQgYWJvdXQgdGhvc2UgeGF0dHIgZnVuY3Rpb25zLCBgZXh0NF94YXR0cl9pYm9keV9maW5kYCBhbmQgYGV4dDRfeGF0dHJfaWJvZHlfc2V0YD8gSSBzZWUgdGhlc2UgbG9jYWwgc3RydWN0cywgYGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBleHQ0X3hhdHRyX2luZm8gaWAuIFRoZXkncmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gTm93LCBpbiBDLCB3aGVuIHlvdSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZSBhIHN0cnVjdCBsaWtlIHRoYXQsIHRoZSByZW1haW5pbmcgZmllbGRzIGFyZSBhdXRvbWF0aWNhbGx5IHplcm9lZC4gU28sIGV2ZW4gdGhvdWdoIHRoZXkgKmxvb2sqIGxpa2UgdGhleSdyZSBvbmx5IHBhcnRpYWxseSBpbml0aWFsaXplZCwgdGhleSdyZSBhY3R1YWxseSBmdWxseSBpbml0aWFsaXplZCBkdWUgdG8gdGhlIEMgbGFuZ3VhZ2UncyBiZWhhdmlvci4gVGhhdCdzIGEgcG9pbnQgaW4gZmF2b3Igb2Ygc2FmZXR5LlxuXG5Ob3csIHRoZXJlJ3MgYW5vdGhlciBwb2ludCB0byBjb25zaWRlci4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGVycm9yIHBhdGhzLiBXaGF0IGhhcHBlbnMgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlcj8gSW4gdGhlIGNvZGUgSSdtIGxvb2tpbmcgYXQsIHRoZXJlJ3MgYSBjYWxsIHRvIGBleHQ0X2ZpbmRfZXh0ZW50YCBmb2xsb3dlZCBieSBhIGNhbGwgdG8gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbHMsIGBwYXRoYCB3aWxsIGJlIGFuIGVycm9yIHBvaW50ZXIsIHBvc3NpYmx5IGAtRU5PTUVNYC4gSWYgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIHRyaWVzIHRvIGRlcmVmZXJlbmNlIHRoYXQgZXJyb3IgcG9pbnRlciwgaXQgd291bGQgYmUgYSBwcm9ibGVtLiBJJ2xsIG5lZWQgdG8gZ28gYW5kIGNoZWNrIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCB0byBtYWtlIHN1cmUgaXQgaGFuZGxlcyB0aGUgcG9zc2liaWxpdHkgb2YgYSBgTlVMTGAgb3IgZXJyb3IgcG9pbnRlciBjb3JyZWN0bHkuIFRoaXMgd2FycmFudHMgYSBkZWVwZXIgbG9vayBpbnRvIHRoZSBjb2RlIHBhdGggdG8gZW5zdXJlIHdlJ3JlIG5vdCBydW5uaW5nIGludG8gYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UsIHdoaWNoIHdvdWxkIGJlIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjMxNjAsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMjozOS44Mzc2NDkxMjlaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1Mzg3MjQzOTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9leHRfaW5zZXJ0X2V4dGVudFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD02ODQ9ZW51bSB7XFxuLS1cXG5mcy9leHQ0L2V4dDQuaC03NDMtICogcmVhZF9leHRlbnRfdHJlZV9ibG9jaygpLCBleHQ0X3NwbGl0X2V4dGVudF9hdCgpLFxcbmZzL2V4dDQvZXh0NC5oOjc0NDogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KCksIGFuZCBleHQ0X2V4dF9jcmVhdGVfbmV3X2xlYWYoKS5cXG5mcy9leHQ0L2V4dDQuaC03NDUtICogRVhUNF9FWF9OT0NBQ0hFIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgd2Ugc2hvdWxkbid0IGJlXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0zODk0PWV4dGVybiBpbnQgZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dDQuaC0zODk2LVxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKTtcXG5mcy9leHQ0L2V4dDQuaDozODk3OmV4dGVybiBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9leHRfaW5zZXJ0X2V4dGVudChcXG5mcy9leHQ0L2V4dDQuaC0zODk4LVxcdFxcdFxcdFxcdGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMyLSAqIHRvIGluc3RlYWQgd3JpdGUgemVyb2VzIHRvIG91ciBidWZmZXIuIFRoZW4sIHdlIG92ZXJyaWRlXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYzozMzogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KCkgdG8gcmV0dXJuIC1FTk9TUEMsIHdoaWNoIHRyaWdnZXJzIHRoZSB6ZXJvb3V0LlxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzQtICogRmluYWxseSwgd2UgY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBleHRlbnQgdHJlZSBhbmQgemVyb291dCBidWZmZXIgdG8gY29uZmlybVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0xNzI9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjE3MzpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50X3N0dWIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTE3NC1cXHRcXHRcXHQgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTM5Nj1zdGF0aWMgdm9pZCB0ZXN0X3NwbGl0X2NvbnZlcnQoc3RydWN0IGt1bml0ICp0ZXN0KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy00MDctXFx0XFx0LypcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjQwODpcXHRcXHQgKiBGb3JjZSB6ZXJvb3V0IGJ5IG1ha2luZyBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50IHJldHVybiBFTk9TUENcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQwOS1cXHRcXHQgKi9cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjQxMDpcXHRcXHRrdW5pdF9hY3RpdmF0ZV9zdGF0aWNfc3R1Yih0ZXN0LCBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50LFxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDExOlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfZXh0X2luc2VydF9leHRlbnRfc3R1Yik7XFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYy00MTItXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTQyPXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xOTg1LS8qXFxuZnMvZXh0NC9leHRlbnRzLmM6MTk4NjogKiBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50OlxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5ODctICogdHJpZXMgdG8gbWVyZ2UgcmVxdWVzdGVkIGV4dGVudCBpbnRvIHRoZSBleGlzdGluZyBleHRlbnQgb3JcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTE9c3RydWN0IGV4dDRfZXh0X3BhdGggKlxcbmZzL2V4dDQvZXh0ZW50cy5jOjE5OTI6ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5OTMtXFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjAwMi1cXG5mcy9leHQ0L2V4dGVudHMuYzoyMDAzOlxcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZXh0X2luc2VydF9leHRlbnQsIGhhbmRsZSwgaW5vZGUsIHBhdGgsXFxuZnMvZXh0NC9leHRlbnRzLmMtMjAwNC1cXHRcXHRcXHRcXHQgICBuZXdleHQsIGdiX2ZsYWdzKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTMxOTE9c3RhdGljIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2V4dGVudF9hdChoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzIzNy1cXHQgKiBwYXRoIG1heSBsZWFkIHRvIG5ldyBsZWFmLCBub3QgdG8gb3JpZ2luYWwgbGVhZiBhbnkgbW9yZVxcbmZzL2V4dDQvZXh0ZW50cy5jOjMyMzg6XFx0ICogYWZ0ZXIgZXh0NF9leHRfaW5zZXJ0X2V4dGVudCgpIHJldHVybnMsXFxuZnMvZXh0NC9leHRlbnRzLmMtMzIzOS1cXHQgKi9cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNTAtXFxuZnMvZXh0NC9leHRlbnRzLmM6MzI1MTpcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXgsIGZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zMjUyLVxcdGlmICghSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDQ4MS1cXG5mcy9leHQ0L2V4dGVudHMuYzo0NDgyOlxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgZmxhZ3MpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTQ0ODMtXFx0aWYgKElTX0VSUihwYXRoKSkge1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjMwMz1FWFBPUlRfU1lNQk9MX0ZPUl9FWFQ0X1RFU1QoZXh0NF9lc19pbnNlcnRfZXh0ZW50KTtcXG5mcy9leHQ0L2V4dGVudHMuYzo2MzA0OkVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MzA1LUVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2ZpbmRfZXh0ZW50KTtcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMTQ4PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfYWRkX3JhbmdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU4ICp2YWwpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjIwOC1cXHRcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjIwOTpcXHRcXHRcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChOVUxMLCBpbm9kZSxcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjIxMC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwYXRoLCBcXHUwMDI2bmV3ZXgsIDApO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTExOC1cXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBibG9jayk7XFxuZnMvZXh0NC9pbmxpbmUuYzoxMTE5OlxcdFxcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXFx1MDAyNm5ld2V4LCAwKTtcXG5mcy9leHQ0L2lubGluZS5jLTExMjAtXFx0fSBlbHNlIHtcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy01NC1cXHRcXHRnb3RvIGVycl9vdXQ7XFxuZnMvZXh0NC9taWdyYXRlLmM6NTU6XFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXFx1MDAyNm5ld2V4dCwgMCk7XFxuZnMvZXh0NC9taWdyYXRlLmMtNTYtXFx0aWYgKElTX0VSUihwYXRoKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6NDEuMzc2MzgxODQ4WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU2MDE3NjIzNzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIGZpcnN0LXBlcnNvbiBzdW1tYXJ5LCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYGV4dDRfZXh0X2luc2VydF9leHRlbnRgKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAuIEknbSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCB0aGUgY3JpdGljYWwgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIGhhbmRsaW5nIGV4dGVudCBpbnNlcnRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIGNvcmUgb2YgZXh0ZW50LWJhc2VkIGZpbGUgc3RvcmFnZSBoZXJlIOKAkyB0aGUgdmVyeSBtZWNoYW5pc20gdGhhdCBtYWtlcyBtb2Rlcm4gZXh0NCBwZXJmb3JtYW5jZSB3aGF0IGl0IGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uJ3MgbG9naWMgaW50aW1hdGVseS4gV2hhdCBhcmUgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQ/IE9idmlvdXNseSwgYHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXJgIGFuZCBgc3RydWN0IGV4dDRfZXh0ZW50YCBhcmUgY2VudHJhbCwgYnV0IGhvdyBhcmUgdGhleSBiZWluZyBtYW5pcHVsYXRlZCBpbiB0aGlzIHNwZWNpZmljIGluc2VydGlvbiBzY2VuYXJpbz9cblxuRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdHJpZ2dlcnMgdGhpcyBjYWxsLCBsaWtlbHkgZHVyaW5nIGZpbGUgY3JlYXRpb24sIGV4dGVuc2lvbiwgb3IgbW9kaWZpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBuZXcgZXh0ZW50LiBXaGF0IGFyZSB0aGUgcHJlLWNvbmRpdGlvbnM/IERvZXMgaXQgZXhwZWN0IHRoZSBuZXcgZXh0ZW50IHRvIGZpdCBpbiB0aGUgY3VycmVudCBibG9jayBncm91cCwgb3IgZG9lcyBpdCBoYW5kbGUgY3Jvc3MtYmxvY2stZ3JvdXAgaW5zZXJ0aW9ucz8gSWYgdGhlIGZvcm1lciwgd2hhdCdzIHRoZSBvdmVyZmxvdyBsb2dpYyBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlPyBIb3cgZG9lcyBpdCBpbnRlcmFjdCB3aXRoIHRoZSBibG9jayBhbGxvY2F0b3I/IElzIHRoZXJlIGEgc2VwYXJhdGUgbG9ja2luZyBtZWNoYW5pc20gcmVxdWlyZWQgYmV5b25kIHdoYXQncyBoYW5kbGVkIGF0IGEgaGlnaGVyIGxldmVsP1xuXG5JJ20gYWxzbyBjdXJpb3VzIGFib3V0IHRoZSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLiBFeHRlbnQgbWFuaXB1bGF0aW9uLCBlc3BlY2lhbGx5IGluc2VydGlvbnMsIGNhbiBiZSBjb21wbGV4LiBXaGF0IGFyZSB0aGUgdGltZSBjb21wbGV4aXRpZXMgZm9yIHNlYXJjaGluZyBmb3IgdGhlIHJpZ2h0IHBsYWNlIHRvIGluc2VydCwgc2hpZnRpbmcgZXhpc3RpbmcgZXh0ZW50cyBpZiBuZWNlc3NhcnksIGFuZCBmaW5hbGx5LCB3cml0aW5nIHRoZSBjaGFuZ2VzIHRvIGRpc2s/IEFueSBvYnZpb3VzIG9wdGltaXphdGlvbnMgaW1wbGVtZW50ZWQgdG8gbWluaW1pemUgZnJhZ21lbnRhdGlvbiBhbmQgbWF4aW1pemUgcGVyZm9ybWFuY2U/IEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ2llcyB0aGF0IGFyZSBwYXJ0aWN1bGFybHkgY2xldmVyIG9yIHJvYnVzdD8gSSdsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgaG93IGl0IGhhbmRsZXMgbWV0YWRhdGEgdXBkYXRlcywgc3BlY2lmaWNhbGx5IHRoZSBpbm9kZSBhbmQgZ3JvdXAgZGVzY3JpcHRvciBibG9jayBjaGFuZ2VzLlxuXG5UaGUgY3JpdGljYWwgcGF0aCBpcyB0aGUgcGFydCBJIHdhbnQgdG8gZm9jdXMgb24uIFdoYXQncyB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIGluc2VydGlvbiwgYW5kIHdoYXQgZWRnZSBjYXNlcyBhcmUgaGFuZGxlZCAoZS5nLiwgaW5zZXJ0aW9uIGF0IHRoZSBiZWdpbm5pbmcsIG1pZGRsZSwgb3IgZW5kIG9mIGFuIGV4dGVudCBsaXN0LCBvciBldmVuIHNwbGl0dGluZyBleHRlbnRzIHRvIG1ha2Ugc3BhY2UpLiBBbnkgY2hhbmNlIG9mIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgaGVyZT8gSSdsbCBwcm9iYWJseSBzcGVuZCBhIGdvb2Qgd2hpbGUganVzdCB0cmFjaW5nIHRoZSBjb2RlIGZsb3csIGxvb2tpbmcgb3V0IGZvciB0aGUgY29tbW9uIHByb2JsZW1zIEkga25vdyBjYW4gb2NjdXIgaW4gdGhlc2UgdHlwZSBvZiBmaWxlIHN5c3RlbSBmdW5jdGlvbnMuIE5vdywgbGV0J3Mgc2VlIHdoYXQgdGhlIHNvdXJjZSBjb2RlIGFjdHVhbGx5IHRlbGxzIHVzLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1OTQ1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDI6NDYuOTc4MTQ4MTQyWiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3MTk3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dGVudHMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTkxLFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTkxOlxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpcXG4xOTkyOlxcdGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4xOTkzOlxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCxcXG4xOTk0OlxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKVxcbjE5OTU6XFx0e1xcbjE5OTY6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7XFxuMTk5NzpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LCAqZmV4O1xcbjE5OTg6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50ICpuZWFyZXg7IC8qIG5lYXJlc3QgZXh0ZW50ICovXFxuMTk5OTpcXHRcXHRpbnQgZGVwdGgsIGxlbiwgZXJyID0gMDtcXG4yMDAwOlxcdFxcdGV4dDRfbGJsa190IG5leHQ7XFxuMjAwMTpcXHRcXHRpbnQgbWJfZmxhZ3MgPSAwLCB1bndyaXR0ZW47XFxuMjAwMjpcXHRcXG4yMDAzOlxcdFxcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZXh0X2luc2VydF9leHRlbnQsIGhhbmRsZSwgaW5vZGUsIHBhdGgsXFxuMjAwNDpcXHRcXHRcXHRcXHRcXHQgICBuZXdleHQsIGdiX2ZsYWdzKTtcXG4yMDA1OlxcdFxcbjIwMDY6XFx0XFx0aWYgKGdiX2ZsYWdzIFxcdTAwMjYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpXFxuMjAwNzpcXHRcXHRcXHRtYl9mbGFncyB8PSBFWFQ0X01CX0RFTEFMTE9DX1JFU0VSVkVEO1xcbjIwMDg6XFx0XFx0aWYgKHVubGlrZWx5KGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCkgPT0gMCkpIHtcXG4yMDA5OlxcdFxcdFxcdEVYVDRfRVJST1JfSU5PREUoaW5vZGUsIFxcXCJleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpID09IDBcXFwiKTtcXG4yMDEwOlxcdFxcdFxcdGVyciA9IC1FRlNDT1JSVVBURUQ7XFxuMjAxMTpcXHRcXHRcXHRnb3RvIGVycm91dDtcXG4yMDEyOlxcdFxcdH1cXG4yMDEzOlxcdFxcdGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTtcXG4yMDE0OlxcdFxcdGV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7XFxuMjAxNTpcXHRcXHRlaCA9IHBhdGhbZGVwdGhdLnBfaGRyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMjo0Ni45Nzg0MjI0OTJaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkyNDcyMjE2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcqKlxuXG5IbW0sIHNvIGlmIEknbSB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZSBjb3JyZWN0bHksIHRoZXJlJ3MgYSBzZXJpb3VzIHJpc2sgaGVyZS4gSWYgdGhlIHZhcmlhYmxlIGBwYXRoYCBpcyBhbiBlcnJvciBwb2ludGVyLCB0aGVuIGFjY2Vzc2luZyBgcGF0aFtkZXB0aF1gIGlzIGdvaW5nIHRvIGxlYWQgdG8gYSBkZXJlZmVyZW5jZSBvZiB0aGF0IGVycm9yIHBvaW50ZXIuIEFuZCB0aGF0J3MgZ29pbmcgdG8gY3Jhc2ggdGhlIGtlcm5lbCwgbm8gcXVlc3Rpb24uIEhhbmcgb24gYSBzZWMuLi4gd2FpdCBhIG1pbnV0ZSwgSSB0aGluayBJIHNlZSBhIHBvdGVudGlhbCBnb3RjaGEuIElmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGBFUlJfUFRSYCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYSBwcm9ibGVtLiBMb29rcyBsaWtlIGEgcHJldHR5IHN0YW5kYXJkIHRoaW5nIHRvIGRvIHdpdGggZXJyb3IgcGF0aHMgaW4gdGhlIGtlcm5lbC4gU28sIHRoZSBrZXkgdG8gYWxsIHRoaXMgaXMgaG93IGBleHQ0X2ZpbmRfZXh0ZW50YCBoYW5kbGVzIGVycm9ycy4gV2UgaGF2ZSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIGV4cGxpY2l0bHkgY2hlY2tzIHRoZSByZXR1cm4gb2YgYGV4dDRfZmluZF9leHRlbnRgIGFuZCBoYW5kbGVzIHRoZSBgRVJSX1BUUmAgYXBwcm9wcmlhdGVseS4gVGhhdCdzIHRoZSBvbmx5IHdheSB0byBhdm9pZCBhIG5hc3R5IGNyYXNoLiBSaWdodCwgbGV0J3Mgc2VlIHdoYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZG9lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY5MzksIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjUyLjkwMzE0NzA4MloiLCJTZXEiOjUwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU4OTQ5OTAxNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2ZpbmRfZXh0ZW50XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vdHJhY2UvaGlzdG9ncmFtLnJzdD01PURvY3VtZW50YXRpb24gd3JpdHRlbiBieSBUb20gWmFudXNzaVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQwNC0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwNGM0YTNjXSBpbnRlbF9wbGFuZV9kdXBsaWNhdGVfc3RhdGUgW2k5MTVdICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTQwMiAgYnl0ZXNfcmVxOiAgICAgMTkwNjcyXFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0OjQwNTogICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZjgxMjg5MWNhXSBleHQ0X2ZpbmRfZXh0ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTUxOCAgYnl0ZXNfcmVxOiAgICAgMTQ2MjA4XFxuRG9jdW1lbnRhdGlvbi90cmFjZS9oaXN0b2dyYW0ucnN0LTQwNi0gICAgeyBjYWxsX3NpdGU6IFtmZmZmZmZmZmEwMjkwNzBlXSBkcm1fdm1hX25vZGVfYWxsb3cgW2RybV0gICAgICAgICAgICAgICAgICAgICAgfSBoaXRjb3VudDogICAgICAgMTc0NiAgYnl0ZXNfcmVxOiAgICAgIDY5ODQwXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3QtNDM5LSAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmYTA0ODlhNjZdIGludGVsX3JpbmdfYmVnaW4gW2k5MTVdICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAyMTg2ICBieXRlc19yZXE6ICAgICAzMTQ3ODRcXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3Q6NDQwOiAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmODEyODkxY2FdIGV4dDRfZmluZF9leHRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAyMTc0ICBieXRlc19yZXE6ICAgICAyMDg5OTJcXG5Eb2N1bWVudGF0aW9uL3RyYWNlL2hpc3RvZ3JhbS5yc3QtNDQxLSAgICB7IGNhbGxfc2l0ZTogW2ZmZmZmZmZmODExYWU4ZTFdIF9fa21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGhpdGNvdW50OiAgICAgICAgICA4ICBieXRlc19yZXE6ICAgICAxMzEwNzJcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTY4ND1lbnVtIHtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTc0MS0gKiBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZXNlIGZsYWdzIG11c3Qgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlXFxuZnMvZXh0NC9leHQ0Lmg6NzQyOiAqIEVYVDRfR0VUX0JMT0NLU18qLiAgVGhleSBhcmUgdXNlZCBieSBleHQ0X2ZpbmRfZXh0ZW50KCksXFxuZnMvZXh0NC9leHQ0LmgtNzQzLSAqIHJlYWRfZXh0ZW50X3RyZWVfYmxvY2soKSwgZXh0NF9zcGxpdF9leHRlbnRfYXQoKSxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTM4OTc9ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KFxcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMzkwMC1cXHRcXHRcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCwgaW50IGdiX2ZsYWdzKTtcXG5mcy9leHQ0L2V4dDQuaDozOTAxOmV4dGVybiBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsXFxuZnMvZXh0NC9leHQ0LmgtMzkwMi1cXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0zOTY9c3RhdGljIHZvaWQgdGVzdF9zcGxpdF9jb252ZXJ0KHN0cnVjdCBrdW5pdCAqdGVzdClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtNDEyLVxcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6NDEzOlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfREFUQV9MQkxLLCBOVUxMLCBFWFQ0X0VYX05PQ0FDSEUpO1xcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtNDE0LVxcdGV4ID0gcGF0aC1cXHUwMDNlcF9leHQ7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQzOC1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjQzOTpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX0RBVEFfTEJMSywgTlVMTCwgRVhUNF9FWF9OT0NBQ0hFKTtcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTQ0MC1cXHRleCA9IHBhdGgtXFx1MDAzZXBfZXh0O1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9ODg1PXN0cnVjdCBleHQ0X2V4dF9wYXRoICpcXG5mcy9leHQ0L2V4dGVudHMuYzo4ODY6ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcXG5mcy9leHQ0L2V4dGVudHMuYy04ODctXFx0XFx0IHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgZmxhZ3MpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy04OTQtXFxuZnMvZXh0NC9leHRlbnRzLmM6ODk1OlxcdEtVTklUX1NUQVRJQ19TVFVCX1JFRElSRUNUKGV4dDRfZmluZF9leHRlbnQsIGlub2RlLCBibG9jaywgcGF0aCwgZmxhZ3MpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTg5Ni1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE0MDA9ZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNDI4LVxcdFxcdC8qIHJlZmlsbCBwYXRoICovXFxuZnMvZXh0NC9leHRlbnRzLmM6MTQyOTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZWVfYmxvY2ssIHBhdGgsIGdiX2ZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0xNDMwLVxcdFxcdHJldHVybiBwYXRoO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTQzOC1cXHQvKiByZWZpbGwgcGF0aCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjE0Mzk6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGVlX2Jsb2NrLCBwYXRoLCBnYl9mbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTQ0MC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTk5Mj1leHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI3LVxcdFxcdCAqIHJpZ2h0IGZyb20gZXgsIG9yIGZyb20gdGhlIGxlZnQgb2YgZXguIFRoaXMgaXMgYmVjYXVzZVxcbmZzL2V4dDQvZXh0ZW50cy5jOjIwMjg6XFx0XFx0ICogZXh0NF9maW5kX2V4dGVudCgpIGNhbiByZXR1cm4gZWl0aGVyIGV4dGVudCBvbiB0aGVcXG5mcy9leHQ0L2V4dGVudHMuYy0yMDI5LVxcdFxcdCAqIGxlZnQsIG9yIG9uIHRoZSByaWdodCBmcm9tIHRoZSBzZWFyY2hlZCBwb3NpdGlvbi4gVGhpc1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjEwOS1cXHRcXHRleHRfZGVidWcoaW5vZGUsIFxcXCJuZXh0IGxlYWYgYmxvY2sgLSAldVxcXFxuXFxcIiwgbmV4dCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MjExMDpcXHRcXHRucGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG5leHQsIE5VTEwsIGdiX2ZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTExLVxcdFxcdGlmIChJU19FUlIobnBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yODM3PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yODc2LVxcdFxcdC8qIGZpbmQgZXh0ZW50IGZvciBvciBjbG9zZXN0IGV4dGVudCB0byB0aGlzIGJsb2NrICovXFxuZnMvZXh0NC9leHRlbnRzLmM6Mjg3NzpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZW5kLCBOVUxMLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjg3OC1cXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNjItXFx0ICogR2V0IGEgbmV3IHBhdGggdG8gdHJ5IHRvIHplcm9vdXQgb3IgZml4IHRoZSBleHRlbnQgbGVuZ3RoLlxcbmZzL2V4dDQvZXh0ZW50cy5jOjMyNjM6XFx0ICogVXNpbmcgRVhUNF9FWF9OT0ZBSUwgZ3VhcmFudGVlcyB0aGF0IGV4dDRfZmluZF9leHRlbnQoKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNjQtXFx0ICogd2lsbCBub3QgcmV0dXJuIC1FTk9NRU0sIG90aGVyd2lzZSAtRU5PTUVNIHdpbGwgY2F1c2UgYVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzI2OC1cXHQgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzozMjY5OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBlZV9ibG9jaywgTlVMTCwgZmxhZ3MgfCBFWFQ0X0VYX05PRkFJTCk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzI3MC1cXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zNDA5PXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM0NDQtXFx0XFx0ICovXFxuZnMvZXh0NC9leHRlbnRzLmM6MzQ0NTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLVxcdTAwM2VtX2xibGssIHBhdGgsIGZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zNDQ2LVxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNDk2LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjM0OTc6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cXHUwMDNlbV9sYmxrLCBOVUxMLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzQ5OC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MzgxNj1zdGF0aWMgc3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zODYxLWNvbnZlcnQ6XFxuZnMvZXh0NC9leHRlbnRzLmM6Mzg2MjpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLVxcdTAwM2VtX2xibGssIHBhdGgsIGZsYWdzKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zODYzLVxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zOTM2PWNvbnZlcnRfaW5pdGlhbGl6ZWRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zOTczLVxcdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjM5NzQ6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cXHUwMDNlbV9sYmxrLCBwYXRoLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzk3NS1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NDI2OT1pbnQgZXh0NF9leHRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDI4NS1cXHQvKiBmaW5kIGV4dGVudCBmb3IgdGhpcyBibG9jayAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjQyODY6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC1cXHUwMDNlbV9sYmxrLCBOVUxMLCBmbGFncyk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDI4Ny1cXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy00Mjk2LVxcdCAqIHRoaXMgc2l0dWF0aW9uIGlzIHBvc3NpYmxlLCB0aG91Z2gsIF9kdXJpbmdfIHRyZWUgbW9kaWZpY2F0aW9uO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjQyOTc6XFx0ICogdGhpcyBpcyB3aHkgYXNzZXJ0IGNhbid0IGJlIHB1dCBpbiBleHQ0X2ZpbmRfZXh0ZW50KClcXG5mcy9leHQ0L2V4dGVudHMuYy00Mjk4LVxcdCAqL1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDM4Mi1cXHQgKiBJZiB3ZSBhcmUgZG9pbmcgYmlnYWxsb2MsIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXh0ZW50IHJldHVybmVkXFxuZnMvZXh0NC9leHRlbnRzLmM6NDM4MzpcXHQgKiBieSBleHQ0X2ZpbmRfZXh0ZW50KCkgaW1wbGllcyBhIGNsdXN0ZXIgd2UgY2FuIHVzZS5cXG5mcy9leHQ0L2V4dGVudHMuYy00Mzg0LVxcdCAqL1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTM4Mj1leHQ0X2V4dF9zaGlmdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01MzkyLVxcdC8qIExldCBwYXRoIHBvaW50IHRvIHRoZSBsYXN0IGV4dGVudCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjUzOTM6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy01Mzk0LVxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01NDEwLVxcdGlmIChTSElGVCA9PSBTSElGVF9MRUZUKSB7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTQxMTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgc3RhcnQgLSAxLCBwYXRoLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTU0MTItXFx0XFx0XFx0XFx0XFx0RVhUNF9FWF9OT0NBQ0hFKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU0NTktXFx0d2hpbGUgKGl0ZXJhdG9yIFxcdTAwMjZcXHUwMDI2IHN0YXJ0IFxcdTAwM2M9IHN0b3ApIHtcXG5mcy9leHQ0L2V4dGVudHMuYzo1NDYwOlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAqaXRlcmF0b3IsIHBhdGgsXFxuZnMvZXh0NC9leHRlbnRzLmMtNTQ2MS1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTYyNj1zdGF0aWMgaW50IGV4dDRfaW5zZXJ0X3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTY4Ny1cXG5mcy9leHQ0L2V4dGVudHMuYzo1Njg4OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBOVUxMLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01Njg5LVxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU3NjM9ZXh0NF9zd2FwX2V4dGVudHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZTEsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01Nzg0LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjU3ODU6XFx0XFx0cGF0aDEgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlMSwgbGJsazEsIHBhdGgxLCBFWFQ0X0VYX05PQ0FDSEUpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODYtXFx0XFx0aWYgKElTX0VSUihwYXRoMSkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU3ODktXFx0XFx0fVxcbmZzL2V4dDQvZXh0ZW50cy5jOjU3OTA6XFx0XFx0cGF0aDIgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlMiwgbGJsazIsIHBhdGgyLCBFWFQ0X0VYX05PQ0FDSEUpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU3OTEtXFx0XFx0aWYgKElTX0VSUihwYXRoMikpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU5NDg9aW50IGV4dDRfY2x1X21hcHBlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsY2x1KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTk2NS1cXHQvKiBzZWFyY2ggZm9yIHRoZSBleHRlbnQgY2xvc2VzdCB0byB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGNsdXN0ZXIgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo1OTY2OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFQ0X0MyQihzYmksIGxjbHUpLCBOVUxMLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01OTY3LVxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01OTc0LVxcdCAqIHRob3VnaCwgX2R1cmluZ18gdHJlZSBtb2RpZmljYXRpb24sIGFuZCBpdCdzIHdoeSBhbiBhc3NlcnQgY2FuJ3RcXG5mcy9leHQ0L2V4dGVudHMuYzo1OTc1OlxcdCAqIGJlIHB1dCBpbiBleHQ0X2ZpbmRfZXh0ZW50KCkuXFxuZnMvZXh0NC9leHRlbnRzLmMtNTk3Ni1cXHQgKi9cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYwMjc9aW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDMzLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYwMzQ6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0LCBOVUxMLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDM1LVxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDUzLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYwNTQ6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0LCBwYXRoLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDU1LVxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDcwLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYwNzE6XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIHN0YXJ0LCBwYXRoLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MDcyLVxcdFxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MDkyPXZvaWQgZXh0NF9leHRfcmVwbGF5X3Nocmlua19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBlbmQpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MDk4LVxcdHdoaWxlIChjdXIgXFx1MDAzYyBlbmQpIHtcXG5mcy9leHQ0L2V4dGVudHMuYzo2MDk5OlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIE5VTEwsIDApO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYxMDAtXFx0XFx0aWYgKElTX0VSUihwYXRoKSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYxNDA9aW50IGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjE0OS1cXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYxNTA6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy02MTUxLVxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MTgyLVxcdFxcdGdvdG8gb3V0O1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYxODM6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGN1ciwgcGF0aCwgMCk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNjE4NC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjE4Ny1cXHR3aGlsZSAoY3VyIFxcdTAwM2MgZW5kKSB7XFxuZnMvZXh0NC9leHRlbnRzLmM6NjE4ODpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgY3VyLCBwYXRoLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MTg5LVxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MjAwLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYyMDE6XFx0XFx0cGF0aDIgPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBjdXIsIHBhdGgyLCAwKTtcXG5mcy9leHQ0L2V4dGVudHMuYy02MjAyLVxcdFxcdGlmIChJU19FUlIocGF0aDIpKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjIyNz1pbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyMzgtXFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo2MjM5OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI0MC1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI1NS1cXHRcXHRpZiAocmV0IFxcdTAwM2UgMCkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYyNTY6XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNTctXFx0XFx0XFx0aWYgKCFJU19FUlIocGF0aCkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYzMDQ9RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZXh0X2luc2VydF9leHRlbnQpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYzMDU6RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZmluZF9leHRlbnQpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYzMDYtRVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfaXNzdWVfemVyb291dCk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9NjczPXN0YXRpYyB2b2lkIGV4dDRfZXNfaW5zZXJ0X2V4dGVudF9leHRfY2hlY2soc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02ODItXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjY4MzpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgZXMtXFx1MDAzZWVzX2xibGssIE5VTEwsIEVYVDRfRVhfTk9DQUNIRSk7XFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTY4NC1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIxNDg9c3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9hZGRfcmFuZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTggKnZhbClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMTk3LVxcdFxcdFxcdC8qIFJhbmdlIGlzIG5vdCBtYXBwZWQgKi9cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjE5ODpcXHRcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgY3VyLCBwYXRoLCAwKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjE5OS1cXHRcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIzMjg9c3RhdGljIHZvaWQgZXh0NF9mY19zZXRfYml0bWFwc19hbmRfY291bnRlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzYwLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzZSAwKSB7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIzNjE6XFx0XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzYyLVxcdFxcdFxcdFxcdGlmICghSVNfRVJSKHBhdGgpKSB7XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTEwNzQ9c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTEyLVxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jOjExMTM6XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcXG5mcy9leHQ0L2lubGluZS5jLTExMTQtXFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MjE9c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTM2LVxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbmZzL2V4dDQvbWlncmF0ZS5jOjM3OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cXHUwMDNlZmlyc3RfYmxvY2ssIE5VTEwsIDApO1xcbmZzL2V4dDQvbWlncmF0ZS5jLTM4LVxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmM9MjcxPXN0YXRpYyBpbnQgZXh0NF9nZXRfdmVyaXR5X2Rlc2NyaXB0b3JfbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmMtMjkzLVxcbmZzL2V4dDQvdmVyaXR5LmM6Mjk0OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsIDApO1xcbmZzL2V4dDQvdmVyaXR5LmMtMjk1LVxcdGlmIChJU19FUlIocGF0aCkpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAyOjU0LjQ5MjY1MjE5NloiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MTg3MTk0MzQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBvdGVudGlhbCBLZXJuZWwgQnVnIGluIGV4dDQgSW5saW5lIERhdGEgSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEknbSBsb29raW5nIGF0IHRoaXMgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBmdW5jdGlvbi4gVGhlIGNvZGUgZmlyc3QgY2FsbHMgYGV4dDRfZmluZF9leHRlbnRgIHdoaWNoIGNhbiByZXR1cm4gYW4gZXJyb3IsIHNwZWNpZmljYWxseSBgRVJSX1BUUigtRU5PTUVNKWAuIElmIHRoYXQgaGFwcGVucywgYHBhdGhgIGJlY29tZXMgYW4gZXJyb3IgcG9pbnRlci4gVGhlbiwgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGlzIGNhbGxlZCwgYW5kICp0aGF0KiBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIFwiQWhhISBEZXJlZmVyZW5jaW5nIGFuIGVycm9yIHBvaW50ZXIhIFRoYXQncyBhIGNsYXNzaWMuXCIgU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB0aGVuIHRyaWVzIHRvIGFjY2VzcyBgcGF0aFtkZXB0aF1gLiBUaGlzIHdvdWxkIGF0dGVtcHQgdG8gcmVhZCBmcm9tIG1lbW9yeSBsb2NhdGlvbnMgcmVsYXRlZCB0byBgRVJSX1BUUigtRU5PTUVNKWAsIHdoaWNoIGlzIGVzc2VudGlhbGx5IGFuIGludmFsaWQgbWVtb3J5IGFkZHJlc3Mg4oCTIGEgY3Jhc2ggd2FpdGluZyB0byBoYXBwZW4uIEl0J3MgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UsIG9yIGF0IGxlYXN0IGFuIGludmFsaWQgbWVtb3J5IGFjY2VzcyBjbG9zZSB0byB0aGUgdG9wIG9mIG1lbW9yeS4gVGhpcyB3aWxsIGRlZmluaXRlbHkgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIGNhdXNlIGEgc3RhbmRhcmQga2VybmVsIG9vcHMsIG5vdCBhIHN1YnRsZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHRoYXQgS01TQU4gd291bGQgY2F0Y2guXG5cbkJ1dCB3YWl0LCBJIG5lZWQgdG8gY29uc2lkZXIgYSBkaWZmZXJlbnQgc2NlbmFyaW8uIFdoYXQgaWYgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgICppdHNlbGYqIHJldHVybnMgYW4gZXJyb3I/IEkgc2VlIHRoZSBjb2RlIGlzIHdyaXR0ZW4gaW4gYSB3YXkgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBpcyAqaWdub3JlZCouIE1lYW5pbmcgdGhhdCBpZiBpdCBmYWlscywgdGhlbiB0aGUgb2xkIGBwYXRoYCBpcyBzdGlsbCBpbiB1c2UhXG5cbkFuZCBhIGZ1cnRoZXIgdGhvdWdodCEgQ2FuIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmcmVlIGBwYXRoYCBpbnRlcm5hbGx5PyBJZiBpdCBkb2VzLCBhbmQgcmV0dXJucyBhbiBlcnJvciwgdGhlbiB0aGUgb3JpZ2luYWwgYHBhdGhgIHBvaW50ZXIgd291bGQgYmUgZGFuZ2xpbmcuIE5vdyB0aGF0J3MgYSBwcm9ibGVtLiBUaGF0IGNvdWxkIGxlYWQgdG8gYSB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBkb3VibGUtZnJlZSwgZGVwZW5kaW5nIG9uIGhvdyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgaXMgaW1wbGVtZW50ZWQuIEkgbmVlZCB0byBkaXZlIGRlZXBlciBhbmQgZXhhbWluZSB0aGUgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGZ1bmN0aW9uIGl0c2VsZiB0byBzZWUgaWYgaXQgZG9lcyBpbmRlZWQgZnJlZSB0aGUgYHBhdGhgIHVuZGVyIGFueSBlcnJvciBjb25kaXRpb25zLiBUaGF0J3Mgd2hlcmUgdGhlIHJlYWwgdnVsbmVyYWJpbGl0eSBsaWVzLiBUaGlzIGlzIGEgY3JpdGljYWwgY29kZSBwYXRoLCBhbmQgSSdtIGdvaW5nIHRvIHRyYWNrIHRoYXQgZnVuY3Rpb24gY2FsbCBkb3duIHRvIGVuc3VyZSBJJ20gZ2V0dGluZyB0aGUgd2hvbGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzI2MzgsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDM6MDIuNjc5ODQ5MzI0WiIsIlNlcSI6NTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTk2MDgzODE1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2Ryb3BfcmVmc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dGVudHMuYz0xMDU9c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3BhdGhfYnJlbHNlKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTEwLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjExMTpzdGF0aWMgdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXFxuZnMvZXh0NC9leHRlbnRzLmMtMTEyLXtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTEyMj12b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTEyNS1cXHRcXHRyZXR1cm47XFxuZnMvZXh0NC9leHRlbnRzLmM6MTI2OlxcdGV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0xMjctXFx0a2ZyZWUocGF0aCk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz04ODY9ZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jayxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTkwOS1cXHRpZiAocGF0aCkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjkxMDpcXHRcXHRleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7XFxuZnMvZXh0NC9leHRlbnRzLmMtOTExLVxcdFxcdGlmIChkZXB0aCBcXHUwMDNlIHBhdGhbMF0ucF9tYXhkZXB0aCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzowNC4yNzU5NDIwMTlaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA4MzkyNzYxMjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFBvdGVudGlhbCBNZW1vcnkgTGVha3MgaW4gRXh0NCBFeHRlbnQgSW5zZXJ0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgZnVuY3Rpb24gYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYHN0cnVjdCBleHQ0X2V4dF9wYXRoICpgIGl0IHdvcmtzIHdpdGguIE15IGluaXRpYWwgY29uY2VybiBpcyBtZW1vcnkgbGVha3MsIHNwZWNpZmljYWxseSBhcm91bmQgdGhlIGBwYXRoYCBwb2ludGVyLiBJZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgZmFpbHMsIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSBpdCBjYWxscyBgZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpYC4gVGhlIHRyaWNreSBwYXJ0IGlzLCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgKnJldHVybnMqIGEgYHN0cnVjdCBleHQ0X2V4dF9wYXRoICpgLlxuXG5TbywgdGhlIHF1ZXN0aW9uIGlzLCBkb2VzIGEgY2FsbGVyIHdobyAqZG9lc24ndCogdXNlIHRoZSByZXR1cm4gdmFsdWUgYW5kICpkb2VzKiBoYXZlIGBwYXRoYCBmcmVlZCBieSBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgbGVhayBtZW1vcnk/IE5vLCB0aGF0J3Mgbm90IHJpZ2h0LCBpZiBpdCBmcmVlcyBgcGF0aGAsIGl0J3MgZnJlZWQuXG5cbkhvd2V2ZXIsIHRoZSBjb2RlIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgaXMgd2hhdCB0cmlnZ2VyZWQgdGhpcyB0aG91Z2h0IHByb2Nlc3MsIGJlY2F1c2UgaXQgY2FsbHMgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGFuZCAqY29tcGxldGVseSBpZ25vcmVzKiB0aGUgcmV0dXJuIHZhbHVlISBJJ20gc2VlaW5nIHRoaXM6XG5cbmBgYGNcblx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApO1xuXHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcblxuXHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XG5cdFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTtcblx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcblx0XHRleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbmBgYFxuXG5Pa2F5LCBgZXh0NF9maW5kX2V4dGVudGAgd2lsbCBhbGxvY2F0ZSBgcGF0aGAgYmVjYXVzZSB0aGUgY2FsbGVyIGlzIHBhc3NpbmcgYE5VTExgLiBTbywgYHBhdGhgIGlzIGluaXRpYWxseSBhbGxvY2F0ZWQuIFRoZW4sIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBpcyBjYWxsZWQuIEl0ICptaWdodCogZnJlZSBhbmQgcmV0dXJuIGEgbmV3IHBhdGgsIGl0IG1pZ2h0IHJldHVybiB0aGUgc2FtZSBwYXRoLCBvciBpdCBtaWdodCByZXR1cm4gYW4gZXJyb3IuXG5cblRoZSBwcm9ibGVtIGlzLCBpZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgc3VjY2VlZHMsIGl0ICpyZXR1cm5zKiBgcGF0aGAsIHdoaWNoIGNvdWxkIGJlIHJlYWxsb2NhdGVkIG9yIHRoZSBvcmlnaW5hbCBwYXRoLiBCdXQgdGhlIGNvZGUgKmNvbXBsZXRlbHkqIGlnbm9yZXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCEgQW5kLCBjcnVjaWFsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBmcmVlcyBgcGF0aGAgaW4gKmFueSogY2FzZSB3aGVuIGl0IHJldHVybnMgc3VjY2Vzc2Z1bGx5ISBUaGlzIGxvb2tzIGxpa2UgYSBkZWZpbml0ZSBwb3RlbnRpYWwgbGVhay4gSSBuZWVkIHRvIGRpZyBpbnRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCB0byBiZSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMzk4NiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxNS4xMTUyMjIwNzhaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ0MTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIxMDAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIxMDA6XFx0XFxuMjEwMTpcXHRcXHQvKiBwcm9iYWJseSBuZXh0IGxlYWYgaGFzIHNwYWNlIGZvciB1cz8gKi9cXG4yMTAyOlxcdFxcdGZleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7XFxuMjEwMzpcXHRcXHRuZXh0ID0gRVhUX01BWF9CTE9DS1M7XFxuMjEwNDpcXHRcXHRpZiAobGUzMl90b19jcHUobmV3ZXh0LVxcdTAwM2VlZV9ibG9jaykgXFx1MDAzZSBsZTMyX3RvX2NwdShmZXgtXFx1MDAzZWVlX2Jsb2NrKSlcXG4yMTA1OlxcdFxcdFxcdG5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2socGF0aCk7XFxuMjEwNjpcXHRcXHRpZiAobmV4dCAhPSBFWFRfTUFYX0JMT0NLUykge1xcbjIxMDc6XFx0XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKm5wYXRoO1xcbjIxMDg6XFx0XFxuMjEwOTpcXHRcXHRcXHRleHRfZGVidWcoaW5vZGUsIFxcXCJuZXh0IGxlYWYgYmxvY2sgLSAldVxcXFxuXFxcIiwgbmV4dCk7XFxuMjExMDpcXHRcXHRcXHRucGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG5leHQsIE5VTEwsIGdiX2ZsYWdzKTtcXG4yMTExOlxcdFxcdFxcdGlmIChJU19FUlIobnBhdGgpKSB7XFxuMjExMjpcXHRcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKG5wYXRoKTtcXG4yMTEzOlxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjIxMTQ6XFx0XFx0XFx0fVxcbjIxMTU6XFx0XFx0XFx0QlVHX09OKG5wYXRoLVxcdTAwM2VwX2RlcHRoICE9IHBhdGgtXFx1MDAzZXBfZGVwdGgpO1xcbjIxMTY6XFx0XFx0XFx0ZWggPSBucGF0aFtkZXB0aF0ucF9oZHI7XFxuMjExNzpcXHRcXHRcXHRpZiAobGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX2VudHJpZXMpIFxcdTAwM2MgbGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX21heCkpIHtcXG4yMTE4OlxcdFxcdFxcdFxcdGV4dF9kZWJ1Zyhpbm9kZSwgXFxcIm5leHQgbGVhZiBpc24ndCBmdWxsKCVkKVxcXFxuXFxcIixcXG4yMTE5OlxcdFxcdFxcdFxcdFxcdCAgbGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX2VudHJpZXMpKTtcXG4yMTIwOlxcdFxcdFxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4yMTIxOlxcdFxcdFxcdFxcdHBhdGggPSBucGF0aDtcXG4yMTIyOlxcdFxcdFxcdFxcdGdvdG8gaGFzX3NwYWNlO1xcbjIxMjM6XFx0XFx0XFx0fVxcbjIxMjQ6XFx0XFx0XFx0ZXh0X2RlYnVnKGlub2RlLCBcXFwibmV4dCBsZWFmIGhhcyBubyBmcmVlIHNwYWNlKCVkLCVkKVxcXFxuXFxcIixcXG4yMTI1OlxcdFxcdFxcdFxcdCAgbGUxNl90b19jcHUoZWgtXFx1MDAzZWVoX2VudHJpZXMpLCBsZTE2X3RvX2NwdShlaC1cXHUwMDNlZWhfbWF4KSk7XFxuMjEyNjpcXHRcXHRcXHRleHQ0X2ZyZWVfZXh0X3BhdGgobnBhdGgpO1xcbjIxMjc6XFx0XFx0fVxcbjIxMjg6XFx0XFxuMjEyOTpcXHRcXHQvKlxcbjIxMzA6XFx0XFx0ICogVGhlcmUgaXMgbm8gZnJlZSBzcGFjZSBpbiB0aGUgZm91bmQgbGVhZi5cXG4yMTMxOlxcdFxcdCAqIFdlJ3JlIGdvbm5hIGFkZCBhIG5ldyBsZWFmIGluIHRoZSB0cmVlLlxcbjIxMzI6XFx0XFx0ICovXFxuMjEzMzpcXHRcXHRpZiAoZ2JfZmxhZ3MgXFx1MDAyNiBFWFQ0X0dFVF9CTE9DS1NfTUVUQURBVEFfTk9GQUlMKVxcbjIxMzQ6XFx0XFx0XFx0bWJfZmxhZ3MgfD0gRVhUNF9NQl9VU0VfUkVTRVJWRUQ7XFxuMjEzNTpcXHRcXHRwYXRoID0gZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZSwgaW5vZGUsIG1iX2ZsYWdzLCBnYl9mbGFncyxcXG4yMTM2OlxcdFxcdFxcdFxcdFxcdFxcdHBhdGgsIG5ld2V4dCk7XFxuMjEzNzpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbjIxMzg6XFx0XFx0XFx0cmV0dXJuIHBhdGg7XFxuMjEzOTpcXHRcXHRkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7XFxuMjE0MDpcXHRcXHRlaCA9IHBhdGhbZGVwdGhdLnBfaGRyO1xcbjIxNDE6XFx0XFxuMjE0MjpcXHRoYXNfc3BhY2U6XFxuMjE0MzpcXHRcXHRuZWFyZXggPSBwYXRoW2RlcHRoXS5wX2V4dDtcXG4yMTQ0OlxcdFxcbjIxNDU6XFx0XFx0ZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpO1xcbjIxNDY6XFx0XFx0aWYgKGVycilcXG4yMTQ3OlxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjIxNDg6XFx0XFxuMjE0OTpcXHRcXHRpZiAoIW5lYXJleCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxNS4xMTU0NjkzODhaIiwiU2VxIjo1NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ5NDQwMzc1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgUGF0aCBIYW5kbGluZyoqXG5cblJpZ2h0LCBsZXQgbWUgc2VlLi4uIEknbSBsb29raW5nIGF0IGhvdyBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgbWFuYWdlcyB0aGUgYHBhdGhgIHZhcmlhYmxlLiBJdCdzIGJlY29taW5nIGNsZWFyIHRoYXQgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBpbnRlcmVzdGluZyBtZW1vcnkgbWFuYWdlbWVudCBiZWhhdmlvcnMsIHNwZWNpZmljYWxseSBzdXJyb3VuZGluZyB0aGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIG9mIGBwYXRoYCBhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byBgbnBhdGhgLiAgSSdtIG5vdGluZyB0aGF0IHRoZXJlIGFyZSB0d28gcHJpbWFyeSBwYXRocywgb3Igb3V0Y29tZXMsIGZvciBgcGF0aGAuIEVpdGhlciBgcGF0aGAgZ2V0cyBmcmVlZCBhbmQgYG5wYXRoYCAod2hpY2ggaXMgYSBuZXcgYWxsb2NhdGlvbikgaXMgcmV0dXJuZWQsIG9yIHRoZSBvcmlnaW5hbCBgcGF0aGAgZ2V0cyByZXR1cm5lZCBhZnRlciBjcmVhdGlvbiBvZiBhIG5ldyBsZWFmIHRocm91Z2ggYGV4dDRfZXh0X2NyZWF0ZV9uZXdfbGVhZmAuIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGVhY2ggc2NlbmFyaW8gcGxheXMgb3V0LCBhcyB0aGlzIGlzIGEgcG90ZW50aWFsIHNvdXJjZSBmb3Igc3VidGxlIG1lbW9yeSBlcnJvcnMgaWYgbm90IGhhbmRsZWQgcHJlY2lzZWx5LiBJbiBwYXJ0aWN1bGFyLCBJIG11c3QgaW52ZXN0aWdhdGUgdGhlIGltcGxpY2F0aW9ucyB0aGlzIGhhcyBmb3IgZXh0ZXJuYWwgY2FsbGVycyBvZiBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAuIE5vdywgdG8gY29uc2lkZXIgYWxsIHBvc3NpYmxlIHBlcm11dGF0aW9ucyBvZiB0aGlzIGJlaGF2aW9yLiBJJ2xsIG5lZWQgdG8gZXhhbWluZSB0aGUgZnVuY3Rpb24ncyBpbnRlcm5hbCBsb2dpYywgZXNwZWNpYWxseSBhcm91bmQgdGhlIHJldHVybiB2YWx1ZXMsIHRvIGVuc3VyZSB0aGUgY29kZSdzIGludGVncml0eSBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCByZW1haW4gc3BvdC1vbi4gSSBzaG91bGQgbm90ZSB0aGUgZmluYWwgc3RhdGVzIG9mIHRoZSBgcGF0aGAgYW5kIGBucGF0aGAgdmFyaWFibGVzIGFmdGVyIHRoZSBmdW5jdGlvbiBjb21wbGV0ZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM1ODUxLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxOS42MDk4NzY4MDFaIiwiU2VxIjo1NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMzMDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIyMDAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIyMDA6XFx0bWVyZ2U6XFxuMjIwMTpcXHRcXHQvKiB0cnkgdG8gbWVyZ2UgZXh0ZW50cyAqL1xcbjIyMDI6XFx0XFx0aWYgKCEoZ2JfZmxhZ3MgXFx1MDAyNiBFWFQ0X0dFVF9CTE9DS1NfU1BMSVRfTk9NRVJHRSkpXFxuMjIwMzpcXHRcXHRcXHRleHQ0X2V4dF90cnlfdG9fbWVyZ2UoaGFuZGxlLCBpbm9kZSwgcGF0aCwgbmVhcmV4KTtcXG4yMjA0OlxcdFxcbjIyMDU6XFx0XFx0LyogdGltZSB0byBjb3JyZWN0IGFsbCBpbmRleGVzIGFib3ZlICovXFxuMjIwNjpcXHRcXHRlcnIgPSBleHQ0X2V4dF9jb3JyZWN0X2luZGV4ZXMoaGFuZGxlLCBpbm9kZSwgcGF0aCk7XFxuMjIwNzpcXHRcXHRpZiAoZXJyKVxcbjIyMDg6XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuMjIwOTpcXHRcXG4yMjEwOlxcdFxcdGVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBwYXRoLVxcdTAwM2VwX2RlcHRoKTtcXG4yMjExOlxcdFxcdGlmIChlcnIpXFxuMjIxMjpcXHRcXHRcXHRnb3RvIGVycm91dDtcXG4yMjEzOlxcdFxcbjIyMTQ6XFx0XFx0cmV0dXJuIHBhdGg7XFxuMjIxNTpcXHRcXG4yMjE2OlxcdGVycm91dDpcXG4yMjE3OlxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4yMjE4OlxcdFxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuMjIxOTpcXHR9XFxuMjIyMDpcXHRcXG4yMjIxOlxcdHN0YXRpYyBpbnQgZXh0NF9maWxsX2VzX2NhY2hlX2luZm8oc3RydWN0IGlub2RlICppbm9kZSxcXG4yMjIyOlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfbGJsa190IGJsb2NrLCBleHQ0X2xibGtfdCBudW0sXFxuMjIyMzpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvKVxcbjIyMjQ6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzoxOS42MTAxMTI0NTFaIiwiU2VxIjo1NywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTg5Njc5NTAxMTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgRXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIGFuZCBFeHRlbnQgSGFuZGxpbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBoYXMgYSBtZW1vcnkgbGVhay4gSXQgcmV0dXJucyBhIHBhdGggb24gc3VjY2VzcyBhbmQgZnJlZXMgdGhlIHBhdGgsIHdoaWNoIG1lYW5zIHRoZSBjYWxsZXIgaXMgbm90IHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LiBIb3dldmVyLCB0aGUgY2FsbGVyIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgZG9lc24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YCBhbmQgKmRvZXNuJ3QqIGZyZWUgYHBhdGhgIGFmdGVyIGEgc3VjY2Vzc2Z1bCBgZXh0NF9leHRfaW5zZXJ0X2V4dGVudGAgY2FsbC4gVGhpcyBjcmVhdGVzIGEgbWVtb3J5IGxlYWsgYmVjYXVzZSBwYXRoIHdpbGwgbmV2ZXIgYmUgZnJlZWQuIFRoZSBxdWVzdGlvbiBpcywgd291bGQgS01TQU4gY2F0Y2ggdGhpcz8gTm8sIGl0IGNhdGNoZXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtNRU1MRUFLLCBob3dldmVyLCB3aWxsIGNhdGNoIG1lbW9yeSBsZWFrcy5cblxuQnV0LCBhIHNlY29uZCB0aG91Z2h0IGlzIHRoZSBjb2RlLiBMZXQncyB0cmFjZSBpdCBjYXJlZnVsbHkuIFdhaXQsIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIsIHRoZSBjb2RlIHdvdWxkIGRlcmVmZXJlbmNlIGl0IGluIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gVGhhdCB3b3VsZCBiZSBhIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSwgd2hpY2ggaXMgYW4gaW1tZWRpYXRlIGNyYXNoIHRoYXQgS0FTQU4gb3IgdGhlIGtlcm5lbCdzIG9vcHMgZGV0ZWN0aW9uIHNob3VsZCBjYXRjaC5cblxuTW92aW5nIG9uIHRvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgSSBuZWVkIHRvIHNjcnV0aW5pemUgaXQgZm9yIHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBGaXJzdCwgaXQgYWxsb2NhdGVzIGEgYnVmZmVyIGBidWZgIGFuZCByZWFkcyBpbmxpbmUgZGF0YSBpbnRvIGl0LiBUaGUgcG90ZW50aWFsIGlzc3VlIEkgc2VlIGlzIHRoYXQgaWYgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgcmV0dXJucyBmZXdlciBieXRlcyB0aGFuIGV4cGVjdGVkLCB0aGVuIHBhcnRzIG9mIGBidWZgIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEhvd2V2ZXIsIHRoZSBjb2RlJ3MgbG9naWMgaXMgdGhhdCB0aGUgYGlubGluZV9zaXplYCBpcyBiYXNlZCBvbiB0aGUgZGF0YSB0byBiZSBjb3BpZWQsIHNvIGl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIHJlYWQgbGVzcyB0aGFuIHRoZSBleHBlY3RlZCBzaXplLlxuXG5CdXQgd2FpdCwgd2hhdCBpZiB0aGUgaW5vZGUgaXMgYSBkaXJlY3Rvcnk/IFRoZSBwYXRjaCBpcyBpbXBvcnRhbnQgaW4gY29udGV4dCwgYmVjYXVzZSB0aGUgb3JpZ2luYWwgY29kZSAqZG9lcyBub3QqIGNvcHkgZGF0YSBpbnRvIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaWYgYFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKWAgaXMgdHJ1ZS4gSW5zdGVhZCwgaXQgY2FsbHMgYGV4dDRfdXBkYXRlX2lubGluZV9kaXJgLiBJIHNob3VsZCBjaGVjayBpZiB0aGUgbW9kaWZpY2F0aW9uIHRvIHRoYXQgc2VjdGlvbiBvZiBjb2RlIGlzIGltcG9ydGFudC4gVGhlIHBhdGNoIGRvZXNuJ3Qgc2hvdyBtb2RpZmljYXRpb24gdG8gaXQsIGJ1dCBpdCdzIGNhbGxlZCBhbnl3YXkuXG5cbk9rYXksIGxldCBtZSBnbyBjaGVjayB0aGUgb3JpZ2luYWwgY29kZSFcblxuXG4iLCJJbnB1dFRva2VucyI6MzY2MTgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjAxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDM6MzguNTc4MDY1ODUxWiIsIlNlcSI6NTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NzA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNTA6XFx0XFx0aWYgKCFidWYpIHtcXG4xMTUxOlxcdFxcdFxcdGVycm9yID0gLUVOT01FTTtcXG4xMTUyOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExNTM6XFx0XFx0fVxcbjExNTQ6XFx0XFxuMTE1NTpcXHRcXHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XFxuMTE1NjpcXHRcXHRpZiAoZXJyb3IgXFx1MDAzYyAwKVxcbjExNTc6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTE1ODpcXHRcXG4xMTU5OlxcdFxcdC8qXFxuMTE2MDpcXHRcXHQgKiBNYWtlIHN1cmUgdGhlIGlubGluZSBkaXJlY3RvcnkgZW50cmllcyBwYXNzIGNoZWNrcyBiZWZvcmUgd2UgdHJ5IHRvXFxuMTE2MTpcXHRcXHQgKiBjb252ZXJ0IHRoZW0sIHNvIHRoYXQgd2UgYXZvaWQgdG91Y2hpbmcgc3R1ZmYgdGhhdCBuZWVkcyBmc2NrLlxcbjExNjI6XFx0XFx0ICovXFxuMTE2MzpcXHRcXHRpZiAoU19JU0RJUihpbm9kZS1cXHUwMDNlaV9tb2RlKSkge1xcbjExNjQ6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cXHUwMDNlYmgsXFxuMTE2NTpcXHRcXHRcXHRcXHRcXHRcXHRidWYgKyBFWFQ0X0lOTElORV9ET1RET1RfU0laRSxcXG4xMTY2OlxcdFxcdFxcdFxcdFxcdFxcdGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpO1xcbjExNjc6XFx0XFx0XFx0aWYgKGVycm9yKVxcbjExNjg6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTE2OTpcXHRcXHR9XFxuMTE3MDpcXHRcXG4xMTcxOlxcdFxcdG1lbXNldChcXHUwMDI2YXIsIDAsIHNpemVvZihhcikpO1xcbjExNzI6XFx0XFx0YXIuaW5vZGUgPSBpbm9kZTtcXG4xMTczOlxcdFxcdGFyLmxvZ2ljYWwgPSAwO1xcbjExNzQ6XFx0XFx0YXIubGVuID0gMTtcXG4xMTc1OlxcdFxcdGlmIChTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpKVxcbjExNzY6XFx0XFx0XFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcXG4xMTc3OlxcdFxcdGVsc2VcXG4xMTc4OlxcdFxcdFxcdGFyLmZsYWdzID0gMDtcXG4xMTc5OlxcdFxcdG5ld2Jsb2NrID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgXFx1MDAyNmFyLCBcXHUwMDI2ZXJyb3IpO1xcbjExODA6XFx0XFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4xMTgxOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExODI6XFx0XFxuMTE4MzpcXHRcXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVxcdTAwM2VpX3NiLCBuZXdibG9jayk7XFxuMTE4NDpcXHRcXHRpZiAoIWRhdGFfYmgpIHtcXG4xMTg1OlxcdFxcdFxcdGVycm9yID0gLUVOT01FTTtcXG4xMTg2OlxcdFxcdFxcdGdvdG8gb3V0X2JoO1xcbjExODc6XFx0XFx0fVxcbjExODg6XFx0XFxuMTE4OTpcXHRcXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMTkwOlxcdFxcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgaW5vZGUtXFx1MDAzZWlfc2IsIGRhdGFfYmgsXFxuMTE5MTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgRVhUNF9KVFJfTk9ORSk7XFxuMTE5MjpcXHRcXHRpZiAoZXJyb3IpIHtcXG4xMTkzOlxcdFxcdFxcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XFxuMTE5NDpcXHRcXHRcXHRlcnJvciA9IC1FSU87XFxuMTE5NTpcXHRcXHRcXHRnb3RvIG91dF9iaDtcXG4xMTk2OlxcdFxcdH1cXG4xMTk3OlxcdFxcdG1lbXNldChkYXRhX2JoLVxcdTAwM2ViX2RhdGEsIDAsIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuMTE5ODpcXHRcXG4xMTk5OlxcdFxcdGlmICghU19JU0RJUihpbm9kZS1cXHUwMDNlaV9tb2RlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNlQxNjowMzozOC41NzgyMTUzMDFaIiwiU2VxIjo1OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI5MTg2NjIwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcHJvY2Vzc2luZyB0aGUgY29kZTpcblxuKipEaXZpbmcgaW50byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbidzIHJvbGUgaW4gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEknbSBhc3N1bWluZyB0aGlzIGlzIGFib3V0IGhhbmRsaW5nIGlubGluZSBkYXRhLCB3aGljaCBpcyBlc3NlbnRpYWxseSBzdG9yaW5nIGZpbGUgY29udGVudCBkaXJlY3RseSB3aXRoaW4gdGhlIGlub2RlIGl0c2VsZiwgcmlnaHQ/IFRoYXQncyBhbiBvcHRpbWl6YXRpb24gdG8gcmVkdWNlIGRpc2sgSS9PLCBzbyBpdCdzIGludGVyZXN0aW5nLiBUaGUgYF9ub2xvY2tgIHN1ZmZpeCBzdWdnZXN0cyB0aGlzIGlzIGxpa2VseSBiZWluZyBjYWxsZWQgZnJvbSBjb2RlIHRoYXQgYWxyZWFkeSBoYXMgdGhlIG5lY2Vzc2FyeSBsb2NraW5nIGRvbmUuIEdvb2QsIHRoYXQgc2ltcGxpZmllcyB0aGluZ3MgYSBiaXQuIEkgY2FuIGZvY3VzIG9uIHRoZSBjb3JlIGxvZ2ljIHRoZW4uIEknbGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdHJpZ2dlcnMgdGhpcyBjb252ZXJzaW9uLCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdCBoYXBwZW5zLCBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKmRvaW5nKiB0byBtYWtlIHRoYXQgY29udmVyc2lvbi4gSSBuZWVkIHRvIHRyYWNlIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIHNlZSBob3cgdGhlIGlub2RlIGFuZCB0aGUgb24tZGlzayBmb3JtYXQgYXJlIGNoYW5nZWQsIGFuZCBvZiBjb3Vyc2UsIGVuc3VyZSBjb25zaXN0ZW5jeSB0aHJvdWdob3V0IHRoZSBwcm9jZXNzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGhhbmRsZXMgZXJyb3JzIGFuZCBwYXJ0aWFsIGNvbnZlcnNpb25zLCBwYXJ0aWN1bGFybHkgZm9yIHBvd2VyLWZhaWwgc2NlbmFyaW9zLiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBmYWlscyBoYWxmd2F5IHRocm91Z2g/IEhvdyBkb2VzIGl0IG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGVzeXN0ZW0/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBob3cgZG8gdGhleSBlbnN1cmUgdGhhdCB0aGUgY29udmVyc2lvbiBpcyBhdG9taWMgZnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlLCBldmVuIGlmIHVuZGVyIHRoZSBob29kLCB0aGVyZSBhcmUgYSBzZXJpZXMgb2Ygc3RlcHMgdG8gYWNoaWV2ZSB0aGlzLiBOb3csIGxldCdzIHNlZSB3aGVyZSB0byBiZWdpbi4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDA3OCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTZUMTY6MDM6NDIuODcwMDg0OTEyWiIsIlNlcSI6NjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0ODczMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMDAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEyMDA6XFx0XFx0XFx0bWVtY3B5KGRhdGFfYmgtXFx1MDAzZWJfZGF0YSwgYnVmLCBpbmxpbmVfc2l6ZSk7XFxuMTIwMTpcXHRcXHRcXHRzZXRfYnVmZmVyX3VwdG9kYXRlKGRhdGFfYmgpO1xcbjEyMDI6XFx0XFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMjAzOlxcdFxcdFxcdGVycm9yID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLFxcbjEyMDQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgaW5vZGUsIGRhdGFfYmgpO1xcbjEyMDU6XFx0XFx0fSBlbHNlIHtcXG4xMjA2OlxcdFxcdFxcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XFxuMTIwNzpcXHRcXHRcXHRpbm9kZS1cXHUwMDNlaV9zaXplID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbjEyMDg6XFx0XFx0XFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpO1xcbjEyMDk6XFx0XFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kaXNrc2l6ZSA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4xMjEwOlxcdFxcbjEyMTE6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCxcXG4xMjEyOlxcdFxcdFxcdFxcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXFx1MDAzZWlub2RlKSxcXG4xMjEzOlxcdFxcdFxcdFxcdCAgYnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXFxuMTIxNDpcXHRcXHRcXHRcXHQgIGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpO1xcbjEyMTU6XFx0XFx0XFx0aWYgKCFlcnJvcilcXG4xMjE2OlxcdFxcdFxcdFxcdGVycm9yID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpO1xcbjEyMTc6XFx0XFx0fVxcbjEyMTg6XFx0XFxuMTIxOTpcXHRcXHRpZiAoZXJyb3IpXFxuMTIyMDpcXHRcXHRcXHRnb3RvIG91dF9iaDtcXG4xMjIxOlxcdFxcdGVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgbmV3YmxvY2ssIGFyLmxlbik7XFxuMTIyMjpcXHRvdXRfYmg6XFxuMTIyMzpcXHRcXHRpZiAoZXJyb3IpXFxuMTIyNDpcXHRcXHRcXHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhci5sZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcXG4xMjI1OlxcdFxcdGJyZWxzZShkYXRhX2JoKTtcXG4xMjI2OlxcdG91dDpcXG4xMjI3OlxcdFxcdGtmcmVlKGJ1Zik7XFxuMTIyODpcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMTIyOTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjAzOjQyLjg3MDIzNDk5MloiLCJTZXEiOjYxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyODI3OTM3OTEwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgSW5saW5lIERhdGEgQ29udmVyc2lvbiBQYXRjaCoqXG5cbk9rYXksIGxldCBtZSB3YWxrIHRocm91Z2ggdGhpcy4gSSBzZWUgdGhhdCBpZiBpdCdzIGEgZGlyZWN0b3J5LCBgZXh0NF9pbml0X2RpcmJsb2NrYCBpcyBjYWxsZWQgd2l0aCBgYnVmYC4gQnV0IGBidWZgIGlzIGluaXRpYWxpemVkIGJ5IGBleHQ0X3JlYWRfaW5saW5lX2RhdGFgLCBzbyB0aGF0J3MgZmluZTsgaXQncyBmdWxseSBpbml0aWFsaXplZC4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLlxuXG5XYWl0LCB3aGF0IGFib3V0IHBvdGVudGlhbCBlcnJvcnMgaW4gYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWA/IElmIGl0IGZhaWxzLCBpdCBnb2VzIHRvIGBvdXRgLCB3aGljaCBmcmVlcyBgYnVmYC4gT2theSwgc3RpbGwgc2FmZS5cblxuV2hhdCBpZiBpdCByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUsIGxlc3MgdGhhbiB0aGUgYGlubGluZV9zaXplYD8gSSByZW1lbWJlciBteSBwcmV2aW91cyBhbmFseXNpcywgdGhhdCBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBpcyBnb2luZyB0byByZXR1cm4gdGhlIHJpZ2h0IHNpemUuIGBpbmxpbmVfc2l6ZWAgaXMgY2FsY3VsYXRlZCB3aXRoIGBlbnRyeS1cdTAwM2VlX3ZhbHVlX3NpemVgLiBTbywgSSdtIHN1cmUgaXQnbGwgcmV0dXJuIHRoZSBleHBlY3RlZCBzaXplLiBFdmVuIGlmIHRoZSBzaXplIG9mIGBlbnRyeS1cdTAwM2VlX3ZhbHVlX3NpemVgIGlzIGNvcnJ1cHQsIGBpbmxpbmVfc2l6ZWAgaXMgYWx3YXlzIGNvbnNpc3RlbnQgYmVjYXVzZSBpdCdzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWAuIEJ1dCwgd2hhdCBpZiB0aGVyZSdzIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24gdG8gYGVudHJ5LVx1MDAzZWVfdmFsdWVfc2l6ZWA/IE5vcGUsIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBjYWxsZWQgd2l0aCBhIGxvY2sgaGVsZC4gSSdtIGNlcnRhaW4gdGhhdCB0aGUgaW5saW5lIGRhdGEgaXMgbm90IGNvbmN1cnJlbnRseSBtb2RpZmllZC4gQW5kIGV2ZW4gaWYgaXQgd2VyZSwgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgd291bGQganVzdCBjb3B5IGZld2VyIGJ5dGVzLCBsZWF2aW5nIHRoZSByZXN0IG9mIGBidWZgIHVuaW5pdGlhbGl6ZWQuIEJ1dCwgaXMgdGhpcyBhIEtNU0FOLXNwZWNpZmljIGlzc3VlPyBJZiBpdCdzIHBhcnRpYWxseSB1bmluaXRpYWxpemVkIGFuZCB3cml0dGVuIHRvIGRpc2ssIGl0J3MgYW4gaW5mby1sZWFrIHRvIGRpc2suIEJ1dCB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCwgd2hpY2ggZG9lc24ndCB6ZXJvIHdpdGhvdXQgdGhlIGBfX0dGUF9aRVJPYCBmbGFnLiBCdXQsIGhlcmUsIEknbSBzdXJlIHRoYXQgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgc2hvdWxkIHJldHVybiBmZXdlciBieXRlcywgYmVjYXVzZSBgaW5saW5lX3NpemVgIGlzIGV4YWN0bHkgdGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhLlxuXG5BbHJpZ2h0LCBsZXQncyBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYgYWdhaW4uIFRoZSBwYXRjaCBpcyBjaGFuZ2luZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgdG8gYWxsb2NhdGUgdGhlIGJsb2NrIGZpcnN0LCB0aGVuIGNvcHkgdGhlIGRhdGEsIHRoZW4gc2V0IHRoZSBpbmxpbmUgZGF0YSBibG9jay4gSXQgdXNlZCB0byBjYWxsIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCwgdGhlbiBgZXh0NF9tYXBfYmxvY2tzYC4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIGlmIGBleHQ0X21hcF9ibG9ja3NgIGZhaWxlZCwgaXQgY2FsbGVkIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgLiBUaGF0J3Mgd2hlcmUgdGhlIHByb2JsZW0gbGF5OiBpZiBgZXh0NF9jcmVhdGVfaW5saW5lX2RhdGFgIGZhaWxlZCwgaXQgcHJpbnRlZCBhbiBlcnJvciBhbmQgcmV0dXJuZWQhIERhdGEgbG9zcyEgVGhlIG5ldyBjb2RlIGFsbG9jYXRlcyB0aGUgYmxvY2ssIGFuZCBvbmx5IGlmIHRoYXQgc3VjY2VlZHMsIGl0IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhLiBUaGlzIGlzIGFib3V0IHByZXZlbnRpbmcgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24sIG5vdCB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuSXMgdGhlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYD8gTm8uIFRoZSBjb2RlIHVzZXMgYG1lbXNldGAgdG8gemVybyBgaV9ibG9ja2AgYW5kIGBpX2RhdGFgLiBUaGVuIGl0IGluaXRpYWxpemVzIGBuZXdleGAgYW5kIGNhbGxzIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgLiBBcyBJIHZlcmlmaWVkLCB0aGF0IGluaXRpYWxpemVzIGl0LlxuXG5BcmUgdGhlcmUgYW55IG90aGVyIHN0cnVjdHM/IExldCBtZSBzZWUuIGBleHQ0X3hhdHRyX2lib2R5X2ZpbmRgIGFuZCBgZXh0NF94YXR0cl9pbmZvYC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHdpdGggZXhwbGljaXQgemVyb2luZy4gT2theSwgYWxsIGdvb2QuIFdoYXQgYWJvdXQgYGFyYD8gYG1lbXNldGAgaXMgY2FsbGVkIG9uIHRoYXQ7IGl0J3MgZnVsbHkgemVyb2VkLiBTbywgdGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZC4gSXQgZml4ZXMgdGhlIGRhdGEgbG9zcyBieSBhbGxvY2F0aW5nIHRoZSBibG9jayBmaXJzdC5cblxuSXMgdGhlcmUgYW4gaW5mby1sZWFrPyBObywgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBpcyB6ZXJvZWQgYmVmb3JlIHRoZSBjb3B5LCBhbmQgYGJ1ZmAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQuXG5cblNvLCB0aGlzIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gSXQgZml4ZXMgYSBsb2dpYyAvIGVycm9yIGhhbmRsaW5nIGJ1ZyB0aGF0IGNvdWxkIGxlYWQgdG8gZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24uIFN0YW5kYXJkIHRlc3RpbmcsIEtBU0FOLCBvciBzeXprYWxsZXIgd291bGQgY2F0Y2ggdGhpcy4gTm8gbmVlZCBmb3IgS01TQU4uXG5cbkhvbGQgb24sIGxldCBtZSBkb3VibGUtY2hlY2sgYGV4dDRfZXh0X2luc2VydF9leHRlbnRgIGFuZCBgbmV3ZXhgLiBgbmV3ZXhgIGlzIHBhc3NlZCBieSBwb2ludGVyIGFuZCBoYXMgNCBmaWVsZHM6IGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gLiBBbGwgb2YgdGhlbSBhcmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZSdzIG5vIHBhZGRpbmcuIE9rYXksIHRoYXQncyBjbGVhci5cblxuT2theSwgbGV0IG1lIGRvdWJsZSBjaGVjayB0aGUgc3RydWN0dXJlcyBhZ2FpbiwgYGV4dDRfeGF0dHJfaWJvZHlfZmluZGAgYW5kIGBleHQ0X3hhdHRyX2luZm9gLiBgZXh0NF94YXR0cl9pYm9keV9maW5kYCBpbml0aWFsaXplZCBgaXMucy5ub3RfZm91bmRgIHRvIDAsIHdoaWNoIHplcm9lcyB0aGUgc3RydWN0LiBgZXh0NF94YXR0cl9pbmZvYCBmdWxseSBpbml0aWFsaXplcyBhbGwgZmllbGRzLlxuXG5ZdXAsIHRoZXJlJ3MgYWJzb2x1dGVseSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBoZXJlLlxuXG5JJ20gc2V0dGluZyBOZWVkc0tNU0FOIHRvIGZhbHNlIGFuZCBnaXZpbmcgdGhlIHJlYXNvbmluZy5cblxuUmVhc29uaW5nOiBUaGlzIHBhdGNoIG1vZGlmaWVzIHRoZVxuXG4iLCJJbnB1dFRva2VucyI6NDA5ODEsIk91dHB1dFRva2VucyI6MjYyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY0NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE2VDE2OjA0OjExLjE0OTYxNzQyM1oiLCJTZXEiOjYyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMDA5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBibG9jayBhbGxvY2F0aW9uIG9yZGVyIGluIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCB0byBwcmV2ZW50IHBvdGVudGlhbCBkYXRhIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGlubGluZSBkYXRhIHRvIGEgYmxvY2suIFByZXZpb3VzbHksIGlmIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkLCBpdCBhdHRlbXB0ZWQgdG8gcmVzdG9yZSB0aGUgaW5saW5lIGRhdGEsIHdoaWNoIGNvdWxkIGZhaWwgYW5kIGNhdXNlIGRhdGEgbG9zcy4gVGhlIG5ldyBsb2dpYyBhbGxvY2F0ZXMgdGhlIGJsb2NrIGZpcnN0IGFuZCBvbmx5IHJlbW92ZXMgdGhlIGlubGluZSBkYXRhIHVwb24gc3VjY2Vzcy5cXG5cXG5BbGwgc3RydWN0dXJlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoZSBwYXRjaCAoYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgb3IgZXhwbGljaXRseSB6ZXJvZWQgKHZpYSBgbWVtc2V0YCBvciBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHdoaWNoIHplcm9lcyB0aGUgcmVzdCkuIFRoZSBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgYmVmb3JlIGNvcHlpbmcgdGhlIGlubGluZSBkYXRhLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIHBhZGRpbmcgbGVha3MsIG9yIGluZm8tbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBbnkgcG90ZW50aWFsIGNyYXNoZXMgKGUuZy4sIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIpIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBvciBrZXJuZWwgb29wcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIGJsb2NrIGFsbG9jYXRpb24gb3JkZXIgaW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIHRvIHByZXZlbnQgcG90ZW50aWFsIGRhdGEgbG9zcyB3aGVuIGNvbnZlcnRpbmcgaW5saW5lIGRhdGEgdG8gYSBibG9jay4gUHJldmlvdXNseSwgaWYgYmxvY2sgYWxsb2NhdGlvbiBmYWlsZWQsIGl0IGF0dGVtcHRlZCB0byByZXN0b3JlIHRoZSBpbmxpbmUgZGF0YSwgd2hpY2ggY291bGQgZmFpbCBhbmQgY2F1c2UgZGF0YSBsb3NzLiBUaGUgbmV3IGxvZ2ljIGFsbG9jYXRlcyB0aGUgYmxvY2sgZmlyc3QgYW5kIG9ubHkgcmVtb3ZlcyB0aGUgaW5saW5lIGRhdGEgdXBvbiBzdWNjZXNzLlxcblxcbkFsbCBzdHJ1Y3R1cmVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgYnkgdGhlIHBhdGNoIChgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCwgYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAsIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBvciBleHBsaWNpdGx5IHplcm9lZCAodmlhIGBtZW1zZXRgIG9yIHBhcnRpYWwgaW5pdGlhbGl6YXRpb24gd2hpY2ggemVyb2VzIHRoZSByZXN0KS4gVGhlIGJ1ZmZlciBgZGF0YV9iaC1cXHUwMDNlYl9kYXRhYCBpcyBleHBsaWNpdGx5IHplcm9lZCBiZWZvcmUgY29weWluZyB0aGUgaW5saW5lIGRhdGEuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgcGFkZGluZyBsZWFrcywgb3IgaW5mby1sZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgY3Jhc2hlcyAoZS5nLiwgaWYgYGV4dDRfZmluZF9leHRlbnRgIHJldHVybnMgYW4gZXJyb3IgcG9pbnRlcikgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIG9yIGtlcm5lbCBvb3BzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[1] Phase: Succeeded StartedAt: 2026-08-16 16:04:22 +0000 UTC FinishedAt: 2026-08-16 16:04:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-16 16:04:22 +0000 UTC FinishedAt: 2026-08-16 16:04:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2] Phase: Succeeded StartedAt: 2026-08-16 16:04:22 +0000 UTC FinishedAt: 2026-08-16 19:47:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-16 16:04:22 +0000 UTC FinishedAt: 2026-08-16 19:47:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-16 16:04:22 +0000 UTC FinishedAt: 2026-08-16 16:04:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-16 16:04:22 +0000 UTC FinishedAt: 2026-08-16 16:04:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdz4cl/series-workflowdz4cl-convert-artifact-3314461928/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-16 16:04:32 +0000 UTC FinishedAt: 2026-08-16 16:21:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-16 16:04:32 +0000 UTC FinishedAt: 2026-08-16 16:21:27 +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:*1b311ff3-9d0f-49b5-83f4-2189f6300598,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-workflowdz4cl/series-workflowdz4cl-convert-artifact-3314461928/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": "7def3226-e49f-4765-81fd-7b33a9e0aa0b", "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-workflowdz4cl/series-workflowdz4cl-build-action-1958949470/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-16 16:04:32 +0000 UTC FinishedAt: 2026-08-16 16:21:17 +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:*1b311ff3-9d0f-49b5-83f4-2189f6300598,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-workflowdz4cl/series-workflowdz4cl-convert-artifact-3314461928/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": "7def3226-e49f-4765-81fd-7b33a9e0aa0b", "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-workflowdz4cl/series-workflowdz4cl-build-action-1958949470/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-16 16:21:27 +0000 UTC FinishedAt: 2026-08-16 16:21:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-16 16:21:27 +0000 UTC FinishedAt: 2026-08-16 16:21:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-16 16:21:27 +0000 UTC FinishedAt: 2026-08-16 16:21:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-16 16:21:27 +0000 UTC FinishedAt: 2026-08-16 16:21:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdz4cl/series-workflowdz4cl-convert-artifact-1182287311/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-16 16:21:37 +0000 UTC FinishedAt: 2026-08-16 16:23:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-16 16:21:37 +0000 UTC FinishedAt: 2026-08-16 16:23:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7def3226-e49f-4765-81fd-7b33a9e0aa0b,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-workflowdz4cl/series-workflowdz4cl-build-action-1958949470/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-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-16 16:23:37 +0000 UTC FinishedAt: 2026-08-16 16:23:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-16 16:23:37 +0000 UTC FinishedAt: 2026-08-16 16:23:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-16 16:23:37 +0000 UTC FinishedAt: 2026-08-16 16:40:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-16 16:23:37 +0000 UTC FinishedAt: 2026-08-16 16:40: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:*1b311ff3-9d0f-49b5-83f4-2189f6300598,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-workflowdz4cl/series-workflowdz4cl-convert-artifact-1182287311/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": "500e2ced-dbe6-480e-affe-813e984ba307", "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-workflowdz4cl/series-workflowdz4cl-build-action-288607715/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-16 16:23:37 +0000 UTC FinishedAt: 2026-08-16 16:40: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:*1b311ff3-9d0f-49b5-83f4-2189f6300598,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-workflowdz4cl/series-workflowdz4cl-convert-artifact-1182287311/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": "500e2ced-dbe6-480e-affe-813e984ba307", "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-workflowdz4cl/series-workflowdz4cl-build-action-288607715/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-16 16:40:56 +0000 UTC FinishedAt: 2026-08-16 16:40:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-16 16:40:56 +0000 UTC FinishedAt: 2026-08-16 16:40:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-16 16:40:56 +0000 UTC FinishedAt: 2026-08-16 16:42:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-16 16:40:56 +0000 UTC FinishedAt: 2026-08-16 16:42:36 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*500e2ced-dbe6-480e-affe-813e984ba307,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-workflowdz4cl/series-workflowdz4cl-build-action-288607715/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-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-16 16:42:46 +0000 UTC FinishedAt: 2026-08-16 19:47:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-16 16:42:46 +0000 UTC FinishedAt: 2026-08-16 19:47:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*7def3226-e49f-4765-81fd-7b33a9e0aa0b,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*500e2ced-dbe6-480e-affe-813e984ba307,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-workflowdz4cl/series-workflowdz4cl-build-action-1958949470/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-workflowdz4cl/series-workflowdz4cl-build-action-288607715/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-16 16:42:46 +0000 UTC FinishedAt: 2026-08-16 16:42:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-16 16:42:46 +0000 UTC FinishedAt: 2026-08-16 16:42:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdz4cl/series-workflowdz4cl-convert-artifact-3970605960/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-16 16:42:46 +0000 UTC FinishedAt: 2026-08-16 16:42:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-16 16:42:46 +0000 UTC FinishedAt: 2026-08-16 16:42:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-16 16:42:46 +0000 UTC FinishedAt: 2026-08-16 16:42:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-16 16:42:56 +0000 UTC FinishedAt: 2026-08-16 19:47:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdz4cl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1351c159c59b04195647917c5a5f0e5467f44bb0","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"74cf3860-255d-49bb-b3df-51f8ee44a69f","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-16 16:42:56 +0000 UTC FinishedAt: 2026-08-16 19:46:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7def3226-e49f-4765-81fd-7b33a9e0aa0b,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*500e2ced-dbe6-480e-affe-813e984ba307,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-workflowdz4cl/series-workflowdz4cl-build-action-1958949470/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-workflowdz4cl/series-workflowdz4cl-build-action-288607715/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-workflowdz4cl/series-workflowdz4cl-convert-artifact-3970605960/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,}